| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353 | 
							- /**
 
-  * Copyright (c) 2006-2015, JGraph Ltd
 
-  */
 
- /**
 
-  * Registers shapes.
 
-  */
 
- (function()
 
- {
 
- 	function TableLineShape(line, stroke, strokewidth)
 
- 	{
 
- 		mxShape.call(this);
 
- 		this.line = line;
 
- 		this.stroke = stroke;
 
- 		this.strokewidth = (strokewidth != null) ? strokewidth : 1;
 
- 		this.updateBoundsFromLine();
 
- 	};
 
- 	/**
 
- 	 * Extends mxShape.
 
- 	 */
 
- 	mxUtils.extend(TableLineShape, mxShape);
 
- 	/**
 
- 	 * Function: paintVertexShape
 
- 	 * 
 
- 	 * Redirects to redrawPath for subclasses to work.
 
- 	 */
 
- 	TableLineShape.prototype.updateBoundsFromLine = function()
 
- 	{
 
- 		var box = null;
 
- 		if (this.line != null)
 
- 		{
 
- 			for (var i = 0; i < this.line.length; i++)
 
- 			{
 
- 				var curr = this.line[i];
 
- 				if (curr != null)
 
- 				{
 
- 					var temp = new mxRectangle(curr.x, curr.y,
 
- 						this.strokewidth, this.strokewidth);
 
- 					if (box == null)
 
- 					{
 
- 						box = temp;
 
- 					}
 
- 					else
 
- 					{
 
- 						box.add(temp);
 
- 					}
 
- 				}
 
- 			}
 
- 		}
 
- 		this.bounds = (box != null) ? box : new mxRectangle();
 
- 	};
 
- 	/**
 
- 	 * Function: paintVertexShape
 
- 	 * 
 
- 	 * Redirects to redrawPath for subclasses to work.
 
- 	 */
 
- 	TableLineShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		this.paintTableLine(c, this.line, 0, 0);
 
- 	};
 
- 	/**
 
- 	 * Function: paintTableLine
 
- 	 * 
 
- 	 * Redirects to redrawPath for subclasses to work.
 
- 	 */
 
- 	TableLineShape.prototype.paintTableLine = function(c, line, dx, dy)
 
- 	{
 
- 		if (line != null)
 
- 		{
 
- 			var last = null;
 
- 			c.begin();
 
- 			for (var i = 0; i < line.length; i++)
 
- 			{
 
- 				var curr = line[i];
 
- 				if (curr != null)
 
- 				{
 
- 					if (last == null)
 
- 					{
 
- 						c.moveTo(curr.x + dx, curr.y + dy);
 
- 					}
 
- 					else if (last != null)
 
- 					{
 
- 						c.lineTo(curr.x + dx, curr.y + dy);
 
- 					}
 
- 				}
 
- 				last = curr;
 
- 			}
 
- 			c.end();
 
- 			c.stroke();
 
- 		}
 
- 	};
 
- 	/**
 
- 	 * Function: intersectsRectangle
 
- 	 * 
 
- 	 * Returns true if the shape intersects the given rectangle.
 
- 	 */
 
- 	TableLineShape.prototype.intersectsRectangle = function(rect)
 
- 	{
 
- 		var result = false;
 
- 		if (mxShape.prototype.intersectsRectangle.apply(this, arguments))
 
- 		{
 
- 			if (this.line != null)
 
- 			{
 
- 				var last = null;
 
- 	
 
- 				for (var i = 0; i < this.line.length && !result; i++)
 
- 				{
 
- 					var curr = this.line[i];
 
- 	
 
- 					if (curr != null && last != null)
 
- 					{
 
- 						result = mxUtils.rectangleIntersectsSegment(rect, last, curr);
 
- 					}
 
- 	
 
- 					last = curr;
 
- 				}
 
- 			}
 
- 		}
 
- 		return result;
 
- 	};
 
- 	mxCellRenderer.registerShape('tableLine', TableLineShape);
 
- 	// LATER: Use this to implement striping
 
- 	function paintTableBackground(state, c, x, y, w, h, r)
 
- 	{
 
- 		if (state != null)
 
- 		{
 
- 			var graph = state.view.graph;
 
- 			var start = graph.getActualStartSize(state.cell, true);
 
- 			var rows = graph.model.getChildCells(state.cell, true);
 
- 			
 
- 			if (rows.length > 0)
 
- 			{
 
- 				var events = false;
 
- 				
 
- 				if (this.style != null)
 
- 				{
 
- 					events = mxUtils.getValue(this.style, mxConstants.STYLE_POINTER_EVENTS, '1') == '1';
 
- 				}
 
- 				
 
- 				if (!events)
 
- 				{
 
- 					c.pointerEvents = false;
 
- 				}
 
- 				
 
- 				var evenRowColor = mxUtils.getValue(state.style,
 
- 					'evenRowColor', mxConstants.NONE);
 
- 				var oddRowColor = mxUtils.getValue(state.style,
 
- 					'oddRowColor', mxConstants.NONE);
 
- 				var evenColColor = mxUtils.getValue(state.style,
 
- 					'evenColumnColor', mxConstants.NONE);
 
- 				var oddColColor = mxUtils.getValue(state.style,
 
- 					'oddColumnColor', mxConstants.NONE);
 
- 				var cols = graph.model.getChildCells(rows[0], true);
 
- 				
 
- 				// Paints column backgrounds
 
- 				for (var i = 0; i < cols.length; i++)
 
- 				{
 
- 					var clr = (mxUtils.mod(i, 2) == 1) ? evenColColor : oddColColor;
 
- 					var geo = graph.getCellGeometry(cols[i]);
 
- 					
 
- 					if (geo != null && clr != mxConstants.NONE)
 
- 					{
 
- 						c.setFillColor(clr);
 
- 						c.begin();
 
- 						c.moveTo(x + geo.x, y + start.y);
 
- 						
 
- 						if (r > 0 && i == cols.length - 1)
 
- 						{
 
- 							c.lineTo(x + geo.x + geo.width - r, y);
 
- 							c.quadTo(x + geo.x + geo.width, y, x + geo.x + geo.width, y + r);
 
- 							c.lineTo(x + geo.x + geo.width, y + h - r);
 
- 							c.quadTo(x + geo.x + geo.width, y + h, x + geo.x + geo.width - r, y + h);
 
- 						}
 
- 						else
 
- 						{
 
- 							c.lineTo(x + geo.x + geo.width, y + start.y);
 
- 							c.lineTo(x + geo.x + geo.width, y + h - start.height);
 
- 						}
 
- 						
 
- 						c.lineTo(x + geo.x, y + h);
 
- 						c.close();
 
- 						c.fill();
 
- 					}
 
- 				}
 
- 				
 
- 				// Paints row backgrounds
 
- 				for (var i = 0; i < rows.length; i++)
 
- 				{
 
- 					var clr = (mxUtils.mod(i, 2) == 1) ? evenRowColor : oddRowColor;
 
- 					var geo = graph.getCellGeometry(rows[i]);
 
- 	
 
- 					if (geo != null && clr != mxConstants.NONE)
 
- 					{
 
- 						var b = (i == rows.length - 1) ? y + h : y + geo.y + geo.height;
 
- 						c.setFillColor(clr);
 
- 						
 
- 						c.begin();
 
- 						c.moveTo(x + start.x, y + geo.y);
 
- 						c.lineTo(x + w - start.width, y + geo.y);
 
- 						
 
- 						if (r > 0 && i == rows.length - 1)
 
- 						{
 
- 							c.lineTo(x + w, b - r);
 
- 							c.quadTo(x + w, b, x + w - r, b);
 
- 							c.lineTo(x + r, b);
 
- 							c.quadTo(x, b, x, b - r);
 
- 						}
 
- 						else
 
- 						{
 
- 							c.lineTo(x + w - start.width, b);
 
- 							c.lineTo(x + start.x, b);
 
- 						}
 
- 						
 
- 						c.close();
 
- 						c.fill();
 
- 					}
 
- 				}
 
- 			}
 
- 		}
 
- 	};
 
- 	// Table Shape
 
- 	function TableShape()
 
- 	{
 
- 		mxSwimlane.call(this);
 
- 	};
 
- 	
 
- 	mxUtils.extend(TableShape, mxSwimlane);
 
- 	TableShape.prototype.getLabelBounds = function(rect)
 
- 	{
 
- 		var start = this.getTitleSize();
 
- 		
 
- 		if (start == 0)
 
- 		{
 
- 			return mxShape.prototype.getLabelBounds.apply(this, arguments);
 
- 		}
 
- 		else
 
- 		{
 
- 			return mxSwimlane.prototype.getLabelBounds.apply(this, arguments);
 
- 		}
 
- 	};
 
- 	
 
- 	TableShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		// LATER: Split background to add striping, paint rows and cells
 
- 		//paintTableBackground(this.state, c, x, y, w, h);
 
- 		var collapsed = (this.state != null) ? this.state.view.graph.
 
- 			isCellCollapsed(this.state.cell) : false;
 
- 		var horizontal = this.isHorizontal();
 
- 		var start = this.getTitleSize();
 
- 		
 
- 		if (start == 0 || this.outline)
 
- 		{
 
- 			PartialRectangleShape.prototype.paintVertexShape.apply(this, arguments);
 
- 		}
 
- 		else
 
- 		{
 
- 			mxSwimlane.prototype.paintVertexShape.apply(this, arguments);
 
- 			c.translate(-x, -y);
 
- 		}
 
- 		if (!collapsed && !this.outline &&
 
- 			((horizontal && start < h) ||
 
- 			(!horizontal && start < w)))
 
- 		{
 
- 			this.paintForeground(c, x, y, w, h);
 
- 		}
 
- 	};
 
- 	TableShape.prototype.paintForeground = function(c, x, y, w, h)
 
- 	{
 
- 		if (this.state != null)
 
- 		{
 
- 			var flipH = this.flipH;
 
- 			var flipV = this.flipV;
 
- 			
 
- 			if (this.direction == mxConstants.DIRECTION_NORTH || this.direction == mxConstants.DIRECTION_SOUTH)
 
- 			{
 
- 				var tmp = flipH;
 
- 				flipH = flipV;
 
- 				flipV = tmp;
 
- 			}
 
- 			
 
- 			// Negative transform to avoid save/restore
 
- 			c.rotate(-this.getShapeRotation(), flipH, flipV, x + w / 2, y + h / 2);
 
- 			
 
- 			s = this.scale;
 
- 			x = this.bounds.x / s;
 
- 			y = this.bounds.y / s;
 
- 			w = this.bounds.width / s;
 
- 			h = this.bounds.height / s;
 
- 			this.paintTableForeground(c, x, y, w, h);
 
- 		}
 
- 	};
 
- 	TableShape.prototype.paintTableForeground = function(c, x, y, w, h)
 
- 	{
 
- 		var lines = this.state.view.graph.getTableLines(this.state.cell,
 
- 			mxUtils.getValue(this.state.style, 'rowLines', '1') != '0',
 
- 			mxUtils.getValue(this.state.style, 'columnLines', '1') != '0');
 
- 		for (var i = 0; i < lines.length; i++)
 
- 		{
 
- 			TableLineShape.prototype.paintTableLine(c, lines[i], x, y);
 
- 		}
 
- 	}
 
- 	
 
- 	TableShape.prototype.configurePointerEvents = function(c)
 
- 	{
 
- 		var start = this.getTitleSize();
 
- 		if (start == 0)
 
- 		{
 
- 			c.pointerEvents = false;
 
- 		}
 
- 		else
 
- 		{
 
- 			mxSwimlane.prototype.configurePointerEvents.apply(this, arguments);
 
- 		}
 
- 	};
 
- 	mxCellRenderer.registerShape('table', TableShape);
 
- 	// Table Row Shape
 
- 	function TableRowShape()
 
- 	{
 
- 		TableShape.call(this);
 
- 	};
 
- 	
 
- 	mxUtils.extend(TableRowShape, TableShape);
 
- 	TableRowShape.prototype.paintForeground = function()
 
- 	{
 
- 		// overridden to do nothing
 
- 	};
 
- 	
 
- 	mxCellRenderer.registerShape('tableRow', TableRowShape);
 
- 	// Cube Shape, supports size style
 
- 	function CubeShape()
 
- 	{
 
- 		mxCylinder.call(this);
 
- 	};
 
- 	mxUtils.extend(CubeShape, mxCylinder);
 
- 	CubeShape.prototype.size = 20;
 
- 	CubeShape.prototype.darkOpacity = 0;
 
- 	CubeShape.prototype.darkOpacity2 = 0;
 
- 	
 
- 	CubeShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		var s = Math.max(0, Math.min(w, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))));
 
- 		var op = Math.max(-1, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'darkOpacity', this.darkOpacity))));
 
- 		var op2 = Math.max(-1, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'darkOpacity2', this.darkOpacity2))));
 
- 		c.translate(x, y);
 
- 		
 
- 		c.begin();
 
- 		c.moveTo(0, 0);
 
- 		c.lineTo(w - s, 0);
 
- 		c.lineTo(w, s);
 
- 		c.lineTo(w, h);
 
- 		c.lineTo(s, h);
 
- 		c.lineTo(0, h - s);
 
- 		c.lineTo(0, 0);
 
- 		c.close();
 
- 		c.end();
 
- 		c.fillAndStroke();
 
- 		
 
- 		if (!this.outline)
 
- 		{
 
- 			c.setShadow(false);
 
- 	
 
- 			if (op != 0)
 
- 			{
 
- 				c.setFillAlpha(Math.abs(op));
 
- 				c.setFillColor((op < 0) ? '#FFFFFF' : '#000000');
 
- 				c.begin();
 
- 				c.moveTo(0, 0);
 
- 				c.lineTo(w - s, 0);
 
- 				c.lineTo(w, s);
 
- 				c.lineTo(s, s);
 
- 				c.close();
 
- 				c.fill();
 
- 			}
 
- 			if (op2 != 0)
 
- 			{
 
- 				c.setFillAlpha(Math.abs(op2));
 
- 				c.setFillColor((op2 < 0) ? '#FFFFFF' : '#000000');
 
- 				c.begin();
 
- 				c.moveTo(0, 0);
 
- 				c.lineTo(s, s);
 
- 				c.lineTo(s, h);
 
- 				c.lineTo(0, h - s);
 
- 				c.close();
 
- 				c.fill();
 
- 			}
 
- 			
 
- 			c.begin();
 
- 			c.moveTo(s, h);
 
- 			c.lineTo(s, s);
 
- 			c.lineTo(0, 0);
 
- 			c.moveTo(s, s);
 
- 			c.lineTo(w, s);
 
- 			c.end();
 
- 			c.stroke();
 
- 		}
 
- 	};
 
- 	CubeShape.prototype.getLabelMargins = function(rect)
 
- 	{
 
- 		if (mxUtils.getValue(this.style, 'boundedLbl', false))
 
- 		{
 
- 			var s = parseFloat(mxUtils.getValue(this.style, 'size', this.size)) * this.scale;
 
- 			
 
- 			return new mxRectangle(s, s, 0, 0);
 
- 		}
 
- 		
 
- 		return null;
 
- 	};
 
- 	
 
- 	mxCellRenderer.registerShape('cube', CubeShape);
 
- 	
 
- 	var tan30 = Math.tan(mxUtils.toRadians(30));
 
- 	var tan30Dx = (0.5 - tan30) / 2;
 
- 	mxCellRenderer.registerShape('isoRectangle', IsoRectangleShape);
 
- 	
 
- 	// Wire Shape
 
- 	function WireShape()
 
- 	{
 
- 		mxConnector.call(this);
 
- 	};
 
- 	mxUtils.extend(WireShape, mxConnector);
 
- 	WireShape.prototype.paintEdgeShape = function(c, pts)
 
- 	{
 
- 		// The indirection via functions for markers is needed in
 
- 		// order to apply the offsets before painting the line and
 
- 		// paint the markers after painting the line.
 
- 		var sourceMarker = this.createMarker(c, pts, true);
 
- 		var targetMarker = this.createMarker(c, pts, false);
 
- 		// Paints base line without dash pattern
 
- 		c.setDashed(false);
 
- 		mxPolyline.prototype.paintEdgeShape.apply(this, arguments);
 
- 		
 
- 		// Paints dashed line with dash pattern and fill color
 
- 		if (this.isDashed != null)
 
- 		{
 
- 			c.setDashed(this.isDashed, (this.style != null) ?
 
- 				mxUtils.getValue(this.style, mxConstants.STYLE_FIX_DASH, false) == 1 : false);
 
- 		}
 
- 		c.setShadow(false);
 
- 		c.setStrokeColor(this.fill);
 
- 		mxPolyline.prototype.paintEdgeShape.apply(this, arguments);
 
- 		// Paints markers with stroke color
 
- 		c.setStrokeColor(this.stroke);
 
- 		c.setFillColor(this.stroke);
 
- 		c.setDashed(false);
 
- 		
 
- 		if (sourceMarker != null)
 
- 		{
 
- 			sourceMarker();
 
- 		}
 
- 		
 
- 		if (targetMarker != null)
 
- 		{
 
- 			targetMarker();
 
- 		}
 
- 	};
 
- 	mxCellRenderer.registerShape('wire', WireShape);
 
- 	
 
- 	// Cube Shape, supports size style
 
- 	function WaypointShape()
 
- 	{
 
- 		mxCylinder.call(this);
 
- 	};
 
- 	mxUtils.extend(WaypointShape, mxCylinder);
 
- 	WaypointShape.prototype.size = 6;
 
- 	
 
- 	WaypointShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		c.setFillColor(this.stroke);
 
- 		var s = Math.max(0, parseFloat(mxUtils.getValue(this.style, 'size', this.size)) - 2) + 2 * this.strokewidth;
 
- 		c.ellipse(x + (w - s) * 0.5, y + (h - s) * 0.5, s, s);
 
- 		c.fill();
 
- 		
 
- 		c.setFillColor(mxConstants.NONE);
 
- 		c.rect(x, y, w, h);
 
- 		c.fill();
 
- 	};
 
- 	mxCellRenderer.registerShape('waypoint', WaypointShape);
 
- 	
 
- 	// Cube Shape, supports size style
 
- 	function IsoRectangleShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(IsoRectangleShape, mxActor);
 
- 	IsoRectangleShape.prototype.size = 20;
 
- 	IsoRectangleShape.prototype.redrawPath = function(path, x, y, w, h)
 
- 	{
 
- 		var m = Math.min(w, h / tan30);
 
- 		path.translate((w - m) / 2, (h - m) / 2 + m / 4);
 
- 		path.moveTo(0, 0.25 * m);
 
- 		path.lineTo(0.5 * m, m * tan30Dx);
 
- 		path.lineTo(m, 0.25 * m);
 
- 		path.lineTo(0.5 * m, (0.5 - tan30Dx) * m);
 
- 		path.lineTo(0, 0.25 * m);
 
- 		path.close();
 
- 		path.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('isoRectangle', IsoRectangleShape);
 
- 	// Cube Shape, supports size style
 
- 	function IsoCubeShape()
 
- 	{
 
- 		mxCylinder.call(this);
 
- 	};
 
- 	mxUtils.extend(IsoCubeShape, mxCylinder);
 
- 	IsoCubeShape.prototype.size = 20;
 
- 	IsoCubeShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
 
- 	{
 
- 		var m = Math.min(w, h / (0.5 + tan30));
 
- 		if (isForeground)
 
- 		{
 
- 			path.moveTo(0, 0.25 * m);
 
- 			path.lineTo(0.5 * m, (0.5 - tan30Dx) * m);
 
- 			path.lineTo(m, 0.25 * m);
 
- 			path.moveTo(0.5 * m, (0.5 - tan30Dx) * m);
 
- 			path.lineTo(0.5 * m, (1 - tan30Dx) * m);
 
- 			path.end();
 
- 		}
 
- 		else
 
- 		{
 
- 			path.translate((w - m) / 2, (h - m) / 2);
 
- 			path.moveTo(0, 0.25 * m);
 
- 			path.lineTo(0.5 * m, m * tan30Dx);
 
- 			path.lineTo(m, 0.25 * m);
 
- 			path.lineTo(m, 0.75 * m);
 
- 			path.lineTo(0.5 * m, (1 - tan30Dx) * m);
 
- 			path.lineTo(0, 0.75 * m);
 
- 			path.close();
 
- 			path.end();
 
- 		}
 
- 	};
 
- 	mxCellRenderer.registerShape('isoCube', IsoCubeShape);
 
- 	// DataStore Shape, supports size style
 
- 	function DataStoreShape()
 
- 	{
 
- 		mxCylinder.call(this);
 
- 	};
 
- 	mxUtils.extend(DataStoreShape, mxCylinder);
 
- 	DataStoreShape.prototype.redrawPath = function(c, x, y, w, h, isForeground)
 
- 	{
 
- 		var dy = Math.min(h / 2, Math.round(h / 8) + this.strokewidth - 1);
 
- 		
 
- 		if ((isForeground && this.fill != null) || (!isForeground && this.fill == null))
 
- 		{
 
- 			c.moveTo(0, dy);
 
- 			c.curveTo(0, 2 * dy, w, 2 * dy, w, dy);
 
- 			
 
- 			// Needs separate shapes for correct hit-detection
 
- 			if (!isForeground)
 
- 			{
 
- 				c.stroke();
 
- 				c.begin();
 
- 			}
 
- 			
 
- 			c.translate(0, dy / 2);
 
- 			c.moveTo(0, dy);
 
- 			c.curveTo(0, 2 * dy, w, 2 * dy, w, dy);
 
- 			
 
- 			// Needs separate shapes for correct hit-detection
 
- 			if (!isForeground)
 
- 			{
 
- 				c.stroke();
 
- 				c.begin();
 
- 			}
 
- 			
 
- 			c.translate(0, dy / 2);
 
- 			c.moveTo(0, dy);
 
- 			c.curveTo(0, 2 * dy, w, 2 * dy, w, dy);
 
- 			
 
- 			// Needs separate shapes for correct hit-detection
 
- 			if (!isForeground)
 
- 			{
 
- 				c.stroke();
 
- 				c.begin();
 
- 			}
 
- 			
 
- 			c.translate(0, -dy);
 
- 		}
 
- 		
 
- 		if (!isForeground)
 
- 		{
 
- 			c.moveTo(0, dy);
 
- 			c.curveTo(0, -dy / 3, w, -dy / 3, w, dy);
 
- 			c.lineTo(w, h - dy);
 
- 			c.curveTo(w, h + dy / 3, 0, h + dy / 3, 0, h - dy);
 
- 			c.close();
 
- 		}
 
- 	};
 
- 	DataStoreShape.prototype.getLabelMargins = function(rect)
 
- 	{
 
- 		return new mxRectangle(0, 2.5 * Math.min(rect.height / 2,
 
- 			Math.round(rect.height / 8) + this.strokewidth - 1), 0, 0);
 
- 	}
 
- 	mxCellRenderer.registerShape('datastore', DataStoreShape);
 
- 	// Note Shape, supports size style
 
- 	function NoteShape()
 
- 	{
 
- 		mxCylinder.call(this);
 
- 	};
 
- 	mxUtils.extend(NoteShape, mxCylinder);
 
- 	NoteShape.prototype.size = 30;
 
- 	NoteShape.prototype.darkOpacity = 0;
 
- 	
 
- 	NoteShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		var s = Math.max(0, Math.min(w, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))));
 
- 		var op = Math.max(-1, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'darkOpacity', this.darkOpacity))));
 
- 		c.translate(x, y);
 
- 		
 
- 		c.begin();
 
- 		c.moveTo(0, 0);
 
- 		c.lineTo(w - s, 0);
 
- 		c.lineTo(w, s);
 
- 		c.lineTo(w, h);
 
- 		c.lineTo(0, h);
 
- 		c.lineTo(0, 0);
 
- 		c.close();
 
- 		c.end();
 
- 		c.fillAndStroke();
 
- 		
 
- 		if (!this.outline)
 
- 		{
 
- 			c.setShadow(false);
 
- 	
 
- 			if (op != 0)
 
- 			{
 
- 				c.setFillAlpha(Math.abs(op));
 
- 				c.setFillColor((op < 0) ? '#FFFFFF' : '#000000');
 
- 				c.begin();
 
- 				c.moveTo(w - s, 0);
 
- 				c.lineTo(w - s, s);
 
- 				c.lineTo(w, s);
 
- 				c.close();
 
- 				c.fill();
 
- 			}
 
- 			
 
- 			c.begin();
 
- 			c.moveTo(w - s, 0);
 
- 			c.lineTo(w - s, s);
 
- 			c.lineTo(w, s);
 
- 			c.end();
 
- 			c.stroke();
 
- 		}
 
- 	};
 
- 	mxCellRenderer.registerShape('note', NoteShape);
 
- 	// Note Shape, supports size style
 
- 	function NoteShape2()
 
- 	{
 
- 		NoteShape.call(this);
 
- 	};
 
- 	mxUtils.extend(NoteShape2, NoteShape);
 
- 	
 
- 	mxCellRenderer.registerShape('note2', NoteShape2);
 
- 	NoteShape2.prototype.getLabelMargins = function(rect)
 
- 	{
 
- 		if (mxUtils.getValue(this.style, 'boundedLbl', false))
 
- 		{
 
- 			var size = mxUtils.getValue(this.style, 'size', 15);
 
- 			
 
- 			return new mxRectangle(0, Math.min(rect.height * this.scale, size * this.scale), 0, 0);
 
- 		}
 
- 		
 
- 		return null;
 
- 	};
 
- 	// Flexible cube Shape
 
- 	function IsoCubeShape2()
 
- 	{
 
- 		mxShape.call(this);
 
- 	};
 
- 	mxUtils.extend(IsoCubeShape2, mxShape);
 
- 	IsoCubeShape2.prototype.isoAngle = 15;
 
- 	
 
- 	IsoCubeShape2.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		var isoAngle = Math.max(0.01, Math.min(94, parseFloat(mxUtils.getValue(this.style, 'isoAngle', this.isoAngle)))) * Math.PI / 200 ;
 
- 		var isoH = Math.min(w * Math.tan(isoAngle), h * 0.5);
 
- 		c.translate(x,y);
 
- 		
 
- 		c.begin();
 
- 		c.moveTo(w * 0.5, 0);
 
- 		c.lineTo(w, isoH);
 
- 		c.lineTo(w, h - isoH);
 
- 		c.lineTo(w * 0.5, h);
 
- 		c.lineTo(0, h - isoH);
 
- 		c.lineTo(0, isoH);
 
- 		c.close();
 
- 		c.fillAndStroke();
 
- 		
 
- 		c.setShadow(false);
 
- 		
 
- 		c.begin();
 
- 		c.moveTo(0, isoH);
 
- 		c.lineTo(w * 0.5, 2 * isoH);
 
- 		c.lineTo(w, isoH);
 
- 		c.moveTo(w * 0.5, 2 * isoH);
 
- 		c.lineTo(w * 0.5, h);
 
- 		c.stroke();
 
- 	};
 
- 	
 
- 	mxCellRenderer.registerShape('isoCube2', IsoCubeShape2);
 
- 	
 
- 	// (LEGACY) Flexible cylinder Shape
 
- 	function CylinderShape()
 
- 	{
 
- 		mxShape.call(this);
 
- 	};
 
- 	
 
- 	mxUtils.extend(CylinderShape, mxShape);
 
- 	
 
- 	CylinderShape.prototype.size = 15;
 
- 	
 
- 	CylinderShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		var size = Math.max(0, Math.min(h * 0.5, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		c.translate(x,y);
 
- 		if (size == 0)
 
- 		{
 
- 			c.rect(0, 0, w, h);
 
- 			c.fillAndStroke();
 
- 		}
 
- 		else
 
- 		{
 
- 			c.begin();
 
- 			c.moveTo(0, size);
 
- 			c.arcTo(w * 0.5, size, 0, 0, 1, w * 0.5, 0);
 
- 			c.arcTo(w * 0.5, size, 0, 0, 1, w, size);
 
- 			c.lineTo(w, h - size);
 
- 			c.arcTo(w * 0.5, size, 0, 0, 1, w * 0.5, h);
 
- 			c.arcTo(w * 0.5, size, 0, 0, 1, 0, h - size);
 
- 			c.close();
 
- 			c.fillAndStroke();
 
- 			
 
- 			c.setShadow(false);
 
- 			
 
- 			c.begin();
 
- 			c.moveTo(w, size);
 
- 			c.arcTo(w * 0.5, size, 0, 0, 1, w * 0.5, 2 * size);
 
- 			c.arcTo(w * 0.5, size, 0, 0, 1, 0, size);
 
- 			c.stroke();
 
- 		}
 
- 	};
 
- 	
 
- 	mxCellRenderer.registerShape('cylinder2', CylinderShape);
 
- 	
 
- 	// Flexible cylinder3 Shape with offset label
 
- 	function CylinderShape3(bounds, fill, stroke, strokewidth)
 
- 	{
 
- 		mxShape.call(this);
 
- 		this.bounds = bounds;
 
- 		this.fill = fill;
 
- 		this.stroke = stroke;
 
- 		this.strokewidth = (strokewidth != null) ? strokewidth : 1;
 
- 	};
 
- 	
 
- 	mxUtils.extend(CylinderShape3, mxCylinder);
 
- 	CylinderShape3.prototype.size = 15;
 
- 	
 
- 	CylinderShape3.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		var size = Math.max(0, Math.min(h * 0.5, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		var lid = mxUtils.getValue(this.style, 'lid', true);
 
- 		c.translate(x,y);
 
- 		if (size == 0)
 
- 		{
 
- 			c.rect(0, 0, w, h);
 
- 			c.fillAndStroke();
 
- 		}
 
- 		else
 
- 		{
 
- 			c.begin();
 
- 			
 
- 			if (lid)
 
- 			{
 
- 				c.moveTo(0, size);
 
- 				c.arcTo(w * 0.5, size, 0, 0, 1, w * 0.5, 0);
 
- 				c.arcTo(w * 0.5, size, 0, 0, 1, w, size);
 
- 			}
 
- 			else
 
- 			{
 
- 				c.moveTo(0, 0);
 
- 				c.arcTo(w * 0.5, size, 0, 0, 0, w * 0.5, size);
 
- 				c.arcTo(w * 0.5, size, 0, 0, 0, w, 0);
 
- 			}
 
- 			c.lineTo(w, h - size);
 
- 			c.arcTo(w * 0.5, size, 0, 0, 1, w * 0.5, h);
 
- 			c.arcTo(w * 0.5, size, 0, 0, 1, 0, h - size);
 
- 			c.close();
 
- 			c.fillAndStroke();
 
- 			
 
- 			c.setShadow(false);
 
- 			
 
- 			if (lid)
 
- 			{
 
- 				c.begin();
 
- 				c.moveTo(w, size);
 
- 				c.arcTo(w * 0.5, size, 0, 0, 1, w * 0.5, 2 * size);
 
- 				c.arcTo(w * 0.5, size, 0, 0, 1, 0, size);
 
- 				c.stroke();
 
- 			}
 
- 		}
 
- 	};
 
- 	mxCellRenderer.registerShape('cylinder3', CylinderShape3);
 
- 	
 
- 	// Switch Shape, supports size style
 
- 	function SwitchShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(SwitchShape, mxActor);
 
- 	SwitchShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var curve = 0.5;
 
- 		c.moveTo(0, 0);
 
- 		c.quadTo(w / 2, h * curve,  w, 0);
 
- 		c.quadTo(w * (1 - curve), h / 2, w, h);
 
- 		c.quadTo(w / 2, h * (1 - curve), 0, h);
 
- 		c.quadTo(w * curve, h / 2, 0, 0);
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('switch', SwitchShape);
 
- 	// Folder Shape, supports tabWidth, tabHeight styles
 
- 	function FolderShape()
 
- 	{
 
- 		mxCylinder.call(this);
 
- 	};
 
- 	mxUtils.extend(FolderShape, mxCylinder);
 
- 	FolderShape.prototype.tabWidth = 60;
 
- 	FolderShape.prototype.tabHeight = 20;
 
- 	FolderShape.prototype.tabPosition = 'right';
 
- 	FolderShape.prototype.arcSize = 0.1;
 
- 	
 
- 	FolderShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		c.translate(x, y);
 
- 		
 
- 		var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'tabWidth', this.tabWidth))));
 
- 		var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'tabHeight', this.tabHeight))));
 
- 		var tp = mxUtils.getValue(this.style, 'tabPosition', this.tabPosition);
 
- 		var rounded = mxUtils.getValue(this.style, 'rounded', false);
 
- 		var absArcSize = mxUtils.getValue(this.style, 'absoluteArcSize', false);
 
- 		var arcSize = parseFloat(mxUtils.getValue(this.style, 'arcSize', this.arcSize));
 
- 		
 
- 		if (!absArcSize)
 
- 		{
 
- 			arcSize = Math.min(w, h) * arcSize;
 
- 		}
 
- 		
 
- 		arcSize = Math.min(arcSize, w * 0.5, (h - dy) * 0.5);
 
- 		
 
- 		dx = Math.max(dx, arcSize);
 
- 		dx = Math.min(w - arcSize, dx);
 
- 			
 
- 		if (!rounded)
 
- 		{
 
- 			arcSize = 0;
 
- 		}
 
- 		
 
- 		c.begin();
 
- 		
 
- 		if (tp == 'left')
 
- 		{
 
- 			c.moveTo(Math.max(arcSize, 0), dy);
 
- 			c.lineTo(Math.max(arcSize, 0), 0);
 
- 			c.lineTo(dx, 0);
 
- 			c.lineTo(dx, dy);
 
- 		}
 
- 		// Right is default
 
- 		else
 
- 		{
 
- 			c.moveTo(w - dx, dy);
 
- 			c.lineTo(w - dx, 0);
 
- 			c.lineTo(w - Math.max(arcSize, 0), 0);
 
- 			c.lineTo(w - Math.max(arcSize, 0), dy);
 
- 		}
 
- 		
 
- 		if (rounded)
 
- 		{
 
- 			c.moveTo(0, arcSize + dy);
 
- 			c.arcTo(arcSize, arcSize, 0, 0, 1, arcSize, dy);
 
- 			c.lineTo(w - arcSize, dy);
 
- 			c.arcTo(arcSize, arcSize, 0, 0, 1, w, arcSize + dy);
 
- 			c.lineTo(w, h - arcSize);
 
- 			c.arcTo(arcSize, arcSize, 0, 0, 1, w - arcSize, h);
 
- 			c.lineTo(arcSize, h);
 
- 			c.arcTo(arcSize, arcSize, 0, 0, 1, 0, h - arcSize);
 
- 		}
 
- 		else
 
- 		{
 
- 			c.moveTo(0, dy);
 
- 			c.lineTo(w, dy);
 
- 			c.lineTo(w, h);
 
- 			c.lineTo(0, h);
 
- 		}
 
- 		
 
- 		c.close();
 
- 		c.fillAndStroke();
 
- 		
 
- 		c.setShadow(false);
 
- 	
 
- 		var sym = mxUtils.getValue(this.style, 'folderSymbol', null);
 
- 		
 
- 		if (sym == 'triangle')
 
- 		{
 
- 			c.begin();
 
- 			c.moveTo(w - 30, dy + 20);
 
- 			c.lineTo(w - 20, dy + 10);
 
- 			c.lineTo(w - 10, dy + 20);
 
- 			c.close();
 
- 			c.stroke();
 
- 		}
 
- 	};
 
- 	mxCellRenderer.registerShape('folder', FolderShape);
 
- 	FolderShape.prototype.getLabelMargins = function(rect)
 
- 	{
 
- 		if (mxUtils.getValue(this.style, 'boundedLbl', false))
 
- 		{
 
- 			var sizeY = mxUtils.getValue(this.style, 'tabHeight', 15) * this.scale;
 
- 			if (mxUtils.getValue(this.style, 'labelInHeader', false))
 
- 			{
 
- 				var sizeX = mxUtils.getValue(this.style, 'tabWidth', 15) * this.scale;
 
- 				var sizeY = mxUtils.getValue(this.style, 'tabHeight', 15) * this.scale;
 
- 				var rounded = mxUtils.getValue(this.style, 'rounded', false);
 
- 				var absArcSize = mxUtils.getValue(this.style, 'absoluteArcSize', false);
 
- 				var arcSize = parseFloat(mxUtils.getValue(this.style, 'arcSize', this.arcSize));
 
- 				
 
- 				if (!absArcSize)
 
- 				{
 
- 					arcSize = Math.min(rect.width, rect.height) * arcSize;
 
- 				}
 
- 				
 
- 				arcSize = Math.min(arcSize, rect.width * 0.5, (rect.height - sizeY) * 0.5);
 
- 					
 
- 				if (!rounded)
 
- 				{
 
- 					arcSize = 0;
 
- 				}
 
- 				if (mxUtils.getValue(this.style, 'tabPosition', this.tabPosition) == 'left')
 
- 				{
 
- 					return new mxRectangle(arcSize, 0, Math.min(rect.width, rect.width - sizeX), Math.min(rect.height, rect.height - sizeY));
 
- 				}
 
- 				else
 
- 				{
 
- 					return new mxRectangle(Math.min(rect.width, rect.width - sizeX), 0, arcSize, Math.min(rect.height, rect.height - sizeY));
 
- 				}
 
- 			}
 
- 			else
 
- 			{
 
- 				return new mxRectangle(0, Math.min(rect.height, sizeY), 0, 0);
 
- 			}
 
- 		}
 
- 		
 
- 		return null;
 
- 	};
 
- 		
 
- 	//**********************************************************************************************************************************************************
 
- 	//UML State shape
 
- 	//**********************************************************************************************************************************************************
 
- 	function UMLStateShape()
 
- 	{
 
- 		mxCylinder.call(this);
 
- 	};
 
- 	mxUtils.extend(UMLStateShape, mxCylinder);
 
- 	UMLStateShape.prototype.arcSize = 0.1;
 
- 	UMLStateShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		c.translate(x, y);
 
- 		
 
- 		var rounded = mxUtils.getValue(this.style, 'rounded', false);
 
- 		var absArcSize = mxUtils.getValue(this.style, 'absoluteArcSize', false);
 
- 		var arcSize = parseFloat(mxUtils.getValue(this.style, 'arcSize', this.arcSize));
 
- 		var connPoint = mxUtils.getValue(this.style, 'umlStateConnection', null);
 
- 		
 
- 		if (!absArcSize)
 
- 		{
 
- 			arcSize = Math.min(w, h) * arcSize;
 
- 		}
 
- 		
 
- 		arcSize = Math.min(arcSize, w * 0.5, h * 0.5);
 
- 		
 
- 		if (!rounded)
 
- 		{
 
- 			arcSize = 0;
 
- 		}
 
- 		
 
- 		var dx = 0;
 
- 		
 
- 		if (connPoint != null)
 
- 		{
 
- 			dx = 10;
 
- 		}
 
- 		
 
- 		c.begin();
 
- 		c.moveTo(dx, arcSize);
 
- 		c.arcTo(arcSize, arcSize, 0, 0, 1, dx + arcSize, 0);
 
- 		c.lineTo(w - arcSize, 0);
 
- 		c.arcTo(arcSize, arcSize, 0, 0, 1, w, arcSize);
 
- 		c.lineTo(w, h - arcSize);
 
- 		c.arcTo(arcSize, arcSize, 0, 0, 1, w - arcSize, h);
 
- 		c.lineTo(dx + arcSize, h);
 
- 		c.arcTo(arcSize, arcSize, 0, 0, 1, dx, h - arcSize);
 
- 		c.close();
 
- 		c.fillAndStroke();
 
- 		
 
- 		c.setShadow(false);
 
- 		var sym = mxUtils.getValue(this.style, 'umlStateSymbol', null);
 
- 		
 
- 		if (sym == 'collapseState')
 
- 		{
 
- 			c.roundrect(w - 40, h - 20, 10, 10, 3, 3);
 
- 			c.stroke();
 
- 			c.roundrect(w - 20, h - 20, 10, 10, 3, 3);
 
- 			c.stroke();
 
- 			c.begin();
 
- 			c.moveTo(w - 30, h - 15);
 
- 			c.lineTo(w - 20, h - 15);
 
- 			c.stroke();
 
- 		}
 
- 		if (connPoint == 'connPointRefEntry')
 
- 		{
 
- 			c.ellipse(0, h * 0.5 - 10, 20, 20);
 
- 			c.fillAndStroke();
 
- 		}
 
- 		else if (connPoint == 'connPointRefExit')
 
- 		{
 
- 			c.ellipse(0, h * 0.5 - 10, 20, 20);
 
- 			c.fillAndStroke();
 
- 			
 
- 			c.begin();
 
- 			c.moveTo(5, h * 0.5 - 5);
 
- 			c.lineTo(15, h * 0.5 + 5);
 
- 			c.moveTo(15, h * 0.5 - 5);
 
- 			c.lineTo(5, h * 0.5 + 5);
 
- 			c.stroke();
 
- 		}
 
- 	};
 
- 	UMLStateShape.prototype.getLabelMargins = function(rect)
 
- 	{
 
- 		if (mxUtils.getValue(this.style, 'boundedLbl', false))
 
- 		{
 
- 			var connPoint = mxUtils.getValue(this.style, 'umlStateConnection', null);
 
- 			
 
- 			if (connPoint != null)
 
- 			{
 
- 				return new mxRectangle(10 * this.scale, 0, 0, 0);
 
- 			}
 
- 		}
 
- 		
 
- 		return null;
 
- 	};
 
- 	mxCellRenderer.registerShape('umlState', UMLStateShape);
 
- 	// Card shape
 
- 	function CardShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(CardShape, mxActor);
 
- 	CardShape.prototype.size = 30;
 
- 	CardShape.prototype.isRoundable = function()
 
- 	{
 
- 		return true;
 
- 	};
 
- 	CardShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var s = Math.max(0, Math.min(w, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))));
 
- 		var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
 
- 		this.addPoints(c, [new mxPoint(s, 0), new mxPoint(w, 0), new mxPoint(w, h), new mxPoint(0, h), new mxPoint(0, s)],
 
- 				this.isRounded, arcSize, true);
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('card', CardShape);
 
- 	// Tape shape
 
- 	function TapeShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(TapeShape, mxActor);
 
- 	TapeShape.prototype.size = 0.4;
 
- 	TapeShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var dy = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		var fy = 1.4;
 
- 		
 
- 		c.moveTo(0, dy / 2);
 
- 		c.quadTo(w / 4, dy * fy, w / 2, dy / 2);
 
- 		c.quadTo(w * 3 / 4, dy * (1 - fy), w, dy / 2);
 
- 		c.lineTo(w, h - dy / 2);
 
- 		c.quadTo(w * 3 / 4, h - dy * fy, w / 2, h - dy / 2);
 
- 		c.quadTo(w / 4, h - dy * (1 - fy), 0, h - dy / 2);
 
- 		c.lineTo(0, dy / 2);
 
- 		c.close();
 
- 		c.end();
 
- 	};
 
- 	
 
- 	TapeShape.prototype.getLabelBounds = function(rect)
 
- 	{
 
- 		if (mxUtils.getValue(this.style, 'boundedLbl', false))
 
- 		{
 
- 			var size = mxUtils.getValue(this.style, 'size', this.size);			
 
- 			var w = rect.width;
 
- 			var h = rect.height;
 
- 			
 
- 			if (this.direction == null ||
 
- 					this.direction == mxConstants.DIRECTION_EAST ||
 
- 					this.direction == mxConstants.DIRECTION_WEST)
 
- 			{
 
- 				var dy = h * size;
 
- 				
 
- 				return new mxRectangle(rect.x, rect.y + dy, w, h - 2 * dy);
 
- 			}
 
- 			else
 
- 			{
 
- 				var dx = w * size;
 
- 				
 
- 				return new mxRectangle(rect.x + dx, rect.y, w - 2 * dx, h);
 
- 			}
 
- 		}
 
- 		
 
- 		return rect;
 
- 	};
 
- 	
 
- 	mxCellRenderer.registerShape('tape', TapeShape);
 
- 	// Document shape
 
- 	function DocumentShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(DocumentShape, mxActor);
 
- 	DocumentShape.prototype.size = 0.3;
 
- 	DocumentShape.prototype.getLabelMargins = function(rect)
 
- 	{
 
- 		if (mxUtils.getValue(this.style, 'boundedLbl', false))
 
- 		{
 
- 			return new mxRectangle(0, 0, 0, parseFloat(mxUtils.getValue(
 
- 				this.style, 'size', this.size)) * rect.height);
 
- 		}
 
- 		
 
- 		return null;
 
- 	};
 
- 	DocumentShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var dy = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		var fy = 1.4;
 
- 		
 
- 		c.moveTo(0, 0);
 
- 		c.lineTo(w, 0);
 
- 		c.lineTo(w, h - dy / 2);
 
- 		c.quadTo(w * 3 / 4, h - dy * fy, w / 2, h - dy / 2);
 
- 		c.quadTo(w / 4, h - dy * (1 - fy), 0, h - dy / 2);
 
- 		c.lineTo(0, dy / 2);
 
- 		c.close();
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('document', DocumentShape);
 
- 	var cylinderGetCylinderSize = mxCylinder.prototype.getCylinderSize;
 
- 	
 
- 	mxCylinder.prototype.getCylinderSize = function(x, y, w, h)
 
- 	{
 
- 		var size = mxUtils.getValue(this.style, 'size');
 
- 		
 
- 		if (size != null)
 
- 		{
 
- 			return h * Math.max(0, Math.min(1, size));
 
- 		}
 
- 		else
 
- 		{
 
- 			return cylinderGetCylinderSize.apply(this, arguments);
 
- 		}
 
- 	};
 
- 	
 
- 	mxCylinder.prototype.getLabelMargins = function(rect)
 
- 	{
 
- 		if (mxUtils.getValue(this.style, 'boundedLbl', false))
 
- 		{
 
- 			var size = mxUtils.getValue(this.style, 'size', 0.15) * 2;
 
- 			
 
- 			return new mxRectangle(0, Math.min(this.maxHeight * this.scale, rect.height * size), 0, 0);
 
- 		}
 
- 		
 
- 		return null;
 
- 	};
 
- 	CylinderShape3.prototype.getLabelMargins = function(rect)
 
- 	{
 
- 		if (mxUtils.getValue(this.style, 'boundedLbl', false))
 
- 		{
 
- 			var size = mxUtils.getValue(this.style, 'size', 15);
 
- 			
 
- 			if (!mxUtils.getValue(this.style, 'lid', true))
 
- 			{
 
- 				size /= 2;
 
- 			}
 
- 			
 
- 			return new mxRectangle(0, Math.min(rect.height * this.scale, size * 2 * this.scale), 0, Math.max(0, size * 0.3 * this.scale));
 
- 		}
 
- 		
 
- 		return null;
 
- 	};
 
- 	FolderShape.prototype.getLabelMargins = function(rect)
 
- 	{
 
- 		if (mxUtils.getValue(this.style, 'boundedLbl', false))
 
- 		{
 
- 			var sizeY = mxUtils.getValue(this.style, 'tabHeight', 15) * this.scale;
 
- 			if (mxUtils.getValue(this.style, 'labelInHeader', false))
 
- 			{
 
- 				var sizeX = mxUtils.getValue(this.style, 'tabWidth', 15) * this.scale;
 
- 				var sizeY = mxUtils.getValue(this.style, 'tabHeight', 15) * this.scale;
 
- 				var rounded = mxUtils.getValue(this.style, 'rounded', false);
 
- 				var absArcSize = mxUtils.getValue(this.style, 'absoluteArcSize', false);
 
- 				var arcSize = parseFloat(mxUtils.getValue(this.style, 'arcSize', this.arcSize));
 
- 				
 
- 				if (!absArcSize)
 
- 				{
 
- 					arcSize = Math.min(rect.width, rect.height) * arcSize;
 
- 				}
 
- 				
 
- 				arcSize = Math.min(arcSize, rect.width * 0.5, (rect.height - sizeY) * 0.5);
 
- 					
 
- 				if (!rounded)
 
- 				{
 
- 					arcSize = 0;
 
- 				}
 
- 	
 
- 				if (mxUtils.getValue(this.style, 'tabPosition', this.tabPosition) == 'left')
 
- 				{
 
- 					return new mxRectangle(arcSize, 0, Math.min(rect.width, rect.width - sizeX), Math.min(rect.height, rect.height - sizeY));
 
- 				}
 
- 				else
 
- 				{
 
- 					return new mxRectangle(Math.min(rect.width, rect.width - sizeX), 0, arcSize, Math.min(rect.height, rect.height - sizeY));
 
- 				}
 
- 			}
 
- 			else
 
- 			{
 
- 				return new mxRectangle(0, Math.min(rect.height, sizeY), 0, 0);
 
- 			}
 
- 		}
 
- 		
 
- 		return null;
 
- 	};
 
- 	UMLStateShape.prototype.getLabelMargins = function(rect)
 
- 	{
 
- 		if (mxUtils.getValue(this.style, 'boundedLbl', false))
 
- 		{
 
- 			var connPoint = mxUtils.getValue(this.style, 'umlStateConnection', null);
 
- 			
 
- 			if (connPoint != null)
 
- 			{
 
- 				return new mxRectangle(10 * this.scale, 0, 0, 0);
 
- 			}
 
- 		}
 
- 		
 
- 		return null;
 
- 	};
 
- 	NoteShape2.prototype.getLabelMargins = function(rect)
 
- 	{
 
- 		if (mxUtils.getValue(this.style, 'boundedLbl', false))
 
- 		{
 
- 			var size = mxUtils.getValue(this.style, 'size', 15);
 
- 			
 
- 			return new mxRectangle(0, Math.min(rect.height * this.scale, size * this.scale), 0, Math.max(0, size * this.scale));
 
- 		}
 
- 		
 
- 		return null;
 
- 	};
 
- 	// Parallelogram shape
 
- 	function ParallelogramShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(ParallelogramShape, mxActor);
 
- 	ParallelogramShape.prototype.size = 0.2;
 
- 	ParallelogramShape.prototype.fixedSize = 20;
 
- 	ParallelogramShape.prototype.isRoundable = function()
 
- 	{
 
- 		return true;
 
- 	};
 
- 	ParallelogramShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var fixed = mxUtils.getValue(this.style, 'fixedSize', '0') != '0';
 
- 		var dx = (fixed) ? Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'size', this.fixedSize)))) : w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
 
- 		this.addPoints(c, [new mxPoint(0, h), new mxPoint(dx, 0), new mxPoint(w, 0), new mxPoint(w - dx, h)],
 
- 				this.isRounded, arcSize, true);
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('parallelogram', ParallelogramShape);
 
- 	// Trapezoid shape
 
- 	function TrapezoidShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(TrapezoidShape, mxActor);
 
- 	TrapezoidShape.prototype.size = 0.2;
 
- 	TrapezoidShape.prototype.fixedSize = 20;
 
- 	TrapezoidShape.prototype.isRoundable = function()
 
- 	{
 
- 		return true;
 
- 	};
 
- 	TrapezoidShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		
 
- 		var fixed = mxUtils.getValue(this.style, 'fixedSize', '0') != '0';
 
- 		var dx = (fixed) ? Math.max(0, Math.min(w * 0.5, parseFloat(mxUtils.getValue(this.style, 'size', this.fixedSize)))) : w * Math.max(0, Math.min(0.5, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
 
- 		this.addPoints(c, [new mxPoint(0, h), new mxPoint(dx, 0), new mxPoint(w - dx, 0), new mxPoint(w, h)],
 
- 				this.isRounded, arcSize, true);
 
- 	};
 
- 	mxCellRenderer.registerShape('trapezoid', TrapezoidShape);
 
- 	// Curly Bracket shape
 
- 	function CurlyBracketShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(CurlyBracketShape, mxActor);
 
- 	CurlyBracketShape.prototype.size = 0.5;
 
- 	CurlyBracketShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		c.setFillColor(null);
 
- 		var s = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
 
- 		this.addPoints(c, [new mxPoint(w, 0), new mxPoint(s, 0), new mxPoint(s, h / 2),
 
- 		                   new mxPoint(0, h / 2), new mxPoint(s, h / 2), new mxPoint(s, h),
 
- 		                   new mxPoint(w, h)], this.isRounded, arcSize, false);
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('curlyBracket', CurlyBracketShape);
 
- 	// Parallel marker shape
 
- 	function ParallelMarkerShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(ParallelMarkerShape, mxActor);
 
- 	ParallelMarkerShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		c.setStrokeWidth(1);
 
- 		c.setFillColor(this.stroke);
 
- 		var w2 = w / 5;
 
- 		c.rect(0, 0, w2, h);
 
- 		c.fillAndStroke();
 
- 		c.rect(2 * w2, 0, w2, h);
 
- 		c.fillAndStroke();
 
- 		c.rect(4 * w2, 0, w2, h);
 
- 		c.fillAndStroke();
 
- 	};
 
- 	mxCellRenderer.registerShape('parallelMarker', ParallelMarkerShape);
 
- 	/**
 
- 	 * Adds handJiggle style (jiggle=n sets jiggle)
 
- 	 */
 
- 	function HandJiggle(canvas, defaultVariation)
 
- 	{
 
- 		this.canvas = canvas;
 
- 		
 
- 		// Avoids "spikes" in the output
 
- 		this.canvas.setLineJoin('round');
 
- 		this.canvas.setLineCap('round');
 
- 		
 
- 		this.defaultVariation = defaultVariation;
 
- 		
 
- 		this.originalLineTo = this.canvas.lineTo;
 
- 		this.canvas.lineTo = mxUtils.bind(this, HandJiggle.prototype.lineTo);
 
- 		
 
- 		this.originalMoveTo = this.canvas.moveTo;
 
- 		this.canvas.moveTo = mxUtils.bind(this, HandJiggle.prototype.moveTo);
 
- 		
 
- 		this.originalClose = this.canvas.close;
 
- 		this.canvas.close = mxUtils.bind(this, HandJiggle.prototype.close);
 
- 		
 
- 		this.originalQuadTo = this.canvas.quadTo;
 
- 		this.canvas.quadTo = mxUtils.bind(this, HandJiggle.prototype.quadTo);
 
- 		
 
- 		this.originalCurveTo = this.canvas.curveTo;
 
- 		this.canvas.curveTo = mxUtils.bind(this, HandJiggle.prototype.curveTo);
 
- 		
 
- 		this.originalArcTo = this.canvas.arcTo;
 
- 		this.canvas.arcTo = mxUtils.bind(this, HandJiggle.prototype.arcTo);
 
- 	};
 
- 	
 
- 	HandJiggle.prototype.moveTo = function(endX, endY)
 
- 	{
 
- 		this.originalMoveTo.apply(this.canvas, arguments);
 
- 		this.lastX = endX;
 
- 		this.lastY = endY;
 
- 		this.firstX = endX;
 
- 		this.firstY = endY;
 
- 	};
 
- 	
 
- 	HandJiggle.prototype.close = function()
 
- 	{
 
- 		if (this.firstX != null && this.firstY != null)
 
- 		{
 
- 			this.lineTo(this.firstX, this.firstY);
 
- 			this.originalClose.apply(this.canvas, arguments);
 
- 		}
 
- 		
 
- 		this.originalClose.apply(this.canvas, arguments);
 
- 	};
 
- 	
 
- 	HandJiggle.prototype.quadTo = function(x1, y1, x2, y2)
 
- 	{
 
- 		this.originalQuadTo.apply(this.canvas, arguments);
 
- 		this.lastX = x2;
 
- 		this.lastY = y2;
 
- 	};
 
- 	
 
- 	HandJiggle.prototype.curveTo = function(x1, y1, x2, y2, x3, y3)
 
- 	{
 
- 		this.originalCurveTo.apply(this.canvas, arguments);
 
- 		this.lastX = x3;
 
- 		this.lastY = y3;
 
- 	};
 
- 	
 
- 	HandJiggle.prototype.arcTo = function(rx, ry, angle, largeArcFlag, sweepFlag, x, y)
 
- 	{
 
- 		this.originalArcTo.apply(this.canvas, arguments);
 
- 		this.lastX = x;
 
- 		this.lastY = y;
 
- 	};
 
- 	HandJiggle.prototype.lineTo = function(endX, endY)
 
- 	{
 
- 		// LATER: Check why this.canvas.lastX cannot be used
 
- 		if (this.lastX != null && this.lastY != null)
 
- 		{
 
- 			var dx = Math.abs(endX - this.lastX);
 
- 			var dy = Math.abs(endY - this.lastY);
 
- 			var dist = Math.sqrt(dx * dx + dy * dy);
 
- 			
 
- 			if (dist < 2)
 
- 			{
 
- 				this.originalLineTo.apply(this.canvas, arguments);
 
- 				this.lastX = endX;
 
- 				this.lastY = endY;
 
- 				
 
- 				return;
 
- 			}
 
- 	
 
- 			var segs = Math.round(dist / 10);
 
- 			var variation = this.defaultVariation;
 
- 			
 
- 			if (segs < 5)
 
- 			{
 
- 				segs = 5;
 
- 				variation /= 3;
 
- 			}
 
- 			
 
- 			function sign(x)
 
- 			{
 
- 			    return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
 
- 			}
 
- 	
 
- 			var stepX = sign(endX - this.lastX) * dx / segs;
 
- 			var stepY = sign(endY - this.lastY) * dy / segs;
 
- 	
 
- 			var fx = dx / dist;
 
- 			var fy = dy / dist;
 
- 	
 
- 			for (var s = 0; s < segs; s++)
 
- 			{
 
- 				var x = stepX * s + this.lastX;
 
- 				var y = stepY * s + this.lastY;
 
- 	
 
- 				var offset = (Math.random() - 0.5) * variation;
 
- 				this.originalLineTo.call(this.canvas, x - offset * fy, y - offset * fx);
 
- 			}
 
- 			
 
- 			this.originalLineTo.call(this.canvas, endX, endY);
 
- 			this.lastX = endX;
 
- 			this.lastY = endY;
 
- 		}
 
- 		else
 
- 		{
 
- 			this.originalLineTo.apply(this.canvas, arguments);
 
- 			this.lastX = endX;
 
- 			this.lastY = endY;
 
- 		}
 
- 	};
 
- 	
 
- 	HandJiggle.prototype.destroy = function()
 
- 	{
 
- 		 this.canvas.lineTo = this.originalLineTo;
 
- 		 this.canvas.moveTo = this.originalMoveTo;
 
- 		 this.canvas.close = this.originalClose;
 
- 		 this.canvas.quadTo = this.originalQuadTo;
 
- 		 this.canvas.curveTo = this.originalCurveTo;
 
- 		 this.canvas.arcTo = this.originalArcTo;
 
- 	};
 
- 	
 
- 	// Installs hand jiggle for comic and sketch style
 
- 	var shapeBeforePaint = mxShape.prototype.beforePaint;
 
- 	mxShape.prototype.beforePaint = function(c)
 
- 	{
 
- 		shapeBeforePaint.apply(this, arguments);
 
- 		
 
- 		if (c.handJiggle == null)
 
- 		{
 
- 			c.handJiggle = this.createHandJiggle(c);
 
- 		}
 
- 	};
 
- 	
 
- 	var shapeAfterPaint = mxShape.prototype.afterPaint;
 
- 	mxShape.prototype.afterPaint = function(c)
 
- 	{
 
- 		shapeAfterPaint.apply(this, arguments);
 
- 		
 
- 		if (c.handJiggle != null)
 
- 		{
 
- 			c.handJiggle.destroy();
 
- 			delete c.handJiggle;
 
- 		}
 
- 	};
 
- 		
 
- 	// Returns a new HandJiggle canvas
 
- 	mxShape.prototype.createComicCanvas = function(c)
 
- 	{
 
- 		return new HandJiggle(c, mxUtils.getValue(this.style, 'jiggle', Editor.sketchDefaultJiggle));
 
- 	};
 
- 	
 
- 	// Overrides to avoid call to rect
 
- 	mxShape.prototype.createHandJiggle = function(c)
 
- 	{
 
- 		if (!this.outline && this.style != null && mxUtils.getValue(this.style, 'comic', '0') != '0')
 
- 		{
 
- 			return this.createComicCanvas(c);
 
- 		}
 
- 		
 
- 		return null;
 
- 	};
 
- 	
 
- 	// Overrides to avoid call to rect
 
- 	var mxRectangleShapeIsHtmlAllowed0 = mxRectangleShape.prototype.isHtmlAllowed;
 
- 	mxRectangleShape.prototype.isHtmlAllowed = function()
 
- 	{
 
- 		return !this.outline && (this.style == null || (mxUtils.getValue(this.style, 'comic', '0') == '0' &&
 
- 			mxUtils.getValue(this.style, 'sketch', (urlParams['rough'] == '1') ? '1' : '0') == '0')) &&
 
- 			mxRectangleShapeIsHtmlAllowed0.apply(this, arguments);
 
- 	};
 
- 	
 
- 	var mxRectangleShapePaintBackground0 = mxRectangleShape.prototype.paintBackground;
 
- 	mxRectangleShape.prototype.paintBackground = function(c, x, y, w, h)
 
- 	{
 
- 		if (c.handJiggle == null || c.handJiggle.constructor != HandJiggle)
 
- 		{
 
- 			mxRectangleShapePaintBackground0.apply(this, arguments);
 
- 		}
 
- 		else
 
- 		{
 
- 			var events = true;
 
- 			if (this.style != null)
 
- 			{
 
- 				events = mxUtils.getValue(this.style, mxConstants.STYLE_POINTER_EVENTS, '1') == '1';		
 
- 			}
 
- 			if (events || (this.fill != null && this.fill != mxConstants.NONE) ||
 
- 				(this.stroke != null && this.stroke != mxConstants.NONE))
 
- 			{
 
- 				if (!events && (this.fill == null || this.fill == mxConstants.NONE))
 
- 				{
 
- 					c.pointerEvents = false;
 
- 				}
 
- 				c.begin();
 
- 				if (this.isRounded)
 
- 				{
 
- 					var r = 0;
 
- 					if (mxUtils.getValue(this.style, mxConstants.STYLE_ABSOLUTE_ARCSIZE, 0) == '1')
 
- 					{
 
- 						r = Math.min(w / 2, Math.min(h / 2, mxUtils.getValue(this.style,
 
- 							mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2));
 
- 					}
 
- 					else
 
- 					{
 
- 						var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE,
 
- 							mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) / 100;
 
- 						r = Math.min(w * f, h * f);
 
- 					}
 
- 					c.moveTo(x + r, y);
 
- 					c.lineTo(x + w - r, y);
 
- 					c.quadTo(x + w, y, x + w, y + r);
 
- 					c.lineTo(x + w, y + h - r);
 
- 					c.quadTo(x + w, y + h, x + w - r, y + h);
 
- 					c.lineTo(x + r, y + h);
 
- 					c.quadTo(x, y + h, x, y + h - r);
 
- 					c.lineTo(x, y + r);
 
- 					c.quadTo(x, y, x + r, y);
 
- 				}
 
- 				else
 
- 				{
 
- 					c.moveTo(x, y);
 
- 					c.lineTo(x + w, y);
 
- 					c.lineTo(x + w, y + h);
 
- 					c.lineTo(x, y + h);
 
- 					c.lineTo(x, y);
 
- 				}
 
- 				// LATER: Check if close is needed here
 
- 				c.close();
 
- 				c.end();
 
- 				c.fillAndStroke();
 
- 			}			
 
- 		}
 
- 	};
 
- 	// End of hand jiggle integration
 
- 	
 
- 	// Process Shape
 
- 	function ProcessShape()
 
- 	{
 
- 		mxRectangleShape.call(this);
 
- 	};
 
- 	mxUtils.extend(ProcessShape, mxRectangleShape);
 
- 	ProcessShape.prototype.size = 0.1;
 
- 	ProcessShape.prototype.fixedSize = false;
 
- 	
 
- 	ProcessShape.prototype.isHtmlAllowed = function()
 
- 	{
 
- 		return false;
 
- 	};
 
- 	ProcessShape.prototype.getLabelBounds = function(rect)
 
- 	{
 
- 		if (mxUtils.getValue(this.state.style, mxConstants.STYLE_HORIZONTAL, true) ==
 
- 			(this.direction == null ||
 
- 			this.direction == mxConstants.DIRECTION_EAST ||
 
- 			this.direction == mxConstants.DIRECTION_WEST))
 
- 		{
 
- 			var w = rect.width;
 
- 			var h = rect.height;
 
- 			var r = new mxRectangle(rect.x, rect.y, w, h);
 
- 	
 
- 			var inset = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 	
 
- 			if (this.isRounded)
 
- 			{
 
- 				var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE,
 
- 					mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) / 100;
 
- 				inset = Math.max(inset, Math.min(w * f, h * f));
 
- 			}
 
- 			
 
- 			r.x += Math.round(inset);
 
- 			r.width -= Math.round(2 * inset);
 
- 			
 
- 			return r;
 
- 		}
 
- 		
 
- 		return rect;
 
- 	};
 
- 	ProcessShape.prototype.paintForeground = function(c, x, y, w, h)
 
- 	{
 
- 		var isFixedSize = mxUtils.getValue(this.style, 'fixedSize', this.fixedSize);
 
- 		var inset = parseFloat(mxUtils.getValue(this.style, 'size', this.size));
 
- 		
 
- 		if (isFixedSize)
 
- 		{
 
- 			inset = Math.max(0, Math.min(w, inset));
 
- 		}
 
- 		else
 
- 		{
 
- 			inset = w * Math.max(0, Math.min(1, inset));
 
- 		}
 
- 	
 
- 		if (this.isRounded)
 
- 		{
 
- 			var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE,
 
- 				mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) / 100;
 
- 			inset = Math.max(inset, Math.min(w * f, h * f));
 
- 		}
 
- 		
 
- 		// Crisp rendering of inner lines
 
- 		inset = Math.round(inset);
 
- 		
 
- 		c.begin();
 
- 		c.moveTo(x + inset, y);
 
- 		c.lineTo(x + inset, y + h);
 
- 		c.moveTo(x + w - inset, y);
 
- 		c.lineTo(x + w - inset, y + h);
 
- 		c.end();
 
- 		c.stroke();
 
- 		mxRectangleShape.prototype.paintForeground.apply(this, arguments);
 
- 	};
 
- 	mxCellRenderer.registerShape('process', ProcessShape);
 
- 	//Register the same shape with another name for backwards compatibility
 
- 	mxCellRenderer.registerShape('process2', ProcessShape);
 
- 	
 
- 	// Transparent Shape
 
- 	function TransparentShape()
 
- 	{
 
- 		mxRectangleShape.call(this);
 
- 	};
 
- 	mxUtils.extend(TransparentShape, mxRectangleShape);
 
- 	TransparentShape.prototype.paintBackground = function(c, x, y, w, h)
 
- 	{
 
- 		c.setFillColor(mxConstants.NONE);
 
- 		c.rect(x, y, w, h);
 
- 		c.fill();
 
- 	};
 
- 	TransparentShape.prototype.paintForeground = function(c, x, y, w, h) 	{ };
 
- 	mxCellRenderer.registerShape('transparent', TransparentShape);
 
- 	// Callout shape
 
- 	function CalloutShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(CalloutShape, mxHexagon);
 
- 	CalloutShape.prototype.size = 30;
 
- 	CalloutShape.prototype.position = 0.5;
 
- 	CalloutShape.prototype.position2 = 0.5;
 
- 	CalloutShape.prototype.base = 20;
 
- 	CalloutShape.prototype.getLabelMargins = function()
 
- 	{
 
- 		return new mxRectangle(0, 0, 0, parseFloat(mxUtils.getValue(
 
- 			this.style, 'size', this.size)) * this.scale);
 
- 	};
 
- 	CalloutShape.prototype.isRoundable = function()
 
- 	{
 
- 		return true;
 
- 	};
 
- 	CalloutShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
 
- 		var s = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		var dx = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'position', this.position))));
 
- 		var dx2 = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'position2', this.position2))));
 
- 		var base = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'base', this.base))));
 
- 		
 
- 		this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w, 0), new mxPoint(w, h - s),
 
- 			new mxPoint(Math.min(w, dx + base), h - s), new mxPoint(dx2, h),
 
- 			new mxPoint(Math.max(0, dx), h - s), new mxPoint(0, h - s)],
 
- 			this.isRounded, arcSize, true, [4]);
 
- 	};
 
- 	mxCellRenderer.registerShape('callout', CalloutShape);
 
- 	// Step shape
 
- 	function StepShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(StepShape, mxActor);
 
- 	StepShape.prototype.size = 0.2;
 
- 	StepShape.prototype.fixedSize = 20;
 
- 	StepShape.prototype.isRoundable = function()
 
- 	{
 
- 		return true;
 
- 	};
 
- 	StepShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var fixed = mxUtils.getValue(this.style, 'fixedSize', '0') != '0';
 
- 		var s = (fixed) ? Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'size', this.fixedSize)))) :
 
- 			w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
 
- 		this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w - s, 0), new mxPoint(w, h / 2), new mxPoint(w - s, h),
 
- 		                   new mxPoint(0, h), new mxPoint(s, h / 2)], this.isRounded, arcSize, true);
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('step', StepShape);
 
- 	// Hexagon shape
 
- 	function HexagonShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(HexagonShape, mxHexagon);
 
- 	HexagonShape.prototype.size = 0.25;
 
- 	HexagonShape.prototype.fixedSize = 20;
 
- 	HexagonShape.prototype.isRoundable = function()
 
- 	{
 
- 		return true;
 
- 	};
 
- 	HexagonShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var fixed = mxUtils.getValue(this.style, 'fixedSize', '0') != '0';
 
- 		var s = (fixed) ? Math.max(0, Math.min(w * 0.5, parseFloat(mxUtils.getValue(this.style, 'size', this.fixedSize)))) :
 
- 			w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
 
- 		this.addPoints(c, [new mxPoint(s, 0), new mxPoint(w - s, 0), new mxPoint(w, 0.5 * h), new mxPoint(w - s, h),
 
- 		                   new mxPoint(s, h), new mxPoint(0, 0.5 * h)], this.isRounded, arcSize, true);
 
- 	};
 
- 	mxCellRenderer.registerShape('hexagon', HexagonShape);
 
- 	// Plus Shape
 
- 	function PlusShape()
 
- 	{
 
- 		mxRectangleShape.call(this);
 
- 	};
 
- 	mxUtils.extend(PlusShape, mxRectangleShape);
 
- 	PlusShape.prototype.isHtmlAllowed = function()
 
- 	{
 
- 		return false;
 
- 	};
 
- 	PlusShape.prototype.paintForeground = function(c, x, y, w, h)
 
- 	{
 
- 		var border = Math.min(w / 5, h / 5) + 1;
 
- 		
 
- 		c.begin();
 
- 		c.moveTo(x + w / 2, y + border);
 
- 		c.lineTo(x + w / 2, y + h - border);
 
- 		c.moveTo(x + border, y + h / 2);
 
- 		c.lineTo(x + w - border, y + h / 2);
 
- 		c.end();
 
- 		c.stroke();
 
- 		mxRectangleShape.prototype.paintForeground.apply(this, arguments);
 
- 	};
 
- 	mxCellRenderer.registerShape('plus', PlusShape);
 
- 	
 
- 	// Overrides painting of rhombus shape to allow for double style
 
- 	var mxRhombusPaintVertexShape = mxRhombus.prototype.paintVertexShape;
 
- 	mxRhombus.prototype.getLabelBounds = function(rect)
 
- 	{
 
- 		if (this.style['double'] == 1)
 
- 		{
 
- 			var margin = (Math.max(2, this.strokewidth + 1) * 2 + parseFloat(
 
- 				this.style[mxConstants.STYLE_MARGIN] || 0)) * this.scale;
 
- 		
 
- 			return new mxRectangle(rect.x + margin, rect.y + margin,
 
- 				rect.width - 2 * margin, rect.height - 2 * margin);
 
- 		}
 
- 		
 
- 		return rect;
 
- 	};
 
- 	mxRhombus.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		mxRhombusPaintVertexShape.apply(this, arguments);
 
- 		if (!this.outline && this.style['double'] == 1)
 
- 		{
 
- 			var margin = Math.max(2, this.strokewidth + 1) * 2 +
 
- 				parseFloat(this.style[mxConstants.STYLE_MARGIN] || 0);
 
- 			x += margin;
 
- 			y += margin;
 
- 			w -= 2 * margin;
 
- 			h -= 2 * margin;
 
- 			
 
- 			if (w > 0 && h > 0)
 
- 			{
 
- 				c.setShadow(false);
 
- 				
 
- 				// Workaround for closure compiler bug where the lines with x and y above
 
- 				// are removed if arguments is used as second argument in call below.
 
- 				mxRhombusPaintVertexShape.apply(this, [c, x, y, w, h]);
 
- 			}
 
- 		}
 
- 	};
 
- 	// CompositeShape
 
- 	function ExtendedShape()
 
- 	{
 
- 		mxRectangleShape.call(this);
 
- 	};
 
- 	mxUtils.extend(ExtendedShape, mxRectangleShape);
 
- 	ExtendedShape.prototype.isHtmlAllowed = function()
 
- 	{
 
- 		return false;
 
- 	};
 
- 	ExtendedShape.prototype.getLabelBounds = function(rect)
 
- 	{
 
- 		if (this.style['double'] == 1)
 
- 		{
 
- 			var margin = (Math.max(2, this.strokewidth + 1) + parseFloat(
 
- 				this.style[mxConstants.STYLE_MARGIN] || 0)) * this.scale;
 
- 		
 
- 			return new mxRectangle(rect.x + margin, rect.y + margin,
 
- 				rect.width - 2 * margin, rect.height - 2 * margin);
 
- 		}
 
- 		
 
- 		return rect;
 
- 	};
 
- 	
 
- 	ExtendedShape.prototype.paintForeground = function(c, x, y, w, h)
 
- 	{
 
- 		if (this.style != null)
 
- 		{
 
- 			if (!this.outline && this.style['double'] == 1)
 
- 			{
 
- 				var margin = Math.max(2, this.strokewidth + 1) + parseFloat(this.style[mxConstants.STYLE_MARGIN] || 0);
 
- 				x += margin;
 
- 				y += margin;
 
- 				w -= 2 * margin;
 
- 				h -= 2 * margin;
 
- 				
 
- 				if (w > 0 && h > 0)
 
- 				{
 
- 					mxRectangleShape.prototype.paintBackground.apply(this, arguments);
 
- 				}
 
- 			}
 
- 			
 
- 			c.setDashed(false);
 
- 			
 
- 			// Draws the symbols defined in the style. The symbols are
 
- 			// numbered from 1...n. Possible postfixes are align,
 
- 			// verticalAlign, spacing, arcSpacing, width, height
 
- 			var counter = 0;
 
- 			var shape = null;
 
- 			
 
- 			do
 
- 			{
 
- 				shape = mxCellRenderer.defaultShapes[this.style['symbol' + counter]];
 
- 				
 
- 				if (shape != null)
 
- 				{
 
- 					var align = this.style['symbol' + counter + 'Align'];
 
- 					var valign = this.style['symbol' + counter + 'VerticalAlign'];
 
- 					var width = this.style['symbol' + counter + 'Width'];
 
- 					var height = this.style['symbol' + counter + 'Height'];
 
- 					var spacing = this.style['symbol' + counter + 'Spacing'] || 0;
 
- 					var vspacing = this.style['symbol' + counter + 'VSpacing'] || spacing;
 
- 					var arcspacing = this.style['symbol' + counter + 'ArcSpacing'];
 
- 					
 
- 					if (arcspacing != null)
 
- 					{
 
- 						var arcSize = this.getArcSize(w + this.strokewidth, h + this.strokewidth) * arcspacing;
 
- 						spacing += arcSize;
 
- 						vspacing += arcSize;
 
- 					}
 
- 					
 
- 					var x2 = x;
 
- 					var y2 = y;
 
- 					
 
- 					if (align == mxConstants.ALIGN_CENTER)
 
- 					{
 
- 						x2 += (w - width) / 2;
 
- 					}
 
- 					else if (align == mxConstants.ALIGN_RIGHT)
 
- 					{
 
- 						x2 += w - width - spacing;
 
- 					}
 
- 					else
 
- 					{
 
- 						x2 += spacing;
 
- 					}
 
- 					
 
- 					if (valign == mxConstants.ALIGN_MIDDLE)
 
- 					{
 
- 						y2 += (h - height) / 2;
 
- 					}
 
- 					else if (valign == mxConstants.ALIGN_BOTTOM)
 
- 					{
 
- 						y2 += h - height - vspacing;
 
- 					}
 
- 					else
 
- 					{
 
- 						y2 += vspacing;
 
- 					}
 
- 					
 
- 					c.save();
 
- 					
 
- 					// Small hack to pass style along into subshape
 
- 					var tmp = new shape();
 
- 					// TODO: Clone style and override settings (eg. strokewidth)
 
- 					tmp.style = this.style;
 
- 					shape.prototype.paintVertexShape.call(tmp, c, x2, y2, width, height);
 
- 					c.restore();
 
- 				}
 
- 				
 
- 				counter++;
 
- 			}
 
- 			while (shape != null);
 
- 		}
 
- 		
 
- 		// Paints glass effect
 
- 		mxRectangleShape.prototype.paintForeground.apply(this, arguments);
 
- 	};
 
- 	mxCellRenderer.registerShape('ext', ExtendedShape);
 
- 	
 
- 	// Tape Shape, supports size style
 
- 	function MessageShape()
 
- 	{
 
- 		mxCylinder.call(this);
 
- 	};
 
- 	mxUtils.extend(MessageShape, mxCylinder);
 
- 	MessageShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
 
- 	{
 
- 		if (isForeground)
 
- 		{
 
- 			path.moveTo(0, 0);
 
- 			path.lineTo(w / 2, h / 2);
 
- 			path.lineTo(w, 0);
 
- 			path.end();
 
- 		}
 
- 		else
 
- 		{
 
- 			path.moveTo(0, 0);
 
- 			path.lineTo(w, 0);
 
- 			path.lineTo(w, h);
 
- 			path.lineTo(0, h);
 
- 			path.close();
 
- 		}
 
- 	};
 
- 	mxCellRenderer.registerShape('message', MessageShape);
 
- 	
 
- 	// UML Actor Shape
 
- 	function UmlActorShape()
 
- 	{
 
- 		mxShape.call(this);
 
- 	};
 
- 	mxUtils.extend(UmlActorShape, mxShape);
 
- 	UmlActorShape.prototype.paintBackground = function(c, x, y, w, h)
 
- 	{
 
- 		c.translate(x, y);
 
- 		// Head
 
- 		c.ellipse(w / 4, 0, w / 2, h / 4);
 
- 		c.fillAndStroke();
 
- 		c.begin();
 
- 		c.moveTo(w / 2, h / 4);
 
- 		c.lineTo(w / 2, 2 * h / 3);
 
- 		
 
- 		// Arms
 
- 		c.moveTo(w / 2, h / 3);
 
- 		c.lineTo(0, h / 3);
 
- 		c.moveTo(w / 2, h / 3);
 
- 		c.lineTo(w, h / 3);
 
- 		
 
- 		// Legs
 
- 		c.moveTo(w / 2, 2 * h / 3);
 
- 		c.lineTo(0, h);
 
- 		c.moveTo(w / 2, 2 * h / 3);
 
- 		c.lineTo(w, h);
 
- 		c.end();
 
- 		
 
- 		c.stroke();
 
- 	};
 
- 	// Replaces existing actor shape
 
- 	mxCellRenderer.registerShape('umlActor', UmlActorShape);
 
- 	
 
- 	////////////// UML Boundary Shape ///////////////
 
- 	function UmlBoundaryShape()
 
- 	{
 
- 		mxShape.call(this);
 
- 	};
 
- 	mxUtils.extend(UmlBoundaryShape, mxShape);
 
- 	UmlBoundaryShape.prototype.getLabelMargins = function(rect)
 
- 	{
 
- 		return new mxRectangle(rect.width / 6, 0, 0, 0);
 
- 	};
 
- 	UmlBoundaryShape.prototype.paintBackground = function(c, x, y, w, h)
 
- 	{
 
- 		c.translate(x, y);
 
- 		
 
- 		// Base line
 
- 		c.begin();
 
- 		c.moveTo(0, h / 4);
 
- 		c.lineTo(0, h * 3 / 4);
 
- 		c.end();
 
- 		c.stroke();
 
- 		
 
- 		// Horizontal line
 
- 		c.begin();
 
- 		c.moveTo(0, h / 2);
 
- 		c.lineTo(w / 6, h / 2);
 
- 		c.end();
 
- 		c.stroke();
 
- 		
 
- 		// Circle
 
- 		c.ellipse(w / 6, 0, w * 5 / 6, h);
 
- 		c.fillAndStroke();
 
- 	};
 
- 	mxCellRenderer.registerShape('umlBoundary', UmlBoundaryShape);
 
- 	// UML Entity Shape
 
- 	function UmlEntityShape()
 
- 	{
 
- 		mxEllipse.call(this);
 
- 	};
 
- 	mxUtils.extend(UmlEntityShape, mxEllipse);
 
- 	UmlEntityShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		mxEllipse.prototype.paintVertexShape.apply(this, arguments);
 
- 		
 
- 		c.begin();
 
- 		c.moveTo(x + w / 8, y + h);
 
- 		c.lineTo(x + w * 7 / 8, y + h);
 
- 		c.end();
 
- 		c.stroke();
 
- 	};
 
- 	mxCellRenderer.registerShape('umlEntity', UmlEntityShape);
 
- 	// UML Destroy Shape
 
- 	function UmlDestroyShape()
 
- 	{
 
- 		mxShape.call(this);
 
- 	};
 
- 	mxUtils.extend(UmlDestroyShape, mxShape);
 
- 	UmlDestroyShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		c.translate(x, y);
 
- 		c.begin();
 
- 		c.moveTo(w, 0);
 
- 		c.lineTo(0, h);
 
- 		c.moveTo(0, 0);
 
- 		c.lineTo(w, h);
 
- 		c.end();
 
- 		c.stroke();
 
- 	};
 
- 	mxCellRenderer.registerShape('umlDestroy', UmlDestroyShape);
 
- 	
 
- 	// UML Control Shape
 
- 	function UmlControlShape()
 
- 	{
 
- 		mxShape.call(this);
 
- 	};
 
- 	mxUtils.extend(UmlControlShape, mxShape);
 
- 	UmlControlShape.prototype.getLabelBounds = function(rect)
 
- 	{
 
- 		return new mxRectangle(rect.x, rect.y + rect.height / 8, rect.width, rect.height * 7 / 8);
 
- 	};
 
- 	UmlControlShape.prototype.paintBackground = function(c, x, y, w, h)
 
- 	{
 
- 		c.translate(x, y);
 
- 		// Upper line
 
- 		c.begin();
 
- 		c.moveTo(w * 3 / 8, h / 8 * 1.1);
 
- 		c.lineTo(w * 5 / 8, 0);
 
- 		c.end();
 
- 		c.stroke();
 
- 		
 
- 		// Circle
 
- 		c.ellipse(0, h / 8, w, h * 7 / 8);
 
- 		c.fillAndStroke();
 
- 	};
 
- 	UmlControlShape.prototype.paintForeground = function(c, x, y, w, h)
 
- 	{
 
- 		// Lower line
 
- 		c.begin();
 
- 		c.moveTo(w * 3 / 8, h / 8 * 1.1);
 
- 		c.lineTo(w * 5 / 8, h / 4);
 
- 		c.end();
 
- 		c.stroke();
 
- 	};
 
- 	// Replaces existing actor shape
 
- 	mxCellRenderer.registerShape('umlControl', UmlControlShape);
 
- 	// UML Lifeline Shape
 
- 	function UmlLifeline()
 
- 	{
 
- 		mxRectangleShape.call(this);
 
- 	};
 
- 	mxUtils.extend(UmlLifeline, mxRectangleShape);
 
- 	UmlLifeline.prototype.size = 40;
 
- 	UmlLifeline.prototype.isHtmlAllowed = function()
 
- 	{
 
- 		return false;
 
- 	};
 
- 	UmlLifeline.prototype.getLabelBounds = function(rect)
 
- 	{
 
- 		var size = Math.max(0, Math.min(rect.height, parseFloat(
 
- 			mxUtils.getValue(this.style, 'size', this.size)) * this.scale));
 
- 		
 
- 		return new mxRectangle(rect.x, rect.y, rect.width, size);
 
- 	};
 
- 	UmlLifeline.prototype.paintBackground = function(c, x, y, w, h)
 
- 	{
 
- 		var size = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		var participant = mxUtils.getValue(this.style, 'participant');
 
- 		
 
- 		if (participant == null || this.state == null)
 
- 		{
 
- 			mxRectangleShape.prototype.paintBackground.call(this, c, x, y, w, size);
 
- 		}
 
- 		else
 
- 		{
 
- 			var ctor = this.state.view.graph.cellRenderer.getShape(participant);
 
- 			
 
- 			if (ctor != null && ctor != UmlLifeline)
 
- 			{
 
- 				var shape = new ctor();
 
- 				shape.apply(this.state);
 
- 				c.save();
 
- 				shape.paintVertexShape(c, x, y, w, size);
 
- 				c.restore();
 
- 			}
 
- 		}
 
- 		
 
- 		if (size < h)
 
- 		{
 
- 			c.setDashed(mxUtils.getValue(this.style, 'lifelineDashed', '1') == '1');
 
- 			c.begin();
 
- 			c.moveTo(x + w / 2, y + size);
 
- 			c.lineTo(x + w / 2, y + h);
 
- 			c.end();
 
- 			c.stroke();
 
- 		}
 
- 	};
 
- 	UmlLifeline.prototype.paintForeground = function(c, x, y, w, h)
 
- 	{
 
- 		var size = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		mxRectangleShape.prototype.paintForeground.call(this, c, x, y, w, Math.min(h, size));
 
- 	};
 
- 	mxCellRenderer.registerShape('umlLifeline', UmlLifeline);
 
- 	
 
- 	// UML Frame Shape
 
- 	function UmlFrame()
 
- 	{
 
- 		mxShape.call(this);
 
- 	};
 
- 	mxUtils.extend(UmlFrame, mxShape);
 
- 	
 
- 	UmlFrame.prototype.width = 60;
 
- 	UmlFrame.prototype.height = 30;
 
- 	UmlFrame.prototype.corner = 10;
 
- 	UmlFrame.prototype.configurePointerEvents = function(c)
 
- 	{
 
- 		var bg = mxUtils.getValue(this.style, mxConstants.STYLE_SWIMLANE_FILLCOLOR, mxConstants.NONE);
 
- 		if (this.style != null && (bg == null ||
 
- 			bg == mxConstants.NONE || this.opacity == 0 ||
 
- 			this.fillOpacity == 0) && mxUtils.getValue(this.style,
 
- 			mxConstants.STYLE_POINTER_EVENTS, '1') == '0')
 
- 		{
 
- 			c.pointerEvents = false;
 
- 		}
 
- 	};
 
- 	UmlFrame.prototype.getLabelMargins = function(rect)
 
- 	{
 
- 		return new mxRectangle(0, 0,
 
- 			rect.width - (parseFloat(mxUtils.getValue(this.style, 'width', this.width) * this.scale)),
 
- 			rect.height - (parseFloat(mxUtils.getValue(this.style, 'height', this.height) * this.scale)));
 
- 	};
 
- 	UmlFrame.prototype.paintBackground = function(c, x, y, w, h)
 
- 	{
 
- 		var co = this.corner;
 
- 		var w0 = Math.min(w, Math.max(co, parseFloat(mxUtils.getValue(this.style, 'width', this.width))));
 
- 		var h0 = Math.min(h, Math.max(co * 1.5, parseFloat(mxUtils.getValue(this.style, 'height', this.height))));
 
- 		var bg = mxUtils.getValue(this.style, mxConstants.STYLE_SWIMLANE_FILLCOLOR, mxConstants.NONE);
 
- 		
 
- 		if (bg != mxConstants.NONE)
 
- 		{
 
- 			c.setFillColor(bg);
 
- 			c.rect(x, y, w, h);
 
- 			c.fill();
 
- 		}
 
- 		
 
- 		if (this.fill != null && this.fill != mxConstants.NONE && this.gradient && this.gradient != mxConstants.NONE)
 
- 		{
 
- 			var b = this.getGradientBounds(c, x, y, w, h);
 
- 			c.setGradient(this.fill, this.gradient, x, y, w, h, this.gradientDirection);
 
- 		}
 
- 		else
 
- 		{
 
- 			c.setFillColor(this.fill);
 
- 		}
 
- 		// Label part handles events
 
- 		c.pointerEvents = true;
 
- 		c.begin();
 
- 		c.moveTo(x, y);
 
- 		c.lineTo(x + w0, y);
 
- 		c.lineTo(x + w0, y + Math.max(0, h0 - co * 1.5));
 
- 		c.lineTo(x + Math.max(0, w0 - co), y + h0);
 
- 		c.lineTo(x, y + h0);
 
- 		c.close();
 
- 		c.fillAndStroke();
 
- 		this.configurePointerEvents(c);
 
- 		
 
- 		c.begin();
 
- 		c.moveTo(x + w0, y);
 
- 		c.lineTo(x + w, y);
 
- 		c.lineTo(x + w, y + h);
 
- 		c.lineTo(x, y + h);
 
- 		c.lineTo(x, y + h0);
 
- 		c.stroke();
 
- 	};
 
- 	mxCellRenderer.registerShape('umlFrame', UmlFrame);
 
- 		
 
- 	mxPerimeter.CenterPerimeter = function (bounds, vertex, next, orthogonal)
 
- 	{
 
- 		return new mxPoint(bounds.getCenterX(), bounds.getCenterY());
 
- 	};
 
- 	
 
- 	mxStyleRegistry.putValue('centerPerimeter', mxPerimeter.CenterPerimeter);
 
- 	
 
- 	mxPerimeter.LifelinePerimeter = function (bounds, vertex, next, orthogonal)
 
- 	{
 
- 		var size = UmlLifeline.prototype.size;
 
- 		
 
- 		if (vertex != null)
 
- 		{
 
- 			size = mxUtils.getValue(vertex.style, 'size', size) * vertex.view.scale;
 
- 		}
 
- 		
 
- 		var sw = (parseFloat(vertex.style[mxConstants.STYLE_STROKEWIDTH] || 1) * vertex.view.scale / 2) - 1;
 
- 		if (next.x < bounds.getCenterX())
 
- 		{
 
- 			sw += 1;
 
- 			sw *= -1;
 
- 		}
 
- 		
 
- 		return new mxPoint(bounds.getCenterX() + sw, Math.min(bounds.y + bounds.height,
 
- 				Math.max(bounds.y + size, next.y)));
 
- 	};
 
- 	
 
- 	mxStyleRegistry.putValue('lifelinePerimeter', mxPerimeter.LifelinePerimeter);
 
- 	
 
- 	mxPerimeter.OrthogonalPerimeter = function (bounds, vertex, next, orthogonal)
 
- 	{
 
- 		orthogonal = true;
 
- 		
 
- 		return mxPerimeter.RectanglePerimeter.apply(this, arguments);
 
- 	};
 
- 	
 
- 	mxStyleRegistry.putValue('orthogonalPerimeter', mxPerimeter.OrthogonalPerimeter);
 
- 	mxPerimeter.BackbonePerimeter = function (bounds, vertex, next, orthogonal)
 
- 	{
 
- 		var sw = (parseFloat(vertex.style[mxConstants.STYLE_STROKEWIDTH] || 1) * vertex.view.scale / 2) - 1;
 
- 		
 
- 		if (vertex.style['backboneSize'] != null)
 
- 		{
 
- 			sw += (parseFloat(vertex.style['backboneSize']) * vertex.view.scale / 2) - 1;
 
- 		}
 
- 		
 
- 		if (vertex.style[mxConstants.STYLE_DIRECTION] == 'south' ||
 
- 			vertex.style[mxConstants.STYLE_DIRECTION] == 'north')
 
- 		{
 
- 			if (next.x < bounds.getCenterX())
 
- 			{
 
- 				sw += 1;
 
- 				sw *= -1;
 
- 			}
 
- 			
 
- 			return new mxPoint(bounds.getCenterX() + sw, Math.min(bounds.y + bounds.height,
 
- 					Math.max(bounds.y, next.y)));
 
- 		}
 
- 		else
 
- 		{
 
- 			if (next.y < bounds.getCenterY())
 
- 			{
 
- 				sw += 1;
 
- 				sw *= -1;
 
- 			}
 
- 			
 
- 			return new mxPoint(Math.min(bounds.x + bounds.width, Math.max(bounds.x, next.x)),
 
- 				bounds.getCenterY() + sw);
 
- 		}
 
- 	};
 
- 	
 
- 	mxStyleRegistry.putValue('backbonePerimeter', mxPerimeter.BackbonePerimeter);
 
- 	// Callout Perimeter
 
- 	mxPerimeter.CalloutPerimeter = function (bounds, vertex, next, orthogonal)
 
- 	{
 
- 		return mxPerimeter.RectanglePerimeter(mxUtils.getDirectedBounds(bounds, new mxRectangle(0, 0, 0,
 
- 			Math.max(0, Math.min(bounds.height, parseFloat(mxUtils.getValue(vertex.style, 'size',
 
- 			CalloutShape.prototype.size)) * vertex.view.scale))),
 
- 			vertex.style), vertex, next, orthogonal);
 
- 	};
 
- 	
 
- 	mxStyleRegistry.putValue('calloutPerimeter', mxPerimeter.CalloutPerimeter);
 
- 	
 
- 	// Parallelogram Perimeter
 
- 	mxPerimeter.ParallelogramPerimeter = function (bounds, vertex, next, orthogonal)
 
- 	{
 
- 		var fixed = mxUtils.getValue(vertex.style, 'fixedSize', '0') != '0';
 
- 		var size = (fixed) ? ParallelogramShape.prototype.fixedSize : ParallelogramShape.prototype.size;
 
- 		
 
- 		if (vertex != null)
 
- 		{
 
- 			size = mxUtils.getValue(vertex.style, 'size', size);
 
- 		}
 
- 		
 
- 		if (fixed)
 
- 		{
 
- 			size *= vertex.view.scale;
 
- 		}
 
- 		
 
- 		var x = bounds.x;
 
- 		var y = bounds.y;
 
- 		var w = bounds.width;
 
- 		var h = bounds.height;
 
- 		var direction = (vertex != null) ? mxUtils.getValue(
 
- 			vertex.style, mxConstants.STYLE_DIRECTION,
 
- 			mxConstants.DIRECTION_EAST) : mxConstants.DIRECTION_EAST;
 
- 		var vertical = direction == mxConstants.DIRECTION_NORTH ||
 
- 			direction == mxConstants.DIRECTION_SOUTH;
 
- 		var points;
 
- 		
 
- 		if (vertical)
 
- 		{
 
- 			var dy = (fixed) ? Math.max(0, Math.min(h, size)) : h * Math.max(0, Math.min(1, size));
 
- 			points = [new mxPoint(x, y), new mxPoint(x + w, y + dy),
 
- 						new mxPoint(x + w, y + h), new mxPoint(x, y + h - dy), new mxPoint(x, y)];
 
- 		}
 
- 		else
 
- 		{
 
- 			var dx = (fixed) ? Math.max(0, Math.min(w * 0.5, size)) : w * Math.max(0, Math.min(1, size));
 
- 			points = [new mxPoint(x + dx, y), new mxPoint(x + w, y),
 
- 							new mxPoint(x + w - dx, y + h), new mxPoint(x, y + h), new mxPoint(x + dx, y)];
 
- 		}	
 
- 		
 
- 		var cx = bounds.getCenterX();
 
- 		var cy = bounds.getCenterY();
 
- 		
 
- 		var p1 = new mxPoint(cx, cy);
 
- 		
 
- 		if (orthogonal)
 
- 		{
 
- 			if (next.x < x || next.x > x + w)
 
- 			{
 
- 				p1.y = next.y;
 
- 			}
 
- 			else
 
- 			{
 
- 				p1.x = next.x;
 
- 			}
 
- 		}
 
- 		
 
- 		return mxUtils.getPerimeterPoint(points, p1, next);
 
- 	};
 
- 	
 
- 	mxStyleRegistry.putValue('parallelogramPerimeter', mxPerimeter.ParallelogramPerimeter);
 
- 	
 
- 	// Trapezoid Perimeter
 
- 	mxPerimeter.TrapezoidPerimeter = function (bounds, vertex, next, orthogonal)
 
- 	{
 
- 		var fixed = mxUtils.getValue(vertex.style, 'fixedSize', '0') != '0';
 
- 		var size = (fixed) ? TrapezoidShape.prototype.fixedSize : TrapezoidShape.prototype.size;
 
- 		
 
- 		if (vertex != null)
 
- 		{
 
- 			size = mxUtils.getValue(vertex.style, 'size', size);
 
- 		}
 
- 		
 
- 		if (fixed)
 
- 		{
 
- 			size *= vertex.view.scale;
 
- 		}
 
- 		
 
- 		var x = bounds.x;
 
- 		var y = bounds.y;
 
- 		var w = bounds.width;
 
- 		var h = bounds.height;
 
- 		var direction = (vertex != null) ? mxUtils.getValue(
 
- 				vertex.style, mxConstants.STYLE_DIRECTION,
 
- 				mxConstants.DIRECTION_EAST) : mxConstants.DIRECTION_EAST;
 
- 		var points = [];
 
- 		
 
- 		if (direction == mxConstants.DIRECTION_EAST)
 
- 		{
 
- 			var dx = (fixed) ? Math.max(0, Math.min(w * 0.5, size)) : w * Math.max(0, Math.min(1, size));
 
- 			points = [new mxPoint(x + dx, y), new mxPoint(x + w - dx, y),
 
- 						new mxPoint(x + w, y + h), new mxPoint(x, y + h), new mxPoint(x + dx, y)];
 
- 		}
 
- 		else if (direction == mxConstants.DIRECTION_WEST)
 
- 		{
 
- 			var dx = (fixed) ? Math.max(0, Math.min(w, size)) : w * Math.max(0, Math.min(1, size));
 
- 			points = [new mxPoint(x, y), new mxPoint(x + w, y),
 
- 						new mxPoint(x + w - dx, y + h), new mxPoint(x + dx, y + h), new mxPoint(x, y)];
 
- 		}
 
- 		else if (direction == mxConstants.DIRECTION_NORTH)
 
- 		{
 
- 			var dy = (fixed) ? Math.max(0, Math.min(h, size)) : h * Math.max(0, Math.min(1, size));
 
- 			points = [new mxPoint(x, y + dy), new mxPoint(x + w, y),
 
- 						new mxPoint(x + w, y + h), new mxPoint(x, y + h - dy), new mxPoint(x, y + dy)];
 
- 		}
 
- 		else
 
- 		{
 
- 			var dy = (fixed) ? Math.max(0, Math.min(h, size)) : h * Math.max(0, Math.min(1, size));
 
- 			points = [new mxPoint(x, y), new mxPoint(x + w, y + dy),
 
- 						new mxPoint(x + w, y + h - dy), new mxPoint(x, y + h), new mxPoint(x, y)];
 
- 		}		
 
- 		var cx = bounds.getCenterX();
 
- 		var cy = bounds.getCenterY();
 
- 		
 
- 		var p1 = new mxPoint(cx, cy);
 
- 		
 
- 		if (orthogonal)
 
- 		{
 
- 			if (next.x < x || next.x > x + w)
 
- 			{
 
- 				p1.y = next.y;
 
- 			}
 
- 			else
 
- 			{
 
- 				p1.x = next.x;
 
- 			}
 
- 		}
 
- 		return mxUtils.getPerimeterPoint(points, p1, next);
 
- 	};
 
- 	
 
- 	mxStyleRegistry.putValue('trapezoidPerimeter', mxPerimeter.TrapezoidPerimeter);
 
- 	
 
- 	// Step Perimeter
 
- 	mxPerimeter.StepPerimeter = function (bounds, vertex, next, orthogonal)
 
- 	{
 
- 		var fixed = mxUtils.getValue(vertex.style, 'fixedSize', '0') != '0';
 
- 		var size = (fixed) ? StepShape.prototype.fixedSize : StepShape.prototype.size;
 
- 		
 
- 		if (vertex != null)
 
- 		{
 
- 			size = mxUtils.getValue(vertex.style, 'size', size);
 
- 		}
 
- 		
 
- 		if (fixed)
 
- 		{
 
- 			size *= vertex.view.scale;
 
- 		}
 
- 		
 
- 		var x = bounds.x;
 
- 		var y = bounds.y;
 
- 		var w = bounds.width;
 
- 		var h = bounds.height;
 
- 		var cx = bounds.getCenterX();
 
- 		var cy = bounds.getCenterY();
 
- 		
 
- 		var direction = (vertex != null) ? mxUtils.getValue(
 
- 				vertex.style, mxConstants.STYLE_DIRECTION,
 
- 				mxConstants.DIRECTION_EAST) : mxConstants.DIRECTION_EAST;
 
- 		var points;
 
- 		
 
- 		if (direction == mxConstants.DIRECTION_EAST)
 
- 		{
 
- 			var dx = (fixed) ? Math.max(0, Math.min(w, size)) : w * Math.max(0, Math.min(1, size));
 
- 			points = [new mxPoint(x, y), new mxPoint(x + w - dx, y), new mxPoint(x + w, cy),
 
- 							new mxPoint(x + w - dx, y + h), new mxPoint(x, y + h),
 
- 							new mxPoint(x + dx, cy), new mxPoint(x, y)];
 
- 		}
 
- 		else if (direction == mxConstants.DIRECTION_WEST)
 
- 		{
 
- 			var dx = (fixed) ? Math.max(0, Math.min(w, size)) : w * Math.max(0, Math.min(1, size));
 
- 			points = [new mxPoint(x + dx, y), new mxPoint(x + w, y), new mxPoint(x + w - dx, cy),
 
- 							new mxPoint(x + w, y + h), new mxPoint(x + dx, y + h),
 
- 							new mxPoint(x, cy), new mxPoint(x + dx, y)];
 
- 		}
 
- 		else if (direction == mxConstants.DIRECTION_NORTH)
 
- 		{
 
- 			var dy = (fixed) ? Math.max(0, Math.min(h, size)) : h * Math.max(0, Math.min(1, size));
 
- 			points = [new mxPoint(x, y + dy), new mxPoint(cx, y), new mxPoint(x + w, y + dy),
 
- 							new mxPoint(x + w, y + h), new mxPoint(cx, y + h - dy),
 
- 							new mxPoint(x, y + h), new mxPoint(x, y + dy)];
 
- 		}
 
- 		else
 
- 		{
 
- 			var dy = (fixed) ? Math.max(0, Math.min(h, size)) : h * Math.max(0, Math.min(1, size));
 
- 			points = [new mxPoint(x, y), new mxPoint(cx, y + dy), new mxPoint(x + w, y),
 
- 							new mxPoint(x + w, y + h - dy), new mxPoint(cx, y + h),
 
- 							new mxPoint(x, y + h - dy), new mxPoint(x, y)];
 
- 		}		
 
- 		
 
- 		var p1 = new mxPoint(cx, cy);
 
- 		
 
- 		if (orthogonal)
 
- 		{
 
- 			if (next.x < x || next.x > x + w)
 
- 			{
 
- 				p1.y = next.y;
 
- 			}
 
- 			else
 
- 			{
 
- 				p1.x = next.x;
 
- 			}
 
- 		}
 
- 		
 
- 		return mxUtils.getPerimeterPoint(points, p1, next);
 
- 	};
 
- 	
 
- 	mxStyleRegistry.putValue('stepPerimeter', mxPerimeter.StepPerimeter);
 
- 	
 
- 	// Hexagon Perimeter 2 (keep existing one)
 
- 	mxPerimeter.HexagonPerimeter2 = function (bounds, vertex, next, orthogonal)
 
- 	{
 
- 		var fixed = mxUtils.getValue(vertex.style, 'fixedSize', '0') != '0';
 
- 		var size = (fixed) ? HexagonShape.prototype.fixedSize : HexagonShape.prototype.size;
 
- 		
 
- 		if (vertex != null)
 
- 		{
 
- 			size = mxUtils.getValue(vertex.style, 'size', size);
 
- 		}
 
- 		
 
- 		if (fixed)
 
- 		{
 
- 			size *= vertex.view.scale;
 
- 		}
 
- 		
 
- 		var x = bounds.x;
 
- 		var y = bounds.y;
 
- 		var w = bounds.width;
 
- 		var h = bounds.height;
 
- 		var cx = bounds.getCenterX();
 
- 		var cy = bounds.getCenterY();
 
- 		
 
- 		var direction = (vertex != null) ? mxUtils.getValue(
 
- 			vertex.style, mxConstants.STYLE_DIRECTION,
 
- 			mxConstants.DIRECTION_EAST) : mxConstants.DIRECTION_EAST;
 
- 		var vertical = direction == mxConstants.DIRECTION_NORTH ||
 
- 			direction == mxConstants.DIRECTION_SOUTH;
 
- 		var points;
 
- 		
 
- 		if (vertical)
 
- 		{
 
- 			var dy = (fixed) ? Math.max(0, Math.min(h, size)) : h * Math.max(0, Math.min(1, size));
 
- 			points = [new mxPoint(cx, y), new mxPoint(x + w, y + dy), new mxPoint(x + w, y + h - dy),
 
- 							new mxPoint(cx, y + h), new mxPoint(x, y + h - dy),
 
- 							new mxPoint(x, y + dy), new mxPoint(cx, y)];
 
- 		}
 
- 		else
 
- 		{
 
- 			var dx = (fixed) ? Math.max(0, Math.min(w, size)) : w * Math.max(0, Math.min(1, size));
 
- 			points = [new mxPoint(x + dx, y), new mxPoint(x + w - dx, y), new mxPoint(x + w, cy),
 
- 						new mxPoint(x + w - dx, y + h), new mxPoint(x + dx, y + h),
 
- 						new mxPoint(x, cy), new mxPoint(x + dx, y)];
 
- 		}		
 
- 		var p1 = new mxPoint(cx, cy);
 
- 		
 
- 		if (orthogonal)
 
- 		{
 
- 			if (next.x < x || next.x > x + w)
 
- 			{
 
- 				p1.y = next.y;
 
- 			}
 
- 			else
 
- 			{
 
- 				p1.x = next.x;
 
- 			}
 
- 		}
 
- 		
 
- 		return mxUtils.getPerimeterPoint(points, p1, next);
 
- 	};
 
- 	
 
- 	mxStyleRegistry.putValue('hexagonPerimeter2', mxPerimeter.HexagonPerimeter2);
 
- 	
 
- 	// Provided Interface Shape (aka Lollipop)
 
- 	function LollipopShape()
 
- 	{
 
- 		mxShape.call(this);
 
- 	};
 
- 	mxUtils.extend(LollipopShape, mxShape);
 
- 	LollipopShape.prototype.size = 10;
 
- 	LollipopShape.prototype.paintBackground = function(c, x, y, w, h)
 
- 	{
 
- 		var sz = parseFloat(mxUtils.getValue(this.style, 'size', this.size));
 
- 		c.translate(x, y);
 
- 		
 
- 		c.ellipse((w - sz) / 2, 0, sz, sz);
 
- 		c.fillAndStroke();
 
- 		c.begin();
 
- 		c.moveTo(w / 2, sz);
 
- 		c.lineTo(w / 2, h);
 
- 		c.end();
 
- 		c.stroke();
 
- 	};
 
- 	mxCellRenderer.registerShape('lollipop', LollipopShape);
 
- 	// Required Interface Shape
 
- 	function RequiresShape()
 
- 	{
 
- 		mxShape.call(this);
 
- 	};
 
- 	mxUtils.extend(RequiresShape, mxShape);
 
- 	RequiresShape.prototype.size = 10;
 
- 	RequiresShape.prototype.inset = 2;
 
- 	RequiresShape.prototype.paintBackground = function(c, x, y, w, h)
 
- 	{
 
- 		var sz = parseFloat(mxUtils.getValue(this.style, 'size', this.size));
 
- 		var inset = parseFloat(mxUtils.getValue(this.style, 'inset', this.inset)) + this.strokewidth;
 
- 		c.translate(x, y);
 
- 		c.begin();
 
- 		c.moveTo(w / 2, sz + inset);
 
- 		c.lineTo(w / 2, h);
 
- 		c.end();
 
- 		c.stroke();
 
- 		
 
- 		c.begin();
 
- 		c.moveTo((w - sz) / 2 - inset, sz / 2);
 
- 		c.quadTo((w - sz) / 2 - inset, sz + inset, w / 2, sz + inset);
 
- 		c.quadTo((w + sz) / 2 + inset, sz + inset, (w + sz) / 2 + inset, sz / 2);
 
- 		c.end();
 
- 		c.stroke();
 
- 	};
 
- 	mxCellRenderer.registerShape('requires', RequiresShape);
 
- 	// Required Interface Shape
 
- 	function RequiredInterfaceShape()
 
- 	{
 
- 		mxShape.call(this);
 
- 	};
 
- 	mxUtils.extend(RequiredInterfaceShape, mxShape);
 
- 	
 
- 	RequiredInterfaceShape.prototype.paintBackground = function(c, x, y, w, h)
 
- 	{
 
- 		c.translate(x, y);
 
- 		c.begin();
 
- 		c.moveTo(0, 0);
 
- 		c.quadTo(w, 0, w, h / 2);
 
- 		c.quadTo(w, h, 0, h);
 
- 		c.end();
 
- 		c.stroke();
 
- 	};
 
- 	mxCellRenderer.registerShape('requiredInterface', RequiredInterfaceShape);
 
- 	// Provided and Required Interface Shape
 
- 	function ProvidedRequiredInterfaceShape()
 
- 	{
 
- 		mxShape.call(this);
 
- 	};
 
- 	mxUtils.extend(ProvidedRequiredInterfaceShape, mxShape);
 
- 	ProvidedRequiredInterfaceShape.prototype.inset = 2;
 
- 	ProvidedRequiredInterfaceShape.prototype.paintBackground = function(c, x, y, w, h)
 
- 	{
 
- 		var inset = parseFloat(mxUtils.getValue(this.style, 'inset', this.inset)) + this.strokewidth;
 
- 		c.translate(x, y);
 
- 		c.ellipse(0, inset, w - 2 * inset, h - 2 * inset);
 
- 		c.fillAndStroke();
 
- 		
 
- 		c.begin();
 
- 		c.moveTo(w / 2, 0);
 
- 		c.quadTo(w, 0, w, h / 2);
 
- 		c.quadTo(w, h, w / 2, h);
 
- 		c.end();
 
- 		c.stroke();
 
- 	};
 
- 	mxCellRenderer.registerShape('providedRequiredInterface', ProvidedRequiredInterfaceShape);
 
- 		
 
- 	// Module shape
 
- 	function ModuleShape()
 
- 	{
 
- 		mxCylinder.call(this);
 
- 	};
 
- 	mxUtils.extend(ModuleShape, mxCylinder);
 
- 	ModuleShape.prototype.jettyWidth = 20;
 
- 	ModuleShape.prototype.jettyHeight = 10;
 
- 	ModuleShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
 
- 	{
 
- 		var dx = parseFloat(mxUtils.getValue(this.style, 'jettyWidth', this.jettyWidth));
 
- 		var dy = parseFloat(mxUtils.getValue(this.style, 'jettyHeight', this.jettyHeight));
 
- 		var x0 = dx / 2;
 
- 		var x1 = x0 + dx / 2;
 
- 		var y0 = Math.min(dy, h - dy);
 
- 		var y1 = Math.min(y0 + 2 * dy, h - dy);
 
- 		if (isForeground)
 
- 		{
 
- 			path.moveTo(x0, y0);
 
- 			path.lineTo(x1, y0);
 
- 			path.lineTo(x1, y0 + dy);
 
- 			path.lineTo(x0, y0 + dy);
 
- 			path.moveTo(x0, y1);
 
- 			path.lineTo(x1, y1);
 
- 			path.lineTo(x1, y1 + dy);
 
- 			path.lineTo(x0, y1 + dy);
 
- 			path.end();
 
- 		}
 
- 		else
 
- 		{
 
- 			path.moveTo(x0, 0);
 
- 			path.lineTo(w, 0);
 
- 			path.lineTo(w, h);
 
- 			path.lineTo(x0, h);
 
- 			path.lineTo(x0, y1 + dy);
 
- 			path.lineTo(0, y1 + dy);
 
- 			path.lineTo(0, y1);
 
- 			path.lineTo(x0, y1);
 
- 			path.lineTo(x0, y0 + dy);
 
- 			path.lineTo(0, y0 + dy);
 
- 			path.lineTo(0, y0);
 
- 			path.lineTo(x0, y0);
 
- 			path.close();
 
- 			path.end();
 
- 		}
 
- 	};
 
- 	mxCellRenderer.registerShape('module', ModuleShape);
 
- 	
 
- 	// Component shape
 
- 	function ComponentShape()
 
- 	{
 
- 		mxCylinder.call(this);
 
- 	};
 
- 	mxUtils.extend(ComponentShape, mxCylinder);
 
- 	ComponentShape.prototype.jettyWidth = 32;
 
- 	ComponentShape.prototype.jettyHeight = 12;
 
- 	ComponentShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
 
- 	{
 
- 		var dx = parseFloat(mxUtils.getValue(this.style, 'jettyWidth', this.jettyWidth));
 
- 		var dy = parseFloat(mxUtils.getValue(this.style, 'jettyHeight', this.jettyHeight));
 
- 		var x0 = dx / 2;
 
- 		var x1 = x0 + dx / 2;
 
- 		var y0 = 0.3 * h - dy / 2;
 
- 		var y1 = 0.7 * h - dy / 2;
 
- 		if (isForeground)
 
- 		{
 
- 			path.moveTo(x0, y0);
 
- 			path.lineTo(x1, y0);
 
- 			path.lineTo(x1, y0 + dy);
 
- 			path.lineTo(x0, y0 + dy);
 
- 			path.moveTo(x0, y1);
 
- 			path.lineTo(x1, y1);
 
- 			path.lineTo(x1, y1 + dy);
 
- 			path.lineTo(x0, y1 + dy);
 
- 			path.end();
 
- 		}
 
- 		else
 
- 		{
 
- 			path.moveTo(x0, 0);
 
- 			path.lineTo(w, 0);
 
- 			path.lineTo(w, h);
 
- 			path.lineTo(x0, h);
 
- 			path.lineTo(x0, y1 + dy);
 
- 			path.lineTo(0, y1 + dy);
 
- 			path.lineTo(0, y1);
 
- 			path.lineTo(x0, y1);
 
- 			path.lineTo(x0, y0 + dy);
 
- 			path.lineTo(0, y0 + dy);
 
- 			path.lineTo(0, y0);
 
- 			path.lineTo(x0, y0);
 
- 			path.close();
 
- 			path.end();
 
- 		}
 
- 	};
 
- 	mxCellRenderer.registerShape('component', ComponentShape);
 
- 	
 
- 	// Associative entity derived from rectangle shape
 
- 	function AssociativeEntity()
 
- 	{
 
- 		mxRectangleShape.call(this);
 
- 	};
 
- 	mxUtils.extend(AssociativeEntity, mxRectangleShape);
 
- 	AssociativeEntity.prototype.paintForeground = function(c, x, y, w, h)
 
- 	{
 
- 		var hw = w / 2;
 
- 		var hh = h / 2;
 
- 		
 
- 		var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
 
- 		c.begin();
 
- 		this.addPoints(c, [new mxPoint(x + hw, y), new mxPoint(x + w, y + hh), new mxPoint(x + hw, y + h),
 
- 		     new mxPoint(x, y + hh)], this.isRounded, arcSize, true);
 
- 		c.stroke();
 
- 		mxRectangleShape.prototype.paintForeground.apply(this, arguments);
 
- 	};
 
- 	mxCellRenderer.registerShape('associativeEntity', AssociativeEntity);
 
- 	// State Shapes derives from double ellipse
 
- 	function StateShape()
 
- 	{
 
- 		mxDoubleEllipse.call(this);
 
- 	};
 
- 	mxUtils.extend(StateShape, mxDoubleEllipse);
 
- 	StateShape.prototype.outerStroke = true;
 
- 	StateShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		var inset = Math.min(4, Math.min(w / 5, h / 5));
 
- 		
 
- 		if (w > 0 && h > 0)
 
- 		{
 
- 			c.ellipse(x + inset, y + inset, w - 2 * inset, h - 2 * inset);
 
- 			c.fillAndStroke();
 
- 		}
 
- 		
 
- 		c.setShadow(false);
 
- 		if (this.outerStroke)
 
- 		{
 
- 			c.ellipse(x, y, w, h);
 
- 			c.stroke();			
 
- 		}
 
- 	};
 
- 	mxCellRenderer.registerShape('endState', StateShape);
 
- 	function StartStateShape()
 
- 	{
 
- 		StateShape.call(this);
 
- 	};
 
- 	mxUtils.extend(StartStateShape, StateShape);
 
- 	StartStateShape.prototype.outerStroke = false;
 
- 	
 
- 	mxCellRenderer.registerShape('startState', StartStateShape);
 
- 	// Link shape
 
- 	function LinkShape()
 
- 	{
 
- 		mxArrowConnector.call(this);
 
- 		this.spacing = 0;
 
- 	};
 
- 	mxUtils.extend(LinkShape, mxArrowConnector);
 
- 	LinkShape.prototype.defaultWidth = 4;
 
- 	
 
- 	LinkShape.prototype.isOpenEnded = function()
 
- 	{
 
- 		return true;
 
- 	};
 
- 	LinkShape.prototype.getEdgeWidth = function()
 
- 	{
 
- 		return mxUtils.getNumber(this.style, 'width', this.defaultWidth) + Math.max(0, this.strokewidth - 1);
 
- 	};
 
- 	
 
- 	LinkShape.prototype.isArrowRounded = function()
 
- 	{
 
- 		return this.isRounded;
 
- 	};
 
- 	// Registers the link shape
 
- 	mxCellRenderer.registerShape('link', LinkShape);
 
- 	
 
- 	// Generic arrow
 
- 	function FlexArrowShape()
 
- 	{
 
- 		mxArrowConnector.call(this);
 
- 		this.spacing = 0;
 
- 	};
 
- 	mxUtils.extend(FlexArrowShape, mxArrowConnector);
 
- 	FlexArrowShape.prototype.defaultWidth = 10;
 
- 	FlexArrowShape.prototype.defaultArrowWidth = 20;
 
- 	FlexArrowShape.prototype.getStartArrowWidth = function()
 
- 	{
 
- 		return this.getEdgeWidth() + mxUtils.getNumber(this.style, 'startWidth', this.defaultArrowWidth);
 
- 	};
 
- 	FlexArrowShape.prototype.getEndArrowWidth = function()
 
- 	{
 
- 		return this.getEdgeWidth() + mxUtils.getNumber(this.style, 'endWidth', this.defaultArrowWidth);;
 
- 	};
 
- 	FlexArrowShape.prototype.getEdgeWidth = function()
 
- 	{
 
- 		return mxUtils.getNumber(this.style, 'width', this.defaultWidth) + Math.max(0, this.strokewidth - 1);
 
- 	};
 
- 	
 
- 	// Registers the link shape
 
- 	mxCellRenderer.registerShape('flexArrow', FlexArrowShape);
 
- 	
 
- 	// Manual Input shape
 
- 	function ManualInputShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(ManualInputShape, mxActor);
 
- 	ManualInputShape.prototype.size = 30;
 
- 	ManualInputShape.prototype.isRoundable = function()
 
- 	{
 
- 		return true;
 
- 	};
 
- 	ManualInputShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var s = Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)));
 
- 		var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
 
- 		this.addPoints(c, [new mxPoint(0, h), new mxPoint(0, s), new mxPoint(w, 0), new mxPoint(w, h)],
 
- 				this.isRounded, arcSize, true);
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('manualInput', ManualInputShape);
 
- 	// Internal storage
 
- 	function InternalStorageShape()
 
- 	{
 
- 		mxRectangleShape.call(this);
 
- 	};
 
- 	mxUtils.extend(InternalStorageShape, mxRectangleShape);
 
- 	InternalStorageShape.prototype.dx = 20;
 
- 	InternalStorageShape.prototype.dy = 20;
 
- 	InternalStorageShape.prototype.isHtmlAllowed = function()
 
- 	{
 
- 		return false;
 
- 	};
 
- 	InternalStorageShape.prototype.paintForeground = function(c, x, y, w, h)
 
- 	{
 
- 		mxRectangleShape.prototype.paintForeground.apply(this, arguments);
 
- 		var inset = 0;
 
- 		
 
- 		if (this.isRounded)
 
- 		{
 
- 			var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE,
 
- 				mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) / 100;
 
- 			inset = Math.max(inset, Math.min(w * f, h * f));
 
- 		}
 
- 		
 
- 		var dx = Math.max(inset, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'dx', this.dx))));
 
- 		var dy = Math.max(inset, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'dy', this.dy))));
 
- 		
 
- 		c.begin();
 
- 		c.moveTo(x, y + dy);
 
- 		c.lineTo(x + w, y + dy);
 
- 		c.end();
 
- 		c.stroke();
 
- 		
 
- 		c.begin();
 
- 		c.moveTo(x + dx, y);
 
- 		c.lineTo(x + dx, y + h);
 
- 		c.end();
 
- 		c.stroke();
 
- 	};
 
- 	mxCellRenderer.registerShape('internalStorage', InternalStorageShape);
 
- 	// Internal storage
 
- 	function CornerShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(CornerShape, mxActor);
 
- 	CornerShape.prototype.dx = 20;
 
- 	CornerShape.prototype.dy = 20;
 
- 	
 
- 	// Corner
 
- 	CornerShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'dx', this.dx))));
 
- 		var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'dy', this.dy))));
 
- 		
 
- 		var s = Math.min(w / 2, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
 
- 		this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w, 0), new mxPoint(w, dy), new mxPoint(dx, dy),
 
- 		                   new mxPoint(dx, h), new mxPoint(0, h)], this.isRounded, arcSize, true);
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('corner', CornerShape);
 
- 	// Crossbar shape
 
- 	function CrossbarShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(CrossbarShape, mxActor);
 
- 	
 
- 	CrossbarShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		c.moveTo(0, 0);
 
- 		c.lineTo(0, h);
 
- 		c.end();
 
- 		
 
- 		c.moveTo(w, 0);
 
- 		c.lineTo(w, h);
 
- 		c.end();
 
- 		
 
- 		c.moveTo(0, h / 2);
 
- 		c.lineTo(w, h / 2);
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('crossbar', CrossbarShape);
 
- 	// Internal storage
 
- 	function TeeShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(TeeShape, mxActor);
 
- 	TeeShape.prototype.dx = 20;
 
- 	TeeShape.prototype.dy = 20;
 
- 	
 
- 	// Corner
 
- 	TeeShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'dx', this.dx))));
 
- 		var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'dy', this.dy))));
 
- 		var w2 = Math.abs(w - dx) / 2;
 
- 		
 
- 		var s = Math.min(w / 2, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
 
- 		this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w, 0), new mxPoint(w, dy), new mxPoint((w + dx) / 2, dy),
 
- 		                   new mxPoint((w + dx) / 2, h), new mxPoint((w - dx) / 2, h), new mxPoint((w - dx) / 2, dy),
 
- 		                   new mxPoint(0, dy)], this.isRounded, arcSize, true);
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('tee', TeeShape);
 
- 	// Arrow
 
- 	function SingleArrowShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(SingleArrowShape, mxActor);
 
- 	SingleArrowShape.prototype.arrowWidth = 0.3;
 
- 	SingleArrowShape.prototype.arrowSize = 0.2;
 
- 	SingleArrowShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var aw = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowWidth', this.arrowWidth))));
 
- 		var as = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowSize', this.arrowSize))));
 
- 		var at = (h - aw) / 2;
 
- 		var ab = at + aw;
 
- 		
 
- 		var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
 
- 		this.addPoints(c, [new mxPoint(0, at), new mxPoint(w - as, at), new mxPoint(w - as, 0), new mxPoint(w, h / 2),
 
- 		                   new mxPoint(w - as, h), new mxPoint(w - as, ab), new mxPoint(0, ab)],
 
- 		                   this.isRounded, arcSize, true);
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('singleArrow', SingleArrowShape);
 
- 	// Arrow
 
- 	function DoubleArrowShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(DoubleArrowShape, mxActor);
 
- 	DoubleArrowShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var aw = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowWidth', SingleArrowShape.prototype.arrowWidth))));
 
- 		var as = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowSize', SingleArrowShape.prototype.arrowSize))));
 
- 		var at = (h - aw) / 2;
 
- 		var ab = at + aw;
 
- 		
 
- 		var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
 
- 		this.addPoints(c, [new mxPoint(0, h / 2), new mxPoint(as, 0), new mxPoint(as, at), new mxPoint(w - as, at),
 
- 		                   new mxPoint(w - as, 0), new mxPoint(w, h / 2), new mxPoint(w - as, h),
 
- 		                   new mxPoint(w - as, ab), new mxPoint(as, ab), new mxPoint(as, h)],
 
- 		                   this.isRounded, arcSize, true);
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('doubleArrow', DoubleArrowShape);
 
- 	// Data storage
 
- 	function DataStorageShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(DataStorageShape, mxActor);
 
- 	DataStorageShape.prototype.size = 0.1;
 
- 	DataStorageShape.prototype.fixedSize = 20;
 
- 	DataStorageShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var fixed = mxUtils.getValue(this.style, 'fixedSize', '0') != '0';
 
- 		var s = (fixed) ? Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'size', this.fixedSize)))) :
 
- 			w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		
 
- 		c.moveTo(s, 0);
 
- 		c.lineTo(w, 0);
 
- 		c.quadTo(w - s * 2, h / 2, w, h);
 
- 		c.lineTo(s, h);
 
- 		c.quadTo(s - s * 2, h / 2, s, 0);
 
- 		c.close();
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('dataStorage', DataStorageShape);
 
- 	// Or
 
- 	function OrShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(OrShape, mxActor);
 
- 	OrShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		c.moveTo(0, 0);
 
- 		c.quadTo(w, 0, w, h / 2);
 
- 		c.quadTo(w, h, 0, h);
 
- 		c.close();
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('or', OrShape);
 
- 	// Xor
 
- 	function XorShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(XorShape, mxActor);
 
- 	XorShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		c.moveTo(0, 0);
 
- 		c.quadTo(w, 0, w, h / 2);
 
- 		c.quadTo(w, h, 0, h);
 
- 		c.quadTo(w / 2, h / 2, 0, 0);
 
- 		c.close();
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('xor', XorShape);
 
- 	// Loop limit
 
- 	function LoopLimitShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(LoopLimitShape, mxActor);
 
- 	LoopLimitShape.prototype.size = 20;
 
- 	LoopLimitShape.prototype.isRoundable = function()
 
- 	{
 
- 		return true;
 
- 	};
 
- 	LoopLimitShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var s = Math.min(w / 2, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
 
- 		this.addPoints(c, [new mxPoint(s, 0), new mxPoint(w - s, 0), new mxPoint(w, s * 0.8), new mxPoint(w, h),
 
- 		                   new mxPoint(0, h), new mxPoint(0, s * 0.8)], this.isRounded, arcSize, true);
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('loopLimit', LoopLimitShape);
 
- 	// Off page connector
 
- 	function OffPageConnectorShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(OffPageConnectorShape, mxActor);
 
- 	OffPageConnectorShape.prototype.size = 3 / 8;
 
- 	OffPageConnectorShape.prototype.isRoundable = function()
 
- 	{
 
- 		return true;
 
- 	};
 
- 	OffPageConnectorShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var s = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
 
- 		this.addPoints(c, [new mxPoint(0, 0), new mxPoint(w, 0), new mxPoint(w, h - s), new mxPoint(w / 2, h),
 
- 		                   new mxPoint(0, h - s)], this.isRounded, arcSize, true);
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('offPageConnector', OffPageConnectorShape);
 
- 	// Internal storage
 
- 	function TapeDataShape()
 
- 	{
 
- 		mxEllipse.call(this);
 
- 	};
 
- 	mxUtils.extend(TapeDataShape, mxEllipse);
 
- 	TapeDataShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		mxEllipse.prototype.paintVertexShape.apply(this, arguments);
 
- 		
 
- 		c.begin();
 
- 		c.moveTo(x + w / 2, y + h);
 
- 		c.lineTo(x + w, y + h);
 
- 		c.end();
 
- 		c.stroke();
 
- 	};
 
- 	mxCellRenderer.registerShape('tapeData', TapeDataShape);
 
- 	// OrEllipseShape
 
- 	function OrEllipseShape()
 
- 	{
 
- 		mxEllipse.call(this);
 
- 	};
 
- 	mxUtils.extend(OrEllipseShape, mxEllipse);
 
- 	OrEllipseShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		mxEllipse.prototype.paintVertexShape.apply(this, arguments);
 
- 		
 
- 		c.setShadow(false);
 
- 		c.begin();
 
- 		c.moveTo(x, y + h / 2);
 
- 		c.lineTo(x + w, y + h / 2);
 
- 		c.end();
 
- 		c.stroke();
 
- 		
 
- 		c.begin();
 
- 		c.moveTo(x + w / 2, y);
 
- 		c.lineTo(x + w / 2, y + h);
 
- 		c.end();
 
- 		c.stroke();
 
- 	};
 
- 	mxCellRenderer.registerShape('orEllipse', OrEllipseShape);
 
- 	// SumEllipseShape
 
- 	function SumEllipseShape()
 
- 	{
 
- 		mxEllipse.call(this);
 
- 	};
 
- 	mxUtils.extend(SumEllipseShape, mxEllipse);
 
- 	SumEllipseShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		mxEllipse.prototype.paintVertexShape.apply(this, arguments);
 
- 		var s2 = 0.145;
 
- 		
 
- 		c.setShadow(false);
 
- 		c.begin();
 
- 		c.moveTo(x + w * s2, y + h * s2);
 
- 		c.lineTo(x + w * (1 - s2), y + h * (1 - s2));
 
- 		c.end();
 
- 		c.stroke();
 
- 		
 
- 		c.begin();
 
- 		c.moveTo(x + w * (1 - s2), y + h * s2);
 
- 		c.lineTo(x + w * s2, y + h * (1 - s2));
 
- 		c.end();
 
- 		c.stroke();
 
- 	};
 
- 	mxCellRenderer.registerShape('sumEllipse', SumEllipseShape);
 
- 	// SortShape
 
- 	function SortShape()
 
- 	{
 
- 		mxRhombus.call(this);
 
- 	};
 
- 	mxUtils.extend(SortShape, mxRhombus);
 
- 	SortShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		mxRhombus.prototype.paintVertexShape.apply(this, arguments);
 
- 		
 
- 		c.setShadow(false);
 
- 		c.begin();
 
- 		c.moveTo(x, y + h / 2);
 
- 		c.lineTo(x + w, y + h / 2);
 
- 		c.end();
 
- 		c.stroke();
 
- 	};
 
- 	mxCellRenderer.registerShape('sortShape', SortShape);
 
- 	// CollateShape
 
- 	function CollateShape()
 
- 	{
 
- 		mxEllipse.call(this);
 
- 	};
 
- 	mxUtils.extend(CollateShape, mxEllipse);
 
- 	CollateShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		c.begin();
 
- 		c.moveTo(x, y);
 
- 		c.lineTo(x + w, y);
 
- 		c.lineTo(x + w / 2, y + h / 2);
 
- 		c.close();
 
- 		c.fillAndStroke();
 
- 		
 
- 		c.begin();
 
- 		c.moveTo(x, y + h);
 
- 		c.lineTo(x + w, y + h);
 
- 		c.lineTo(x + w / 2, y + h / 2);
 
- 		c.close();
 
- 		c.fillAndStroke();
 
- 	};
 
- 	mxCellRenderer.registerShape('collate', CollateShape);
 
- 	// DimensionShape
 
- 	function DimensionShape()
 
- 	{
 
- 		mxEllipse.call(this);
 
- 	};
 
- 	mxUtils.extend(DimensionShape, mxEllipse);
 
- 	DimensionShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		var sw = c.state.strokeWidth / 2;
 
- 		// Arrow size
 
- 		var al = 10 + 2 * sw;
 
- 		var cy = y + h - al / 2;
 
- 		
 
- 		c.begin();
 
- 		c.moveTo(x, y);
 
- 		c.lineTo(x, y + h);
 
- 		c.moveTo(x + sw, cy);
 
- 		c.lineTo(x + sw + al, cy - al / 2);
 
- 		c.moveTo(x + sw, cy);
 
- 		c.lineTo(x + sw + al, cy + al / 2);
 
- 		c.moveTo(x + sw, cy);
 
- 		c.lineTo(x + w - sw, cy);
 
- 		// Opposite side
 
- 		c.moveTo(x + w, y);
 
- 		c.lineTo(x + w, y + h);
 
- 		c.moveTo(x + w - sw, cy);
 
- 		c.lineTo(x + w - al - sw, cy - al / 2);
 
- 		c.moveTo(x + w - sw, cy);
 
- 		c.lineTo(x + w - al - sw, cy + al / 2);
 
- 		c.end();
 
- 		c.stroke();
 
- 	};
 
- 	mxCellRenderer.registerShape('dimension', DimensionShape);
 
- 	// PartialRectangleShape
 
- 	function PartialRectangleShape()
 
- 	{
 
- 		mxEllipse.call(this);
 
- 	};
 
- 	mxUtils.extend(PartialRectangleShape, mxEllipse);
 
- 	PartialRectangleShape.prototype.drawHidden = true;
 
- 	PartialRectangleShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		if (!this.outline)
 
- 		{
 
- 			c.setStrokeColor(null);
 
- 		}
 
- 		if (this.style != null)
 
- 		{
 
- 			var pointerEvents = c.pointerEvents;
 
- 			var filled = this.fill != null && this.fill != mxConstants.NONE;
 
- 			var events = mxUtils.getValue(this.style, mxConstants.STYLE_POINTER_EVENTS, '1') == '1';
 
- 			
 
- 			if (!events && !filled)
 
- 			{
 
- 				c.pointerEvents = false;
 
- 			}
 
- 			var top = mxUtils.getValue(this.style, 'top', '1') == '1';
 
- 			var left = mxUtils.getValue(this.style, 'left', '1') == '1';
 
- 			var right = mxUtils.getValue(this.style, 'right', '1') == '1';
 
- 			var bottom = mxUtils.getValue(this.style, 'bottom', '1') == '1';
 
- 			if (this.drawHidden || filled || this.outline || top || right || bottom || left)
 
- 			{
 
- 				c.rect(x, y, w, h);
 
- 				c.fill();
 
- 				c.pointerEvents = pointerEvents;
 
- 				c.setStrokeColor(this.stroke);
 
- 				c.setLineCap('square');
 
- 				c.begin();
 
- 				c.moveTo(x, y);
 
- 				
 
- 				if (this.outline || top)
 
- 				{
 
- 					c.lineTo(x + w, y);
 
- 				}
 
- 				else
 
- 				{
 
- 					c.moveTo(x + w, y);
 
- 				}
 
- 				
 
- 				if (this.outline || right)
 
- 				{
 
- 					c.lineTo(x + w, y + h);
 
- 				}
 
- 				else
 
- 				{
 
- 					c.moveTo(x + w, y + h);
 
- 				}
 
- 				
 
- 				if (this.outline || bottom)
 
- 				{
 
- 					c.lineTo(x, y + h);
 
- 				}
 
- 				else
 
- 				{
 
- 					c.moveTo(x, y + h);
 
- 				}
 
- 				
 
- 				if (this.outline || left)
 
- 				{
 
- 					c.lineTo(x, y);
 
- 				}
 
- 				
 
- 				c.end();
 
- 				c.stroke();
 
- 				c.setLineCap('flat');
 
- 			}
 
- 			else
 
- 			{
 
- 				c.setStrokeColor(this.stroke);
 
- 			}
 
- 		}
 
- 	};
 
- 	mxCellRenderer.registerShape('partialRectangle', PartialRectangleShape);
 
- 	// LineEllipseShape
 
- 	function LineEllipseShape()
 
- 	{
 
- 		mxEllipse.call(this);
 
- 	};
 
- 	mxUtils.extend(LineEllipseShape, mxEllipse);
 
- 	LineEllipseShape.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		mxEllipse.prototype.paintVertexShape.apply(this, arguments);
 
- 		
 
- 		c.setShadow(false);
 
- 		c.begin();
 
- 		
 
- 		if (mxUtils.getValue(this.style, 'line') == 'vertical')
 
- 		{
 
- 			c.moveTo(x + w / 2, y);
 
- 			c.lineTo(x + w / 2, y + h);
 
- 		}
 
- 		else
 
- 		{
 
- 			c.moveTo(x, y + h / 2);
 
- 			c.lineTo(x + w, y + h / 2);
 
- 		}
 
- 		c.end();			
 
- 		c.stroke();
 
- 	};
 
- 	mxCellRenderer.registerShape('lineEllipse', LineEllipseShape);
 
- 	// Delay
 
- 	function DelayShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(DelayShape, mxActor);
 
- 	DelayShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var dx = Math.min(w, h / 2);
 
- 		c.moveTo(0, 0);
 
- 		c.lineTo(w - dx, 0);
 
- 		c.quadTo(w, 0, w, h / 2);
 
- 		c.quadTo(w, h, w - dx, h);
 
- 		c.lineTo(0, h);
 
- 		c.close();
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('delay', DelayShape);
 
- 	// Cross Shape
 
- 	function CrossShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(CrossShape, mxActor);
 
- 	CrossShape.prototype.size = 0.2;
 
- 	CrossShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var m = Math.min(h, w);
 
- 		var size = Math.max(0, Math.min(m, m * parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		var t = (h - size) / 2;
 
- 		var b = t + size;
 
- 		var l = (w - size) / 2;
 
- 		var r = l + size;
 
- 		
 
- 		c.moveTo(0, t);
 
- 		c.lineTo(l, t);
 
- 		c.lineTo(l, 0);
 
- 		c.lineTo(r, 0);
 
- 		c.lineTo(r, t);
 
- 		c.lineTo(w, t);
 
- 		c.lineTo(w, b);
 
- 		c.lineTo(r, b);
 
- 		c.lineTo(r, h);
 
- 		c.lineTo(l, h);
 
- 		c.lineTo(l, b);
 
- 		c.lineTo(0, b);
 
- 		c.close();
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('cross', CrossShape);
 
- 	// Display
 
- 	function DisplayShape()
 
- 	{
 
- 		mxActor.call(this);
 
- 	};
 
- 	mxUtils.extend(DisplayShape, mxActor);
 
- 	DisplayShape.prototype.size = 0.25;
 
- 	DisplayShape.prototype.redrawPath = function(c, x, y, w, h)
 
- 	{
 
- 		var dx = Math.min(w, h / 2);
 
- 		var s = Math.min(w - dx, Math.max(0, parseFloat(mxUtils.getValue(this.style, 'size', this.size))) * w);
 
- 		
 
- 		c.moveTo(0, h / 2);
 
- 		c.lineTo(s, 0);
 
- 		c.lineTo(w - dx, 0);
 
- 		c.quadTo(w, 0, w, h / 2);
 
- 		c.quadTo(w, h, w - dx, h);
 
- 		c.lineTo(s, h);
 
- 		c.close();
 
- 		c.end();
 
- 	};
 
- 	mxCellRenderer.registerShape('display', DisplayShape);
 
- 	//**********************************************************************************************************************************************************
 
- 	//Rectangle v2
 
- 	//**********************************************************************************************************************************************************
 
- 	/**
 
- 	* Extends mxShape.
 
- 	*/
 
- 	function mxShapeBasicRect2(bounds, fill, stroke, strokewidth)
 
- 	{
 
- 		mxShape.call(this);
 
- 		this.bounds = bounds;
 
- 		this.fill = fill;
 
- 		this.stroke = stroke;
 
- 		this.strokewidth = (strokewidth != null) ? strokewidth : 1;
 
- 		this.rectStyle = 'square';
 
- 		this.size = 10;
 
- 		this.absoluteCornerSize = true;
 
- 		this.indent = 2;
 
- 		this.rectOutline = 'single';
 
- 	};
 
- 	/**
 
- 	* Extends mxShape.
 
- 	*/
 
- 	mxUtils.extend(mxShapeBasicRect2, mxActor);
 
- 	mxShapeBasicRect2.prototype.cst = {RECT2 : 'mxgraph.basic.rect'};
 
- 	mxShapeBasicRect2.prototype.customProperties = [
 
- 		{name: 'rectStyle', dispName: 'Style', type: 'enum', defVal:'square',
 
- 			enumList:[
 
- 				{val:'square', dispName:'Square'},
 
- 				{val:'rounded', dispName:'Round'},
 
- 				{val:'snip', dispName:'Snip'},
 
- 				{val:'invRound', dispName:'Inv. Round'},
 
- 				{val:'fold', dispName:'Fold'}
 
- 			]},
 
- 		{name: 'size', dispName: 'Corner Size', type: 'float', defVal:10},
 
- 		{name: 'absoluteCornerSize', dispName: 'Abs. Corner Size', type: 'bool', defVal:true},
 
- 		{name: 'indent', dispName:'Indent', type:'float', defVal:2},
 
- 		{name: 'rectOutline', dispName: 'Outline', type: 'enum', defVal:'single',
 
- 			enumList:[
 
- 				{val:'single', dispName:'Single'},
 
- 				{val:'double', dispName:'Double'},
 
- 				{val:'frame', dispName:'Frame'}
 
- 			]},
 
- 		{name: 'fillColor2', dispName:'Inside Fill Color', type:'color', defVal:'none'},
 
- 		{name: 'gradientColor2', dispName:'Inside Gradient Color', type:'color', defVal:'none'},
 
- 		{name: 'gradientDirection2', dispName: 'Inside Gradient Direction', type: 'enum', defVal:'south',
 
- 			enumList:[
 
- 				{val:'south', dispName:'South'},
 
- 				{val:'west', dispName:'West'},
 
- 				{val:'north', dispName:'North'},
 
- 				{val:'east', dispName:'East'}
 
- 		]},
 
- 		{name: 'top', dispName:'Top Line', type:'bool', defVal:true},
 
- 		{name: 'right', dispName:'Right', type:'bool', defVal:true},
 
- 		{name: 'bottom', dispName:'Bottom Line', type:'bool', defVal:true},
 
- 		{name: 'left', dispName:'Left ', type:'bool', defVal:true},
 
- 		{name: 'topLeftStyle', dispName: 'Top Left Style', type: 'enum', defVal:'default',
 
- 		enumList:[
 
- 			{val:'default', dispName:'Default'},
 
- 			{val:'square', dispName:'Square'},
 
- 			{val:'rounded', dispName:'Round'},
 
- 			{val:'snip', dispName:'Snip'},
 
- 			{val:'invRound', dispName:'Inv. Round'},
 
- 			{val:'fold', dispName:'Fold'}
 
- 		]},
 
- 		{name: 'topRightStyle', dispName: 'Top Right Style', type: 'enum', defVal:'default',
 
- 			enumList:[
 
- 				{val:'default', dispName:'Default'},
 
- 				{val:'square', dispName:'Square'},
 
- 				{val:'rounded', dispName:'Round'},
 
- 				{val:'snip', dispName:'Snip'},
 
- 				{val:'invRound', dispName:'Inv. Round'},
 
- 				{val:'fold', dispName:'Fold'}
 
- 		]},
 
- 		{name: 'bottomRightStyle', dispName: 'Bottom Right Style', type: 'enum', defVal:'default',
 
- 			enumList:[
 
- 				{val:'default', dispName:'Default'},
 
- 				{val:'square', dispName:'Square'},
 
- 				{val:'rounded', dispName:'Round'},
 
- 				{val:'snip', dispName:'Snip'},
 
- 				{val:'invRound', dispName:'Inv. Round'},
 
- 				{val:'fold', dispName:'Fold'}
 
- 		]},
 
- 		{name: 'bottomLeftStyle', dispName: 'Bottom Left Style', type: 'enum', defVal:'default',
 
- 			enumList:[
 
- 				{val:'default', dispName:'Default'},
 
- 				{val:'square', dispName:'Square'},
 
- 				{val:'rounded', dispName:'Round'},
 
- 				{val:'snip', dispName:'Snip'},
 
- 				{val:'invRound', dispName:'Inv. Round'},
 
- 				{val:'fold', dispName:'Fold'}
 
- 		]},
 
- 	];
 
- 	/**
 
- 	* Function: paintVertexShape
 
- 	* 
 
- 	* Paints the vertex shape.
 
- 	*/
 
- 	mxShapeBasicRect2.prototype.paintVertexShape = function(c, x, y, w, h)
 
- 	{
 
- 		c.translate(x, y);
 
- 		this.strictDrawShape(c, 0, 0, w, h);
 
- 	}
 
- 	//
 
- 	mxShapeBasicRect2.prototype.strictDrawShape = function(c, x, y, w, h, os)
 
- 	{
 
- 		// read styles or optionally override them externally via "os" variable
 
- 		var rectStyle =	(os && os.rectStyle) ? os.rectStyle : mxUtils.getValue(this.style, 'rectStyle', this.rectStyle);
 
- 		var absoluteCornerSize = (os && os.absoluteCornerSize) ? os.absoluteCornerSize : mxUtils.getValue(this.style, 'absoluteCornerSize', this.absoluteCornerSize);
 
- 		var size =	(os && os.size) ? os.size : Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		var rectOutline = (os && os.rectOutline) ? os.rectOutline : mxUtils.getValue(this.style, 'rectOutline', this.rectOutline);
 
- 		var indent = (os && os.indent) ? os.indent : Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'indent', this.indent))));
 
- 		var dashed = (os && os.dashed) ? os.dashed : mxUtils.getValue(this.style, 'dashed', false);
 
- 		var dashPattern = (os && os.dashPattern) ? os.dashPattern : mxUtils.getValue(this.style, 'dashPattern', null);
 
- 		var relIndent = (os && os.relIndent) ? os.relIndent : Math.max(0, Math.min(50, indent));
 
- 		var top = (os && os.top) ? os.top : mxUtils.getValue(this.style, 'top', true);
 
- 		var right = (os && os.right) ? os.right : mxUtils.getValue(this.style, 'right', true);
 
- 		var bottom = (os && os.bottom) ? os.bottom : mxUtils.getValue(this.style, 'bottom', true);
 
- 		var left = (os && os.left) ? os.left : mxUtils.getValue(this.style, 'left', true);
 
- 		var topLeftStyle = (os && os.topLeftStyle) ? os.topLeftStyle : mxUtils.getValue(this.style, 'topLeftStyle', 'default');
 
- 		var topRightStyle = (os && os.topRightStyle) ? os.topRightStyle : mxUtils.getValue(this.style, 'topRightStyle', 'default');
 
- 		var bottomRightStyle = (os && os.bottomRightStyle) ? os.bottomRightStyle : mxUtils.getValue(this.style, 'bottomRightStyle', 'default');
 
- 		var bottomLeftStyle = (os && os.bottomLeftStyle) ? os.bottomLeftStyle : mxUtils.getValue(this.style, 'bottomLeftStyle', 'default');
 
- 		var fillColor = (os && os.fillColor) ? os.fillColor : mxUtils.getValue(this.style, 'fillColor', '#ffffff');
 
- 		var strokeColor = (os && os.strokeColor) ? os.strokeColor : mxUtils.getValue(this.style, 'strokeColor', '#000000');
 
- 		var strokeWidth = (os && os.strokeWidth) ? os.strokeWidth : mxUtils.getValue(this.style, 'strokeWidth', '1');
 
- 		var fillColor2 = (os && os.fillColor2) ? os.fillColor2 : mxUtils.getValue(this.style, 'fillColor2', 'none');
 
- 		var gradientColor2 = (os && os.gradientColor2) ? os.gradientColor2 : mxUtils.getValue(this.style, 'gradientColor2', 'none');
 
- 		var gdir2 = (os && os.gradientDirection2) ? os.gradientDirection2 : mxUtils.getValue(this.style, 'gradientDirection2', 'south');
 
- 		var opacity = (os && os.opacity) ? os.opacity : mxUtils.getValue(this.style, 'opacity', '100');
 
- 		
 
- 		var relSize = Math.max(0, Math.min(50, size));
 
- 		var sc = mxShapeBasicRect2.prototype;
 
- 		
 
- 		c.setDashed(dashed);
 
- 		
 
- 		if (dashPattern && dashPattern != '')
 
- 		{
 
- 			c.setDashPattern(dashPattern);
 
- 		}
 
- 		
 
- 		c.setStrokeWidth(strokeWidth);
 
- 		
 
- 		size = Math.min(h * 0.5, w * 0.5, size);
 
- 		
 
- 		if (!absoluteCornerSize)
 
- 		{
 
- 			size = relSize * Math.min(w, h) / 100;
 
- 		}
 
- 		
 
- 		size = Math.min(size, Math.min(w, h) * 0.5);
 
- 		
 
- 		if (!absoluteCornerSize)
 
- 		{
 
- 			indent = Math.min(relIndent * Math.min(w, h) / 100);
 
- 		}
 
- 		indent = Math.min(indent, Math.min(w, h) * 0.5 - size);
 
- 		
 
- 		if ((top || right || bottom || left) && rectOutline != 'frame')
 
- 		{
 
- 			
 
- 			//outline fill
 
- 			c.begin();
 
- 			if (!top)
 
- 			{
 
- 				c.moveTo(0,0);
 
- 			}
 
- 			else
 
- 			{
 
- 				sc.moveNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 			}
 
- 			
 
- 			if (top)
 
- 			{
 
- 				sc.paintNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 			}
 
- 			sc.paintTop(c, x, y, w, h, rectStyle, topRightStyle, size, right);
 
- 			
 
- 			if (right)
 
- 			{
 
- 				sc.paintNE(c, x, y, w, h, rectStyle, topRightStyle, size, top);
 
- 			}
 
- 			sc.paintRight(c, x, y, w, h, rectStyle, bottomRightStyle, size, bottom);
 
- 			
 
- 			if (bottom)
 
- 			{
 
- 				sc.paintSE(c, x, y, w, h, rectStyle, bottomRightStyle, size, right);
 
- 			}
 
- 			
 
- 			sc.paintBottom(c, x, y, w, h, rectStyle, bottomLeftStyle, size, left);
 
- 			
 
- 			if (left)
 
- 			{
 
- 				sc.paintSW(c, x, y, w, h, rectStyle, bottomLeftStyle, size, bottom);
 
- 			}
 
- 			sc.paintLeft(c, x, y, w, h, rectStyle, topLeftStyle, size, top);
 
- 			c.close();
 
- 			c.fill();
 
- 			c.setShadow(false);
 
- 			//inner fill
 
- 			c.setFillColor(fillColor2);
 
- 			var op1 = opacity;
 
- 			var op2 = opacity;
 
- 			
 
- 			if (fillColor2 == 'none')
 
- 			{
 
- 				op1 = 0;
 
- 			}
 
- 			
 
- 			if (gradientColor2 == 'none')
 
- 			{
 
- 				op2 = 0;
 
- 			}
 
- 			
 
- 			c.setGradient(fillColor2, gradientColor2, 0, 0, w, h, gdir2, op1, op2);
 
- 			
 
- 			c.begin();
 
- 			if (!top)
 
- 			{
 
- 				c.moveTo(indent,0);
 
- 			}
 
- 			else
 
- 			{
 
- 				sc.moveNWInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, top, left);
 
- 			}
 
- 			sc.paintLeftInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom, left);
 
- 			
 
- 			if (left && bottom)
 
- 			{
 
- 				sc.paintSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom);
 
- 			}
 
- 			sc.paintBottomInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, right, bottom);
 
- 			
 
- 			if (bottom && right)
 
- 			{
 
- 				sc.paintSEInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent);
 
- 			}
 
- 			
 
- 			sc.paintRightInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, top, right);
 
- 			
 
- 			if (right && top)
 
- 			{
 
- 				sc.paintNEInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent);
 
- 			}
 
- 			sc.paintTopInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, left, top);
 
- 			
 
- 			if (top && left)
 
- 			{
 
- 				sc.paintNWInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent);
 
- 			}
 
- 			c.fill();
 
- 			if (fillColor == 'none')
 
- 			{
 
- 				c.begin();
 
- 				sc.paintFolds(c, x, y, w, h, rectStyle, topLeftStyle, topRightStyle, bottomRightStyle, bottomLeftStyle, size, top, right, bottom, left);
 
- 				c.stroke();
 
- 			}
 
- 		}
 
- 		//draw all the combinations
 
- 		if (!top && !right && !bottom && left)
 
- 		{
 
- 			
 
- 			if (rectOutline != 'frame')
 
- 			{
 
- 				c.begin();
 
- 				sc.moveSW(c, x, y, w, h, rectStyle, topLeftStyle, size, bottom);
 
- 				sc.paintLeft(c, x, y, w, h, rectStyle, topLeftStyle, size, top);
 
- 				if (rectOutline == 'double')
 
- 				{
 
- 					sc.moveNWInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, top, left);
 
- 					sc.paintLeftInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom, left);
 
- 				}
 
- 				
 
- 				c.stroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				c.begin();
 
- 				sc.moveSW(c, x, y, w, h, rectStyle, topLeftStyle, size, bottom);
 
- 				sc.paintLeft(c, x, y, w, h, rectStyle, topLeftStyle, size, top);
 
- 				sc.lineNWInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, top, left);
 
- 				sc.paintLeftInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom, left);
 
- 				c.close();
 
- 				c.fillAndStroke();
 
- 			}
 
- 		}
 
- 		else if (!top && !right && bottom && !left)
 
- 		{
 
- 			if (rectOutline != 'frame')
 
- 			{
 
- 				c.begin();
 
- 				sc.moveSE(c, x, y, w, h, rectStyle, bottomRightStyle, size, right);
 
- 				sc.paintBottom(c, x, y, w, h, rectStyle, bottomLeftStyle, size, left);
 
- 		
 
- 				if (rectOutline == 'double')
 
- 				{
 
- 					sc.moveSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, left);
 
- 					sc.paintBottomInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, right, bottom);
 
- 				}
 
- 				
 
- 				c.stroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				c.begin();
 
- 				sc.moveSE(c, x, y, w, h, rectStyle, bottomRightStyle, size, right);
 
- 				sc.paintBottom(c, x, y, w, h, rectStyle, bottomLeftStyle, size, left);
 
- 				sc.lineSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, left);
 
- 				sc.paintBottomInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, right, bottom);
 
- 				c.close();
 
- 				c.fillAndStroke();
 
- 			}
 
- 		}
 
- 		else if (!top && !right && bottom && left)
 
- 		{
 
- 			if (rectOutline != 'frame')
 
- 			{
 
- 				c.begin();
 
- 				sc.moveSE(c, x, y, w, h, rectStyle, bottomRightStyle, size, right);
 
- 				sc.paintBottom(c, x, y, w, h, rectStyle, bottomLeftStyle, size, left);
 
- 				sc.paintSW(c, x, y, w, h, rectStyle, bottomLeftStyle, size, bottom);
 
- 				sc.paintLeft(c, x, y, w, h, rectStyle, topLeftStyle, size, top);
 
- 		
 
- 				if (rectOutline == 'double')
 
- 				{
 
- 					sc.moveNWInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, top, left);
 
- 					sc.paintLeftInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom, left);
 
- 					sc.paintSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom);
 
- 					sc.paintBottomInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, right, bottom);
 
- 				}
 
- 				
 
- 				c.stroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				c.begin();
 
- 				sc.moveSE(c, x, y, w, h, rectStyle, bottomRightStyle, size, right);
 
- 				sc.paintBottom(c, x, y, w, h, rectStyle, bottomLeftStyle, size, left);
 
- 				sc.paintSW(c, x, y, w, h, rectStyle, bottomLeftStyle, size, bottom);
 
- 				sc.paintLeft(c, x, y, w, h, rectStyle, topLeftStyle, size, top);
 
- 				sc.lineNWInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, top, left);
 
- 				sc.paintLeftInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom, left);
 
- 				sc.paintSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom);
 
- 				sc.paintBottomInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, right, bottom);
 
- 				c.close();
 
- 				c.fillAndStroke();
 
- 			}
 
- 		}
 
- 		else if (!top && right && !bottom && !left)
 
- 		{
 
- 			if (rectOutline != 'frame')
 
- 			{
 
- 				c.begin();
 
- 				sc.moveNE(c, x, y, w, h, rectStyle, topRightStyle, size, top);
 
- 				sc.paintRight(c, x, y, w, h, rectStyle, bottomRightStyle, size, bottom);
 
- 		
 
- 				if (rectOutline == 'double')
 
- 				{
 
- 					sc.moveSEInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, bottom);
 
- 					sc.paintRightInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, top, right);
 
- 				}
 
- 				
 
- 				c.stroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				c.begin();
 
- 				sc.moveNE(c, x, y, w, h, rectStyle, topRightStyle, size, top);
 
- 				sc.paintRight(c, x, y, w, h, rectStyle, bottomRightStyle, size, bottom);
 
- 				sc.lineSEInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, bottom);
 
- 				sc.paintRightInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, top, right);
 
- 				c.close();
 
- 				c.fillAndStroke();
 
- 			}
 
- 		}
 
- 		else if (!top && right && !bottom && left)
 
- 		{
 
- 			if (rectOutline != 'frame')
 
- 			{
 
- 				c.begin();
 
- 				sc.moveSW(c, x, y, w, h, rectStyle, topLeftStyle, size, bottom);
 
- 				sc.paintLeft(c, x, y, w, h, rectStyle, topLeftStyle, size, top);
 
- 		
 
- 				if (rectOutline == 'double')
 
- 				{
 
- 					sc.moveNWInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, top, left);
 
- 					sc.paintLeftInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom, left);
 
- 				}
 
- 				
 
- 				c.stroke();
 
- 				
 
- 				c.begin();
 
- 				sc.moveNE(c, x, y, w, h, rectStyle, topRightStyle, size, top);
 
- 				sc.paintRight(c, x, y, w, h, rectStyle, bottomRightStyle, size, bottom);
 
- 		
 
- 				if (rectOutline == 'double')
 
- 				{
 
- 					sc.moveSEInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, bottom);
 
- 					sc.paintRightInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, top, right);
 
- 				}
 
- 				
 
- 				c.stroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				c.begin();
 
- 				sc.moveSW(c, x, y, w, h, rectStyle, topLeftStyle, size, bottom);
 
- 				sc.paintLeft(c, x, y, w, h, rectStyle, topLeftStyle, size, top);
 
- 				sc.lineNWInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, top, left);
 
- 				sc.paintLeftInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom, left);
 
- 				c.close();
 
- 				c.fillAndStroke();
 
- 				
 
- 				c.begin();
 
- 				sc.moveNE(c, x, y, w, h, rectStyle, topRightStyle, size, top);
 
- 				sc.paintRight(c, x, y, w, h, rectStyle, bottomRightStyle, size, bottom);
 
- 				sc.lineSEInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, bottom);
 
- 				sc.paintRightInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, top, right);
 
- 				c.close();
 
- 				c.fillAndStroke();
 
- 			}
 
- 		}
 
- 		else if (!top && right && bottom && !left)
 
- 		{
 
- 			if (rectOutline != 'frame')
 
- 			{
 
- 				c.begin();
 
- 				sc.moveNE(c, x, y, w, h, rectStyle, topRightStyle, size, top);
 
- 				sc.paintRight(c, x, y, w, h, rectStyle, bottomRightStyle, size, bottom);
 
- 				sc.paintSE(c, x, y, w, h, rectStyle, bottomRightStyle, size, right);
 
- 				sc.paintBottom(c, x, y, w, h, rectStyle, bottomLeftStyle, size, left);
 
- 				if (rectOutline == 'double')
 
- 				{
 
- 					sc.moveSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, left);
 
- 					sc.paintBottomInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, right, bottom);
 
- 					sc.paintSEInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent);
 
- 					sc.paintRightInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, top, right);
 
- 				}
 
- 				
 
- 				c.stroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				c.begin();
 
- 				sc.moveNE(c, x, y, w, h, rectStyle, topRightStyle, size, top);
 
- 				sc.paintRight(c, x, y, w, h, rectStyle, bottomRightStyle, size, bottom);
 
- 				sc.paintSE(c, x, y, w, h, rectStyle, bottomRightStyle, size, right);
 
- 				sc.paintBottom(c, x, y, w, h, rectStyle, bottomLeftStyle, size, left);
 
- 				sc.lineSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, left);
 
- 				sc.paintBottomInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, right, bottom);
 
- 				sc.paintSEInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent);
 
- 				sc.paintRightInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, top, right);
 
- 				c.close();
 
- 				c.fillAndStroke();
 
- 			}
 
- 		}
 
- 		else if (!top && right && bottom && left)
 
- 		{
 
- 			if (rectOutline != 'frame')
 
- 			{
 
- 				c.begin();
 
- 				sc.moveNE(c, x, y, w, h, rectStyle, topRightStyle, size, top);
 
- 				sc.paintRight(c, x, y, w, h, rectStyle, bottomRightStyle, size, bottom);
 
- 				sc.paintSE(c, x, y, w, h, rectStyle, bottomRightStyle, size, right);
 
- 				sc.paintBottom(c, x, y, w, h, rectStyle, bottomLeftStyle, size, left);
 
- 				sc.paintSW(c, x, y, w, h, rectStyle, bottomLeftStyle, size, bottom);
 
- 				sc.paintLeft(c, x, y, w, h, rectStyle, topLeftStyle, size, top);
 
- 		
 
- 				if (rectOutline == 'double')
 
- 				{
 
- 					sc.moveNWInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, top, left);
 
- 					sc.paintLeftInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom, left);
 
- 					sc.paintSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom);
 
- 					sc.paintBottomInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, right, bottom);
 
- 					sc.paintSEInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent);
 
- 					sc.paintRightInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, top, right);
 
- 				}
 
- 				
 
- 				c.stroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				c.begin();
 
- 				sc.moveNE(c, x, y, w, h, rectStyle, topRightStyle, size, top);
 
- 				sc.paintRight(c, x, y, w, h, rectStyle, bottomRightStyle, size, bottom);
 
- 				sc.paintSE(c, x, y, w, h, rectStyle, bottomRightStyle, size, right);
 
- 				sc.paintBottom(c, x, y, w, h, rectStyle, bottomLeftStyle, size, left);
 
- 				sc.paintSW(c, x, y, w, h, rectStyle, bottomLeftStyle, size, bottom);
 
- 				sc.paintLeft(c, x, y, w, h, rectStyle, topLeftStyle, size, top);
 
- 				sc.lineNWInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, top, left);
 
- 				sc.paintLeftInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom, left);
 
- 				sc.paintSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom);
 
- 				sc.paintBottomInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, right, bottom);
 
- 				sc.paintSEInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent);
 
- 				sc.paintRightInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, top, right);
 
- 				c.close();
 
- 				c.fillAndStroke();
 
- 			}
 
- 		}
 
- 		else if (top && !right && !bottom && !left)
 
- 		{
 
- 			if (rectOutline != 'frame')
 
- 			{
 
- 				c.begin();
 
- 				sc.moveNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 				sc.paintTop(c, x, y, w, h, rectStyle, topRightStyle, size, right);
 
- 		
 
- 				if (rectOutline == 'double')
 
- 				{
 
- 					sc.moveNEInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, right);
 
- 					sc.paintTopInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, left, top);
 
- 				}
 
- 				
 
- 				c.stroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				c.begin();
 
- 				sc.moveNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 				sc.paintTop(c, x, y, w, h, rectStyle, topRightStyle, size, right);
 
- 				sc.lineNEInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, right);
 
- 				sc.paintTopInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, left, top);
 
- 				c.close();
 
- 				c.fillAndStroke();
 
- 			}
 
- 		}
 
- 		else if (top && !right && !bottom && left)
 
- 		{
 
- 			if (rectOutline != 'frame')
 
- 			{
 
- 				c.begin();
 
- 				sc.moveSW(c, x, y, w, h, rectStyle, bottomLeftStyle, size, bottom);
 
- 				sc.paintLeft(c, x, y, w, h, rectStyle, topLeftStyle, size, top);
 
- 				sc.paintNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 				sc.paintTop(c, x, y, w, h, rectStyle, topRightStyle, size, right);
 
- 		
 
- 				if (rectOutline == 'double')
 
- 				{
 
- 					sc.moveNEInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, right);
 
- 					sc.paintTopInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, left, top);
 
- 					sc.paintNWInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent);
 
- 					sc.paintLeftInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom, left);
 
- 				}
 
- 				
 
- 				c.stroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				c.begin();
 
- 				sc.moveSW(c, x, y, w, h, rectStyle, bottomLeftStyle, size, bottom);
 
- 				sc.paintLeft(c, x, y, w, h, rectStyle, topLeftStyle, size, top);
 
- 				sc.paintNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 				sc.paintTop(c, x, y, w, h, rectStyle, topRightStyle, size, right);
 
- 				sc.lineNEInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, right);
 
- 				sc.paintTopInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, left, top);
 
- 				sc.paintNWInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent);
 
- 				sc.paintLeftInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom, left);
 
- 				c.close();
 
- 				c.fillAndStroke();
 
- 			}
 
- 		}
 
- 		else if (top && !right && bottom && !left)
 
- 		{
 
- 			if (rectOutline != 'frame')
 
- 			{
 
- 				c.begin();
 
- 				sc.moveNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 				sc.paintTop(c, x, y, w, h, rectStyle, topRightStyle, size, right);
 
- 		
 
- 				if (rectOutline == 'double')
 
- 				{
 
- 					sc.moveNEInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, right);
 
- 					sc.paintTopInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, left, top);
 
- 				}
 
- 				
 
- 				c.stroke();
 
- 		
 
- 				c.begin();
 
- 				sc.moveSE(c, x, y, w, h, rectStyle, bottomRightStyle, size, right);
 
- 				sc.paintBottom(c, x, y, w, h, rectStyle, bottomLeftStyle, size, left);
 
- 		
 
- 				if (rectOutline == 'double')
 
- 				{
 
- 					sc.moveSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, left);
 
- 					sc.paintBottomInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, right, bottom);
 
- 				}
 
- 				
 
- 				c.stroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				c.begin();
 
- 				sc.moveNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 				sc.paintTop(c, x, y, w, h, rectStyle, topRightStyle, size, right);
 
- 				sc.lineNEInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, right);
 
- 				sc.paintTopInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, left, top);
 
- 				c.close();
 
- 				c.fillAndStroke();
 
- 		
 
- 				c.begin();
 
- 				sc.moveSE(c, x, y, w, h, rectStyle, bottomRightStyle, size, right);
 
- 				sc.paintBottom(c, x, y, w, h, rectStyle, bottomLeftStyle, size, left);
 
- 				sc.lineSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, left);
 
- 				sc.paintBottomInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, right, bottom);
 
- 				c.close();
 
- 				c.fillAndStroke();
 
- 			}
 
- 		}
 
- 		else if (top && !right && bottom && left)
 
- 		{
 
- 			if (rectOutline != 'frame')
 
- 			{
 
- 				c.begin();
 
- 				sc.moveSE(c, x, y, w, h, rectStyle, bottomRightStyle, size, right);
 
- 				sc.paintBottom(c, x, y, w, h, rectStyle, bottomLeftStyle, size, left);
 
- 				sc.paintSW(c, x, y, w, h, rectStyle, bottomLeftStyle, size, bottom);
 
- 				sc.paintLeft(c, x, y, w, h, rectStyle, topLeftStyle, size, top);
 
- 				sc.paintNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 				sc.paintTop(c, x, y, w, h, rectStyle, topRightStyle, size, right);
 
- 		
 
- 				if (rectOutline == 'double')
 
- 				{
 
- 					sc.moveNEInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, right);
 
- 					sc.paintTopInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, left, top);
 
- 					sc.paintNWInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent);
 
- 					sc.paintLeftInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom, left);
 
- 					sc.paintSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom);
 
- 					sc.paintBottomInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, right, bottom);
 
- 				}
 
- 				
 
- 				c.stroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				c.begin();
 
- 				sc.moveSE(c, x, y, w, h, rectStyle, bottomRightStyle, size, right);
 
- 				sc.paintBottom(c, x, y, w, h, rectStyle, bottomLeftStyle, size, left);
 
- 				sc.paintSW(c, x, y, w, h, rectStyle, bottomLeftStyle, size, bottom);
 
- 				sc.paintLeft(c, x, y, w, h, rectStyle, topLeftStyle, size, top);
 
- 				sc.paintNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 				sc.paintTop(c, x, y, w, h, rectStyle, topRightStyle, size, right);
 
- 				sc.lineNEInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, right);
 
- 				sc.paintTopInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, left, top);
 
- 				sc.paintNWInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent);
 
- 				sc.paintLeftInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom, left);
 
- 				sc.paintSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom);
 
- 				sc.paintBottomInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, right, bottom);
 
- 				c.close();
 
- 				c.fillAndStroke();
 
- 			}
 
- 		}
 
- 		else if (top && right && !bottom && !left)
 
- 		{
 
- 			if (rectOutline != 'frame')
 
- 			{
 
- 				c.begin();
 
- 				sc.moveNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 				sc.paintTop(c, x, y, w, h, rectStyle, topRightStyle, size, right);
 
- 				sc.paintNE(c, x, y, w, h, rectStyle, topRightStyle, size, top);
 
- 				sc.paintRight(c, x, y, w, h, rectStyle, bottomRightStyle, size, bottom);
 
- 		
 
- 				if (rectOutline == 'double')
 
- 				{
 
- 					sc.moveSEInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, bottom);
 
- 					sc.paintRightInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, top, right);
 
- 					sc.paintNEInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent);
 
- 					sc.paintTopInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, left, top);
 
- 				}
 
- 				
 
- 				c.stroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				c.begin();
 
- 				sc.moveNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 				sc.paintTop(c, x, y, w, h, rectStyle, topRightStyle, size, right);
 
- 				sc.paintNE(c, x, y, w, h, rectStyle, topRightStyle, size, top);
 
- 				sc.paintRight(c, x, y, w, h, rectStyle, bottomRightStyle, size, bottom);
 
- 				sc.lineSEInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, bottom);
 
- 				sc.paintRightInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, top, right);
 
- 				sc.paintNEInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent);
 
- 				sc.paintTopInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, left, top);
 
- 				c.close();
 
- 				c.fillAndStroke();
 
- 			}
 
- 		}
 
- 		else if (top && right && !bottom && left)
 
- 		{
 
- 			if (rectOutline != 'frame')
 
- 			{
 
- 				c.begin();
 
- 				sc.moveSW(c, x, y, w, h, rectStyle, bottomLeftStyle, size, bottom);
 
- 				sc.paintLeft(c, x, y, w, h, rectStyle, topLeftStyle, size, top);
 
- 				sc.paintNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 				sc.paintTop(c, x, y, w, h, rectStyle, topRightStyle, size, right);
 
- 				sc.paintNE(c, x, y, w, h, rectStyle, topRightStyle, size, top);
 
- 				sc.paintRight(c, x, y, w, h, rectStyle, bottomRightStyle, size, bottom);
 
- 		
 
- 				if (rectOutline == 'double')
 
- 				{
 
- 					sc.moveSEInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, bottom);
 
- 					sc.paintRightInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, top, right);
 
- 					sc.paintNEInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent);
 
- 					sc.paintTopInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, left, top);
 
- 					sc.paintNWInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent);
 
- 					sc.paintLeftInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom, left);
 
- 				}
 
- 				
 
- 				c.stroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				c.begin();
 
- 				sc.moveSW(c, x, y, w, h, rectStyle, bottomLeftStyle, size, bottom);
 
- 				sc.paintLeft(c, x, y, w, h, rectStyle, topLeftStyle, size, top);
 
- 				sc.paintNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 				sc.paintTop(c, x, y, w, h, rectStyle, topRightStyle, size, right);
 
- 				sc.paintNE(c, x, y, w, h, rectStyle, topRightStyle, size, top);
 
- 				sc.paintRight(c, x, y, w, h, rectStyle, bottomRightStyle, size, bottom);
 
- 				sc.lineSEInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, bottom);
 
- 				sc.paintRightInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, top, right);
 
- 				sc.paintNEInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent);
 
- 				sc.paintTopInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, left, top);
 
- 				sc.paintNWInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent);
 
- 				sc.paintLeftInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom, left);
 
- 				c.close();
 
- 				c.fillAndStroke();
 
- 			}
 
- 		}
 
- 		else if (top && right && bottom && !left)
 
- 		{
 
- 			if (rectOutline != 'frame')
 
- 			{
 
- 				c.begin();
 
- 				sc.moveNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 				sc.paintTop(c, x, y, w, h, rectStyle, topRightStyle, size, right);
 
- 				sc.paintNE(c, x, y, w, h, rectStyle, topRightStyle, size, top);
 
- 				sc.paintRight(c, x, y, w, h, rectStyle, bottomRightStyle, size, bottom);
 
- 				sc.paintSE(c, x, y, w, h, rectStyle, bottomRightStyle, size, right);
 
- 				sc.paintBottom(c, x, y, w, h, rectStyle, bottomLeftStyle, size, left);
 
- 		
 
- 				if (rectOutline == 'double')
 
- 				{
 
- 					sc.moveSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, left);
 
- 					sc.paintBottomInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, right, bottom);
 
- 					sc.paintSEInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent);
 
- 					sc.paintRightInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, top, right);
 
- 					sc.paintNEInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent);
 
- 					sc.paintTopInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, left, top);
 
- 				}
 
- 				
 
- 				c.stroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				c.begin();
 
- 				sc.moveNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 				sc.paintTop(c, x, y, w, h, rectStyle, topRightStyle, size, right);
 
- 				sc.paintNE(c, x, y, w, h, rectStyle, topRightStyle, size, top);
 
- 				sc.paintRight(c, x, y, w, h, rectStyle, bottomRightStyle, size, bottom);
 
- 				sc.paintSE(c, x, y, w, h, rectStyle, bottomRightStyle, size, right);
 
- 				sc.paintBottom(c, x, y, w, h, rectStyle, bottomLeftStyle, size, left);
 
- 				sc.lineSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, left);
 
- 				sc.paintBottomInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, right, bottom);
 
- 				sc.paintSEInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent);
 
- 				sc.paintRightInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, top, right);
 
- 				sc.paintNEInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent);
 
- 				sc.paintTopInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, left, top);
 
- 				c.close();
 
- 				c.fillAndStroke();
 
- 			}
 
- 		}
 
- 		else if (top && right && bottom && left)
 
- 		{
 
- 			if (rectOutline != 'frame')
 
- 			{
 
- 				c.begin();
 
- 				sc.moveNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 				sc.paintNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 				sc.paintTop(c, x, y, w, h, rectStyle, topRightStyle, size, right);
 
- 				sc.paintNE(c, x, y, w, h, rectStyle, topRightStyle, size, top);
 
- 				sc.paintRight(c, x, y, w, h, rectStyle, bottomRightStyle, size, bottom);
 
- 				sc.paintSE(c, x, y, w, h, rectStyle, bottomRightStyle, size, right);
 
- 				sc.paintBottom(c, x, y, w, h, rectStyle, bottomLeftStyle, size, left);
 
- 				sc.paintSW(c, x, y, w, h, rectStyle, bottomLeftStyle, size, bottom);
 
- 				sc.paintLeft(c, x, y, w, h, rectStyle, topLeftStyle, size, top);
 
- 				c.close();
 
- 				
 
- 				if (rectOutline == 'double')
 
- 				{
 
- 					sc.moveSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, left);
 
- 					sc.paintSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom);
 
- 					sc.paintBottomInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, right, bottom);
 
- 					sc.paintSEInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent);
 
- 					sc.paintRightInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, top, right);
 
- 					sc.paintNEInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent);
 
- 					sc.paintTopInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, left, top);
 
- 					sc.paintNWInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent);
 
- 					sc.paintLeftInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom, left);
 
- 					c.close();
 
- 				}
 
- 				
 
- 				c.stroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				c.begin();
 
- 				sc.moveNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 				sc.paintNW(c, x, y, w, h, rectStyle, topLeftStyle, size, left);
 
- 				sc.paintTop(c, x, y, w, h, rectStyle, topRightStyle, size, right);
 
- 				sc.paintNE(c, x, y, w, h, rectStyle, topRightStyle, size, top);
 
- 				sc.paintRight(c, x, y, w, h, rectStyle, bottomRightStyle, size, bottom);
 
- 				sc.paintSE(c, x, y, w, h, rectStyle, bottomRightStyle, size, right);
 
- 				sc.paintBottom(c, x, y, w, h, rectStyle, bottomLeftStyle, size, left);
 
- 				sc.paintSW(c, x, y, w, h, rectStyle, bottomLeftStyle, size, bottom);
 
- 				sc.paintLeft(c, x, y, w, h, rectStyle, topLeftStyle, size, top);
 
- 				c.close();
 
- 				sc.moveSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, left);
 
- 				sc.paintSWInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom);
 
- 				sc.paintBottomInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, right, bottom);
 
- 				sc.paintSEInner(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent);
 
- 				sc.paintRightInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent, top, right);
 
- 				sc.paintNEInner(c, x, y, w, h, rectStyle, topRightStyle, size, indent);
 
- 				sc.paintTopInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, left, top);
 
- 				sc.paintNWInner(c, x, y, w, h, rectStyle, topLeftStyle, size, indent);
 
- 				sc.paintLeftInner(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom, left);
 
- 				c.close();
 
- 				c.fillAndStroke();
 
- 			}
 
- 		}
 
- 		c.begin();
 
- 		sc.paintFolds(c, x, y, w, h, rectStyle, topLeftStyle, topRightStyle, bottomRightStyle, bottomLeftStyle, size, top, right, bottom, left);
 
- 		c.stroke();
 
- 	};
 
- 	mxShapeBasicRect2.prototype.moveNW = function(c, x, y, w, h, rectStyle, topLeftStyle, size, left)
 
- 	{
 
- 		if((topLeftStyle == 'square' || (topLeftStyle == 'default' && rectStyle == 'square' )) || !left)
 
- 		{
 
- 			c.moveTo(0, 0);
 
- 		}
 
- 		else
 
- 		{
 
- 			c.moveTo(0, size);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.moveNE = function(c, x, y, w, h, rectStyle, topRightStyle, size, top)
 
- 	{
 
- 		if((topRightStyle == 'square' || (topRightStyle == 'default' && rectStyle == 'square' )) || !top)
 
- 		{
 
- 			c.moveTo(w, 0);
 
- 		}
 
- 		else
 
- 		{
 
- 			c.moveTo(w - size, 0);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.moveSE = function(c, x, y, w, h, rectStyle, bottomRightStyle, size, right)
 
- 	{
 
- 		if((bottomRightStyle == 'square' || (bottomRightStyle == 'default' && rectStyle == 'square' )) || !right)
 
- 		{
 
- 			c.moveTo(w, h);
 
- 		}
 
- 		else
 
- 		{
 
- 			c.moveTo(w, h - size);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.moveSW = function(c, x, y, w, h, rectStyle, bottomLeftStyle, size, bottom)
 
- 	{
 
- 		if((bottomLeftStyle == 'square' || (bottomLeftStyle == 'default' && rectStyle == 'square' )) || !bottom)
 
- 		{
 
- 			c.moveTo(0, h);
 
- 		}
 
- 		else
 
- 		{
 
- 			c.moveTo(size, h);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.paintNW = function(c, x, y, w, h, rectStyle, topLeftStyle, size, left)
 
- 	{
 
- 		if (!left)
 
- 		{
 
- 			c.lineTo(0, 0);
 
- 		}
 
- 		else if((topLeftStyle == 'rounded' || (topLeftStyle == 'default' && rectStyle == 'rounded' )) ||
 
- 				(topLeftStyle == 'invRound' || (topLeftStyle == 'default' && rectStyle == 'invRound' )) )
 
- 		{
 
- 			var inv = 0;
 
- 			
 
- 			if (topLeftStyle == 'rounded' || (topLeftStyle == 'default' && rectStyle == 'rounded' ))
 
- 			{
 
- 				inv = 1;
 
- 			}
 
- 			
 
- 			c.arcTo(size, size, 0, 0, inv, size, 0);
 
- 		}
 
- 		else if((topLeftStyle == 'snip' || (topLeftStyle == 'default' && rectStyle == 'snip' )) ||
 
- 				(topLeftStyle == 'fold' || (topLeftStyle == 'default' && rectStyle == 'fold' )))
 
- 		{
 
- 			c.lineTo(size, 0);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.paintTop = function(c, x, y, w, h, rectStyle, topRightStyle, size, right)
 
- 	{
 
- 		if((topRightStyle == 'square' || (topRightStyle == 'default' && rectStyle == 'square' )) || !right)
 
- 		{
 
- 			c.lineTo(w, 0);
 
- 		}
 
- 		else
 
- 		{
 
- 			c.lineTo(w - size, 0);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.paintNE = function(c, x, y, w, h, rectStyle, topRightStyle, size, top)
 
- 	{
 
- 		if (!top)
 
- 		{
 
- 			c.lineTo(w, 0);
 
- 		}
 
- 		else if((topRightStyle == 'rounded' || (topRightStyle == 'default' && rectStyle == 'rounded' )) ||
 
- 				(topRightStyle == 'invRound' || (topRightStyle == 'default' && rectStyle == 'invRound' )) )
 
- 		{
 
- 			var inv = 0;
 
- 			
 
- 			if (topRightStyle == 'rounded' || (topRightStyle == 'default' && rectStyle == 'rounded' ))
 
- 			{
 
- 				inv = 1;
 
- 			}
 
- 			
 
- 			c.arcTo(size, size, 0, 0, inv, w, size);
 
- 		}
 
- 		else if((topRightStyle == 'snip' || (topRightStyle == 'default' && rectStyle == 'snip' )) ||
 
- 				(topRightStyle == 'fold' || (topRightStyle == 'default' && rectStyle == 'fold' )))
 
- 		{
 
- 			c.lineTo(w, size);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.paintRight = function(c, x, y, w, h, rectStyle, bottomRightStyle, size, bottom)
 
- 	{
 
- 		if((bottomRightStyle == 'square' || (bottomRightStyle == 'default' && rectStyle == 'square' )) || !bottom)
 
- 		{
 
- 			c.lineTo(w, h);
 
- 		}
 
- 		else
 
- 		{
 
- 			c.lineTo(w, h - size);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.paintLeft = function(c, x, y, w, h, rectStyle, topLeftStyle, size, top)
 
- 	{
 
- 		if((topLeftStyle == 'square' || (topLeftStyle == 'default' && rectStyle == 'square' )) || !top)
 
- 		{
 
- 			c.lineTo(0, 0);
 
- 		}
 
- 		else
 
- 		{
 
- 			c.lineTo(0, size);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.paintSE = function(c, x, y, w, h, rectStyle, bottomRightStyle, size, right)
 
- 	{
 
- 		if (!right)
 
- 		{
 
- 			c.lineTo(w, h);
 
- 		}
 
- 		else if((bottomRightStyle == 'rounded' || (bottomRightStyle == 'default' && rectStyle == 'rounded' )) ||
 
- 				(bottomRightStyle == 'invRound' || (bottomRightStyle == 'default' && rectStyle == 'invRound' )) )
 
- 		{
 
- 			var inv = 0;
 
- 			
 
- 			if (bottomRightStyle == 'rounded' || (bottomRightStyle == 'default' && rectStyle == 'rounded' ))
 
- 			{
 
- 				inv = 1;
 
- 			}
 
- 			
 
- 			c.arcTo(size, size, 0, 0, inv, w - size, h);
 
- 		}
 
- 		else if((bottomRightStyle == 'snip' || (bottomRightStyle == 'default' && rectStyle == 'snip' )) ||
 
- 				(bottomRightStyle == 'fold' || (bottomRightStyle == 'default' && rectStyle == 'fold' )))
 
- 		{
 
- 			c.lineTo(w - size, h);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.paintBottom = function(c, x, y, w, h, rectStyle, bottomLeftStyle, size, left)
 
- 	{
 
- 		if((bottomLeftStyle == 'square' || (bottomLeftStyle == 'default' && rectStyle == 'square' )) || !left)
 
- 		{
 
- 			c.lineTo(0, h);
 
- 		}
 
- 		else
 
- 		{
 
- 			c.lineTo(size, h);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.paintSW = function(c, x, y, w, h, rectStyle, bottomLeftStyle, size, bottom)
 
- 	{
 
- 		if (!bottom)
 
- 		{
 
- 			c.lineTo(0, h);
 
- 		}
 
- 		else if((bottomLeftStyle == 'rounded' || (bottomLeftStyle == 'default' && rectStyle == 'rounded' )) ||
 
- 				(bottomLeftStyle == 'invRound' || (bottomLeftStyle == 'default' && rectStyle == 'invRound' )) )
 
- 		{
 
- 			var inv = 0;
 
- 			
 
- 			if (bottomLeftStyle == 'rounded' || (bottomLeftStyle == 'default' && rectStyle == 'rounded' ))
 
- 			{
 
- 				inv = 1;
 
- 			}
 
- 			
 
- 			c.arcTo(size, size, 0, 0, inv, 0, h - size);
 
- 		}
 
- 		else if((bottomLeftStyle == 'snip' || (bottomLeftStyle == 'default' && rectStyle == 'snip' )) ||
 
- 				(bottomLeftStyle == 'fold' || (bottomLeftStyle == 'default' && rectStyle == 'fold' )))
 
- 		{
 
- 			c.lineTo(0, h - size);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.paintNWInner = function(c, x, y, w, h, rectStyle, topLeftStyle, size, indent)
 
- 	{
 
- 		if(topLeftStyle == 'rounded' || (topLeftStyle == 'default' && rectStyle == 'rounded' ))
 
- 		{
 
- 			c.arcTo(size - indent * 0.5, size - indent * 0.5, 0, 0, 0, indent, indent * 0.5 + size);
 
- 		}
 
- 		else if(topLeftStyle == 'invRound' || (topLeftStyle == 'default' && rectStyle == 'invRound' ))
 
- 		{
 
- 			c.arcTo(size + indent, size + indent, 0, 0, 1, indent, indent + size);
 
- 		}
 
- 		else if(topLeftStyle == 'snip' || (topLeftStyle == 'default' && rectStyle == 'snip' ))
 
- 		{
 
- 			c.lineTo(indent, indent * 0.5 + size);
 
- 		}
 
- 		else if(topLeftStyle == 'fold' || (topLeftStyle == 'default' && rectStyle == 'fold' ))
 
- 		{
 
- 			c.lineTo(indent + size, indent + size);
 
- 			c.lineTo(indent, indent + size);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.paintTopInner = function(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, left, top)
 
- 	{
 
- 		if (!left && !top)
 
- 		{
 
- 			c.lineTo(0, 0);
 
- 		}
 
- 		else if (!left && top)
 
- 		{
 
- 			c.lineTo(0, indent);
 
- 		}
 
- 		else if (left && !top)
 
- 		{
 
- 			c.lineTo(indent, 0);
 
- 		}
 
- 		else if (!left)
 
- 		{
 
- 			c.lineTo(0, indent);
 
- 		}
 
- 		else if(topLeftStyle == 'square' || (topLeftStyle == 'default' && rectStyle == 'square' ))
 
- 		{
 
- 			c.lineTo(indent, indent);
 
- 		}
 
- 		else if((topLeftStyle == 'rounded' || (topLeftStyle == 'default' && rectStyle == 'rounded' )) ||
 
- 				(topLeftStyle == 'snip' || (topLeftStyle == 'default' && rectStyle == 'snip' )))
 
- 		{
 
- 			c.lineTo(size + indent * 0.5, indent);
 
- 		}
 
- 		else
 
- 		{
 
- 			c.lineTo(size + indent, indent);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.paintNEInner = function(c, x, y, w, h, rectStyle, topRightStyle, size, indent)
 
- 	{
 
- 		if(topRightStyle == 'rounded' || (topRightStyle == 'default' && rectStyle == 'rounded' ))
 
- 		{
 
- 			c.arcTo(size - indent * 0.5, size - indent * 0.5, 0, 0, 0, w - size - indent * 0.5, indent);
 
- 		}
 
- 		else if(topRightStyle == 'invRound' || (topRightStyle == 'default' && rectStyle == 'invRound' ))
 
- 		{
 
- 			c.arcTo(size + indent, size + indent, 0, 0, 1, w - size - indent, indent);
 
- 		}
 
- 		else if(topRightStyle == 'snip' || (topRightStyle == 'default' && rectStyle == 'snip' ))
 
- 		{
 
- 			c.lineTo(w - size - indent * 0.5, indent);
 
- 		}
 
- 		else if(topRightStyle == 'fold' || (topRightStyle == 'default' && rectStyle == 'fold' ))
 
- 		{
 
- 			c.lineTo(w - size - indent, size + indent);
 
- 			c.lineTo(w - size - indent, indent);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.paintRightInner = function(c, x, y, w, h, rectStyle, topRightStyle, size, indent, top, right)
 
- 	{
 
- 		if (!top && !right)
 
- 		{
 
- 			c.lineTo(w, 0);
 
- 		}
 
- 		else if (!top && right)
 
- 		{
 
- 			c.lineTo(w - indent, 0);
 
- 		}
 
- 		else if (top && !right)
 
- 		{
 
- 			c.lineTo(w, indent);
 
- 		}
 
- 		else if (!top)
 
- 		{
 
- 			c.lineTo(w - indent, 0);
 
- 		}
 
- 		else if(topRightStyle == 'square' || (topRightStyle == 'default' && rectStyle == 'square' ))
 
- 		{
 
- 			c.lineTo(w - indent, indent);
 
- 		}
 
- 		else if((topRightStyle == 'rounded' || (topRightStyle == 'default' && rectStyle == 'rounded' )) ||
 
- 				(topRightStyle == 'snip' || (topRightStyle == 'default' && rectStyle == 'snip' )))
 
- 		{
 
- 			c.lineTo(w - indent, size + indent * 0.5);
 
- 		}
 
- 		else
 
- 		{
 
- 			c.lineTo(w - indent, size + indent);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.paintLeftInner = function(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom, left)
 
- 	{
 
- 		if (!bottom && !left)
 
- 		{
 
- 			c.lineTo(0, h);
 
- 		}
 
- 		else if (!bottom && left)
 
- 		{
 
- 			c.lineTo(indent, h);
 
- 		}
 
- 		else if (bottom && !left)
 
- 		{
 
- 			c.lineTo(0, h - indent);
 
- 		}
 
- 		else if (!bottom)
 
- 		{
 
- 			c.lineTo(indent, h);
 
- 		}
 
- 		else if(bottomLeftStyle == 'square' || (bottomLeftStyle == 'default' && rectStyle == 'square' ))
 
- 		{
 
- 			c.lineTo(indent, h - indent);
 
- 		}
 
- 		else if((bottomLeftStyle == 'rounded' || (bottomLeftStyle == 'default' && rectStyle == 'rounded' )) ||
 
- 				(bottomLeftStyle == 'snip' || (bottomLeftStyle == 'default' && rectStyle == 'snip' )))
 
- 		{
 
- 			c.lineTo(indent, h - size - indent * 0.5);
 
- 		}
 
- 		else
 
- 		{
 
- 			c.lineTo(indent, h - size - indent);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.paintSEInner = function(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent)
 
- 	{
 
- 		if(bottomRightStyle == 'rounded' || (bottomRightStyle == 'default' && rectStyle == 'rounded' ))
 
- 		{
 
- 			c.arcTo(size - indent * 0.5, size - indent * 0.5, 0, 0, 0, w - indent, h - size - indent * 0.5);
 
- 		}
 
- 		else if(bottomRightStyle == 'invRound' || (bottomRightStyle == 'default' && rectStyle == 'invRound' ))
 
- 		{
 
- 			c.arcTo(size + indent, size + indent, 0, 0, 1, w - indent, h - size - indent);
 
- 		}
 
- 		else if(bottomRightStyle == 'snip' || (bottomRightStyle == 'default' && rectStyle == 'snip' ))
 
- 		{
 
- 			c.lineTo(w - indent, h - size - indent * 0.5);
 
- 		}
 
- 		else if(bottomRightStyle == 'fold' || (bottomRightStyle == 'default' && rectStyle == 'fold' ))
 
- 		{
 
- 			c.lineTo(w - size - indent, h - size - indent);
 
- 			c.lineTo(w - indent, h - size - indent);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.paintBottomInner = function(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, right, bottom)
 
- 	{
 
- 		if (!right && !bottom)
 
- 		{
 
- 			c.lineTo(w, h);
 
- 		}
 
- 		else if (!right && bottom)
 
- 		{
 
- 			c.lineTo(w, h - indent);
 
- 		}
 
- 		else if (right && !bottom)
 
- 		{
 
- 			c.lineTo(w - indent, h);
 
- 		}
 
- 		else if((bottomRightStyle == 'square' || (bottomRightStyle == 'default' && rectStyle == 'square' )) || !right)
 
- 		{
 
- 			c.lineTo(w - indent, h - indent);
 
- 		}
 
- 		else if((bottomRightStyle == 'rounded' || (bottomRightStyle == 'default' && rectStyle == 'rounded' )) ||
 
- 				(bottomRightStyle == 'snip' || (bottomRightStyle == 'default' && rectStyle == 'snip' )))
 
- 		{
 
- 			c.lineTo(w - size - indent * 0.5, h - indent);
 
- 		}
 
- 		else
 
- 		{
 
- 			c.lineTo(w - size - indent, h - indent);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.paintSWInner = function(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, bottom)
 
- 	{
 
- 		if (!bottom)
 
- 		{
 
- 			c.lineTo(indent, h);
 
- 		}
 
- 		else if(bottomLeftStyle == 'square' || (bottomLeftStyle == 'default' && rectStyle == 'square' ))
 
- 		{
 
- 			c.lineTo(indent, h - indent);
 
- 		}
 
- 		else if(bottomLeftStyle == 'rounded' || (bottomLeftStyle == 'default' && rectStyle == 'rounded' ))
 
- 		{
 
- 			c.arcTo(size - indent * 0.5, size - indent * 0.5, 0, 0, 0, size + indent * 0.5, h - indent);
 
- 		}
 
- 		else if(bottomLeftStyle == 'invRound' || (bottomLeftStyle == 'default' && rectStyle == 'invRound' ))
 
- 		{
 
- 			c.arcTo(size + indent, size + indent, 0, 0, 1, size + indent, h - indent);
 
- 		}
 
- 		else if(bottomLeftStyle == 'snip' || (bottomLeftStyle == 'default' && rectStyle == 'snip' ))
 
- 		{
 
- 			c.lineTo(size + indent * 0.5, h - indent);
 
- 		}
 
- 		else if(bottomLeftStyle == 'fold' || (bottomLeftStyle == 'default' && rectStyle == 'fold' ))
 
- 		{
 
- 			c.lineTo(indent + size, h - size - indent);
 
- 			c.lineTo(indent + size, h - indent);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.moveSWInner = function(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, left)
 
- 	{
 
- 		if (!left)
 
- 		{
 
- 			c.moveTo(0, h - indent);
 
- 		}
 
- 		else if(bottomLeftStyle == 'square' || (bottomLeftStyle == 'default' && rectStyle == 'square' ))
 
- 		{
 
- 			c.moveTo(indent, h - indent);
 
- 		}
 
- 		else if((bottomLeftStyle == 'rounded' || (bottomLeftStyle == 'default' && rectStyle == 'rounded' )) ||
 
- 				(bottomLeftStyle == 'snip' || (bottomLeftStyle == 'default' && rectStyle == 'snip' )))
 
- 		{
 
- 			c.moveTo(indent, h - size - indent * 0.5);
 
- 		}
 
- 		else if((bottomLeftStyle == 'invRound' || (bottomLeftStyle == 'default' && rectStyle == 'invRound' )) ||
 
- 				(bottomLeftStyle == 'fold' || (bottomLeftStyle == 'default' && rectStyle == 'fold' )))
 
- 		{
 
- 			c.moveTo(indent, h - size - indent);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.lineSWInner = function(c, x, y, w, h, rectStyle, bottomLeftStyle, size, indent, left)
 
- 	{
 
- 		if (!left)
 
- 		{
 
- 			c.lineTo(0, h - indent);
 
- 		}
 
- 		else if(bottomLeftStyle == 'square' || (bottomLeftStyle == 'default' && rectStyle == 'square' ))
 
- 		{
 
- 			c.lineTo(indent, h - indent);
 
- 		}
 
- 		else if((bottomLeftStyle == 'rounded' || (bottomLeftStyle == 'default' && rectStyle == 'rounded' )) ||
 
- 				(bottomLeftStyle == 'snip' || (bottomLeftStyle == 'default' && rectStyle == 'snip' )))
 
- 		{
 
- 			c.lineTo(indent, h - size - indent * 0.5);
 
- 		}
 
- 		else if((bottomLeftStyle == 'invRound' || (bottomLeftStyle == 'default' && rectStyle == 'invRound' )) ||
 
- 				(bottomLeftStyle == 'fold' || (bottomLeftStyle == 'default' && rectStyle == 'fold' )))
 
- 		{
 
- 				c.lineTo(indent, h - size - indent);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.moveSEInner = function(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, bottom)
 
- 	{
 
- 		if (!bottom)
 
- 		{
 
- 			c.moveTo(w - indent, h);
 
- 		}
 
- 		else if(bottomRightStyle == 'square' || (bottomRightStyle == 'default' && rectStyle == 'square' ))
 
- 		{
 
- 			c.moveTo(w - indent, h - indent);
 
- 		}
 
- 		else if((bottomRightStyle == 'rounded' || (bottomRightStyle == 'default' && rectStyle == 'rounded' )) ||
 
- 				(bottomRightStyle == 'snip' || (bottomRightStyle == 'default' && rectStyle == 'snip' )))
 
- 		{
 
- 			c.moveTo(w - indent, h - size - indent * 0.5);
 
- 		}
 
- 		else if((bottomRightStyle == 'invRound' || (bottomRightStyle == 'default' && rectStyle == 'invRound' )) ||
 
- 				(bottomRightStyle == 'fold' || (bottomRightStyle == 'default' && rectStyle == 'fold' )))
 
- 		{
 
- 			c.moveTo(w - indent, h - size - indent);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.lineSEInner = function(c, x, y, w, h, rectStyle, bottomRightStyle, size, indent, bottom)
 
- 	{
 
- 		if (!bottom)
 
- 		{
 
- 			c.lineTo(w - indent, h);
 
- 		}
 
- 		else if(bottomRightStyle == 'square' || (bottomRightStyle == 'default' && rectStyle == 'square' ))
 
- 		{
 
- 			c.lineTo(w - indent, h - indent);
 
- 		}
 
- 		else if((bottomRightStyle == 'rounded' || (bottomRightStyle == 'default' && rectStyle == 'rounded' )) ||
 
- 				(bottomRightStyle == 'snip' || (bottomRightStyle == 'default' && rectStyle == 'snip' )))
 
- 		{
 
- 			c.lineTo(w - indent, h - size - indent * 0.5);
 
- 		}
 
- 		else if((bottomRightStyle == 'invRound' || (bottomRightStyle == 'default' && rectStyle == 'invRound' )) ||
 
- 				(bottomRightStyle == 'fold' || (bottomRightStyle == 'default' && rectStyle == 'fold' )))
 
- 		{
 
- 			c.lineTo(w - indent, h - size - indent);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.moveNEInner = function(c, x, y, w, h, rectStyle, topRightStyle, size, indent, right)
 
- 	{
 
- 		if (!right)
 
- 		{
 
- 			c.moveTo(w, indent);
 
- 		}
 
- 		else if((topRightStyle == 'square' || (topRightStyle == 'default' && rectStyle == 'square' )) || right)
 
- 		{
 
- 			c.moveTo(w - indent, indent);
 
- 		}
 
- 		else if((topRightStyle == 'rounded' || (topRightStyle == 'default' && rectStyle == 'rounded' )) ||
 
- 				(topRightStyle == 'snip' || (topRightStyle == 'default' && rectStyle == 'snip' )))
 
- 		{
 
- 			c.moveTo(w - indent, size + indent * 0.5);
 
- 		}
 
- 		else if((topRightStyle == 'invRound' || (topRightStyle == 'default' && rectStyle == 'invRound' )) ||
 
- 				(topRightStyle == 'fold' || (topRightStyle == 'default' && rectStyle == 'fold' )))
 
- 		{
 
- 			c.moveTo(w - indent, size + indent);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.lineNEInner = function(c, x, y, w, h, rectStyle, topRightStyle, size, indent, right)
 
- 	{
 
- 		if (!right)
 
- 		{
 
- 			c.lineTo(w, indent);
 
- 		}
 
- 		else if((topRightStyle == 'square' || (topRightStyle == 'default' && rectStyle == 'square' )) || right)
 
- 		{
 
- 			c.lineTo(w - indent, indent);
 
- 		}
 
- 		else if((topRightStyle == 'rounded' || (topRightStyle == 'default' && rectStyle == 'rounded' )) ||
 
- 				(topRightStyle == 'snip' || (topRightStyle == 'default' && rectStyle == 'snip' )))
 
- 		{
 
- 			c.lineTo(w - indent, size + indent * 0.5);
 
- 		}
 
- 		else if((topRightStyle == 'invRound' || (topRightStyle == 'default' && rectStyle == 'invRound' )) ||
 
- 				(topRightStyle == 'fold' || (topRightStyle == 'default' && rectStyle == 'fold' )))
 
- 		{
 
- 			c.lineTo(w - indent, size + indent);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.moveNWInner = function(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, top, left)
 
- 	{
 
- 		if (!top && !left)
 
- 		{
 
- 			c.moveTo(0, 0);
 
- 		}
 
- 		else if (!top && left)
 
- 		{
 
- 			c.moveTo(indent, 0);
 
- 		}
 
- 		else if (top && !left)
 
- 		{
 
- 			c.moveTo(0, indent);
 
- 		}
 
- 		else if(topLeftStyle == 'square' || (topLeftStyle == 'default' && rectStyle == 'square' ))
 
- 		{
 
- 			c.moveTo(indent, indent);
 
- 		}
 
- 		else if((topLeftStyle == 'rounded' || (topLeftStyle == 'default' && rectStyle == 'rounded' )) ||
 
- 				(topLeftStyle == 'snip' || (topLeftStyle == 'default' && rectStyle == 'snip' )))
 
- 		{
 
- 			c.moveTo(indent, size + indent * 0.5);
 
- 		}
 
- 		else if((topLeftStyle == 'invRound' || (topLeftStyle == 'default' && rectStyle == 'invRound' )) ||
 
- 				(topLeftStyle == 'fold' || (topLeftStyle == 'default' && rectStyle == 'fold' )))
 
- 		{
 
- 			c.moveTo(indent, size + indent);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.lineNWInner = function(c, x, y, w, h, rectStyle, topLeftStyle, size, indent, top, left)
 
- 	{
 
- 		if (!top && !left)
 
- 		{
 
- 			c.lineTo(0, 0);
 
- 		}
 
- 		else if (!top && left)
 
- 		{
 
- 			c.lineTo(indent, 0);
 
- 		}
 
- 		else if (top && !left)
 
- 		{
 
- 			c.lineTo(0, indent);
 
- 		}
 
- 		else if(topLeftStyle == 'square' || (topLeftStyle == 'default' && rectStyle == 'square' ))
 
- 		{
 
- 			c.lineTo(indent, indent);
 
- 		}
 
- 		else if((topLeftStyle == 'rounded' || (topLeftStyle == 'default' && rectStyle == 'rounded' )) ||
 
- 				(topLeftStyle == 'snip' || (topLeftStyle == 'default' && rectStyle == 'snip' )))
 
- 		{
 
- 			c.lineTo(indent, size + indent * 0.5);
 
- 		}
 
- 		else if((topLeftStyle == 'invRound' || (topLeftStyle == 'default' && rectStyle == 'invRound' )) ||
 
- 				(topLeftStyle == 'fold' || (topLeftStyle == 'default' && rectStyle == 'fold' )))
 
- 		{
 
- 			c.lineTo(indent, size + indent);
 
- 		}
 
- 	};
 
- 	mxShapeBasicRect2.prototype.paintFolds = function(c, x, y, w, h, rectStyle, topLeftStyle, topRightStyle, bottomRightStyle, bottomLeftStyle, size, top, right, bottom, left)
 
- 	{
 
- 		if (rectStyle == 'fold' || topLeftStyle == 'fold' || topRightStyle == 'fold' || bottomRightStyle == 'fold' || bottomLeftStyle == 'fold')
 
- 		{
 
- 			if ((topLeftStyle == 'fold' || (topLeftStyle == 'default' && rectStyle == 'fold' )) && (top && left))
 
- 			{
 
- 				c.moveTo(0, size);
 
- 				c.lineTo(size, size);
 
- 				c.lineTo(size, 0);
 
- 			}
 
- 			
 
- 			if ((topRightStyle == 'fold' || (topRightStyle == 'default' && rectStyle == 'fold' )) && (top && right))
 
- 			{
 
- 				c.moveTo(w - size, 0);
 
- 				c.lineTo(w - size, size);
 
- 				c.lineTo(w, size);
 
- 			}
 
- 			
 
- 			if ((bottomRightStyle == 'fold' || (bottomRightStyle == 'default' && rectStyle == 'fold' )) && (bottom && right))
 
- 			{
 
- 				c.moveTo(w - size, h);
 
- 				c.lineTo(w - size, h - size);
 
- 				c.lineTo(w, h - size);
 
- 			}
 
- 			
 
- 			if ((bottomLeftStyle == 'fold' || (bottomLeftStyle == 'default' && rectStyle == 'fold' )) && (bottom && left))
 
- 			{
 
- 				c.moveTo(0, h - size);
 
- 				c.lineTo(size, h - size);
 
- 				c.lineTo(size, h);
 
- 			}
 
- 		}
 
- 	};
 
- 	mxCellRenderer.registerShape(mxShapeBasicRect2.prototype.cst.RECT2, mxShapeBasicRect2);
 
- 	mxShapeBasicRect2.prototype.constraints = null;
 
- 	// FilledEdge shape
 
- 	function FilledEdge()
 
- 	{
 
- 		mxConnector.call(this);
 
- 	};
 
- 	mxUtils.extend(FilledEdge, mxConnector);
 
- 	
 
- 	FilledEdge.prototype.origPaintEdgeShape = FilledEdge.prototype.paintEdgeShape;
 
- 	FilledEdge.prototype.paintEdgeShape = function(c, pts, rounded)
 
- 	{
 
- 		// Markers modify incoming points array
 
- 		var temp = [];
 
- 		
 
- 		for (var i = 0; i < pts.length; i++)
 
- 		{
 
- 			temp.push(mxUtils.clone(pts[i]));
 
- 		}
 
- 		
 
- 		// paintEdgeShape resets dashed to false
 
- 		var dashed = c.state.dashed;
 
- 		var fixDash = c.state.fixDash;
 
- 		FilledEdge.prototype.origPaintEdgeShape.apply(this, [c, temp, rounded]);
 
- 		if (c.state.strokeWidth >= 3)
 
- 		{
 
- 			var fillClr = mxUtils.getValue(this.style, 'fillColor', null);
 
- 			
 
- 			if (fillClr != null)
 
- 			{
 
- 				c.setStrokeColor(fillClr);
 
- 				c.setStrokeWidth(c.state.strokeWidth - 2);
 
- 				c.setDashed(dashed, fixDash);
 
- 				
 
- 				FilledEdge.prototype.origPaintEdgeShape.apply(this, [c, pts, rounded]);
 
- 			}
 
- 		}
 
- 	};
 
- 	// Registers the link shape
 
- 	mxCellRenderer.registerShape('filledEdge', FilledEdge);
 
- 	// Implements custom colors for shapes
 
- 	if (typeof StyleFormatPanel !== 'undefined')
 
- 	{
 
- 		(function()
 
- 		{
 
- 			var styleFormatPanelGetCustomColors = StyleFormatPanel.prototype.getCustomColors;
 
- 			
 
- 			StyleFormatPanel.prototype.getCustomColors = function()
 
- 			{
 
- 				var ss = this.editorUi.getSelectionState();
 
- 				var result = styleFormatPanelGetCustomColors.apply(this, arguments);
 
- 				
 
- 				if (ss.style.shape == 'umlFrame')
 
- 				{
 
- 					result.push({title: mxResources.get('laneColor'),
 
- 						key: 'swimlaneFillColor',
 
- 						defaultValue: 'default'});
 
- 				}
 
- 				
 
- 				return result;
 
- 			};
 
- 		})();
 
- 	}
 
- 	
 
- 	// Registers and defines the custom marker
 
- 	mxMarker.addMarker('dash', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
 
- 	{
 
- 		var nx = unitX * (size + sw + 1);
 
- 		var ny = unitY * (size + sw + 1);
 
- 		return function()
 
- 		{
 
- 			c.begin();
 
- 			c.moveTo(pe.x - nx / 2 - ny / 2, pe.y - ny / 2 + nx / 2);
 
- 			c.lineTo(pe.x + ny / 2 - 3 * nx / 2, pe.y - 3 * ny / 2 - nx / 2);
 
- 			c.stroke();
 
- 		};
 
- 	});
 
- 	// Registers and defines the custom marker
 
- 	mxMarker.addMarker('box', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
 
- 	{
 
- 		var nx = unitX * (size + sw + 1);
 
- 		var ny = unitY * (size + sw + 1);
 
- 		var px = pe.x + nx / 2;
 
- 		var py = pe.y + ny / 2;
 
- 		
 
- 		pe.x -= nx;
 
- 		pe.y -= ny;
 
- 		return function()
 
- 		{
 
- 			c.begin();
 
- 			c.moveTo(px - nx / 2 - ny / 2, py - ny / 2 + nx / 2);
 
- 			c.lineTo(px - nx / 2 + ny / 2, py - ny / 2 - nx / 2);
 
- 			c.lineTo(px + ny / 2 - 3 * nx / 2, py - 3 * ny / 2 - nx / 2);
 
- 			c.lineTo(px - ny / 2 - 3 * nx / 2, py - 3 * ny / 2 + nx / 2);
 
- 			c.close();
 
- 			
 
- 			if (filled)
 
- 			{
 
- 				c.fillAndStroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				c.stroke();
 
- 			}
 
- 		};
 
- 	});
 
- 	
 
- 	// Registers and defines the custom marker
 
- 	mxMarker.addMarker('cross', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
 
- 	{
 
- 		var nx = unitX * (size + sw + 1);
 
- 		var ny = unitY * (size + sw + 1);
 
- 		return function()
 
- 		{
 
- 			c.begin();
 
- 			c.moveTo(pe.x - nx / 2 - ny / 2, pe.y - ny / 2 + nx / 2);
 
- 			c.lineTo(pe.x + ny / 2 - 3 * nx / 2, pe.y - 3 * ny / 2 - nx / 2);
 
- 			c.moveTo(pe.x - nx / 2 + ny / 2, pe.y - ny / 2 - nx / 2);
 
- 			c.lineTo(pe.x - ny / 2 - 3 * nx / 2, pe.y - 3 * ny / 2 + nx / 2);
 
- 			c.stroke();
 
- 		};
 
- 	});
 
- 	
 
- 	function circleMarker(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
 
- 	{
 
- 		var a = size / 2;
 
- 		var size = size + sw;
 
- 		var pt = pe.clone();
 
- 		
 
- 		pe.x -= unitX * (2 * size + sw);
 
- 		pe.y -= unitY * (2 * size + sw);
 
- 		
 
- 		unitX = unitX * (size + sw);
 
- 		unitY = unitY * (size + sw);
 
- 		return function()
 
- 		{
 
- 			c.ellipse(pt.x - unitX - size, pt.y - unitY - size, 2 * size, 2 * size);
 
- 			
 
- 			if (filled)
 
- 			{
 
- 				c.fillAndStroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				c.stroke();
 
- 			}
 
- 		};
 
- 	};
 
- 	
 
- 	mxMarker.addMarker('circle', circleMarker);
 
- 	mxMarker.addMarker('circlePlus', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
 
- 	{
 
- 		var pt = pe.clone();
 
- 		var fn = circleMarker.apply(this, arguments);
 
- 		var nx = unitX * (size + 2 * sw); // (size + sw + 1);
 
- 		var ny = unitY * (size + 2 * sw); //(size + sw + 1);
 
- 		return function()
 
- 		{
 
- 			fn.apply(this, arguments);
 
- 			c.begin();
 
- 			c.moveTo(pt.x - unitX * (sw), pt.y - unitY * (sw));
 
- 			c.lineTo(pt.x - 2 * nx + unitX * (sw), pt.y - 2 * ny + unitY * (sw));
 
- 			c.moveTo(pt.x - nx - ny + unitY * sw, pt.y - ny + nx - unitX * sw);
 
- 			c.lineTo(pt.x + ny - nx - unitY * sw, pt.y - ny - nx + unitX * sw);
 
- 			c.stroke();
 
- 		};
 
- 	});
 
- 	
 
- 	// Registers and defines the custom marker
 
- 	mxMarker.addMarker('halfCircle', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
 
- 	{
 
- 		var nx = unitX * (size + sw + 1);
 
- 		var ny = unitY * (size + sw + 1);
 
- 		var pt = pe.clone();
 
- 		
 
- 		pe.x -= nx;
 
- 		pe.y -= ny;
 
- 		return function()
 
- 		{
 
- 			c.begin();
 
- 			c.moveTo(pt.x - ny, pt.y + nx);
 
- 			c.quadTo(pe.x - ny, pe.y + nx, pe.x, pe.y);
 
- 			c.quadTo(pe.x + ny, pe.y - nx, pt.x + ny, pt.y - nx);
 
- 			c.stroke();
 
- 		};
 
- 	});
 
- 	mxMarker.addMarker('async', function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
 
- 	{
 
- 		// The angle of the forward facing arrow sides against the x axis is
 
- 		// 26.565 degrees, 1/sin(26.565) = 2.236 / 2 = 1.118 ( / 2 allows for
 
- 		// only half the strokewidth is processed ).
 
- 		var endOffsetX = unitX * sw * 1.118;
 
- 		var endOffsetY = unitY * sw * 1.118;
 
- 		
 
- 		unitX = unitX * (size + sw);
 
- 		unitY = unitY * (size + sw);
 
- 		var pt = pe.clone();
 
- 		pt.x -= endOffsetX;
 
- 		pt.y -= endOffsetY;
 
- 		
 
- 		var f = 1;
 
- 		pe.x += -unitX * f - endOffsetX;
 
- 		pe.y += -unitY * f - endOffsetY;
 
- 		
 
- 		return function()
 
- 		{
 
- 			c.begin();
 
- 			c.moveTo(pt.x, pt.y);
 
- 			
 
- 			if (source)
 
- 			{
 
- 				c.lineTo(pt.x - unitX - unitY / 2, pt.y - unitY + unitX / 2);
 
- 			}
 
- 			else
 
- 			{
 
- 				c.lineTo(pt.x + unitY / 2 - unitX, pt.y - unitY - unitX / 2);
 
- 			}
 
- 			
 
- 			c.lineTo(pt.x - unitX, pt.y - unitY);
 
- 			c.close();
 
- 			if (filled)
 
- 			{
 
- 				c.fillAndStroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				c.stroke();
 
- 			}
 
- 		};
 
- 	});
 
- 	
 
- 	function createOpenAsyncArrow(widthFactor)
 
- 	{
 
- 		widthFactor = (widthFactor != null) ? widthFactor : 2;
 
- 		
 
- 		return function(c, shape, type, pe, unitX, unitY, size, source, sw, filled)
 
- 		{
 
- 			unitX = unitX * (size + sw);
 
- 			unitY = unitY * (size + sw);
 
- 			
 
- 			var pt = pe.clone();
 
- 			return function()
 
- 			{
 
- 				c.begin();
 
- 				c.moveTo(pt.x, pt.y);
 
- 				
 
- 				if (source)
 
- 				{
 
- 					c.lineTo(pt.x - unitX - unitY / widthFactor, pt.y - unitY + unitX / widthFactor);
 
- 				}
 
- 				else
 
- 				{
 
- 					c.lineTo(pt.x + unitY / widthFactor - unitX, pt.y - unitY - unitX / widthFactor);
 
- 				}
 
- 				
 
- 				c.stroke();
 
- 			};
 
- 		}
 
- 	};
 
- 	
 
- 	mxMarker.addMarker('openAsync', createOpenAsyncArrow(2));
 
- 	
 
- 	function arrow(canvas, shape, type, pe, unitX, unitY, size, source, sw, filled)
 
- 	{
 
- 		// The angle of the forward facing arrow sides against the x axis is
 
- 		// 26.565 degrees, 1/sin(26.565) = 2.236 / 2 = 1.118 ( / 2 allows for
 
- 		// only half the strokewidth is processed ).
 
- 		var endOffsetX = unitX * sw * 1.118;
 
- 		var endOffsetY = unitY * sw * 1.118;
 
- 		
 
- 		unitX = unitX * (size + sw);
 
- 		unitY = unitY * (size + sw);
 
- 		var pt = pe.clone();
 
- 		pt.x -= endOffsetX;
 
- 		pt.y -= endOffsetY;
 
- 		
 
- 		var f = (type != mxConstants.ARROW_CLASSIC && type != mxConstants.ARROW_CLASSIC_THIN) ? 1 : 3 / 4;
 
- 		pe.x += -unitX * f - endOffsetX;
 
- 		pe.y += -unitY * f - endOffsetY;
 
- 		
 
- 		return function()
 
- 		{
 
- 			canvas.begin();
 
- 			canvas.moveTo(pt.x, pt.y);
 
- 			canvas.lineTo(pt.x - unitX - unitY / widthFactor, pt.y - unitY + unitX / widthFactor);
 
- 		
 
- 			if (type == mxConstants.ARROW_CLASSIC || type == mxConstants.ARROW_CLASSIC_THIN)
 
- 			{
 
- 				canvas.lineTo(pt.x - unitX * 3 / 4, pt.y - unitY * 3 / 4);
 
- 			}
 
- 		
 
- 			canvas.lineTo(pt.x + unitY / widthFactor - unitX, pt.y - unitY - unitX / widthFactor);
 
- 			canvas.close();
 
- 			if (filled)
 
- 			{
 
- 				canvas.fillAndStroke();
 
- 			}
 
- 			else
 
- 			{
 
- 				canvas.stroke();
 
- 			}
 
- 		};
 
- 	}
 
- 	
 
- 	// Handlers are only added if mxVertexHandler is defined (ie. not in embedded graph)
 
- 	if (typeof mxVertexHandler !== 'undefined')
 
- 	{
 
- 		function createHandle(state, keys, getPositionFn, setPositionFn, ignoreGrid, redrawEdges, executeFn)
 
- 		{
 
- 			var handle = new mxHandle(state, null, mxVertexHandler.prototype.secondaryHandleImage);
 
- 			
 
- 			handle.execute = function(me)
 
- 			{
 
- 				for (var i = 0; i < keys.length; i++)
 
- 				{	
 
- 					this.copyStyle(keys[i]);
 
- 				}
 
- 				
 
- 				if (executeFn)
 
- 				{
 
- 					executeFn(me);
 
- 				}
 
- 			};
 
- 			
 
- 			handle.getPosition = getPositionFn;
 
- 			handle.setPosition = setPositionFn;
 
- 			handle.ignoreGrid = (ignoreGrid != null) ? ignoreGrid : true;
 
- 			
 
- 			// Overridden to update connected edges
 
- 			if (redrawEdges)
 
- 			{
 
- 				var positionChanged = handle.positionChanged;
 
- 				
 
- 				handle.positionChanged = function()
 
- 				{
 
- 					positionChanged.apply(this, arguments);
 
- 					
 
- 					// Redraws connected edges TODO: Include child edges
 
- 					state.view.invalidate(this.state.cell);
 
- 					state.view.validate();
 
- 				};
 
- 			}
 
- 			
 
- 			return handle;
 
- 		};
 
- 		
 
- 		function createArcHandle(state, yOffset)
 
- 		{
 
- 			return createHandle(state, [mxConstants.STYLE_ARCSIZE], function(bounds)
 
- 			{
 
- 				var tmp = (yOffset != null) ? yOffset : bounds.height / 8;
 
- 				
 
- 				if (mxUtils.getValue(state.style, mxConstants.STYLE_ABSOLUTE_ARCSIZE, 0) == '1')
 
- 				{
 
- 					var arcSize = mxUtils.getValue(state.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
 
- 					
 
- 					return new mxPoint(bounds.x + bounds.width - Math.min(bounds.width / 2, arcSize), bounds.y + tmp);
 
- 				}
 
- 				else
 
- 				{
 
- 					var arcSize = Math.max(0, parseFloat(mxUtils.getValue(state.style,
 
- 						mxConstants.STYLE_ARCSIZE, mxConstants.RECTANGLE_ROUNDING_FACTOR * 100))) / 100;
 
- 					
 
- 					return new mxPoint(bounds.x + bounds.width - Math.min(Math.max(bounds.width / 2, bounds.height / 2),
 
- 						Math.min(bounds.width, bounds.height) * arcSize), bounds.y + tmp);
 
- 				}
 
- 			}, function(bounds, pt, me)
 
- 			{
 
- 				if (mxUtils.getValue(state.style, mxConstants.STYLE_ABSOLUTE_ARCSIZE, 0) == '1')
 
- 				{
 
- 					this.state.style[mxConstants.STYLE_ARCSIZE] = Math.round(Math.max(0, Math.min(bounds.width,
 
- 						(bounds.x + bounds.width - pt.x) * 2)));
 
- 				}
 
- 				else
 
- 				{
 
- 					var f = Math.min(50, Math.max(0, (bounds.width - pt.x + bounds.x) * 100 /
 
- 						Math.min(bounds.width, bounds.height)));
 
- 					this.state.style[mxConstants.STYLE_ARCSIZE] = Math.round(f);
 
- 				}
 
- 			});
 
- 		}
 
- 		function createArcHandleFunction()
 
- 		{
 
- 			return function(state)
 
- 			{
 
- 				var handles = [];
 
- 				
 
- 				if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
 
- 				{
 
- 					handles.push(createArcHandle(state));
 
- 				}
 
- 				
 
- 				return handles;
 
- 			};
 
- 		};
 
- 		
 
- 		function createTrapezoidHandleFunction(max, defaultValue, fixedDefaultValue)
 
- 		{
 
- 			max = (max != null) ? max : 0.5;
 
- 			
 
- 			return function(state)
 
- 			{
 
- 				var handles = [createHandle(state, ['size'], function(bounds)
 
- 				{
 
- 					var fixed = (fixedDefaultValue != null) ? mxUtils.getValue(this.state.style, 'fixedSize', '0') != '0' : null;
 
- 					var size = Math.max(0, parseFloat(mxUtils.getValue(this.state.style, 'size', (fixed) ? fixedDefaultValue : defaultValue)));
 
- 					
 
- 					return new mxPoint(bounds.x + Math.min(bounds.width * 0.75 * max, size * ((fixed) ? 0.75 : bounds.width * 0.75)), bounds.y + bounds.height / 4);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					var fixed = (fixedDefaultValue != null) ? mxUtils.getValue(this.state.style, 'fixedSize', '0') != '0' : null;
 
- 					var size = (fixed) ? (pt.x - bounds.x) : Math.max(0, Math.min(max, (pt.x - bounds.x) / bounds.width * 0.75));
 
- 					
 
- 					this.state.style['size'] = size;
 
- 				}, false, true)];
 
- 				
 
- 				if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
 
- 				{
 
- 					handles.push(createArcHandle(state));
 
- 				}
 
- 				
 
- 				return handles;
 
- 			};
 
- 		};
 
- 		
 
- 		function createDisplayHandleFunction(defaultValue, allowArcHandle, max, redrawEdges, fixedDefaultValue)
 
- 		{
 
- 			max = (max != null) ? max : 0.5;
 
- 			
 
- 			return function(state)
 
- 			{
 
- 				var handles = [createHandle(state, ['size'], function(bounds)
 
- 				{
 
- 					var fixed = (fixedDefaultValue != null) ? mxUtils.getValue(this.state.style, 'fixedSize', '0') != '0' : null;
 
- 					var size = parseFloat(mxUtils.getValue(this.state.style, 'size', (fixed) ? fixedDefaultValue : defaultValue));
 
- 	
 
- 					return new mxPoint(bounds.x + Math.max(0, Math.min(bounds.width * 0.5, size * ((fixed) ? 1 : bounds.width))), bounds.getCenterY());
 
- 				}, function(bounds, pt, me)
 
- 				{
 
- 					var fixed = (fixedDefaultValue != null) ? mxUtils.getValue(this.state.style, 'fixedSize', '0') != '0' : null;
 
- 					var size = (fixed) ? (pt.x - bounds.x) : Math.max(0, Math.min(max, (pt.x - bounds.x) / bounds.width));
 
- 					
 
- 					this.state.style['size'] = size;
 
- 				}, false, redrawEdges)];
 
- 				
 
- 				if (allowArcHandle && mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
 
- 				{
 
- 					handles.push(createArcHandle(state));
 
- 				}
 
- 				
 
- 				return handles;
 
- 			};
 
- 		};
 
- 		
 
- 		function createCubeHandleFunction(factor, defaultValue, allowArcHandle)
 
- 		{
 
- 			return function(state)
 
- 			{
 
- 				var handles = [createHandle(state, ['size'], function(bounds)
 
- 				{
 
- 					var size = Math.max(0, Math.min(bounds.width, Math.min(bounds.height, parseFloat(
 
- 						mxUtils.getValue(this.state.style, 'size', defaultValue))))) * factor;
 
- 					
 
- 					return new mxPoint(bounds.x + size, bounds.y + size);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					this.state.style['size'] = Math.round(Math.max(0, Math.min(Math.min(bounds.width, pt.x - bounds.x),
 
- 							Math.min(bounds.height, pt.y - bounds.y))) / factor);
 
- 				}, false)];
 
- 				
 
- 				if (allowArcHandle && mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
 
- 				{
 
- 					handles.push(createArcHandle(state));
 
- 				}
 
- 				
 
- 				return handles;
 
- 			};
 
- 		};
 
- 		
 
- 		function createCylinderHandleFunction(defaultValue)
 
- 		{
 
- 			return function(state)
 
- 			{
 
- 				return [createHandle(state, ['size'], function(bounds)
 
- 				{
 
- 					var size = Math.max(0, Math.min(bounds.height * 0.5, parseFloat(mxUtils.getValue(this.state.style, 'size', defaultValue))));
 
- 					return new mxPoint(bounds.x, bounds.y + size);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					this.state.style['size'] = Math.max(0, pt.y - bounds.y);
 
- 				}, true)];
 
- 			}
 
- 		};
 
- 		
 
- 		function createArrowHandleFunction(maxSize)
 
- 		{
 
- 			return function(state)
 
- 			{
 
- 				return [createHandle(state, ['arrowWidth', 'arrowSize'], function(bounds)
 
- 				{
 
- 					var aw = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'arrowWidth', SingleArrowShape.prototype.arrowWidth)));
 
- 					var as = Math.max(0, Math.min(maxSize, mxUtils.getValue(this.state.style, 'arrowSize', SingleArrowShape.prototype.arrowSize)));
 
- 					
 
- 					return new mxPoint(bounds.x + (1 - as) * bounds.width, bounds.y + (1 - aw) * bounds.height / 2);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					this.state.style['arrowWidth'] = Math.max(0, Math.min(1, Math.abs(bounds.y + bounds.height / 2 - pt.y) / bounds.height * 2));
 
- 					this.state.style['arrowSize'] = Math.max(0, Math.min(maxSize, (bounds.x + bounds.width - pt.x) / (bounds.width)));
 
- 				})];
 
- 			};
 
- 		};
 
- 		
 
- 		function createWedgeHandleFunction(defaultValue, spacing)
 
- 		{
 
- 			return function(state)
 
- 			{
 
- 				return [createEdgeHandle(state, ['startWidth'], true, function(dist, nx, ny, p0, p1)
 
- 				{
 
- 					var w = mxUtils.getNumber(state.style, 'startWidth', defaultValue) * state.view.scale + spacing;
 
- 	
 
- 					return new mxPoint(p0.x + nx * dist / 4 + ny * w / 2, p0.y + ny * dist / 4 - nx * w / 2);
 
- 				}, function(dist, nx, ny, p0, p1, pt)
 
- 				{
 
- 					var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y));					
 
- 					state.style['startWidth'] = Math.round(w * 2) / state.view.scale - spacing;
 
- 				})];
 
- 			};
 
- 		};
 
- 		function createEdgeHandle(state, keys, start, getPosition, setPosition)
 
- 		{
 
- 			return createHandle(state, keys, function(bounds)
 
- 			{
 
- 				var pts = state.absolutePoints;
 
- 				if (pts != null && pts.length > 0)
 
- 				{
 
- 					var n = pts.length - 1;
 
- 					
 
- 					var tr = state.view.translate;
 
- 					var s = state.view.scale;
 
- 					
 
- 					var p0 = (start) ? pts[0] : pts[n];
 
- 					var p1 = (start) ? pts[1] : pts[n - 1];
 
- 					var dx = (start) ? p1.x - p0.x : p1.x - p0.x;
 
- 					var dy = (start) ? p1.y - p0.y : p1.y - p0.y;
 
- 					var dist = Math.sqrt(dx * dx + dy * dy);
 
- 					
 
- 					var pt = getPosition.call(this, dist, dx / dist, dy / dist, p0, p1);
 
- 					
 
- 					return new mxPoint(pt.x / s - tr.x, pt.y / s - tr.y);
 
- 				}
 
- 				else
 
- 				{
 
- 					return null;
 
- 				}
 
- 			}, function(bounds, pt, me)
 
- 			{
 
- 				var pts = state.absolutePoints;
 
- 				var n = pts.length - 1;
 
- 				
 
- 				var tr = state.view.translate;
 
- 				var s = state.view.scale;
 
- 				
 
- 				var p0 = (start) ? pts[0] : pts[n];
 
- 				var p1 = (start) ? pts[1] : pts[n - 1];
 
- 				var dx = (start) ? p1.x - p0.x : p1.x - p0.x;
 
- 				var dy = (start) ? p1.y - p0.y : p1.y - p0.y;
 
- 				var dist = Math.sqrt(dx * dx + dy * dy);
 
- 				pt.x = (pt.x + tr.x) * s;
 
- 				pt.y = (pt.y + tr.y) * s;
 
- 				setPosition.call(this, dist, dx / dist, dy / dist, p0, p1, pt, me);
 
- 			});
 
- 		};
 
- 		
 
- 		function createEdgeWidthHandle(state, start, spacing)
 
- 		{
 
- 			return createEdgeHandle(state, ['width'], start, function(dist, nx, ny, p0, p1)
 
- 			{
 
- 				var w = state.shape.getEdgeWidth() * state.view.scale + spacing;
 
- 				return new mxPoint(p0.x + nx * dist / 4 + ny * w / 2, p0.y + ny * dist / 4 - nx * w / 2);
 
- 			}, function(dist, nx, ny, p0, p1, pt)
 
- 			{
 
- 				var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y));					
 
- 				state.style['width'] = Math.round(w * 2) / state.view.scale - spacing;
 
- 			});
 
- 		};
 
- 		
 
- 		function ptLineDistance(x1, y1, x2, y2, x0, y0)
 
- 		{
 
- 			return Math.abs((y2 - y1) * x0 - (x2 - x1) * y0 + x2 * y1 - y2 * x1) / Math.sqrt((y2 - y1) * (y2 - y1) + (x2 - x1) * (x2 - x1));
 
- 		}
 
- 		var handleFactory = {
 
- 			'link': function(state)
 
- 			{
 
- 				var spacing = 10;
 
- 				return [createEdgeWidthHandle(state, true, spacing), createEdgeWidthHandle(state, false, spacing)];
 
- 			},
 
- 			'flexArrow': function(state)
 
- 			{
 
- 				// Do not use state.shape.startSize/endSize since it is cached
 
- 				var tol = state.view.graph.gridSize / state.view.scale;
 
- 				var handles = [];
 
- 				
 
- 				if (mxUtils.getValue(state.style, mxConstants.STYLE_STARTARROW, mxConstants.NONE) != mxConstants.NONE)
 
- 				{
 
- 					handles.push(createEdgeHandle(state, ['width', mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE], true, function(dist, nx, ny, p0, p1)
 
- 					{
 
- 						var w = (state.shape.getEdgeWidth() - state.shape.strokewidth) * state.view.scale;
 
- 						var l = mxUtils.getNumber(state.style, mxConstants.STYLE_STARTSIZE, mxConstants.ARROW_SIZE / 5) * 3 * state.view.scale;
 
- 						
 
- 						return new mxPoint(p0.x + nx * (l + state.shape.strokewidth * state.view.scale) + ny * w / 2,
 
- 							p0.y + ny * (l + state.shape.strokewidth * state.view.scale) - nx * w / 2);
 
- 					}, function(dist, nx, ny, p0, p1, pt, me)
 
- 					{
 
- 						var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y));
 
- 						var l = mxUtils.ptLineDist(p0.x, p0.y, p0.x + ny, p0.y - nx, pt.x, pt.y);
 
- 						
 
- 						state.style[mxConstants.STYLE_STARTSIZE] = Math.round((l - state.shape.strokewidth) * 100 / 3) / 100 / state.view.scale;
 
- 						state.style['width'] = Math.round(w * 2) / state.view.scale;
 
- 						
 
- 						// Applies to opposite side
 
- 						if (mxEvent.isShiftDown(me.getEvent()) || mxEvent.isControlDown(me.getEvent()))
 
- 						{
 
- 							state.style[mxConstants.STYLE_ENDSIZE] = state.style[mxConstants.STYLE_STARTSIZE];
 
- 						}
 
- 						// Snaps to end geometry
 
- 						if (!mxEvent.isAltDown(me.getEvent()))
 
- 						{
 
- 							if (Math.abs(parseFloat(state.style[mxConstants.STYLE_STARTSIZE]) - parseFloat(state.style[mxConstants.STYLE_ENDSIZE])) < tol / 6)
 
- 							{
 
- 								state.style[mxConstants.STYLE_STARTSIZE] = state.style[mxConstants.STYLE_ENDSIZE];
 
- 							}
 
- 						}
 
- 					}));
 
- 					
 
- 					handles.push(createEdgeHandle(state, ['startWidth', 'endWidth', mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE], true, function(dist, nx, ny, p0, p1)
 
- 					{
 
- 						var w = (state.shape.getStartArrowWidth() - state.shape.strokewidth) * state.view.scale;
 
- 						var l = mxUtils.getNumber(state.style, mxConstants.STYLE_STARTSIZE, mxConstants.ARROW_SIZE / 5) * 3 * state.view.scale;
 
- 						
 
- 						return new mxPoint(p0.x + nx * (l + state.shape.strokewidth * state.view.scale) + ny * w / 2,
 
- 							p0.y + ny * (l + state.shape.strokewidth * state.view.scale) - nx * w / 2);
 
- 					}, function(dist, nx, ny, p0, p1, pt, me)
 
- 					{
 
- 						var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y));
 
- 						var l = mxUtils.ptLineDist(p0.x, p0.y, p0.x + ny, p0.y - nx, pt.x, pt.y);
 
- 						
 
- 						state.style[mxConstants.STYLE_STARTSIZE] = Math.round((l - state.shape.strokewidth) * 100 / 3) / 100 / state.view.scale;
 
- 						state.style['startWidth'] = Math.max(0, Math.round(w * 2) - state.shape.getEdgeWidth()) / state.view.scale;
 
- 						
 
- 						// Applies to opposite side
 
- 						if (mxEvent.isShiftDown(me.getEvent()) || mxEvent.isControlDown(me.getEvent()))
 
- 						{
 
- 							state.style[mxConstants.STYLE_ENDSIZE] = state.style[mxConstants.STYLE_STARTSIZE];
 
- 							state.style['endWidth'] = state.style['startWidth'];
 
- 						}
 
- 						
 
- 						// Snaps to endWidth
 
- 						if (!mxEvent.isAltDown(me.getEvent()))
 
- 						{
 
- 							if (Math.abs(parseFloat(state.style[mxConstants.STYLE_STARTSIZE]) - parseFloat(state.style[mxConstants.STYLE_ENDSIZE])) < tol / 6)
 
- 							{
 
- 								state.style[mxConstants.STYLE_STARTSIZE] = state.style[mxConstants.STYLE_ENDSIZE];
 
- 							}
 
- 							
 
- 							if (Math.abs(parseFloat(state.style['startWidth']) - parseFloat(state.style['endWidth'])) < tol)
 
- 							{
 
- 								state.style['startWidth'] = state.style['endWidth'];
 
- 							}
 
- 						}
 
- 					}));
 
- 				}
 
- 				
 
- 				if (mxUtils.getValue(state.style, mxConstants.STYLE_ENDARROW, mxConstants.NONE) != mxConstants.NONE)
 
- 				{
 
- 					handles.push(createEdgeHandle(state, ['width', mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE], false, function(dist, nx, ny, p0, p1)
 
- 					{
 
- 						var w = (state.shape.getEdgeWidth() - state.shape.strokewidth) * state.view.scale;
 
- 						var l = mxUtils.getNumber(state.style, mxConstants.STYLE_ENDSIZE, mxConstants.ARROW_SIZE / 5) * 3 * state.view.scale;
 
- 						
 
- 						return new mxPoint(p0.x + nx * (l + state.shape.strokewidth * state.view.scale) - ny * w / 2,
 
- 							p0.y + ny * (l + state.shape.strokewidth * state.view.scale) + nx * w / 2);
 
- 					}, function(dist, nx, ny, p0, p1, pt, me)
 
- 					{
 
- 						var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y));
 
- 						var l = mxUtils.ptLineDist(p0.x, p0.y, p0.x + ny, p0.y - nx, pt.x, pt.y);
 
- 						
 
- 						state.style[mxConstants.STYLE_ENDSIZE] = Math.round((l - state.shape.strokewidth) * 100 / 3) / 100 / state.view.scale;
 
- 						state.style['width'] = Math.round(w * 2) / state.view.scale;
 
- 						
 
- 						// Applies to opposite side
 
- 						if (mxEvent.isShiftDown(me.getEvent()) || mxEvent.isControlDown(me.getEvent()))
 
- 						{
 
- 							state.style[mxConstants.STYLE_STARTSIZE] = state.style[mxConstants.STYLE_ENDSIZE];
 
- 						}
 
- 					
 
- 						// Snaps to start geometry
 
- 						if (!mxEvent.isAltDown(me.getEvent()))
 
- 						{
 
- 							if (Math.abs(parseFloat(state.style[mxConstants.STYLE_ENDSIZE]) - parseFloat(state.style[mxConstants.STYLE_STARTSIZE])) < tol / 6)
 
- 							{
 
- 								state.style[mxConstants.STYLE_ENDSIZE] = state.style[mxConstants.STYLE_STARTSIZE];
 
- 							}
 
- 						}
 
- 					}));
 
- 					
 
- 					handles.push(createEdgeHandle(state, ['startWidth', 'endWidth', mxConstants.STYLE_STARTSIZE, mxConstants.STYLE_ENDSIZE], false, function(dist, nx, ny, p0, p1)
 
- 					{
 
- 						var w = (state.shape.getEndArrowWidth() - state.shape.strokewidth) * state.view.scale;
 
- 						var l = mxUtils.getNumber(state.style, mxConstants.STYLE_ENDSIZE, mxConstants.ARROW_SIZE / 5) * 3 * state.view.scale;
 
- 						
 
- 						return new mxPoint(p0.x + nx * (l + state.shape.strokewidth * state.view.scale) - ny * w / 2,
 
- 							p0.y + ny * (l + state.shape.strokewidth * state.view.scale) + nx * w / 2);
 
- 					}, function(dist, nx, ny, p0, p1, pt, me)
 
- 					{
 
- 						var w = Math.sqrt(mxUtils.ptSegDistSq(p0.x, p0.y, p1.x, p1.y, pt.x, pt.y));
 
- 						var l = mxUtils.ptLineDist(p0.x, p0.y, p0.x + ny, p0.y - nx, pt.x, pt.y);
 
- 						
 
- 						state.style[mxConstants.STYLE_ENDSIZE] = Math.round((l - state.shape.strokewidth) * 100 / 3) / 100 / state.view.scale;
 
- 						state.style['endWidth'] = Math.max(0, Math.round(w * 2) - state.shape.getEdgeWidth()) / state.view.scale;
 
- 						
 
- 						// Applies to opposite side
 
- 						if (mxEvent.isShiftDown(me.getEvent()) || mxEvent.isControlDown(me.getEvent()))
 
- 						{
 
- 							state.style[mxConstants.STYLE_STARTSIZE] = state.style[mxConstants.STYLE_ENDSIZE];
 
- 							state.style['startWidth'] = state.style['endWidth'];
 
- 						}
 
- 					
 
- 						// Snaps to start geometry
 
- 						if (!mxEvent.isAltDown(me.getEvent()))
 
- 						{
 
- 							if (Math.abs(parseFloat(state.style[mxConstants.STYLE_ENDSIZE]) - parseFloat(state.style[mxConstants.STYLE_STARTSIZE])) < tol / 6)
 
- 							{
 
- 								state.style[mxConstants.STYLE_ENDSIZE] = state.style[mxConstants.STYLE_STARTSIZE];
 
- 							}
 
- 							
 
- 							if (Math.abs(parseFloat(state.style['endWidth']) - parseFloat(state.style['startWidth'])) < tol)
 
- 							{
 
- 								state.style['endWidth'] = state.style['startWidth'];
 
- 							}
 
- 						}
 
- 					}));
 
- 				}
 
- 				
 
- 				return handles;
 
- 			},
 
- 			'swimlane': function(state)
 
- 			{
 
- 				var handles = [];
 
- 				
 
- 				if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED))
 
- 				{
 
- 					var size = parseFloat(mxUtils.getValue(state.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE));
 
- 					handles.push(createArcHandle(state, size / 2));
 
- 				}
 
- 				// Start size handle must be last item in handles for hover to work in tables (see mouse event handler in Graph)
 
- 				handles.push(createHandle(state, [mxConstants.STYLE_STARTSIZE], function(bounds)
 
- 				{
 
- 					var size = parseFloat(mxUtils.getValue(state.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE));
 
- 					
 
- 					if (mxUtils.getValue(state.style, mxConstants.STYLE_HORIZONTAL, 1) == 1)
 
- 					{
 
- 						return new mxPoint(bounds.getCenterX(), bounds.y + Math.max(0, Math.min(bounds.height, size)));
 
- 					}
 
- 					else
 
- 					{
 
- 						return new mxPoint(bounds.x + Math.max(0, Math.min(bounds.width, size)), bounds.getCenterY());
 
- 					}
 
- 				}, function(bounds, pt)
 
- 				{	
 
- 					state.style[mxConstants.STYLE_STARTSIZE] =
 
- 						(mxUtils.getValue(this.state.style, mxConstants.STYLE_HORIZONTAL, 1) == 1) ?
 
- 							Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y))) :
 
- 							Math.round(Math.max(0, Math.min(bounds.width, pt.x - bounds.x)));
 
- 				}, false, null, function(me)
 
- 				{
 
- 					var graph = state.view.graph;
 
- 					
 
- 					if (!mxEvent.isShiftDown(me.getEvent()) && !mxEvent.isControlDown(me.getEvent()) &&
 
- 						(graph.isTableRow(state.cell) || graph.isTableCell(state.cell)))
 
- 					{
 
- 						var dir = graph.getSwimlaneDirection(state.style);
 
- 						var parent = graph.model.getParent(state.cell);
 
- 						var cells = graph.model.getChildCells(parent, true);
 
- 						var temp = [];
 
- 						
 
- 						for (var i = 0; i < cells.length; i++)
 
- 						{
 
- 							// Finds siblings with the same direction and to set start size
 
- 							if (cells[i] != state.cell && graph.isSwimlane(cells[i]) &&
 
- 								graph.getSwimlaneDirection(graph.getCurrentCellStyle(
 
- 								cells[i])) == dir)
 
- 							{
 
- 								temp.push(cells[i]);
 
- 							}
 
- 						}
 
- 						
 
- 						graph.setCellStyles(mxConstants.STYLE_STARTSIZE,
 
- 							state.style[mxConstants.STYLE_STARTSIZE], temp);
 
- 					}					
 
- 				}));
 
- 				
 
- 				return handles;
 
- 			},
 
- 			'label': createArcHandleFunction(),
 
- 			'ext': createArcHandleFunction(),
 
- 			'rectangle': createArcHandleFunction(),
 
- 			'triangle': createArcHandleFunction(),
 
- 			'rhombus': createArcHandleFunction(),
 
- 			'umlLifeline': function(state)
 
- 			{
 
- 				return [createHandle(state, ['size'], function(bounds)
 
- 				{
 
- 					var size = Math.max(0, Math.min(bounds.height, parseFloat(mxUtils.getValue(this.state.style, 'size', UmlLifeline.prototype.size))));
 
- 					
 
- 					return new mxPoint(bounds.getCenterX(), bounds.y + size);
 
- 				}, function(bounds, pt)
 
- 				{	
 
- 					this.state.style['size'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y)));
 
- 				}, false)];
 
- 			},
 
- 			'umlFrame': function(state)
 
- 			{
 
- 				var handles = [createHandle(state, ['width', 'height'], function(bounds)
 
- 				{
 
- 					var w0 = Math.max(UmlFrame.prototype.corner, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'width', UmlFrame.prototype.width)));
 
- 					var h0 = Math.max(UmlFrame.prototype.corner * 1.5, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'height', UmlFrame.prototype.height)));
 
- 					return new mxPoint(bounds.x + w0, bounds.y + h0);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					this.state.style['width'] = Math.round(Math.max(UmlFrame.prototype.corner, Math.min(bounds.width, pt.x - bounds.x)));
 
- 					this.state.style['height'] = Math.round(Math.max(UmlFrame.prototype.corner * 1.5, Math.min(bounds.height, pt.y - bounds.y)));
 
- 				}, false)];
 
- 				
 
- 				return handles;
 
- 			},
 
- 			'process': function(state)
 
- 			{
 
- 				var handles = [createHandle(state, ['size'], function(bounds)
 
- 				{
 
- 					
 
- 					var fixed = mxUtils.getValue(this.state.style, 'fixedSize', '0') != '0';
 
- 					var size = parseFloat(mxUtils.getValue(this.state.style, 'size', ProcessShape.prototype.size));
 
- 					
 
- 					return (fixed) ? new mxPoint(bounds.x + size, bounds.y + bounds.height / 4) : new mxPoint(bounds.x + bounds.width * size, bounds.y + bounds.height / 4);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					var fixed = mxUtils.getValue(this.state.style, 'fixedSize', '0') != '0';
 
- 					var size = (fixed) ? Math.max(0, Math.min(bounds.width * 0.5, (pt.x - bounds.x))) : Math.max(0, Math.min(0.5, (pt.x - bounds.x) / bounds.width));
 
- 					this.state.style['size'] = size;
 
- 				}, false)];
 
- 				
 
- 				if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
 
- 				{
 
- 					handles.push(createArcHandle(state));
 
- 				}
 
- 				
 
- 				return handles;
 
- 			},
 
- 			'cross': function(state)
 
- 			{
 
- 				return [createHandle(state, ['size'], function(bounds)
 
- 				{
 
- 					var m = Math.min(bounds.width, bounds.height);
 
- 					var size = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'size', CrossShape.prototype.size))) * m / 2;
 
- 					return new mxPoint(bounds.getCenterX() - size, bounds.getCenterY() - size);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					var m = Math.min(bounds.width, bounds.height);
 
- 					this.state.style['size'] = Math.max(0, Math.min(1, Math.min((Math.max(0, bounds.getCenterY() - pt.y) / m) * 2,
 
- 							(Math.max(0, bounds.getCenterX() - pt.x) / m) * 2)));
 
- 				})];
 
- 			},
 
- 			'note': function(state)
 
- 			{
 
- 				return [createHandle(state, ['size'], function(bounds)
 
- 				{
 
- 					var size = Math.max(0, Math.min(bounds.width, Math.min(bounds.height, parseFloat(
 
- 						mxUtils.getValue(this.state.style, 'size', NoteShape.prototype.size)))));
 
- 					
 
- 					return new mxPoint(bounds.x + bounds.width - size, bounds.y + size);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					this.state.style['size'] = Math.round(Math.max(0, Math.min(Math.min(bounds.width, bounds.x + bounds.width - pt.x),
 
- 							Math.min(bounds.height, pt.y - bounds.y))));
 
- 				})];
 
- 			},
 
- 			'note2': function(state)
 
- 			{
 
- 				return [createHandle(state, ['size'], function(bounds)
 
- 				{
 
- 					var size = Math.max(0, Math.min(bounds.width, Math.min(bounds.height, parseFloat(
 
- 						mxUtils.getValue(this.state.style, 'size', NoteShape2.prototype.size)))));
 
- 					
 
- 					return new mxPoint(bounds.x + bounds.width - size, bounds.y + size);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					this.state.style['size'] = Math.round(Math.max(0, Math.min(Math.min(bounds.width, bounds.x + bounds.width - pt.x),
 
- 							Math.min(bounds.height, pt.y - bounds.y))));
 
- 				})];
 
- 			},
 
- 			'manualInput': function(state)
 
- 			{
 
- 				var handles = [createHandle(state, ['size'], function(bounds)
 
- 				{
 
- 					var size = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'size', ManualInputShape.prototype.size)));
 
- 					
 
- 					return new mxPoint(bounds.x + bounds.width / 4, bounds.y + size * 3 / 4);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					this.state.style['size'] = Math.round(Math.max(0, Math.min(bounds.height, (pt.y - bounds.y) * 4 / 3)));
 
- 				}, false)];
 
- 				
 
- 				if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
 
- 				{
 
- 					handles.push(createArcHandle(state));
 
- 				}
 
- 				
 
- 				return handles;
 
- 			},
 
- 			'dataStorage': function(state)
 
- 			{
 
- 				return [createHandle(state, ['size'], function(bounds)
 
- 				{
 
- 					var fixed = mxUtils.getValue(this.state.style, 'fixedSize', '0') != '0';
 
- 					var size = parseFloat(mxUtils.getValue(this.state.style, 'size', (fixed) ? DataStorageShape.prototype.fixedSize : DataStorageShape.prototype.size));
 
- 					return new mxPoint(bounds.x + bounds.width - size * ((fixed) ? 1 : bounds.width), bounds.getCenterY());
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					var fixed = mxUtils.getValue(this.state.style, 'fixedSize', '0') != '0';
 
- 					var size = (fixed) ? Math.max(0, Math.min(bounds.width, (bounds.x + bounds.width - pt.x))) : Math.max(0, Math.min(1, (bounds.x + bounds.width - pt.x) / bounds.width));
 
- 					
 
- 					this.state.style['size'] = size;
 
- 				}, false)];
 
- 			},
 
- 			'callout': function(state)
 
- 			{
 
- 				var handles = [createHandle(state, ['size', 'position'], function(bounds)
 
- 				{
 
- 					var size = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'size', CalloutShape.prototype.size)));
 
- 					var position = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'position', CalloutShape.prototype.position)));
 
- 					var base = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'base', CalloutShape.prototype.base)));
 
- 					
 
- 					return new mxPoint(bounds.x + position * bounds.width, bounds.y + bounds.height - size);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					var base = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'base', CalloutShape.prototype.base)));
 
- 					this.state.style['size'] = Math.round(Math.max(0, Math.min(bounds.height, bounds.y + bounds.height - pt.y)));
 
- 					this.state.style['position'] = Math.round(Math.max(0, Math.min(1, (pt.x - bounds.x) / bounds.width)) * 100) / 100;
 
- 				}, false), createHandle(state, ['position2'], function(bounds)
 
- 				{
 
- 					var position2 = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'position2', CalloutShape.prototype.position2)));
 
- 					return new mxPoint(bounds.x + position2 * bounds.width, bounds.y + bounds.height);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					this.state.style['position2'] = Math.round(Math.max(0, Math.min(1, (pt.x - bounds.x) / bounds.width)) * 100) / 100;
 
- 				}, false), createHandle(state, ['base'], function(bounds)
 
- 				{
 
- 					var size = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'size', CalloutShape.prototype.size)));
 
- 					var position = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'position', CalloutShape.prototype.position)));
 
- 					var base = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'base', CalloutShape.prototype.base)));
 
- 					
 
- 					return new mxPoint(bounds.x + Math.min(bounds.width, position * bounds.width + base), bounds.y + bounds.height - size);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					var position = Math.max(0, Math.min(1, mxUtils.getValue(this.state.style, 'position', CalloutShape.prototype.position)));
 
- 					this.state.style['base'] = Math.round(Math.max(0, Math.min(bounds.width, pt.x - bounds.x - position * bounds.width)));
 
- 				}, false)];
 
- 				
 
- 				if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
 
- 				{
 
- 					handles.push(createArcHandle(state));
 
- 				}
 
- 				
 
- 				return handles;
 
- 			},
 
- 			'internalStorage': function(state)
 
- 			{
 
- 				var handles = [createHandle(state, ['dx', 'dy'], function(bounds)
 
- 				{
 
- 					var dx = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'dx', InternalStorageShape.prototype.dx)));
 
- 					var dy = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'dy', InternalStorageShape.prototype.dy)));
 
- 					return new mxPoint(bounds.x + dx, bounds.y + dy);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					this.state.style['dx'] = Math.round(Math.max(0, Math.min(bounds.width, pt.x - bounds.x)));
 
- 					this.state.style['dy'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y)));
 
- 				}, false)];
 
- 				
 
- 				if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
 
- 				{
 
- 					handles.push(createArcHandle(state));
 
- 				}
 
- 				
 
- 				return handles;
 
- 			},
 
- 			'module': function(state)
 
- 			{
 
- 				var handles = [createHandle(state, ['jettyWidth', 'jettyHeight'], function(bounds)
 
- 				{
 
- 					var dx = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'jettyWidth', ModuleShape.prototype.jettyWidth)));
 
- 					var dy = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'jettyHeight', ModuleShape.prototype.jettyHeight)));
 
- 					return new mxPoint(bounds.x + dx / 2, bounds.y + dy * 2);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					this.state.style['jettyWidth'] = Math.round(Math.max(0, Math.min(bounds.width, pt.x - bounds.x)) * 2);
 
- 					this.state.style['jettyHeight'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y)) / 2);
 
- 				})];
 
- 				
 
- 				return handles;
 
- 			},
 
- 			'corner': function(state)
 
- 			{
 
- 				return [createHandle(state, ['dx', 'dy'], function(bounds)
 
- 				{
 
- 					var dx = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'dx', CornerShape.prototype.dx)));
 
- 					var dy = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'dy', CornerShape.prototype.dy)));
 
- 					return new mxPoint(bounds.x + dx, bounds.y + dy);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					this.state.style['dx'] = Math.round(Math.max(0, Math.min(bounds.width, pt.x - bounds.x)));
 
- 					this.state.style['dy'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y)));
 
- 				}, false)];
 
- 			},
 
- 			'tee': function(state)
 
- 			{
 
- 				return [createHandle(state, ['dx', 'dy'], function(bounds)
 
- 				{
 
- 					var dx = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'dx', TeeShape.prototype.dx)));
 
- 					var dy = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'dy', TeeShape.prototype.dy)));
 
- 					return new mxPoint(bounds.x + (bounds.width + dx) / 2, bounds.y + dy);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					this.state.style['dx'] = Math.round(Math.max(0, Math.min(bounds.width / 2, (pt.x - bounds.x - bounds.width / 2)) * 2));
 
- 					this.state.style['dy'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y)));
 
- 				}, false)];
 
- 			},
 
- 			'singleArrow': createArrowHandleFunction(1),
 
- 			'doubleArrow': createArrowHandleFunction(0.5),
 
- 			'mxgraph.arrows2.wedgeArrow': createWedgeHandleFunction(20, 20),
 
- 			'mxgraph.arrows2.wedgeArrowDashed': createWedgeHandleFunction(20, 20),
 
- 			'mxgraph.arrows2.wedgeArrowDashed2': createWedgeHandleFunction(20, 20),
 
- 			'folder': function(state)
 
- 			{
 
- 				return [createHandle(state, ['tabWidth', 'tabHeight'], function(bounds)
 
- 				{
 
- 					var tw = Math.max(0, Math.min(bounds.width, mxUtils.getValue(this.state.style, 'tabWidth', FolderShape.prototype.tabWidth)));
 
- 					var th = Math.max(0, Math.min(bounds.height, mxUtils.getValue(this.state.style, 'tabHeight', FolderShape.prototype.tabHeight)));
 
- 					
 
- 					if (mxUtils.getValue(this.state.style, 'tabPosition', FolderShape.prototype.tabPosition) == mxConstants.ALIGN_RIGHT)
 
- 					{
 
- 						tw = bounds.width - tw;
 
- 					}
 
- 					
 
- 					return new mxPoint(bounds.x + tw, bounds.y + th);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					var tw = Math.max(0, Math.min(bounds.width, pt.x - bounds.x));
 
- 					
 
- 					if (mxUtils.getValue(this.state.style, 'tabPosition', FolderShape.prototype.tabPosition) == mxConstants.ALIGN_RIGHT)
 
- 					{
 
- 						tw = bounds.width - tw;
 
- 					}
 
- 					
 
- 					this.state.style['tabWidth'] = Math.round(tw);
 
- 					this.state.style['tabHeight'] = Math.round(Math.max(0, Math.min(bounds.height, pt.y - bounds.y)));
 
- 				}, false)];
 
- 			},
 
- 			'document': function(state)
 
- 			{
 
- 				return [createHandle(state, ['size'], function(bounds)
 
- 				{
 
- 					var size = Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.state.style, 'size', DocumentShape.prototype.size))));
 
- 					return new mxPoint(bounds.x + 3 * bounds.width / 4, bounds.y + (1 - size) * bounds.height);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					this.state.style['size'] = Math.max(0, Math.min(1, (bounds.y + bounds.height - pt.y) / bounds.height));
 
- 				}, false)];
 
- 			},
 
- 			'tape': function(state)
 
- 			{
 
- 				return [createHandle(state, ['size'], function(bounds)
 
- 				{
 
- 					var size = Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.state.style, 'size', TapeShape.prototype.size))));
 
- 					return new mxPoint(bounds.getCenterX(), bounds.y + size * bounds.height / 2);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					this.state.style['size'] = Math.max(0, Math.min(1, ((pt.y - bounds.y) / bounds.height) * 2));
 
- 				}, false)];
 
- 			},
 
- 			'isoCube2' : function(state)
 
- 			{
 
- 				return [createHandle(state, ['isoAngle'], function(bounds)
 
- 				{
 
- 					var isoAngle = Math.max(0.01, Math.min(94, parseFloat(mxUtils.getValue(this.state.style, 'isoAngle', IsoCubeShape2.isoAngle)))) * Math.PI / 200 ;
 
- 					var isoH = Math.min(bounds.width * Math.tan(isoAngle), bounds.height * 0.5);
 
- 					return new mxPoint(bounds.x, bounds.y + isoH);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					this.state.style['isoAngle'] = Math.max(0, (pt.y - bounds.y) * 50 / bounds.height);
 
- 				}, true)];
 
- 			},
 
- 			'cylinder2' : createCylinderHandleFunction(CylinderShape.prototype.size),
 
- 			'cylinder3' : createCylinderHandleFunction(CylinderShape3.prototype.size),
 
- 			'offPageConnector': function(state)
 
- 			{
 
- 				return [createHandle(state, ['size'], function(bounds)
 
- 				{
 
- 					var size = Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.state.style, 'size', OffPageConnectorShape.prototype.size))));
 
- 					return new mxPoint(bounds.getCenterX(), bounds.y + (1 - size) * bounds.height);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					this.state.style['size'] = Math.max(0, Math.min(1, (bounds.y + bounds.height - pt.y) / bounds.height));
 
- 				}, false)];
 
- 			},
 
- 			'mxgraph.basic.rect': function(state)
 
- 			{
 
- 				var handles = [Graph.createHandle(state, ['size'], function(bounds)
 
- 				{
 
- 					var size = Math.max(0, Math.min(bounds.width / 2, bounds.height / 2, parseFloat(mxUtils.getValue(this.state.style, 'size', this.size))));
 
- 		
 
- 					return new mxPoint(bounds.x + size, bounds.y + size);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					this.state.style['size'] = Math.round(100 * Math.max(0, Math.min(bounds.height / 2, bounds.width / 2, pt.x - bounds.x))) / 100;
 
- 				})];
 
- 						
 
- 				var handle2 = Graph.createHandle(state, ['indent'], function(bounds)
 
- 				{
 
- 					var dx2 = Math.max(0, Math.min(100, parseFloat(mxUtils.getValue(this.state.style, 'indent', this.dx2))));
 
- 		
 
- 					return new mxPoint(bounds.x + bounds.width * 0.75, bounds.y + dx2 * bounds.height / 200);
 
- 				}, function(bounds, pt)
 
- 				{
 
- 					this.state.style['indent'] = Math.round(100 * Math.max(0, Math.min(100, 200 * (pt.y - bounds.y) / bounds.height))) / 100;
 
- 				});
 
- 				
 
- 				handles.push(handle2);
 
- 				
 
- 				return handles;
 
- 			},
 
- 			'step': createDisplayHandleFunction(StepShape.prototype.size, true, null, true, StepShape.prototype.fixedSize),
 
- 			'hexagon': createDisplayHandleFunction(HexagonShape.prototype.size, true, 0.5, true, HexagonShape.prototype.fixedSize),
 
- 			'curlyBracket': createDisplayHandleFunction(CurlyBracketShape.prototype.size, false),
 
- 			'display': createDisplayHandleFunction(DisplayShape.prototype.size, false),
 
- 			'cube': createCubeHandleFunction(1, CubeShape.prototype.size, false),
 
- 			'card': createCubeHandleFunction(0.5, CardShape.prototype.size, true),
 
- 			'loopLimit': createCubeHandleFunction(0.5, LoopLimitShape.prototype.size, true),
 
- 			'trapezoid': createTrapezoidHandleFunction(0.5, TrapezoidShape.prototype.size, TrapezoidShape.prototype.fixedSize),
 
- 			'parallelogram': createTrapezoidHandleFunction(1, ParallelogramShape.prototype.size, ParallelogramShape.prototype.fixedSize)
 
- 		};
 
- 		
 
- 		// Exposes custom handles
 
- 		Graph.createHandle = createHandle;
 
- 		Graph.handleFactory = handleFactory;
 
- 		var vertexHandlerCreateCustomHandles = mxVertexHandler.prototype.createCustomHandles;
 
- 		mxVertexHandler.prototype.createCustomHandles = function()
 
- 		{
 
- 			var handles = vertexHandlerCreateCustomHandles.apply(this, arguments);
 
- 			
 
- 			if (this.graph.isCellRotatable(this.state.cell))
 
- 			// LATER: Make locked state independent of rotatable flag, fix toggle if default is false
 
- 			//if (this.graph.isCellResizable(this.state.cell) || this.graph.isCellMovable(this.state.cell))
 
- 			{
 
- 				var name = this.state.style['shape'];
 
- 				if (mxCellRenderer.defaultShapes[name] == null &&
 
- 					mxStencilRegistry.getStencil(name) == null)
 
- 				{
 
- 					name = mxConstants.SHAPE_RECTANGLE;
 
- 				}
 
- 				else if (this.state.view.graph.isSwimlane(this.state.cell))
 
- 				{
 
- 					name = mxConstants.SHAPE_SWIMLANE;
 
- 				}
 
- 				
 
- 				var fn = handleFactory[name];
 
- 				
 
- 				if (fn == null && this.state.shape != null && this.state.shape.isRoundable())
 
- 				{
 
- 					fn = handleFactory[mxConstants.SHAPE_RECTANGLE];
 
- 				}
 
- 			
 
- 				if (fn != null)
 
- 				{
 
- 					var temp = fn(this.state);
 
- 					
 
- 					if (temp != null)
 
- 					{
 
- 						if (handles == null)
 
- 						{
 
- 							handles = temp;
 
- 						}
 
- 						else
 
- 						{
 
- 							handles = handles.concat(temp);
 
- 						}
 
- 					}
 
- 				}
 
- 			}
 
- 			
 
- 			return handles;
 
- 		};
 
- 		mxEdgeHandler.prototype.createCustomHandles = function()
 
- 		{
 
- 			var name = this.state.style['shape'];
 
- 			
 
- 			if (mxCellRenderer.defaultShapes[name] == null &&
 
- 				mxStencilRegistry.getStencil(name) == null)
 
- 			{
 
- 				name = mxConstants.SHAPE_CONNECTOR;
 
- 			}
 
- 			
 
- 			var fn = handleFactory[name];
 
- 			
 
- 			if (fn != null)
 
- 			{
 
- 				return fn(this.state);
 
- 			}
 
- 			
 
- 			return null;
 
- 		}
 
- 	}
 
- 	else
 
- 	{
 
- 		// Dummy entries to avoid NPE in embed mode
 
- 		Graph.createHandle = function() {};
 
- 		Graph.handleFactory = {};
 
- 	}
 
- 	 var isoHVector = new mxPoint(1, 0);
 
- 	 var isoVVector = new mxPoint(1, 0);
 
- 		
 
- 	 var alpha1 = mxUtils.toRadians(-30);
 
- 		
 
- 	 var cos1 = Math.cos(alpha1);
 
- 	 var sin1 = Math.sin(alpha1);
 
- 	 isoHVector = mxUtils.getRotatedPoint(isoHVector, cos1, sin1);
 
- 	 var alpha2 = mxUtils.toRadians(-150);
 
- 	 
 
- 	 var cos2 = Math.cos(alpha2);
 
- 	 var sin2 = Math.sin(alpha2);
 
- 	 isoVVector = mxUtils.getRotatedPoint(isoVVector, cos2, sin2);
 
- 	
 
- 	 mxEdgeStyle.IsometricConnector = function (state, source, target, points, result)
 
- 	 {
 
- 		var view = state.view;
 
- 		var pt = (points != null && points.length > 0) ? points[0] : null;
 
- 		var pts = state.absolutePoints;
 
- 		var p0 = pts[0];
 
- 		var pe = pts[pts.length-1];
 
- 		
 
- 		if (pt != null)
 
- 		{
 
- 			pt = view.transformControlPoint(state, pt);
 
- 		}
 
- 		
 
- 		if (p0 == null)
 
- 		{
 
- 			if (source != null)
 
- 			{
 
- 				p0 = new mxPoint(source.getCenterX(), source.getCenterY());
 
- 			}
 
- 		}
 
- 		
 
- 		if (pe == null)
 
- 		{
 
- 			if (target != null)
 
- 			{
 
- 				pe = new mxPoint(target.getCenterX(), target.getCenterY());
 
- 			}
 
- 		}		
 
- 		
 
- 		var a1 = isoHVector.x;
 
- 		var a2 = isoHVector.y;
 
- 		
 
- 		var b1 = isoVVector.x;
 
- 		var b2 = isoVVector.y;
 
- 		
 
- 		var elbow = mxUtils.getValue(state.style, 'elbow', 'horizontal') == 'horizontal';
 
- 		
 
- 		if (pe != null && p0 != null)
 
- 		{
 
- 			var last = p0;
 
- 			
 
- 			function isoLineTo(x, y, ignoreFirst)
 
- 			{
 
- 				var c1 = x - last.x;
 
- 				var c2 = y - last.y;
 
- 				// Solves for isometric base vectors
 
- 				var h = (b2 * c1 - b1 * c2) / (a1 * b2 - a2 * b1);
 
- 				var v = (a2 * c1 - a1 * c2) / (a2 * b1 - a1 * b2);
 
- 				
 
- 				if (elbow)
 
- 				{
 
- 					if (ignoreFirst)
 
- 					{
 
- 						last = new mxPoint(last.x + a1 * h, last.y + a2 * h);
 
- 						result.push(last);
 
- 					}
 
- 	
 
- 					last = new mxPoint(last.x + b1 * v, last.y + b2 * v);
 
- 					result.push(last);
 
- 				}
 
- 				else
 
- 				{
 
- 					if (ignoreFirst)
 
- 					{
 
- 						last = new mxPoint(last.x + b1 * v, last.y + b2 * v);
 
- 						result.push(last);
 
- 					}
 
- 					last = new mxPoint(last.x + a1 * h, last.y + a2 * h);
 
- 					result.push(last);
 
- 				}
 
- 			};
 
- 			if (pt == null)
 
- 			{
 
- 				pt = new mxPoint(p0.x + (pe.x - p0.x) / 2, p0.y + (pe.y - p0.y) / 2);
 
- 			}
 
- 			
 
- 			isoLineTo(pt.x, pt.y, true);
 
- 			isoLineTo(pe.x, pe.y, false);
 
- 		}
 
- 	 };
 
- 	 mxStyleRegistry.putValue('isometricEdgeStyle', mxEdgeStyle.IsometricConnector);
 
- 	
 
- 	 var graphCreateEdgeHandler = Graph.prototype.createEdgeHandler;
 
- 	 Graph.prototype.createEdgeHandler = function(state, edgeStyle)
 
- 	 {
 
- 	 	if (edgeStyle == mxEdgeStyle.IsometricConnector)
 
- 	 	{
 
- 	 		var handler = new mxElbowEdgeHandler(state);
 
- 	 		handler.snapToTerminals = false;
 
- 	 		
 
- 	 		return handler;
 
- 	 	}
 
- 	 	
 
- 	 	return graphCreateEdgeHandler.apply(this, arguments);
 
- 	 };
 
- 	// Defines connection points for all shapes
 
- 	IsoRectangleShape.prototype.constraints = [];
 
- 	
 
- 	IsoCubeShape.prototype.getConstraints = function(style, w, h)
 
- 	{
 
- 		var constr = [];
 
- 		var tan30 = Math.tan(mxUtils.toRadians(30));
 
- 		var tan30Dx = (0.5 - tan30) / 2;
 
- 		var m = Math.min(w, h / (0.5 + tan30));
 
- 		var dx = (w - m) / 2;
 
- 		var dy = (h - m) / 2;
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx, dy + 0.25 * m));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx + 0.5 * m, dy + m * tan30Dx));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx + m, dy + 0.25 * m));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx + m, dy + 0.75 * m));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx + 0.5 * m, dy + (1 - tan30Dx) * m));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx, dy + 0.75 * m));
 
- 		return (constr);
 
- 	};
 
- 	IsoCubeShape2.prototype.getConstraints = function(style, w, h)
 
- 	{
 
- 		var constr = [];
 
- 		var isoAngle = Math.max(0.01, Math.min(94, parseFloat(mxUtils.getValue(this.style, 'isoAngle', this.isoAngle)))) * Math.PI / 200 ;
 
- 		var isoH = Math.min(w * Math.tan(isoAngle), h * 0.5);
 
- 		
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.5, 0), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, isoH));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(1, 0.5), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, h - isoH));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.5, 1), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, h - isoH));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0.5), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, isoH));
 
- 		return (constr);
 
- 	}
 
- 	
 
- 	CalloutShape.prototype.getConstraints = function(style, w, h)
 
- 	{
 
- 		var constr = [];
 
- 		var arcSize = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2;
 
- 		var s = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		var dx = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'position', this.position))));
 
- 		var dx2 = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'position2', this.position2))));
 
- 		var base = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'base', this.base))));
 
- 		
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.25, 0), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.5, 0), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.75, 0), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(1, 0), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, (h - s) * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, h - s));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx2, h));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, h - s));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, (h - s) * 0.5));
 
- 		
 
- 		if (w >= s * 2)
 
- 		{
 
- 			constr.push(new mxConnectionConstraint(new mxPoint(0.5, 0), false));
 
- 		}
 
- 		return (constr);
 
- 	};
 
- 	
 
- 	mxRectangleShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0), true),
 
- 											  new mxConnectionConstraint(new mxPoint(0.25, 0), true),
 
- 	                                          new mxConnectionConstraint(new mxPoint(0.5, 0), true),
 
- 	                                          new mxConnectionConstraint(new mxPoint(0.75, 0), true),
 
- 	                                          new mxConnectionConstraint(new mxPoint(1, 0), true),
 
- 	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.25), true),
 
- 	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.5), true),
 
- 	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.75), true),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.25), true),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.5), true),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.75), true),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(0, 1), true),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(0.25, 1), true),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(0.75, 1), true),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(1, 1), true)];
 
- 	mxEllipse.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0), true), new mxConnectionConstraint(new mxPoint(1, 0), true),
 
- 	                                   new mxConnectionConstraint(new mxPoint(0, 1), true), new mxConnectionConstraint(new mxPoint(1, 1), true),
 
- 	                                   new mxConnectionConstraint(new mxPoint(0.5, 0), true), new mxConnectionConstraint(new mxPoint(0.5, 1), true),
 
- 	          	              		   new mxConnectionConstraint(new mxPoint(0, 0.5), true), new mxConnectionConstraint(new mxPoint(1, 0.5))];
 
- 	PartialRectangleShape.prototype.constraints = mxRectangleShape.prototype.constraints;
 
- 	mxImageShape.prototype.constraints = mxRectangleShape.prototype.constraints;
 
- 	mxSwimlane.prototype.constraints = mxRectangleShape.prototype.constraints;
 
- 	PlusShape.prototype.constraints = mxRectangleShape.prototype.constraints;
 
- 	mxLabel.prototype.constraints = mxRectangleShape.prototype.constraints;
 
- 	
 
- 	NoteShape.prototype.getConstraints = function(style, w, h)
 
- 	{
 
- 		var constr = [];
 
- 		var s = Math.max(0, Math.min(w, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))));
 
- 		
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w - s) * 0.5, 0));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - s, 0));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - s * 0.5, s * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, s));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, (h + s) * 0.5 ));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(1, 1), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.5, 1), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 1), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0.5), false));
 
- 		
 
- 		if (w >= s * 2)
 
- 		{
 
- 			constr.push(new mxConnectionConstraint(new mxPoint(0.5, 0), false));
 
- 		}
 
- 		return (constr);
 
- 	};
 
- 	
 
- 	CardShape.prototype.getConstraints = function(style, w, h)
 
- 	{
 
- 		var constr = [];
 
- 		var s = Math.max(0, Math.min(w, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))));
 
- 		
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(1, 0), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w + s) * 0.5, 0));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, s, 0));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, s * 0.5, s * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, s));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, (h + s) * 0.5 ));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 1), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.5, 1), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(1, 1), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(1, 0.5), false));
 
- 		
 
- 		if (w >= s * 2)
 
- 		{
 
- 			constr.push(new mxConnectionConstraint(new mxPoint(0.5, 0), false));
 
- 		}
 
- 		return (constr);
 
- 	};
 
- 	
 
- 	CubeShape.prototype.getConstraints = function(style, w, h)
 
- 	{
 
- 		var constr = [];
 
- 		var s = Math.max(0, Math.min(w, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size)))));
 
- 		
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w - s) * 0.5, 0));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - s, 0));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - s * 0.5, s * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, s));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, (h + s) * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(1, 1), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w + s) * 0.5, h));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, s, h));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, s * 0.5, h - s * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, h - s));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, (h - s) * 0.5));
 
- 		
 
- 		return (constr);
 
- 	};
 
- 	
 
- 	CylinderShape3.prototype.getConstraints = function(style, w, h)
 
- 	{
 
- 		var constr = [];
 
- 		var s = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.5, 0), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0.5), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.5, 1), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(1, 0.5), false));
 
- 		
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, s));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(1, 0), false, null, 0, s));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(1, 1), false, null, 0, -s));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 1), false, null, 0, -s));
 
- 		
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, s + (h * 0.5 - s) * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(1, 0), false, null, 0, s + (h * 0.5 - s) * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(1, 0), false, null, 0, h - s - (h * 0.5 - s) * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, h - s - (h * 0.5 - s) * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.145, 0), false, null, 0, s * 0.29));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.855, 0), false, null, 0, s * 0.29));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.855, 1), false, null, 0, -s * 0.29));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.145, 1), false, null, 0, -s * 0.29));
 
- 		
 
- 		return (constr);
 
- 	};
 
- 	
 
- 	FolderShape.prototype.getConstraints = function(style, w, h)
 
- 	{
 
- 		var constr = [];
 
- 		var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'tabWidth', this.tabWidth))));
 
- 		var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'tabHeight', this.tabHeight))));
 
- 		var tp = mxUtils.getValue(this.style, 'tabPosition', this.tabPosition);
 
- 		if (tp == 'left')
 
- 		{
 
- 			constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false));
 
- 			constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx * 0.5, 0));
 
- 			constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx, 0));
 
- 			constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx, dy));
 
- 			constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w + dx) * 0.5, dy));
 
- 		}
 
- 		else
 
- 		{
 
- 			constr.push(new mxConnectionConstraint(new mxPoint(1, 0), false));
 
- 			constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - dx * 0.5, 0));
 
- 			constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - dx, 0));
 
- 			constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - dx, dy));
 
- 			constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w - dx) * 0.5, dy));
 
- 		}
 
- 		
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, dy));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, (h - dy) * 0.25 + dy));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, (h - dy) * 0.5 + dy));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, (h - dy) * 0.75 + dy));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, h));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, dy));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, (h - dy) * 0.25 + dy));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, (h - dy) * 0.5 + dy));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, (h - dy) * 0.75 + dy));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, h));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.25, 1), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.5, 1), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.75, 1), false));
 
- 		return (constr);
 
- 	}
 
- 	InternalStorageShape.prototype.constraints = mxRectangleShape.prototype.constraints;
 
- 	DataStorageShape.prototype.constraints = mxRectangleShape.prototype.constraints;
 
- 	TapeDataShape.prototype.constraints = mxEllipse.prototype.constraints;
 
- 	OrEllipseShape.prototype.constraints = mxEllipse.prototype.constraints;
 
- 	SumEllipseShape.prototype.constraints = mxEllipse.prototype.constraints;
 
- 	LineEllipseShape.prototype.constraints = mxEllipse.prototype.constraints;
 
- 	ManualInputShape.prototype.constraints = mxRectangleShape.prototype.constraints;
 
- 	DelayShape.prototype.constraints = mxRectangleShape.prototype.constraints;
 
- 	DisplayShape.prototype.getConstraints = function(style, w, h)
 
- 	{
 
- 		var constr = [];
 
- 		var dx = Math.min(w, h / 2);
 
- 		var s = Math.min(w - dx, Math.max(0, parseFloat(mxUtils.getValue(this.style, 'size', this.size))) * w);
 
- 		
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0.5), false, null));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, s, 0));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (s + w - dx) * 0.5, 0));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - dx, 0));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(1, 0.5), false, null));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - dx, h));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (s + w - dx) * 0.5, h));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, s, h));
 
- 		
 
- 		return (constr);
 
- 	};
 
- 	
 
- 	ModuleShape.prototype.getConstraints = function(style, w, h)
 
- 	{
 
- 		var x0 = parseFloat(mxUtils.getValue(style, 'jettyWidth', ModuleShape.prototype.jettyWidth)) / 2;
 
- 		var dy = parseFloat(mxUtils.getValue(style, 'jettyHeight', ModuleShape.prototype.jettyHeight));
 
- 		var constr = [new mxConnectionConstraint(new mxPoint(0, 0), false, null, x0),
 
- 			new mxConnectionConstraint(new mxPoint(0.25, 0), true),
 
- 			new mxConnectionConstraint(new mxPoint(0.5, 0), true),
 
- 			new mxConnectionConstraint(new mxPoint(0.75, 0), true),
 
- 			new mxConnectionConstraint(new mxPoint(1, 0), true),
 
- 			new mxConnectionConstraint(new mxPoint(1, 0.25), true),
 
- 			new mxConnectionConstraint(new mxPoint(1, 0.5), true),
 
- 			new mxConnectionConstraint(new mxPoint(1, 0.75), true),
 
- 			new mxConnectionConstraint(new mxPoint(0, 1), false, null, x0),
 
- 			new mxConnectionConstraint(new mxPoint(0.25, 1), true),
 
- 			new mxConnectionConstraint(new mxPoint(0.5, 1), true),
 
- 			new mxConnectionConstraint(new mxPoint(0.75, 1), true),
 
- 			new mxConnectionConstraint(new mxPoint(1, 1), true),
 
- 			new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, Math.min(h - 0.5 * dy, 1.5 * dy)),
 
- 			new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, Math.min(h - 0.5 * dy, 3.5 * dy))];
 
- 		
 
- 		if (h > 5 * dy)
 
- 		{
 
- 			constr.push(new mxConnectionConstraint(new mxPoint(0, 0.75), false, null, x0));
 
- 		}
 
- 		
 
- 		if (h > 8 * dy)
 
- 		{
 
- 			constr.push(new mxConnectionConstraint(new mxPoint(0, 0.5), false, null, x0));
 
- 		}
 
- 		
 
- 		if (h > 15 * dy)
 
- 		{
 
- 			constr.push(new mxConnectionConstraint(new mxPoint(0, 0.25), false, null, x0));
 
- 		}
 
- 		
 
- 		return constr;
 
- 	};
 
- 	
 
- 	LoopLimitShape.prototype.constraints = mxRectangleShape.prototype.constraints;
 
- 	OffPageConnectorShape.prototype.constraints = mxRectangleShape.prototype.constraints;
 
- 	mxCylinder.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.15, 0.05), false),
 
-                                         new mxConnectionConstraint(new mxPoint(0.5, 0), true),
 
-                                         new mxConnectionConstraint(new mxPoint(0.85, 0.05), false),
 
-       	              		 new mxConnectionConstraint(new mxPoint(0, 0.3), true),
 
-       	              		 new mxConnectionConstraint(new mxPoint(0, 0.5), true),
 
-       	              		 new mxConnectionConstraint(new mxPoint(0, 0.7), true),
 
-       	            		 new mxConnectionConstraint(new mxPoint(1, 0.3), true),
 
-       	            		 new mxConnectionConstraint(new mxPoint(1, 0.5), true),
 
-       	            		 new mxConnectionConstraint(new mxPoint(1, 0.7), true),
 
-       	            		 new mxConnectionConstraint(new mxPoint(0.15, 0.95), false),
 
-       	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
 
-       	            		 new mxConnectionConstraint(new mxPoint(0.85, 0.95), false)];
 
- 	UmlActorShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0.1), false),
 
- 	                                          new mxConnectionConstraint(new mxPoint(0.5, 0), false),
 
- 	                                          new mxConnectionConstraint(new mxPoint(0.75, 0.1), false),
 
- 	        	              		 new mxConnectionConstraint(new mxPoint(0, 1/3), false),
 
- 	        	              		 new mxConnectionConstraint(new mxPoint(0, 1), false),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(1, 1/3), false),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(1, 1), false),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(0.5, 0.5), false)];
 
- 	ComponentShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
 
- 	                                          new mxConnectionConstraint(new mxPoint(0.5, 0), true),
 
- 	                                          new mxConnectionConstraint(new mxPoint(0.75, 0), true),
 
- 	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.3), true),
 
- 	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.7), true),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.25), true),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.5), true),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.75), true),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(0.25, 1), true),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
 
- 	mxActor.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.5, 0), true),
 
-    	              		 new mxConnectionConstraint(new mxPoint(0.25, 0.2), false),
 
-    	              		 new mxConnectionConstraint(new mxPoint(0.1, 0.5), false),
 
-    	              		 new mxConnectionConstraint(new mxPoint(0, 0.75), true),
 
-    	            		 new mxConnectionConstraint(new mxPoint(0.75, 0.25), false),
 
-    	            		 new mxConnectionConstraint(new mxPoint(0.9, 0.5), false),
 
-    	            		 new mxConnectionConstraint(new mxPoint(1, 0.75), true),
 
-    	            		 new mxConnectionConstraint(new mxPoint(0.25, 1), true),
 
-    	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
 
-    	            		 new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
 
- 	SwitchShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0), false),
 
-                                          new mxConnectionConstraint(new mxPoint(0.5, 0.25), false),
 
-                                          new mxConnectionConstraint(new mxPoint(1, 0), false),
 
- 			       	              		 new mxConnectionConstraint(new mxPoint(0.25, 0.5), false),
 
- 			       	              		 new mxConnectionConstraint(new mxPoint(0.75, 0.5), false),
 
- 			       	              		 new mxConnectionConstraint(new mxPoint(0, 1), false),
 
- 			       	            		 new mxConnectionConstraint(new mxPoint(0.5, 0.75), false),
 
- 			       	            		 new mxConnectionConstraint(new mxPoint(1, 1), false)];
 
- 	TapeShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.35), false),
 
- 	                                   new mxConnectionConstraint(new mxPoint(0, 0.5), false),
 
- 	                                   new mxConnectionConstraint(new mxPoint(0, 0.65), false),
 
- 	                                   new mxConnectionConstraint(new mxPoint(1, 0.35), false),
 
- 		                                new mxConnectionConstraint(new mxPoint(1, 0.5), false),
 
- 		                                new mxConnectionConstraint(new mxPoint(1, 0.65), false),
 
- 										new mxConnectionConstraint(new mxPoint(0.25, 1), false),
 
- 										new mxConnectionConstraint(new mxPoint(0.75, 0), false)];
 
- 	StepShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
 
- 									new mxConnectionConstraint(new mxPoint(0.5, 0), true),
 
- 									new mxConnectionConstraint(new mxPoint(0.75, 0), true),
 
- 									new mxConnectionConstraint(new mxPoint(0.25, 1), true),
 
- 									new mxConnectionConstraint(new mxPoint(0.5, 1), true),
 
- 									new mxConnectionConstraint(new mxPoint(0.75, 1), true),
 
- 									new mxConnectionConstraint(new mxPoint(0, 0.25), true),
 
- 									new mxConnectionConstraint(new mxPoint(0, 0.5), true),
 
- 									new mxConnectionConstraint(new mxPoint(0, 0.75), true),
 
- 									new mxConnectionConstraint(new mxPoint(1, 0.25), true),
 
- 									new mxConnectionConstraint(new mxPoint(1, 0.5), true),
 
- 									new mxConnectionConstraint(new mxPoint(1, 0.75), true)];
 
- 	mxLine.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.5), false),
 
- 	                                new mxConnectionConstraint(new mxPoint(0.25, 0.5), false),
 
- 	                                new mxConnectionConstraint(new mxPoint(0.75, 0.5), false),
 
- 									new mxConnectionConstraint(new mxPoint(1, 0.5), false)];
 
- 	LollipopShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.5, 0), false),
 
- 										new mxConnectionConstraint(new mxPoint(0.5, 1), false)];
 
- 	mxDoubleEllipse.prototype.constraints = mxEllipse.prototype.constraints;
 
- 	mxRhombus.prototype.constraints = mxEllipse.prototype.constraints;
 
- 	mxTriangle.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.25), true),
 
- 	                                    new mxConnectionConstraint(new mxPoint(0, 0.5), true),
 
- 	                                   new mxConnectionConstraint(new mxPoint(0, 0.75), true),
 
- 	                                   new mxConnectionConstraint(new mxPoint(0.5, 0), true),
 
- 	                                   new mxConnectionConstraint(new mxPoint(0.5, 1), true),
 
- 	                                   new mxConnectionConstraint(new mxPoint(1, 0.5), true)];
 
- 	mxHexagon.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.375, 0), true),
 
- 	                                    new mxConnectionConstraint(new mxPoint(0.5, 0), true),
 
- 	                                   new mxConnectionConstraint(new mxPoint(0.625, 0), true),
 
- 	                                   new mxConnectionConstraint(new mxPoint(0, 0.25), true),
 
- 	                                   new mxConnectionConstraint(new mxPoint(0, 0.5), true),
 
- 	                                   new mxConnectionConstraint(new mxPoint(0, 0.75), true),
 
- 	                                   new mxConnectionConstraint(new mxPoint(1, 0.25), true),
 
- 	                                   new mxConnectionConstraint(new mxPoint(1, 0.5), true),
 
- 	                                   new mxConnectionConstraint(new mxPoint(1, 0.75), true),
 
- 	                                   new mxConnectionConstraint(new mxPoint(0.375, 1), true),
 
- 	                                    new mxConnectionConstraint(new mxPoint(0.5, 1), true),
 
- 	                                   new mxConnectionConstraint(new mxPoint(0.625, 1), true)];
 
- 	mxCloud.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0.25), false),
 
- 	                                 new mxConnectionConstraint(new mxPoint(0.4, 0.1), false),
 
- 	                                 new mxConnectionConstraint(new mxPoint(0.16, 0.55), false),
 
- 	                                 new mxConnectionConstraint(new mxPoint(0.07, 0.4), false),
 
- 	                                 new mxConnectionConstraint(new mxPoint(0.31, 0.8), false),
 
- 	                                 new mxConnectionConstraint(new mxPoint(0.13, 0.77), false),
 
- 	                                 new mxConnectionConstraint(new mxPoint(0.8, 0.8), false),
 
- 	                                 new mxConnectionConstraint(new mxPoint(0.55, 0.95), false),
 
- 	                                 new mxConnectionConstraint(new mxPoint(0.875, 0.5), false),
 
- 	                                 new mxConnectionConstraint(new mxPoint(0.96, 0.7), false),
 
- 	                                 new mxConnectionConstraint(new mxPoint(0.625, 0.2), false),
 
- 	                                 new mxConnectionConstraint(new mxPoint(0.88, 0.25), false)];
 
- 	ParallelogramShape.prototype.constraints = mxRectangleShape.prototype.constraints;
 
- 	TrapezoidShape.prototype.constraints = mxRectangleShape.prototype.constraints;
 
- 	DocumentShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
 
- 	                                          new mxConnectionConstraint(new mxPoint(0.5, 0), true),
 
- 	                                          new mxConnectionConstraint(new mxPoint(0.75, 0), true),
 
- 	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.25), true),
 
- 	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.5), true),
 
- 	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.75), true),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.25), true),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.5), true),
 
- 	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.75), true)];
 
- 	mxArrow.prototype.constraints = null;
 
- 	TeeShape.prototype.getConstraints = function(style, w, h)
 
- 	{
 
- 		var constr = [];
 
- 		var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'dx', this.dx))));
 
- 		var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'dy', this.dy))));
 
- 		var w2 = Math.abs(w - dx) / 2;
 
- 		
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.5, 0), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(1, 0), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, dy * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, dy));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w * 0.75 + dx * 0.25, dy));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w + dx) * 0.5, dy));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w + dx) * 0.5, (h + dy) * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w + dx) * 0.5, h));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.5, 1), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w - dx) * 0.5, h));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w - dx) * 0.5, (h + dy) * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w - dx) * 0.5, dy));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w * 0.25 - dx * 0.25, dy));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, dy));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, dy * 0.5));
 
- 		
 
- 		return (constr);
 
- 	};
 
- 	CornerShape.prototype.getConstraints = function(style, w, h)
 
- 	{
 
- 		var constr = [];
 
- 		var dx = Math.max(0, Math.min(w, parseFloat(mxUtils.getValue(this.style, 'dx', this.dx))));
 
- 		var dy = Math.max(0, Math.min(h, parseFloat(mxUtils.getValue(this.style, 'dy', this.dy))));
 
- 		
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.5, 0), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(1, 0), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, dy * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, dy));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w + dx) * 0.5, dy));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx, dy));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx, (h + dy) * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx, h));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, dx * 0.5, h));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0.5), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 1), false));
 
- 		
 
- 		return (constr);
 
- 	};
 
- 	CrossbarShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0), false),
 
-         new mxConnectionConstraint(new mxPoint(0, 0.5), false),
 
-         new mxConnectionConstraint(new mxPoint(0, 1), false),
 
-         new mxConnectionConstraint(new mxPoint(0.25, 0.5), false),
 
-         new mxConnectionConstraint(new mxPoint(0.5, 0.5), false),
 
-         new mxConnectionConstraint(new mxPoint(0.75, 0.5), false),
 
-         new mxConnectionConstraint(new mxPoint(1, 0), false),
 
-         new mxConnectionConstraint(new mxPoint(1, 0.5), false),
 
-         new mxConnectionConstraint(new mxPoint(1, 1), false)];
 
- 	SingleArrowShape.prototype.getConstraints = function(style, w, h)
 
- 	{
 
- 		var constr = [];
 
- 		var aw = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowWidth', this.arrowWidth))));
 
- 		var as = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowSize', this.arrowSize))));
 
- 		var at = (h - aw) / 2;
 
- 		var ab = at + aw;
 
- 		
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0.5), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, at));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w - as) * 0.5, at));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - as, 0));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(1, 0.5), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - as, h));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w - as) * 0.5, h - at));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, h - at));
 
- 		
 
- 		return (constr);
 
- 	};
 
- 	
 
- 	DoubleArrowShape.prototype.getConstraints = function(style, w, h)
 
- 	{
 
- 		var constr = [];
 
- 		var aw = h * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowWidth', SingleArrowShape.prototype.arrowWidth))));
 
- 		var as = w * Math.max(0, Math.min(1, parseFloat(mxUtils.getValue(this.style, 'arrowSize', SingleArrowShape.prototype.arrowSize))));
 
- 		var at = (h - aw) / 2;
 
- 		var ab = at + aw;
 
- 		
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0.5), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, as, 0));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w * 0.5, at));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - as, 0));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(1, 0.5), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w - as, h));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w * 0.5, h - at));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, as, h));
 
- 		
 
- 		return (constr);
 
- 	};
 
- 	
 
- 	CrossShape.prototype.getConstraints = function(style, w, h)
 
- 	{
 
- 		var constr = [];
 
- 		var m = Math.min(h, w);
 
- 		var size = Math.max(0, Math.min(m, m * parseFloat(mxUtils.getValue(this.style, 'size', this.size))));
 
- 		var t = (h - size) / 2;
 
- 		var b = t + size;
 
- 		var l = (w - size) / 2;
 
- 		var r = l + size;
 
- 		
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, l, t * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, l, 0));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.5, 0), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, r, 0));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, r, t * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, r, t));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, l, h - t * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, l, h));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0.5, 1), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, r, h));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, r, h - t * 0.5));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, r, b));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w + r) * 0.5, t));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, t));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(1, 0.5), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, w, b));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, (w + r) * 0.5, b));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, l, b));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, l * 0.5, t));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, t));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0.5), false));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, 0, b));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, l * 0.5, b));
 
- 		constr.push(new mxConnectionConstraint(new mxPoint(0, 0), false, null, l, t));
 
- 		return (constr);
 
- 	};
 
- 	
 
- 	UmlLifeline.prototype.constraints = null;
 
- 	OrShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.25), false),
 
- 	  	                             new mxConnectionConstraint(new mxPoint(0, 0.5), false),
 
- 	  	                             new mxConnectionConstraint(new mxPoint(0, 0.75), false),
 
- 	  	                             new mxConnectionConstraint(new mxPoint(1, 0.5), false),
 
- 	  	                             new mxConnectionConstraint(new mxPoint(0.7, 0.1), false),
 
- 	  	                             new mxConnectionConstraint(new mxPoint(0.7, 0.9), false)];
 
- 	XorShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.175, 0.25), false),
 
- 	  	                             new mxConnectionConstraint(new mxPoint(0.25, 0.5), false),
 
- 	  	                             new mxConnectionConstraint(new mxPoint(0.175, 0.75), false),
 
- 	  	                             new mxConnectionConstraint(new mxPoint(1, 0.5), false),
 
- 	  	                             new mxConnectionConstraint(new mxPoint(0.7, 0.1), false),
 
- 	  	                             new mxConnectionConstraint(new mxPoint(0.7, 0.9), false)];
 
- 	RequiredInterfaceShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.5), false),
 
-           new mxConnectionConstraint(new mxPoint(1, 0.5), false)];
 
- 	ProvidedRequiredInterfaceShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.5), false),
 
-         new mxConnectionConstraint(new mxPoint(1, 0.5), false)];
 
- })();
 
 
  |