| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358 | 
							- /*!
 
-  * ====================================================
 
-  * Kity Minder Core - v1.4.50 - 2018-09-17
 
-  * https://github.com/fex-team/kityminder-core
 
-  * GitHub: https://github.com/fex-team/kityminder-core.git 
 
-  * Copyright (c) 2018 Baidu FEX; Licensed BSD-3-Clause
 
-  * ====================================================
 
-  */
 
- (function () {
 
- var _p = {
 
-     r: function(index) {
 
-         if (_p[index].inited) {
 
-             return _p[index].value;
 
-         }
 
-         if (typeof _p[index].value === "function") {
 
-             var module = {
 
-                 exports: {}
 
-             }, returnValue = _p[index].value(null, module.exports, module);
 
-             _p[index].inited = true;
 
-             _p[index].value = returnValue;
 
-             if (returnValue !== undefined) {
 
-                 return returnValue;
 
-             } else {
 
-                 for (var key in module.exports) {
 
-                     if (module.exports.hasOwnProperty(key)) {
 
-                         _p[index].inited = true;
 
-                         _p[index].value = module.exports;
 
-                         return module.exports;
 
-                     }
 
-                 }
 
-             }
 
-         } else {
 
-             _p[index].inited = true;
 
-             return _p[index].value;
 
-         }
 
-     }
 
- };
 
- //src/connect/arc.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 圆弧连线
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[0] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var connect = _p.r(11);
 
-         var connectMarker = new kity.Marker().pipe(function() {
 
-             var r = 7;
 
-             var dot = new kity.Circle(r - 1);
 
-             this.addShape(dot);
 
-             this.setRef(r - 1, 0).setViewBox(-r, -r, r + r, r + r).setWidth(r).setHeight(r);
 
-             this.dot = dot;
 
-             this.node.setAttribute("markerUnits", "userSpaceOnUse");
 
-         });
 
-         connect.register("arc", function(node, parent, connection, width, color) {
 
-             var box = node.getLayoutBox(), pBox = parent.getLayoutBox();
 
-             var start, end, vector;
 
-             var abs = Math.abs;
 
-             var pathData = [];
 
-             var side = box.x > pBox.x ? "right" : "left";
 
-             node.getMinder().getPaper().addResource(connectMarker);
 
-             start = new kity.Point(pBox.cx, pBox.cy);
 
-             end = side == "left" ? new kity.Point(box.right + 2, box.cy) : new kity.Point(box.left - 2, box.cy);
 
-             vector = kity.Vector.fromPoints(start, end);
 
-             pathData.push("M", start);
 
-             pathData.push("A", abs(vector.x), abs(vector.y), 0, 0, vector.x * vector.y > 0 ? 0 : 1, end);
 
-             connection.setMarker(connectMarker);
 
-             connectMarker.dot.fill(color);
 
-             connection.setPathData(pathData);
 
-         });
 
-     }
 
- };
 
- //src/connect/arc_tp.js
 
- /**
 
-  *
 
-  * 圆弧连线
 
-  *
 
-  * @author: along
 
-  * @copyright: bpd729@163.com , 2015
 
-  */
 
- _p[1] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var connect = _p.r(11);
 
-         var connectMarker = new kity.Marker().pipe(function() {
 
-             var r = 7;
 
-             var dot = new kity.Circle(r - 1);
 
-             this.addShape(dot);
 
-             this.setRef(r - 1, 0).setViewBox(-r, -r, r + r, r + r).setWidth(r).setHeight(r);
 
-             this.dot = dot;
 
-             this.node.setAttribute("markerUnits", "userSpaceOnUse");
 
-         });
 
-         /**
 
-      * 天盘图连线除了连接当前节点和前一个节点外, 还需要渲染当前节点和后一个节点的连接, 防止样式上的断线
 
-      * 这是天盘图与其余的模板不同的地方
 
-      */
 
-         connect.register("arc_tp", function(node, parent, connection, width, color) {
 
-             var end_box = node.getLayoutBox(), start_box = parent.getLayoutBox();
 
-             var index = node.getIndex();
 
-             var nextNode = parent.getChildren()[index + 1];
 
-             if (node.getIndex() > 0) {
 
-                 start_box = parent.getChildren()[index - 1].getLayoutBox();
 
-             }
 
-             var start, end, vector;
 
-             var abs = Math.abs;
 
-             var pathData = [];
 
-             var side = end_box.x > start_box.x ? "right" : "left";
 
-             node.getMinder().getPaper().addResource(connectMarker);
 
-             start = new kity.Point(start_box.cx, start_box.cy);
 
-             end = new kity.Point(end_box.cx, end_box.cy);
 
-             var jl = Math.sqrt(Math.pow(start.x - end.x, 2) + Math.pow(start.y - end.y, 2));
 
-             //两圆中心点距离
 
-             jl = node.getIndex() == 0 ? jl * .4 : jl;
 
-             vector = kity.Vector.fromPoints(start, end);
 
-             pathData.push("M", start);
 
-             pathData.push("A", jl, jl, 0, 0, 1, end);
 
-             connection.setMarker(connectMarker);
 
-             connectMarker.dot.fill(color);
 
-             connection.setPathData(pathData);
 
-             // 设置下一个的节点的连接线
 
-             if (nextNode && nextNode.getConnection()) {
 
-                 var nextConnection = nextNode.getConnection();
 
-                 var next_end_box = nextNode.getLayoutBox();
 
-                 var next_end = new kity.Point(next_end_box.cx, next_end_box.cy);
 
-                 var jl2 = Math.sqrt(Math.pow(end.x - next_end.x, 2) + Math.pow(end.y - next_end.y, 2));
 
-                 //两圆中心点距离
 
-                 pathData = [];
 
-                 pathData.push("M", end);
 
-                 pathData.push("A", jl2, jl2, 0, 0, 1, next_end);
 
-                 nextConnection.setMarker(connectMarker);
 
-                 connectMarker.dot.fill(color);
 
-                 nextConnection.setPathData(pathData);
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/connect/bezier.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 提供折线相连的方法
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[2] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var connect = _p.r(11);
 
-         connect.register("bezier", function(node, parent, connection) {
 
-             // 连线起点和终点
 
-             var po = parent.getLayoutVertexOut(), pi = node.getLayoutVertexIn();
 
-             // 连线矢量和方向
 
-             var v = parent.getLayoutVectorOut().normalize();
 
-             var r = Math.round;
 
-             var abs = Math.abs;
 
-             var pathData = [];
 
-             pathData.push("M", r(po.x), r(po.y));
 
-             if (abs(v.x) > abs(v.y)) {
 
-                 // x - direction
 
-                 var hx = (pi.x + po.x) / 2;
 
-                 pathData.push("C", hx, po.y, hx, pi.y, pi.x, pi.y);
 
-             } else {
 
-                 // y - direction
 
-                 var hy = (pi.y + po.y) / 2;
 
-                 pathData.push("C", po.x, hy, pi.x, hy, pi.x, pi.y);
 
-             }
 
-             connection.setMarker(null);
 
-             connection.setPathData(pathData);
 
-         });
 
-     }
 
- };
 
- //src/connect/fish-bone-master.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 鱼骨头主干连线
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[3] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var connect = _p.r(11);
 
-         connect.register("fish-bone-master", function(node, parent, connection) {
 
-             var pout = parent.getLayoutVertexOut(), pin = node.getLayoutVertexIn();
 
-             var abs = Math.abs;
 
-             var dy = abs(pout.y - pin.y), dx = abs(pout.x - pin.x);
 
-             var pathData = [];
 
-             pathData.push("M", pout.x, pout.y);
 
-             pathData.push("h", dx - dy);
 
-             pathData.push("L", pin.x, pin.y);
 
-             connection.setMarker(null);
 
-             connection.setPathData(pathData);
 
-         });
 
-     }
 
- };
 
- //src/connect/l.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * "L" 连线
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[4] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var connect = _p.r(11);
 
-         connect.register("l", function(node, parent, connection) {
 
-             var po = parent.getLayoutVertexOut();
 
-             var pi = node.getLayoutVertexIn();
 
-             var vo = parent.getLayoutVectorOut();
 
-             var pathData = [];
 
-             var r = Math.round, abs = Math.abs;
 
-             pathData.push("M", po.round());
 
-             if (abs(vo.x) > abs(vo.y)) {
 
-                 pathData.push("H", r(pi.x));
 
-             } else {
 
-                 pathData.push("V", pi.y);
 
-             }
 
-             pathData.push("L", pi);
 
-             connection.setPathData(pathData);
 
-         });
 
-     }
 
- };
 
- //src/connect/poly.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 提供折线相连的方法
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[5] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var connect = _p.r(11);
 
-         connect.register("poly", function(node, parent, connection, width) {
 
-             // 连线起点和终点
 
-             var po = parent.getLayoutVertexOut(), pi = node.getLayoutVertexIn();
 
-             // 连线矢量和方向
 
-             var v = parent.getLayoutVectorOut().normalize();
 
-             var r = Math.round;
 
-             var abs = Math.abs;
 
-             var pathData = [];
 
-             pathData.push("M", r(po.x), r(po.y));
 
-             switch (true) {
 
-               case abs(v.x) > abs(v.y) && v.x < 0:
 
-                 // left
 
-                 pathData.push("h", -parent.getStyle("margin-left"));
 
-                 pathData.push("v", pi.y - po.y);
 
-                 pathData.push("H", pi.x);
 
-                 break;
 
-               case abs(v.x) > abs(v.y) && v.x >= 0:
 
-                 // right
 
-                 pathData.push("h", parent.getStyle("margin-right"));
 
-                 pathData.push("v", pi.y - po.y);
 
-                 pathData.push("H", pi.x);
 
-                 break;
 
-               case abs(v.x) <= abs(v.y) && v.y < 0:
 
-                 // top
 
-                 pathData.push("v", -parent.getStyle("margin-top"));
 
-                 pathData.push("h", pi.x - po.x);
 
-                 pathData.push("V", pi.y);
 
-                 break;
 
-               case abs(v.x) <= abs(v.y) && v.y >= 0:
 
-                 // bottom
 
-                 pathData.push("v", parent.getStyle("margin-bottom"));
 
-                 pathData.push("h", pi.x - po.x);
 
-                 pathData.push("V", pi.y);
 
-                 break;
 
-             }
 
-             connection.setMarker(null);
 
-             connection.setPathData(pathData);
 
-         });
 
-     }
 
- };
 
- //src/connect/under.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 下划线连线
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[6] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var connect = _p.r(11);
 
-         connect.register("under", function(node, parent, connection, width, color) {
 
-             var box = node.getLayoutBox(), pBox = parent.getLayoutBox();
 
-             var start, end, vector;
 
-             var abs = Math.abs;
 
-             var pathData = [];
 
-             var side = box.x > pBox.x ? "right" : "left";
 
-             var radius = node.getStyle("connect-radius");
 
-             var underY = box.bottom + 3;
 
-             var startY = parent.getType() == "sub" ? pBox.bottom + 3 : pBox.cy;
 
-             var p1, p2, p3, mx;
 
-             if (side == "right") {
 
-                 p1 = new kity.Point(pBox.right, startY);
 
-                 p2 = new kity.Point(box.left - 10, underY);
 
-                 p3 = new kity.Point(box.right, underY);
 
-             } else {
 
-                 p1 = new kity.Point(pBox.left, startY);
 
-                 p2 = new kity.Point(box.right + 10, underY);
 
-                 p3 = new kity.Point(box.left, underY);
 
-             }
 
-             mx = (p1.x + p2.x) / 2;
 
-             pathData.push("M", p1);
 
-             pathData.push("C", mx, p1.y, mx, p2.y, p2);
 
-             pathData.push("L", p3);
 
-             connection.setMarker(null);
 
-             connection.setPathData(pathData);
 
-         });
 
-     }
 
- };
 
- //src/core/_boxv.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 调试工具:为 kity.Box 提供一个可视化的渲染
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[7] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var Minder = _p.r(19);
 
-         if (location.href.indexOf("boxv") != -1) {
 
-             var vrect;
 
-             Object.defineProperty(kity.Box.prototype, "visualization", {
 
-                 get: function() {
 
-                     if (!vrect) return null;
 
-                     return vrect.setBox(this);
 
-                 }
 
-             });
 
-             Minder.registerInitHook(function() {
 
-                 this.on("paperrender", function() {
 
-                     vrect = new kity.Rect();
 
-                     vrect.fill("rgba(200, 200, 200, .5)");
 
-                     vrect.stroke("orange");
 
-                     this.getRenderContainer().addShape(vrect);
 
-                 });
 
-             });
 
-         }
 
-     }
 
- };
 
- //src/core/animate.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 动画控制
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[8] = {
 
-     value: function(require, exports, module) {
 
-         var Minder = _p.r(19);
 
-         var animateDefaultOptions = {
 
-             enableAnimation: true,
 
-             layoutAnimationDuration: 300,
 
-             viewAnimationDuration: 100,
 
-             zoomAnimationDuration: 300
 
-         };
 
-         var resoredAnimationOptions = {};
 
-         Minder.registerInitHook(function() {
 
-             this.setDefaultOptions(animateDefaultOptions);
 
-             if (!this.getOption("enableAnimation")) {
 
-                 this.disableAnimation();
 
-             }
 
-         });
 
-         Minder.prototype.enableAnimation = function() {
 
-             for (var name in animateDefaultOptions) {
 
-                 if (animateDefaultOptions.hasOwnProperty(name)) {
 
-                     this.setOption(resoredAnimationOptions[name]);
 
-                 }
 
-             }
 
-         };
 
-         Minder.prototype.disableAnimation = function() {
 
-             for (var name in animateDefaultOptions) {
 
-                 if (animateDefaultOptions.hasOwnProperty(name)) {
 
-                     resoredAnimationOptions[name] = this.getOption(name);
 
-                     this.setOption(name, 0);
 
-                 }
 
-             }
 
-         };
 
-     }
 
- };
 
- //src/core/command.js
 
- _p[9] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var MinderEvent = _p.r(13);
 
-         var COMMAND_STATE_NORMAL = 0;
 
-         var COMMAND_STATE_DISABLED = -1;
 
-         var COMMAND_STATE_ACTIVED = 1;
 
-         /**
 
-      * 表示一个命令,包含命令的查询及执行
 
-      */
 
-         var Command = kity.createClass("Command", {
 
-             constructor: function() {
 
-                 this._isContentChange = true;
 
-                 this._isSelectionChange = false;
 
-             },
 
-             execute: function(minder, args) {
 
-                 throw new Error("Not Implement: Command.execute()");
 
-             },
 
-             setContentChanged: function(val) {
 
-                 this._isContentChange = !!val;
 
-             },
 
-             isContentChanged: function() {
 
-                 return this._isContentChange;
 
-             },
 
-             setSelectionChanged: function(val) {
 
-                 this._isSelectionChange = !!val;
 
-             },
 
-             isSelectionChanged: function() {
 
-                 return this._isContentChange;
 
-             },
 
-             queryState: function(km) {
 
-                 return COMMAND_STATE_NORMAL;
 
-             },
 
-             queryValue: function(km) {
 
-                 return 0;
 
-             },
 
-             isNeedUndo: function() {
 
-                 return true;
 
-             }
 
-         });
 
-         Command.STATE_NORMAL = COMMAND_STATE_NORMAL;
 
-         Command.STATE_ACTIVE = COMMAND_STATE_ACTIVED;
 
-         Command.STATE_DISABLED = COMMAND_STATE_DISABLED;
 
-         kity.extendClass(Minder, {
 
-             _getCommand: function(name) {
 
-                 return this._commands[name.toLowerCase()];
 
-             },
 
-             _queryCommand: function(name, type, args) {
 
-                 var cmd = this._getCommand(name);
 
-                 if (cmd) {
 
-                     var queryCmd = cmd["query" + type];
 
-                     if (queryCmd) return queryCmd.apply(cmd, [ this ].concat(args));
 
-                 }
 
-                 return 0;
 
-             },
 
-             /**
 
-          * @method queryCommandState()
 
-          * @for Minder
 
-          * @description 查询指定命令的状态
 
-          *
 
-          * @grammar queryCommandName(name) => {number}
 
-          *
 
-          * @param {string} name 要查询的命令名称
 
-          *
 
-          * @return {number}
 
-          *   -1: 命令不存在或命令当前不可用
 
-          *    0: 命令可用
 
-          *    1: 命令当前可用并且已经执行过
 
-          */
 
-             queryCommandState: function(name) {
 
-                 return this._queryCommand(name, "State", [].slice.call(arguments, 1));
 
-             },
 
-             /**
 
-          * @method queryCommandValue()
 
-          * @for Minder
 
-          * @description 查询指定命令当前的执行值
 
-          *
 
-          * @grammar queryCommandValue(name) => {any}
 
-          *
 
-          * @param {string} name 要查询的命令名称
 
-          *
 
-          * @return {any}
 
-          *    如果命令不存在,返回 undefined
 
-          *    不同命令具有不同返回值,具体请查看 [Command](command) 章节
 
-          */
 
-             queryCommandValue: function(name) {
 
-                 return this._queryCommand(name, "Value", [].slice.call(arguments, 1));
 
-             },
 
-             /**
 
-          * @method execCommand()
 
-          * @for Minder
 
-          * @description 执行指定的命令。
 
-          *
 
-          * @grammar execCommand(name, args...)
 
-          *
 
-          * @param {string} name 要执行的命令名称
 
-          * @param {argument} args 要传递给命令的其它参数
 
-          */
 
-             execCommand: function(name) {
 
-                 if (!name) return null;
 
-                 name = name.toLowerCase();
 
-                 var cmdArgs = [].slice.call(arguments, 1), cmd, stoped, result, eventParams;
 
-                 var me = this;
 
-                 cmd = this._getCommand(name);
 
-                 eventParams = {
 
-                     command: cmd,
 
-                     commandName: name.toLowerCase(),
 
-                     commandArgs: cmdArgs
 
-                 };
 
-                 if (!cmd || !~this.queryCommandState(name)) {
 
-                     return false;
 
-                 }
 
-                 if (!this._hasEnterExecCommand) {
 
-                     this._hasEnterExecCommand = true;
 
-                     stoped = this._fire(new MinderEvent("beforeExecCommand", eventParams, true));
 
-                     if (!stoped) {
 
-                         this._fire(new MinderEvent("preExecCommand", eventParams, false));
 
-                         result = cmd.execute.apply(cmd, [ me ].concat(cmdArgs));
 
-                         this._fire(new MinderEvent("execCommand", eventParams, false));
 
-                         if (cmd.isContentChanged()) {
 
-                             this._firePharse(new MinderEvent("contentchange"));
 
-                         }
 
-                         this._interactChange();
 
-                     }
 
-                     this._hasEnterExecCommand = false;
 
-                 } else {
 
-                     result = cmd.execute.apply(cmd, [ me ].concat(cmdArgs));
 
-                     if (!this._hasEnterExecCommand) {
 
-                         this._interactChange();
 
-                     }
 
-                 }
 
-                 return result === undefined ? null : result;
 
-             }
 
-         });
 
-         module.exports = Command;
 
-     }
 
- };
 
- //src/core/compatibility.js
 
- _p[10] = {
 
-     value: function(require, exports, module) {
 
-         var utils = _p.r(33);
 
-         function compatibility(json) {
 
-             var version = json.version || (json.root ? "1.4.0" : "1.1.3");
 
-             switch (version) {
 
-               case "1.1.3":
 
-                 c_113_120(json);
 
-               /* falls through */
 
-                 case "1.2.0":
 
-               case "1.2.1":
 
-                 c_120_130(json);
 
-               /* falls through */
 
-                 case "1.3.0":
 
-               case "1.3.1":
 
-               case "1.3.2":
 
-               case "1.3.3":
 
-               case "1.3.4":
 
-               case "1.3.5":
 
-                 /* falls through */
 
-                 c_130_140(json);
 
-             }
 
-             return json;
 
-         }
 
-         function traverse(node, fn) {
 
-             fn(node);
 
-             if (node.children) node.children.forEach(function(child) {
 
-                 traverse(child, fn);
 
-             });
 
-         }
 
-         /* 脑图数据升级 */
 
-         function c_120_130(json) {
 
-             traverse(json, function(node) {
 
-                 var data = node.data;
 
-                 delete data.layout_bottom_offset;
 
-                 delete data.layout_default_offset;
 
-                 delete data.layout_filetree_offset;
 
-             });
 
-         }
 
-         /**
 
-      * 脑图数据升级
 
-      * v1.1.3 => v1.2.0
 
-      * */
 
-         function c_113_120(json) {
 
-             // 原本的布局风格
 
-             var ocs = json.data.currentstyle;
 
-             delete json.data.currentstyle;
 
-             // 为 1.2 选择模板,同时保留老版本文件的皮肤
 
-             if (ocs == "bottom") {
 
-                 json.template = "structure";
 
-                 json.theme = "snow";
 
-             } else if (ocs == "default") {
 
-                 json.template = "default";
 
-                 json.theme = "classic";
 
-             }
 
-             traverse(json, function(node) {
 
-                 var data = node.data;
 
-                 // 升级优先级、进度图标
 
-                 if ("PriorityIcon" in data) {
 
-                     data.priority = data.PriorityIcon;
 
-                     delete data.PriorityIcon;
 
-                 }
 
-                 if ("ProgressIcon" in data) {
 
-                     data.progress = 1 + (data.ProgressIcon - 1 << 1);
 
-                     delete data.ProgressIcon;
 
-                 }
 
-                 // 删除过时属性
 
-                 delete data.point;
 
-                 delete data.layout;
 
-             });
 
-         }
 
-         function c_130_140(json) {
 
-             json.root = {
 
-                 data: json.data,
 
-                 children: json.children
 
-             };
 
-             delete json.data;
 
-             delete json.children;
 
-         }
 
-         return compatibility;
 
-     }
 
- };
 
- //src/core/connect.js
 
- _p[11] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Module = _p.r(20);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         // 连线提供方
 
-         var _connectProviders = {};
 
-         function register(name, provider) {
 
-             _connectProviders[name] = provider;
 
-         }
 
-         register("default", function(node, parent, connection) {
 
-             connection.setPathData([ "M", parent.getLayoutVertexOut(), "L", node.getLayoutVertexIn() ]);
 
-         });
 
-         kity.extendClass(MinderNode, {
 
-             /**
 
-          * @private
 
-          * @method getConnect()
 
-          * @for MinderNode
 
-          * @description 获取当前节点的连线类型
 
-          *
 
-          * @grammar getConnect() => {string}
 
-          */
 
-             getConnect: function() {
 
-                 return this.data.connect || "default";
 
-             },
 
-             getConnectProvider: function() {
 
-                 return _connectProviders[this.getConnect()] || _connectProviders["default"];
 
-             },
 
-             /**
 
-          * @private
 
-          * @method getConnection()
 
-          * @for MinderNode
 
-          * @description 获取当前节点的连线对象
 
-          *
 
-          * @grammar getConnection() => {kity.Path}
 
-          */
 
-             getConnection: function() {
 
-                 return this._connection || null;
 
-             }
 
-         });
 
-         kity.extendClass(Minder, {
 
-             getConnectContainer: function() {
 
-                 return this._connectContainer;
 
-             },
 
-             createConnect: function(node) {
 
-                 if (node.isRoot()) return;
 
-                 var connection = new kity.Path();
 
-                 node._connection = connection;
 
-                 this._connectContainer.addShape(connection);
 
-                 this.updateConnect(node);
 
-             },
 
-             removeConnect: function(node) {
 
-                 var me = this;
 
-                 node.traverse(function(node) {
 
-                     me._connectContainer.removeShape(node._connection);
 
-                     node._connection = null;
 
-                 });
 
-             },
 
-             updateConnect: function(node) {
 
-                 var connection = node._connection;
 
-                 var parent = node.parent;
 
-                 if (!parent || !connection) return;
 
-                 if (parent.isCollapsed()) {
 
-                     connection.setVisible(false);
 
-                     return;
 
-                 }
 
-                 connection.setVisible(true);
 
-                 var provider = node.getConnectProvider();
 
-                 var strokeColor = node.getStyle("connect-color") || "white", strokeWidth = node.getStyle("connect-width") || 2;
 
-                 connection.stroke(strokeColor, strokeWidth);
 
-                 provider(node, parent, connection, strokeWidth, strokeColor);
 
-                 if (strokeWidth % 2 === 0) {
 
-                     connection.setTranslate(.5, .5);
 
-                 } else {
 
-                     connection.setTranslate(0, 0);
 
-                 }
 
-             }
 
-         });
 
-         Module.register("Connect", {
 
-             init: function() {
 
-                 this._connectContainer = new kity.Group().setId(utils.uuid("minder_connect_group"));
 
-                 this.getRenderContainer().prependShape(this._connectContainer);
 
-             },
 
-             events: {
 
-                 nodeattach: function(e) {
 
-                     this.createConnect(e.node);
 
-                 },
 
-                 nodedetach: function(e) {
 
-                     this.removeConnect(e.node);
 
-                 },
 
-                 "layoutapply layoutfinish noderender": function(e) {
 
-                     this.updateConnect(e.node);
 
-                 }
 
-             }
 
-         });
 
-         exports.register = register;
 
-     }
 
- };
 
- //src/core/data.js
 
- _p[12] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var MinderEvent = _p.r(13);
 
-         var compatibility = _p.r(10);
 
-         var Promise = _p.r(25);
 
-         var protocols = {};
 
-         function registerProtocol(name, protocol) {
 
-             protocols[name] = protocol;
 
-             for (var pname in protocols) {
 
-                 if (protocols.hasOwnProperty(pname)) {
 
-                     protocols[pname] = protocols[pname];
 
-                     protocols[pname].name = pname;
 
-                 }
 
-             }
 
-         }
 
-         function getRegisterProtocol(name) {
 
-             return name === undefined ? protocols : protocols[name] || null;
 
-         }
 
-         exports.registerProtocol = registerProtocol;
 
-         exports.getRegisterProtocol = getRegisterProtocol;
 
-         // 导入导出
 
-         kity.extendClass(Minder, {
 
-             // 自动导入
 
-             setup: function(target) {
 
-                 if (typeof target == "string") {
 
-                     target = document.querySelector(target);
 
-                 }
 
-                 if (!target) return;
 
-                 var protocol = target.getAttribute("minder-data-type");
 
-                 if (protocol in protocols) {
 
-                     var data = target.textContent;
 
-                     target.textContent = null;
 
-                     this.renderTo(target);
 
-                     this.importData(protocol, data);
 
-                 }
 
-                 return this;
 
-             },
 
-             /**
 
-          * @method exportJson()
 
-          * @for Minder
 
-          * @description
 
-          *     导出当前脑图数据为 JSON 对象,导出的数据格式请参考 [Data](data) 章节。
 
-          * @grammar exportJson() => {plain}
 
-          */
 
-             exportJson: function() {
 
-                 /* 导出 node 上整棵树的数据为 JSON */
 
-                 function exportNode(node) {
 
-                     var exported = {};
 
-                     exported.data = node.getData();
 
-                     var childNodes = node.getChildren();
 
-                     exported.children = [];
 
-                     for (var i = 0; i < childNodes.length; i++) {
 
-                         exported.children.push(exportNode(childNodes[i]));
 
-                     }
 
-                     return exported;
 
-                 }
 
-                 var json = {
 
-                     root: exportNode(this.getRoot())
 
-                 };
 
-                 json.template = this.getTemplate();
 
-                 json.theme = this.getTheme();
 
-                 json.version = Minder.version;
 
-                 return JSON.parse(JSON.stringify(json));
 
-             },
 
-             /**
 
-          * function Text2Children(MinderNode, String) 
 
-          * @param {MinderNode} node 要导入数据的节点
 
-          * @param {String} text 导入的text数据
 
-          * @Desc: 用于批量插入子节点,并不会修改被插入的父节点
 
-          * @Editor: Naixor
 
-          * @Date: 2015.9.21
 
-          * @example: 用于批量导入如下类型的节点
 
-          *      234
 
-          *      3456346 asadf
 
-          *          12312414
 
-          *              wereww
 
-          *          12314
 
-          *      1231412
 
-          *      13123    
 
-          */
 
-             Text2Children: function(node, text) {
 
-                 if (!(node instanceof kityminder.Node)) {
 
-                     return;
 
-                 }
 
-                 var children = [], jsonMap = {}, level = 0;
 
-                 var LINE_SPLITTER = /\r|\n|\r\n/, TAB_REGEXP = /^(\t|\x20{4})/;
 
-                 var lines = text.split(LINE_SPLITTER), line = "", jsonNode, i = 0;
 
-                 var minder = this;
 
-                 function isEmpty(line) {
 
-                     return line === "" && !/\S/.test(line);
 
-                 }
 
-                 function getNode(line) {
 
-                     return {
 
-                         data: {
 
-                             text: line.replace(/^(\t|\x20{4})+/, "").replace(/(\t|\x20{4})+$/, "")
 
-                         },
 
-                         children: []
 
-                     };
 
-                 }
 
-                 function getLevel(text) {
 
-                     var level = 0;
 
-                     while (TAB_REGEXP.test(text)) {
 
-                         text = text.replace(TAB_REGEXP, "");
 
-                         level++;
 
-                     }
 
-                     return level;
 
-                 }
 
-                 function addChild(parent, node) {
 
-                     parent.children.push(node);
 
-                 }
 
-                 function importChildren(node, children) {
 
-                     for (var i = 0, l = children.length; i < l; i++) {
 
-                         var childNode = minder.createNode(null, node);
 
-                         childNode.setData("text", children[i].data.text || "");
 
-                         importChildren(childNode, children[i].children);
 
-                     }
 
-                 }
 
-                 while ((line = lines[i++]) !== undefined) {
 
-                     line = line.replace(/ /g, "");
 
-                     if (isEmpty(line)) continue;
 
-                     level = getLevel(line);
 
-                     jsonNode = getNode(line);
 
-                     if (level === 0) {
 
-                         jsonMap = {};
 
-                         children.push(jsonNode);
 
-                         jsonMap[0] = children[children.length - 1];
 
-                     } else {
 
-                         if (!jsonMap[level - 1]) {
 
-                             throw new Error("Invalid local format");
 
-                         }
 
-                         addChild(jsonMap[level - 1], jsonNode);
 
-                         jsonMap[level] = jsonNode;
 
-                     }
 
-                 }
 
-                 importChildren(node, children);
 
-                 minder.refresh();
 
-             },
 
-             /**
 
-          * @method exportNode(MinderNode)
 
-          * @param  {MinderNode} node 当前要被导出的节点
 
-          * @return {Object}      返回只含有data和children的Object
 
-          * @Editor: Naixor
 
-          * @Date: 2015.9.22
 
-          */
 
-             exportNode: function(node) {
 
-                 var exported = {};
 
-                 exported.data = node.getData();
 
-                 var childNodes = node.getChildren();
 
-                 exported.children = [];
 
-                 for (var i = 0; i < childNodes.length; i++) {
 
-                     exported.children.push(this.exportNode(childNodes[i]));
 
-                 }
 
-                 return exported;
 
-             },
 
-             /**
 
-          * @method importNode()
 
-          * @description 根据纯json {data, children}数据转换成为脑图节点
 
-          * @Editor: Naixor
 
-          * @Date: 2015.9.20
 
-          */
 
-             importNode: function(node, json) {
 
-                 var data = json.data;
 
-                 node.data = {};
 
-                 for (var field in data) {
 
-                     node.setData(field, data[field]);
 
-                 }
 
-                 var childrenTreeData = json.children || [];
 
-                 for (var i = 0; i < childrenTreeData.length; i++) {
 
-                     var childNode = this.createNode(null, node);
 
-                     this.importNode(childNode, childrenTreeData[i]);
 
-                 }
 
-                 return node;
 
-             },
 
-             /**
 
-          * @method importJson()
 
-          * @for Minder
 
-          * @description 导入脑图数据,数据为 JSON 对象,具体的数据字段形式请参考 [Data](data) 章节。
 
-          *
 
-          * @grammar importJson(json) => {this}
 
-          *
 
-          * @param {plain} json 要导入的数据
 
-          */
 
-             importJson: function(json) {
 
-                 if (!json) return;
 
-                 /**
 
-              * @event preimport
 
-              * @for Minder
 
-              * @when 导入数据之前
 
-              */
 
-                 this._fire(new MinderEvent("preimport", null, false));
 
-                 // 删除当前所有节点
 
-                 while (this._root.getChildren().length) {
 
-                     this.removeNode(this._root.getChildren()[0]);
 
-                 }
 
-                 json = compatibility(json);
 
-                 this.importNode(this._root, json.root);
 
-                 this.setTemplate(json.template || "default");
 
-                 this.setTheme(json.theme || null);
 
-                 this.refresh();
 
-                 /**
 
-              * @event import,contentchange,interactchange
 
-              * @for Minder
 
-              * @when 导入数据之后
 
-              */
 
-                 this.fire("import");
 
-                 this._firePharse({
 
-                     type: "contentchange"
 
-                 });
 
-                 this._interactChange();
 
-                 return this;
 
-             },
 
-             /**
 
-          * @method exportData()
 
-          * @for Minder
 
-          * @description 使用指定使用的数据协议,导入脑图数据
 
-          *
 
-          * @grammar exportData(protocol) => Promise<data>
 
-          *
 
-          * @param {string} protocol 指定的数据协议(默认内置五种数据协议 `json`、`text`、`markdown`、`svg` 和 `png`)
 
-          */
 
-             exportData: function(protocolName, option) {
 
-                 var json, protocol;
 
-                 json = this.exportJson();
 
-                 // 指定了协议进行导出,需要检测协议是否支持
 
-                 if (protocolName) {
 
-                     protocol = protocols[protocolName];
 
-                     if (!protocol || !protocol.encode) {
 
-                         return Promise.reject(new Error("Not supported protocol:" + protocolName));
 
-                     }
 
-                 }
 
-                 // 导出前抛个事件
 
-                 this._fire(new MinderEvent("beforeexport", {
 
-                     json: json,
 
-                     protocolName: protocolName,
 
-                     protocol: protocol
 
-                 }));
 
-                 return Promise.resolve(protocol.encode(json, this, option));
 
-             },
 
-             /**
 
-          * @method importData()
 
-          * @for Minder
 
-          * @description 使用指定的数据协议,导入脑图数据,覆盖当前实例的脑图
 
-          *
 
-          * @grammar importData(protocol, callback) => Promise<json>
 
-          *
 
-          * @param {string} protocol 指定的用于解析数据的数据协议(默认内置三种数据协议 `json`、`text` 和 `markdown` 的支持)
 
-          * @param {any} data 要导入的数据
 
-          */
 
-             importData: function(protocolName, data, option) {
 
-                 var json, protocol;
 
-                 var minder = this;
 
-                 // 指定了协议进行导入,需要检测协议是否支持
 
-                 if (protocolName) {
 
-                     protocol = protocols[protocolName];
 
-                     if (!protocol || !protocol.decode) {
 
-                         return Promise.reject(new Error("Not supported protocol:" + protocolName));
 
-                     }
 
-                 }
 
-                 var params = {
 
-                     local: data,
 
-                     protocolName: protocolName,
 
-                     protocol: protocol
 
-                 };
 
-                 // 导入前抛事件
 
-                 this._fire(new MinderEvent("beforeimport", params));
 
-                 return Promise.resolve(protocol.decode(data, this, option)).then(function(json) {
 
-                     minder.importJson(json);
 
-                     return json;
 
-                 });
 
-             },
 
-             /**
 
-          * @method decodeData()
 
-          * @for Minder
 
-          * @description 使用指定的数据协议,解析为脑图数据,与 importData 的区别在于:不覆盖当前实例的脑图
 
-          *
 
-          * @grammar decodeData(protocol, callback) => Promise<json>
 
-          *
 
-          * @param {string} protocol 指定的用于解析数据的数据协议(默认内置三种数据协议 `json`、`text` 和 `markdown` 的支持)
 
-          * @param {any} data 要导入的数据
 
-          */
 
-             decodeData: function(protocolName, data, option) {
 
-                 var json, protocol;
 
-                 var minder = this;
 
-                 // 指定了协议进行导入,需要检测协议是否支持
 
-                 if (protocolName) {
 
-                     protocol = protocols[protocolName];
 
-                     if (!protocol || !protocol.decode) {
 
-                         return Promise.reject(new Error("Not supported protocol:" + protocolName));
 
-                     }
 
-                 }
 
-                 var params = {
 
-                     local: data,
 
-                     protocolName: protocolName,
 
-                     protocol: protocol
 
-                 };
 
-                 // 导入前抛事件
 
-                 this._fire(new MinderEvent("beforeimport", params));
 
-                 return Promise.resolve(protocol.decode(data, this, option));
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/core/event.js
 
- _p[13] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         /**
 
-      * @class MinderEvent
 
-      * @description 表示一个脑图中发生的事件
 
-      */
 
-         var MinderEvent = kity.createClass("MindEvent", {
 
-             constructor: function(type, params, canstop) {
 
-                 params = params || {};
 
-                 if (params.getType && params.getType() == "ShapeEvent") {
 
-                     /**
 
-                  * @property kityEvent
 
-                  * @for MinderEvent
 
-                  * @description 如果事件是从一个 kity 的事件派生的,会有 kityEvent 属性指向原来的 kity 事件
 
-                  * @type {KityEvent}
 
-                  */
 
-                     this.kityEvent = params;
 
-                     /**
 
-                  * @property originEvent
 
-                  * @for MinderEvent
 
-                  * @description 如果事件是从原声 Dom 事件派生的(如 click、mousemove 等),会有 originEvent 指向原来的 Dom 事件
 
-                  * @type {DomEvent}
 
-                  */
 
-                     this.originEvent = params.originEvent;
 
-                 } else if (params.target && params.preventDefault) {
 
-                     this.originEvent = params;
 
-                 } else {
 
-                     kity.Utils.extend(this, params);
 
-                 }
 
-                 /**
 
-              * @property type
 
-              * @for MinderEvent
 
-              * @description 事件的类型,如 `click`、`contentchange` 等
 
-              * @type {string}
 
-              */
 
-                 this.type = type;
 
-                 this._canstop = canstop || false;
 
-             },
 
-             /**
 
-          * @method getPosition()
 
-          * @for MinderEvent
 
-          * @description 如果事件是从一个 kity 事件派生的,会有 `getPosition()` 获取事件发生的坐标
 
-          *
 
-          * @grammar getPosition(refer) => {kity.Point}
 
-          *
 
-          * @param {string|kity.Shape} refer
 
-          *     参照的坐标系,
 
-          *     `"screen"` - 以浏览器屏幕为参照坐标系
 
-          *     `"minder"` - (默认)以脑图画布为参照坐标系
 
-          *     `{kity.Shape}` - 指定以某个 kity 图形为参照坐标系
 
-          */
 
-             getPosition: function(refer) {
 
-                 if (!this.kityEvent) return;
 
-                 if (!refer || refer == "minder") {
 
-                     return this.kityEvent.getPosition(this.minder.getRenderContainer());
 
-                 }
 
-                 return this.kityEvent.getPosition.call(this.kityEvent, refer);
 
-             },
 
-             /**
 
-          * @method getTargetNode()
 
-          * @for MinderEvent
 
-          * @description 当发生的事件是鼠标事件时,获取事件位置命中的脑图节点
 
-          *
 
-          * @grammar getTargetNode() => {MinderNode}
 
-          */
 
-             getTargetNode: function() {
 
-                 var findShape = this.kityEvent && this.kityEvent.targetShape;
 
-                 if (!findShape) return null;
 
-                 while (!findShape.minderNode && findShape.container) {
 
-                     findShape = findShape.container;
 
-                 }
 
-                 var node = findShape.minderNode;
 
-                 if (node && findShape.getOpacity() < 1) return null;
 
-                 return node || null;
 
-             },
 
-             /**
 
-          * @method stopPropagation()
 
-          * @for MinderEvent
 
-          * @description 当发生的事件是鼠标事件时,获取事件位置命中的脑图节点
 
-          *
 
-          * @grammar getTargetNode() => {MinderNode}
 
-          */
 
-             stopPropagation: function() {
 
-                 this._stoped = true;
 
-             },
 
-             stopPropagationImmediately: function() {
 
-                 this._immediatelyStoped = true;
 
-                 this._stoped = true;
 
-             },
 
-             shouldStopPropagation: function() {
 
-                 return this._canstop && this._stoped;
 
-             },
 
-             shouldStopPropagationImmediately: function() {
 
-                 return this._canstop && this._immediatelyStoped;
 
-             },
 
-             preventDefault: function() {
 
-                 this.originEvent.preventDefault();
 
-             },
 
-             isRightMB: function() {
 
-                 var isRightMB = false;
 
-                 if (!this.originEvent) {
 
-                     return false;
 
-                 }
 
-                 if ("which" in this.originEvent) isRightMB = this.originEvent.which == 3; else if ("button" in this.originEvent) isRightMB = this.originEvent.button == 2;
 
-                 return isRightMB;
 
-             },
 
-             getKeyCode: function() {
 
-                 var evt = this.originEvent;
 
-                 return evt.keyCode || evt.which;
 
-             }
 
-         });
 
-         Minder.registerInitHook(function(option) {
 
-             this._initEvents();
 
-         });
 
-         kity.extendClass(Minder, {
 
-             _initEvents: function() {
 
-                 this._eventCallbacks = {};
 
-             },
 
-             _resetEvents: function() {
 
-                 this._initEvents();
 
-                 this._bindEvents();
 
-             },
 
-             _bindEvents: function() {
 
-                 /* jscs:disable maximumLineLength */
 
-                 this._paper.on("click dblclick mousedown contextmenu mouseup mousemove mouseover mousewheel DOMMouseScroll touchstart touchmove touchend dragenter dragleave drop", this._firePharse.bind(this));
 
-                 if (window) {
 
-                     window.addEventListener("resize", this._firePharse.bind(this));
 
-                 }
 
-             },
 
-             /**
 
-          * @method dispatchKeyEvent
 
-          * @description 派发键盘(相关)事件到脑图实例上,让实例的模块处理
 
-          * @grammar dispatchKeyEvent(e) => {this}
 
-          * @param  {Event} e 原生的 Dom 事件对象
 
-          */
 
-             dispatchKeyEvent: function(e) {
 
-                 this._firePharse(e);
 
-             },
 
-             _firePharse: function(e) {
 
-                 var beforeEvent, preEvent, executeEvent;
 
-                 if (e.type == "DOMMouseScroll") {
 
-                     e.type = "mousewheel";
 
-                     e.wheelDelta = e.originEvent.wheelDelta = e.originEvent.detail * -10;
 
-                     e.wheelDeltaX = e.originEvent.mozMovementX;
 
-                     e.wheelDeltaY = e.originEvent.mozMovementY;
 
-                 }
 
-                 beforeEvent = new MinderEvent("before" + e.type, e, true);
 
-                 if (this._fire(beforeEvent)) {
 
-                     return;
 
-                 }
 
-                 preEvent = new MinderEvent("pre" + e.type, e, true);
 
-                 executeEvent = new MinderEvent(e.type, e, true);
 
-                 if (this._fire(preEvent) || this._fire(executeEvent)) this._fire(new MinderEvent("after" + e.type, e, false));
 
-             },
 
-             _interactChange: function(e) {
 
-                 var me = this;
 
-                 if (me._interactScheduled) return;
 
-                 setTimeout(function() {
 
-                     me._fire(new MinderEvent("interactchange"));
 
-                     me._interactScheduled = false;
 
-                 }, 100);
 
-                 me._interactScheduled = true;
 
-             },
 
-             _listen: function(type, callback) {
 
-                 var callbacks = this._eventCallbacks[type] || (this._eventCallbacks[type] = []);
 
-                 callbacks.push(callback);
 
-             },
 
-             _fire: function(e) {
 
-                 /**
 
-              * @property minder
 
-              * @description 产生事件的 Minder 对象
 
-              * @for MinderShape
 
-              * @type {Minder}
 
-              */
 
-                 e.minder = this;
 
-                 var status = this.getStatus();
 
-                 var callbacks = this._eventCallbacks[e.type.toLowerCase()] || [];
 
-                 if (status) {
 
-                     callbacks = callbacks.concat(this._eventCallbacks[status + "." + e.type.toLowerCase()] || []);
 
-                 }
 
-                 if (callbacks.length === 0) {
 
-                     return;
 
-                 }
 
-                 var lastStatus = this.getStatus();
 
-                 for (var i = 0; i < callbacks.length; i++) {
 
-                     callbacks[i].call(this, e);
 
-                     /* this.getStatus() != lastStatus ||*/
 
-                     if (e.shouldStopPropagationImmediately()) {
 
-                         break;
 
-                     }
 
-                 }
 
-                 return e.shouldStopPropagation();
 
-             },
 
-             on: function(name, callback) {
 
-                 var km = this;
 
-                 name.split(/\s+/).forEach(function(n) {
 
-                     km._listen(n.toLowerCase(), callback);
 
-                 });
 
-                 return this;
 
-             },
 
-             off: function(name, callback) {
 
-                 var types = name.split(/\s+/);
 
-                 var i, j, callbacks, removeIndex;
 
-                 for (i = 0; i < types.length; i++) {
 
-                     callbacks = this._eventCallbacks[types[i].toLowerCase()];
 
-                     if (callbacks) {
 
-                         removeIndex = null;
 
-                         for (j = 0; j < callbacks.length; j++) {
 
-                             if (callbacks[j] == callback) {
 
-                                 removeIndex = j;
 
-                             }
 
-                         }
 
-                         if (removeIndex !== null) {
 
-                             callbacks.splice(removeIndex, 1);
 
-                         }
 
-                     }
 
-                 }
 
-             },
 
-             fire: function(type, params) {
 
-                 var e = new MinderEvent(type, params);
 
-                 this._fire(e);
 
-                 return this;
 
-             }
 
-         });
 
-         module.exports = MinderEvent;
 
-     }
 
- };
 
- //src/core/focus.js
 
- _p[14] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var Minder = _p.r(19);
 
-         Minder.registerInitHook(function() {
 
-             this.on("beforemousedown", function(e) {
 
-                 this.focus();
 
-                 e.preventDefault();
 
-             });
 
-             this.on("paperrender", function() {
 
-                 this.focus();
 
-             });
 
-         });
 
-         kity.extendClass(Minder, {
 
-             focus: function() {
 
-                 if (!this.isFocused()) {
 
-                     var renderTarget = this._renderTarget;
 
-                     renderTarget.classList.add("focus");
 
-                     this.renderNodeBatch(this.getSelectedNodes());
 
-                 }
 
-                 this.fire("focus");
 
-                 return this;
 
-             },
 
-             blur: function() {
 
-                 if (this.isFocused()) {
 
-                     var renderTarget = this._renderTarget;
 
-                     renderTarget.classList.remove("focus");
 
-                     this.renderNodeBatch(this.getSelectedNodes());
 
-                 }
 
-                 this.fire("blur");
 
-                 return this;
 
-             },
 
-             isFocused: function() {
 
-                 var renderTarget = this._renderTarget;
 
-                 return renderTarget && renderTarget.classList.contains("focus");
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/core/keymap.js
 
- _p[15] = {
 
-     value: function(require, exports, module) {
 
-         var keymap = {
 
-             Backspace: 8,
 
-             Tab: 9,
 
-             Enter: 13,
 
-             Shift: 16,
 
-             Control: 17,
 
-             Alt: 18,
 
-             CapsLock: 20,
 
-             Esc: 27,
 
-             Spacebar: 32,
 
-             PageUp: 33,
 
-             PageDown: 34,
 
-             End: 35,
 
-             Home: 36,
 
-             Insert: 45,
 
-             Left: 37,
 
-             Up: 38,
 
-             Right: 39,
 
-             Down: 40,
 
-             direction: {
 
-                 37: 1,
 
-                 38: 1,
 
-                 39: 1,
 
-                 40: 1
 
-             },
 
-             Del: 46,
 
-             NumLock: 144,
 
-             Cmd: 91,
 
-             CmdFF: 224,
 
-             F1: 112,
 
-             F2: 113,
 
-             F3: 114,
 
-             F4: 115,
 
-             F5: 116,
 
-             F6: 117,
 
-             F7: 118,
 
-             F8: 119,
 
-             F9: 120,
 
-             F10: 121,
 
-             F11: 122,
 
-             F12: 123,
 
-             "`": 192,
 
-             "=": 187,
 
-             "-": 189,
 
-             "/": 191,
 
-             ".": 190,
 
-             controlKeys: {
 
-                 16: 1,
 
-                 17: 1,
 
-                 18: 1,
 
-                 20: 1,
 
-                 91: 1,
 
-                 224: 1
 
-             },
 
-             notContentChange: {
 
-                 13: 1,
 
-                 9: 1,
 
-                 33: 1,
 
-                 34: 1,
 
-                 35: 1,
 
-                 36: 1,
 
-                 16: 1,
 
-                 17: 1,
 
-                 18: 1,
 
-                 20: 1,
 
-                 91: 1,
 
-                 //上下左右
 
-                 37: 1,
 
-                 38: 1,
 
-                 39: 1,
 
-                 40: 1,
 
-                 113: 1,
 
-                 114: 1,
 
-                 115: 1,
 
-                 144: 1,
 
-                 27: 1
 
-             },
 
-             isSelectedNodeKey: {
 
-                 //上下左右
 
-                 37: 1,
 
-                 38: 1,
 
-                 39: 1,
 
-                 40: 1,
 
-                 13: 1,
 
-                 9: 1
 
-             }
 
-         };
 
-         // 小写适配
 
-         for (var key in keymap) {
 
-             if (keymap.hasOwnProperty(key)) {
 
-                 keymap[key.toLowerCase()] = keymap[key];
 
-             }
 
-         }
 
-         var aKeyCode = 65;
 
-         var aCharCode = "a".charCodeAt(0);
 
-         // letters
 
-         "abcdefghijklmnopqrstuvwxyz".split("").forEach(function(letter) {
 
-             keymap[letter] = aKeyCode + (letter.charCodeAt(0) - aCharCode);
 
-         });
 
-         // numbers
 
-         var n = 9;
 
-         do {
 
-             keymap[n.toString()] = n + 48;
 
-         } while (--n);
 
-         module.exports = keymap;
 
-     }
 
- };
 
- //src/core/keyreceiver.js
 
- _p[16] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         function listen(element, type, handler) {
 
-             type.split(" ").forEach(function(name) {
 
-                 element.addEventListener(name, handler, false);
 
-             });
 
-         }
 
-         Minder.registerInitHook(function(option) {
 
-             this.setDefaultOptions({
 
-                 enableKeyReceiver: true
 
-             });
 
-             if (this.getOption("enableKeyReceiver")) {
 
-                 this.on("paperrender", function() {
 
-                     this._initKeyReceiver();
 
-                 });
 
-             }
 
-         });
 
-         kity.extendClass(Minder, {
 
-             _initKeyReceiver: function() {
 
-                 if (this._keyReceiver) return;
 
-                 var receiver = this._keyReceiver = document.createElement("input");
 
-                 receiver.classList.add("km-receiver");
 
-                 var renderTarget = this._renderTarget;
 
-                 renderTarget.appendChild(receiver);
 
-                 var minder = this;
 
-                 listen(receiver, "keydown keyup keypress copy paste blur focus input", function(e) {
 
-                     switch (e.type) {
 
-                       case "blur":
 
-                         minder.blur();
 
-                         break;
 
-                       case "focus":
 
-                         minder.focus();
 
-                         break;
 
-                       case "input":
 
-                         receiver.value = null;
 
-                         break;
 
-                     }
 
-                     minder._firePharse(e);
 
-                     e.preventDefault();
 
-                 });
 
-                 this.on("focus", function() {
 
-                     receiver.select();
 
-                     receiver.focus();
 
-                 });
 
-                 this.on("blur", function() {
 
-                     receiver.blur();
 
-                 });
 
-                 if (this.isFocused()) {
 
-                     receiver.select();
 
-                     receiver.focus();
 
-                 }
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/core/kity.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * Kity 引入
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[17] = {
 
-     value: function(require, exports, module) {
 
-         module.exports = window.kity;
 
-     }
 
- };
 
- //src/core/layout.js
 
- _p[18] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var MinderEvent = _p.r(13);
 
-         var Command = _p.r(9);
 
-         var _layouts = {};
 
-         var _defaultLayout;
 
-         function register(name, layout) {
 
-             _layouts[name] = layout;
 
-             _defaultLayout = _defaultLayout || name;
 
-         }
 
-         /**
 
-      * @class Layout 布局基类,具体布局需要从该类派生
 
-      */
 
-         var Layout = kity.createClass("Layout", {
 
-             /**
 
-          * @abstract
 
-          *
 
-          * 子类需要实现的布局算法,该算法输入一个节点,排布该节点的子节点(相对父节点的变换)
 
-          *
 
-          * @param  {MinderNode} node 需要布局的节点
 
-          *
 
-          * @example
 
-          *
 
-          * doLayout: function(node) {
 
-          *     var children = node.getChildren();
 
-          *     // layout calculation
 
-          *     children[i].setLayoutTransform(new kity.Matrix().translate(x, y));
 
-          * }
 
-          */
 
-             doLayout: function(parent, children) {
 
-                 throw new Error("Not Implement: Layout.doLayout()");
 
-             },
 
-             /**
 
-          * 对齐指定的节点
 
-          *
 
-          * @param {Array<MinderNode>} nodes 要对齐的节点
 
-          * @param {string} border 对齐边界,允许取值 left, right, top, bottom
 
-          *
 
-          */
 
-             align: function(nodes, border, offset) {
 
-                 var me = this;
 
-                 offset = offset || 0;
 
-                 nodes.forEach(function(node) {
 
-                     var tbox = me.getTreeBox([ node ]);
 
-                     var matrix = node.getLayoutTransform();
 
-                     switch (border) {
 
-                       case "left":
 
-                         return matrix.translate(offset - tbox.left, 0);
 
-                       case "right":
 
-                         return matrix.translate(offset - tbox.right, 0);
 
-                       case "top":
 
-                         return matrix.translate(0, offset - tbox.top);
 
-                       case "bottom":
 
-                         return matrix.translate(0, offset - tbox.bottom);
 
-                     }
 
-                 });
 
-             },
 
-             stack: function(nodes, axis, distance) {
 
-                 var me = this;
 
-                 var position = 0;
 
-                 distance = distance || function(node, next, axis) {
 
-                     return node.getStyle({
 
-                         x: "margin-right",
 
-                         y: "margin-bottom"
 
-                     }[axis]) + next.getStyle({
 
-                         x: "margin-left",
 
-                         y: "margin-top"
 
-                     }[axis]);
 
-                 };
 
-                 nodes.forEach(function(node, index, nodes) {
 
-                     var tbox = me.getTreeBox([ node ]);
 
-                     var size = {
 
-                         x: tbox.width,
 
-                         y: tbox.height
 
-                     }[axis];
 
-                     var offset = {
 
-                         x: tbox.left,
 
-                         y: tbox.top
 
-                     }[axis];
 
-                     var matrix = node.getLayoutTransform();
 
-                     if (axis == "x") {
 
-                         matrix.translate(position - offset, 0);
 
-                     } else {
 
-                         matrix.translate(0, position - offset);
 
-                     }
 
-                     position += size;
 
-                     if (nodes[index + 1]) position += distance(node, nodes[index + 1], axis);
 
-                 });
 
-                 return position;
 
-             },
 
-             move: function(nodes, dx, dy) {
 
-                 nodes.forEach(function(node) {
 
-                     node.getLayoutTransform().translate(dx, dy);
 
-                 });
 
-             },
 
-             /**
 
-          * 工具方法:获取给点的节点所占的布局区域
 
-          *
 
-          * @param  {MinderNode[]} nodes 需要计算的节点
 
-          *
 
-          * @return {Box} 计算结果
 
-          */
 
-             getBranchBox: function(nodes) {
 
-                 var box = new kity.Box();
 
-                 var i, node, matrix, contentBox;
 
-                 for (i = 0; i < nodes.length; i++) {
 
-                     node = nodes[i];
 
-                     matrix = node.getLayoutTransform();
 
-                     contentBox = node.getContentBox();
 
-                     box = box.merge(matrix.transformBox(contentBox));
 
-                 }
 
-                 return box;
 
-             },
 
-             /**
 
-          * 工具方法:计算给定的节点的子树所占的布局区域
 
-          *
 
-          * @param  {MinderNode} nodes 需要计算的节点
 
-          *
 
-          * @return {Box} 计算的结果
 
-          */
 
-             getTreeBox: function(nodes) {
 
-                 var i, node, matrix, treeBox;
 
-                 var box = new kity.Box();
 
-                 if (!(nodes instanceof Array)) nodes = [ nodes ];
 
-                 for (i = 0; i < nodes.length; i++) {
 
-                     node = nodes[i];
 
-                     matrix = node.getLayoutTransform();
 
-                     treeBox = node.getContentBox();
 
-                     if (node.isExpanded() && node.children.length) {
 
-                         treeBox = treeBox.merge(this.getTreeBox(node.children));
 
-                     }
 
-                     box = box.merge(matrix.transformBox(treeBox));
 
-                 }
 
-                 return box;
 
-             },
 
-             getOrderHint: function(node) {
 
-                 return [];
 
-             }
 
-         });
 
-         Layout.register = register;
 
-         Minder.registerInitHook(function(options) {
 
-             this.refresh();
 
-         });
 
-         /**
 
-      * 布局支持池子管理
 
-      */
 
-         utils.extend(Minder, {
 
-             getLayoutList: function() {
 
-                 return _layouts;
 
-             },
 
-             getLayoutInstance: function(name) {
 
-                 var LayoutClass = _layouts[name];
 
-                 if (!LayoutClass) throw new Error("Missing Layout: " + name);
 
-                 var layout = new LayoutClass();
 
-                 return layout;
 
-             }
 
-         });
 
-         /**
 
-      * MinderNode 上的布局支持
 
-      */
 
-         kity.extendClass(MinderNode, {
 
-             /**
 
-          * 获得当前节点的布局名称
 
-          *
 
-          * @return {String}
 
-          */
 
-             getLayout: function() {
 
-                 var layout = this.getData("layout");
 
-                 layout = layout || (this.isRoot() ? _defaultLayout : this.parent.getLayout());
 
-                 return layout;
 
-             },
 
-             setLayout: function(name) {
 
-                 if (name) {
 
-                     if (name == "inherit") {
 
-                         this.setData("layout");
 
-                     } else {
 
-                         this.setData("layout", name);
 
-                     }
 
-                 }
 
-                 return this;
 
-             },
 
-             layout: function(name) {
 
-                 this.setLayout(name).getMinder().layout();
 
-                 return this;
 
-             },
 
-             getLayoutInstance: function() {
 
-                 return Minder.getLayoutInstance(this.getLayout());
 
-             },
 
-             getOrderHint: function(refer) {
 
-                 return this.parent.getLayoutInstance().getOrderHint(this);
 
-             },
 
-             /**
 
-          * 获取当前节点相对于父节点的布局变换
 
-          */
 
-             getLayoutTransform: function() {
 
-                 return this._layoutTransform || new kity.Matrix();
 
-             },
 
-             /**
 
-          * 第一轮布局计算后,获得的全局布局位置
 
-          *
 
-          * @return {[type]} [description]
 
-          */
 
-             getGlobalLayoutTransformPreview: function() {
 
-                 var pMatrix = this.parent ? this.parent.getLayoutTransform() : new kity.Matrix();
 
-                 var matrix = this.getLayoutTransform();
 
-                 var offset = this.getLayoutOffset();
 
-                 if (offset) {
 
-                     matrix = matrix.clone().translate(offset.x, offset.y);
 
-                 }
 
-                 return pMatrix.merge(matrix);
 
-             },
 
-             getLayoutPointPreview: function() {
 
-                 return this.getGlobalLayoutTransformPreview().transformPoint(new kity.Point());
 
-             },
 
-             /**
 
-          * 获取节点相对于全局的布局变换
 
-          */
 
-             getGlobalLayoutTransform: function() {
 
-                 if (this._globalLayoutTransform) {
 
-                     return this._globalLayoutTransform;
 
-                 } else if (this.parent) {
 
-                     return this.parent.getGlobalLayoutTransform();
 
-                 } else {
 
-                     return new kity.Matrix();
 
-                 }
 
-             },
 
-             /**
 
-          * 设置当前节点相对于父节点的布局变换
 
-          */
 
-             setLayoutTransform: function(matrix) {
 
-                 this._layoutTransform = matrix;
 
-                 return this;
 
-             },
 
-             /**
 
-          * 设置当前节点相对于全局的布局变换(冗余优化)
 
-          */
 
-             setGlobalLayoutTransform: function(matrix) {
 
-                 this.getRenderContainer().setMatrix(this._globalLayoutTransform = matrix);
 
-                 return this;
 
-             },
 
-             setVertexIn: function(p) {
 
-                 this._vertexIn = p;
 
-             },
 
-             setVertexOut: function(p) {
 
-                 this._vertexOut = p;
 
-             },
 
-             getVertexIn: function() {
 
-                 return this._vertexIn || new kity.Point();
 
-             },
 
-             getVertexOut: function() {
 
-                 return this._vertexOut || new kity.Point();
 
-             },
 
-             getLayoutVertexIn: function() {
 
-                 return this.getGlobalLayoutTransform().transformPoint(this.getVertexIn());
 
-             },
 
-             getLayoutVertexOut: function() {
 
-                 return this.getGlobalLayoutTransform().transformPoint(this.getVertexOut());
 
-             },
 
-             setLayoutVectorIn: function(v) {
 
-                 this._layoutVectorIn = v;
 
-                 return this;
 
-             },
 
-             setLayoutVectorOut: function(v) {
 
-                 this._layoutVectorOut = v;
 
-                 return this;
 
-             },
 
-             getLayoutVectorIn: function() {
 
-                 return this._layoutVectorIn || new kity.Vector();
 
-             },
 
-             getLayoutVectorOut: function() {
 
-                 return this._layoutVectorOut || new kity.Vector();
 
-             },
 
-             getLayoutBox: function() {
 
-                 var matrix = this.getGlobalLayoutTransform();
 
-                 return matrix.transformBox(this.getContentBox());
 
-             },
 
-             getLayoutPoint: function() {
 
-                 var matrix = this.getGlobalLayoutTransform();
 
-                 return matrix.transformPoint(new kity.Point());
 
-             },
 
-             getLayoutOffset: function() {
 
-                 if (!this.parent) return new kity.Point();
 
-                 // 影响当前节点位置的是父节点的布局
 
-                 var data = this.getData("layout_" + this.parent.getLayout() + "_offset");
 
-                 if (data) return new kity.Point(data.x, data.y);
 
-                 return new kity.Point();
 
-             },
 
-             setLayoutOffset: function(p) {
 
-                 if (!this.parent) return this;
 
-                 this.setData("layout_" + this.parent.getLayout() + "_offset", p ? {
 
-                     x: p.x,
 
-                     y: p.y
 
-                 } : undefined);
 
-                 return this;
 
-             },
 
-             hasLayoutOffset: function() {
 
-                 return !!this.getData("layout_" + this.parent.getLayout() + "_offset");
 
-             },
 
-             resetLayoutOffset: function() {
 
-                 return this.setLayoutOffset(null);
 
-             },
 
-             getLayoutRoot: function() {
 
-                 if (this.isLayoutRoot()) {
 
-                     return this;
 
-                 }
 
-                 return this.parent.getLayoutRoot();
 
-             },
 
-             isLayoutRoot: function() {
 
-                 return this.getData("layout") || this.isRoot();
 
-             }
 
-         });
 
-         /**
 
-      * Minder 上的布局支持
 
-      */
 
-         kity.extendClass(Minder, {
 
-             layout: function() {
 
-                 var duration = this.getOption("layoutAnimationDuration");
 
-                 this.getRoot().traverse(function(node) {
 
-                     // clear last results
 
-                     node.setLayoutTransform(null);
 
-                 });
 
-                 function layoutNode(node, round) {
 
-                     // layout all children first
 
-                     // 剪枝:收起的节点无需计算
 
-                     if (node.isExpanded() || true) {
 
-                         node.children.forEach(function(child) {
 
-                             layoutNode(child, round);
 
-                         });
 
-                     }
 
-                     var layout = node.getLayoutInstance();
 
-                     // var childrenInFlow = node.getChildren().filter(function(child) {
 
-                     //     return !child.hasLayoutOffset();
 
-                     // });
 
-                     layout.doLayout(node, node.getChildren(), round);
 
-                 }
 
-                 // 第一轮布局
 
-                 layoutNode(this.getRoot(), 1);
 
-                 // 第二轮布局
 
-                 layoutNode(this.getRoot(), 2);
 
-                 var minder = this;
 
-                 this.applyLayoutResult(this.getRoot(), duration, function() {
 
-                     /**
 
-                  * 当节点>200, 不使用动画时, 此处逻辑变为同步逻辑, 外部minder.on事件无法
 
-                  * 被提前录入, 因此增加setTimeout
 
-                  * @author Naixor
 
-                  */
 
-                     setTimeout(function() {
 
-                         minder.fire("layoutallfinish");
 
-                     }, 0);
 
-                 });
 
-                 return this.fire("layout");
 
-             },
 
-             refresh: function() {
 
-                 this.getRoot().renderTree();
 
-                 this.layout().fire("contentchange")._interactChange();
 
-                 return this;
 
-             },
 
-             applyLayoutResult: function(root, duration, callback) {
 
-                 root = root || this.getRoot();
 
-                 var me = this;
 
-                 var complex = root.getComplex();
 
-                 function consume() {
 
-                     if (!--complex) {
 
-                         if (callback) {
 
-                             callback();
 
-                         }
 
-                     }
 
-                 }
 
-                 // 节点复杂度大于 100,关闭动画
 
-                 if (complex > 200) duration = 0;
 
-                 function applyMatrix(node, matrix) {
 
-                     node.setGlobalLayoutTransform(matrix);
 
-                     me.fire("layoutapply", {
 
-                         node: node,
 
-                         matrix: matrix
 
-                     });
 
-                 }
 
-                 function apply(node, pMatrix) {
 
-                     var matrix = node.getLayoutTransform().merge(pMatrix.clone());
 
-                     var lastMatrix = node.getGlobalLayoutTransform() || new kity.Matrix();
 
-                     var offset = node.getLayoutOffset();
 
-                     matrix.translate(offset.x, offset.y);
 
-                     matrix.m.e = Math.round(matrix.m.e);
 
-                     matrix.m.f = Math.round(matrix.m.f);
 
-                     // 如果当前有动画,停止动画
 
-                     if (node._layoutTimeline) {
 
-                         node._layoutTimeline.stop();
 
-                         node._layoutTimeline = null;
 
-                     }
 
-                     // 如果要求以动画形式来更新,创建动画
 
-                     if (duration) {
 
-                         node._layoutTimeline = new kity.Animator(lastMatrix, matrix, applyMatrix).start(node, duration, "ease").on("finish", function() {
 
-                             //可能性能低的时候会丢帧,手动添加一帧
 
-                             setTimeout(function() {
 
-                                 applyMatrix(node, matrix);
 
-                                 me.fire("layoutfinish", {
 
-                                     node: node,
 
-                                     matrix: matrix
 
-                                 });
 
-                                 consume();
 
-                             }, 150);
 
-                         });
 
-                     } else {
 
-                         applyMatrix(node, matrix);
 
-                         me.fire("layoutfinish", {
 
-                             node: node,
 
-                             matrix: matrix
 
-                         });
 
-                         consume();
 
-                     }
 
-                     for (var i = 0; i < node.children.length; i++) {
 
-                         apply(node.children[i], matrix);
 
-                     }
 
-                 }
 
-                 apply(root, root.parent ? root.parent.getGlobalLayoutTransform() : new kity.Matrix());
 
-                 return this;
 
-             }
 
-         });
 
-         module.exports = Layout;
 
-     }
 
- };
 
- //src/core/minder.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * KityMinder 类,暴露在 window 上的唯一变量
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[19] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var _initHooks = [];
 
-         var Minder = kity.createClass("Minder", {
 
-             constructor: function(options) {
 
-                 this._options = utils.extend({}, options);
 
-                 var initHooks = _initHooks.slice();
 
-                 var initHook;
 
-                 while (initHooks.length) {
 
-                     initHook = initHooks.shift();
 
-                     if (typeof initHook == "function") {
 
-                         initHook.call(this, this._options);
 
-                     }
 
-                 }
 
-                 this.fire("finishInitHook");
 
-             }
 
-         });
 
-         Minder.version = "1.4.43";
 
-         Minder.registerInitHook = function(hook) {
 
-             _initHooks.push(hook);
 
-         };
 
-         module.exports = Minder;
 
-     }
 
- };
 
- //src/core/module.js
 
- _p[20] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         /* 已注册的模块 */
 
-         var _modules = {};
 
-         exports.register = function(name, module) {
 
-             _modules[name] = module;
 
-         };
 
-         /* 模块初始化 */
 
-         Minder.registerInitHook(function() {
 
-             this._initModules();
 
-         });
 
-         // 模块声明周期维护
 
-         kity.extendClass(Minder, {
 
-             _initModules: function() {
 
-                 var modulesPool = _modules;
 
-                 var modulesToLoad = this._options.modules || utils.keys(modulesPool);
 
-                 this._commands = {};
 
-                 this._query = {};
 
-                 this._modules = {};
 
-                 this._rendererClasses = {};
 
-                 var i, name, type, module, moduleDeals, dealCommands, dealEvents, dealRenderers;
 
-                 var me = this;
 
-                 for (i = 0; i < modulesToLoad.length; i++) {
 
-                     name = modulesToLoad[i];
 
-                     if (!modulesPool[name]) continue;
 
-                     // 执行模块初始化,抛出后续处理对象
 
-                     if (typeof modulesPool[name] == "function") {
 
-                         moduleDeals = modulesPool[name].call(me);
 
-                     } else {
 
-                         moduleDeals = modulesPool[name];
 
-                     }
 
-                     this._modules[name] = moduleDeals;
 
-                     if (!moduleDeals) continue;
 
-                     if (moduleDeals.defaultOptions) {
 
-                         me.setDefaultOptions(moduleDeals.defaultOptions);
 
-                     }
 
-                     if (moduleDeals.init) {
 
-                         moduleDeals.init.call(me, this._options);
 
-                     }
 
-                     /**
 
-                  * @Desc: 判断是否支持原生clipboard事件,如果支持,则对pager添加其监听
 
-                  * @Editor: Naixor
 
-                  * @Date: 2015.9.20
 
-                  */
 
-                     /**
 
-                  * 由于当前脑图解构问题,clipboard暂时全权交由玩不托管
 
-                  * @Editor: Naixor
 
-                  * @Date: 2015.9.24
 
-                  */
 
-                     // if (name === 'ClipboardModule' && this.supportClipboardEvent  && !kity.Browser.gecko) {
 
-                     //     var on = function () {
 
-                     //         var clipBoardReceiver = this.clipBoardReceiver || document;
 
-                     //         if (document.addEventListener) {
 
-                     //             clipBoardReceiver.addEventListener.apply(this, arguments);
 
-                     //         } else {
 
-                     //             arguments[0] = 'on' + arguments[0];
 
-                     //             clipBoardReceiver.attachEvent.apply(this, arguments);
 
-                     //         }
 
-                     //     }
 
-                     //     for (var command in moduleDeals.clipBoardEvents) {
 
-                     //         on(command, moduleDeals.clipBoardEvents[command]);
 
-                     //     }
 
-                     // };
 
-                     // command加入命令池子
 
-                     dealCommands = moduleDeals.commands;
 
-                     for (name in dealCommands) {
 
-                         this._commands[name.toLowerCase()] = new dealCommands[name]();
 
-                     }
 
-                     // 绑定事件
 
-                     dealEvents = moduleDeals.events;
 
-                     if (dealEvents) {
 
-                         for (type in dealEvents) {
 
-                             me.on(type, dealEvents[type]);
 
-                         }
 
-                     }
 
-                     // 渲染器
 
-                     dealRenderers = moduleDeals.renderers;
 
-                     if (dealRenderers) {
 
-                         for (type in dealRenderers) {
 
-                             this._rendererClasses[type] = this._rendererClasses[type] || [];
 
-                             if (utils.isArray(dealRenderers[type])) {
 
-                                 this._rendererClasses[type] = this._rendererClasses[type].concat(dealRenderers[type]);
 
-                             } else {
 
-                                 this._rendererClasses[type].push(dealRenderers[type]);
 
-                             }
 
-                         }
 
-                     }
 
-                     //添加模块的快捷键
 
-                     if (moduleDeals.commandShortcutKeys) {
 
-                         this.addCommandShortcutKeys(moduleDeals.commandShortcutKeys);
 
-                     }
 
-                 }
 
-             },
 
-             _garbage: function() {
 
-                 this.clearSelect();
 
-                 while (this._root.getChildren().length) {
 
-                     this._root.removeChild(0);
 
-                 }
 
-             },
 
-             destroy: function() {
 
-                 var modules = this._modules;
 
-                 this._resetEvents();
 
-                 this._garbage();
 
-                 for (var key in modules) {
 
-                     if (!modules[key].destroy) continue;
 
-                     modules[key].destroy.call(this);
 
-                 }
 
-             },
 
-             reset: function() {
 
-                 var modules = this._modules;
 
-                 this._garbage();
 
-                 for (var key in modules) {
 
-                     if (!modules[key].reset) continue;
 
-                     modules[key].reset.call(this);
 
-                 }
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/core/node.js
 
- _p[21] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         /**
 
-      * @class MinderNode
 
-      *
 
-      * 表示一个脑图节点
 
-      */
 
-         var MinderNode = kity.createClass("MinderNode", {
 
-             /**
 
-          * 创建一个游离的脑图节点
 
-          *
 
-          * @param {String|Object} textOrData
 
-          *     节点的初始数据或文本
 
-          */
 
-             constructor: function(textOrData) {
 
-                 // 指针
 
-                 this.parent = null;
 
-                 this.root = this;
 
-                 this.children = [];
 
-                 // 数据
 
-                 this.data = {
 
-                     id: utils.guid(),
 
-                     created: +new Date()
 
-                 };
 
-                 // 绘图容器
 
-                 this.initContainers();
 
-                 if (utils.isString(textOrData)) {
 
-                     this.setText(textOrData);
 
-                 } else if (utils.isObject(textOrData)) {
 
-                     utils.extend(this.data, textOrData);
 
-                 }
 
-             },
 
-             initContainers: function() {
 
-                 this.rc = new kity.Group().setId(utils.uuid("minder_node"));
 
-                 this.rc.minderNode = this;
 
-             },
 
-             /**
 
-          * 判断节点是否根节点
 
-          */
 
-             isRoot: function() {
 
-                 return this.root === this;
 
-             },
 
-             /**
 
-          * 判断节点是否叶子
 
-          */
 
-             isLeaf: function() {
 
-                 return this.children.length === 0;
 
-             },
 
-             /**
 
-          * 获取节点的根节点
 
-          */
 
-             getRoot: function() {
 
-                 return this.root || this;
 
-             },
 
-             /**
 
-          * 获得节点的父节点
 
-          */
 
-             getParent: function() {
 
-                 return this.parent;
 
-             },
 
-             getSiblings: function() {
 
-                 var children = this.parent.children;
 
-                 var siblings = [];
 
-                 var self = this;
 
-                 children.forEach(function(child) {
 
-                     if (child != self) siblings.push(child);
 
-                 });
 
-                 return siblings;
 
-             },
 
-             /**
 
-          * 获得节点的深度
 
-          */
 
-             getLevel: function() {
 
-                 var level = 0, ancestor = this.parent;
 
-                 while (ancestor) {
 
-                     level++;
 
-                     ancestor = ancestor.parent;
 
-                 }
 
-                 return level;
 
-             },
 
-             /**
 
-          * 获得节点的复杂度(即子树中节点的数量)
 
-          */
 
-             getComplex: function() {
 
-                 var complex = 0;
 
-                 this.traverse(function() {
 
-                     complex++;
 
-                 });
 
-                 return complex;
 
-             },
 
-             /**
 
-          * 获得节点的类型(root|main|sub)
 
-          */
 
-             getType: function(type) {
 
-                 this.type = [ "root", "main", "sub" ][Math.min(this.getLevel(), 2)];
 
-                 return this.type;
 
-             },
 
-             /**
 
-          * 判断当前节点是否被测试节点的祖先
 
-          * @param  {MinderNode}  test 被测试的节点
 
-          */
 
-             isAncestorOf: function(test) {
 
-                 var ancestor = test.parent;
 
-                 while (ancestor) {
 
-                     if (ancestor == this) return true;
 
-                     ancestor = ancestor.parent;
 
-                 }
 
-                 return false;
 
-             },
 
-             getData: function(key) {
 
-                 return key ? this.data[key] : this.data;
 
-             },
 
-             setData: function(key, value) {
 
-                 if (typeof key == "object") {
 
-                     var data = key;
 
-                     for (key in data) if (data.hasOwnProperty(key)) {
 
-                         this.data[key] = data[key];
 
-                     }
 
-                 } else {
 
-                     this.data[key] = value;
 
-                 }
 
-                 return this;
 
-             },
 
-             /**
 
-          * 设置节点的文本数据
 
-          * @param {String} text 文本数据
 
-          */
 
-             setText: function(text) {
 
-                 return this.data.text = text;
 
-             },
 
-             /**
 
-          * 获取节点的文本数据
 
-          * @return {String}
 
-          */
 
-             getText: function() {
 
-                 return this.data.text || null;
 
-             },
 
-             /**
 
-          * 先序遍历当前节点树
 
-          * @param  {Function} fn 遍历函数
 
-          */
 
-             preTraverse: function(fn, excludeThis) {
 
-                 var children = this.getChildren();
 
-                 if (!excludeThis) fn(this);
 
-                 for (var i = 0; i < children.length; i++) {
 
-                     children[i].preTraverse(fn);
 
-                 }
 
-             },
 
-             /**
 
-          * 后序遍历当前节点树
 
-          * @param  {Function} fn 遍历函数
 
-          */
 
-             postTraverse: function(fn, excludeThis) {
 
-                 var children = this.getChildren();
 
-                 for (var i = 0; i < children.length; i++) {
 
-                     children[i].postTraverse(fn);
 
-                 }
 
-                 if (!excludeThis) fn(this);
 
-             },
 
-             traverse: function(fn, excludeThis) {
 
-                 return this.postTraverse(fn, excludeThis);
 
-             },
 
-             getChildren: function() {
 
-                 return this.children;
 
-             },
 
-             getIndex: function() {
 
-                 return this.parent ? this.parent.children.indexOf(this) : -1;
 
-             },
 
-             insertChild: function(node, index) {
 
-                 if (index === undefined) {
 
-                     index = this.children.length;
 
-                 }
 
-                 if (node.parent) {
 
-                     node.parent.removeChild(node);
 
-                 }
 
-                 node.parent = this;
 
-                 node.root = this.root;
 
-                 this.children.splice(index, 0, node);
 
-             },
 
-             appendChild: function(node) {
 
-                 return this.insertChild(node);
 
-             },
 
-             prependChild: function(node) {
 
-                 return this.insertChild(node, 0);
 
-             },
 
-             removeChild: function(elem) {
 
-                 var index = elem, removed;
 
-                 if (elem instanceof MinderNode) {
 
-                     index = this.children.indexOf(elem);
 
-                 }
 
-                 if (index >= 0) {
 
-                     removed = this.children.splice(index, 1)[0];
 
-                     removed.parent = null;
 
-                     removed.root = removed;
 
-                 }
 
-             },
 
-             clearChildren: function() {
 
-                 this.children = [];
 
-             },
 
-             getChild: function(index) {
 
-                 return this.children[index];
 
-             },
 
-             getRenderContainer: function() {
 
-                 return this.rc;
 
-             },
 
-             getCommonAncestor: function(node) {
 
-                 return MinderNode.getCommonAncestor(this, node);
 
-             },
 
-             contains: function(node) {
 
-                 return this == node || this.isAncestorOf(node);
 
-             },
 
-             clone: function() {
 
-                 var cloned = new MinderNode();
 
-                 cloned.data = utils.clone(this.data);
 
-                 this.children.forEach(function(child) {
 
-                     cloned.appendChild(child.clone());
 
-                 });
 
-                 return cloned;
 
-             },
 
-             compareTo: function(node) {
 
-                 if (!utils.comparePlainObject(this.data, node.data)) return false;
 
-                 if (!utils.comparePlainObject(this.temp, node.temp)) return false;
 
-                 if (this.children.length != node.children.length) return false;
 
-                 var i = 0;
 
-                 while (this.children[i]) {
 
-                     if (!this.children[i].compareTo(node.children[i])) return false;
 
-                     i++;
 
-                 }
 
-                 return true;
 
-             },
 
-             getMinder: function() {
 
-                 return this.getRoot().minder;
 
-             }
 
-         });
 
-         MinderNode.getCommonAncestor = function(nodeA, nodeB) {
 
-             if (nodeA instanceof Array) {
 
-                 return MinderNode.getCommonAncestor.apply(this, nodeA);
 
-             }
 
-             switch (arguments.length) {
 
-               case 1:
 
-                 return nodeA.parent || nodeA;
 
-               case 2:
 
-                 if (nodeA.isAncestorOf(nodeB)) {
 
-                     return nodeA;
 
-                 }
 
-                 if (nodeB.isAncestorOf(nodeA)) {
 
-                     return nodeB;
 
-                 }
 
-                 var ancestor = nodeA.parent;
 
-                 while (ancestor && !ancestor.isAncestorOf(nodeB)) {
 
-                     ancestor = ancestor.parent;
 
-                 }
 
-                 return ancestor;
 
-               default:
 
-                 return Array.prototype.reduce.call(arguments, function(prev, current) {
 
-                     return MinderNode.getCommonAncestor(prev, current);
 
-                 }, nodeA);
 
-             }
 
-         };
 
-         kity.extendClass(Minder, {
 
-             getRoot: function() {
 
-                 return this._root;
 
-             },
 
-             setRoot: function(root) {
 
-                 this._root = root;
 
-                 root.minder = this;
 
-             },
 
-             getAllNode: function() {
 
-                 var nodes = [];
 
-                 this.getRoot().traverse(function(node) {
 
-                     nodes.push(node);
 
-                 });
 
-                 return nodes;
 
-             },
 
-             getNodeById: function(id) {
 
-                 return this.getNodesById([ id ])[0];
 
-             },
 
-             getNodesById: function(ids) {
 
-                 var nodes = this.getAllNode();
 
-                 var result = [];
 
-                 nodes.forEach(function(node) {
 
-                     if (ids.indexOf(node.getData("id")) != -1) {
 
-                         result.push(node);
 
-                     }
 
-                 });
 
-                 return result;
 
-             },
 
-             createNode: function(textOrData, parent, index) {
 
-                 var node = new MinderNode(textOrData);
 
-                 this.fire("nodecreate", {
 
-                     node: node,
 
-                     parent: parent,
 
-                     index: index
 
-                 });
 
-                 this.appendNode(node, parent, index);
 
-                 return node;
 
-             },
 
-             appendNode: function(node, parent, index) {
 
-                 if (parent) parent.insertChild(node, index);
 
-                 this.attachNode(node);
 
-                 return this;
 
-             },
 
-             removeNode: function(node) {
 
-                 if (node.parent) {
 
-                     node.parent.removeChild(node);
 
-                     this.detachNode(node);
 
-                     this.fire("noderemove", {
 
-                         node: node
 
-                     });
 
-                 }
 
-             },
 
-             attachNode: function(node) {
 
-                 var rc = this.getRenderContainer();
 
-                 node.traverse(function(current) {
 
-                     current.attached = true;
 
-                     rc.addShape(current.getRenderContainer());
 
-                 });
 
-                 rc.addShape(node.getRenderContainer());
 
-                 this.fire("nodeattach", {
 
-                     node: node
 
-                 });
 
-             },
 
-             detachNode: function(node) {
 
-                 var rc = this.getRenderContainer();
 
-                 node.traverse(function(current) {
 
-                     current.attached = false;
 
-                     rc.removeShape(current.getRenderContainer());
 
-                 });
 
-                 this.fire("nodedetach", {
 
-                     node: node
 
-                 });
 
-             },
 
-             getMinderTitle: function() {
 
-                 return this.getRoot().getText();
 
-             }
 
-         });
 
-         module.exports = MinderNode;
 
-     }
 
- };
 
- //src/core/option.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 提供脑图选项支持
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[22] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         Minder.registerInitHook(function(options) {
 
-             this._defaultOptions = {};
 
-         });
 
-         kity.extendClass(Minder, {
 
-             setDefaultOptions: function(options) {
 
-                 utils.extend(this._defaultOptions, options);
 
-                 return this;
 
-             },
 
-             getOption: function(key) {
 
-                 if (key) {
 
-                     return key in this._options ? this._options[key] : this._defaultOptions[key];
 
-                 } else {
 
-                     return utils.extend({}, this._defaultOptions, this._options);
 
-                 }
 
-             },
 
-             setOption: function(key, value) {
 
-                 this._options[key] = value;
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/core/paper.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 初始化渲染容器
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[23] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         Minder.registerInitHook(function() {
 
-             this._initPaper();
 
-         });
 
-         kity.extendClass(Minder, {
 
-             _initPaper: function() {
 
-                 this._paper = new kity.Paper();
 
-                 this._paper._minder = this;
 
-                 this._paper.getNode().ondragstart = function(e) {
 
-                     e.preventDefault();
 
-                 };
 
-                 this._paper.shapeNode.setAttribute("transform", "translate(0.5, 0.5)");
 
-                 this._addRenderContainer();
 
-                 this.setRoot(this.createNode());
 
-                 if (this._options.renderTo) {
 
-                     this.renderTo(this._options.renderTo);
 
-                 }
 
-             },
 
-             _addRenderContainer: function() {
 
-                 this._rc = new kity.Group().setId(utils.uuid("minder"));
 
-                 this._paper.addShape(this._rc);
 
-             },
 
-             renderTo: function(target) {
 
-                 if (typeof target == "string") {
 
-                     target = document.querySelector(target);
 
-                 }
 
-                 if (target) {
 
-                     if (target.tagName.toLowerCase() == "script") {
 
-                         var newTarget = document.createElement("div");
 
-                         newTarget.id = target.id;
 
-                         newTarget.class = target.class;
 
-                         target.parentNode.insertBefore(newTarget, target);
 
-                         target.parentNode.removeChild(target);
 
-                         target = newTarget;
 
-                     }
 
-                     target.classList.add("km-view");
 
-                     this._paper.renderTo(this._renderTarget = target);
 
-                     this._bindEvents();
 
-                     this.fire("paperrender");
 
-                 }
 
-                 return this;
 
-             },
 
-             getRenderContainer: function() {
 
-                 return this._rc;
 
-             },
 
-             getPaper: function() {
 
-                 return this._paper;
 
-             },
 
-             getRenderTarget: function() {
 
-                 return this._renderTarget;
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/core/patch.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 打补丁
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[24] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var Minder = _p.r(19);
 
-         function insertNode(minder, info, parent, index) {
 
-             parent = minder.createNode(info.data, parent, index);
 
-             info.children.forEach(function(childInfo, index) {
 
-                 insertNode(minder, childInfo, parent, index);
 
-             });
 
-             return parent;
 
-         }
 
-         function applyPatch(minder, patch) {
 
-             // patch.op - 操作,包括 remove, add, replace
 
-             // patch.path - 路径,如 '/root/children/1/data'
 
-             // patch.value - 数据,如 { text: "思路" }
 
-             var path = patch.path.split("/");
 
-             path.shift();
 
-             var changed = path.shift();
 
-             var node;
 
-             if (changed == "root") {
 
-                 var dataIndex = path.indexOf("data");
 
-                 if (dataIndex > -1) {
 
-                     changed = "data";
 
-                     var dataPath = path.splice(dataIndex + 1);
 
-                     patch.dataPath = dataPath;
 
-                 } else {
 
-                     changed = "node";
 
-                 }
 
-                 node = minder.getRoot();
 
-                 var segment, index;
 
-                 while (segment = path.shift()) {
 
-                     if (segment == "children") continue;
 
-                     if (typeof index != "undefined") node = node.getChild(index);
 
-                     index = +segment;
 
-                 }
 
-                 patch.index = index;
 
-                 patch.node = node;
 
-             }
 
-             var express = patch.express = [ changed, patch.op ].join(".");
 
-             switch (express) {
 
-               case "theme.replace":
 
-                 minder.useTheme(patch.value);
 
-                 break;
 
-               case "template.replace":
 
-                 minder.useTemplate(patch.value);
 
-                 break;
 
-               case "node.add":
 
-                 insertNode(minder, patch.value, patch.node, patch.index).renderTree();
 
-                 minder.layout();
 
-                 break;
 
-               case "node.remove":
 
-                 minder.removeNode(patch.node.getChild(patch.index));
 
-                 minder.layout();
 
-                 break;
 
-               case "data.add":
 
-               case "data.replace":
 
-               case "data.remove":
 
-                 var data = patch.node.data;
 
-                 var field;
 
-                 path = patch.dataPath.slice();
 
-                 while (data && path.length > 1) {
 
-                     field = path.shift();
 
-                     if (field in data) {
 
-                         data = data[field];
 
-                     } else if (patch.op != "remove") {
 
-                         data = data[field] = {};
 
-                     }
 
-                 }
 
-                 if (data) {
 
-                     field = path.shift();
 
-                     data[field] = patch.value;
 
-                 }
 
-                 if (field == "expandState") {
 
-                     node.renderTree();
 
-                 } else {
 
-                     node.render();
 
-                 }
 
-                 minder.layout();
 
-             }
 
-             minder.fire("patch", {
 
-                 patch: patch
 
-             });
 
-         }
 
-         kity.extendClass(Minder, {
 
-             applyPatches: function(patches) {
 
-                 for (var i = 0; i < patches.length; i++) {
 
-                     applyPatch(this, patches[i]);
 
-                 }
 
-                 this.fire("contentchange");
 
-                 return this;
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/core/promise.js
 
- _p[25] = {
 
-     value: function(require, exports, module) {
 
-         /*!
 
-     **  Thenable -- Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable
 
-     **  Copyright (c) 2013-2014 Ralf S. Engelschall <http://engelschall.com>
 
-     **  Licensed under The MIT License <http://opensource.org/licenses/MIT>
 
-     **  Source-Code distributed on <http://github.com/rse/thenable>
 
-     */
 
-         /*  promise states [Promises/A+ 2.1]  */
 
-         var STATE_PENDING = 0;
 
-         /*  [Promises/A+ 2.1.1]  */
 
-         var STATE_FULFILLED = 1;
 
-         /*  [Promises/A+ 2.1.2]  */
 
-         var STATE_REJECTED = 2;
 
-         /*  [Promises/A+ 2.1.3]  */
 
-         /*  promise object constructor  */
 
-         var Promise = function(executor) {
 
-             /*  optionally support non-constructor/plain-function call  */
 
-             if (!(this instanceof Promise)) return new Promise(executor);
 
-             /*  initialize object  */
 
-             this.id = "Thenable/1.0.7";
 
-             this.state = STATE_PENDING;
 
-             /*  initial state  */
 
-             this.fulfillValue = undefined;
 
-             /*  initial value  */
 
-             /*  [Promises/A+ 1.3, 2.1.2.2]  */
 
-             this.rejectReason = undefined;
 
-             /*  initial reason */
 
-             /*  [Promises/A+ 1.5, 2.1.3.2]  */
 
-             this.onFulfilled = [];
 
-             /*  initial handlers  */
 
-             this.onRejected = [];
 
-             /*  initial handlers  */
 
-             /*  support optional executor function  */
 
-             if (typeof executor === "function") executor.call(this, this.fulfill.bind(this), this.reject.bind(this));
 
-         };
 
-         /*  Promise API methods  */
 
-         Promise.prototype = {
 
-             /*  promise resolving methods  */
 
-             fulfill: function(value) {
 
-                 return deliver(this, STATE_FULFILLED, "fulfillValue", value);
 
-             },
 
-             reject: function(value) {
 
-                 return deliver(this, STATE_REJECTED, "rejectReason", value);
 
-             },
 
-             /*  'The then Method' [Promises/A+ 1.1, 1.2, 2.2]  */
 
-             then: function(onFulfilled, onRejected) {
 
-                 var curr = this;
 
-                 var next = new Promise();
 
-                 /*  [Promises/A+ 2.2.7]  */
 
-                 curr.onFulfilled.push(resolver(onFulfilled, next, "fulfill"));
 
-                 /*  [Promises/A+ 2.2.2/2.2.6]  */
 
-                 curr.onRejected.push(resolver(onRejected, next, "reject"));
 
-                 /*  [Promises/A+ 2.2.3/2.2.6]  */
 
-                 execute(curr);
 
-                 return next;
 
-             }
 
-         };
 
-         Promise.all = function(arr) {
 
-             return new Promise(function(resolve, reject) {
 
-                 var len = arr.length, i = 0, res = 0, results = [];
 
-                 if (len === 0) {
 
-                     resolve(results);
 
-                 }
 
-                 while (i < len) {
 
-                     arr[i].then(function(result) {
 
-                         results.push(result);
 
-                         if (++res === len) {
 
-                             resolve(results);
 
-                         }
 
-                     }, function(val) {
 
-                         reject(val);
 
-                     });
 
-                     i++;
 
-                 }
 
-             });
 
-         };
 
-         /*  deliver an action  */
 
-         var deliver = function(curr, state, name, value) {
 
-             if (curr.state === STATE_PENDING) {
 
-                 curr.state = state;
 
-                 /*  [Promises/A+ 2.1.2.1, 2.1.3.1]  */
 
-                 curr[name] = value;
 
-                 /*  [Promises/A+ 2.1.2.2, 2.1.3.2]  */
 
-                 execute(curr);
 
-             }
 
-             return curr;
 
-         };
 
-         /*  execute all handlers  */
 
-         var execute = function(curr) {
 
-             if (curr.state === STATE_FULFILLED) execute_handlers(curr, "onFulfilled", curr.fulfillValue); else if (curr.state === STATE_REJECTED) execute_handlers(curr, "onRejected", curr.rejectReason);
 
-         };
 
-         /*  execute particular set of handlers  */
 
-         var execute_handlers = function(curr, name, value) {
 
-             /* global process: true */
 
-             /* global setImmediate: true */
 
-             /* global setTimeout: true */
 
-             /*  short-circuit processing  */
 
-             if (curr[name].length === 0) return;
 
-             /*  iterate over all handlers, exactly once  */
 
-             var handlers = curr[name];
 
-             curr[name] = [];
 
-             /*  [Promises/A+ 2.2.2.3, 2.2.3.3]  */
 
-             var func = function() {
 
-                 for (var i = 0; i < handlers.length; i++) handlers[i](value);
 
-             };
 
-             /*  execute procedure asynchronously  */
 
-             /*  [Promises/A+ 2.2.4, 3.1]  */
 
-             if (typeof process === "object" && typeof process.nextTick === "function") process.nextTick(func); else if (typeof setImmediate === "function") setImmediate(func); else setTimeout(func, 0);
 
-         };
 
-         /*  generate a resolver function */
 
-         var resolver = function(cb, next, method) {
 
-             return function(value) {
 
-                 if (typeof cb !== "function") /*  [Promises/A+ 2.2.1, 2.2.7.3, 2.2.7.4]  */
 
-                 next[method].call(next, value); else {
 
-                     var result;
 
-                     try {
 
-                         if (value instanceof Promise) {
 
-                             result = value.then(cb);
 
-                         } else result = cb(value);
 
-                     } /*  [Promises/A+ 2.2.2.1, 2.2.3.1, 2.2.5, 3.2]  */
 
-                     catch (e) {
 
-                         next.reject(e);
 
-                         /*  [Promises/A+ 2.2.7.2]  */
 
-                         return;
 
-                     }
 
-                     resolve(next, result);
 
-                 }
 
-             };
 
-         };
 
-         /*  'Promise Resolution Procedure'  */
 
-         /*  [Promises/A+ 2.3]  */
 
-         var resolve = function(promise, x) {
 
-             /*  sanity check arguments  */
 
-             /*  [Promises/A+ 2.3.1]  */
 
-             if (promise === x) {
 
-                 promise.reject(new TypeError("cannot resolve promise with itself"));
 
-                 return;
 
-             }
 
-             /*  surgically check for a 'then' method
 
-             (mainly to just call the 'getter' of 'then' only once)  */
 
-             var then;
 
-             if (typeof x === "object" && x !== null || typeof x === "function") {
 
-                 try {
 
-                     then = x.then;
 
-                 } /*  [Promises/A+ 2.3.3.1, 3.5]  */
 
-                 catch (e) {
 
-                     promise.reject(e);
 
-                     /*  [Promises/A+ 2.3.3.2]  */
 
-                     return;
 
-                 }
 
-             }
 
-             /*  handle own Thenables    [Promises/A+ 2.3.2]
 
-             and similar 'thenables' [Promises/A+ 2.3.3]  */
 
-             if (typeof then === "function") {
 
-                 var resolved = false;
 
-                 try {
 
-                     /*  call retrieved 'then' method */
 
-                     /*  [Promises/A+ 2.3.3.3]  */
 
-                     then.call(x, /*  resolvePromise  */
 
-                     /*  [Promises/A+ 2.3.3.3.1]  */
 
-                     function(y) {
 
-                         if (resolved) return;
 
-                         resolved = true;
 
-                         /*  [Promises/A+ 2.3.3.3.3]  */
 
-                         if (y === x) /*  [Promises/A+ 3.6]  */
 
-                         promise.reject(new TypeError("circular thenable chain")); else resolve(promise, y);
 
-                     }, /*  rejectPromise  */
 
-                     /*  [Promises/A+ 2.3.3.3.2]  */
 
-                     function(r) {
 
-                         if (resolved) return;
 
-                         resolved = true;
 
-                         /*  [Promises/A+ 2.3.3.3.3]  */
 
-                         promise.reject(r);
 
-                     });
 
-                 } catch (e) {
 
-                     if (!resolved) /*  [Promises/A+ 2.3.3.3.3]  */
 
-                     promise.reject(e);
 
-                 }
 
-                 return;
 
-             }
 
-             /*  handle other values  */
 
-             promise.fulfill(x);
 
-         };
 
-         Promise.resolve = function(value) {
 
-             return new Promise(function(resolve) {
 
-                 resolve(value);
 
-             });
 
-         };
 
-         Promise.reject = function(reason) {
 
-             return new Promise(function(resolve, reject) {
 
-                 reject(reason);
 
-             });
 
-         };
 
-         /*  export API  */
 
-         module.exports = Promise;
 
-     }
 
- };
 
- //src/core/readonly.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 只读模式支持
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[26] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var Minder = _p.r(19);
 
-         var MinderEvent = _p.r(13);
 
-         Minder.registerInitHook(function(options) {
 
-             if (options.readOnly) {
 
-                 this.setDisabled();
 
-             }
 
-         });
 
-         kity.extendClass(Minder, {
 
-             disable: function() {
 
-                 var me = this;
 
-                 //禁用命令
 
-                 me.bkqueryCommandState = me.queryCommandState;
 
-                 me.bkqueryCommandValue = me.queryCommandValue;
 
-                 me.queryCommandState = function(type) {
 
-                     var cmd = this._getCommand(type);
 
-                     if (cmd && cmd.enableReadOnly) {
 
-                         return me.bkqueryCommandState.apply(me, arguments);
 
-                     }
 
-                     return -1;
 
-                 };
 
-                 me.queryCommandValue = function(type) {
 
-                     var cmd = this._getCommand(type);
 
-                     if (cmd && cmd.enableReadOnly) {
 
-                         return me.bkqueryCommandValue.apply(me, arguments);
 
-                     }
 
-                     return null;
 
-                 };
 
-                 this.setStatus("readonly");
 
-                 me._interactChange();
 
-             },
 
-             enable: function() {
 
-                 var me = this;
 
-                 if (me.bkqueryCommandState) {
 
-                     me.queryCommandState = me.bkqueryCommandState;
 
-                     delete me.bkqueryCommandState;
 
-                 }
 
-                 if (me.bkqueryCommandValue) {
 
-                     me.queryCommandValue = me.bkqueryCommandValue;
 
-                     delete me.bkqueryCommandValue;
 
-                 }
 
-                 this.setStatus("normal");
 
-                 me._interactChange();
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/core/render.js
 
- _p[27] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var Renderer = kity.createClass("Renderer", {
 
-             constructor: function(node) {
 
-                 this.node = node;
 
-             },
 
-             create: function(node) {
 
-                 throw new Error("Not implement: Renderer.create()");
 
-             },
 
-             shouldRender: function(node) {
 
-                 return true;
 
-             },
 
-             watchChange: function(data) {
 
-                 var changed;
 
-                 if (this.watchingData === undefined) {
 
-                     changed = true;
 
-                 } else if (this.watchingData != data) {
 
-                     changed = true;
 
-                 } else {
 
-                     changed = false;
 
-                 }
 
-                 this.watchingData = data;
 
-             },
 
-             shouldDraw: function(node) {
 
-                 return true;
 
-             },
 
-             update: function(shape, node, box) {
 
-                 if (this.shouldDraw()) this.draw(shape, node);
 
-                 return this.place(shape, node, box);
 
-             },
 
-             draw: function(shape, node) {
 
-                 throw new Error("Not implement: Renderer.draw()");
 
-             },
 
-             place: function(shape, node, box) {
 
-                 throw new Error("Not implement: Renderer.place()");
 
-             },
 
-             getRenderShape: function() {
 
-                 return this._renderShape || null;
 
-             },
 
-             setRenderShape: function(shape) {
 
-                 this._renderShape = shape;
 
-             }
 
-         });
 
-         function createMinderExtension() {
 
-             function createRendererForNode(node, registered) {
 
-                 var renderers = [];
 
-                 [ "center", "left", "right", "top", "bottom", "outline", "outside" ].forEach(function(section) {
 
-                     var before = "before" + section;
 
-                     var after = "after" + section;
 
-                     if (registered[before]) {
 
-                         renderers = renderers.concat(registered[before]);
 
-                     }
 
-                     if (registered[section]) {
 
-                         renderers = renderers.concat(registered[section]);
 
-                     }
 
-                     if (registered[after]) {
 
-                         renderers = renderers.concat(registered[after]);
 
-                     }
 
-                 });
 
-                 node._renderers = renderers.map(function(Renderer) {
 
-                     return new Renderer(node);
 
-                 });
 
-             }
 
-             return {
 
-                 renderNodeBatch: function(nodes) {
 
-                     var rendererClasses = this._rendererClasses;
 
-                     var lastBoxes = [];
 
-                     var rendererCount = 0;
 
-                     var i, j, renderer, node;
 
-                     if (!nodes.length) return;
 
-                     for (j = 0; j < nodes.length; j++) {
 
-                         node = nodes[j];
 
-                         if (!node._renderers) {
 
-                             createRendererForNode(node, rendererClasses);
 
-                         }
 
-                         node._contentBox = new kity.Box();
 
-                         this.fire("beforerender", {
 
-                             node: node
 
-                         });
 
-                     }
 
-                     // 所有节点渲染器数量是一致的
 
-                     rendererCount = nodes[0]._renderers.length;
 
-                     for (i = 0; i < rendererCount; i++) {
 
-                         // 获取延迟盒子数据
 
-                         for (j = 0; j < nodes.length; j++) {
 
-                             if (typeof lastBoxes[j] == "function") {
 
-                                 lastBoxes[j] = lastBoxes[j]();
 
-                             }
 
-                             if (!(lastBoxes[j] instanceof kity.Box)) {
 
-                                 lastBoxes[j] = new kity.Box(lastBoxes[j]);
 
-                             }
 
-                         }
 
-                         for (j = 0; j < nodes.length; j++) {
 
-                             node = nodes[j];
 
-                             renderer = node._renderers[i];
 
-                             // 合并盒子
 
-                             if (lastBoxes[j]) {
 
-                                 node._contentBox = node._contentBox.merge(lastBoxes[j]);
 
-                                 renderer.contentBox = lastBoxes[j];
 
-                             }
 
-                             // 判断当前上下文是否应该渲染
 
-                             if (renderer.shouldRender(node)) {
 
-                                 // 应该渲染,但是渲染图形没创建过,需要创建
 
-                                 if (!renderer.getRenderShape()) {
 
-                                     renderer.setRenderShape(renderer.create(node));
 
-                                     if (renderer.bringToBack) {
 
-                                         node.getRenderContainer().prependShape(renderer.getRenderShape());
 
-                                     } else {
 
-                                         node.getRenderContainer().appendShape(renderer.getRenderShape());
 
-                                     }
 
-                                 }
 
-                                 // 强制让渲染图形显示
 
-                                 renderer.getRenderShape().setVisible(true);
 
-                                 // 更新渲染图形
 
-                                 lastBoxes[j] = renderer.update(renderer.getRenderShape(), node, node._contentBox);
 
-                             } else if (renderer.getRenderShape()) {
 
-                                 renderer.getRenderShape().setVisible(false);
 
-                                 lastBoxes[j] = null;
 
-                             }
 
-                         }
 
-                     }
 
-                     for (j = 0; j < nodes.length; j++) {
 
-                         this.fire("noderender", {
 
-                             node: nodes[j]
 
-                         });
 
-                     }
 
-                 },
 
-                 renderNode: function(node) {
 
-                     var rendererClasses = this._rendererClasses;
 
-                     var i, latestBox, renderer;
 
-                     if (!node._renderers) {
 
-                         createRendererForNode(node, rendererClasses);
 
-                     }
 
-                     this.fire("beforerender", {
 
-                         node: node
 
-                     });
 
-                     node._contentBox = new kity.Box();
 
-                     node._renderers.forEach(function(renderer) {
 
-                         // 判断当前上下文是否应该渲染
 
-                         if (renderer.shouldRender(node)) {
 
-                             // 应该渲染,但是渲染图形没创建过,需要创建
 
-                             if (!renderer.getRenderShape()) {
 
-                                 renderer.setRenderShape(renderer.create(node));
 
-                                 if (renderer.bringToBack) {
 
-                                     node.getRenderContainer().prependShape(renderer.getRenderShape());
 
-                                 } else {
 
-                                     node.getRenderContainer().appendShape(renderer.getRenderShape());
 
-                                 }
 
-                             }
 
-                             // 强制让渲染图形显示
 
-                             renderer.getRenderShape().setVisible(true);
 
-                             // 更新渲染图形
 
-                             latestBox = renderer.update(renderer.getRenderShape(), node, node._contentBox);
 
-                             if (typeof latestBox == "function") latestBox = latestBox();
 
-                             // 合并渲染区域
 
-                             if (latestBox) {
 
-                                 node._contentBox = node._contentBox.merge(latestBox);
 
-                                 renderer.contentBox = latestBox;
 
-                             }
 
-                         } else if (renderer.getRenderShape()) {
 
-                             renderer.getRenderShape().setVisible(false);
 
-                         }
 
-                     });
 
-                     this.fire("noderender", {
 
-                         node: node
 
-                     });
 
-                 }
 
-             };
 
-         }
 
-         kity.extendClass(Minder, createMinderExtension());
 
-         kity.extendClass(MinderNode, {
 
-             render: function() {
 
-                 if (!this.attached) return;
 
-                 this.getMinder().renderNode(this);
 
-                 return this;
 
-             },
 
-             renderTree: function() {
 
-                 if (!this.attached) return;
 
-                 var list = [];
 
-                 this.traverse(function(node) {
 
-                     list.push(node);
 
-                 });
 
-                 this.getMinder().renderNodeBatch(list);
 
-                 return this;
 
-             },
 
-             getRenderer: function(type) {
 
-                 var rs = this._renderers;
 
-                 if (!rs) return null;
 
-                 for (var i = 0; i < rs.length; i++) {
 
-                     if (rs[i].getType() == type) return rs[i];
 
-                 }
 
-                 return null;
 
-             },
 
-             getContentBox: function() {
 
-                 //if (!this._contentBox) this.render();
 
-                 return this.parent && this.parent.isCollapsed() ? new kity.Box() : this._contentBox || new kity.Box();
 
-             },
 
-             getRenderBox: function(rendererType, refer) {
 
-                 var renderer = rendererType && this.getRenderer(rendererType);
 
-                 var contentBox = renderer ? renderer.contentBox : this.getContentBox();
 
-                 var ctm = kity.Matrix.getCTM(this.getRenderContainer(), refer || "paper");
 
-                 return ctm.transformBox(contentBox);
 
-             }
 
-         });
 
-         module.exports = Renderer;
 
-     }
 
- };
 
- //src/core/select.js
 
- _p[28] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         Minder.registerInitHook(function() {
 
-             this._initSelection();
 
-         });
 
-         // 选区管理
 
-         kity.extendClass(Minder, {
 
-             _initSelection: function() {
 
-                 this._selectedNodes = [];
 
-             },
 
-             renderChangedSelection: function(last) {
 
-                 var current = this.getSelectedNodes();
 
-                 var changed = [];
 
-                 current.forEach(function(node) {
 
-                     if (last.indexOf(node) == -1) {
 
-                         changed.push(node);
 
-                     }
 
-                 });
 
-                 last.forEach(function(node) {
 
-                     if (current.indexOf(node) == -1) {
 
-                         changed.push(node);
 
-                     }
 
-                 });
 
-                 if (changed.length) {
 
-                     this._interactChange();
 
-                     this.fire("selectionchange");
 
-                 }
 
-                 while (changed.length) {
 
-                     changed.shift().render();
 
-                 }
 
-             },
 
-             getSelectedNodes: function() {
 
-                 //不能克隆返回,会对当前选区操作,从而影响querycommand
 
-                 return this._selectedNodes;
 
-             },
 
-             getSelectedNode: function() {
 
-                 return this.getSelectedNodes()[0] || null;
 
-             },
 
-             removeAllSelectedNodes: function() {
 
-                 var me = this;
 
-                 var last = this._selectedNodes.splice(0);
 
-                 this._selectedNodes = [];
 
-                 this.renderChangedSelection(last);
 
-                 return this.fire("selectionclear");
 
-             },
 
-             removeSelectedNodes: function(nodes) {
 
-                 var me = this;
 
-                 var last = this._selectedNodes.slice(0);
 
-                 nodes = utils.isArray(nodes) ? nodes : [ nodes ];
 
-                 nodes.forEach(function(node) {
 
-                     var index;
 
-                     if ((index = me._selectedNodes.indexOf(node)) === -1) return;
 
-                     me._selectedNodes.splice(index, 1);
 
-                 });
 
-                 this.renderChangedSelection(last);
 
-                 return this;
 
-             },
 
-             select: function(nodes, isSingleSelect) {
 
-                 var lastSelect = this.getSelectedNodes().slice(0);
 
-                 if (isSingleSelect) {
 
-                     this._selectedNodes = [];
 
-                 }
 
-                 var me = this;
 
-                 nodes = utils.isArray(nodes) ? nodes : [ nodes ];
 
-                 nodes.forEach(function(node) {
 
-                     if (me._selectedNodes.indexOf(node) !== -1) return;
 
-                     me._selectedNodes.unshift(node);
 
-                 });
 
-                 this.renderChangedSelection(lastSelect);
 
-                 return this;
 
-             },
 
-             selectById: function(ids, isSingleSelect) {
 
-                 ids = utils.isArray(ids) ? ids : [ ids ];
 
-                 var nodes = this.getNodesById(ids);
 
-                 return this.select(nodes, isSingleSelect);
 
-             },
 
-             //当前选区中的节点在给定的节点范围内的保留选中状态,
 
-             //没在给定范围的取消选中,给定范围中的但没在当前选中范围的也做选中效果
 
-             toggleSelect: function(node) {
 
-                 if (utils.isArray(node)) {
 
-                     node.forEach(this.toggleSelect.bind(this));
 
-                 } else {
 
-                     if (node.isSelected()) this.removeSelectedNodes(node); else this.select(node);
 
-                 }
 
-                 return this;
 
-             },
 
-             isSingleSelect: function() {
 
-                 return this._selectedNodes.length == 1;
 
-             },
 
-             getSelectedAncestors: function(includeRoot) {
 
-                 var nodes = this.getSelectedNodes().slice(0), ancestors = [], judge;
 
-                 // 根节点不参与计算
 
-                 var rootIndex = nodes.indexOf(this.getRoot());
 
-                 if (~rootIndex && !includeRoot) {
 
-                     nodes.splice(rootIndex, 1);
 
-                 }
 
-                 // 判断 nodes 列表中是否存在 judge 的祖先
 
-                 function hasAncestor(nodes, judge) {
 
-                     for (var i = nodes.length - 1; i >= 0; --i) {
 
-                         if (nodes[i].isAncestorOf(judge)) return true;
 
-                     }
 
-                     return false;
 
-                 }
 
-                 // 按照拓扑排序
 
-                 nodes.sort(function(node1, node2) {
 
-                     return node1.getLevel() - node2.getLevel();
 
-                 });
 
-                 // 因为是拓扑有序的,所以只需往上查找
 
-                 while (judge = nodes.pop()) {
 
-                     if (!hasAncestor(nodes, judge)) {
 
-                         ancestors.push(judge);
 
-                     }
 
-                 }
 
-                 return ancestors;
 
-             }
 
-         });
 
-         kity.extendClass(MinderNode, {
 
-             isSelected: function() {
 
-                 var minder = this.getMinder();
 
-                 return minder && minder.getSelectedNodes().indexOf(this) != -1;
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/core/shortcut.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 添加快捷键支持
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[29] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var keymap = _p.r(15);
 
-         var Minder = _p.r(19);
 
-         var MinderEvent = _p.r(13);
 
-         /**
 
-      * 计算包含 meta 键的 keycode
 
-      *
 
-      * @param  {String|KeyEvent} unknown
 
-      */
 
-         function getMetaKeyCode(unknown) {
 
-             var CTRL_MASK = 4096;
 
-             var ALT_MASK = 8192;
 
-             var SHIFT_MASK = 16384;
 
-             var metaKeyCode = 0;
 
-             if (typeof unknown == "string") {
 
-                 // unknown as string
 
-                 unknown.toLowerCase().split(/\+\s*/).forEach(function(name) {
 
-                     switch (name) {
 
-                       case "ctrl":
 
-                       case "cmd":
 
-                         metaKeyCode |= CTRL_MASK;
 
-                         break;
 
-                       case "alt":
 
-                         metaKeyCode |= ALT_MASK;
 
-                         break;
 
-                       case "shift":
 
-                         metaKeyCode |= SHIFT_MASK;
 
-                         break;
 
-                       default:
 
-                         metaKeyCode |= keymap[name];
 
-                     }
 
-                 });
 
-             } else {
 
-                 // unknown as key event
 
-                 if (unknown.ctrlKey || unknown.metaKey) {
 
-                     metaKeyCode |= CTRL_MASK;
 
-                 }
 
-                 if (unknown.altKey) {
 
-                     metaKeyCode |= ALT_MASK;
 
-                 }
 
-                 if (unknown.shiftKey) {
 
-                     metaKeyCode |= SHIFT_MASK;
 
-                 }
 
-                 metaKeyCode |= unknown.keyCode;
 
-             }
 
-             return metaKeyCode;
 
-         }
 
-         kity.extendClass(MinderEvent, {
 
-             isShortcutKey: function(keyCombine) {
 
-                 var keyEvent = this.originEvent;
 
-                 if (!keyEvent) return false;
 
-                 return getMetaKeyCode(keyCombine) == getMetaKeyCode(keyEvent);
 
-             }
 
-         });
 
-         Minder.registerInitHook(function() {
 
-             this._initShortcutKey();
 
-         });
 
-         kity.extendClass(Minder, {
 
-             _initShortcutKey: function() {
 
-                 this._bindShortcutKeys();
 
-             },
 
-             _bindShortcutKeys: function() {
 
-                 var map = this._shortcutKeys = {};
 
-                 var has = "hasOwnProperty";
 
-                 this.on("keydown", function(e) {
 
-                     for (var keys in map) {
 
-                         if (!map[has](keys)) continue;
 
-                         if (e.isShortcutKey(keys)) {
 
-                             var fn = map[keys];
 
-                             if (fn.__statusCondition && fn.__statusCondition != this.getStatus()) return;
 
-                             fn();
 
-                             e.preventDefault();
 
-                         }
 
-                     }
 
-                 });
 
-             },
 
-             addShortcut: function(keys, fn) {
 
-                 var binds = this._shortcutKeys;
 
-                 keys.split(/\|\s*/).forEach(function(combine) {
 
-                     var parts = combine.split("::");
 
-                     var status;
 
-                     if (parts.length > 1) {
 
-                         combine = parts[1];
 
-                         status = parts[0];
 
-                         fn.__statusCondition = status;
 
-                     }
 
-                     binds[combine] = fn;
 
-                 });
 
-             },
 
-             addCommandShortcutKeys: function(cmd, keys) {
 
-                 var binds = this._commandShortcutKeys || (this._commandShortcutKeys = {});
 
-                 var obj = {}, km = this;
 
-                 if (keys) {
 
-                     obj[cmd] = keys;
 
-                 } else {
 
-                     obj = cmd;
 
-                 }
 
-                 var minder = this;
 
-                 utils.each(obj, function(keys, command) {
 
-                     binds[command] = keys;
 
-                     minder.addShortcut(keys, function execCommandByShortcut() {
 
-                         /**
 
-                      * 之前判断有问题,由 === 0 改为 !== -1
 
-                      * @editor Naixor
 
-                      * @Date 2015-12-2
 
-                      */
 
-                         if (minder.queryCommandState(command) !== -1) {
 
-                             minder.execCommand(command);
 
-                         }
 
-                     });
 
-                 });
 
-             },
 
-             getCommandShortcutKey: function(cmd) {
 
-                 var binds = this._commandShortcutKeys;
 
-                 return binds && binds[cmd] || null;
 
-             },
 
-             /**
 
-          * @Desc: 添加一个判断是否支持原生Clipboard的变量,用于对ctrl + v和ctrl + c的处理
 
-          * @Editor: Naixor
 
-          * @Date: 2015.9.20
 
-          */
 
-             supportClipboardEvent: function(window) {
 
-                 return !!window.ClipboardEvent;
 
-             }(window)
 
-         });
 
-     }
 
- };
 
- //src/core/status.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 状态切换控制
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[30] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var Minder = _p.r(19);
 
-         var sf = ~window.location.href.indexOf("status");
 
-         var tf = ~window.location.href.indexOf("trace");
 
-         Minder.registerInitHook(function() {
 
-             this._initStatus();
 
-         });
 
-         kity.extendClass(Minder, {
 
-             _initStatus: function() {
 
-                 this._status = "normal";
 
-                 this._rollbackStatus = "normal";
 
-             },
 
-             setStatus: function(status, force) {
 
-                 // 在 readonly 模式下,只有 force 为 true 才能切换回来
 
-                 if (this._status == "readonly" && !force) return this;
 
-                 if (status != this._status) {
 
-                     this._rollbackStatus = this._status;
 
-                     this._status = status;
 
-                     this.fire("statuschange", {
 
-                         lastStatus: this._rollbackStatus,
 
-                         currentStatus: this._status
 
-                     });
 
-                     if (sf) {
 
-                         /* global console: true */
 
-                         console.log(window.event.type, this._rollbackStatus, "->", this._status);
 
-                         if (tf) {
 
-                             console.trace();
 
-                         }
 
-                     }
 
-                 }
 
-                 return this;
 
-             },
 
-             rollbackStatus: function() {
 
-                 this.setStatus(this._rollbackStatus);
 
-             },
 
-             getRollbackStatus: function() {
 
-                 return this._rollbackStatus;
 
-             },
 
-             getStatus: function() {
 
-                 return this._status;
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/core/template.js
 
- _p[31] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var Command = _p.r(9);
 
-         var MinderNode = _p.r(21);
 
-         var Module = _p.r(20);
 
-         var _templates = {};
 
-         function register(name, supports) {
 
-             _templates[name] = supports;
 
-         }
 
-         exports.register = register;
 
-         utils.extend(Minder, {
 
-             getTemplateList: function() {
 
-                 return _templates;
 
-             }
 
-         });
 
-         kity.extendClass(Minder, function() {
 
-             var originGetTheme = Minder.prototype.getTheme;
 
-             return {
 
-                 useTemplate: function(name, duration) {
 
-                     this.setTemplate(name);
 
-                     this.refresh(duration || 800);
 
-                 },
 
-                 getTemplate: function() {
 
-                     return this._template || "default";
 
-                 },
 
-                 setTemplate: function(name) {
 
-                     this._template = name || null;
 
-                 },
 
-                 getTemplateSupport: function(method) {
 
-                     var supports = _templates[this.getTemplate()];
 
-                     return supports && supports[method];
 
-                 },
 
-                 getTheme: function(node) {
 
-                     var support = this.getTemplateSupport("getTheme") || originGetTheme;
 
-                     return support.call(this, node);
 
-                 }
 
-             };
 
-         }());
 
-         kity.extendClass(MinderNode, function() {
 
-             var originGetLayout = MinderNode.prototype.getLayout;
 
-             var originGetConnect = MinderNode.prototype.getConnect;
 
-             return {
 
-                 getLayout: function() {
 
-                     var support = this.getMinder().getTemplateSupport("getLayout") || originGetLayout;
 
-                     return support.call(this, this);
 
-                 },
 
-                 getConnect: function() {
 
-                     var support = this.getMinder().getTemplateSupport("getConnect") || originGetConnect;
 
-                     return support.call(this, this);
 
-                 }
 
-             };
 
-         }());
 
-         Module.register("TemplateModule", {
 
-             /**
 
-          * @command Template
 
-          * @description 设置当前脑图的模板
 
-          * @param {string} name 模板名称
 
-          *    允许使用的模板可以使用 `kityminder.Minder.getTemplateList()` 查询
 
-          * @state
 
-          *   0: 始终可用
 
-          * @return 返回当前的模板名称
 
-          */
 
-             commands: {
 
-                 template: kity.createClass("TemplateCommand", {
 
-                     base: Command,
 
-                     execute: function(minder, name) {
 
-                         minder.useTemplate(name);
 
-                         minder.execCommand("camera");
 
-                     },
 
-                     queryValue: function(minder) {
 
-                         return minder.getTemplate() || "default";
 
-                     }
 
-                 })
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/core/theme.js
 
- _p[32] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var Module = _p.r(20);
 
-         var Command = _p.r(9);
 
-         var cssLikeValueMatcher = {
 
-             left: function(value) {
 
-                 return 3 in value && value[3] || 1 in value && value[1] || value[0];
 
-             },
 
-             right: function(value) {
 
-                 return 1 in value && value[1] || value[0];
 
-             },
 
-             top: function(value) {
 
-                 return value[0];
 
-             },
 
-             bottom: function(value) {
 
-                 return 2 in value && value[2] || value[0];
 
-             }
 
-         };
 
-         var _themes = {};
 
-         /**
 
-      * 注册一个主题
 
-      *
 
-      * @param  {String} name  主题的名称
 
-      * @param  {Plain} theme 主题的样式描述
 
-      *
 
-      * @example
 
-      *     Minder.registerTheme('default', {
 
-      *         'root-color': 'red',
 
-      *         'root-stroke': 'none',
 
-      *         'root-padding': [10, 20]
 
-      *     });
 
-      */
 
-         function register(name, theme) {
 
-             _themes[name] = theme;
 
-         }
 
-         exports.register = register;
 
-         utils.extend(Minder, {
 
-             getThemeList: function() {
 
-                 return _themes;
 
-             }
 
-         });
 
-         kity.extendClass(Minder, {
 
-             /**
 
-          * 切换脑图实例上的主题
 
-          * @param  {String} name 要使用的主题的名称
 
-          */
 
-             useTheme: function(name) {
 
-                 this.setTheme(name);
 
-                 this.refresh(800);
 
-                 return true;
 
-             },
 
-             setTheme: function(name) {
 
-                 if (name && !_themes[name]) throw new Error("Theme " + name + " not exists!");
 
-                 var lastTheme = this._theme;
 
-                 this._theme = name || null;
 
-                 var container = this.getRenderTarget();
 
-                 if (container) {
 
-                     container.classList.remove("km-theme-" + lastTheme);
 
-                     if (name) {
 
-                         container.classList.add("km-theme-" + name);
 
-                     }
 
-                     container.style.background = this.getStyle("background");
 
-                 }
 
-                 this.fire("themechange", {
 
-                     theme: name
 
-                 });
 
-                 return this;
 
-             },
 
-             /**
 
-          * 获取脑图实例上的当前主题
 
-          * @return {[type]} [description]
 
-          */
 
-             getTheme: function(node) {
 
-                 return this._theme || this.getOption("defaultTheme") || "fresh-blue";
 
-             },
 
-             getThemeItems: function(node) {
 
-                 var theme = this.getTheme(node);
 
-                 return _themes[this.getTheme(node)];
 
-             },
 
-             /**
 
-          * 获得脑图实例上的样式
 
-          * @param  {String} item 样式名称
 
-          */
 
-             getStyle: function(item, node) {
 
-                 var items = this.getThemeItems(node);
 
-                 var segment, dir, selector, value, matcher;
 
-                 if (item in items) return items[item];
 
-                 // 尝试匹配 CSS 数组形式的值
 
-                 // 比如 item 为 'pading-left'
 
-                 // theme 里有 {'padding': [10, 20]} 的定义,则可以返回 20
 
-                 segment = item.split("-");
 
-                 if (segment.length < 2) return null;
 
-                 dir = segment.pop();
 
-                 item = segment.join("-");
 
-                 if (item in items) {
 
-                     value = items[item];
 
-                     if (utils.isArray(value) && (matcher = cssLikeValueMatcher[dir])) {
 
-                         return matcher(value);
 
-                     }
 
-                     if (!isNaN(value)) return value;
 
-                 }
 
-                 return null;
 
-             },
 
-             /**
 
-          * 获取指定节点的样式
 
-          * @param  {String} name 样式名称,可以不加节点类型的前缀
 
-          */
 
-             getNodeStyle: function(node, name) {
 
-                 var value = this.getStyle(node.getType() + "-" + name, node);
 
-                 return value !== null ? value : this.getStyle(name, node);
 
-             }
 
-         });
 
-         kity.extendClass(MinderNode, {
 
-             getStyle: function(name) {
 
-                 return this.getMinder().getNodeStyle(this, name);
 
-             }
 
-         });
 
-         Module.register("Theme", {
 
-             defaultOptions: {
 
-                 defaultTheme: "fresh-blue"
 
-             },
 
-             commands: {
 
-                 /**
 
-              * @command Theme
 
-              * @description 设置当前脑图的主题
 
-              * @param {string} name 主题名称
 
-              *    允许使用的主题可以使用 `kityminder.Minder.getThemeList()` 查询
 
-              * @state
 
-              *   0: 始终可用
 
-              * @return 返回当前的主题名称
 
-              */
 
-                 theme: kity.createClass("ThemeCommand", {
 
-                     base: Command,
 
-                     execute: function(km, name) {
 
-                         return km.useTheme(name);
 
-                     },
 
-                     queryValue: function(km) {
 
-                         return km.getTheme() || "default";
 
-                     }
 
-                 })
 
-             }
 
-         });
 
-         Minder.registerInitHook(function() {
 
-             this.setTheme();
 
-         });
 
-     }
 
- };
 
- //src/core/utils.js
 
- _p[33] = {
 
-     value: function(require, exports) {
 
-         var kity = _p.r(17);
 
-         var uuidMap = {};
 
-         exports.extend = kity.Utils.extend.bind(kity.Utils);
 
-         exports.each = kity.Utils.each.bind(kity.Utils);
 
-         exports.uuid = function(group) {
 
-             uuidMap[group] = uuidMap[group] ? uuidMap[group] + 1 : 1;
 
-             return group + uuidMap[group];
 
-         };
 
-         exports.guid = function() {
 
-             return (+new Date() * 1e6 + Math.floor(Math.random() * 1e6)).toString(36);
 
-         };
 
-         exports.trim = function(str) {
 
-             return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, "");
 
-         };
 
-         exports.keys = function(plain) {
 
-             var keys = [];
 
-             for (var key in plain) {
 
-                 if (plain.hasOwnProperty(key)) {
 
-                     keys.push(key);
 
-                 }
 
-             }
 
-             return keys;
 
-         };
 
-         exports.clone = function(source) {
 
-             return JSON.parse(JSON.stringify(source));
 
-         };
 
-         exports.comparePlainObject = function(a, b) {
 
-             return JSON.stringify(a) == JSON.stringify(b);
 
-         };
 
-         exports.encodeHtml = function(str, reg) {
 
-             return str ? str.replace(reg || /[&<">'](?:(amp|lt|quot|gt|#39|nbsp);)?/g, function(a, b) {
 
-                 if (b) {
 
-                     return a;
 
-                 } else {
 
-                     return {
 
-                         "<": "<",
 
-                         "&": "&",
 
-                         '"': """,
 
-                         ">": ">",
 
-                         "'": "'"
 
-                     }[a];
 
-                 }
 
-             }) : "";
 
-         };
 
-         exports.clearWhiteSpace = function(str) {
 
-             return str.replace(/[\u200b\t\r\n]/g, "");
 
-         };
 
-         exports.each([ "String", "Function", "Array", "Number", "RegExp", "Object" ], function(v) {
 
-             var toString = Object.prototype.toString;
 
-             exports["is" + v] = function(obj) {
 
-                 return toString.apply(obj) == "[object " + v + "]";
 
-             };
 
-         });
 
-     }
 
- };
 
- //src/expose-kityminder.js
 
- _p[34] = {
 
-     value: function(require, exports, module) {
 
-         module.exports = window.kityminder = _p.r(35);
 
-     }
 
- };
 
- //src/kityminder.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 默认导出(全部模块)
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[35] = {
 
-     value: function(require, exports, module) {
 
-         var kityminder = {
 
-             version: _p.r(19).version
 
-         };
 
-         // 核心导出,大写的部分导出类,小写的部分简单 require 一下
 
-         // 这里顺序是有讲究的,调整前先弄清楚依赖关系。
 
-         _p.r(33);
 
-         kityminder.Minder = _p.r(19);
 
-         kityminder.Command = _p.r(9);
 
-         kityminder.Node = _p.r(21);
 
-         _p.r(22);
 
-         _p.r(8);
 
-         kityminder.Event = _p.r(13);
 
-         kityminder.data = _p.r(12);
 
-         _p.r(10);
 
-         kityminder.KeyMap = _p.r(15);
 
-         _p.r(29);
 
-         _p.r(30);
 
-         _p.r(23);
 
-         _p.r(28);
 
-         _p.r(14);
 
-         _p.r(16);
 
-         kityminder.Module = _p.r(20);
 
-         _p.r(26);
 
-         kityminder.Render = _p.r(27);
 
-         kityminder.Connect = _p.r(11);
 
-         kityminder.Layout = _p.r(18);
 
-         kityminder.Theme = _p.r(32);
 
-         kityminder.Template = _p.r(31);
 
-         kityminder.Promise = _p.r(25);
 
-         _p.r(7);
 
-         _p.r(24);
 
-         // 模块依赖
 
-         _p.r(42);
 
-         _p.r(43);
 
-         _p.r(44);
 
-         _p.r(45);
 
-         _p.r(46);
 
-         _p.r(47);
 
-         _p.r(48);
 
-         _p.r(50);
 
-         _p.r(49);
 
-         _p.r(51);
 
-         _p.r(52);
 
-         _p.r(53);
 
-         _p.r(54);
 
-         _p.r(55);
 
-         _p.r(56);
 
-         _p.r(57);
 
-         _p.r(58);
 
-         _p.r(59);
 
-         _p.r(60);
 
-         _p.r(61);
 
-         _p.r(62);
 
-         _p.r(63);
 
-         _p.r(64);
 
-         _p.r(68);
 
-         _p.r(65);
 
-         _p.r(67);
 
-         _p.r(66);
 
-         _p.r(40);
 
-         _p.r(36);
 
-         _p.r(37);
 
-         _p.r(38);
 
-         _p.r(39);
 
-         _p.r(41);
 
-         _p.r(75);
 
-         _p.r(78);
 
-         _p.r(77);
 
-         _p.r(76);
 
-         _p.r(78);
 
-         _p.r(80);
 
-         _p.r(79);
 
-         _p.r(0);
 
-         _p.r(1);
 
-         _p.r(2);
 
-         _p.r(3);
 
-         _p.r(4);
 
-         _p.r(5);
 
-         _p.r(6);
 
-         _p.r(69);
 
-         _p.r(73);
 
-         _p.r(70);
 
-         _p.r(72);
 
-         _p.r(71);
 
-         _p.r(74);
 
-         module.exports = kityminder;
 
-     }
 
- };
 
- //src/layout/btree.js
 
- _p[36] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var Layout = _p.r(18);
 
-         [ "left", "right", "top", "bottom" ].forEach(registerLayoutForDirection);
 
-         function registerLayoutForDirection(name) {
 
-             var axis = name == "left" || name == "right" ? "x" : "y";
 
-             var dir = name == "left" || name == "top" ? -1 : 1;
 
-             var oppsite = {
 
-                 left: "right",
 
-                 right: "left",
 
-                 top: "bottom",
 
-                 bottom: "top",
 
-                 x: "y",
 
-                 y: "x"
 
-             };
 
-             function getOrderHint(node) {
 
-                 var hint = [];
 
-                 var box = node.getLayoutBox();
 
-                 var offset = 5;
 
-                 if (axis == "x") {
 
-                     hint.push({
 
-                         type: "up",
 
-                         node: node,
 
-                         area: new kity.Box({
 
-                             x: box.x,
 
-                             y: box.top - node.getStyle("margin-top") - offset,
 
-                             width: box.width,
 
-                             height: node.getStyle("margin-top")
 
-                         }),
 
-                         path: [ "M", box.x, box.top - offset, "L", box.right, box.top - offset ]
 
-                     });
 
-                     hint.push({
 
-                         type: "down",
 
-                         node: node,
 
-                         area: new kity.Box({
 
-                             x: box.x,
 
-                             y: box.bottom + offset,
 
-                             width: box.width,
 
-                             height: node.getStyle("margin-bottom")
 
-                         }),
 
-                         path: [ "M", box.x, box.bottom + offset, "L", box.right, box.bottom + offset ]
 
-                     });
 
-                 } else {
 
-                     hint.push({
 
-                         type: "up",
 
-                         node: node,
 
-                         area: new kity.Box({
 
-                             x: box.left - node.getStyle("margin-left") - offset,
 
-                             y: box.top,
 
-                             width: node.getStyle("margin-left"),
 
-                             height: box.height
 
-                         }),
 
-                         path: [ "M", box.left - offset, box.top, "L", box.left - offset, box.bottom ]
 
-                     });
 
-                     hint.push({
 
-                         type: "down",
 
-                         node: node,
 
-                         area: new kity.Box({
 
-                             x: box.right + offset,
 
-                             y: box.top,
 
-                             width: node.getStyle("margin-right"),
 
-                             height: box.height
 
-                         }),
 
-                         path: [ "M", box.right + offset, box.top, "L", box.right + offset, box.bottom ]
 
-                     });
 
-                 }
 
-                 return hint;
 
-             }
 
-             Layout.register(name, kity.createClass({
 
-                 base: Layout,
 
-                 doLayout: function(parent, children) {
 
-                     var pbox = parent.getContentBox();
 
-                     if (axis == "x") {
 
-                         parent.setVertexOut(new kity.Point(pbox[name], pbox.cy));
 
-                         parent.setLayoutVectorOut(new kity.Vector(dir, 0));
 
-                     } else {
 
-                         parent.setVertexOut(new kity.Point(pbox.cx, pbox[name]));
 
-                         parent.setLayoutVectorOut(new kity.Vector(0, dir));
 
-                     }
 
-                     if (!children.length) {
 
-                         return false;
 
-                     }
 
-                     children.forEach(function(child) {
 
-                         var cbox = child.getContentBox();
 
-                         child.setLayoutTransform(new kity.Matrix());
 
-                         if (axis == "x") {
 
-                             child.setVertexIn(new kity.Point(cbox[oppsite[name]], cbox.cy));
 
-                             child.setLayoutVectorIn(new kity.Vector(dir, 0));
 
-                         } else {
 
-                             child.setVertexIn(new kity.Point(cbox.cx, cbox[oppsite[name]]));
 
-                             child.setLayoutVectorIn(new kity.Vector(0, dir));
 
-                         }
 
-                     });
 
-                     this.align(children, oppsite[name]);
 
-                     this.stack(children, oppsite[axis]);
 
-                     var bbox = this.getBranchBox(children);
 
-                     var xAdjust = 0, yAdjust = 0;
 
-                     if (axis == "x") {
 
-                         xAdjust = pbox[name];
 
-                         xAdjust += dir * parent.getStyle("margin-" + name);
 
-                         xAdjust += dir * children[0].getStyle("margin-" + oppsite[name]);
 
-                         yAdjust = pbox.bottom;
 
-                         yAdjust -= pbox.height / 2;
 
-                         yAdjust -= bbox.height / 2;
 
-                         yAdjust -= bbox.y;
 
-                     } else {
 
-                         xAdjust = pbox.right;
 
-                         xAdjust -= pbox.width / 2;
 
-                         xAdjust -= bbox.width / 2;
 
-                         xAdjust -= bbox.x;
 
-                         yAdjust = pbox[name];
 
-                         yAdjust += dir * parent.getStyle("margin-" + name);
 
-                         yAdjust += dir * children[0].getStyle("margin-" + oppsite[name]);
 
-                     }
 
-                     this.move(children, xAdjust, yAdjust);
 
-                 },
 
-                 getOrderHint: getOrderHint
 
-             }));
 
-         }
 
-     }
 
- };
 
- //src/layout/filetree.js
 
- _p[37] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var Layout = _p.r(18);
 
-         [ -1, 1 ].forEach(registerLayoutForDir);
 
-         function registerLayoutForDir(dir) {
 
-             var name = "filetree-" + (dir > 0 ? "down" : "up");
 
-             Layout.register(name, kity.createClass({
 
-                 base: Layout,
 
-                 doLayout: function(parent, children, round) {
 
-                     var pBox = parent.getContentBox();
 
-                     var indent = 20;
 
-                     parent.setVertexOut(new kity.Point(pBox.left + indent, dir > 0 ? pBox.bottom : pBox.top));
 
-                     parent.setLayoutVectorOut(new kity.Vector(0, dir));
 
-                     if (!children.length) return;
 
-                     children.forEach(function(child) {
 
-                         var cbox = child.getContentBox();
 
-                         child.setLayoutTransform(new kity.Matrix());
 
-                         child.setVertexIn(new kity.Point(cbox.left, cbox.cy));
 
-                         child.setLayoutVectorIn(new kity.Vector(1, 0));
 
-                     });
 
-                     this.align(children, "left");
 
-                     this.stack(children, "y");
 
-                     var xAdjust = 0;
 
-                     xAdjust += pBox.left;
 
-                     xAdjust += indent;
 
-                     xAdjust += children[0].getStyle("margin-left");
 
-                     var yAdjust = 0;
 
-                     if (dir > 0) {
 
-                         yAdjust += pBox.bottom;
 
-                         yAdjust += parent.getStyle("margin-bottom");
 
-                         yAdjust += children[0].getStyle("margin-top");
 
-                     } else {
 
-                         yAdjust -= this.getTreeBox(children).bottom;
 
-                         yAdjust += pBox.top;
 
-                         yAdjust -= parent.getStyle("margin-top");
 
-                         yAdjust -= children[0].getStyle("margin-bottom");
 
-                     }
 
-                     this.move(children, xAdjust, yAdjust);
 
-                 },
 
-                 getOrderHint: function(node) {
 
-                     var hint = [];
 
-                     var box = node.getLayoutBox();
 
-                     var offset = node.getLevel() > 1 ? 3 : 5;
 
-                     hint.push({
 
-                         type: "up",
 
-                         node: node,
 
-                         area: new kity.Box({
 
-                             x: box.x,
 
-                             y: box.top - node.getStyle("margin-top") - offset,
 
-                             width: box.width,
 
-                             height: node.getStyle("margin-top")
 
-                         }),
 
-                         path: [ "M", box.x, box.top - offset, "L", box.right, box.top - offset ]
 
-                     });
 
-                     hint.push({
 
-                         type: "down",
 
-                         node: node,
 
-                         area: new kity.Box({
 
-                             x: box.x,
 
-                             y: box.bottom + offset,
 
-                             width: box.width,
 
-                             height: node.getStyle("margin-bottom")
 
-                         }),
 
-                         path: [ "M", box.x, box.bottom + offset, "L", box.right, box.bottom + offset ]
 
-                     });
 
-                     return hint;
 
-                 }
 
-             }));
 
-         }
 
-     }
 
- };
 
- //src/layout/fish-bone-master.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 鱼骨图主骨架布局
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[38] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var Layout = _p.r(18);
 
-         Layout.register("fish-bone-master", kity.createClass("FishBoneMasterLayout", {
 
-             base: Layout,
 
-             doLayout: function(parent, children, round) {
 
-                 var upPart = [], downPart = [];
 
-                 var child = children[0];
 
-                 var pBox = parent.getContentBox();
 
-                 parent.setVertexOut(new kity.Point(pBox.right, pBox.cy));
 
-                 parent.setLayoutVectorOut(new kity.Vector(1, 0));
 
-                 if (!child) return;
 
-                 var cBox = child.getContentBox();
 
-                 var pMarginRight = parent.getStyle("margin-right");
 
-                 var cMarginLeft = child.getStyle("margin-left");
 
-                 var cMarginTop = child.getStyle("margin-top");
 
-                 var cMarginBottom = child.getStyle("margin-bottom");
 
-                 children.forEach(function(child, index) {
 
-                     child.setLayoutTransform(new kity.Matrix());
 
-                     var cBox = child.getContentBox();
 
-                     if (index % 2) {
 
-                         downPart.push(child);
 
-                         child.setVertexIn(new kity.Point(cBox.left, cBox.top));
 
-                         child.setLayoutVectorIn(new kity.Vector(1, 1));
 
-                     } else {
 
-                         upPart.push(child);
 
-                         child.setVertexIn(new kity.Point(cBox.left, cBox.bottom));
 
-                         child.setLayoutVectorIn(new kity.Vector(1, -1));
 
-                     }
 
-                 });
 
-                 this.stack(upPart, "x");
 
-                 this.stack(downPart, "x");
 
-                 this.align(upPart, "bottom");
 
-                 this.align(downPart, "top");
 
-                 var xAdjust = pBox.right + pMarginRight + cMarginLeft;
 
-                 var yAdjustUp = pBox.cy - cMarginBottom - parent.getStyle("margin-top");
 
-                 var yAdjustDown = pBox.cy + cMarginTop + parent.getStyle("margin-bottom");
 
-                 this.move(upPart, xAdjust, yAdjustUp);
 
-                 this.move(downPart, xAdjust + cMarginLeft, yAdjustDown);
 
-             }
 
-         }));
 
-     }
 
- };
 
- //src/layout/fish-bone-slave.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  *
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[39] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var Layout = _p.r(18);
 
-         Layout.register("fish-bone-slave", kity.createClass("FishBoneSlaveLayout", {
 
-             base: Layout,
 
-             doLayout: function(parent, children, round) {
 
-                 var layout = this;
 
-                 var abs = Math.abs;
 
-                 var GOLD_CUT = 1 - .618;
 
-                 var pBox = parent.getContentBox();
 
-                 var vi = parent.getLayoutVectorIn();
 
-                 parent.setLayoutVectorOut(vi);
 
-                 var goldX = pBox.left + pBox.width * GOLD_CUT;
 
-                 var pout = new kity.Point(goldX, vi.y > 0 ? pBox.bottom : pBox.top);
 
-                 parent.setVertexOut(pout);
 
-                 var child = children[0];
 
-                 if (!child) return;
 
-                 var cBox = child.getContentBox();
 
-                 children.forEach(function(child, index) {
 
-                     child.setLayoutTransform(new kity.Matrix());
 
-                     child.setLayoutVectorIn(new kity.Vector(1, 0));
 
-                     child.setVertexIn(new kity.Point(cBox.left, cBox.cy));
 
-                 });
 
-                 this.stack(children, "y");
 
-                 this.align(children, "left");
 
-                 var xAdjust = 0, yAdjust = 0;
 
-                 xAdjust += pout.x;
 
-                 if (parent.getLayoutVectorOut().y < 0) {
 
-                     yAdjust -= this.getTreeBox(children).bottom;
 
-                     yAdjust += parent.getContentBox().top;
 
-                     yAdjust -= parent.getStyle("margin-top");
 
-                     yAdjust -= child.getStyle("margin-bottom");
 
-                 } else {
 
-                     yAdjust += parent.getContentBox().bottom;
 
-                     yAdjust += parent.getStyle("margin-bottom");
 
-                     yAdjust += child.getStyle("margin-top");
 
-                 }
 
-                 this.move(children, xAdjust, yAdjust);
 
-                 if (round == 2) {
 
-                     children.forEach(function(child) {
 
-                         var m = child.getLayoutTransform();
 
-                         var cbox = child.getContentBox();
 
-                         var pin = m.transformPoint(new kity.Point(cbox.left, 0));
 
-                         layout.move([ child ], abs(pin.y - pout.y), 0);
 
-                     });
 
-                 }
 
-             }
 
-         }));
 
-     }
 
- };
 
- //src/layout/mind.js
 
- _p[40] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var Layout = _p.r(18);
 
-         var Minder = _p.r(19);
 
-         Layout.register("mind", kity.createClass({
 
-             base: Layout,
 
-             doLayout: function(node, children) {
 
-                 var layout = this;
 
-                 var half = Math.ceil(node.children.length / 2);
 
-                 var right = [];
 
-                 var left = [];
 
-                 children.forEach(function(child) {
 
-                     if (child.getIndex() < half) right.push(child); else left.push(child);
 
-                 });
 
-                 var leftLayout = Minder.getLayoutInstance("left");
 
-                 var rightLayout = Minder.getLayoutInstance("right");
 
-                 leftLayout.doLayout(node, left);
 
-                 rightLayout.doLayout(node, right);
 
-                 var box = node.getContentBox();
 
-                 node.setVertexOut(new kity.Point(box.cx, box.cy));
 
-                 node.setLayoutVectorOut(new kity.Vector(0, 0));
 
-             },
 
-             getOrderHint: function(node) {
 
-                 var hint = [];
 
-                 var box = node.getLayoutBox();
 
-                 var offset = 5;
 
-                 hint.push({
 
-                     type: "up",
 
-                     node: node,
 
-                     area: new kity.Box({
 
-                         x: box.x,
 
-                         y: box.top - node.getStyle("margin-top") - offset,
 
-                         width: box.width,
 
-                         height: node.getStyle("margin-top")
 
-                     }),
 
-                     path: [ "M", box.x, box.top - offset, "L", box.right, box.top - offset ]
 
-                 });
 
-                 hint.push({
 
-                     type: "down",
 
-                     node: node,
 
-                     area: new kity.Box({
 
-                         x: box.x,
 
-                         y: box.bottom + offset,
 
-                         width: box.width,
 
-                         height: node.getStyle("margin-bottom")
 
-                     }),
 
-                     path: [ "M", box.x, box.bottom + offset, "L", box.right, box.bottom + offset ]
 
-                 });
 
-                 return hint;
 
-             }
 
-         }));
 
-     }
 
- };
 
- //src/layout/tianpan.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 天盘模板
 
-  *
 
-  * @author: along
 
-  * @copyright: bpd729@163.com, 2015
 
-  */
 
- _p[41] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var Layout = _p.r(18);
 
-         var Minder = _p.r(19);
 
-         Layout.register("tianpan", kity.createClass({
 
-             base: Layout,
 
-             doLayout: function(parent, children) {
 
-                 if (children.length == 0) return;
 
-                 var layout = this;
 
-                 var pbox = parent.getContentBox();
 
-                 var x, y, box;
 
-                 var _theta = 5;
 
-                 var _r = Math.max(pbox.width, 50);
 
-                 children.forEach(function(child, index) {
 
-                     child.setLayoutTransform(new kity.Matrix());
 
-                     box = layout.getTreeBox(child);
 
-                     _r = Math.max(Math.max(box.width, box.height), _r);
 
-                 });
 
-                 _r = _r / 1.5 / Math.PI;
 
-                 children.forEach(function(child, index) {
 
-                     x = _r * (Math.cos(_theta) + Math.sin(_theta) * _theta);
 
-                     y = _r * (Math.sin(_theta) - Math.cos(_theta) * _theta);
 
-                     _theta += .9 - index * .02;
 
-                     child.setLayoutVectorIn(new kity.Vector(1, 0));
 
-                     child.setVertexIn(new kity.Point(pbox.cx, pbox.cy));
 
-                     child.setLayoutTransform(new kity.Matrix());
 
-                     layout.move([ child ], x, y);
 
-                 });
 
-             },
 
-             getOrderHint: function(node) {
 
-                 var hint = [];
 
-                 var box = node.getLayoutBox();
 
-                 var offset = 5;
 
-                 hint.push({
 
-                     type: "up",
 
-                     node: node,
 
-                     area: {
 
-                         x: box.x,
 
-                         y: box.top - node.getStyle("margin-top") - offset,
 
-                         width: box.width,
 
-                         height: node.getStyle("margin-top")
 
-                     },
 
-                     path: [ "M", box.x, box.top - offset, "L", box.right, box.top - offset ]
 
-                 });
 
-                 hint.push({
 
-                     type: "down",
 
-                     node: node,
 
-                     area: {
 
-                         x: box.x,
 
-                         y: box.bottom + offset,
 
-                         width: box.width,
 
-                         height: node.getStyle("margin-bottom")
 
-                     },
 
-                     path: [ "M", box.x, box.bottom + offset, "L", box.right, box.bottom + offset ]
 
-                 });
 
-                 return hint;
 
-             }
 
-         }));
 
-     }
 
- };
 
- //src/module/arrange.js
 
- _p[42] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         kity.extendClass(MinderNode, {
 
-             arrange: function(index) {
 
-                 var parent = this.parent;
 
-                 if (!parent) return;
 
-                 var sibling = parent.children;
 
-                 if (index < 0 || index >= sibling.length) return;
 
-                 sibling.splice(this.getIndex(), 1);
 
-                 sibling.splice(index, 0, this);
 
-                 return this;
 
-             }
 
-         });
 
-         function asc(nodeA, nodeB) {
 
-             return nodeA.getIndex() - nodeB.getIndex();
 
-         }
 
-         function desc(nodeA, nodeB) {
 
-             return -asc(nodeA, nodeB);
 
-         }
 
-         function canArrange(km) {
 
-             var selected = km.getSelectedNode();
 
-             return selected && selected.parent && selected.parent.children.length > 1;
 
-         }
 
-         /**
 
-      * @command ArrangeUp
 
-      * @description 向上调整选中节点的位置
 
-      * @shortcut Alt + Up
 
-      * @state
 
-      *    0: 当前选中了具有相同父亲的节点
 
-      *   -1: 其它情况
 
-      */
 
-         var ArrangeUpCommand = kity.createClass("ArrangeUpCommand", {
 
-             base: Command,
 
-             execute: function(km) {
 
-                 var nodes = km.getSelectedNodes();
 
-                 nodes.sort(asc);
 
-                 var lastIndexes = nodes.map(function(node) {
 
-                     return node.getIndex();
 
-                 });
 
-                 nodes.forEach(function(node, index) {
 
-                     node.arrange(lastIndexes[index] - 1);
 
-                 });
 
-                 km.layout(300);
 
-             },
 
-             queryState: function(km) {
 
-                 var selected = km.getSelectedNode();
 
-                 return selected ? 0 : -1;
 
-             }
 
-         });
 
-         /**
 
-      * @command ArrangeDown
 
-      * @description 向下调整选中节点的位置
 
-      * @shortcut Alt + Down
 
-      * @state
 
-      *    0: 当前选中了具有相同父亲的节点
 
-      *   -1: 其它情况
 
-      */
 
-         var ArrangeDownCommand = kity.createClass("ArrangeUpCommand", {
 
-             base: Command,
 
-             execute: function(km) {
 
-                 var nodes = km.getSelectedNodes();
 
-                 nodes.sort(desc);
 
-                 var lastIndexes = nodes.map(function(node) {
 
-                     return node.getIndex();
 
-                 });
 
-                 nodes.forEach(function(node, index) {
 
-                     node.arrange(lastIndexes[index] + 1);
 
-                 });
 
-                 km.layout(300);
 
-             },
 
-             queryState: function(km) {
 
-                 var selected = km.getSelectedNode();
 
-                 return selected ? 0 : -1;
 
-             }
 
-         });
 
-         /**
 
-      * @command Arrange
 
-      * @description 调整选中节点的位置
 
-      * @param {number} index 调整后节点的新位置
 
-      * @state
 
-      *    0: 当前选中了具有相同父亲的节点
 
-      *   -1: 其它情况
 
-      */
 
-         var ArrangeCommand = kity.createClass("ArrangeCommand", {
 
-             base: Command,
 
-             execute: function(km, index) {
 
-                 var nodes = km.getSelectedNodes().slice();
 
-                 if (!nodes.length) return;
 
-                 var ancestor = MinderNode.getCommonAncestor(nodes);
 
-                 if (ancestor != nodes[0].parent) return;
 
-                 var indexed = nodes.map(function(node) {
 
-                     return {
 
-                         index: node.getIndex(),
 
-                         node: node
 
-                     };
 
-                 });
 
-                 var asc = Math.min.apply(Math, indexed.map(function(one) {
 
-                     return one.index;
 
-                 })) >= index;
 
-                 indexed.sort(function(a, b) {
 
-                     return asc ? b.index - a.index : a.index - b.index;
 
-                 });
 
-                 indexed.forEach(function(one) {
 
-                     one.node.arrange(index);
 
-                 });
 
-                 km.layout(300);
 
-             },
 
-             queryState: function(km) {
 
-                 var selected = km.getSelectedNode();
 
-                 return selected ? 0 : -1;
 
-             }
 
-         });
 
-         Module.register("ArrangeModule", {
 
-             commands: {
 
-                 arrangeup: ArrangeUpCommand,
 
-                 arrangedown: ArrangeDownCommand,
 
-                 arrange: ArrangeCommand
 
-             },
 
-             contextmenu: [ {
 
-                 command: "arrangeup"
 
-             }, {
 
-                 command: "arrangedown"
 
-             }, {
 
-                 divider: true
 
-             } ],
 
-             commandShortcutKeys: {
 
-                 arrangeup: "normal::alt+Up",
 
-                 arrangedown: "normal::alt+Down"
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/module/basestyle.js
 
- _p[43] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         var TextRenderer = _p.r(61);
 
-         Module.register("basestylemodule", function() {
 
-             var km = this;
 
-             function getNodeDataOrStyle(node, name) {
 
-                 return node.getData(name) || node.getStyle(name);
 
-             }
 
-             TextRenderer.registerStyleHook(function(node, textGroup) {
 
-                 var fontWeight = getNodeDataOrStyle(node, "font-weight");
 
-                 var fontStyle = getNodeDataOrStyle(node, "font-style");
 
-                 var styleHash = [ fontWeight, fontStyle ].join("/");
 
-                 textGroup.eachItem(function(index, item) {
 
-                     item.setFont({
 
-                         weight: fontWeight,
 
-                         style: fontStyle
 
-                     });
 
-                 });
 
-             });
 
-             return {
 
-                 commands: {
 
-                     /**
 
-                  * @command Bold
 
-                  * @description 加粗选中的节点
 
-                  * @shortcut Ctrl + B
 
-                  * @state
 
-                  *   0: 当前有选中的节点
 
-                  *  -1: 当前没有选中的节点
 
-                  *   1: 当前已选中的节点已加粗
 
-                  */
 
-                     bold: kity.createClass("boldCommand", {
 
-                         base: Command,
 
-                         execute: function(km) {
 
-                             var nodes = km.getSelectedNodes();
 
-                             if (this.queryState("bold") == 1) {
 
-                                 nodes.forEach(function(n) {
 
-                                     n.setData("font-weight").render();
 
-                                 });
 
-                             } else {
 
-                                 nodes.forEach(function(n) {
 
-                                     n.setData("font-weight", "bold").render();
 
-                                 });
 
-                             }
 
-                             km.layout();
 
-                         },
 
-                         queryState: function() {
 
-                             var nodes = km.getSelectedNodes(), result = 0;
 
-                             if (nodes.length === 0) {
 
-                                 return -1;
 
-                             }
 
-                             nodes.forEach(function(n) {
 
-                                 if (n && n.getData("font-weight")) {
 
-                                     result = 1;
 
-                                     return false;
 
-                                 }
 
-                             });
 
-                             return result;
 
-                         }
 
-                     }),
 
-                     /**
 
-                  * @command Italic
 
-                  * @description 加斜选中的节点
 
-                  * @shortcut Ctrl + I
 
-                  * @state
 
-                  *   0: 当前有选中的节点
 
-                  *  -1: 当前没有选中的节点
 
-                  *   1: 当前已选中的节点已加斜
 
-                  */
 
-                     italic: kity.createClass("italicCommand", {
 
-                         base: Command,
 
-                         execute: function(km) {
 
-                             var nodes = km.getSelectedNodes();
 
-                             if (this.queryState("italic") == 1) {
 
-                                 nodes.forEach(function(n) {
 
-                                     n.setData("font-style").render();
 
-                                 });
 
-                             } else {
 
-                                 nodes.forEach(function(n) {
 
-                                     n.setData("font-style", "italic").render();
 
-                                 });
 
-                             }
 
-                             km.layout();
 
-                         },
 
-                         queryState: function() {
 
-                             var nodes = km.getSelectedNodes(), result = 0;
 
-                             if (nodes.length === 0) {
 
-                                 return -1;
 
-                             }
 
-                             nodes.forEach(function(n) {
 
-                                 if (n && n.getData("font-style")) {
 
-                                     result = 1;
 
-                                     return false;
 
-                                 }
 
-                             });
 
-                             return result;
 
-                         }
 
-                     })
 
-                 },
 
-                 commandShortcutKeys: {
 
-                     bold: "ctrl+b",
 
-                     //bold
 
-                     italic: "ctrl+i"
 
-                 }
 
-             };
 
-         });
 
-     }
 
- };
 
- //src/module/clipboard.js
 
- _p[44] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         Module.register("ClipboardModule", function() {
 
-             var km = this, _clipboardNodes = [], _selectedNodes = [];
 
-             function appendChildNode(parent, child) {
 
-                 _selectedNodes.push(child);
 
-                 km.appendNode(child, parent);
 
-                 child.render();
 
-                 child.setLayoutOffset(null);
 
-                 var children = child.children.map(function(node) {
 
-                     return node.clone();
 
-                 });
 
-                 /*
 
-             * fixed bug: Modified on 2015.08.05
 
-             * 原因:粘贴递归 append 时没有清空原来父节点的子节点,而父节点被复制的时候,是连同子节点一起复制过来的
 
-             * 解决办法:增加了下面这一行代码
 
-             * by: @zhangbobell zhangbobell@163.com
 
-             */
 
-                 child.clearChildren();
 
-                 for (var i = 0, ci; ci = children[i]; i++) {
 
-                     appendChildNode(child, ci);
 
-                 }
 
-             }
 
-             function sendToClipboard(nodes) {
 
-                 if (!nodes.length) return;
 
-                 nodes.sort(function(a, b) {
 
-                     return a.getIndex() - b.getIndex();
 
-                 });
 
-                 _clipboardNodes = nodes.map(function(node) {
 
-                     return node.clone();
 
-                 });
 
-             }
 
-             /**
 
-          * @command Copy
 
-          * @description 复制当前选中的节点
 
-          * @shortcut Ctrl + C
 
-          * @state
 
-          *   0: 当前有选中的节点
 
-          *  -1: 当前没有选中的节点
 
-          */
 
-             var CopyCommand = kity.createClass("CopyCommand", {
 
-                 base: Command,
 
-                 execute: function(km) {
 
-                     sendToClipboard(km.getSelectedAncestors(true));
 
-                     this.setContentChanged(false);
 
-                 }
 
-             });
 
-             /**
 
-          * @command Cut
 
-          * @description 剪切当前选中的节点
 
-          * @shortcut Ctrl + X
 
-          * @state
 
-          *   0: 当前有选中的节点
 
-          *  -1: 当前没有选中的节点
 
-          */
 
-             var CutCommand = kity.createClass("CutCommand", {
 
-                 base: Command,
 
-                 execute: function(km) {
 
-                     var ancestors = km.getSelectedAncestors();
 
-                     if (ancestors.length === 0) return;
 
-                     sendToClipboard(ancestors);
 
-                     km.select(MinderNode.getCommonAncestor(ancestors), true);
 
-                     ancestors.slice().forEach(function(node) {
 
-                         km.removeNode(node);
 
-                     });
 
-                     km.layout(300);
 
-                 }
 
-             });
 
-             /**
 
-          * @command Paste
 
-          * @description 粘贴已复制的节点到每一个当前选中的节点上
 
-          * @shortcut Ctrl + V
 
-          * @state
 
-          *   0: 当前有选中的节点
 
-          *  -1: 当前没有选中的节点
 
-          */
 
-             var PasteCommand = kity.createClass("PasteCommand", {
 
-                 base: Command,
 
-                 execute: function(km) {
 
-                     if (_clipboardNodes.length) {
 
-                         var nodes = km.getSelectedNodes();
 
-                         if (!nodes.length) return;
 
-                         for (var i = 0, ni; ni = _clipboardNodes[i]; i++) {
 
-                             for (var j = 0, node; node = nodes[j]; j++) {
 
-                                 appendChildNode(node, ni.clone());
 
-                             }
 
-                         }
 
-                         km.select(_selectedNodes, true);
 
-                         _selectedNodes = [];
 
-                         km.layout(300);
 
-                     }
 
-                 },
 
-                 queryState: function(km) {
 
-                     return km.getSelectedNode() ? 0 : -1;
 
-                 }
 
-             });
 
-             /**
 
-          * @Desc: 若支持原生clipboadr事件则基于原生扩展,否则使用km的基础事件只处理节点的粘贴复制
 
-          * @Editor: Naixor
 
-          * @Date: 2015.9.20
 
-          */
 
-             if (km.supportClipboardEvent && !kity.Browser.gecko) {
 
-                 var Copy = function(e) {
 
-                     this.fire("beforeCopy", e);
 
-                 };
 
-                 var Cut = function(e) {
 
-                     this.fire("beforeCut", e);
 
-                 };
 
-                 var Paste = function(e) {
 
-                     this.fire("beforePaste", e);
 
-                 };
 
-                 return {
 
-                     commands: {
 
-                         copy: CopyCommand,
 
-                         cut: CutCommand,
 
-                         paste: PasteCommand
 
-                     },
 
-                     clipBoardEvents: {
 
-                         copy: Copy.bind(km),
 
-                         cut: Cut.bind(km),
 
-                         paste: Paste.bind(km)
 
-                     },
 
-                     sendToClipboard: sendToClipboard
 
-                 };
 
-             } else {
 
-                 return {
 
-                     commands: {
 
-                         copy: CopyCommand,
 
-                         cut: CutCommand,
 
-                         paste: PasteCommand
 
-                     },
 
-                     commandShortcutKeys: {
 
-                         copy: "normal::ctrl+c|",
 
-                         cut: "normal::ctrl+x",
 
-                         paste: "normal::ctrl+v"
 
-                     },
 
-                     sendToClipboard: sendToClipboard
 
-                 };
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/module/dragtree.js
 
- _p[45] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         // 矩形的变形动画定义
 
-         var MoveToParentCommand = kity.createClass("MoveToParentCommand", {
 
-             base: Command,
 
-             execute: function(minder, nodes, parent) {
 
-                 var node;
 
-                 for (var i = 0; i < nodes.length; i++) {
 
-                     node = nodes[i];
 
-                     if (node.parent) {
 
-                         node.parent.removeChild(node);
 
-                         parent.appendChild(node);
 
-                         node.render();
 
-                     }
 
-                 }
 
-                 parent.expand();
 
-                 minder.select(nodes, true);
 
-             }
 
-         });
 
-         var DropHinter = kity.createClass("DropHinter", {
 
-             base: kity.Group,
 
-             constructor: function() {
 
-                 this.callBase();
 
-                 this.rect = new kity.Rect();
 
-                 this.addShape(this.rect);
 
-             },
 
-             render: function(target) {
 
-                 this.setVisible(!!target);
 
-                 if (target) {
 
-                     this.rect.setBox(target.getLayoutBox()).setRadius(target.getStyle("radius") || 0).stroke(target.getStyle("drop-hint-color") || "yellow", target.getStyle("drop-hint-width") || 2);
 
-                     this.bringTop();
 
-                 }
 
-             }
 
-         });
 
-         var OrderHinter = kity.createClass("OrderHinter", {
 
-             base: kity.Group,
 
-             constructor: function() {
 
-                 this.callBase();
 
-                 this.area = new kity.Rect();
 
-                 this.path = new kity.Path();
 
-                 this.addShapes([ this.area, this.path ]);
 
-             },
 
-             render: function(hint) {
 
-                 this.setVisible(!!hint);
 
-                 if (hint) {
 
-                     this.area.setBox(hint.area);
 
-                     this.area.fill(hint.node.getStyle("order-hint-area-color") || "rgba(0, 255, 0, .5)");
 
-                     this.path.setPathData(hint.path);
 
-                     this.path.stroke(hint.node.getStyle("order-hint-path-color") || "#0f0", hint.node.getStyle("order-hint-path-width") || 1);
 
-                 }
 
-             }
 
-         });
 
-         // 对拖动对象的一个替代盒子,控制整个拖放的逻辑,包括:
 
-         //    1. 从节点列表计算出拖动部分
 
-         //    2. 计算可以 drop 的节点,产生 drop 交互提示
 
-         var TreeDragger = kity.createClass("TreeDragger", {
 
-             constructor: function(minder) {
 
-                 this._minder = minder;
 
-                 this._dropHinter = new DropHinter();
 
-                 this._orderHinter = new OrderHinter();
 
-                 minder.getRenderContainer().addShapes([ this._dropHinter, this._orderHinter ]);
 
-             },
 
-             dragStart: function(position) {
 
-                 // 只记录开始位置,不马上开启拖放模式
 
-                 // 这个位置同时是拖放范围收缩时的焦点位置(中心)
 
-                 this._startPosition = position;
 
-             },
 
-             dragMove: function(position) {
 
-                 // 启动拖放模式需要最小的移动距离
 
-                 var DRAG_MOVE_THRESHOLD = 10;
 
-                 if (!this._startPosition) return;
 
-                 var movement = kity.Vector.fromPoints(this._dragPosition || this._startPosition, position);
 
-                 var minder = this._minder;
 
-                 this._dragPosition = position;
 
-                 if (!this._dragMode) {
 
-                     // 判断拖放模式是否该启动
 
-                     if (kity.Vector.fromPoints(this._dragPosition, this._startPosition).length() < DRAG_MOVE_THRESHOLD) {
 
-                         return;
 
-                     }
 
-                     if (!this._enterDragMode()) {
 
-                         return;
 
-                     }
 
-                 }
 
-                 for (var i = 0; i < this._dragSources.length; i++) {
 
-                     this._dragSources[i].setLayoutOffset(this._dragSources[i].getLayoutOffset().offset(movement));
 
-                     minder.applyLayoutResult(this._dragSources[i]);
 
-                 }
 
-                 if (!this._dropTest()) {
 
-                     this._orderTest();
 
-                 } else {
 
-                     this._renderOrderHint(this._orderSucceedHint = null);
 
-                 }
 
-             },
 
-             dragEnd: function() {
 
-                 this._startPosition = null;
 
-                 this._dragPosition = null;
 
-                 if (!this._dragMode) {
 
-                     return;
 
-                 }
 
-                 this._fadeDragSources(1);
 
-                 if (this._dropSucceedTarget) {
 
-                     this._dragSources.forEach(function(source) {
 
-                         source.setLayoutOffset(null);
 
-                     });
 
-                     this._minder.layout(-1);
 
-                     this._minder.execCommand("movetoparent", this._dragSources, this._dropSucceedTarget);
 
-                 } else if (this._orderSucceedHint) {
 
-                     var hint = this._orderSucceedHint;
 
-                     var index = hint.node.getIndex();
 
-                     var sourceIndexes = this._dragSources.map(function(source) {
 
-                         // 顺便干掉布局偏移
 
-                         source.setLayoutOffset(null);
 
-                         return source.getIndex();
 
-                     });
 
-                     var maxIndex = Math.max.apply(Math, sourceIndexes);
 
-                     var minIndex = Math.min.apply(Math, sourceIndexes);
 
-                     if (index < minIndex && hint.type == "down") index++;
 
-                     if (index > maxIndex && hint.type == "up") index--;
 
-                     hint.node.setLayoutOffset(null);
 
-                     this._minder.execCommand("arrange", index);
 
-                     this._renderOrderHint(null);
 
-                 } else {
 
-                     this._minder.fire("savescene");
 
-                 }
 
-                 this._minder.layout(300);
 
-                 this._leaveDragMode();
 
-                 this._minder.fire("contentchange");
 
-             },
 
-             // 进入拖放模式:
 
-             //    1. 计算拖放源和允许的拖放目标
 
-             //    2. 标记已启动
 
-             _enterDragMode: function() {
 
-                 this._calcDragSources();
 
-                 if (!this._dragSources.length) {
 
-                     this._startPosition = null;
 
-                     return false;
 
-                 }
 
-                 this._fadeDragSources(.5);
 
-                 this._calcDropTargets();
 
-                 this._calcOrderHints();
 
-                 this._dragMode = true;
 
-                 this._minder.setStatus("dragtree");
 
-                 return true;
 
-             },
 
-             // 从选中的节点计算拖放源
 
-             //    并不是所有选中的节点都作为拖放源,如果选中节点中存在 A 和 B,
 
-             //    并且 A 是 B 的祖先,则 B 不作为拖放源
 
-             //
 
-             //    计算过程:
 
-             //       1. 将节点按照树高排序,排序后只可能是前面节点是后面节点的祖先
 
-             //       2. 从后往前枚举排序的结果,如果发现枚举目标之前存在其祖先,
 
-             //          则排除枚举目标作为拖放源,否则加入拖放源
 
-             _calcDragSources: function() {
 
-                 this._dragSources = this._minder.getSelectedAncestors();
 
-             },
 
-             _fadeDragSources: function(opacity) {
 
-                 var minder = this._minder;
 
-                 this._dragSources.forEach(function(source) {
 
-                     source.getRenderContainer().setOpacity(opacity, 200);
 
-                     source.traverse(function(node) {
 
-                         if (opacity < 1) {
 
-                             minder.detachNode(node);
 
-                         } else {
 
-                             minder.attachNode(node);
 
-                         }
 
-                     }, true);
 
-                 });
 
-             },
 
-             // 计算拖放目标可以释放的节点列表(释放意味着成为其子树),存在这条限制规则:
 
-             //    - 不能拖放到拖放目标的子树上(允许拖放到自身,因为多选的情况下可以把其它节点加入)
 
-             //
 
-             //    1. 加入当前节点(初始为根节点)到允许列表
 
-             //    2. 对于当前节点的每一个子节点:
 
-             //       (1) 如果是拖放目标的其中一个节点,忽略(整棵子树被剪枝)
 
-             //       (2) 如果不是拖放目标之一,以当前子节点为当前节点,回到 1 计算
 
-             //    3. 返回允许列表
 
-             //
 
-             _calcDropTargets: function() {
 
-                 function findAvailableParents(nodes, root) {
 
-                     var availables = [], i;
 
-                     availables.push(root);
 
-                     root.getChildren().forEach(function(test) {
 
-                         for (i = 0; i < nodes.length; i++) {
 
-                             if (nodes[i] == test) return;
 
-                         }
 
-                         availables = availables.concat(findAvailableParents(nodes, test));
 
-                     });
 
-                     return availables;
 
-                 }
 
-                 this._dropTargets = findAvailableParents(this._dragSources, this._minder.getRoot());
 
-                 this._dropTargetBoxes = this._dropTargets.map(function(source) {
 
-                     return source.getLayoutBox();
 
-                 });
 
-             },
 
-             _calcOrderHints: function() {
 
-                 var sources = this._dragSources;
 
-                 var ancestor = MinderNode.getCommonAncestor(sources);
 
-                 // 只有一个元素选中,公共祖先是其父
 
-                 if (ancestor == sources[0]) ancestor = sources[0].parent;
 
-                 if (sources.length === 0 || ancestor != sources[0].parent) {
 
-                     this._orderHints = [];
 
-                     return;
 
-                 }
 
-                 var siblings = ancestor.children;
 
-                 this._orderHints = siblings.reduce(function(hint, sibling) {
 
-                     if (sources.indexOf(sibling) == -1) {
 
-                         hint = hint.concat(sibling.getOrderHint());
 
-                     }
 
-                     return hint;
 
-                 }, []);
 
-             },
 
-             _leaveDragMode: function() {
 
-                 this._dragMode = false;
 
-                 this._dropSucceedTarget = null;
 
-                 this._orderSucceedHint = null;
 
-                 this._renderDropHint(null);
 
-                 this._renderOrderHint(null);
 
-                 this._minder.rollbackStatus();
 
-             },
 
-             _drawForDragMode: function() {
 
-                 this._text.setContent(this._dragSources.length + " items");
 
-                 this._text.setPosition(this._startPosition.x, this._startPosition.y + 5);
 
-                 this._minder.getRenderContainer().addShape(this);
 
-             },
 
-             /**
 
-          * 通过 judge 函数判断 targetBox 和 sourceBox 的位置交叉关系
 
-          * @param targets -- 目标节点
 
-          * @param targetBoxMapper -- 目标节点与对应 Box 的映射关系
 
-          * @param judge -- 判断函数
 
-          * @returns {*}
 
-          * @private
 
-          */
 
-             _boxTest: function(targets, targetBoxMapper, judge) {
 
-                 var sourceBoxes = this._dragSources.map(function(source) {
 
-                     return source.getLayoutBox();
 
-                 });
 
-                 var i, j, target, sourceBox, targetBox;
 
-                 judge = judge || function(intersectBox, sourceBox, targetBox) {
 
-                     return intersectBox && !intersectBox.isEmpty();
 
-                 };
 
-                 for (i = 0; i < targets.length; i++) {
 
-                     target = targets[i];
 
-                     targetBox = targetBoxMapper.call(this, target, i);
 
-                     for (j = 0; j < sourceBoxes.length; j++) {
 
-                         sourceBox = sourceBoxes[j];
 
-                         var intersectBox = sourceBox.intersect(targetBox);
 
-                         if (judge(intersectBox, sourceBox, targetBox)) {
 
-                             return target;
 
-                         }
 
-                     }
 
-                 }
 
-                 return null;
 
-             },
 
-             _dropTest: function() {
 
-                 this._dropSucceedTarget = this._boxTest(this._dropTargets, function(target, i) {
 
-                     return this._dropTargetBoxes[i];
 
-                 }, function(intersectBox, sourceBox, targetBox) {
 
-                     function area(box) {
 
-                         return box.width * box.height;
 
-                     }
 
-                     if (!intersectBox) return false;
 
-                     /*
 
-                 * Added by zhangbobell, 2015.9.8
 
-                 *
 
-                 * 增加了下面一行判断,修复了循环比较中 targetBox 为折叠节点时,intersetBox 面积为 0,
 
-                 * 而 targetBox 的 width 和 height 均为 0
 
-                 * 此时造成了满足以下的第二个条件而返回 true
 
-                 * */
 
-                     if (!area(intersectBox)) return false;
 
-                     // 面积判断,交叉面积大于其中的一半
 
-                     if (area(intersectBox) > .5 * Math.min(area(sourceBox), area(targetBox))) return true;
 
-                     // 有一个边完全重合的情况,也认为两个是交叉的
 
-                     if (intersectBox.width + 1 >= Math.min(sourceBox.width, targetBox.width)) return true;
 
-                     if (intersectBox.height + 1 >= Math.min(sourceBox.height, targetBox.height)) return true;
 
-                     return false;
 
-                 });
 
-                 this._renderDropHint(this._dropSucceedTarget);
 
-                 return !!this._dropSucceedTarget;
 
-             },
 
-             _orderTest: function() {
 
-                 this._orderSucceedHint = this._boxTest(this._orderHints, function(hint) {
 
-                     return hint.area;
 
-                 });
 
-                 this._renderOrderHint(this._orderSucceedHint);
 
-                 return !!this._orderSucceedHint;
 
-             },
 
-             _renderDropHint: function(target) {
 
-                 this._dropHinter.render(target);
 
-             },
 
-             _renderOrderHint: function(hint) {
 
-                 this._orderHinter.render(hint);
 
-             },
 
-             preventDragMove: function() {
 
-                 this._startPosition = null;
 
-             }
 
-         });
 
-         Module.register("DragTree", function() {
 
-             var dragger;
 
-             return {
 
-                 init: function() {
 
-                     dragger = new TreeDragger(this);
 
-                     window.addEventListener("mouseup", function() {
 
-                         dragger.dragEnd();
 
-                     });
 
-                 },
 
-                 events: {
 
-                     "normal.mousedown inputready.mousedown": function(e) {
 
-                         // 单选中根节点也不触发拖拽
 
-                         if (e.originEvent.button) return;
 
-                         if (e.getTargetNode() && e.getTargetNode() != this.getRoot()) {
 
-                             dragger.dragStart(e.getPosition());
 
-                         }
 
-                     },
 
-                     "normal.mousemove dragtree.mousemove": function(e) {
 
-                         dragger.dragMove(e.getPosition());
 
-                     },
 
-                     "normal.mouseup dragtree.beforemouseup": function(e) {
 
-                         dragger.dragEnd();
 
-                         //e.stopPropagation();
 
-                         e.preventDefault();
 
-                     },
 
-                     statuschange: function(e) {
 
-                         if (e.lastStatus == "textedit" && e.currentStatus == "normal") {
 
-                             dragger.preventDragMove();
 
-                         }
 
-                     }
 
-                 },
 
-                 commands: {
 
-                     movetoparent: MoveToParentCommand
 
-                 }
 
-             };
 
-         });
 
-     }
 
- };
 
- //src/module/expand.js
 
- _p[46] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var keymap = _p.r(15);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         var Renderer = _p.r(27);
 
-         Module.register("Expand", function() {
 
-             var minder = this;
 
-             var EXPAND_STATE_DATA = "expandState", STATE_EXPAND = "expand", STATE_COLLAPSE = "collapse";
 
-             // 将展开的操作和状态读取接口拓展到 MinderNode 上
 
-             kity.extendClass(MinderNode, {
 
-                 /**
 
-              * 展开节点
 
-              * @param  {Policy} policy 展开的策略,默认为 KEEP_STATE
 
-              */
 
-                 expand: function() {
 
-                     this.setData(EXPAND_STATE_DATA, STATE_EXPAND);
 
-                     return this;
 
-                 },
 
-                 /**
 
-              * 收起节点
 
-              */
 
-                 collapse: function() {
 
-                     this.setData(EXPAND_STATE_DATA, STATE_COLLAPSE);
 
-                     return this;
 
-                 },
 
-                 /**
 
-              * 判断节点当前的状态是否为展开
 
-              */
 
-                 isExpanded: function() {
 
-                     var expanded = this.getData(EXPAND_STATE_DATA) !== STATE_COLLAPSE;
 
-                     return expanded && (this.isRoot() || this.parent.isExpanded());
 
-                 },
 
-                 /**
 
-              * 判断节点当前的状态是否为收起
 
-              */
 
-                 isCollapsed: function() {
 
-                     return !this.isExpanded();
 
-                 }
 
-             });
 
-             /**
 
-          * @command Expand
 
-          * @description 展开当前选中的节点,保证其可见
 
-          * @param {bool} justParents 是否只展开到父亲
 
-          *     * `false` - (默认)保证选中的节点以及其子树可见
 
-          *     * `true` - 只保证选中的节点可见,不展开其子树
 
-          * @state
 
-          *   0: 当前有选中的节点
 
-          *  -1: 当前没有选中的节点
 
-          */
 
-             var ExpandCommand = kity.createClass("ExpandCommand", {
 
-                 base: Command,
 
-                 execute: function(km, justParents) {
 
-                     var node = km.getSelectedNode();
 
-                     if (!node) return;
 
-                     if (justParents) {
 
-                         node = node.parent;
 
-                     }
 
-                     while (node.parent) {
 
-                         node.expand();
 
-                         node = node.parent;
 
-                     }
 
-                     node.renderTree();
 
-                     km.layout(100);
 
-                 },
 
-                 queryState: function(km) {
 
-                     var node = km.getSelectedNode();
 
-                     return node && !node.isRoot() && !node.isExpanded() ? 0 : -1;
 
-                 }
 
-             });
 
-             /**
 
-          * @command ExpandToLevel
 
-          * @description 展开脑图到指定的层级
 
-          * @param {number} level 指定展开到的层级,最少值为 1。
 
-          * @state
 
-          *   0: 一直可用
 
-          */
 
-             var ExpandToLevelCommand = kity.createClass("ExpandToLevelCommand", {
 
-                 base: Command,
 
-                 execute: function(km, level) {
 
-                     km.getRoot().traverse(function(node) {
 
-                         if (node.getLevel() < level) node.expand();
 
-                         if (node.getLevel() == level && !node.isLeaf()) node.collapse();
 
-                     });
 
-                     km.refresh(100);
 
-                 },
 
-                 enableReadOnly: true
 
-             });
 
-             /**
 
-          * @command Collapse
 
-          * @description 收起当前节点的子树
 
-          * @state
 
-          *   0: 当前有选中的节点
 
-          *  -1: 当前没有选中的节点
 
-          */
 
-             var CollapseCommand = kity.createClass("CollapseCommand", {
 
-                 base: Command,
 
-                 execute: function(km) {
 
-                     var node = km.getSelectedNode();
 
-                     if (!node) return;
 
-                     node.collapse();
 
-                     node.renderTree();
 
-                     km.layout();
 
-                 },
 
-                 queryState: function(km) {
 
-                     var node = km.getSelectedNode();
 
-                     return node && !node.isRoot() && node.isExpanded() ? 0 : -1;
 
-                 }
 
-             });
 
-             var Expander = kity.createClass("Expander", {
 
-                 base: kity.Group,
 
-                 constructor: function(node) {
 
-                     this.callBase();
 
-                     this.radius = 6;
 
-                     this.outline = new kity.Circle(this.radius).stroke("gray").fill("white");
 
-                     this.sign = new kity.Path().stroke("gray");
 
-                     this.addShapes([ this.outline, this.sign ]);
 
-                     this.initEvent(node);
 
-                     this.setId(utils.uuid("node_expander"));
 
-                     this.setStyle("cursor", "pointer");
 
-                 },
 
-                 initEvent: function(node) {
 
-                     this.on("mousedown", function(e) {
 
-                         minder.select([ node ], true);
 
-                         if (node.isExpanded()) {
 
-                             node.collapse();
 
-                         } else {
 
-                             node.expand();
 
-                         }
 
-                         node.renderTree().getMinder().layout(100);
 
-                         node.getMinder().fire("contentchange");
 
-                         e.stopPropagation();
 
-                         e.preventDefault();
 
-                     });
 
-                     this.on("dblclick click mouseup", function(e) {
 
-                         e.stopPropagation();
 
-                         e.preventDefault();
 
-                     });
 
-                 },
 
-                 setState: function(state) {
 
-                     if (state == "hide") {
 
-                         this.setVisible(false);
 
-                         return;
 
-                     }
 
-                     this.setVisible(true);
 
-                     var pathData = [ "M", 1.5 - this.radius, 0, "L", this.radius - 1.5, 0 ];
 
-                     if (state == STATE_COLLAPSE) {
 
-                         pathData.push([ "M", 0, 1.5 - this.radius, "L", 0, this.radius - 1.5 ]);
 
-                     }
 
-                     this.sign.setPathData(pathData);
 
-                 }
 
-             });
 
-             var ExpanderRenderer = kity.createClass("ExpanderRenderer", {
 
-                 base: Renderer,
 
-                 create: function(node) {
 
-                     if (node.isRoot()) return;
 
-                     this.expander = new Expander(node);
 
-                     node.getRenderContainer().prependShape(this.expander);
 
-                     node.expanderRenderer = this;
 
-                     this.node = node;
 
-                     return this.expander;
 
-                 },
 
-                 shouldRender: function(node) {
 
-                     return !node.isRoot();
 
-                 },
 
-                 update: function(expander, node, box) {
 
-                     if (!node.parent) return;
 
-                     var visible = node.parent.isExpanded();
 
-                     expander.setState(visible && node.children.length ? node.getData(EXPAND_STATE_DATA) : "hide");
 
-                     var vector = node.getLayoutVectorIn().normalize(expander.radius + node.getStyle("stroke-width"));
 
-                     var position = node.getVertexIn().offset(vector.reverse());
 
-                     this.expander.setTranslate(position);
 
-                 }
 
-             });
 
-             return {
 
-                 commands: {
 
-                     expand: ExpandCommand,
 
-                     expandtolevel: ExpandToLevelCommand,
 
-                     collapse: CollapseCommand
 
-                 },
 
-                 events: {
 
-                     layoutapply: function(e) {
 
-                         var r = e.node.getRenderer("ExpanderRenderer");
 
-                         if (r.getRenderShape()) {
 
-                             r.update(r.getRenderShape(), e.node);
 
-                         }
 
-                     },
 
-                     beforerender: function(e) {
 
-                         var node = e.node;
 
-                         var visible = !node.parent || node.parent.isExpanded();
 
-                         var minder = this;
 
-                         node.getRenderContainer().setVisible(visible);
 
-                         if (!visible) e.stopPropagation();
 
-                     },
 
-                     "normal.keydown": function(e) {
 
-                         if (this.getStatus() == "textedit") return;
 
-                         if (e.originEvent.keyCode == keymap["/"]) {
 
-                             var node = this.getSelectedNode();
 
-                             if (!node || node == this.getRoot()) return;
 
-                             var expanded = node.isExpanded();
 
-                             this.getSelectedNodes().forEach(function(node) {
 
-                                 if (expanded) node.collapse(); else node.expand();
 
-                                 node.renderTree();
 
-                             });
 
-                             this.layout(100);
 
-                             this.fire("contentchange");
 
-                             e.preventDefault();
 
-                             e.stopPropagationImmediately();
 
-                         }
 
-                         if (e.isShortcutKey("Alt+`")) {
 
-                             this.execCommand("expandtolevel", 9999);
 
-                         }
 
-                         for (var i = 1; i < 6; i++) {
 
-                             if (e.isShortcutKey("Alt+" + i)) {
 
-                                 this.execCommand("expandtolevel", i);
 
-                             }
 
-                         }
 
-                     }
 
-                 },
 
-                 renderers: {
 
-                     outside: ExpanderRenderer
 
-                 },
 
-                 contextmenu: [ {
 
-                     command: "expandtoleaf",
 
-                     query: function() {
 
-                         return !minder.getSelectedNode();
 
-                     },
 
-                     fn: function(minder) {
 
-                         minder.execCommand("expandtolevel", 9999);
 
-                     }
 
-                 }, {
 
-                     command: "expandtolevel1",
 
-                     query: function() {
 
-                         return !minder.getSelectedNode();
 
-                     },
 
-                     fn: function(minder) {
 
-                         minder.execCommand("expandtolevel", 1);
 
-                     }
 
-                 }, {
 
-                     command: "expandtolevel2",
 
-                     query: function() {
 
-                         return !minder.getSelectedNode();
 
-                     },
 
-                     fn: function(minder) {
 
-                         minder.execCommand("expandtolevel", 2);
 
-                     }
 
-                 }, {
 
-                     command: "expandtolevel3",
 
-                     query: function() {
 
-                         return !minder.getSelectedNode();
 
-                     },
 
-                     fn: function(minder) {
 
-                         minder.execCommand("expandtolevel", 3);
 
-                     }
 
-                 }, {
 
-                     divider: true
 
-                 } ]
 
-             };
 
-         });
 
-     }
 
- };
 
- //src/module/font.js
 
- _p[47] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         var TextRenderer = _p.r(61);
 
-         function getNodeDataOrStyle(node, name) {
 
-             return node.getData(name) || node.getStyle(name);
 
-         }
 
-         TextRenderer.registerStyleHook(function(node, textGroup) {
 
-             var dataColor = node.getData("color");
 
-             var selectedColor = node.getStyle("selected-color");
 
-             var styleColor = node.getStyle("color");
 
-             var foreColor = dataColor || (node.isSelected() && selectedColor ? selectedColor : styleColor);
 
-             var fontFamily = getNodeDataOrStyle(node, "font-family");
 
-             var fontSize = getNodeDataOrStyle(node, "font-size");
 
-             textGroup.fill(foreColor);
 
-             textGroup.eachItem(function(index, item) {
 
-                 item.setFont({
 
-                     family: fontFamily,
 
-                     size: fontSize
 
-                 });
 
-             });
 
-         });
 
-         Module.register("fontmodule", {
 
-             commands: {
 
-                 /**
 
-              * @command ForeColor
 
-              * @description 设置选中节点的字体颜色
 
-              * @param {string} color 表示颜色的字符串
 
-              * @state
 
-              *   0: 当前有选中的节点
 
-              *  -1: 当前没有选中的节点
 
-              * @return 如果只有一个节点选中,返回已选中节点的字体颜色;否则返回 'mixed'。
 
-              */
 
-                 forecolor: kity.createClass("fontcolorCommand", {
 
-                     base: Command,
 
-                     execute: function(km, color) {
 
-                         var nodes = km.getSelectedNodes();
 
-                         nodes.forEach(function(n) {
 
-                             n.setData("color", color);
 
-                             n.render();
 
-                         });
 
-                     },
 
-                     queryState: function(km) {
 
-                         return km.getSelectedNodes().length === 0 ? -1 : 0;
 
-                     },
 
-                     queryValue: function(km) {
 
-                         if (km.getSelectedNodes().length == 1) {
 
-                             return km.getSelectedNodes()[0].getData("color");
 
-                         }
 
-                         return "mixed";
 
-                     }
 
-                 }),
 
-                 /**
 
-              * @command Background
 
-              * @description 设置选中节点的背景颜色
 
-              * @param {string} color 表示颜色的字符串
 
-              * @state
 
-              *   0: 当前有选中的节点
 
-              *  -1: 当前没有选中的节点
 
-              * @return 如果只有一个节点选中,返回已选中节点的背景颜色;否则返回 'mixed'。
 
-              */
 
-                 background: kity.createClass("backgroudCommand", {
 
-                     base: Command,
 
-                     execute: function(km, color) {
 
-                         var nodes = km.getSelectedNodes();
 
-                         nodes.forEach(function(n) {
 
-                             n.setData("background", color);
 
-                             n.render();
 
-                         });
 
-                     },
 
-                     queryState: function(km) {
 
-                         return km.getSelectedNodes().length === 0 ? -1 : 0;
 
-                     },
 
-                     queryValue: function(km) {
 
-                         if (km.getSelectedNodes().length == 1) {
 
-                             return km.getSelectedNodes()[0].getData("background");
 
-                         }
 
-                         return "mixed";
 
-                     }
 
-                 }),
 
-                 /**
 
-              * @command FontFamily
 
-              * @description 设置选中节点的字体
 
-              * @param {string} family 表示字体的字符串
 
-              * @state
 
-              *   0: 当前有选中的节点
 
-              *  -1: 当前没有选中的节点
 
-              * @return 返回首个选中节点的字体
 
-              */
 
-                 fontfamily: kity.createClass("fontfamilyCommand", {
 
-                     base: Command,
 
-                     execute: function(km, family) {
 
-                         var nodes = km.getSelectedNodes();
 
-                         nodes.forEach(function(n) {
 
-                             n.setData("font-family", family);
 
-                             n.render();
 
-                             km.layout();
 
-                         });
 
-                     },
 
-                     queryState: function(km) {
 
-                         return km.getSelectedNodes().length === 0 ? -1 : 0;
 
-                     },
 
-                     queryValue: function(km) {
 
-                         var node = km.getSelectedNode();
 
-                         if (node) return node.getData("font-family");
 
-                         return null;
 
-                     }
 
-                 }),
 
-                 /**
 
-              * @command FontSize
 
-              * @description 设置选中节点的字体大小
 
-              * @param {number} size 字体大小(px)
 
-              * @state
 
-              *   0: 当前有选中的节点
 
-              *  -1: 当前没有选中的节点
 
-              * @return 返回首个选中节点的字体大小
 
-              */
 
-                 fontsize: kity.createClass("fontsizeCommand", {
 
-                     base: Command,
 
-                     execute: function(km, size) {
 
-                         var nodes = km.getSelectedNodes();
 
-                         nodes.forEach(function(n) {
 
-                             n.setData("font-size", size);
 
-                             n.render();
 
-                             km.layout(300);
 
-                         });
 
-                     },
 
-                     queryState: function(km) {
 
-                         return km.getSelectedNodes().length === 0 ? -1 : 0;
 
-                     },
 
-                     queryValue: function(km) {
 
-                         var node = km.getSelectedNode();
 
-                         if (node) return node.getData("font-size");
 
-                         return null;
 
-                     }
 
-                 })
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/module/hyperlink.js
 
- _p[48] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         var Renderer = _p.r(27);
 
-         // jscs:disable maximumLineLength
 
-         var linkShapePath = "M16.614,10.224h-1.278c-1.668,0-3.07-1.07-3.599-2.556h4.877c0.707,0,1.278-0.571,1.278-1.278V3.834 c0-0.707-0.571-1.278-1.278-1.278h-4.877C12.266,1.071,13.668,0,15.336,0h1.278c2.116,0,3.834,1.716,3.834,3.834V6.39 C20.448,8.508,18.73,10.224,16.614,10.224z M5.112,5.112c0-0.707,0.573-1.278,1.278-1.278h7.668c0.707,0,1.278,0.571,1.278,1.278 S14.765,6.39,14.058,6.39H6.39C5.685,6.39,5.112,5.819,5.112,5.112z M2.556,3.834V6.39c0,0.707,0.573,1.278,1.278,1.278h4.877 c-0.528,1.486-1.932,2.556-3.599,2.556H3.834C1.716,10.224,0,8.508,0,6.39V3.834C0,1.716,1.716,0,3.834,0h1.278 c1.667,0,3.071,1.071,3.599,2.556H3.834C3.129,2.556,2.556,3.127,2.556,3.834z";
 
-         Module.register("hyperlink", {
 
-             commands: {
 
-                 /**
 
-              * @command HyperLink
 
-              * @description 为选中的节点添加超链接
 
-              * @param {string} url 超链接的 URL,设置为 null 移除
 
-              * @param {string} title 超链接的说明
 
-              * @state
 
-              *   0: 当前有选中的节点
 
-              *  -1: 当前没有选中的节点
 
-              * @return 返回首个选中节点的超链接信息,JSON 对象: `{url: url, title: title}`
 
-              */
 
-                 hyperlink: kity.createClass("hyperlink", {
 
-                     base: Command,
 
-                     execute: function(km, url, title) {
 
-                         var nodes = km.getSelectedNodes();
 
-                         nodes.forEach(function(n) {
 
-                             n.setData("hyperlink", url);
 
-                             n.setData("hyperlinkTitle", url && title);
 
-                             n.render();
 
-                         });
 
-                         km.layout();
 
-                     },
 
-                     queryState: function(km) {
 
-                         var nodes = km.getSelectedNodes(), result = 0;
 
-                         if (nodes.length === 0) {
 
-                             return -1;
 
-                         }
 
-                         nodes.forEach(function(n) {
 
-                             if (n && n.getData("hyperlink")) {
 
-                                 result = 0;
 
-                                 return false;
 
-                             }
 
-                         });
 
-                         return result;
 
-                     },
 
-                     queryValue: function(km) {
 
-                         var node = km.getSelectedNode();
 
-                         return {
 
-                             url: node.getData("hyperlink"),
 
-                             title: node.getData("hyperlinkTitle")
 
-                         };
 
-                     }
 
-                 })
 
-             },
 
-             renderers: {
 
-                 right: kity.createClass("hyperlinkrender", {
 
-                     base: Renderer,
 
-                     create: function() {
 
-                         var link = new kity.HyperLink();
 
-                         var linkshape = new kity.Path();
 
-                         var outline = new kity.Rect(24, 22, -2, -6, 4).fill("rgba(255, 255, 255, 0)");
 
-                         linkshape.setPathData(linkShapePath).fill("#666");
 
-                         link.addShape(outline);
 
-                         link.addShape(linkshape);
 
-                         link.setTarget("_blank");
 
-                         link.setStyle("cursor", "pointer");
 
-                         link.on("mouseover", function() {
 
-                             outline.fill("rgba(255, 255, 200, .8)");
 
-                         }).on("mouseout", function() {
 
-                             outline.fill("rgba(255, 255, 255, 0)");
 
-                         });
 
-                         return link;
 
-                     },
 
-                     shouldRender: function(node) {
 
-                         return node.getData("hyperlink");
 
-                     },
 
-                     update: function(link, node, box) {
 
-                         var href = node.getData("hyperlink");
 
-                         link.setHref("#");
 
-                         var allowed = [ "^http:", "^https:", "^ftp:", "^mailto:" ];
 
-                         for (var i = 0; i < allowed.length; i++) {
 
-                             var regex = new RegExp(allowed[i]);
 
-                             if (regex.test(href)) {
 
-                                 link.setHref(href);
 
-                                 break;
 
-                             }
 
-                         }
 
-                         var title = node.getData("hyperlinkTitle");
 
-                         if (title) {
 
-                             title = [ title, "(", href, ")" ].join("");
 
-                         } else {
 
-                             title = href;
 
-                         }
 
-                         link.node.setAttributeNS("http://www.w3.org/1999/xlink", "title", title);
 
-                         var spaceRight = node.getStyle("space-right");
 
-                         link.setTranslate(box.right + spaceRight + 2, -5);
 
-                         return new kity.Box({
 
-                             x: box.right + spaceRight,
 
-                             y: -11,
 
-                             width: 24,
 
-                             height: 22
 
-                         });
 
-                     }
 
-                 })
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/module/image-viewer.js
 
- _p[49] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var keymap = _p.r(15);
 
-         var Module = _p.r(20);
 
-         var Command = _p.r(9);
 
-         Module.register("ImageViewer", function() {
 
-             function createEl(name, classNames, children) {
 
-                 var el = document.createElement(name);
 
-                 addClass(el, classNames);
 
-                 children && children.length && children.forEach(function(child) {
 
-                     el.appendChild(child);
 
-                 });
 
-                 return el;
 
-             }
 
-             function on(el, event, handler) {
 
-                 el.addEventListener(event, handler);
 
-             }
 
-             function addClass(el, classNames) {
 
-                 classNames && classNames.split(" ").forEach(function(className) {
 
-                     el.classList.add(className);
 
-                 });
 
-             }
 
-             function removeClass(el, classNames) {
 
-                 classNames && classNames.split(" ").forEach(function(className) {
 
-                     el.classList.remove(className);
 
-                 });
 
-             }
 
-             var ImageViewer = kity.createClass("ImageViewer", {
 
-                 constructor: function() {
 
-                     var btnClose = createEl("button", "km-image-viewer-btn km-image-viewer-close");
 
-                     var btnSource = createEl("button", "km-image-viewer-btn km-image-viewer-source");
 
-                     var image = this.image = createEl("img");
 
-                     var toolbar = this.toolbar = createEl("div", "km-image-viewer-toolbar", [ btnSource, btnClose ]);
 
-                     var container = createEl("div", "km-image-viewer-container", [ image ]);
 
-                     var viewer = this.viewer = createEl("div", "km-image-viewer", [ toolbar, container ]);
 
-                     this.hotkeyHandler = this.hotkeyHandler.bind(this);
 
-                     on(btnClose, "click", this.close.bind(this));
 
-                     on(btnSource, "click", this.viewSource.bind(this));
 
-                     on(image, "click", this.zoomImage.bind(this));
 
-                     on(viewer, "contextmenu", this.toggleToolbar.bind(this));
 
-                     on(document, "keydown", this.hotkeyHandler);
 
-                 },
 
-                 dispose: function() {
 
-                     this.close();
 
-                     document.removeEventListener("remove", this.hotkeyHandler);
 
-                 },
 
-                 hotkeyHandler: function(e) {
 
-                     if (!this.actived) {
 
-                         return;
 
-                     }
 
-                     if (e.keyCode === keymap["esc"]) {
 
-                         this.close();
 
-                     }
 
-                 },
 
-                 toggleToolbar: function(e) {
 
-                     e && e.preventDefault();
 
-                     this.toolbar.classList.toggle("hidden");
 
-                 },
 
-                 zoomImage: function(restore) {
 
-                     var image = this.image;
 
-                     if (typeof restore === "boolean") {
 
-                         restore && addClass(image, "limited");
 
-                     } else {
 
-                         image.classList.toggle("limited");
 
-                     }
 
-                 },
 
-                 viewSource: function(src) {
 
-                     window.open(this.image.src);
 
-                 },
 
-                 open: function(src) {
 
-                     var input = document.querySelector("input");
 
-                     if (input) {
 
-                         input.focus();
 
-                         input.blur();
 
-                     }
 
-                     this.image.src = src;
 
-                     this.zoomImage(true);
 
-                     document.body.appendChild(this.viewer);
 
-                     this.actived = true;
 
-                 },
 
-                 close: function() {
 
-                     this.image.src = "";
 
-                     document.body.removeChild(this.viewer);
 
-                     this.actived = false;
 
-                 }
 
-             });
 
-             return {
 
-                 init: function() {
 
-                     this.viewer = new ImageViewer();
 
-                 },
 
-                 events: {
 
-                     "normal.dblclick": function(e) {
 
-                         var shape = e.kityEvent.targetShape;
 
-                         if (shape.__KityClassName === "Image" && shape.url) {
 
-                             this.viewer.open(shape.url);
 
-                         }
 
-                     }
 
-                 }
 
-             };
 
-         });
 
-     }
 
- };
 
- //src/module/image.js
 
- _p[50] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         var Renderer = _p.r(27);
 
-         Module.register("image", function() {
 
-             function loadImageSize(url, callback) {
 
-                 var img = document.createElement("img");
 
-                 img.onload = function() {
 
-                     callback(img.width, img.height);
 
-                 };
 
-                 img.onerror = function() {
 
-                     callback(null);
 
-                 };
 
-                 img.src = url;
 
-             }
 
-             function fitImageSize(width, height, maxWidth, maxHeight) {
 
-                 var ratio = width / height, fitRatio = maxWidth / maxHeight;
 
-                 // 宽高比大于最大尺寸的宽高比,以宽度为标准适应
 
-                 if (width > maxWidth && ratio > fitRatio) {
 
-                     width = maxWidth;
 
-                     height = width / ratio;
 
-                 } else if (height > maxHeight) {
 
-                     height = maxHeight;
 
-                     width = height * ratio;
 
-                 }
 
-                 return {
 
-                     width: width | 0,
 
-                     height: height | 0
 
-                 };
 
-             }
 
-             /**
 
-          * @command Image
 
-          * @description 为选中的节点添加图片
 
-          * @param {string} url 图片的 URL,设置为 null 移除
 
-          * @param {string} title 图片的说明
 
-          * @state
 
-          *   0: 当前有选中的节点
 
-          *  -1: 当前没有选中的节点
 
-          * @return 返回首个选中节点的图片信息,JSON 对象: `{url: url, title: title}`
 
-          */
 
-             var ImageCommand = kity.createClass("ImageCommand", {
 
-                 base: Command,
 
-                 execute: function(km, url, title) {
 
-                     var nodes = km.getSelectedNodes();
 
-                     loadImageSize(url, function(width, height) {
 
-                         nodes.forEach(function(n) {
 
-                             var size = fitImageSize(width, height, km.getOption("maxImageWidth"), km.getOption("maxImageHeight"));
 
-                             n.setData("image", url);
 
-                             n.setData("imageTitle", url && title);
 
-                             n.setData("imageSize", url && size);
 
-                             n.render();
 
-                         });
 
-                         km.fire("saveScene");
 
-                         km.layout(300);
 
-                     });
 
-                 },
 
-                 queryState: function(km) {
 
-                     var nodes = km.getSelectedNodes(), result = 0;
 
-                     if (nodes.length === 0) {
 
-                         return -1;
 
-                     }
 
-                     nodes.forEach(function(n) {
 
-                         if (n && n.getData("image")) {
 
-                             result = 0;
 
-                             return false;
 
-                         }
 
-                     });
 
-                     return result;
 
-                 },
 
-                 queryValue: function(km) {
 
-                     var node = km.getSelectedNode();
 
-                     return {
 
-                         url: node.getData("image"),
 
-                         title: node.getData("imageTitle")
 
-                     };
 
-                 }
 
-             });
 
-             var ImageRenderer = kity.createClass("ImageRenderer", {
 
-                 base: Renderer,
 
-                 create: function(node) {
 
-                     return new kity.Image(node.getData("image"));
 
-                 },
 
-                 shouldRender: function(node) {
 
-                     return node.getData("image");
 
-                 },
 
-                 update: function(image, node, box) {
 
-                     var url = node.getData("image");
 
-                     var title = node.getData("imageTitle");
 
-                     var size = node.getData("imageSize");
 
-                     var spaceTop = node.getStyle("space-top");
 
-                     if (!size) return;
 
-                     if (title) {
 
-                         image.node.setAttributeNS("http://www.w3.org/1999/xlink", "title", title);
 
-                     }
 
-                     var x = box.cx - size.width / 2;
 
-                     var y = box.y - size.height - spaceTop;
 
-                     image.setUrl(url).setX(x | 0).setY(y | 0).setWidth(size.width | 0).setHeight(size.height | 0);
 
-                     return new kity.Box(x | 0, y | 0, size.width | 0, size.height | 0);
 
-                 }
 
-             });
 
-             return {
 
-                 defaultOptions: {
 
-                     maxImageWidth: 200,
 
-                     maxImageHeight: 200
 
-                 },
 
-                 commands: {
 
-                     image: ImageCommand
 
-                 },
 
-                 renderers: {
 
-                     top: ImageRenderer
 
-                 }
 
-             };
 
-         });
 
-     }
 
- };
 
- //src/module/keynav.js
 
- _p[51] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var keymap = _p.r(15);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         var Renderer = _p.r(27);
 
-         Module.register("KeyboardModule", function() {
 
-             var min = Math.min, max = Math.max, abs = Math.abs, sqrt = Math.sqrt, exp = Math.exp;
 
-             function buildPositionNetwork(root) {
 
-                 var pointIndexes = [], p;
 
-                 root.traverse(function(node) {
 
-                     p = node.getLayoutBox();
 
-                     // bugfix: 不应导航到收起的节点(判断其尺寸是否存在)
 
-                     if (p.width && p.height) {
 
-                         pointIndexes.push({
 
-                             left: p.x,
 
-                             top: p.y,
 
-                             right: p.x + p.width,
 
-                             bottom: p.y + p.height,
 
-                             width: p.width,
 
-                             height: p.height,
 
-                             node: node
 
-                         });
 
-                     }
 
-                 });
 
-                 for (var i = 0; i < pointIndexes.length; i++) {
 
-                     findClosestPointsFor(pointIndexes, i);
 
-                 }
 
-             }
 
-             // 这是金泉的点子,赞!
 
-             // 求两个不相交矩形的最近距离
 
-             function getCoefedDistance(box1, box2) {
 
-                 var xMin, xMax, yMin, yMax, xDist, yDist, dist, cx, cy;
 
-                 xMin = min(box1.left, box2.left);
 
-                 xMax = max(box1.right, box2.right);
 
-                 yMin = min(box1.top, box2.top);
 
-                 yMax = max(box1.bottom, box2.bottom);
 
-                 xDist = xMax - xMin - box1.width - box2.width;
 
-                 yDist = yMax - yMin - box1.height - box2.height;
 
-                 if (xDist < 0) dist = yDist; else if (yDist < 0) dist = xDist; else dist = sqrt(xDist * xDist + yDist * yDist);
 
-                 var node1 = box1.node;
 
-                 var node2 = box2.node;
 
-                 // sibling
 
-                 if (node1.parent == node2.parent) {
 
-                     dist /= 10;
 
-                 }
 
-                 // parent
 
-                 if (node2.parent == node1) {
 
-                     dist /= 5;
 
-                 }
 
-                 return dist;
 
-             }
 
-             function findClosestPointsFor(pointIndexes, iFind) {
 
-                 var find = pointIndexes[iFind];
 
-                 var most = {}, quad;
 
-                 var current, dist;
 
-                 for (var i = 0; i < pointIndexes.length; i++) {
 
-                     if (i == iFind) continue;
 
-                     current = pointIndexes[i];
 
-                     dist = getCoefedDistance(current, find);
 
-                     // left check
 
-                     if (current.right < find.left) {
 
-                         if (!most.left || dist < most.left.dist) {
 
-                             most.left = {
 
-                                 dist: dist,
 
-                                 node: current.node
 
-                             };
 
-                         }
 
-                     }
 
-                     // right check
 
-                     if (current.left > find.right) {
 
-                         if (!most.right || dist < most.right.dist) {
 
-                             most.right = {
 
-                                 dist: dist,
 
-                                 node: current.node
 
-                             };
 
-                         }
 
-                     }
 
-                     // top check
 
-                     if (current.bottom < find.top) {
 
-                         if (!most.top || dist < most.top.dist) {
 
-                             most.top = {
 
-                                 dist: dist,
 
-                                 node: current.node
 
-                             };
 
-                         }
 
-                     }
 
-                     // bottom check
 
-                     if (current.top > find.bottom) {
 
-                         if (!most.down || dist < most.down.dist) {
 
-                             most.down = {
 
-                                 dist: dist,
 
-                                 node: current.node
 
-                             };
 
-                         }
 
-                     }
 
-                 }
 
-                 find.node._nearestNodes = {
 
-                     right: most.right && most.right.node || null,
 
-                     top: most.top && most.top.node || null,
 
-                     left: most.left && most.left.node || null,
 
-                     down: most.down && most.down.node || null
 
-                 };
 
-             }
 
-             function navigateTo(km, direction) {
 
-                 var referNode = km.getSelectedNode();
 
-                 if (!referNode) {
 
-                     km.select(km.getRoot());
 
-                     buildPositionNetwork(km.getRoot());
 
-                     return;
 
-                 }
 
-                 if (!referNode._nearestNodes) {
 
-                     buildPositionNetwork(km.getRoot());
 
-                 }
 
-                 var nextNode = referNode._nearestNodes[direction];
 
-                 if (nextNode) {
 
-                     km.select(nextNode, true);
 
-                 }
 
-             }
 
-             // 稀释用
 
-             var lastFrame;
 
-             return {
 
-                 events: {
 
-                     layoutallfinish: function() {
 
-                         var root = this.getRoot();
 
-                         buildPositionNetwork(root);
 
-                     },
 
-                     "normal.keydown readonly.keydown": function(e) {
 
-                         var minder = this;
 
-                         [ "left", "right", "up", "down" ].forEach(function(key) {
 
-                             if (e.isShortcutKey(key)) {
 
-                                 navigateTo(minder, key == "up" ? "top" : key);
 
-                                 e.preventDefault();
 
-                             }
 
-                         });
 
-                     }
 
-                 }
 
-             };
 
-         });
 
-     }
 
- };
 
- //src/module/layout.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 布局模块
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[52] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         /**
 
-      * @command Layout
 
-      * @description 设置选中节点的布局
 
-      *     允许使用的布局可以使用 `kityminder.Minder.getLayoutList()` 查询
 
-      * @param {string} name 布局的名称,设置为 null 则使用继承或默认的布局
 
-      * @state
 
-      *   0: 当前有选中的节点
 
-      *  -1: 当前没有选中的节点
 
-      * @return 返回首个选中节点的布局名称
 
-      */
 
-         var LayoutCommand = kity.createClass("LayoutCommand", {
 
-             base: Command,
 
-             execute: function(minder, name) {
 
-                 var nodes = minder.getSelectedNodes();
 
-                 nodes.forEach(function(node) {
 
-                     node.layout(name);
 
-                 });
 
-             },
 
-             queryValue: function(minder) {
 
-                 var node = minder.getSelectedNode();
 
-                 if (node) {
 
-                     return node.getData("layout");
 
-                 }
 
-             },
 
-             queryState: function(minder) {
 
-                 return minder.getSelectedNode() ? 0 : -1;
 
-             }
 
-         });
 
-         /**
 
-      * @command ResetLayout
 
-      * @description 重设选中节点的布局,如果当前没有选中的节点,重设整个脑图的布局
 
-      * @state
 
-      *   0: 始终可用
 
-      * @return 返回首个选中节点的布局名称
 
-      */
 
-         var ResetLayoutCommand = kity.createClass("ResetLayoutCommand", {
 
-             base: Command,
 
-             execute: function(minder) {
 
-                 var nodes = minder.getSelectedNodes();
 
-                 if (!nodes.length) nodes = [ minder.getRoot() ];
 
-                 nodes.forEach(function(node) {
 
-                     node.traverse(function(child) {
 
-                         child.resetLayoutOffset();
 
-                         if (!child.isRoot()) {
 
-                             child.setData("layout", null);
 
-                         }
 
-                     });
 
-                 });
 
-                 minder.layout(300);
 
-             },
 
-             enableReadOnly: true
 
-         });
 
-         Module.register("LayoutModule", {
 
-             commands: {
 
-                 layout: LayoutCommand,
 
-                 resetlayout: ResetLayoutCommand
 
-             },
 
-             contextmenu: [ {
 
-                 command: "resetlayout"
 
-             }, {
 
-                 divider: true
 
-             } ],
 
-             commandShortcutKeys: {
 
-                 resetlayout: "Ctrl+Shift+L"
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/module/node.js
 
- _p[53] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         var Renderer = _p.r(27);
 
-         /**
 
-      * @command AppendChildNode
 
-      * @description 添加子节点到选中的节点中
 
-      * @param {string|object} textOrData 要插入的节点的文本或数据
 
-      * @state
 
-      *    0: 当前有选中的节点
 
-      *   -1: 当前没有选中的节点
 
-      */
 
-         var AppendChildCommand = kity.createClass("AppendChildCommand", {
 
-             base: Command,
 
-             execute: function(km, text) {
 
-                 var parent = km.getSelectedNode();
 
-                 if (!parent) {
 
-                     return null;
 
-                 }
 
-                 var node = km.createNode(text, parent);
 
-                 km.select(node, true);
 
-                 if (parent.isExpanded()) {
 
-                     node.render();
 
-                 } else {
 
-                     parent.expand();
 
-                     parent.renderTree();
 
-                 }
 
-                 km.layout(600);
 
-             },
 
-             queryState: function(km) {
 
-                 var selectedNode = km.getSelectedNode();
 
-                 return selectedNode ? 0 : -1;
 
-             }
 
-         });
 
-         /**
 
-      * @command AppendSiblingNode
 
-      * @description 添加选中的节点的兄弟节点
 
-      * @param {string|object} textOrData 要添加的节点的文本或数据
 
-      * @state
 
-      *    0: 当前有选中的节点
 
-      *   -1: 当前没有选中的节点
 
-      */
 
-         var AppendSiblingCommand = kity.createClass("AppendSiblingCommand", {
 
-             base: Command,
 
-             execute: function(km, text) {
 
-                 var sibling = km.getSelectedNode();
 
-                 var parent = sibling.parent;
 
-                 if (!parent) {
 
-                     return km.execCommand("AppendChildNode", text);
 
-                 }
 
-                 var node = km.createNode(text, parent, sibling.getIndex() + 1);
 
-                 node.setGlobalLayoutTransform(sibling.getGlobalLayoutTransform());
 
-                 km.select(node, true);
 
-                 node.render();
 
-                 km.layout(600);
 
-             },
 
-             queryState: function(km) {
 
-                 var selectedNode = km.getSelectedNode();
 
-                 return selectedNode ? 0 : -1;
 
-             }
 
-         });
 
-         /**
 
-      * @command RemoveNode
 
-      * @description 移除选中的节点
 
-      * @state
 
-      *    0: 当前有选中的节点
 
-      *   -1: 当前没有选中的节点
 
-      */
 
-         var RemoveNodeCommand = kity.createClass("RemoverNodeCommand", {
 
-             base: Command,
 
-             execute: function(km) {
 
-                 var nodes = km.getSelectedNodes();
 
-                 var ancestor = MinderNode.getCommonAncestor.apply(null, nodes);
 
-                 var index = nodes[0].getIndex();
 
-                 nodes.forEach(function(node) {
 
-                     if (!node.isRoot()) km.removeNode(node);
 
-                 });
 
-                 if (nodes.length == 1) {
 
-                     var selectBack = ancestor.children[index - 1] || ancestor.children[index];
 
-                     km.select(selectBack || ancestor || km.getRoot(), true);
 
-                 } else {
 
-                     km.select(ancestor || km.getRoot(), true);
 
-                 }
 
-                 km.layout(600);
 
-             },
 
-             queryState: function(km) {
 
-                 var selectedNode = km.getSelectedNode();
 
-                 return selectedNode && !selectedNode.isRoot() ? 0 : -1;
 
-             }
 
-         });
 
-         var AppendParentCommand = kity.createClass("AppendParentCommand", {
 
-             base: Command,
 
-             execute: function(km, text) {
 
-                 var nodes = km.getSelectedNodes();
 
-                 nodes.sort(function(a, b) {
 
-                     return a.getIndex() - b.getIndex();
 
-                 });
 
-                 var parent = nodes[0].parent;
 
-                 var newParent = km.createNode(text, parent, nodes[0].getIndex());
 
-                 nodes.forEach(function(node) {
 
-                     newParent.appendChild(node);
 
-                 });
 
-                 newParent.setGlobalLayoutTransform(nodes[nodes.length >> 1].getGlobalLayoutTransform());
 
-                 km.select(newParent, true);
 
-                 km.layout(600);
 
-             },
 
-             queryState: function(km) {
 
-                 var nodes = km.getSelectedNodes();
 
-                 if (!nodes.length) return -1;
 
-                 var parent = nodes[0].parent;
 
-                 if (!parent) return -1;
 
-                 for (var i = 1; i < nodes.length; i++) {
 
-                     if (nodes[i].parent != parent) return -1;
 
-                 }
 
-                 return 0;
 
-             }
 
-         });
 
-         Module.register("NodeModule", function() {
 
-             return {
 
-                 commands: {
 
-                     AppendChildNode: AppendChildCommand,
 
-                     AppendSiblingNode: AppendSiblingCommand,
 
-                     RemoveNode: RemoveNodeCommand,
 
-                     AppendParentNode: AppendParentCommand
 
-                 },
 
-                 commandShortcutKeys: {
 
-                     appendsiblingnode: "normal::Enter",
 
-                     appendchildnode: "normal::Insert|Tab",
 
-                     appendparentnode: "normal::Shift+Tab|normal::Shift+Insert",
 
-                     removenode: "normal::Del|Backspace"
 
-                 }
 
-             };
 
-         });
 
-     }
 
- };
 
- //src/module/note.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 支持节点详细信息(HTML)格式
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[54] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         var Renderer = _p.r(27);
 
-         Module.register("NoteModule", function() {
 
-             var NOTE_PATH = "M9,9H3V8h6L9,9L9,9z M9,7H3V6h6V7z M9,5H3V4h6V5z M8.5,11H2V2h8v7.5 M9,12l2-2V1H1v11";
 
-             /**
 
-          * @command Note
 
-          * @description 设置节点的备注信息
 
-          * @param {string} note 要设置的备注信息,设置为 null 则移除备注信息
 
-          * @state
 
-          *    0: 当前有选中的节点
 
-          *   -1: 当前没有选中的节点
 
-          */
 
-             var NoteCommand = kity.createClass("NoteCommand", {
 
-                 base: Command,
 
-                 execute: function(minder, note) {
 
-                     var node = minder.getSelectedNode();
 
-                     node.setData("note", note);
 
-                     node.render();
 
-                     node.getMinder().layout(300);
 
-                 },
 
-                 queryState: function(minder) {
 
-                     return minder.getSelectedNodes().length === 1 ? 0 : -1;
 
-                 },
 
-                 queryValue: function(minder) {
 
-                     var node = minder.getSelectedNode();
 
-                     return node && node.getData("note");
 
-                 }
 
-             });
 
-             var NoteIcon = kity.createClass("NoteIcon", {
 
-                 base: kity.Group,
 
-                 constructor: function() {
 
-                     this.callBase();
 
-                     this.width = 16;
 
-                     this.height = 17;
 
-                     this.rect = new kity.Rect(16, 17, .5, -8.5, 2).fill("transparent");
 
-                     this.path = new kity.Path().setPathData(NOTE_PATH).setTranslate(2.5, -6.5);
 
-                     this.addShapes([ this.rect, this.path ]);
 
-                     this.on("mouseover", function() {
 
-                         this.rect.fill("rgba(255, 255, 200, .8)");
 
-                     }).on("mouseout", function() {
 
-                         this.rect.fill("transparent");
 
-                     });
 
-                     this.setStyle("cursor", "pointer");
 
-                 }
 
-             });
 
-             var NoteIconRenderer = kity.createClass("NoteIconRenderer", {
 
-                 base: Renderer,
 
-                 create: function(node) {
 
-                     var icon = new NoteIcon();
 
-                     icon.on("mousedown", function(e) {
 
-                         e.preventDefault();
 
-                         node.getMinder().fire("editnoterequest");
 
-                     });
 
-                     icon.on("mouseover", function() {
 
-                         node.getMinder().fire("shownoterequest", {
 
-                             node: node,
 
-                             icon: icon
 
-                         });
 
-                     });
 
-                     icon.on("mouseout", function() {
 
-                         node.getMinder().fire("hidenoterequest", {
 
-                             node: node,
 
-                             icon: icon
 
-                         });
 
-                     });
 
-                     return icon;
 
-                 },
 
-                 shouldRender: function(node) {
 
-                     return node.getData("note");
 
-                 },
 
-                 update: function(icon, node, box) {
 
-                     var x = box.right + node.getStyle("space-left");
 
-                     var y = box.cy;
 
-                     icon.path.fill(node.getStyle("color"));
 
-                     icon.setTranslate(x, y);
 
-                     return new kity.Box(x, Math.round(y - icon.height / 2), icon.width, icon.height);
 
-                 }
 
-             });
 
-             return {
 
-                 renderers: {
 
-                     right: NoteIconRenderer
 
-                 },
 
-                 commands: {
 
-                     note: NoteCommand
 
-                 }
 
-             };
 
-         });
 
-     }
 
- };
 
- //src/module/outline.js
 
- _p[55] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         var Renderer = _p.r(27);
 
-         var OutlineRenderer = kity.createClass("OutlineRenderer", {
 
-             base: Renderer,
 
-             create: function(node) {
 
-                 var outline = new kity.Rect().setId(utils.uuid("node_outline"));
 
-                 this.bringToBack = true;
 
-                 return outline;
 
-             },
 
-             update: function(outline, node, box) {
 
-                 var shape = node.getStyle("shape");
 
-                 var paddingLeft = node.getStyle("padding-left"), paddingRight = node.getStyle("padding-right"), paddingTop = node.getStyle("padding-top"), paddingBottom = node.getStyle("padding-bottom");
 
-                 var outlineBox = {
 
-                     x: box.x - paddingLeft,
 
-                     y: box.y - paddingTop,
 
-                     width: box.width + paddingLeft + paddingRight,
 
-                     height: box.height + paddingTop + paddingBottom
 
-                 };
 
-                 var radius = node.getStyle("radius");
 
-                 // 天盘图圆形的情况
 
-                 if (shape && shape == "circle") {
 
-                     var p = Math.pow;
 
-                     var r = Math.round;
 
-                     radius = r(Math.sqrt(p(outlineBox.width, 2) + p(outlineBox.height, 2)) / 2);
 
-                     outlineBox.x = box.cx - radius;
 
-                     outlineBox.y = box.cy - radius;
 
-                     outlineBox.width = 2 * radius;
 
-                     outlineBox.height = 2 * radius;
 
-                 }
 
-                 var prefix = node.isSelected() ? node.getMinder().isFocused() ? "selected-" : "blur-selected-" : "";
 
-                 outline.setPosition(outlineBox.x, outlineBox.y).setSize(outlineBox.width, outlineBox.height).setRadius(radius).fill(node.getData("background") || node.getStyle(prefix + "background") || node.getStyle("background")).stroke(node.getStyle(prefix + "stroke" || node.getStyle("stroke")), node.getStyle(prefix + "stroke-width"));
 
-                 return new kity.Box(outlineBox);
 
-             }
 
-         });
 
-         var ShadowRenderer = kity.createClass("ShadowRenderer", {
 
-             base: Renderer,
 
-             create: function(node) {
 
-                 this.bringToBack = true;
 
-                 return new kity.Rect();
 
-             },
 
-             shouldRender: function(node) {
 
-                 return node.getStyle("shadow");
 
-             },
 
-             update: function(shadow, node, box) {
 
-                 shadow.setPosition(box.x + 4, box.y + 5).fill(node.getStyle("shadow"));
 
-                 var shape = node.getStyle("shape");
 
-                 if (!shape) {
 
-                     shadow.setSize(box.width, box.height);
 
-                     shadow.setRadius(node.getStyle("radius"));
 
-                 } else if (shape == "circle") {
 
-                     var width = Math.max(box.width, box.height);
 
-                     shadow.setSize(width, width);
 
-                     shadow.setRadius(width / 2);
 
-                 }
 
-             }
 
-         });
 
-         var marker = new kity.Marker();
 
-         marker.setWidth(10);
 
-         marker.setHeight(12);
 
-         marker.setRef(0, 0);
 
-         marker.setViewBox(-6, -4, 8, 10);
 
-         marker.addShape(new kity.Path().setPathData("M-5-3l5,3,-5,3").stroke("#33ffff"));
 
-         var wireframeOption = /wire/.test(window.location.href);
 
-         var WireframeRenderer = kity.createClass("WireframeRenderer", {
 
-             base: Renderer,
 
-             create: function() {
 
-                 var wireframe = new kity.Group();
 
-                 var oxy = this.oxy = new kity.Path().stroke("#f6f").setPathData("M0,-50L0,50M-50,0L50,0");
 
-                 var box = this.wireframe = new kity.Rect().stroke("lightgreen");
 
-                 var vectorIn = this.vectorIn = new kity.Path().stroke("#66ffff");
 
-                 var vectorOut = this.vectorOut = new kity.Path().stroke("#66ffff");
 
-                 vectorIn.setMarker(marker, "end");
 
-                 vectorOut.setMarker(marker, "end");
 
-                 return wireframe.addShapes([ oxy, box, vectorIn, vectorOut ]);
 
-             },
 
-             shouldRender: function() {
 
-                 return wireframeOption;
 
-             },
 
-             update: function(created, node, box) {
 
-                 this.wireframe.setPosition(box.x, box.y).setSize(box.width, box.height);
 
-                 var pin = node.getVertexIn();
 
-                 var pout = node.getVertexOut();
 
-                 var vin = node.getLayoutVectorIn().normalize(30);
 
-                 var vout = node.getLayoutVectorOut().normalize(30);
 
-                 this.vectorIn.setPathData([ "M", pin.offset(vin.reverse()), "L", pin ]);
 
-                 this.vectorOut.setPathData([ "M", pout, "l", vout ]);
 
-             }
 
-         });
 
-         Module.register("OutlineModule", function() {
 
-             return {
 
-                 events: !wireframeOption ? null : {
 
-                     ready: function() {
 
-                         this.getPaper().addResource(marker);
 
-                     },
 
-                     layoutallfinish: function() {
 
-                         this.getRoot().traverse(function(node) {
 
-                             node.getRenderer("WireframeRenderer").update(null, node, node.getContentBox());
 
-                         });
 
-                     }
 
-                 },
 
-                 renderers: {
 
-                     outline: OutlineRenderer,
 
-                     outside: [ ShadowRenderer, WireframeRenderer ]
 
-                 }
 
-             };
 
-         });
 
-     }
 
- };
 
- //src/module/priority.js
 
- _p[56] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         var Renderer = _p.r(27);
 
-         Module.register("PriorityModule", function() {
 
-             var minder = this;
 
-             // Designed by Akikonata
 
-             // [MASK, BACK]
 
-             var PRIORITY_COLORS = [ null, [ "#FF1200", "#840023" ], // 1 - red
 
-             [ "#0074FF", "#01467F" ], // 2 - blue
 
-             [ "#00AF00", "#006300" ], // 3 - green
 
-             [ "#FF962E", "#B25000" ], // 4 - orange
 
-             [ "#A464FF", "#4720C4" ], // 5 - purple
 
-             [ "#A3A3A3", "#515151" ], // 6,7,8,9 - gray
 
-             [ "#A3A3A3", "#515151" ], [ "#A3A3A3", "#515151" ], [ "#A3A3A3", "#515151" ] ];
 
-             // hue from 1 to 5
 
-             // jscs:disable maximumLineLength
 
-             var BACK_PATH = "M0,13c0,3.866,3.134,7,7,7h6c3.866,0,7-3.134,7-7V7H0V13z";
 
-             var MASK_PATH = "M20,10c0,3.866-3.134,7-7,7H7c-3.866,0-7-3.134-7-7V7c0-3.866,3.134-7,7-7h6c3.866,0,7,3.134,7,7V10z";
 
-             var PRIORITY_DATA = "priority";
 
-             // 优先级图标的图形
 
-             var PriorityIcon = kity.createClass("PriorityIcon", {
 
-                 base: kity.Group,
 
-                 constructor: function() {
 
-                     this.callBase();
 
-                     this.setSize(20);
 
-                     this.create();
 
-                     this.setId(utils.uuid("node_priority"));
 
-                 },
 
-                 setSize: function(size) {
 
-                     this.width = this.height = size;
 
-                 },
 
-                 create: function() {
 
-                     var white, back, mask, number;
 
-                     // 4 layer
 
-                     white = new kity.Path().setPathData(MASK_PATH).fill("white");
 
-                     back = new kity.Path().setPathData(BACK_PATH).setTranslate(.5, .5);
 
-                     mask = new kity.Path().setPathData(MASK_PATH).setOpacity(.8).setTranslate(.5, .5);
 
-                     number = new kity.Text().setX(this.width / 2 - .5).setY(this.height / 2).setTextAnchor("middle").setVerticalAlign("middle").setFontItalic(true).setFontSize(12).fill("white");
 
-                     this.addShapes([ back, mask, number ]);
 
-                     this.mask = mask;
 
-                     this.back = back;
 
-                     this.number = number;
 
-                 },
 
-                 setValue: function(value) {
 
-                     var back = this.back, mask = this.mask, number = this.number;
 
-                     var color = PRIORITY_COLORS[value];
 
-                     if (color) {
 
-                         back.fill(color[1]);
 
-                         mask.fill(color[0]);
 
-                     }
 
-                     number.setContent(value);
 
-                 }
 
-             });
 
-             /**
 
-          * @command Priority
 
-          * @description 设置节点的优先级信息
 
-          * @param {number} value 要设置的优先级(添加一个优先级小图标)
 
-          *     取值为 0 移除优先级信息;
 
-          *     取值为 1 - 9 设置优先级,超过 9 的优先级不渲染
 
-          * @state
 
-          *    0: 当前有选中的节点
 
-          *   -1: 当前没有选中的节点
 
-          */
 
-             var PriorityCommand = kity.createClass("SetPriorityCommand", {
 
-                 base: Command,
 
-                 execute: function(km, value) {
 
-                     var nodes = km.getSelectedNodes();
 
-                     for (var i = 0; i < nodes.length; i++) {
 
-                         nodes[i].setData(PRIORITY_DATA, value || null).render();
 
-                     }
 
-                     km.layout();
 
-                 },
 
-                 queryValue: function(km) {
 
-                     var nodes = km.getSelectedNodes();
 
-                     var val;
 
-                     for (var i = 0; i < nodes.length; i++) {
 
-                         val = nodes[i].getData(PRIORITY_DATA);
 
-                         if (val) break;
 
-                     }
 
-                     return val || null;
 
-                 },
 
-                 queryState: function(km) {
 
-                     return km.getSelectedNodes().length ? 0 : -1;
 
-                 }
 
-             });
 
-             return {
 
-                 commands: {
 
-                     priority: PriorityCommand
 
-                 },
 
-                 renderers: {
 
-                     left: kity.createClass("PriorityRenderer", {
 
-                         base: Renderer,
 
-                         create: function(node) {
 
-                             return new PriorityIcon();
 
-                         },
 
-                         shouldRender: function(node) {
 
-                             return node.getData(PRIORITY_DATA);
 
-                         },
 
-                         update: function(icon, node, box) {
 
-                             var data = node.getData(PRIORITY_DATA);
 
-                             var spaceLeft = node.getStyle("space-left"), x, y;
 
-                             icon.setValue(data);
 
-                             x = box.left - icon.width - spaceLeft;
 
-                             y = -icon.height / 2;
 
-                             icon.setTranslate(x, y);
 
-                             return new kity.Box({
 
-                                 x: x,
 
-                                 y: y,
 
-                                 width: icon.width,
 
-                                 height: icon.height
 
-                             });
 
-                         }
 
-                     })
 
-                 }
 
-             };
 
-         });
 
-     }
 
- };
 
- //src/module/progress.js
 
- _p[57] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         var Renderer = _p.r(27);
 
-         Module.register("ProgressModule", function() {
 
-             var minder = this;
 
-             var PROGRESS_DATA = "progress";
 
-             // Designed by Akikonata
 
-             var BG_COLOR = "#FFED83";
 
-             var PIE_COLOR = "#43BC00";
 
-             var SHADOW_PATH = "M10,3c4.418,0,8,3.582,8,8h1c0-5.523-3.477-10-9-10S1,5.477,1,11h1C2,6.582,5.582,3,10,3z";
 
-             var SHADOW_COLOR = "#8E8E8E";
 
-             // jscs:disable maximumLineLength
 
-             var FRAME_PATH = "M10,0C4.477,0,0,4.477,0,10c0,5.523,4.477,10,10,10s10-4.477,10-10C20,4.477,15.523,0,10,0zM10,18c-4.418,0-8-3.582-8-8s3.582-8,8-8s8,3.582,8,8S14.418,18,10,18z";
 
-             var FRAME_GRAD = new kity.LinearGradient().pipe(function(g) {
 
-                 g.setStartPosition(0, 0);
 
-                 g.setEndPosition(0, 1);
 
-                 g.addStop(0, "#fff");
 
-                 g.addStop(1, "#ccc");
 
-             });
 
-             var CHECK_PATH = "M15.812,7.896l-6.75,6.75l-4.5-4.5L6.25,8.459l2.812,2.803l5.062-5.053L15.812,7.896z";
 
-             var CHECK_COLOR = "#EEE";
 
-             minder.getPaper().addResource(FRAME_GRAD);
 
-             // 进度图标的图形
 
-             var ProgressIcon = kity.createClass("ProgressIcon", {
 
-                 base: kity.Group,
 
-                 constructor: function(value) {
 
-                     this.callBase();
 
-                     this.setSize(20);
 
-                     this.create();
 
-                     this.setValue(value);
 
-                     this.setId(utils.uuid("node_progress"));
 
-                     this.translate(.5, .5);
 
-                 },
 
-                 setSize: function(size) {
 
-                     this.width = this.height = size;
 
-                 },
 
-                 create: function() {
 
-                     var bg, pie, shadow, frame, check;
 
-                     bg = new kity.Circle(9).fill(BG_COLOR);
 
-                     pie = new kity.Pie(9, 0).fill(PIE_COLOR);
 
-                     shadow = new kity.Path().setPathData(SHADOW_PATH).setTranslate(-10, -10).fill(SHADOW_COLOR);
 
-                     frame = new kity.Path().setTranslate(-10, -10).setPathData(FRAME_PATH).fill(FRAME_GRAD);
 
-                     check = new kity.Path().setTranslate(-10, -10).setPathData(CHECK_PATH).fill(CHECK_COLOR);
 
-                     this.addShapes([ bg, pie, shadow, check, frame ]);
 
-                     this.pie = pie;
 
-                     this.check = check;
 
-                 },
 
-                 setValue: function(value) {
 
-                     this.pie.setAngle(-360 * (value - 1) / 8);
 
-                     this.check.setVisible(value == 9);
 
-                 }
 
-             });
 
-             /**
 
-          * @command Progress
 
-          * @description 设置节点的进度信息(添加一个进度小图标)
 
-          * @param {number} value 要设置的进度
 
-          *     取值为 0 移除进度信息;
 
-          *     取值为 1 表示未开始;
 
-          *     取值为 2 表示完成 1/8;
 
-          *     取值为 3 表示完成 2/8;
 
-          *     取值为 4 表示完成 3/8;
 
-          *     其余类推,取值为 9 表示全部完成
 
-          * @state
 
-          *    0: 当前有选中的节点
 
-          *   -1: 当前没有选中的节点
 
-          */
 
-             var ProgressCommand = kity.createClass("ProgressCommand", {
 
-                 base: Command,
 
-                 execute: function(km, value) {
 
-                     var nodes = km.getSelectedNodes();
 
-                     for (var i = 0; i < nodes.length; i++) {
 
-                         nodes[i].setData(PROGRESS_DATA, value || null).render();
 
-                     }
 
-                     km.layout();
 
-                 },
 
-                 queryValue: function(km) {
 
-                     var nodes = km.getSelectedNodes();
 
-                     var val;
 
-                     for (var i = 0; i < nodes.length; i++) {
 
-                         val = nodes[i].getData(PROGRESS_DATA);
 
-                         if (val) break;
 
-                     }
 
-                     return val || null;
 
-                 },
 
-                 queryState: function(km) {
 
-                     return km.getSelectedNodes().length ? 0 : -1;
 
-                 }
 
-             });
 
-             return {
 
-                 commands: {
 
-                     progress: ProgressCommand
 
-                 },
 
-                 renderers: {
 
-                     left: kity.createClass("ProgressRenderer", {
 
-                         base: Renderer,
 
-                         create: function(node) {
 
-                             return new ProgressIcon();
 
-                         },
 
-                         shouldRender: function(node) {
 
-                             return node.getData(PROGRESS_DATA);
 
-                         },
 
-                         update: function(icon, node, box) {
 
-                             var data = node.getData(PROGRESS_DATA);
 
-                             var spaceLeft = node.getStyle("space-left");
 
-                             var x, y;
 
-                             icon.setValue(data);
 
-                             x = box.left - icon.width - spaceLeft;
 
-                             y = -icon.height / 2;
 
-                             icon.setTranslate(x + icon.width / 2, y + icon.height / 2);
 
-                             return new kity.Box(x, y, icon.width, icon.height);
 
-                         }
 
-                     })
 
-                 }
 
-             };
 
-         });
 
-     }
 
- };
 
- //src/module/resource.js
 
- _p[58] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         var Renderer = _p.r(27);
 
-         Module.register("Resource", function() {
 
-             // String Hash
 
-             // https://github.com/drostie/sha3-js/edit/master/blake32.min.js
 
-             var blake32 = function() {
 
-                 var k, g, r, l, m, o, p, q, t, w, x;
 
-                 x = 4 * (1 << 30);
 
-                 k = [ 1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635, 1541459225 ];
 
-                 m = [ 608135816, 2242054355, 320440878, 57701188, 2752067618, 698298832, 137296536, 3964562569, 1160258022, 953160567, 3193202383, 887688300, 3232508343, 3380367581, 1065670069, 3041331479 ];
 
-                 w = function(i) {
 
-                     if (i < 0) {
 
-                         i += x;
 
-                     }
 
-                     return ("00000000" + i.toString(16)).slice(-8);
 
-                 };
 
-                 o = [ [ 16, 50, 84, 118, 152, 186, 220, 254 ], [ 174, 132, 249, 109, 193, 32, 123, 53 ], [ 139, 12, 37, 223, 234, 99, 23, 73 ], [ 151, 19, 205, 235, 98, 165, 4, 143 ], [ 9, 117, 66, 250, 30, 203, 134, 211 ], [ 194, 166, 176, 56, 212, 87, 239, 145 ], [ 92, 241, 222, 164, 112, 54, 41, 184 ], [ 189, 231, 28, 147, 5, 79, 104, 162 ], [ 246, 158, 59, 128, 44, 125, 65, 90 ], [ 42, 72, 103, 81, 191, 233, 195, 13 ] ];
 
-                 p = function(a, b, n) {
 
-                     var s = q[a] ^ q[b];
 
-                     q[a] = s >>> n | s << 32 - n;
 
-                 };
 
-                 g = function(i, a, b, c, d) {
 
-                     var u = l + o[r][i] % 16, v = l + (o[r][i] >> 4);
 
-                     a %= 4;
 
-                     b = 4 + b % 4;
 
-                     c = 8 + c % 4;
 
-                     d = 12 + d % 4;
 
-                     q[a] += q[b] + (t[u] ^ m[v % 16]);
 
-                     p(d, a, 16);
 
-                     q[c] += q[d];
 
-                     p(b, c, 12);
 
-                     q[a] += q[b] + (t[v] ^ m[u % 16]);
 
-                     p(d, a, 8);
 
-                     q[c] += q[d];
 
-                     p(b, c, 7);
 
-                 };
 
-                 return function(a, b) {
 
-                     if (!(b instanceof Array && b.length === 4)) {
 
-                         b = [ 0, 0, 0, 0 ];
 
-                     }
 
-                     var c, d, e, L, f, h, j, i;
 
-                     d = k.slice(0);
 
-                     c = m.slice(0, 8);
 
-                     for (r = 0; r < 4; r += 1) {
 
-                         c[r] ^= b[r];
 
-                     }
 
-                     e = a.length * 16;
 
-                     f = e % 512 > 446 || e % 512 === 0 ? 0 : e;
 
-                     if (e % 512 === 432) {
 
-                         a += "老";
 
-                     } else {
 
-                         a += "耀";
 
-                         while (a.length % 32 !== 27) {
 
-                             a += "\0";
 
-                         }
 
-                         a += "";
 
-                     }
 
-                     t = [];
 
-                     for (i = 0; i < a.length; i += 2) {
 
-                         t.push(a.charCodeAt(i) * 65536 + a.charCodeAt(i + 1));
 
-                     }
 
-                     t.push(0);
 
-                     t.push(e);
 
-                     h = t.length - 16;
 
-                     j = 0;
 
-                     for (l = 0; l < t.length; l += 16) {
 
-                         j += 512;
 
-                         L = l === h ? f : Math.min(e, j);
 
-                         q = d.concat(c);
 
-                         q[12] ^= L;
 
-                         q[13] ^= L;
 
-                         for (r = 0; r < 10; r += 1) {
 
-                             for (i = 0; i < 8; i += 1) {
 
-                                 if (i < 4) {
 
-                                     g(i, i, i, i, i);
 
-                                 } else {
 
-                                     g(i, i, i + 1, i + 2, i + 3);
 
-                                 }
 
-                             }
 
-                         }
 
-                         for (i = 0; i < 8; i += 1) {
 
-                             d[i] ^= b[i % 4] ^ q[i] ^ q[i + 8];
 
-                         }
 
-                     }
 
-                     return d.map(w).join("");
 
-                 };
 
-             }();
 
-             /**
 
-          * 自动使用的颜色序列
 
-          */
 
-             var RESOURCE_COLOR_SERIES = [ 51, 303, 75, 200, 157, 0, 26, 254 ].map(function(h) {
 
-                 return kity.Color.createHSL(h, 100, 85);
 
-             });
 
-             /**
 
-          * 在 Minder 上拓展一些关于资源的支持接口
 
-          */
 
-             kity.extendClass(Minder, {
 
-                 /**
 
-              * 获取字符串的哈希值
 
-              *
 
-              * @param {String} str
 
-              * @return {Number} hashCode
 
-              */
 
-                 getHashCode: function(str) {
 
-                     str = blake32(str);
 
-                     var hash = 1315423911, i, ch;
 
-                     for (i = str.length - 1; i >= 0; i--) {
 
-                         ch = str.charCodeAt(i);
 
-                         hash ^= (hash << 5) + ch + (hash >> 2);
 
-                     }
 
-                     return hash & 2147483647;
 
-                 },
 
-                 /**
 
-              * 获取脑图中某个资源对应的颜色
 
-              *
 
-              * 如果存在同名资源,则返回已经分配给该资源的颜色,否则分配给该资源一个颜色,并且返回
 
-              *
 
-              * 如果资源数超过颜色序列数量,返回哈希颜色
 
-              *
 
-              * @param {String} resource 资源名称
 
-              * @return {Color}
 
-              */
 
-                 getResourceColor: function(resource) {
 
-                     var colorMapping = this._getResourceColorIndexMapping();
 
-                     var nextIndex;
 
-                     if (!Object.prototype.hasOwnProperty.call(colorMapping, resource)) {
 
-                         // 找不到找下个可用索引
 
-                         nextIndex = this._getNextResourceColorIndex();
 
-                         colorMapping[resource] = nextIndex;
 
-                     }
 
-                     // 资源过多,找不到可用索引颜色,统一返回哈希函数得到的颜色
 
-                     return RESOURCE_COLOR_SERIES[colorMapping[resource]] || kity.Color.createHSL(Math.floor(this.getHashCode(resource) / 2147483647 * 359), 100, 85);
 
-                 },
 
-                 /**
 
-              * 获得已使用的资源的列表
 
-              *
 
-              * @return {Array}
 
-              */
 
-                 getUsedResource: function() {
 
-                     var mapping = this._getResourceColorIndexMapping();
 
-                     var used = [], resource;
 
-                     for (resource in mapping) {
 
-                         if (Object.prototype.hasOwnProperty.call(mapping, resource)) {
 
-                             used.push(resource);
 
-                         }
 
-                     }
 
-                     return used;
 
-                 },
 
-                 /**
 
-              * 获取脑图下一个可用的资源颜色索引
 
-              *
 
-              * @return {int}
 
-              */
 
-                 _getNextResourceColorIndex: function() {
 
-                     // 获取现有颜色映射
 
-                     //     resource => color_index
 
-                     var colorMapping = this._getResourceColorIndexMapping();
 
-                     var resource, used, i;
 
-                     used = [];
 
-                     // 抽取已经使用的值到 used 数组
 
-                     for (resource in colorMapping) {
 
-                         if (Object.prototype.hasOwnProperty.call(colorMapping, resource)) {
 
-                             used.push(colorMapping[resource]);
 
-                         }
 
-                     }
 
-                     // 枚举所有的可用值,如果还没被使用,返回
 
-                     for (i = 0; i < RESOURCE_COLOR_SERIES.length; i++) {
 
-                         if (!~used.indexOf(i)) return i;
 
-                     }
 
-                     // 没有可用的颜色了
 
-                     return -1;
 
-                 },
 
-                 // 获取现有颜色映射
 
-                 //     resource => color_index
 
-                 _getResourceColorIndexMapping: function() {
 
-                     return this._resourceColorMapping || (this._resourceColorMapping = {});
 
-                 }
 
-             });
 
-             /**
 
-          * @class 设置资源的命令
 
-          *
 
-          * @example
 
-          *
 
-          * // 设置选中节点资源为 "张三"
 
-          * minder.execCommand('resource', ['张三']);
 
-          *
 
-          * // 添加资源 "李四" 到选中节点
 
-          * var resource = minder.queryCommandValue();
 
-          * resource.push('李四');
 
-          * minder.execCommand('resource', resource);
 
-          *
 
-          * // 清除选中节点的资源
 
-          * minder.execCommand('resource', null);
 
-          */
 
-             var ResourceCommand = kity.createClass("ResourceCommand", {
 
-                 base: Command,
 
-                 execute: function(minder, resource) {
 
-                     var nodes = minder.getSelectedNodes();
 
-                     if (typeof resource == "string") {
 
-                         resource = [ resource ];
 
-                     }
 
-                     nodes.forEach(function(node) {
 
-                         node.setData("resource", resource).render();
 
-                     });
 
-                     minder.layout(200);
 
-                 },
 
-                 queryValue: function(minder) {
 
-                     var nodes = minder.getSelectedNodes();
 
-                     var resource = [];
 
-                     nodes.forEach(function(node) {
 
-                         var nodeResource = node.getData("resource");
 
-                         if (!nodeResource) return;
 
-                         nodeResource.forEach(function(name) {
 
-                             if (!~resource.indexOf(name)) {
 
-                                 resource.push(name);
 
-                             }
 
-                         });
 
-                     });
 
-                     return resource;
 
-                 },
 
-                 queryState: function(km) {
 
-                     return km.getSelectedNode() ? 0 : -1;
 
-                 }
 
-             });
 
-             /**
 
-          * @class 资源的覆盖图形
 
-          *
 
-          * 该类为一个资源以指定的颜色渲染一个动态的覆盖图形
 
-          */
 
-             var ResourceOverlay = kity.createClass("ResourceOverlay", {
 
-                 base: kity.Group,
 
-                 constructor: function() {
 
-                     this.callBase();
 
-                     var text, rect;
 
-                     rect = this.rect = new kity.Rect().setRadius(4);
 
-                     text = this.text = new kity.Text().setFontSize(12).setVerticalAlign("middle");
 
-                     this.addShapes([ rect, text ]);
 
-                 },
 
-                 setValue: function(resourceName, color) {
 
-                     var paddingX = 8, paddingY = 4, borderRadius = 4;
 
-                     var text, box, rect;
 
-                     text = this.text;
 
-                     if (resourceName == this.lastResourceName) {
 
-                         box = this.lastBox;
 
-                     } else {
 
-                         text.setContent(resourceName);
 
-                         box = text.getBoundaryBox();
 
-                         this.lastResourceName = resourceName;
 
-                         this.lastBox = box;
 
-                     }
 
-                     text.setX(paddingX).fill(color.dec("l", 70));
 
-                     rect = this.rect;
 
-                     rect.setPosition(0, box.y - paddingY);
 
-                     this.width = Math.round(box.width + paddingX * 2);
 
-                     this.height = Math.round(box.height + paddingY * 2);
 
-                     rect.setSize(this.width, this.height);
 
-                     rect.fill(color);
 
-                 }
 
-             });
 
-             /**
 
-          * @class 资源渲染器
 
-          */
 
-             var ResourceRenderer = kity.createClass("ResourceRenderer", {
 
-                 base: Renderer,
 
-                 create: function(node) {
 
-                     this.overlays = [];
 
-                     return new kity.Group();
 
-                 },
 
-                 shouldRender: function(node) {
 
-                     return node.getData("resource") && node.getData("resource").length;
 
-                 },
 
-                 update: function(container, node, box) {
 
-                     var spaceRight = node.getStyle("space-right");
 
-                     var overlays = this.overlays;
 
-                     /*  修复 resource 数组中出现 null 的 bug
 
-                  *  @Author zhangbobell
 
-                  *  @date 2016-01-15
 
-                  */
 
-                     var resource = node.getData("resource").filter(function(ele) {
 
-                         return ele !== null;
 
-                     });
 
-                     if (resource.length === 0) {
 
-                         return;
 
-                     }
 
-                     var minder = node.getMinder();
 
-                     var i, overlay, x;
 
-                     x = 0;
 
-                     for (i = 0; i < resource.length; i++) {
 
-                         x += spaceRight;
 
-                         overlay = overlays[i];
 
-                         if (!overlay) {
 
-                             overlay = new ResourceOverlay();
 
-                             overlays.push(overlay);
 
-                             container.addShape(overlay);
 
-                         }
 
-                         overlay.setVisible(true);
 
-                         overlay.setValue(resource[i], minder.getResourceColor(resource[i]));
 
-                         overlay.setTranslate(x, -1);
 
-                         x += overlay.width;
 
-                     }
 
-                     while (overlay = overlays[i++]) overlay.setVisible(false);
 
-                     container.setTranslate(box.right, 0);
 
-                     return new kity.Box({
 
-                         x: box.right,
 
-                         y: Math.round(-overlays[0].height / 2),
 
-                         width: x,
 
-                         height: overlays[0].height
 
-                     });
 
-                 }
 
-             });
 
-             return {
 
-                 commands: {
 
-                     resource: ResourceCommand
 
-                 },
 
-                 renderers: {
 
-                     right: ResourceRenderer
 
-                 }
 
-             };
 
-         });
 
-     }
 
- };
 
- //src/module/select.js
 
- _p[59] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         var Renderer = _p.r(27);
 
-         Module.register("Select", function() {
 
-             var minder = this;
 
-             var rc = minder.getRenderContainer();
 
-             // 在实例上渲染框选矩形、计算框选范围的对象
 
-             var marqueeActivator = function() {
 
-                 // 记录选区的开始位置(mousedown的位置)
 
-                 var startPosition = null;
 
-                 // 选区的图形
 
-                 var marqueeShape = new kity.Path();
 
-                 // 标记是否已经启动框选状态
 
-                 //    并不是 mousedown 发生之后就启动框选状态,而是检测到移动了一定的距离(MARQUEE_MODE_THRESHOLD)之后
 
-                 var marqueeMode = false;
 
-                 var MARQUEE_MODE_THRESHOLD = 10;
 
-                 return {
 
-                     selectStart: function(e) {
 
-                         // 只接受左键
 
-                         if (e.originEvent.button || e.originEvent.altKey) return;
 
-                         // 清理不正确状态
 
-                         if (startPosition) {
 
-                             return this.selectEnd();
 
-                         }
 
-                         startPosition = e.getPosition(rc).round();
 
-                     },
 
-                     selectMove: function(e) {
 
-                         if (minder.getStatus() == "textedit") {
 
-                             return;
 
-                         }
 
-                         if (!startPosition) return;
 
-                         var p1 = startPosition, p2 = e.getPosition(rc);
 
-                         // 检测是否要进入选区模式
 
-                         if (!marqueeMode) {
 
-                             // 距离没达到阈值,退出
 
-                             if (kity.Vector.fromPoints(p1, p2).length() < MARQUEE_MODE_THRESHOLD) {
 
-                                 return;
 
-                             }
 
-                             // 已经达到阈值,记录下来并且重置选区形状
 
-                             marqueeMode = true;
 
-                             rc.addShape(marqueeShape);
 
-                             marqueeShape.fill(minder.getStyle("marquee-background")).stroke(minder.getStyle("marquee-stroke")).setOpacity(.8).getDrawer().clear();
 
-                         }
 
-                         var marquee = new kity.Box(p1.x, p1.y, p2.x - p1.x, p2.y - p1.y), selectedNodes = [];
 
-                         // 使其犀利
 
-                         marquee.left = Math.round(marquee.left);
 
-                         marquee.top = Math.round(marquee.top);
 
-                         marquee.right = Math.round(marquee.right);
 
-                         marquee.bottom = Math.round(marquee.bottom);
 
-                         // 选区形状更新
 
-                         marqueeShape.getDrawer().pipe(function() {
 
-                             this.clear();
 
-                             this.moveTo(marquee.left, marquee.top);
 
-                             this.lineTo(marquee.right, marquee.top);
 
-                             this.lineTo(marquee.right, marquee.bottom);
 
-                             this.lineTo(marquee.left, marquee.bottom);
 
-                             this.close();
 
-                         });
 
-                         // 计算选中范围
 
-                         minder.getRoot().traverse(function(node) {
 
-                             var renderBox = node.getLayoutBox();
 
-                             if (!renderBox.intersect(marquee).isEmpty()) {
 
-                                 selectedNodes.push(node);
 
-                             }
 
-                         });
 
-                         // 应用选中范围
 
-                         minder.select(selectedNodes, true);
 
-                         // 清除多余的东西
 
-                         window.getSelection().removeAllRanges();
 
-                     },
 
-                     selectEnd: function(e) {
 
-                         if (startPosition) {
 
-                             startPosition = null;
 
-                         }
 
-                         if (marqueeMode) {
 
-                             marqueeShape.fadeOut(200, "ease", 0, function() {
 
-                                 if (marqueeShape.remove) marqueeShape.remove();
 
-                             });
 
-                             marqueeMode = false;
 
-                         }
 
-                     }
 
-                 };
 
-             }();
 
-             var lastDownNode = null, lastDownPosition = null;
 
-             return {
 
-                 init: function() {
 
-                     window.addEventListener("mouseup", function() {
 
-                         marqueeActivator.selectEnd();
 
-                     });
 
-                 },
 
-                 events: {
 
-                     mousedown: function(e) {
 
-                         var downNode = e.getTargetNode();
 
-                         // 没有点中节点:
 
-                         //     清除选中状态,并且标记选区开始位置
 
-                         if (!downNode) {
 
-                             this.removeAllSelectedNodes();
 
-                             marqueeActivator.selectStart(e);
 
-                             this.setStatus("normal");
 
-                         } else if (e.isShortcutKey("Ctrl")) {
 
-                             this.toggleSelect(downNode);
 
-                         } else if (!downNode.isSelected()) {
 
-                             this.select(downNode, true);
 
-                         } else if (!this.isSingleSelect()) {
 
-                             lastDownNode = downNode;
 
-                             lastDownPosition = e.getPosition();
 
-                         }
 
-                     },
 
-                     mousemove: marqueeActivator.selectMove,
 
-                     mouseup: function(e) {
 
-                         var upNode = e.getTargetNode();
 
-                         // 如果 mouseup 发生在 lastDownNode 外,是无需理会的
 
-                         if (upNode && upNode == lastDownNode) {
 
-                             var upPosition = e.getPosition();
 
-                             var movement = kity.Vector.fromPoints(lastDownPosition, upPosition);
 
-                             if (movement.length() < 1) this.select(lastDownNode, true);
 
-                             lastDownNode = null;
 
-                         }
 
-                         // 清理一下选择状态
 
-                         marqueeActivator.selectEnd(e);
 
-                     },
 
-                     //全选操作
 
-                     "normal.keydown": function(e) {
 
-                         if (e.isShortcutKey("ctrl+a")) {
 
-                             var selectedNodes = [];
 
-                             this.getRoot().traverse(function(node) {
 
-                                 selectedNodes.push(node);
 
-                             });
 
-                             this.select(selectedNodes, true);
 
-                             e.preventDefault();
 
-                         }
 
-                     }
 
-                 }
 
-             };
 
-         });
 
-     }
 
- };
 
- //src/module/style.js
 
- _p[60] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         var Renderer = _p.r(27);
 
-         Module.register("StyleModule", function() {
 
-             var styleNames = [ "font-size", "font-family", "font-weight", "font-style", "background", "color" ];
 
-             var styleClipBoard = null;
 
-             function hasStyle(node) {
 
-                 var data = node.getData();
 
-                 for (var i = 0; i < styleNames.length; i++) {
 
-                     if (styleNames[i] in data) return true;
 
-                 }
 
-             }
 
-             return {
 
-                 commands: {
 
-                     /**
 
-                  * @command CopyStyle
 
-                  * @description 拷贝选中节点的当前样式,包括字体、字号、粗体、斜体、背景色、字体色
 
-                  * @state
 
-                  *   0: 当前有选中的节点
 
-                  *  -1: 当前没有选中的节点
 
-                  */
 
-                     copystyle: kity.createClass("CopyStyleCommand", {
 
-                         base: Command,
 
-                         execute: function(minder) {
 
-                             var node = minder.getSelectedNode();
 
-                             var nodeData = node.getData();
 
-                             styleClipBoard = {};
 
-                             styleNames.forEach(function(name) {
 
-                                 if (name in nodeData) styleClipBoard[name] = nodeData[name]; else {
 
-                                     styleClipBoard[name] = null;
 
-                                     delete styleClipBoard[name];
 
-                                 }
 
-                             });
 
-                             return styleClipBoard;
 
-                         },
 
-                         queryState: function(minder) {
 
-                             var nodes = minder.getSelectedNodes();
 
-                             if (nodes.length !== 1) return -1;
 
-                             return hasStyle(nodes[0]) ? 0 : -1;
 
-                         }
 
-                     }),
 
-                     /**
 
-                  * @command PasteStyle
 
-                  * @description 粘贴已拷贝的样式到选中的节点上,包括字体、字号、粗体、斜体、背景色、字体色
 
-                  * @state
 
-                  *   0: 当前有选中的节点,并且已经有复制的样式
 
-                  *  -1: 当前没有选中的节点,或者没有复制的样式
 
-                  */
 
-                     pastestyle: kity.createClass("PastStyleCommand", {
 
-                         base: Command,
 
-                         execute: function(minder) {
 
-                             minder.getSelectedNodes().forEach(function(node) {
 
-                                 for (var name in styleClipBoard) {
 
-                                     if (styleClipBoard.hasOwnProperty(name)) node.setData(name, styleClipBoard[name]);
 
-                                 }
 
-                             });
 
-                             minder.renderNodeBatch(minder.getSelectedNodes());
 
-                             minder.layout(300);
 
-                             return styleClipBoard;
 
-                         },
 
-                         queryState: function(minder) {
 
-                             return styleClipBoard && minder.getSelectedNodes().length ? 0 : -1;
 
-                         }
 
-                     }),
 
-                     /**
 
-                  * @command ClearStyle
 
-                  * @description 移除选中节点的样式,包括字体、字号、粗体、斜体、背景色、字体色
 
-                  * @state
 
-                  *   0: 当前有选中的节点,并且至少有一个设置了至少一种样式
 
-                  *  -1: 其它情况
 
-                  */
 
-                     clearstyle: kity.createClass("ClearStyleCommand", {
 
-                         base: Command,
 
-                         execute: function(minder) {
 
-                             minder.getSelectedNodes().forEach(function(node) {
 
-                                 styleNames.forEach(function(name) {
 
-                                     node.setData(name);
 
-                                 });
 
-                             });
 
-                             minder.renderNodeBatch(minder.getSelectedNodes());
 
-                             minder.layout(300);
 
-                             return styleClipBoard;
 
-                         },
 
-                         queryState: function(minder) {
 
-                             var nodes = minder.getSelectedNodes();
 
-                             if (!nodes.length) return -1;
 
-                             for (var i = 0; i < nodes.length; i++) {
 
-                                 if (hasStyle(nodes[i])) return 0;
 
-                             }
 
-                             return -1;
 
-                         }
 
-                     })
 
-                 }
 
-             };
 
-         });
 
-     }
 
- };
 
- //src/module/text.js
 
- _p[61] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         var Renderer = _p.r(27);
 
-         /**
 
-      * 针对不同系统、不同浏览器、不同字体做居中兼容性处理
 
-      * 暂时未增加Linux的处理
 
-      */
 
-         var FONT_ADJUST = {
 
-             safari: {
 
-                 "微软雅黑,Microsoft YaHei": -.17,
 
-                 "楷体,楷体_GB2312,SimKai": -.1,
 
-                 "隶书, SimLi": -.1,
 
-                 "comic sans ms": -.23,
 
-                 "impact,chicago": -.15,
 
-                 "times new roman": -.1,
 
-                 "arial black,avant garde": -.17,
 
-                 default: 0
 
-             },
 
-             ie: {
 
-                 10: {
 
-                     "微软雅黑,Microsoft YaHei": -.17,
 
-                     "comic sans ms": -.17,
 
-                     "impact,chicago": -.08,
 
-                     "times new roman": .04,
 
-                     "arial black,avant garde": -.17,
 
-                     default: -.15
 
-                 },
 
-                 11: {
 
-                     "微软雅黑,Microsoft YaHei": -.17,
 
-                     "arial,helvetica,sans-serif": -.17,
 
-                     "comic sans ms": -.17,
 
-                     "impact,chicago": -.08,
 
-                     "times new roman": .04,
 
-                     "sans-serif": -.16,
 
-                     "arial black,avant garde": -.17,
 
-                     default: -.15
 
-                 }
 
-             },
 
-             edge: {
 
-                 "微软雅黑,Microsoft YaHei": -.15,
 
-                 "arial,helvetica,sans-serif": -.17,
 
-                 "comic sans ms": -.17,
 
-                 "impact,chicago": -.08,
 
-                 "sans-serif": -.16,
 
-                 "arial black,avant garde": -.17,
 
-                 default: -.15
 
-             },
 
-             sg: {
 
-                 "微软雅黑,Microsoft YaHei": -.15,
 
-                 "arial,helvetica,sans-serif": -.05,
 
-                 "comic sans ms": -.22,
 
-                 "impact,chicago": -.16,
 
-                 "times new roman": -.03,
 
-                 "arial black,avant garde": -.22,
 
-                 default: -.15
 
-             },
 
-             chrome: {
 
-                 Mac: {
 
-                     "andale mono": -.05,
 
-                     "comic sans ms": -.3,
 
-                     "impact,chicago": -.13,
 
-                     "times new roman": -.1,
 
-                     "arial black,avant garde": -.17,
 
-                     default: 0
 
-                 },
 
-                 Win: {
 
-                     "微软雅黑,Microsoft YaHei": -.15,
 
-                     "arial,helvetica,sans-serif": -.02,
 
-                     "arial black,avant garde": -.2,
 
-                     "comic sans ms": -.2,
 
-                     "impact,chicago": -.12,
 
-                     "times new roman": -.02,
 
-                     default: -.15
 
-                 },
 
-                 Lux: {
 
-                     "andale mono": -.05,
 
-                     "comic sans ms": -.3,
 
-                     "impact,chicago": -.13,
 
-                     "times new roman": -.1,
 
-                     "arial black,avant garde": -.17,
 
-                     default: 0
 
-                 }
 
-             },
 
-             firefox: {
 
-                 Mac: {
 
-                     "微软雅黑,Microsoft YaHei": -.2,
 
-                     "宋体,SimSun": .05,
 
-                     "comic sans ms": -.2,
 
-                     "impact,chicago": -.15,
 
-                     "arial black,avant garde": -.17,
 
-                     "times new roman": -.1,
 
-                     default: .05
 
-                 },
 
-                 Win: {
 
-                     "微软雅黑,Microsoft YaHei": -.16,
 
-                     "andale mono": -.17,
 
-                     "arial,helvetica,sans-serif": -.17,
 
-                     "comic sans ms": -.22,
 
-                     "impact,chicago": -.23,
 
-                     "times new roman": -.22,
 
-                     "sans-serif": -.22,
 
-                     "arial black,avant garde": -.17,
 
-                     default: -.16
 
-                 },
 
-                 Lux: {
 
-                     "宋体,SimSun": -.2,
 
-                     "微软雅黑,Microsoft YaHei": -.2,
 
-                     "黑体, SimHei": -.2,
 
-                     "隶书, SimLi": -.2,
 
-                     "楷体,楷体_GB2312,SimKai": -.2,
 
-                     "andale mono": -.2,
 
-                     "arial,helvetica,sans-serif": -.2,
 
-                     "comic sans ms": -.2,
 
-                     "impact,chicago": -.2,
 
-                     "times new roman": -.2,
 
-                     "sans-serif": -.2,
 
-                     "arial black,avant garde": -.2,
 
-                     default: -.16
 
-                 }
 
-             }
 
-         };
 
-         var TextRenderer = kity.createClass("TextRenderer", {
 
-             base: Renderer,
 
-             create: function() {
 
-                 return new kity.Group().setId(utils.uuid("node_text"));
 
-             },
 
-             update: function(textGroup, node) {
 
-                 function getDataOrStyle(name) {
 
-                     return node.getData(name) || node.getStyle(name);
 
-                 }
 
-                 var nodeText = node.getText();
 
-                 var textArr = nodeText ? nodeText.split("\n") : [ " " ];
 
-                 var lineHeight = node.getStyle("line-height");
 
-                 var fontSize = getDataOrStyle("font-size");
 
-                 var fontFamily = getDataOrStyle("font-family") || "default";
 
-                 var height = lineHeight * fontSize * textArr.length - (lineHeight - 1) * fontSize;
 
-                 var yStart = -height / 2;
 
-                 var Browser = kity.Browser;
 
-                 var adjust;
 
-                 if (Browser.chrome || Browser.opera || Browser.bd || Browser.lb === "chrome") {
 
-                     adjust = FONT_ADJUST["chrome"][Browser.platform][fontFamily];
 
-                 } else if (Browser.gecko) {
 
-                     adjust = FONT_ADJUST["firefox"][Browser.platform][fontFamily];
 
-                 } else if (Browser.sg) {
 
-                     adjust = FONT_ADJUST["sg"][fontFamily];
 
-                 } else if (Browser.safari) {
 
-                     adjust = FONT_ADJUST["safari"][fontFamily];
 
-                 } else if (Browser.ie) {
 
-                     adjust = FONT_ADJUST["ie"][Browser.version][fontFamily];
 
-                 } else if (Browser.edge) {
 
-                     adjust = FONT_ADJUST["edge"][fontFamily];
 
-                 } else if (Browser.lb) {
 
-                     // 猎豹浏览器的ie内核兼容性模式下
 
-                     adjust = .9;
 
-                 }
 
-                 textGroup.setTranslate(0, (adjust || 0) * fontSize);
 
-                 var rBox = new kity.Box(), r = Math.round;
 
-                 this.setTextStyle(node, textGroup);
 
-                 var textLength = textArr.length;
 
-                 var textGroupLength = textGroup.getItems().length;
 
-                 var i, ci, textShape, text;
 
-                 if (textLength < textGroupLength) {
 
-                     for (i = textLength, ci; ci = textGroup.getItem(i); ) {
 
-                         textGroup.removeItem(i);
 
-                     }
 
-                 } else if (textLength > textGroupLength) {
 
-                     var growth = textLength - textGroupLength;
 
-                     while (growth--) {
 
-                         textShape = new kity.Text().setAttr("text-rendering", "inherit");
 
-                         if (kity.Browser.ie || kity.Browser.edge) {
 
-                             textShape.setVerticalAlign("top");
 
-                         } else {
 
-                             textShape.setAttr("dominant-baseline", "text-before-edge");
 
-                         }
 
-                         textGroup.addItem(textShape);
 
-                     }
 
-                 }
 
-                 for (i = 0, text, textShape; text = textArr[i], textShape = textGroup.getItem(i); i++) {
 
-                     textShape.setContent(text);
 
-                     if (kity.Browser.ie || kity.Browser.edge) {
 
-                         textShape.fixPosition();
 
-                     }
 
-                 }
 
-                 this.setTextStyle(node, textGroup);
 
-                 var textHash = node.getText() + [ "font-size", "font-name", "font-weight", "font-style" ].map(getDataOrStyle).join("/");
 
-                 if (node._currentTextHash == textHash && node._currentTextGroupBox) return node._currentTextGroupBox;
 
-                 node._currentTextHash = textHash;
 
-                 return function() {
 
-                     textGroup.eachItem(function(i, textShape) {
 
-                         var y = yStart + i * fontSize * lineHeight;
 
-                         textShape.setY(y);
 
-                         var bbox = textShape.getBoundaryBox();
 
-                         rBox = rBox.merge(new kity.Box(0, y, bbox.height && bbox.width || 1, fontSize));
 
-                     });
 
-                     var nBox = new kity.Box(r(rBox.x), r(rBox.y), r(rBox.width), r(rBox.height));
 
-                     node._currentTextGroupBox = nBox;
 
-                     return nBox;
 
-                 };
 
-             },
 
-             setTextStyle: function(node, text) {
 
-                 var hooks = TextRenderer._styleHooks;
 
-                 hooks.forEach(function(hook) {
 
-                     hook(node, text);
 
-                 });
 
-             }
 
-         });
 
-         var TextCommand = kity.createClass({
 
-             base: Command,
 
-             execute: function(minder, text) {
 
-                 var node = minder.getSelectedNode();
 
-                 if (node) {
 
-                     node.setText(text);
 
-                     node.render();
 
-                     minder.layout();
 
-                 }
 
-             },
 
-             queryState: function(minder) {
 
-                 return minder.getSelectedNodes().length == 1 ? 0 : -1;
 
-             },
 
-             queryValue: function(minder) {
 
-                 var node = minder.getSelectedNode();
 
-                 return node ? node.getText() : null;
 
-             }
 
-         });
 
-         utils.extend(TextRenderer, {
 
-             _styleHooks: [],
 
-             registerStyleHook: function(fn) {
 
-                 TextRenderer._styleHooks.push(fn);
 
-             }
 
-         });
 
-         kity.extendClass(MinderNode, {
 
-             getTextGroup: function() {
 
-                 return this.getRenderer("TextRenderer").getRenderShape();
 
-             }
 
-         });
 
-         Module.register("text", {
 
-             commands: {
 
-                 text: TextCommand
 
-             },
 
-             renderers: {
 
-                 center: TextRenderer
 
-             }
 
-         });
 
-         module.exports = TextRenderer;
 
-     }
 
- };
 
- //src/module/view.js
 
- _p[62] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         var Renderer = _p.r(27);
 
-         var ViewDragger = kity.createClass("ViewDragger", {
 
-             constructor: function(minder) {
 
-                 this._minder = minder;
 
-                 this._enabled = false;
 
-                 this._bind();
 
-                 var me = this;
 
-                 this._minder.getViewDragger = function() {
 
-                     return me;
 
-                 };
 
-                 this.setEnabled(false);
 
-             },
 
-             isEnabled: function() {
 
-                 return this._enabled;
 
-             },
 
-             setEnabled: function(value) {
 
-                 var paper = this._minder.getPaper();
 
-                 paper.setStyle("cursor", value ? "pointer" : "default");
 
-                 paper.setStyle("cursor", value ? "-webkit-grab" : "default");
 
-                 this._enabled = value;
 
-             },
 
-             timeline: function() {
 
-                 return this._moveTimeline;
 
-             },
 
-             move: function(offset, duration) {
 
-                 var minder = this._minder;
 
-                 var targetPosition = this.getMovement().offset(offset);
 
-                 this.moveTo(targetPosition, duration);
 
-             },
 
-             moveTo: function(position, duration) {
 
-                 if (duration) {
 
-                     var dragger = this;
 
-                     if (this._moveTimeline) this._moveTimeline.stop();
 
-                     this._moveTimeline = this._minder.getRenderContainer().animate(new kity.Animator(this.getMovement(), position, function(target, value) {
 
-                         dragger.moveTo(value);
 
-                     }), duration, "easeOutCubic").timeline();
 
-                     this._moveTimeline.on("finish", function() {
 
-                         dragger._moveTimeline = null;
 
-                     });
 
-                     return this;
 
-                 }
 
-                 this._minder.getRenderContainer().setTranslate(position.round());
 
-                 this._minder.fire("viewchange");
 
-             },
 
-             getMovement: function() {
 
-                 var translate = this._minder.getRenderContainer().transform.translate;
 
-                 return translate ? translate[0] : new kity.Point();
 
-             },
 
-             getView: function() {
 
-                 var minder = this._minder;
 
-                 var c = minder._lastClientSize || {
 
-                     width: minder.getRenderTarget().clientWidth,
 
-                     height: minder.getRenderTarget().clientHeight
 
-                 };
 
-                 var m = this.getMovement();
 
-                 var box = new kity.Box(0, 0, c.width, c.height);
 
-                 var viewMatrix = minder.getPaper().getViewPortMatrix();
 
-                 return viewMatrix.inverse().translate(-m.x, -m.y).transformBox(box);
 
-             },
 
-             _bind: function() {
 
-                 var dragger = this, isTempDrag = false, lastPosition = null, currentPosition = null;
 
-                 function dragEnd(e) {
 
-                     if (!lastPosition) return;
 
-                     lastPosition = null;
 
-                     e.stopPropagation();
 
-                     // 临时拖动需要还原状态
 
-                     if (isTempDrag) {
 
-                         dragger.setEnabled(false);
 
-                         isTempDrag = false;
 
-                         if (dragger._minder.getStatus() == "hand") dragger._minder.rollbackStatus();
 
-                     }
 
-                     var paper = dragger._minder.getPaper();
 
-                     paper.setStyle("cursor", dragger._minder.getStatus() == "hand" ? "-webkit-grab" : "default");
 
-                     dragger._minder.fire("viewchanged");
 
-                 }
 
-                 this._minder.on("normal.mousedown normal.touchstart " + "inputready.mousedown inputready.touchstart " + "readonly.mousedown readonly.touchstart", function(e) {
 
-                     if (e.originEvent.button == 2) {
 
-                         e.originEvent.preventDefault();
 
-                     }
 
-                     // 点击未选中的根节点临时开启
 
-                     if (e.getTargetNode() == this.getRoot() || e.originEvent.button == 2 || e.originEvent.altKey) {
 
-                         lastPosition = e.getPosition("view");
 
-                         isTempDrag = true;
 
-                     }
 
-                 }).on("normal.mousemove normal.touchmove " + "readonly.mousemove readonly.touchmove " + "inputready.mousemove inputready.touchmove", function(e) {
 
-                     if (e.type == "touchmove") {
 
-                         e.preventDefault();
 
-                     }
 
-                     if (!isTempDrag) return;
 
-                     var offset = kity.Vector.fromPoints(lastPosition, e.getPosition("view"));
 
-                     if (offset.length() > 10) {
 
-                         this.setStatus("hand", true);
 
-                         var paper = dragger._minder.getPaper();
 
-                         paper.setStyle("cursor", "-webkit-grabbing");
 
-                     }
 
-                 }).on("hand.beforemousedown hand.beforetouchstart", function(e) {
 
-                     // 已经被用户打开拖放模式
 
-                     if (dragger.isEnabled()) {
 
-                         lastPosition = e.getPosition("view");
 
-                         e.stopPropagation();
 
-                         var paper = dragger._minder.getPaper();
 
-                         paper.setStyle("cursor", "-webkit-grabbing");
 
-                     }
 
-                 }).on("hand.beforemousemove hand.beforetouchmove", function(e) {
 
-                     if (lastPosition) {
 
-                         currentPosition = e.getPosition("view");
 
-                         // 当前偏移加上历史偏移
 
-                         var offset = kity.Vector.fromPoints(lastPosition, currentPosition);
 
-                         dragger.move(offset);
 
-                         e.stopPropagation();
 
-                         e.preventDefault();
 
-                         e.originEvent.preventDefault();
 
-                         lastPosition = currentPosition;
 
-                     }
 
-                 }).on("mouseup touchend", dragEnd);
 
-                 window.addEventListener("mouseup", dragEnd);
 
-                 this._minder.on("contextmenu", function(e) {
 
-                     e.preventDefault();
 
-                 });
 
-             }
 
-         });
 
-         Module.register("View", function() {
 
-             var km = this;
 
-             /**
 
-          * @command Hand
 
-          * @description 切换抓手状态,抓手状态下,鼠标拖动将拖动视野,而不是创建选区
 
-          * @state
 
-          *   0: 当前不是抓手状态
 
-          *   1: 当前是抓手状态
 
-          */
 
-             var ToggleHandCommand = kity.createClass("ToggleHandCommand", {
 
-                 base: Command,
 
-                 execute: function(minder) {
 
-                     if (minder.getStatus() != "hand") {
 
-                         minder.setStatus("hand", true);
 
-                     } else {
 
-                         minder.rollbackStatus();
 
-                     }
 
-                     this.setContentChanged(false);
 
-                 },
 
-                 queryState: function(minder) {
 
-                     return minder.getStatus() == "hand" ? 1 : 0;
 
-                 },
 
-                 enableReadOnly: true
 
-             });
 
-             /**
 
-          * @command Camera
 
-          * @description 设置当前视野的中心位置到某个节点上
 
-          * @param {kityminder.MinderNode} focusNode 要定位的节点
 
-          * @param {number} duration 设置视野移动的动画时长(单位 ms),设置为 0 不使用动画
 
-          * @state
 
-          *   0: 始终可用
 
-          */
 
-             var CameraCommand = kity.createClass("CameraCommand", {
 
-                 base: Command,
 
-                 execute: function(km, focusNode) {
 
-                     focusNode = focusNode || km.getRoot();
 
-                     var viewport = km.getPaper().getViewPort();
 
-                     var offset = focusNode.getRenderContainer().getRenderBox("view");
 
-                     var dx = viewport.center.x - offset.x - offset.width / 2, dy = viewport.center.y - offset.y;
 
-                     var dragger = km._viewDragger;
 
-                     var duration = km.getOption("viewAnimationDuration");
 
-                     dragger.move(new kity.Point(dx, dy), duration);
 
-                     this.setContentChanged(false);
 
-                 },
 
-                 enableReadOnly: true
 
-             });
 
-             /**
 
-          * @command Move
 
-          * @description 指定方向移动当前视野
 
-          * @param {string} dir 移动方向
 
-          *    取值为 'left',视野向左移动一半
 
-          *    取值为 'right',视野向右移动一半
 
-          *    取值为 'up',视野向上移动一半
 
-          *    取值为 'down',视野向下移动一半
 
-          * @param {number} duration 视野移动的动画时长(单位 ms),设置为 0 不使用动画
 
-          * @state
 
-          *   0: 始终可用
 
-          */
 
-             var MoveCommand = kity.createClass("MoveCommand", {
 
-                 base: Command,
 
-                 execute: function(km, dir) {
 
-                     var dragger = km._viewDragger;
 
-                     var size = km._lastClientSize;
 
-                     var duration = km.getOption("viewAnimationDuration");
 
-                     switch (dir) {
 
-                       case "up":
 
-                         dragger.move(new kity.Point(0, size.height / 2), duration);
 
-                         break;
 
-                       case "down":
 
-                         dragger.move(new kity.Point(0, -size.height / 2), duration);
 
-                         break;
 
-                       case "left":
 
-                         dragger.move(new kity.Point(size.width / 2, 0), duration);
 
-                         break;
 
-                       case "right":
 
-                         dragger.move(new kity.Point(-size.width / 2, 0), duration);
 
-                         break;
 
-                     }
 
-                 },
 
-                 enableReadOnly: true
 
-             });
 
-             return {
 
-                 init: function() {
 
-                     this._viewDragger = new ViewDragger(this);
 
-                 },
 
-                 commands: {
 
-                     hand: ToggleHandCommand,
 
-                     camera: CameraCommand,
 
-                     move: MoveCommand
 
-                 },
 
-                 events: {
 
-                     statuschange: function(e) {
 
-                         this._viewDragger.setEnabled(e.currentStatus == "hand");
 
-                     },
 
-                     mousewheel: function(e) {
 
-                         var dx, dy;
 
-                         e = e.originEvent;
 
-                         if (e.ctrlKey || e.shiftKey) return;
 
-                         if ("wheelDeltaX" in e) {
 
-                             dx = e.wheelDeltaX || 0;
 
-                             dy = e.wheelDeltaY || 0;
 
-                         } else {
 
-                             dx = 0;
 
-                             dy = e.wheelDelta;
 
-                         }
 
-                         this._viewDragger.move({
 
-                             x: dx / 2.5,
 
-                             y: dy / 2.5
 
-                         });
 
-                         var me = this;
 
-                         clearTimeout(this._mousewheeltimer);
 
-                         this._mousewheeltimer = setTimeout(function() {
 
-                             me.fire("viewchanged");
 
-                         }, 100);
 
-                         e.preventDefault();
 
-                     },
 
-                     "normal.dblclick readonly.dblclick": function(e) {
 
-                         if (e.kityEvent.targetShape instanceof kity.Paper) {
 
-                             this.execCommand("camera", this.getRoot(), 800);
 
-                         }
 
-                     },
 
-                     "paperrender finishInitHook": function() {
 
-                         if (!this.getRenderTarget()) {
 
-                             return;
 
-                         }
 
-                         this.execCommand("camera", null, 0);
 
-                         this._lastClientSize = {
 
-                             width: this.getRenderTarget().clientWidth,
 
-                             height: this.getRenderTarget().clientHeight
 
-                         };
 
-                     },
 
-                     resize: function(e) {
 
-                         var a = {
 
-                             width: this.getRenderTarget().clientWidth,
 
-                             height: this.getRenderTarget().clientHeight
 
-                         }, b = this._lastClientSize;
 
-                         this._viewDragger.move(new kity.Point((a.width - b.width) / 2 | 0, (a.height - b.height) / 2 | 0));
 
-                         this._lastClientSize = a;
 
-                     },
 
-                     "selectionchange layoutallfinish": function(e) {
 
-                         var selected = this.getSelectedNode();
 
-                         var minder = this;
 
-                         /*
 
-                     * Added by zhangbobell 2015.9.9
 
-                     * windows 10 的 edge 浏览器在全部动画停止后,优先级图标不显示 text,
 
-                     * 因此再次触发一次 render 事件,让浏览器重绘
 
-                     * */
 
-                         if (kity.Browser.edge) {
 
-                             this.fire("paperrender");
 
-                         }
 
-                         if (!selected) return;
 
-                         var dragger = this._viewDragger;
 
-                         var timeline = dragger.timeline();
 
-                         /*
 
-                     * Added by zhangbobell 2015.09.25
 
-                     * 如果之前有动画,那么就先暂时返回,等之前动画结束之后再次执行本函数
 
-                     * 以防止 view 动画变动了位置,导致本函数执行的时候位置计算不对
 
-                     *
 
-                     * fixed bug : 初始化的时候中心节点位置不固定(有的时候在左上角,有的时候在中心)
 
-                     * */
 
-                         if (timeline) {
 
-                             timeline.on("finish", function() {
 
-                                 minder.fire("selectionchange");
 
-                             });
 
-                             return;
 
-                         }
 
-                         var view = dragger.getView();
 
-                         var focus = selected.getLayoutBox();
 
-                         var space = 50;
 
-                         var dx = 0, dy = 0;
 
-                         if (focus.right > view.right) {
 
-                             dx += view.right - focus.right - space;
 
-                         } else if (focus.left < view.left) {
 
-                             dx += view.left - focus.left + space;
 
-                         }
 
-                         if (focus.bottom > view.bottom) {
 
-                             dy += view.bottom - focus.bottom - space;
 
-                         }
 
-                         if (focus.top < view.top) {
 
-                             dy += view.top - focus.top + space;
 
-                         }
 
-                         if (dx || dy) dragger.move(new kity.Point(dx, dy), 100);
 
-                     }
 
-                 }
 
-             };
 
-         });
 
-     }
 
- };
 
- //src/module/zoom.js
 
- _p[63] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var utils = _p.r(33);
 
-         var Minder = _p.r(19);
 
-         var MinderNode = _p.r(21);
 
-         var Command = _p.r(9);
 
-         var Module = _p.r(20);
 
-         var Renderer = _p.r(27);
 
-         Module.register("Zoom", function() {
 
-             var me = this;
 
-             var timeline;
 
-             function setTextRendering() {
 
-                 var value = me._zoomValue >= 100 ? "optimize-speed" : "geometricPrecision";
 
-                 me.getRenderContainer().setAttr("text-rendering", value);
 
-             }
 
-             function fixPaperCTM(paper) {
 
-                 var node = paper.shapeNode;
 
-                 var ctm = node.getCTM();
 
-                 var matrix = new kity.Matrix(ctm.a, ctm.b, ctm.c, ctm.d, (ctm.e | 0) + .5, (ctm.f | 0) + .5);
 
-                 node.setAttribute("transform", "matrix(" + matrix.toString() + ")");
 
-             }
 
-             kity.extendClass(Minder, {
 
-                 zoom: function(value) {
 
-                     var paper = this.getPaper();
 
-                     var viewport = paper.getViewPort();
 
-                     viewport.zoom = value / 100;
 
-                     viewport.center = {
 
-                         x: viewport.center.x,
 
-                         y: viewport.center.y
 
-                     };
 
-                     paper.setViewPort(viewport);
 
-                     if (value == 100) fixPaperCTM(paper);
 
-                 },
 
-                 getZoomValue: function() {
 
-                     return this._zoomValue;
 
-                 }
 
-             });
 
-             function zoomMinder(minder, value) {
 
-                 var paper = minder.getPaper();
 
-                 var viewport = paper.getViewPort();
 
-                 if (!value) return;
 
-                 setTextRendering();
 
-                 var duration = minder.getOption("zoomAnimationDuration");
 
-                 if (minder.getRoot().getComplex() > 200 || !duration) {
 
-                     minder._zoomValue = value;
 
-                     minder.zoom(value);
 
-                     minder.fire("viewchange");
 
-                 } else {
 
-                     var animator = new kity.Animator({
 
-                         beginValue: minder._zoomValue,
 
-                         finishValue: value,
 
-                         setter: function(target, value) {
 
-                             target.zoom(value);
 
-                         }
 
-                     });
 
-                     minder._zoomValue = value;
 
-                     if (timeline) {
 
-                         timeline.pause();
 
-                     }
 
-                     timeline = animator.start(minder, duration, "easeInOutSine");
 
-                     timeline.on("finish", function() {
 
-                         minder.fire("viewchange");
 
-                     });
 
-                 }
 
-                 minder.fire("zoom", {
 
-                     zoom: value
 
-                 });
 
-             }
 
-             /**
 
-          * @command Zoom
 
-          * @description 缩放当前的视野到一定的比例(百分比)
 
-          * @param {number} value 设置的比例,取值 100 则为原尺寸
 
-          * @state
 
-          *   0: 始终可用
 
-          */
 
-             var ZoomCommand = kity.createClass("Zoom", {
 
-                 base: Command,
 
-                 execute: zoomMinder,
 
-                 queryValue: function(minder) {
 
-                     return minder._zoomValue;
 
-                 }
 
-             });
 
-             /**
 
-          * @command ZoomIn
 
-          * @description 放大当前的视野到下一个比例等级(百分比)
 
-          * @shortcut =
 
-          * @state
 
-          *   0: 如果当前脑图的配置中还有下一个比例等级
 
-          *  -1: 其它情况
 
-          */
 
-             var ZoomInCommand = kity.createClass("ZoomInCommand", {
 
-                 base: Command,
 
-                 execute: function(minder) {
 
-                     zoomMinder(minder, this.nextValue(minder));
 
-                 },
 
-                 queryState: function(minder) {
 
-                     return +!this.nextValue(minder);
 
-                 },
 
-                 nextValue: function(minder) {
 
-                     var stack = minder.getOption("zoom"), i;
 
-                     for (i = 0; i < stack.length; i++) {
 
-                         if (stack[i] > minder._zoomValue) return stack[i];
 
-                     }
 
-                     return 0;
 
-                 },
 
-                 enableReadOnly: true
 
-             });
 
-             /**
 
-          * @command ZoomOut
 
-          * @description 缩小当前的视野到上一个比例等级(百分比)
 
-          * @shortcut -
 
-          * @state
 
-          *   0: 如果当前脑图的配置中还有上一个比例等级
 
-          *  -1: 其它情况
 
-          */
 
-             var ZoomOutCommand = kity.createClass("ZoomOutCommand", {
 
-                 base: Command,
 
-                 execute: function(minder) {
 
-                     zoomMinder(minder, this.nextValue(minder));
 
-                 },
 
-                 queryState: function(minder) {
 
-                     return +!this.nextValue(minder);
 
-                 },
 
-                 nextValue: function(minder) {
 
-                     var stack = minder.getOption("zoom"), i;
 
-                     for (i = stack.length - 1; i >= 0; i--) {
 
-                         if (stack[i] < minder._zoomValue) return stack[i];
 
-                     }
 
-                     return 0;
 
-                 },
 
-                 enableReadOnly: true
 
-             });
 
-             return {
 
-                 init: function() {
 
-                     this._zoomValue = 100;
 
-                     this.setDefaultOptions({
 
-                         zoom: [ 10, 20, 50, 100, 200 ]
 
-                     });
 
-                     setTextRendering();
 
-                 },
 
-                 commands: {
 
-                     zoomin: ZoomInCommand,
 
-                     zoomout: ZoomOutCommand,
 
-                     zoom: ZoomCommand
 
-                 },
 
-                 events: {
 
-                     "normal.mousewheel readonly.mousewheel": function(e) {
 
-                         if (!e.originEvent.ctrlKey && !e.originEvent.metaKey) return;
 
-                         var delta = e.originEvent.wheelDelta;
 
-                         var me = this;
 
-                         // 稀释
 
-                         if (Math.abs(delta) > 100) {
 
-                             clearTimeout(this._wheelZoomTimeout);
 
-                         } else {
 
-                             return;
 
-                         }
 
-                         this._wheelZoomTimeout = setTimeout(function() {
 
-                             var value;
 
-                             var lastValue = me.getPaper()._zoom || 1;
 
-                             if (delta > 0) {
 
-                                 me.execCommand("zoomin");
 
-                             } else if (delta < 0) {
 
-                                 me.execCommand("zoomout");
 
-                             }
 
-                         }, 100);
 
-                         e.originEvent.preventDefault();
 
-                     }
 
-                 },
 
-                 commandShortcutKeys: {
 
-                     zoomin: "ctrl+=",
 
-                     zoomout: "ctrl+-"
 
-                 }
 
-             };
 
-         });
 
-     }
 
- };
 
- //src/protocol/json.js
 
- _p[64] = {
 
-     value: function(require, exports, module) {
 
-         var data = _p.r(12);
 
-         data.registerProtocol("json", module.exports = {
 
-             fileDescription: "KityMinder 格式",
 
-             fileExtension: ".km",
 
-             dataType: "text",
 
-             mineType: "application/json",
 
-             encode: function(json) {
 
-                 return JSON.stringify(json);
 
-             },
 
-             decode: function(local) {
 
-                 return JSON.parse(local);
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/protocol/markdown.js
 
- _p[65] = {
 
-     value: function(require, exports, module) {
 
-         var data = _p.r(12);
 
-         var LINE_ENDING_SPLITER = /\r\n|\r|\n/;
 
-         var EMPTY_LINE = "";
 
-         var NOTE_MARK_START = "\x3c!--Note--\x3e";
 
-         var NOTE_MARK_CLOSE = "\x3c!--/Note--\x3e";
 
-         function encode(json) {
 
-             return _build(json, 1).join("\n");
 
-         }
 
-         function _build(node, level) {
 
-             var lines = [];
 
-             level = level || 1;
 
-             var sharps = _generateHeaderSharp(level);
 
-             lines.push(sharps + " " + node.data.text);
 
-             lines.push(EMPTY_LINE);
 
-             var note = node.data.note;
 
-             if (note) {
 
-                 var hasSharp = /^#/.test(note);
 
-                 if (hasSharp) {
 
-                     lines.push(NOTE_MARK_START);
 
-                     note = note.replace(/^#+/gm, function($0) {
 
-                         return sharps + $0;
 
-                     });
 
-                 }
 
-                 lines.push(note);
 
-                 if (hasSharp) {
 
-                     lines.push(NOTE_MARK_CLOSE);
 
-                 }
 
-                 lines.push(EMPTY_LINE);
 
-             }
 
-             if (node.children) node.children.forEach(function(child) {
 
-                 lines = lines.concat(_build(child, level + 1));
 
-             });
 
-             return lines;
 
-         }
 
-         function _generateHeaderSharp(level) {
 
-             var sharps = "";
 
-             while (level--) sharps += "#";
 
-             return sharps;
 
-         }
 
-         function decode(markdown) {
 
-             var json, parentMap = {}, lines, line, lineInfo, level, node, parent, noteProgress, codeBlock;
 
-             // 一级标题转换 `{title}\n===` => `# {title}`
 
-             markdown = markdown.replace(/^(.+)\n={3,}/, function($0, $1) {
 
-                 return "# " + $1;
 
-             });
 
-             lines = markdown.split(LINE_ENDING_SPLITER);
 
-             // 按行分析
 
-             for (var i = 0; i < lines.length; i++) {
 
-                 line = lines[i];
 
-                 lineInfo = _resolveLine(line);
 
-                 // 备注标记处理
 
-                 if (lineInfo.noteClose) {
 
-                     noteProgress = false;
 
-                     continue;
 
-                 } else if (lineInfo.noteStart) {
 
-                     noteProgress = true;
 
-                     continue;
 
-                 }
 
-                 // 代码块处理
 
-                 codeBlock = lineInfo.codeBlock ? !codeBlock : codeBlock;
 
-                 // 备注条件:备注标签中,非标题定义,或标题越位
 
-                 if (noteProgress || codeBlock || !lineInfo.level || lineInfo.level > level + 1) {
 
-                     if (node) _pushNote(node, line);
 
-                     continue;
 
-                 }
 
-                 // 标题处理
 
-                 level = lineInfo.level;
 
-                 node = _initNode(lineInfo.content, parentMap[level - 1]);
 
-                 parentMap[level] = node;
 
-             }
 
-             _cleanUp(parentMap[1]);
 
-             return parentMap[1];
 
-         }
 
-         function _initNode(text, parent) {
 
-             var node = {
 
-                 data: {
 
-                     text: text,
 
-                     note: ""
 
-                 }
 
-             };
 
-             if (parent) {
 
-                 if (parent.children) parent.children.push(node); else parent.children = [ node ];
 
-             }
 
-             return node;
 
-         }
 
-         function _pushNote(node, line) {
 
-             node.data.note += line + "\n";
 
-         }
 
-         function _isEmpty(line) {
 
-             return !/\S/.test(line);
 
-         }
 
-         function _resolveLine(line) {
 
-             var match = /^(#+)?\s*(.*)$/.exec(line);
 
-             return {
 
-                 level: match[1] && match[1].length || null,
 
-                 content: match[2],
 
-                 noteStart: line == NOTE_MARK_START,
 
-                 noteClose: line == NOTE_MARK_CLOSE,
 
-                 codeBlock: /^\s*```/.test(line)
 
-             };
 
-         }
 
-         function _cleanUp(node) {
 
-             if (!/\S/.test(node.data.note)) {
 
-                 node.data.note = null;
 
-                 delete node.data.note;
 
-             } else {
 
-                 var notes = node.data.note.split("\n");
 
-                 while (notes.length && !/\S/.test(notes[0])) notes.shift();
 
-                 while (notes.length && !/\S/.test(notes[notes.length - 1])) notes.pop();
 
-                 node.data.note = notes.join("\n");
 
-             }
 
-             if (node.children) node.children.forEach(_cleanUp);
 
-         }
 
-         data.registerProtocol("markdown", module.exports = {
 
-             fileDescription: "Markdown/GFM 格式",
 
-             fileExtension: ".md",
 
-             mineType: "text/markdown",
 
-             dataType: "text",
 
-             encode: function(json) {
 
-                 return encode(json.root);
 
-             },
 
-             decode: function(markdown) {
 
-                 return decode(markdown);
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/protocol/png.js
 
- _p[66] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var data = _p.r(12);
 
-         var Promise = _p.r(25);
 
-         var DomURL = window.URL || window.webkitURL || window;
 
-         function loadImage(info, callback) {
 
-             return new Promise(function(resolve, reject) {
 
-                 var image = document.createElement("img");
 
-                 image.onload = function() {
 
-                     resolve({
 
-                         element: this,
 
-                         x: info.x,
 
-                         y: info.y,
 
-                         width: info.width,
 
-                         height: info.height
 
-                     });
 
-                 };
 
-                 image.onerror = function(err) {
 
-                     reject(err);
 
-                 };
 
-                 image.crossOrigin = "anonymous";
 
-                 image.src = info.url;
 
-             });
 
-         }
 
-         /**
 
-      * xhrLoadImage: 通过 xhr 加载保存在 BOS 上的图片
 
-      * @note: BOS 上的 CORS 策略是取 headers 里面的 Origin 字段进行判断
 
-      *        而通过 image 的 src 的方式是无法传递 origin 的,因此需要通过 xhr 进行
 
-      */
 
-         function xhrLoadImage(info, callback) {
 
-             return Promise(function(resolve, reject) {
 
-                 var xmlHttp = new XMLHttpRequest();
 
-                 xmlHttp.open("GET", info.url + "?_=" + Date.now(), true);
 
-                 xmlHttp.responseType = "blob";
 
-                 xmlHttp.onreadystatechange = function() {
 
-                     if (xmlHttp.readyState === 4 && xmlHttp.status === 200) {
 
-                         var blob = xmlHttp.response;
 
-                         var image = document.createElement("img");
 
-                         image.src = DomURL.createObjectURL(blob);
 
-                         image.onload = function() {
 
-                             DomURL.revokeObjectURL(image.src);
 
-                             resolve({
 
-                                 element: image,
 
-                                 x: info.x,
 
-                                 y: info.y,
 
-                                 width: info.width,
 
-                                 height: info.height
 
-                             });
 
-                         };
 
-                     }
 
-                 };
 
-                 xmlHttp.send();
 
-             });
 
-         }
 
-         function getSVGInfo(minder) {
 
-             var paper = minder.getPaper(), paperTransform, domContainer = paper.container, svgXml, svgContainer, svgDom, renderContainer = minder.getRenderContainer(), renderBox = renderContainer.getRenderBox(), width = renderBox.width + 1, height = renderBox.height + 1, blob, svgUrl, img;
 
-             // 保存原始变换,并且移动到合适的位置
 
-             paperTransform = paper.shapeNode.getAttribute("transform");
 
-             paper.shapeNode.setAttribute("transform", "translate(0.5, 0.5)");
 
-             renderContainer.translate(-renderBox.x, -renderBox.y);
 
-             // 获取当前的 XML 代码
 
-             svgXml = paper.container.innerHTML;
 
-             // 回复原始变换及位置
 
-             renderContainer.translate(renderBox.x, renderBox.y);
 
-             paper.shapeNode.setAttribute("transform", paperTransform);
 
-             // 过滤内容
 
-             svgContainer = document.createElement("div");
 
-             svgContainer.innerHTML = svgXml;
 
-             svgDom = svgContainer.querySelector("svg");
 
-             svgDom.setAttribute("width", renderBox.width + 1);
 
-             svgDom.setAttribute("height", renderBox.height + 1);
 
-             svgDom.setAttribute("style", 'font-family: Arial, "Microsoft Yahei","Heiti SC";');
 
-             svgContainer = document.createElement("div");
 
-             svgContainer.appendChild(svgDom);
 
-             svgXml = svgContainer.innerHTML;
 
-             // Dummy IE
 
-             svgXml = svgXml.replace(' xmlns="http://www.w3.org/2000/svg" ' + 'xmlns:NS1="" NS1:ns1:xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:NS2="" NS2:xmlns:ns1=""', "");
 
-             // svg 含有   符号导出报错 Entity 'nbsp' not defined ,含有控制字符触发Load Image 会触发报错
 
-             svgXml = svgXml.replace(/ |[\x00-\x1F\x7F-\x9F]/g, "");
 
-             // fix title issue in safari
 
-             // @ http://stackoverflow.com/questions/30273775/namespace-prefix-ns1-for-href-on-tagelement-is-not-defined-setattributens
 
-             svgXml = svgXml.replace(/NS\d+:title/gi, "xlink:title");
 
-             blob = new Blob([ svgXml ], {
 
-                 type: "image/svg+xml"
 
-             });
 
-             svgUrl = DomURL.createObjectURL(blob);
 
-             //svgUrl = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(svgXml);
 
-             var imagesInfo = [];
 
-             // 遍历取出图片信息
 
-             traverse(minder.getRoot());
 
-             function traverse(node) {
 
-                 var nodeData = node.data;
 
-                 if (nodeData.image) {
 
-                     minder.renderNode(node);
 
-                     var nodeData = node.data;
 
-                     var imageUrl = nodeData.image;
 
-                     var imageSize = nodeData.imageSize;
 
-                     var imageRenderBox = node.getRenderBox("ImageRenderer", minder.getRenderContainer());
 
-                     var imageInfo = {
 
-                         url: imageUrl,
 
-                         width: imageSize.width,
 
-                         height: imageSize.height,
 
-                         x: -renderContainer.getBoundaryBox().x + imageRenderBox.x,
 
-                         y: -renderContainer.getBoundaryBox().y + imageRenderBox.y
 
-                     };
 
-                     imagesInfo.push(imageInfo);
 
-                 }
 
-                 // 若节点折叠,则直接返回
 
-                 if (nodeData.expandState === "collapse") {
 
-                     return;
 
-                 }
 
-                 var children = node.getChildren();
 
-                 for (var i = 0; i < children.length; i++) {
 
-                     traverse(children[i]);
 
-                 }
 
-             }
 
-             return {
 
-                 width: width,
 
-                 height: height,
 
-                 dataUrl: svgUrl,
 
-                 xml: svgXml,
 
-                 imagesInfo: imagesInfo
 
-             };
 
-         }
 
-         function encode(json, minder, option) {
 
-             var resultCallback;
 
-             /* 绘制 PNG 的画布及上下文 */
 
-             var canvas = document.createElement("canvas");
 
-             var ctx = canvas.getContext("2d");
 
-             /* 尝试获取背景图片 URL 或背景颜色 */
 
-             var bgDeclare = minder.getStyle("background").toString();
 
-             var bgUrl = /url\(\"(.+)\"\)/.exec(bgDeclare);
 
-             var bgColor = kity.Color.parse(bgDeclare);
 
-             /* 获取 SVG 文件内容 */
 
-             var svgInfo = getSVGInfo(minder);
 
-             var width = option && option.width && option.width > svgInfo.width ? option.width : svgInfo.width;
 
-             var height = option && option.height && option.height > svgInfo.height ? option.height : svgInfo.height;
 
-             var offsetX = option && option.width && option.width > svgInfo.width ? (option.width - svgInfo.width) / 2 : 0;
 
-             var offsetY = option && option.height && option.height > svgInfo.height ? (option.height - svgInfo.height) / 2 : 0;
 
-             var svgDataUrl = svgInfo.dataUrl;
 
-             var imagesInfo = svgInfo.imagesInfo;
 
-             /* 画布的填充大小 */
 
-             var padding = 20;
 
-             canvas.width = width + padding * 2;
 
-             canvas.height = height + padding * 2;
 
-             function fillBackground(ctx, style) {
 
-                 ctx.save();
 
-                 ctx.fillStyle = style;
 
-                 ctx.fillRect(0, 0, canvas.width, canvas.height);
 
-                 ctx.restore();
 
-             }
 
-             function drawImage(ctx, image, x, y, width, height) {
 
-                 if (width && height) {
 
-                     ctx.drawImage(image, x + padding, y + padding, width, height);
 
-                 } else {
 
-                     ctx.drawImage(image, x + padding, y + padding);
 
-                 }
 
-             }
 
-             function generateDataUrl(canvas) {
 
-                 return canvas.toDataURL("image/png");
 
-             }
 
-             // 加载节点上的图片
 
-             function loadImages(imagesInfo) {
 
-                 var imagePromises = imagesInfo.map(function(imageInfo) {
 
-                     return xhrLoadImage(imageInfo);
 
-                 });
 
-                 return Promise.all(imagePromises);
 
-             }
 
-             function drawSVG() {
 
-                 var svgData = {
 
-                     url: svgDataUrl
 
-                 };
 
-                 return loadImage(svgData).then(function($image) {
 
-                     drawImage(ctx, $image.element, offsetX, offsetY, $image.width, $image.height);
 
-                     return loadImages(imagesInfo);
 
-                 }).then(function($images) {
 
-                     for (var i = 0; i < $images.length; i++) {
 
-                         drawImage(ctx, $images[i].element, $images[i].x + offsetX, $images[i].y + offsetY, $images[i].width, $images[i].height);
 
-                     }
 
-                     DomURL.revokeObjectURL(svgDataUrl);
 
-                     document.body.appendChild(canvas);
 
-                     var pngBase64 = generateDataUrl(canvas);
 
-                     document.body.removeChild(canvas);
 
-                     return pngBase64;
 
-                 }, function(err) {
 
-                     // 这里处理 reject,出错基本上是因为跨域,
 
-                     // 出错后依然导出,只不过没有图片。
 
-                     alert("脑图的节点中包含跨域图片,导出的 png 中节点图片不显示,你可以替换掉这些跨域的图片并重试。");
 
-                     DomURL.revokeObjectURL(svgDataUrl);
 
-                     document.body.appendChild(canvas);
 
-                     var pngBase64 = generateDataUrl(canvas);
 
-                     document.body.removeChild(canvas);
 
-                     return pngBase64;
 
-                 });
 
-             }
 
-             if (bgUrl) {
 
-                 var bgInfo = {
 
-                     url: bgUrl[1]
 
-                 };
 
-                 return loadImage(bgInfo).then(function($image) {
 
-                     fillBackground(ctx, ctx.createPattern($image.element, "repeat"));
 
-                     return drawSVG();
 
-                 });
 
-             } else {
 
-                 fillBackground(ctx, bgColor.toString());
 
-                 return drawSVG();
 
-             }
 
-         }
 
-         data.registerProtocol("png", module.exports = {
 
-             fileDescription: "PNG 图片",
 
-             fileExtension: ".png",
 
-             mineType: "image/png",
 
-             dataType: "base64",
 
-             encode: encode
 
-         });
 
-     }
 
- };
 
- //src/protocol/svg.js
 
- _p[67] = {
 
-     value: function(require, exports, module) {
 
-         var data = _p.r(12);
 
-         /**
 
-      * 导出svg时删除全部svg元素中的transform
 
-      * @auth Naixor
 
-      * @method removeTransform
 
-      * @param  {[type]}        svgDom [description]
 
-      * @return {[type]}               [description]
 
-      */
 
-         function cleanSVG(svgDom, x, y) {
 
-             function getTransformToElement(target, source) {
 
-                 var matrix;
 
-                 try {
 
-                     matrix = source.getScreenCTM().inverse();
 
-                 } catch (e) {
 
-                     throw new Error("Can not inverse source element' ctm.");
 
-                 }
 
-                 return matrix.multiply(target.getScreenCTM());
 
-             }
 
-             function dealWithPath(d, dealWithPattern) {
 
-                 if (!(dealWithPattern instanceof Function)) {
 
-                     dealWithPattern = function() {};
 
-                 }
 
-                 var strArr = [], pattern = [], cache = [];
 
-                 for (var i = 0, l = d.length; i < l; i++) {
 
-                     switch (d[i]) {
 
-                       case "M":
 
-                       case "L":
 
-                       case "T":
 
-                       case "S":
 
-                       case "A":
 
-                       case "C":
 
-                       case "H":
 
-                       case "V":
 
-                       case "Q":
 
-                         {
 
-                             if (cache.length) {
 
-                                 pattern.push(cache.join(""));
 
-                                 cache = [];
 
-                             }
 
-                             // 脑图的path格式真奇怪...偶尔就给我蹦出来一个"..V123 C..", 那空格几个意思 - -
 
-                             if (pattern[pattern.length - 1] === ",") {
 
-                                 pattern.pop();
 
-                             }
 
-                             if (pattern.length) {
 
-                                 dealWithPattern(pattern);
 
-                                 strArr.push(pattern.join(""));
 
-                                 pattern = [];
 
-                             }
 
-                             pattern.push(d[i]);
 
-                             break;
 
-                         }
 
-                       case "Z":
 
-                       case "z":
 
-                         {
 
-                             pattern.push(cache.join(""), d[i]);
 
-                             dealWithPattern(pattern);
 
-                             strArr.push(pattern.join(""));
 
-                             cache = [];
 
-                             pattern = [];
 
-                             break;
 
-                         }
 
-                       case ".":
 
-                       case "e":
 
-                         {
 
-                             cache.push(d[i]);
 
-                             break;
 
-                         }
 
-                       case "-":
 
-                         {
 
-                             if (d[i - 1] !== "e") {
 
-                                 if (cache.length) {
 
-                                     pattern.push(cache.join(""), ",");
 
-                                 }
 
-                                 cache = [];
 
-                             }
 
-                             cache.push("-");
 
-                             break;
 
-                         }
 
-                       case " ":
 
-                       case ",":
 
-                         {
 
-                             if (cache.length) {
 
-                                 pattern.push(cache.join(""), ",");
 
-                                 cache = [];
 
-                             }
 
-                             break;
 
-                         }
 
-                       default:
 
-                         {
 
-                             if (/\d/.test(d[i])) {
 
-                                 cache.push(d[i]);
 
-                             } else {
 
-                                 // m a c s q h v l t z情况
 
-                                 if (cache.length) {
 
-                                     pattern.push(cache.join(""), d[i]);
 
-                                     cache = [];
 
-                                 } else {
 
-                                     // 脑图的path格式真奇怪...偶尔就给我蹦出来一个"..V123 c..", 那空格几个意思 - -
 
-                                     if (pattern[pattern.length - 1] === ",") {
 
-                                         pattern.pop();
 
-                                     }
 
-                                     pattern.push(d[i]);
 
-                                 }
 
-                             }
 
-                             if (i + 1 === l) {
 
-                                 if (cache.length) {
 
-                                     pattern.push(cache.join(""));
 
-                                 }
 
-                                 dealWithPattern(pattern);
 
-                                 strArr.push(pattern.join(""));
 
-                                 cache = null;
 
-                                 pattern = null;
 
-                             }
 
-                         }
 
-                     }
 
-                 }
 
-                 return strArr.join("");
 
-             }
 
-             function replaceWithNode(svgNode, parentX, parentY) {
 
-                 if (!svgNode) {
 
-                     return;
 
-                 }
 
-                 if (svgNode.tagName === "defs") {
 
-                     return;
 
-                 }
 
-                 if (svgNode.getAttribute("fill") === "transparent") {
 
-                     svgNode.setAttribute("fill", "none");
 
-                 }
 
-                 if (svgNode.getAttribute("marker-end")) {
 
-                     svgNode.removeAttribute("marker-end");
 
-                 }
 
-                 parentX = parentX || 0;
 
-                 parentY = parentY || 0;
 
-                 if (svgNode.getAttribute("transform")) {
 
-                     var ctm = getTransformToElement(svgNode, svgNode.parentElement);
 
-                     parentX -= ctm.e;
 
-                     parentY -= ctm.f;
 
-                     svgNode.removeAttribute("transform");
 
-                 }
 
-                 switch (svgNode.tagName.toLowerCase()) {
 
-                   case "g":
 
-                     break;
 
-                   case "path":
 
-                     {
 
-                         var d = svgNode.getAttribute("d");
 
-                         if (d) {
 
-                             d = dealWithPath(d, function(pattern) {
 
-                                 switch (pattern[0]) {
 
-                                   case "V":
 
-                                     {
 
-                                         pattern[1] = +pattern[1] - parentY;
 
-                                         break;
 
-                                     }
 
-                                   case "H":
 
-                                     {
 
-                                         pattern[1] = +pattern[1] - parentX;
 
-                                         break;
 
-                                     }
 
-                                   case "M":
 
-                                   case "L":
 
-                                   case "T":
 
-                                     {
 
-                                         pattern[1] = +pattern[1] - parentX;
 
-                                         pattern[3] = +pattern[3] - parentY;
 
-                                         break;
 
-                                     }
 
-                                   case "Q":
 
-                                   case "S":
 
-                                     {
 
-                                         pattern[1] = +pattern[1] - parentX;
 
-                                         pattern[3] = +pattern[3] - parentY;
 
-                                         pattern[5] = +pattern[5] - parentX;
 
-                                         pattern[7] = +pattern[7] - parentY;
 
-                                         break;
 
-                                     }
 
-                                   case "A":
 
-                                     {
 
-                                         pattern[11] = +pattern[11] - parentX;
 
-                                         pattern[13] = +pattern[13] - parentY;
 
-                                         break;
 
-                                     }
 
-                                   case "C":
 
-                                     {
 
-                                         pattern[1] = +pattern[1] - parentX;
 
-                                         pattern[3] = +pattern[3] - parentY;
 
-                                         pattern[5] = +pattern[5] - parentX;
 
-                                         pattern[7] = +pattern[7] - parentY;
 
-                                         pattern[9] = +pattern[9] - parentX;
 
-                                         pattern[11] = +pattern[11] - parentY;
 
-                                     }
 
-                                 }
 
-                             });
 
-                             svgNode.setAttribute("d", d);
 
-                             svgNode.removeAttribute("transform");
 
-                         }
 
-                         return;
 
-                     }
 
-                   case "image":
 
-                   case "text":
 
-                     {
 
-                         if (parentX && parentY) {
 
-                             var x = +svgNode.getAttribute("x") || 0, y = +svgNode.getAttribute("y") || 0;
 
-                             svgNode.setAttribute("x", x - parentX);
 
-                             svgNode.setAttribute("y", y - parentY);
 
-                         }
 
-                         if (svgNode.getAttribute("dominant-baseline")) {
 
-                             svgNode.removeAttribute("dominant-baseline");
 
-                             svgNode.setAttribute("dy", ".8em");
 
-                         }
 
-                         svgNode.removeAttribute("transform");
 
-                         return;
 
-                     }
 
-                 }
 
-                 if (svgNode.children) {
 
-                     for (var i = 0, l = svgNode.children.length; i < l; i++) {
 
-                         replaceWithNode(svgNode.children[i], parentX, parentY);
 
-                     }
 
-                 }
 
-             }
 
-             svgDom.style.visibility = "hidden";
 
-             replaceWithNode(svgDom, x || 0, y || 0);
 
-             svgDom.style.visibility = "visible";
 
-         }
 
-         data.registerProtocol("svg", module.exports = {
 
-             fileDescription: "SVG 矢量图",
 
-             fileExtension: ".svg",
 
-             mineType: "image/svg+xml",
 
-             dataType: "text",
 
-             encode: function(json, minder) {
 
-                 var paper = minder.getPaper(), paperTransform = paper.shapeNode.getAttribute("transform"), svgXml, svgContainer, svgDom, renderContainer = minder.getRenderContainer(), renderBox = renderContainer.getRenderBox(), transform = renderContainer.getTransform(), width = renderBox.width, height = renderBox.height, padding = 20;
 
-                 paper.shapeNode.setAttribute("transform", "translate(0.5, 0.5)");
 
-                 svgXml = paper.container.innerHTML;
 
-                 paper.shapeNode.setAttribute("transform", paperTransform);
 
-                 svgContainer = document.createElement("div");
 
-                 document.body.appendChild(svgContainer);
 
-                 svgContainer.innerHTML = svgXml;
 
-                 svgDom = svgContainer.querySelector("svg");
 
-                 svgDom.setAttribute("width", width + padding * 2 | 0);
 
-                 svgDom.setAttribute("height", height + padding * 2 | 0);
 
-                 svgDom.setAttribute("style", "background: " + minder.getStyle("background"));
 
-                 //"font-family: Arial, Microsoft Yahei, Heiti SC; " +
 
-                 svgDom.setAttribute("viewBox", [ 0, 0, width + padding * 2 | 0, height + padding * 2 | 0 ].join(" "));
 
-                 tempSvgContainer = document.createElement("div");
 
-                 cleanSVG(svgDom, renderBox.x - padding | 0, renderBox.y - padding | 0);
 
-                 document.body.removeChild(svgContainer);
 
-                 tempSvgContainer.appendChild(svgDom);
 
-                 // need a xml with width and height
 
-                 svgXml = tempSvgContainer.innerHTML;
 
-                 // svg 含有   符号导出报错 Entity 'nbsp' not defined
 
-                 svgXml = svgXml.replace(/ /g, " ");
 
-                 // svg 含有   符号导出报错 Entity 'nbsp' not defined
 
-                 return svgXml;
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/protocol/text.js
 
- _p[68] = {
 
-     value: function(require, exports, module) {
 
-         var data = _p.r(12);
 
-         var Browser = _p.r(17).Browser;
 
-         /**
 
-      * @Desc: 增加对不容浏览器下节点中文本\t匹配的处理,不同浏览器下\t无法正确匹配,导致无法使用TAB来批量导入节点
 
-      * @Editor: Naixor
 
-      * @Date: 2015.9.17
 
-      */
 
-         var LINE_ENDING = "\r", LINE_ENDING_SPLITER = /\r\n|\r|\n/, TAB_CHAR = function(Browser) {
 
-             if (Browser.gecko) {
 
-                 return {
 
-                     REGEXP: new RegExp("^(\t|" + String.fromCharCode(160, 160, 32, 160) + ")"),
 
-                     DELETE: new RegExp("^(\t|" + String.fromCharCode(160, 160, 32, 160) + ")+")
 
-                 };
 
-             } else if (Browser.ie || Browser.edge) {
 
-                 // ie系列和edge比较特别,\t在div中会被直接转义成SPACE故只好使用SPACE来做处理
 
-                 return {
 
-                     REGEXP: new RegExp("^(" + String.fromCharCode(32) + "|" + String.fromCharCode(160) + ")"),
 
-                     DELETE: new RegExp("^(" + String.fromCharCode(32) + "|" + String.fromCharCode(160) + ")+")
 
-                 };
 
-             } else {
 
-                 return {
 
-                     REGEXP: /^(\t|\x20{4})/,
 
-                     DELETE: /^(\t|\x20{4})+/
 
-                 };
 
-             }
 
-         }(Browser);
 
-         function repeat(s, n) {
 
-             var result = "";
 
-             while (n--) result += s;
 
-             return result;
 
-         }
 
-         /**
 
-      * 对节点text中的换行符进行处理
 
-      * @method encodeWrap
 
-      * @param  {String}   nodeText MinderNode.data.text
 
-      * @return {String}            \n -> '\n'; \\n -> '\\n'
 
-      */
 
-         function encodeWrap(nodeText) {
 
-             if (!nodeText) {
 
-                 return "";
 
-             }
 
-             var textArr = [], WRAP_TEXT = [ "\\", "n" ];
 
-             for (var i = 0, j = 0, l = nodeText.length; i < l; i++) {
 
-                 if (nodeText[i] === "\n" || nodeText[i] === "\r") {
 
-                     textArr.push("\\n");
 
-                     j = 0;
 
-                     continue;
 
-                 }
 
-                 if (nodeText[i] === WRAP_TEXT[j]) {
 
-                     j++;
 
-                     if (j === 2) {
 
-                         j = 0;
 
-                         textArr.push("\\\\n");
 
-                     }
 
-                     continue;
 
-                 }
 
-                 switch (j) {
 
-                   case 0:
 
-                     {
 
-                         textArr.push(nodeText[i]);
 
-                         break;
 
-                     }
 
-                   case 1:
 
-                     {
 
-                         textArr.push(nodeText[i - 1], nodeText[i]);
 
-                     }
 
-                 }
 
-                 j = 0;
 
-             }
 
-             return textArr.join("");
 
-         }
 
-         /**
 
-      * 将文本内容中的'\n'和'\\n'分别转换成\n和\\n
 
-      * @method decodeWrap
 
-      * @param  {[type]}   text [description]
 
-      * @return {[type]}        [description]
 
-      */
 
-         function decodeWrap(text) {
 
-             if (!text) {
 
-                 return "";
 
-             }
 
-             var textArr = [], WRAP_TEXT = [ "\\", "\\", "n" ];
 
-             for (var i = 0, j = 0, l = text.length; i < l; i++) {
 
-                 if (text[i] === WRAP_TEXT[j]) {
 
-                     j++;
 
-                     if (j === 3) {
 
-                         j = 0;
 
-                         textArr.push("\\n");
 
-                     }
 
-                     continue;
 
-                 }
 
-                 switch (j) {
 
-                   case 0:
 
-                     {
 
-                         textArr.push(text[i]);
 
-                         j = 0;
 
-                         break;
 
-                     }
 
-                   case 1:
 
-                     {
 
-                         if (text[i] === "n") {
 
-                             textArr.push("\n");
 
-                         } else {
 
-                             textArr.push(text[i - 1], text[i]);
 
-                         }
 
-                         j = 0;
 
-                         break;
 
-                     }
 
-                   case 2:
 
-                     {
 
-                         textArr.push(text[i - 2]);
 
-                         if (text[i] !== "\\") {
 
-                             j = 0;
 
-                             textArr.push(text[i - 1], text[i]);
 
-                         }
 
-                         break;
 
-                     }
 
-                 }
 
-             }
 
-             return textArr.join("");
 
-         }
 
-         function encode(json, level) {
 
-             var local = "";
 
-             level = level || 0;
 
-             local += repeat("\t", level);
 
-             local += encodeWrap(json.data.text) + LINE_ENDING;
 
-             if (json.children) {
 
-                 json.children.forEach(function(child) {
 
-                     local += encode(child, level + 1);
 
-                 });
 
-             }
 
-             return local;
 
-         }
 
-         function isEmpty(line) {
 
-             return !/\S/.test(line);
 
-         }
 
-         function getLevel(line) {
 
-             var level = 0;
 
-             while (TAB_CHAR.REGEXP.test(line)) {
 
-                 line = line.replace(TAB_CHAR.REGEXP, "");
 
-                 level++;
 
-             }
 
-             return level;
 
-         }
 
-         function getNode(line) {
 
-             return {
 
-                 data: {
 
-                     text: decodeWrap(line.replace(TAB_CHAR.DELETE, ""))
 
-                 }
 
-             };
 
-         }
 
-         function decode(local) {
 
-             var json, parentMap = {}, lines = local.split(LINE_ENDING_SPLITER), line, level, node;
 
-             function addChild(parent, child) {
 
-                 var children = parent.children || (parent.children = []);
 
-                 children.push(child);
 
-             }
 
-             for (var i = 0; i < lines.length; i++) {
 
-                 line = lines[i];
 
-                 if (isEmpty(line)) continue;
 
-                 level = getLevel(line);
 
-                 node = getNode(line);
 
-                 if (level === 0) {
 
-                     if (json) {
 
-                         throw new Error("Invalid local format");
 
-                     }
 
-                     json = node;
 
-                 } else {
 
-                     if (!parentMap[level - 1]) {
 
-                         throw new Error("Invalid local format");
 
-                     }
 
-                     addChild(parentMap[level - 1], node);
 
-                 }
 
-                 parentMap[level] = node;
 
-             }
 
-             return json;
 
-         }
 
-         /**
 
-      * @Desc: 增加一个将当前选中节点转换成text的方法
 
-      * @Editor: Naixor
 
-      * @Date: 2015.9.21
 
-      */
 
-         function Node2Text(node) {
 
-             function exportNode(node) {
 
-                 var exported = {};
 
-                 exported.data = node.getData();
 
-                 var childNodes = node.getChildren();
 
-                 exported.children = [];
 
-                 for (var i = 0; i < childNodes.length; i++) {
 
-                     exported.children.push(exportNode(childNodes[i]));
 
-                 }
 
-                 return exported;
 
-             }
 
-             if (!node) return;
 
-             if (/^\s*$/.test(node.data.text)) {
 
-                 node.data.text = "分支主题";
 
-             }
 
-             return encode(exportNode(node));
 
-         }
 
-         data.registerProtocol("text", module.exports = {
 
-             fileDescription: "大纲文本",
 
-             fileExtension: ".txt",
 
-             dataType: "text",
 
-             mineType: "text/plain",
 
-             encode: function(json) {
 
-                 return encode(json.root, 0);
 
-             },
 
-             decode: function(local) {
 
-                 return decode(local);
 
-             },
 
-             Node2Text: function(node) {
 
-                 return Node2Text(node);
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/template/default.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 默认模板 - 脑图模板
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[69] = {
 
-     value: function(require, exports, module) {
 
-         var template = _p.r(31);
 
-         template.register("default", {
 
-             getLayout: function(node) {
 
-                 if (node.getData("layout")) return node.getData("layout");
 
-                 var level = node.getLevel();
 
-                 // 根节点
 
-                 if (level === 0) {
 
-                     return "mind";
 
-                 }
 
-                 // 一级节点
 
-                 if (level === 1) {
 
-                     return node.getLayoutPointPreview().x > 0 ? "right" : "left";
 
-                 }
 
-                 return node.parent.getLayout();
 
-             },
 
-             getConnect: function(node) {
 
-                 if (node.getLevel() == 1) return "arc";
 
-                 return "under";
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/template/filetree.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 文件夹模板
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[70] = {
 
-     value: function(require, exports, module) {
 
-         var template = _p.r(31);
 
-         template.register("filetree", {
 
-             getLayout: function(node) {
 
-                 if (node.getData("layout")) return node.getData("layout");
 
-                 if (node.isRoot()) return "bottom";
 
-                 return "filetree-down";
 
-             },
 
-             getConnect: function(node) {
 
-                 if (node.getLevel() == 1) {
 
-                     return "poly";
 
-                 }
 
-                 return "l";
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/template/fish-bone.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 默认模板 - 鱼骨头模板
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[71] = {
 
-     value: function(require, exports, module) {
 
-         var template = _p.r(31);
 
-         template.register("fish-bone", {
 
-             getLayout: function(node) {
 
-                 if (node.getData("layout")) return node.getData("layout");
 
-                 var level = node.getLevel();
 
-                 // 根节点
 
-                 if (level === 0) {
 
-                     return "fish-bone-master";
 
-                 }
 
-                 // 一级节点
 
-                 if (level === 1) {
 
-                     return "fish-bone-slave";
 
-                 }
 
-                 return node.getLayoutPointPreview().y > 0 ? "filetree-up" : "filetree-down";
 
-             },
 
-             getConnect: function(node) {
 
-                 switch (node.getLevel()) {
 
-                   case 1:
 
-                     return "fish-bone-master";
 
-                   case 2:
 
-                     return "line";
 
-                   default:
 
-                     return "l";
 
-                 }
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/template/right.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 往右布局结构模板
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[72] = {
 
-     value: function(require, exports, module) {
 
-         var template = _p.r(31);
 
-         template.register("right", {
 
-             getLayout: function(node) {
 
-                 return node.getData("layout") || "right";
 
-             },
 
-             getConnect: function(node) {
 
-                 if (node.getLevel() == 1) return "arc";
 
-                 return "bezier";
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/template/structure.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 组织结构图模板
 
-  *
 
-  * @author: techird
 
-  * @copyright: Baidu FEX, 2014
 
-  */
 
- _p[73] = {
 
-     value: function(require, exports, module) {
 
-         var template = _p.r(31);
 
-         template.register("structure", {
 
-             getLayout: function(node) {
 
-                 return node.getData("layout") || "bottom";
 
-             },
 
-             getConnect: function(node) {
 
-                 return "poly";
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/template/tianpan.js
 
- /**
 
-  * @fileOverview
 
-  *
 
-  * 天盘模板
 
-  *
 
-  * @author: along
 
-  * @copyright: bpd729@163.com, 2015
 
-  */
 
- _p[74] = {
 
-     value: function(require, exports, module) {
 
-         var template = _p.r(31);
 
-         template.register("tianpan", {
 
-             getLayout: function(node) {
 
-                 if (node.getData("layout")) return node.getData("layout");
 
-                 var level = node.getLevel();
 
-                 // 根节点
 
-                 if (level === 0) {
 
-                     return "tianpan";
 
-                 }
 
-                 return node.parent.getLayout();
 
-             },
 
-             getConnect: function(node) {
 
-                 return "arc_tp";
 
-             }
 
-         });
 
-     }
 
- };
 
- //src/theme/default.js
 
- _p[75] = {
 
-     value: function(require, exports, module) {
 
-         var theme = _p.r(32);
 
-         [ "classic", "classic-compact" ].forEach(function(name) {
 
-             var compact = name == "classic-compact";
 
-             /* jscs:disable maximumLineLength */
 
-             theme.register(name, {
 
-                 background: '#3A4144 url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowQzg5QTQ0NDhENzgxMUUzOENGREE4QTg0RDgzRTZDNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowQzg5QTQ0NThENzgxMUUzOENGREE4QTg0RDgzRTZDNyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkMwOEQ1NDRGOEQ3NzExRTM4Q0ZEQThBODREODNFNkM3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkMwOEQ1NDUwOEQ3NzExRTM4Q0ZEQThBODREODNFNkM3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+e9P33AAAACVJREFUeNpisXJ0YUACTAyoAMr/+eM7EGGRZ4FQ7BycEAZAgAEAHbEGtkoQm/wAAAAASUVORK5CYII=") repeat',
 
-                 "root-color": "#430",
 
-                 "root-background": "#e9df98",
 
-                 "root-stroke": "#e9df98",
 
-                 "root-font-size": 24,
 
-                 "root-padding": compact ? [ 10, 25 ] : [ 15, 25 ],
 
-                 "root-margin": compact ? [ 15, 25 ] : [ 30, 100 ],
 
-                 "root-radius": 30,
 
-                 "root-space": 10,
 
-                 "root-shadow": "rgba(0, 0, 0, .25)",
 
-                 "main-color": "#333",
 
-                 "main-background": "#a4c5c0",
 
-                 "main-stroke": "#a4c5c0",
 
-                 "main-font-size": 16,
 
-                 "main-padding": compact ? [ 5, 15 ] : [ 6, 20 ],
 
-                 "main-margin": compact ? [ 5, 10 ] : 20,
 
-                 "main-radius": 10,
 
-                 "main-space": 5,
 
-                 "main-shadow": "rgba(0, 0, 0, .25)",
 
-                 "sub-color": "white",
 
-                 "sub-background": "transparent",
 
-                 "sub-stroke": "none",
 
-                 "sub-font-size": 12,
 
-                 "sub-padding": [ 5, 10 ],
 
-                 "sub-margin": compact ? [ 5, 10 ] : [ 15, 20 ],
 
-                 "sub-tree-margin": 30,
 
-                 "sub-radius": 5,
 
-                 "sub-space": 5,
 
-                 "connect-color": "white",
 
-                 "connect-width": 2,
 
-                 "main-connect-width": 3,
 
-                 "connect-radius": 5,
 
-                 "selected-background": "rgb(254, 219, 0)",
 
-                 "selected-stroke": "rgb(254, 219, 0)",
 
-                 "selected-color": "black",
 
-                 "marquee-background": "rgba(255,255,255,.3)",
 
-                 "marquee-stroke": "white",
 
-                 "drop-hint-color": "yellow",
 
-                 "sub-drop-hint-width": 2,
 
-                 "main-drop-hint-width": 4,
 
-                 "root-drop-hint-width": 4,
 
-                 "order-hint-area-color": "rgba(0, 255, 0, .5)",
 
-                 "order-hint-path-color": "#0f0",
 
-                 "order-hint-path-width": 1,
 
-                 "text-selection-color": "rgb(27,171,255)",
 
-                 "line-height": 1.5
 
-             });
 
-         });
 
-     }
 
- };
 
- //src/theme/fish.js
 
- _p[76] = {
 
-     value: function(require, exports, module) {
 
-         var theme = _p.r(32);
 
-         theme.register("fish", {
 
-             background: '#3A4144 url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowQzg5QTQ0NDhENzgxMUUzOENGREE4QTg0RDgzRTZDNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowQzg5QTQ0NThENzgxMUUzOENGREE4QTg0RDgzRTZDNyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkMwOEQ1NDRGOEQ3NzExRTM4Q0ZEQThBODREODNFNkM3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkMwOEQ1NDUwOEQ3NzExRTM4Q0ZEQThBODREODNFNkM3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+e9P33AAAACVJREFUeNpisXJ0YUACTAyoAMr/+eM7EGGRZ4FQ7BycEAZAgAEAHbEGtkoQm/wAAAAASUVORK5CYII=") repeat',
 
-             "root-color": "#430",
 
-             "root-background": "#e9df98",
 
-             "root-stroke": "#e9df98",
 
-             "root-font-size": 24,
 
-             "root-padding": [ 35, 35 ],
 
-             "root-margin": 30,
 
-             "root-radius": 100,
 
-             "root-space": 10,
 
-             "root-shadow": "rgba(0, 0, 0, .25)",
 
-             "main-color": "#333",
 
-             "main-background": "#a4c5c0",
 
-             "main-stroke": "#a4c5c0",
 
-             "main-font-size": 16,
 
-             "main-padding": [ 6, 20 ],
 
-             "main-margin": [ 20, 20 ],
 
-             "main-radius": 5,
 
-             "main-space": 5,
 
-             "main-shadow": "rgba(0, 0, 0, .25)",
 
-             "sub-color": "black",
 
-             "sub-background": "white",
 
-             "sub-stroke": "white",
 
-             "sub-font-size": 12,
 
-             "sub-padding": [ 5, 10 ],
 
-             "sub-margin": [ 10 ],
 
-             "sub-radius": 5,
 
-             "sub-space": 5,
 
-             "connect-color": "white",
 
-             "connect-width": 3,
 
-             "main-connect-width": 3,
 
-             "connect-radius": 5,
 
-             "selected-background": "rgb(254, 219, 0)",
 
-             "selected-stroke": "rgb(254, 219, 0)",
 
-             "marquee-background": "rgba(255,255,255,.3)",
 
-             "marquee-stroke": "white",
 
-             "drop-hint-color": "yellow",
 
-             "drop-hint-width": 4,
 
-             "order-hint-area-color": "rgba(0, 255, 0, .5)",
 
-             "order-hint-path-color": "#0f0",
 
-             "order-hint-path-width": 1,
 
-             "text-selection-color": "rgb(27,171,255)",
 
-             "line-height": 1.5
 
-         });
 
-     }
 
- };
 
- //src/theme/fresh.js
 
- _p[77] = {
 
-     value: function(require, exports, module) {
 
-         var kity = _p.r(17);
 
-         var theme = _p.r(32);
 
-         function hsl(h, s, l) {
 
-             return kity.Color.createHSL(h, s, l);
 
-         }
 
-         function generate(h, compat) {
 
-             return {
 
-                 background: "#fbfbfb",
 
-                 "root-color": "white",
 
-                 "root-background": hsl(h, 37, 60),
 
-                 "root-stroke": hsl(h, 37, 60),
 
-                 "root-font-size": 16,
 
-                 "root-padding": compat ? [ 6, 12 ] : [ 12, 24 ],
 
-                 "root-margin": compat ? 10 : [ 30, 100 ],
 
-                 "root-radius": 5,
 
-                 "root-space": 10,
 
-                 "main-color": "black",
 
-                 "main-background": hsl(h, 33, 95),
 
-                 "main-stroke": hsl(h, 37, 60),
 
-                 "main-stroke-width": 1,
 
-                 "main-font-size": 14,
 
-                 "main-padding": [ 6, 20 ],
 
-                 "main-margin": compat ? 8 : 20,
 
-                 "main-radius": 3,
 
-                 "main-space": 5,
 
-                 "sub-color": "black",
 
-                 "sub-background": "transparent",
 
-                 "sub-stroke": "none",
 
-                 "sub-font-size": 12,
 
-                 "sub-padding": compat ? [ 3, 5 ] : [ 5, 10 ],
 
-                 "sub-margin": compat ? [ 4, 8 ] : [ 15, 20 ],
 
-                 "sub-radius": 5,
 
-                 "sub-space": 5,
 
-                 "connect-color": hsl(h, 37, 60),
 
-                 "connect-width": 1,
 
-                 "connect-radius": 5,
 
-                 "selected-stroke": hsl(h, 26, 30),
 
-                 "selected-stroke-width": "3",
 
-                 "blur-selected-stroke": hsl(h, 10, 60),
 
-                 "marquee-background": hsl(h, 100, 80).set("a", .1),
 
-                 "marquee-stroke": hsl(h, 37, 60),
 
-                 "drop-hint-color": hsl(h, 26, 35),
 
-                 "drop-hint-width": 5,
 
-                 "order-hint-area-color": hsl(h, 100, 30).set("a", .5),
 
-                 "order-hint-path-color": hsl(h, 100, 25),
 
-                 "order-hint-path-width": 1,
 
-                 "text-selection-color": hsl(h, 100, 20),
 
-                 "line-height": 1.5
 
-             };
 
-         }
 
-         var plans = {
 
-             red: 0,
 
-             soil: 25,
 
-             green: 122,
 
-             blue: 204,
 
-             purple: 246,
 
-             pink: 334
 
-         };
 
-         var name;
 
-         for (name in plans) {
 
-             theme.register("fresh-" + name, generate(plans[name]));
 
-             theme.register("fresh-" + name + "-compat", generate(plans[name], true));
 
-         }
 
-     }
 
- };
 
- //src/theme/snow.js
 
- _p[78] = {
 
-     value: function(require, exports, module) {
 
-         var theme = _p.r(32);
 
-         [ "snow", "snow-compact" ].forEach(function(name) {
 
-             var compact = name == "snow-compact";
 
-             /* jscs:disable maximumLineLength */
 
-             theme.register(name, {
 
-                 background: '#3A4144 url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowQzg5QTQ0NDhENzgxMUUzOENGREE4QTg0RDgzRTZDNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowQzg5QTQ0NThENzgxMUUzOENGREE4QTg0RDgzRTZDNyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkMwOEQ1NDRGOEQ3NzExRTM4Q0ZEQThBODREODNFNkM3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkMwOEQ1NDUwOEQ3NzExRTM4Q0ZEQThBODREODNFNkM3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+e9P33AAAACVJREFUeNpisXJ0YUACTAyoAMr/+eM7EGGRZ4FQ7BycEAZAgAEAHbEGtkoQm/wAAAAASUVORK5CYII=") repeat',
 
-                 "root-color": "#430",
 
-                 "root-background": "#e9df98",
 
-                 "root-stroke": "#e9df98",
 
-                 "root-font-size": 24,
 
-                 "root-padding": compact ? [ 5, 10 ] : [ 15, 25 ],
 
-                 "root-margin": compact ? 15 : 30,
 
-                 "root-radius": 5,
 
-                 "root-space": 10,
 
-                 "root-shadow": "rgba(0, 0, 0, .25)",
 
-                 "main-color": "#333",
 
-                 "main-background": "#a4c5c0",
 
-                 "main-stroke": "#a4c5c0",
 
-                 "main-font-size": 16,
 
-                 "main-padding": compact ? [ 4, 10 ] : [ 6, 20 ],
 
-                 "main-margin": compact ? [ 5, 10 ] : [ 20, 40 ],
 
-                 "main-radius": 5,
 
-                 "main-space": 5,
 
-                 "main-shadow": "rgba(0, 0, 0, .25)",
 
-                 "sub-color": "black",
 
-                 "sub-background": "white",
 
-                 "sub-stroke": "white",
 
-                 "sub-font-size": 12,
 
-                 "sub-padding": [ 5, 10 ],
 
-                 "sub-margin": compact ? [ 5, 10 ] : [ 10, 20 ],
 
-                 "sub-radius": 5,
 
-                 "sub-space": 5,
 
-                 "connect-color": "white",
 
-                 "connect-width": 2,
 
-                 "main-connect-width": 3,
 
-                 "connect-radius": 5,
 
-                 "selected-background": "rgb(254, 219, 0)",
 
-                 "selected-stroke": "rgb(254, 219, 0)",
 
-                 "marquee-background": "rgba(255,255,255,.3)",
 
-                 "marquee-stroke": "white",
 
-                 "drop-hint-color": "yellow",
 
-                 "drop-hint-width": 4,
 
-                 "order-hint-area-color": "rgba(0, 255, 0, .5)",
 
-                 "order-hint-path-color": "#0f0",
 
-                 "order-hint-path-width": 1,
 
-                 "text-selection-color": "rgb(27,171,255)",
 
-                 "line-height": 1.5
 
-             });
 
-         });
 
-     }
 
- };
 
- //src/theme/tianpan.js
 
- _p[79] = {
 
-     value: function(require, exports, module) {
 
-         var theme = _p.r(32);
 
-         [ "tianpan", "tianpan-compact" ].forEach(function(name) {
 
-             var compact = name == "tianpan-compact";
 
-             theme.register(name, {
 
-                 background: '#3A4144 url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowQzg5QTQ0NDhENzgxMUUzOENGREE4QTg0RDgzRTZDNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowQzg5QTQ0NThENzgxMUUzOENGREE4QTg0RDgzRTZDNyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkMwOEQ1NDRGOEQ3NzExRTM4Q0ZEQThBODREODNFNkM3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkMwOEQ1NDUwOEQ3NzExRTM4Q0ZEQThBODREODNFNkM3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+e9P33AAAACVJREFUeNpisXJ0YUACTAyoAMr/+eM7EGGRZ4FQ7BycEAZAgAEAHbEGtkoQm/wAAAAASUVORK5CYII=") repeat',
 
-                 "root-color": "#430",
 
-                 "root-background": "#e9df98",
 
-                 "root-stroke": "#e9df98",
 
-                 "root-font-size": 25,
 
-                 "root-padding": compact ? 15 : 20,
 
-                 "root-margin": compact ? [ 15, 25 ] : 100,
 
-                 "root-radius": 30,
 
-                 "root-space": 10,
 
-                 "root-shadow": "rgba(0, 0, 0, .25)",
 
-                 "root-shape": "circle",
 
-                 "main-color": "#333",
 
-                 "main-background": "#a4c5c0",
 
-                 "main-stroke": "#a4c5c0",
 
-                 "main-font-size": 15,
 
-                 "main-padding": compact ? 10 : 12,
 
-                 "main-margin": compact ? 10 : 12,
 
-                 "main-radius": 10,
 
-                 "main-space": 5,
 
-                 "main-shadow": "rgba(0, 0, 0, .25)",
 
-                 "main-shape": "circle",
 
-                 "sub-color": "#333",
 
-                 "sub-background": "#99ca6a",
 
-                 "sub-stroke": "#a4c5c0",
 
-                 "sub-font-size": 13,
 
-                 "sub-padding": 5,
 
-                 "sub-margin": compact ? 6 : 10,
 
-                 "sub-tree-margin": 30,
 
-                 "sub-radius": 5,
 
-                 "sub-space": 5,
 
-                 "sub-shadow": "rgba(0, 0, 0, .25)",
 
-                 "sub-shape": "circle",
 
-                 "connect-color": "white",
 
-                 "connect-width": 2,
 
-                 "main-connect-width": 3,
 
-                 "connect-radius": 5,
 
-                 "selected-background": "rgb(254, 219, 0)",
 
-                 "selected-stroke": "rgb(254, 219, 0)",
 
-                 "selected-color": "black",
 
-                 "marquee-background": "rgba(255,255,255,.3)",
 
-                 "marquee-stroke": "white",
 
-                 "drop-hint-color": "yellow",
 
-                 "sub-drop-hint-width": 2,
 
-                 "main-drop-hint-width": 4,
 
-                 "root-drop-hint-width": 4,
 
-                 "order-hint-area-color": "rgba(0, 255, 0, .5)",
 
-                 "order-hint-path-color": "#0f0",
 
-                 "order-hint-path-width": 1,
 
-                 "text-selection-color": "rgb(27,171,255)",
 
-                 "line-height": 1.4
 
-             });
 
-         });
 
-     }
 
- };
 
- //src/theme/wire.js
 
- _p[80] = {
 
-     value: function(require, exports, module) {
 
-         var theme = _p.r(32);
 
-         theme.register("wire", {
 
-             background: "black",
 
-             color: "#999",
 
-             stroke: "none",
 
-             padding: 10,
 
-             margin: 20,
 
-             "font-size": 14,
 
-             "connect-color": "#999",
 
-             "connect-width": 1,
 
-             "selected-background": "#999",
 
-             "selected-color": "black",
 
-             "marquee-background": "rgba(255,255,255,.3)",
 
-             "marquee-stroke": "white",
 
-             "drop-hint-color": "yellow",
 
-             "sub-drop-hint-width": 2,
 
-             "main-drop-hint-width": 4,
 
-             "root-drop-hint-width": 4,
 
-             "order-hint-area-color": "rgba(0, 255, 0, .5)",
 
-             "order-hint-path-color": "#0f0",
 
-             "order-hint-path-width": 1,
 
-             "text-selection-color": "rgb(27,171,255)",
 
-             "line-height": 1.5
 
-         });
 
-     }
 
- };
 
- var moduleMapping = {
 
-     "expose-kityminder": 34
 
- };
 
- function use(name) {
 
-     _p.r([ moduleMapping[name] ]);
 
- }
 
- use('expose-kityminder');
 
- })();
 
 
  |