From d44c02176745d49dc069d85a53f35731b07af677 Mon Sep 17 00:00:00 2001 From: phm3 Date: Fri, 1 Feb 2019 15:00:51 +0000 Subject: [PATCH] init --- UI/bdsensors.py | 36 + UI/bmp180.py | 142 ++++ UI/justgage-1.2.2.zip | Bin 0 -> 56795 bytes UI/main.py | 18 + UI/requirements.txt | 3 + UI/static/justgage.js | 1220 ++++++++++++++++++++++++++++++++ UI/static/raphael-2.1.4.min.js | 12 + UI/templates/main.html | 77 ++ 8 files changed, 1508 insertions(+) create mode 100644 UI/bdsensors.py create mode 100644 UI/bmp180.py create mode 100644 UI/justgage-1.2.2.zip create mode 100644 UI/main.py create mode 100644 UI/requirements.txt create mode 100644 UI/static/justgage.js create mode 100644 UI/static/raphael-2.1.4.min.js create mode 100644 UI/templates/main.html diff --git a/UI/bdsensors.py b/UI/bdsensors.py new file mode 100644 index 0000000..4c620bb --- /dev/null +++ b/UI/bdsensors.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +import os +import glob +import time +import subprocess + +# this needs to be automated later TODO +base_dir = '/sys/bus/w1/devices/' +# here is the prefix of the hardware in this case, 10 +device_folder = glob.glob(base_dir + '00*')[0] +device_file = device_folder + '/w1_bus_master1' + + +def read_temp_raw(): # This function reads the raw sensor chip information + catdata = subprocess.Popen( + ['cat', device_file], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out, err = catdata.communicate() + out_decode = out.decode('utf-8') + lines = out_decode.split('\n') + return lines + + +def read_temp(): # This function takes the the raw sensor chip information + lines = read_temp_raw() # strips it down and takes only the temperature out + while lines[0].strip()[-3:] != 'YES': + time.sleep(0.2) + lines = read_temp_raw() + equals_pos = lines[1].find('t=') + if equals_pos != -1: + temp_string = lines[1][equals_pos+2:] + # Calculates temperature in celcius and stores it in variable + temp_c = float(temp_string) / 1000.0 + # Calculates temperature in fahreint and stores it in variable + temp_f = temp_c * 9.0 / 5.0 + 32.0 + return temp_c # here it returns only the temperature in celcius diff --git a/UI/bmp180.py b/UI/bmp180.py new file mode 100644 index 0000000..a46e3fc --- /dev/null +++ b/UI/bmp180.py @@ -0,0 +1,142 @@ +#!/usr/bin/python +# -------------------------------------- +# ___ ___ _ ____ +# / _ \/ _ \(_) __/__ __ __ +# / , _/ ___/ /\ \/ _ \/ // / +# /_/|_/_/ /_/___/ .__/\_, / +# /_/ /___/ +# +# bmp180.py +# Read data from a digital pressure sensor. +# +# Author : Matt Hawkins +# Date : 17/02/2017 +# +# http://www.raspberrypi-spy.co.uk/ +# +# -------------------------------------- +import smbus +import time +from ctypes import c_short + +DEVICE = 0x77 # Default device I2C address + +# bus = smbus.SMBus(0) # Rev 1 Pi uses 0 +bus = smbus.SMBus(1) # Rev 2 Pi uses 1 + + +def convertToString(data): + # Simple function to convert binary data into + # a string + return str((data[1] + (256 * data[0])) / 1.2) + + +def getShort(data, index): + # return two bytes from data as a signed 16-bit value + return c_short((data[index] << 8) + data[index + 1]).value + + +def getUshort(data, index): + # return two bytes from data as an unsigned 16-bit value + return (data[index] << 8) + data[index + 1] + + +def readBmp180Id(addr=DEVICE): + # Chip ID Register Address + REG_ID = 0xD0 + (chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2) + return (chip_id, chip_version) + + +def readBmp180(addr=DEVICE): + # Register Addresses + REG_CALIB = 0xAA + REG_MEAS = 0xF4 + REG_MSB = 0xF6 + REG_LSB = 0xF7 + # Control Register Address + CRV_TEMP = 0x2E + CRV_PRES = 0x34 + # Oversample setting + OVERSAMPLE = 3 # 0 - 3 + + # Read calibration data + # Read calibration data from EEPROM + cal = bus.read_i2c_block_data(addr, REG_CALIB, 22) + + # Convert byte data to word values + AC1 = getShort(cal, 0) + AC2 = getShort(cal, 2) + AC3 = getShort(cal, 4) + AC4 = getUshort(cal, 6) + AC5 = getUshort(cal, 8) + AC6 = getUshort(cal, 10) + B1 = getShort(cal, 12) + B2 = getShort(cal, 14) + MB = getShort(cal, 16) + MC = getShort(cal, 18) + MD = getShort(cal, 20) + + # Read temperature + bus.write_byte_data(addr, REG_MEAS, CRV_TEMP) + time.sleep(0.005) + (msb, lsb) = bus.read_i2c_block_data(addr, REG_MSB, 2) + UT = (msb << 8) + lsb + + # Read pressure + bus.write_byte_data(addr, REG_MEAS, CRV_PRES + (OVERSAMPLE << 6)) + time.sleep(0.04) + (msb, lsb, xsb) = bus.read_i2c_block_data(addr, REG_MSB, 3) + UP = ((msb << 16) + (lsb << 8) + xsb) >> (8 - OVERSAMPLE) + + # Refine temperature + X1 = ((UT - AC6) * AC5) >> 15 + X2 = (MC << 11) / (X1 + MD) + B5 = X1 + X2 + temperature = int(B5 + 8) >> 4 + + # Refine pressure + B6 = B5 - 4000 + B62 = int(B6 * B6) >> 12 + X1 = (B2 * B62) >> 11 + X2 = int(AC2 * B6) >> 11 + X3 = X1 + X2 + B3 = (((AC1 * 4 + X3) << OVERSAMPLE) + 2) >> 2 + + X1 = int(AC3 * B6) >> 13 + X2 = (B1 * B62) >> 16 + X3 = ((X1 + X2) + 2) >> 2 + B4 = (AC4 * (X3 + 32768)) >> 15 + B7 = (UP - B3) * (50000 >> OVERSAMPLE) + + P = (B7 * 2) / B4 + + X1 = (int(P) >> 8) * (int(P) >> 8) + X1 = (X1 * 3038) >> 16 + X2 = int(-7357 * P) >> 16 + pressure = int(P + ((X1 + X2 + 3791) >> 4)) + + return (temperature/10.0, pressure/100.0) + + +def main(): + + #(chip_id, chip_version) = readBmp180Id() + #print("Chip ID : {0}".format(chip_id)) + #print("Version : {0}".format(chip_version)) + + # print + + (temperature, pressure) = readBmp180() + #print("Temperature : {0} C".format(temperature)) + #print("Pressure : {0} mbar".format(pressure)) + return {"temperature": temperature, "pressure": pressure} + + +def readings(): + (temperature, pressure) = readBmp180() + return pressure + + +# if __name__ == "__main__": +# main() diff --git a/UI/justgage-1.2.2.zip b/UI/justgage-1.2.2.zip new file mode 100644 index 0000000000000000000000000000000000000000..71cb09cc2addbde9d8b41c455bf0c70e4519a067 GIT binary patch literal 56795 zcma&NW0+=JvMrppZB*K}S!vt0ZQHhO+qTV0qbhA@-l~1N&+Xmke0{%H&-(GM`D4xz zBSwsfB_|0C0tN8r^=kJ^?5~S|{J;Ys09ZIXI+^O58q+Y)GSV{ADXYN%WOD|nrv3gt z0HOfM{k|Cm0OI#s%gy9(H)H(In`wm=brqd#9gP31()fFYIQA`-KdW4%F<1=pBZz#B zQG%GaIJL(iKZ8Ze$;3ggsr~wfBL+jE{G!z!7`q!ebnC?hww|X1HSSB_CCJpM(AY@? zpki|diU5FOXBe7^5(S89jW>!{>n0G`>Y}LH>Iqw?cn5~Bmfu}d+j?cGXB#>ipB;oC z2*Cj6hzh^h6N0dhzHkK}FXME=$~$}dUO_td*Y&ZnlMK339#Qt`%(V0*yBCHks|-2X zsaPq#cLTy#NIKR1$rtkF%$HyoU)0gEqw+o@0?g^`hFcVgBkydmD=kp^7k$*YU-zHh8~OXc z9v<2M-2eYxMc>)UmPX&`&)L$NIa&WXjz0$)6}qJS=Qz4m~dZHC--R!Esspr15k#PhClebn?I zBObVLf1K0}y63@WjoHOiQ=G=1R;N{%?vtJSB%`rwqhPLRa|fhVUKVtfiR&jlXBaT* z07FT6E3!1vtiA32| zKCGBBnk5FFc4>OwagVVP`jzB4x6AudyQH3NlX+&J;EcN)o3WL-g;&yN)|L2Cjn+o* ze7Rh-HC?vS405@`;E%g$l82}Z6kAg5HkScPdyxaubpkYa0`ytP-@-Bl&UoU9b|4{b ztO6_QFOI<6`&}+F86PuMYs3#o@irc~lyPHV07rhHTY-W?w?OTCI{>9fHKR+C~~`izsl^Zb)evg`!RkyY*H| zygH^*f~eMo<5DpF#(EQ9rnMA;oH;jB-ksfs0}h+1`heU$x9RRP9Enp+^Tiq#>*iO& zg_2Z~Z=X$Pml4NMAg$V}=Hlq5k?EKwEs^sXIR#3j9#o`YNC?&Xt=ql zB|x5dY=1|ICZ86g{O+2|GZTw)G5SK&n|2<)TB*Neb>-VMkqcW(-^kuCCQ)uv?hr?m z0G6L1oq_^;QmBjz)!L`|ii%p}H*j$W-7#5o3`#3_`%eFneOsI8sTp z8cy+(pTWs*bia?2ur>L~N_A;LYp0+;4is)|bmpQk4-Em6je>fUC%6fkfc9$Oz9!xoHIy_E<3M$uD40%xoXllF5`+wXIBcx zv>!!x&k*a$CguV3DNcc;r6e1(y$guVvPIKiR$D8Qz?@Oo8_~%KN7Gb*p16u(Nu<;Z zn%o})GMSInAVV5Q@~pM=V@h#+q`?X06L(=fdM88Oh|ZmiNHm zO~BH{s$%uGi|@K)w1PnVloHLO{`Ur9DYK<9*^J?h2Ewe0(VKiZh`ez=HdnmlG{hAaJQ3De} zTx{&Bel+dfWsny1*k}1R?~J0R8w*Li+!p=Qa|7(Xp=4wr<`$4xmBZc61%+R;YZ3uf zDl(fe*o5KXgMW|~bjk#p@4og!OYEz?Opd}j<08@4Y8`+K(vaU6<&PiqL zuB3t`J8mAT5y?h5O^Dr(s!LF?P!h-!baK^(rbsiVaG~!^g}D!pyo_U3(d}RQV|tgW zuPSzw>^4QHdkmm8k1-A=T{0?#jrJ>a0*W&i za6d;x6GJkRRF;s0j`H#ZXFVQig>LRVZ^yprnMD|S)fREi_+8A3vi3(0W{NKv;Q=wA zw-8m;Q03WxT5`Y`^)JlC!5IzhjUqG5;Cgp#UsMCu+Zt3%la>$R8=kP0%6LfikEQYe%G)YBwbBI+K@ke`mLFCV4BVW-(;-t1K{60Xr*Y^8)WB-$Le@eC^Ih4OQl8wenHY#qbFXK zY!8)#lb>;L?aXQp!!m%XsIjoi1P+C7A8RwLm6PMROgIwH%d5*z4a0!oyW8(-!*Vro zu0hCJ-&juWt~RoFTkwY1LowEjB`KwO zEwwFDR|KM;-KpuT&+uy3SQ1^Ju!`E|5Syfgl_naN76mmYXDHWjP?P8@CFpQbe0UM`6t7Yxc$ z-e8`DvTmFfVFo3sY?el#LGEB?3!oqmve8gJDCjqqi;;%F?Z8ewEUa;e78N6!bLGlB zi5${^`|9s|jQs6uy$x6+GuzIg+;H^5eA9u&5X&sbj}&tMN1lac2Wv!<+9T#kD-+UX zaQ=b-cNree7BRB7FHSdweYIsz`6&*h2mJFZxtM696_VFWAEp;a~-Z*oTm$3 z^NLL;*Mb#}3(8L(BuHedgh7219!!2<&T%!B`H+|m7;rXv4;$DNI> zk@4R$L&QHs)wJq%Od%^uPwkSc9S^#G5u~`^e9Z#Af@_Dib+dKxg|V_S-Wy04Fb3wJ zl+twKLqY74>M2895Idc7B`s5x+qqDVwfuv)R`LTv{J) ze>438v7MtPnrQK%DTy9~d5wk#R0tv-leQnExp~S#Ym$^p8Kxv*QF2hImbnn5YPvs6 zJAM(pJ$YUN&d7s*4JdTu##$Ryv^?fZBgc9&6QL2>^!Vm`{8YgE&1T4>(RM5L>V_U8 z@HT3tbl%*96Oq2^gcETi$IW#{-2ypd^%o~K7~XUm38NruOiv)5T9g`QKb~b{PBVrP zO6Fd7oJdaHa@H8N!04!J`2G{_YxV*V^F)4PutX67de$9}z83tRo}-fc6)V3^^%VwN zL%^ps3A8!?eXXIgze{NO8X&whk;@MmtxT=%`u5w-ndS7HD#h-!Cg;#iE)tb91%!rg z3PDRHD3N6PBJ()E-fO5#LYrrTTlH&V?@bs4UIkowM`b{mth81=#OU51wd#w8?lR9F zr51KtG z2q_K$dV6yGy-o7Au~1jcsGoSKpXGM2%G}Tz{moOb6wL7DXEMx_hG64sj;1!dC5(=} zC@qv&Ex>}hc5R~60j6%7$T8=P!#4*8vfZ_Icj9R55&~TJZ@NAm*2lldhCv`aL{f}H zaBCRBsn3jCEvZVxjY?mlf;6kOfSIm&0X-c=F^*3g7RRIgA_G6U44Z`I`tqHJ^XgkH zslV`;`pZoMQm45md#!b-oDgv+HY#K`k@s!2_)rLpy=NAAXm51ea=A z91qdvSPTnkX0-M1*)U$?mGKCg0WSVtevoVU%(PLsWWPVxbGcpWlJvA(bdK08`?dSYQrnOA(RP#caHhIfM(S|Zv4Iz(Teb4T1W@3lTn?Q(oR%HE;-!tr@Id7@$u)$M=zu=tUz^E2rp=fYLU zZBFWrbmL*RCc22K5va)>T(Y>|+|)gE$}kSj|?oU$o0b0Xq{Y?(%aQ{jUG+JnXE4coDBxOfq z!{6nvY+%*g zBapHUCiLaq*;R#4N7WNiks%41QW!al%c3ptHP-pMO_Nv z%v6ZHmIKv82T2{4CM}cFbz}>`$V4E|D#axnOo9XI_!Ka>Tk##*qFbpccRb=AVX)xx z?h|Y)>J8<9>AFFZd{ryK!BDrb3EPTtv2%_zY@ZN~r5C_*LlV|7F!hY367B-%1+tGc zVqbAAa3rr+e{h`oVL$f3No}jb^+gRi(T+`U{<1RdiuG_%6`_=yI_US)`$6ZZ;1yJ*=(t&B$LNz9B(){;O$5@^_BsMM(jtKrBr zLq<(CN6T3WV-xMv=?l%qUC3C=Uq8dXKWFJT7PXfvSkOf(an+dHf0O)WrDW)Ge{^4G zeV3R8jba5=Nm-aP-pIgOl30UnQR7DoEjf0L#;dplkK(+A2edo@OtjSmY>}e`u|(j6 z+6u171TYx0Sp~lHrgTay>mX9U z9&=Eo62n9c8h2Qi3^*NM)P3gk_V!be7fcO zXQSma7e!13bWiu3w!oLd z_;Gdt=R{P*)6M>UP)OK|YX8w{p)2}mk2k8^Yh!TdLm16tD;@*u#*jrXo1@H+W9#D4 zmKU~n*gv86rDz%l^gGmu|CWbo|1A$Q{=f6^Z|Uo7Oygi|V`S{`Z?#(3KQeN*igoNJ zE6gXa-j~3gw-}IC)}hV@4LbN*N6l$nK0m|xBt1%m$fkwSc-+z9!v3cx#rn)R-KypZ zF?w)OStvZkEh`^AYNjF}F;n}R&)0UzOAA#Vj4DX3G+ammdtnC%GH9~+F&~)Gyag;9 zP)lvaLRnT9_&9&!4kadb&7q0BCHCS%)(qc(nz&HA@Y!th5HH6vMXF^3aTDXOOL_g> zA5-PK6qJT>U`~Zzb#~c`_F&x8QyE)Zw2_{&Gj8e-9vaBBpdFc4 zK@m?mKBdf}9i)}}IY|=yWE@l1);;|~pyrNi#c@2pvO zMCXrNQ_&?2Qb{wbLo}c)cGD%3k_J1CfV7i^Dh2QG%sFh3mzwBF477?xWM3fok0tFVSp1%)MIpUM)iO<&m7*LY4j13E3a<6uFA2@B@R8Wyqx)7+Dfw`w7dJfKJ(L8 zQ!my8-lfc~y51Nb-ixM>)|aE(criTnbKGj|f*6hahb*@sm(~V2Pm`lj#E&xvcdF=Y z8;mzAm(}J~KSJ>YIr-PZ0`NAT*;t#1L-?2z$a;r{{w$cJAMVKcF^PCd;6M=j=LTJBpjT@*!jRb1y{u7L-;DmAy4`z7YtqBJLN(vq`ZwN&S%8 zFL)FI;8u-l=5SeussZXgSoM@bt&h*^!p~~30|#glHOxFwFg3CtXrGoU08oOa0pRt( zwEhMyW=XTKAbp*ESo4D_vEd$4%Z4R*cdQ#kPe!L}CF#601j2Yh3-!kq4+aM}+^AM( z0I{I4^16{jADzXqYG`&F(ZTce)kPO>TvfDU&4_6;kA`e(tfGBT>C`dEgmbAEYb3D; zA!B!qwkZeN;;9kyC3bi_08c6!dgiH<4ApQbj}*g)Nd_Jg3|z%&t|&iiUVDiX*rCG$ z0l4qg35}cqdILid48y`i)<{Lb#tpdxblWFyx!e6>owR%n00UyB&@hkdXbsqchUm6Y zwGt$9hB%a$QG-i~0jb6ctA@&S+QP*c_3FXh$GQ&duvK0$M(CR;H2L&5`m zzTpjeq7_3^9wO&CMVGMt)UQz`RA976Iy)Tkj={5{pEOUj*vzFU^kZb?RrLp%Elyw} z^m{E6BQ(Y=6eUg_ByZ2WNh+J%N;bhbh$f2KWZg5F`A zcG!7Rd`4E#+~R{_WGli{9#&Qkd+d(SdhZ~lZV&};Ff*K>;14`txBm7OL~so8$wXAwOgSw>w23^=iKszf~R zObvbvLA{96QuS@Q(L}Q^2gi5`DVZ$zx^f)Kx598WhIkDN^yg;7?R9d>6RqNp68)}OX=xP%JS{h>cv#eWj$94$MzyXbKJ7apJxYs=lq}GCJC=PTQ9sU0UML%5~STp zQaw;4sz*bog+*D6$>qSl-D7}Ft|dR;KD(@|i+W@oTB(|?jH|mL__9sRHYVrptubHI zJt5d4qIrA-k#=sMRX8T9`eeX7Ii@@u)4HwUc1F1kESLq{0e^A5Bp5rK-1ZR#H zN<$>k({2)AzTT%pbJ4HxPWj7&Hp!SJ6u7*~O?g6Q_tNAmxooMFA2T+~;%=R#^$0DKa{=(F2vpX3{bC$%pexh&1+*+H1O;*CX;VQrrkvD!n#O6V zEf$V7URnz@G{&ZVjJjCGkkv8d_Kv zYO1i}@yaQ44snGlN<~my+4{Tq3ynD0U_NU?0-9DsvOZ9I0@(JAS}U@xKNJKLEjtk_ ze-P&tTht-*$^(d=oKLc2vvz;DuY8}*pT1!<=;HlOEq4N{otEU%?7t{#X4#gZXIgPS z%Atc44N5joU#;FyxisEd;6%mS8}5`8GJKJ& zts_h4W}uvM(pq6P$tl0MZ*=SU@ECf7BX1ndDx*i7PRaaJA3!l zOED!{SY(46imp3Gt~*9#xnMP`!OZ6i%3Njt8AdHx6;Jple~=YIQ} zom-g9^|xjN#eYDViLH$jjjf%NxvkCLk@gL!{2v_$Y1`j*WA}-w*#;qG+?qY#N`Jkh z+A10@r_(7M7hJ^9nuYavoN=kZ{1@+p3o@BB1EBxZC|Sa{TqJL#j7@1k;%4_24B?9q zF8X>51TA^E6vP}x#eisYW7Wmlr048KiOl|e1=Wdw@b{JTY(?tOv=yY4VAd3*n)ovM z84ak+5g?0k{SAyJF4c``O_NckRWBqcQy|wM)3>0El@pu(&fa~s;Xs+1%W6{^+7EwPrhSxBtKU- z6s`}!>T~B@Eidl4ZbZF5QgpPgzpsA&)t?xTr&_T14d_77f2GZTug@s|BcL6u^_^&J zoUIN1KkBmJ-`x4Hh?dE4(KI-zt0Cuf!k)u*!NCZxU*2#aSdVy9L$S+YU3$ggh@F5k+}0!QC~fA| z%F1=ZOpI|YxaX6KwJ%k)BEQM*NkRcdj3%+$#OUToTWE+qNU<$o&U~&4npEka(=goJ z%2g#}21KglG0qLfQEZxZ&94}yY{ubloXqmXS;iC;7y7(&idaEkfVTzWXIyn3**G4q zz++B;Pz2Ql0G&)B=a6T`3(`n3?GF=Vt1r2PM8@9QjL-wWBpx+AqYEngbbKDEcX# zL{O=N9PgI(E9=Mk^?WS}T6L10B5-ts6EoAXH@ky}^dhT=sZ2UrJ@zEK=2xlZSp1_h zA9RGxyd1~HCxi#Gb|WK)bH&XiVt(B_qs3dYSLZIQtf)j2!UgT9qqEV2Kpa>uZ@ic< zB`0zN5}goS%uXnkqfn+&Ncx8UGkNzp<_c!BT5h~rk6`B~$4c+koC}Aw$=p@jKa}e> zyXe6A8=;GTqg-3Bzn2Z{{{f+Y`noJMM*2?rH2O|X4(0~VPR2Bbwl*f_rhjwpzJ>f( z4H2x=AG630(@k^(Z$fKbY@L9Hmf!LdP>pa7Xu)AOtc1yiQIav7H0M&q>_*9MPPzi1GWR`WWwOP)h1%Q<#0VG*+m7sWF(dSci$U6)Mwaq%Q zMnE#bQT%Xf1{o;OyF1)-s68f`q-0<3I===7QZAXKN$aWKY(g;_ywL6kPgo2D8LJZv z3qS#@09GWN&jX$xTz5d~WRZ^+{ER}!l-gqha#1N%!sQ7FfmcyGwbTf~Fv?u;oZ?Q3 zr}2X6b1pAO26d_ARr^59ImcJP0*f!QS`6i~f~8?2D)q*iF~<)evLr-MhGkaThYWh6(B><{%D+EJOO}LMf2BBFVNV!^dqo$4?Y^qNe3ATzZ{C(sUB$NF# zqxeTplFwhf>Mc;%!2cVyRewV*&A<6xO#cbB&er-iG$sz_zb!8-_kZx~-z7uH|24jB zH(3$>7+?O1yhC8$)Mq9)I9>c~E+XKt!B9R}QHI62#j7Y3^2o`4#C`P?>fmUoL^L~P z$vu^Xy24*Ie1@MbT~ZkZ(;RKb@>RX{+JyF*kD66WHuWt4NkzLLGqXbLf>|+`Ro5Y1 z{a}eZ@R;Yh&)B$xhnKHN2F;(V^W_THBuUdMLyg2_R@vdDpypjeC>j$_FK96HI4Trc z1)ItrzqvC~+tD;I>FxuK=&GY~@kUmK&&i7HNT}0g$R`elMlN5hE|qQCGgGlr=c&_> z>|a;UC}}PI-d@sn9@10)#uL3U>Ot2=qjFBkJHoWv71axC>J~e$vNne$=UgJ)Zg8Oz zFigc8NtgDPp1bSd&aAQWMHCHAM&We^#g0x{iZXoh^QYr41k5RzmEfzjV%DY(P6@hi zIfr~wP0bze5!$f@u`Z5DodT{9jPeAKkP`UXqT!HC zQtlzoBl5c_UlF*WlFds)Q;n*UPnh^(Wfk>g;2l>#lg-9$zjtW72PS1zmTx&Pf8=;F z#Gj#U>?8?^5#LVNz1&l4hp8n0O4uw{B$x?oouNFb3Frnfw}C1>UhlD zrN$`my4>XNQ-E~thI|z|0(okPY77M>67LNK7T9kLSFy!SkzDW4u z)s-Z#@r%*(DQV)WZYUDMek;=UW9o+|FV_>h6E7dloI9mR2hUT5gAzh3`2c;C2}<|D zmZ$M{n3cfrjhBz-xsXtT2ac%13DYfpCG5rsd5VA4NBq58TFc-_;kL)TZqwtV^Ow&D z_@DH|FDLTs_Pg#(gZx(kHT`b`9{*|l$j^ zVC*dMjRXWje9@`_-deV_vZmwLWj?&JvqKbc4`@`BIIHW%SGOVkF11yvMXMO%HaFl*q`jc)O8mUyNN^Lvo?aTzOgJdx2I&15M0PT=4|IgXCi@z;JcF2&Ysa|N0W%YVcPhCTT%C+DI?ZW7 zxS9f?e#>nV#v}7Y0Z*w*!Tw0*wY;<7So=A8Nw=x~R}_Zzv_!!}i8SSQUHnR^J@>@H zO?PE+i?)+~^%J+gm^c*n*?fcwl+|_La$r2{_LVw4)8HCq&7}TTn^wm;76|l2K)WAj z12j75Gx$)ZaIjmXPn!s5O^VgP&(&1o8Yk$K<(j%H%H6@VV4LoY5m=`O01;d<%9 z?F3wtEhl|uLFU|dR;!N}LB)@&TGpM6XHPF0hm1pn-WyFB{G+r;WrElddl!hmCuQMq zlOyUM&PI29%Qw!zV}P;L6rIQw3SN)WC>J47GT{0Vp;0=_LKQp&d;2%8^e%3mNZ(;1 z^iVnq&51bn+x#dsXf)*&SfLGLuJWgFgc5QSd13*7Mf(>~nFJP*n^DmkewA9_=R(Hl zQ;g~~YXEs3j+;slqs#64Hfvf>I68T=vtMIK5~4URQ%j2vO-QpQgi`zhb;JQ(1w7NE zfi3Heh7}?+mnkoXPt1e{>NDno9$*A_wm%^)=_G{IJ|Pi0Q7b%Uyi`{hSeY-}XMo zB^u8b2i-C4t~p_@o(;dq%UAj(uPAt3_a%v@vMD|;aK+}rvURtpvt~yJmtL*<_NOD} zzAMw=XsYShWQFGk^Cr`kd57wk$|f-M94^j}VL;la8ML)7DMGlt|%FD!YY0ICmEm|-w_o3>%r}7`Hy=c4G#qSec z0r0c8vs-+B$VAI~PyXyTnH>Jj#QJyDK>Z(7gM+b&gR!F-jkUg;xwW(Pf0N3eao~T- zg=Q7`|C(v6wd)QgRsbTF{xj3)R9zxdP1?Np%Fgi&WYbUJI47+5^=3s7RCLk7Qc(=S z?)&NWw4IIn6h_8dqewtFGT(Ke0{;Ora)MhBiVe)TA1Y<+hc|7{@h%mvEnCnBacmks z#ef|Ls#z7Q)ydeRB8e9G9U2hcydVyVFCIdnkq06se>5L~7iJP(qju7+d#?^A3lcKo zofg(4X_q2Bi~Xm?ike{w5Mk+%8ssDcq0GzLHv|=Sqj(7BiB(>|ieo&kWgWmtU^nMn z1Yv~zn08XVMX@nY%XlJE2f56&*aANuLqbOXzNadE1-}Yw8a7sc+{`|i`&q(+79olQ ztuZ|b-k!y>|GDvGk(LiobseThlpx7x)F{Vlhf%%<0vDA^N&=xu- zqmEI}Uszn-Lja+7jm;kNJ9%TBA2d6xW}rVDC>Xcn^E~d)-}5I!fR{lYv~n-mh1#SjrTK{CD|ghD&g z^Kf6q$>d#YtzTY}JJ;ZN{$?Wo2%@ucRsHiEI~S7<=gbh;?R>W7hD8w6?*uVzb@2i8 z%DHuT`+`ro{_Oie?^R3DS)#UlK)iD8mHDphq&aZ7 zNS_R1CEn@By|w{-(nvHRB~Nj-z>L9^%Of}Nhv!H3(JQ2r=R9`XL1OU-p0aHsSNAL+ zvR5dqFBU5%6ulZ^^`M059>VK2pH2*P>9PNHvbmlI`G^YB_rpA9M?|*iig8n%J zrmShZNRQ(4eV;E)N^E~)(SC=X8faH z@kD7ZUvA~B_;p0Nnk^H7WcJw0B)UK&HYB-F_%2k_9MUoRW)kT)(p9-IE{H5FYjQ}l z2n{Dzf8AoW;1$ng3$ceouw_l+ny=uLkZ6~vWJe@Aa~(gp-W{*3uEwy%3d;LO0o$Ur zl=m9r#;FI$XJWpWKmb2rMBFieYp4*jVe@cEJ(YG(#WXuv9&$Lf4<@e`POS~e|& zX4>=)NUD~z&N7m4+N1cl7~-g3=cig?BJ&+L`ejE!o!Y3D{r3xGKkgrR=ehX3Jj2*M zB?{MpO1)eC7w_RBjz3ziGQv^O($PfBnw2YlSxmcbP$lT)4{KMFsJho5`v;nWm;bm~ zS~pzE(Hd$WW2U%eZ?f7H2u(#f9BR~li_Q*P>Yv(=GPA5_Q-KAYgqn==9rSkv@@z|i5g?bC>G#uc0pPt$Lb{Qik zrl6KMd%8i=!TM{9MUvjiMC!8*zP60IpA6@oMLJ!Ax7dRj7ul6FI|r^zoW(MPVEY-> z)9-|!9F3}tdHFfS5H(a(XTWb*N#ob6k*l3=2Y$AzlGBfy`42@q;I>!Zyl(tB+i)d{ z+W7n%QcO^)luGJTcj?B?DSSFU)`hPW5IR7HjzOFxsxXcS6T^2bXp9Jvi`!P;rKNv zM+Xsc#vn<2yFjUs7!qp2&R`}-hbBxtj$=g%So#KTZb3A89vl>{G<@R7Y8;w?ol52h z2qi^;;p|-f(oOqys4yeLBjxXmjeL4-T+)ju%r6R7kmAauQF0Cf%tK3IG+U|}Kn4Of zz;xc6W8V<;jnIhOEFqCAg!};9V8AVp5 zh655UN7PigR+1vQg+@nWhxzAW2@4hOy_A30R_FZcv^Ef7Si@jFK2>nM8oo)^_%?)L zy007MZVv${vh7HHp)`h;i0VYoCm@}Q04!@FWr$c1qJPQnS}&9lY8SqxA=G7}0wePR^j8~eM>l8jmOg{CY(N5^t^C)(H_sp$gHefb)mB(Z|pRC4ZErcC=1 zpfw95;hwEtVi3I2DVDa8b;Q{?pcKwZCITt@3rk04LZ)G|dH=0qqBP~N66}_+*ps5k zAnmlwo7V&r@&dx=X4BU0&{D;@!9#WdPMf0;YrBz) z4qSgmOx-*sREtugorH?;K+LWgHsIJ8;C~H4K7MzX6c*+Qe%lt(bBFS)_*~L%f zmh{zx)7#-X0@0JXFzAf0hQxi~LWT;SrB06`P&n^x_*2)4<1MAw)d)um z>`kj0ZuXH1K$m;CbP&}?8b$Y1_pcdfTq6^%!ryAL9r|BO)9!z3R$=|mB>2x~1ZgcC z|75&B1*ytEx>FZCmadCp4Lf&KShMT((pJObU>G<9)IldYKsb5?>ZGQzR+B9O)b1o4 zvAAu$A1caxOWPLX5_+ztPYIYvot+&O9e-Z0&CYknV4dTi4HLJepVWHZ$D?}#vw@JA zFO}+X^~z`?OphbFGam%6lbS)iY2XL4Ryik=dn+q1FYT^S!=`du*ksVG(h4b3rF-o6 zL@8kMyQTsm!#Y6+1Tz44lsO<2Twb3ugNJ-?m0obhc%-F1Q+U}m3gnz7*?hf{3Cx+H zKInNiHr7_;q)+QksIhnS;amsAIU$X-Z{CK1^-TEWu`+~wxuNTLq}JB;rUFeIfu~dA^sU?jyG#38Iyl(2npJlA`WVEWFTpR_w+=e49HvrZP^ zgY0Ppz%V`pbdm*qkqPRh-ihMvFzfkW6ng8FuyMN!vy3U!^*}@Xyzphjad;=<9);W6 zL{{c;wF_y|ALP*VN0C)VSyDh1I{gLcGHbBoN3nd2OwB{&1^^t=2{#sqL+xzPx1;iY z`1m@!xhU+QWMU^^De*^^6|ao?fZvB_2EAtdf(hRg!8`!9nmngQv}?##P(A^%%;>8l zB>6zA=;EEfD_3t-P^RWRL20Pk2wS!9ew%VQCu&%c)0Z=i&UQfdw9ItdKgp}%ppWwM zygj2kUL}0{h+Mj3c#t^vmb3RoJxUiQ=>ejp5KlggD~vA{zez>vtJ}ra948m!&}hx0 z1#XxKbX$1&h*S#9*_VMZ0#cX)&P+mrT}fbh=f!Ui1xp;0}3&O5Y?PNye)>2D3Ij@lrZ!2#0zS4zZ9Ht zB#-u8n!if|d%mNO4M-TVhf4Y`elI>M3rTxlof7>H8TLUCo>#c3G?J7dwSB16j-;J@ zV6+?Bd4F(t5Z((>IB7{g0L{s#>_-h3=gXGp9(4271E!iM zO09jpiki$4Uf~+ld8A=-m^@tK-DuLUOEex<1y?8O2K`e6l8xBB?E@OP)pu{8o5#*Tw%=a5u@4K{h*D)BmP}0W88xXU z5m}rz;Sqpdm*)Lh9BV)gSDQD0RsA{MoZ(>E04461l<*_t?Wn*=_m}d7d|i1T;a)!C za9;m(RbY(16Yk5*G5?Qb765B^D9D z5kK0kTP3HG&K2T+wTJ^s)da-CYWB{~tFcOcVdE8P zRXdn1?@nwwHxq{uBbbE*$Vue{Mp0F!0h(_3U#_d}y* z5tR})PMPvTckJwt*gen1qEvjnz8U&GsteYZ4WN)#_P{Qi7dtSiLklbhV)=IbQ;69G zdOnk7D#Qh4oc0HAi_i6y%q5H{jZ)&z?VH&^+)sN>zuXnbvZmY;URHW=}AQcm?loQP9I zUUBCic%7?;=Xme9{^D5R+UT8rr6Jm5&RC&u$8Ma`fmT1nf`C?#@}UDcc2n+FBkPqa zWa3ChR-hJwds2Ri4rCGEQ2I`4>Z7SU+*3eCa{*n$IrG9BoQo*M(dcQ6k=2so8Nykb zw7Ye1)p_p>(u*!exlHbxCy~rkl8sVmRnc2O!qH&~-0InJw{+>kDvy6G-)0frSbH`U zptb>hUtz8YAmW<6Fx)sed|)pq7zR-9kI!yRAtHF*f0Y`~3g7_eog8m%Tx~qn^@5H3 z44yW?%w=$Q_;ws zFq2l+TH=|bgVDB~YcH?HlQW`5WrVcGSlhkBXg+j+{$e7(SkbQRg*j|CfuEQs>AP%; zh=FVdr$5`>+T+ZnY^%+V{>R(y!qqvR%cNrI1cxH><-wu(FImB?>&&XaXfW;Mei2sS zGE|t2EnB?V{wl{{(nn7W-Ekloo2T#mVWaZUTbz+17RaB^2>K18i$N44)$X*?LJ^2X z%r?yViC~CPZl?W;LnNXwsqD{7VI53$^%0~5K@eorTEt%E!LlQb6J`AD(05TUibhe#UF@wIq)2KhY=ukQ z)ea$aXPpzbMmH%=u$a$o0VwWaoSmFhV4OlY9wCdKeDiJlj{d2_DXqf0qb4RLuY5F7 z(TT$YvvRcy076LS4N^j8jFd(NRA~!~nan85jYT+1zHRG>07*o=*!G?|PM`|4Lj%Wi z8Z5ie;t}}}5U0W-4B*!Bit|8zLNxx_F9dz^C}GKTKe~Lpj!p4BHd0OBC*9f8L0`Z> zBFAnR5Yq2v6QOUO8dTeK9AH)wVwz@0d6+CT{1g`AAJzRT$OQo<#J_Kt0(OvV0VLZM z@ro0C4FKKJ#VnN?Qq+Nrl$1lYc^xT%VcD8B3po{Z0K@g*Y!-CqeV`&l{~5j@*vP1Q*h=)e{? zXbaYFnNE7Gh=|K^OdQ+J%(&&zEv!zpf&J^yDUE|2b)MlAZ~i9oa&iGVMy9m zgG?_lG0EKkzcHb3V01Jfad;C&<$2Ub`~nww7}N>J1uT#U%@Vv2u)4^S7OG1(kDE6b zCP%cq=o&$aEgW$eqP7@mIiE=BM4->h{qcpXNjVB)>S1XN+jXvk~-CfS{q|&Y7gJe%lz)HV@|20k&%qYxT#Ai2Gh? zk-l{nDuYvG8+h;Q{c(H?xju&3&30uq^S-H{G6@8hCdJTbyi007;U^?~%Ub&IDSx}! zB&${Ty>>=KTzQd~ZvfyM%-5G&4b}&(*e6BzO_yeuqk^hZR$Y`J5)5H>8I5=D0g*zE zQR7kxcWQ^g)1SPJBgCCZsu&v9mrd*)j#JhCy(4;CV(gsQW6?QU*_=2M%!XJ8RcRB|Z0k@q$pU)-3*;G(` z|KTFK#c6h>5i4u-nW= zIax{0f(0zsU^6L8=!D+$-2cukJBUbYav-ro9Tu2Wn|rNXSDZV$JPwW5v=53u=8zux z+=Q%Y&|IhX!F^TlPME&#zH$)h#?v0IJZvZT%cm*pjpvcn-&a2tm%kpE+y!JOc5er< z2zQXrNJ@>IGa~>3`YJFkFM1;+??X^_^0C58Fed{r^%8%|~j?{`Fd4nWBU4E%+Hkk%E zWvT2+P8kTqHQx9C1A9P(zjbhlX0U+I!q|d83QO3-8tkD1d+5S03SgT+k=9`g$D@M_ zg2%C`)x(qnbQD^wwWot`0{jaNKBiB2k=)Gix!V z-;xypYt4#`ZvB;ATE;5AeV^X>-lrS)>3?mv`eSG|?`y>@ukbY3RYpHGs%vgbJc$|% z?QsxHqCj$0H?$+Z>kRG2h(3uZtO825>)oQBH`voMM?!zMZ)vILG7({2AqaEpfR`sr zv77gXbM3DVTss2GS#40x85XgCM@bISyb4=(34^myEoXYs=FG|U(#E{00y=Bw4LB1E zs#kUMj>hm8{vG`T{=&Z_D02+|jz;izRP6?S_XGcpW5&@K3Xr|V{#1<@!H!Xe8kmFG ze;~Gyz(zIL5R44I2IgW8^#O2hqTW^#Jw~Ww6RJ$}XvA^#>v4@Zu6_kBbEIt_ws8>i z;a9tdACKuHYuf`)`vn1x3cyh<;J5%BR{;JM)4n@t-#gs*4)+J`aP;Tve8(n3s>`>O zTd;AY=fR4iu zA4R3j2yxGm3f|~iSRStRjEJiv=b0mC;zA_ju&gGo?112LuX4Hwgi!{bR{Wy&GScpD zA$7jf`>Ui5btFNTwr%ztJ30HMot#?+6u0FTOwU-BDNaWk>BRv7BiY!H-Cd&$?q>fl zRR;GiIDJbYiQ3CkKhAIqd8d`)tko`|9pS@?EuZU_Wg1= zzsWmz1~#{Nz;x^{8}Tb(ug0-n=xRL6k|5~p?<+smL@f+l4a@voQ!`Er*oF*_#T5jt z9|rWJ7>g%SVZW+uRkQTMiq+Y%I!jhz%POo{6MI&+Xd;6jy8qI3hi|O)nxen|K`ofD zVRAWGZcIVQ{33rxS3((<3J+fDMC1yfopfvrfRsc8bFKV%xk4IuztdCtw4&~Ej4^)LH_8nqt~h|i(>7v zBqik!$xSf=lRPO>BYC;FY9}4zp|d>;RTEJ=mdLLqYU^U9N>Q6vLsf`+P$BB~;_PM> z`(?2duBX_#BQVkCjCxVag=#y=RB}qvB~O@}NZzrfz?OWB$LAuq?8P-zm4Y^Jdby&Y zsS@R?I|a>!q6E#i72#wKPf@!LN0pAysC9GXv0RED&mwCj*gF(Q)%TejrE#iQ_bZLE z1{6P|*rC;cDoo-|r<#LL`gzAnx;hXN6keqcS+ALVmxP%hw6Y+i>m(#K(a6%~lz+88 z8f{pd(Et3oG;pH-0@}-J?DC;(N=NN%;T76TyTeF({R^iauF>97DXyS;^NQOP_L&=F zt@5g}PUXc_tbdO3D!Qif`WGeTEd)@ZytI?YOwg2<6Ec+7zi6bq_TH%fY~__r>8PD8 zJg&Ur?%d3jzWg%}qX{11%RX+O>el9vPaxZB z{?Nu5M~LTR?`o6Y_lGa&b{y7cal+odf69KO-ykVGM4hdc%OuTB1uUahx)&eN*;jE8 z?`8HT@F$lYwSa4S++s;M;1^+ZfPK2HSKie7MOXYnw`)s%QEplhnZ(SV5S_jc4KD;! zH)Bk~Y#I5N<-V<7$ftKP`>b$9kxmJ=raM>K5u2FHl$7As8y0hV!*95}y0NjDGwe;d z`fG?*<1ORDZR}kyPo9JqfpOwf-tRDF;quaAYJ7*qUy@T3y~RZEkA{=?#IE2zCWvaM8h8op&d3w z!7=mP0D5th+}D{l=@WpxU#mff(Z(fhn$tqiRRE7g zs4DW;>sM=dc6F|LmW^&!DXJ!{G@)joyP8Xw9>}0b_zE5#_7p>01%SO$%E$ zZ?ZSy`c%ynv71}!p&@UXCV7H)t$OmJRdcs1ZF8-7d`Qe6`Ml*l!qOU0PXsg;d?IU4 zc;et(L`<-MAdvHZn8K{7mKhJoJIyLIFC&yQso>=?aVV`Tl*r&)l*Aa*7E)gcXc*rdQM2SdXR zrM|?k!P+PrEfEv3V#^MvUz&)5nlS_W7Jj~Zy6n5({zvrN%}6{MzmhNIy0N|<;JZ8j z)$aUth3<}~L%CkH*U8;Y>HatkBw4$7YWU<6cRDx~%_9RM@iIKcxeA|^i_LJu? z-aUS^!E{1Qdk1rDtdG3qRc!Iq7Jgr*RuC^}RHxxOt#H!nVQmQv#p3zPB@BWGxKz~9 z%Bi(c{_F{SmNjj_ih$(I$Zr-WlZ%$zy;22nX$E#(kExWZt5-+jRdpFb!w@~arJB@7 zhnKa|(=5)RE36_6dA7Lp`lDv$vV8I=I18x$$6nkfD|L(>?a>vpN#zx^ ztU*!S;ve6v#TRL)=Bs=ye2BGdy-il>ICzS2#Bki8%ua=1D~lA(5ymvylzWLO!~&BN zAqK`LM27lt6S)zfWRAXAd=bt*89!uh6#3&%>)~an!J!}GwWS&qg(x`LHG&`%4mH{_ z1-|ojYP3_MMxY|=z_}J_^{Iv3Dd|BCcp)w>;Kqux;}F`eNo)7(gtlAP_s)W{DC`1U zYt*K& zoBP?E<@_Rgeg`3L`{xf}_vAq?@g^_du*%5+67|p%Qb!EFx<+57jE3ydtHZYhcIYoZ z7ukUF3?ESBC_bYHJ`2*%bp82ftQ!IOxu4UcPm&Rlz%fMOBBUn()JLrFD8MH`CgN#} zQz;61#z2-AbMl;XzoF!%ZfS?=^+ct_-%(HS+*4S31!1nF*z`P_!$GB|2TGo6gYyK5jGm97PqQ_Qs4AzbfaTs6fjb1w=vGjyH z{$!wZ<9ShB&qKa}y*6lmd#I&KPGK^aff>wssBe3qLZkd=1OvsVy%IM5d_X0>Czy>G z*I^Sqepm-3*WSMWVwgMtAJN^uTTLa9{jmyA%e8cO;ZuEE$>UPkKu_I zC8&y+d~aV*pNG1#iAK@#Rn_bk+`yNRfFl6#iaR)vHYS6nZ+8{CBoZ5mpcyb6R!D_z zNZe-lViVmAiXRa{ALHIwLcCwO&pr|Y5{52_g1Rn*qJT|4x@4!{bF~&5OcF{gYmF)V%0VJ$73!%4GylY+tn{ zDCbaDbZG^0r|+_8XgRfw_+Xld{O8n3sIg$;mT1yAKnxgwU|bu@&Rq-WnxRs-qO9PEB;%`-P8}Pr?iNI*yEw4#_Rg zv!x&7HO0k+Sfka<7)$x`2tMW3qsJV@t(_P7G0Yu!2cX5t8)1M$SBUrW-RcnHGD1TJaaxJpRK0T5czuo)2<;Cd+xK`AAgdI)1YySt-r5=jLzV0?cBb*v%9mq zH3lK~XGt{eOPqa!Qw~p#vCJr5GZu6Ty89hEvCe*-Cb9D(5goj%C2H>)TpIEOU34%})(GW{YJz>KF{BH8`Vvh2crNMaDDUiHkn{QDJDB!v zzJhr-o_QkqLGn;U5j!FFuP-F;c%p&ObLC~Uw>j3^BI!Q6!xMh)!LPf_^E{DrkKJX2 z^pZcsQPdyczFz3RzJB!J-Qyv9nVdtbB7qm-S->zT{36Vt876_xqo;p9o%m6n#2Yk+ zrwOT{_rh#a6NsDU0cKZRfFGV!hW$Hj$ZZSn)sHA_6`pC2(q#`X-}$qb{vznKL-AIm z7@8$=kCw2Xy*qq?*Mi-<(eHnRMwwA(LPxc;xp_v8=*j(i;r)AC@bAV)a2dksNxy%; zt!Ts810VH~9Cvb+&!1bZJfkEofTOarc%tanxYvTjbxd;aH(K!po3FL?Xurg1) zKqrwmXkgFUr{Cb4{?0G#G6E&rJU##fNOGAgNI+I2uKa zDWsm`&He1vc`Sz=4B&Q)$pNrV!AW3MFQf%5RhUHx6iQH}?Ee5zO9u!Vp)@_i9{>Q~ zlmGxwO9KQH00;mG0CZatM*si-000000000003!ep0BUt}bZ22_Wi2r-GA=SNa$#_2 zVP$MBGA=PLG%jsvZZ2wbRaguFq&k9EjQY}5^#K$B?7iEPBR8@j_e8In>F3`Fpf zl~q!(khHo=rB+>3RZ>gMWS1dsWRSs2GRRCalRS28pZ8%N#%yQJX5aQ@ZC~~qX8xqV zWZfM=Tu5fB)TfV4&+JN-LEPbR01kJ+;i%V-{`Q~#*T4OzfBm26-+w&1xcCosY}o&D z^j^#c;=ldh=~2sVx(|+=qaVbT_z=vK+2ZJzC|FGAM?WV1T+G);cm9Xv=o0_SfA7Zq zWB>i1B~(3|&erp!KUf_7*Z=FN)o6UMIU(erV#0PH*!b1|7-Wus($WDXXKnOCpR z5xG%1%-mo)wsui}S1j^pJdSR~VlDVT5F8ro}czF5zqX?zq$ zaWaWcPUNpE#$iV~O(VLB43-yQ-Oi)May~ioO>1j;#?&7IEhq|#RI=@AhNgDlXvs!ESfLY28(#Td*NQx zdvz9bqh_!^FBP$6172;W0#rEumL>dl;@xhyY*-`;SZLh_{KI0NO!{VEwGoO4%J!k; zC-b>jyR-RpF~yd-8IBb<5NT?Pd4D;MCX0-y46w>49u`H@8bu+-fIk4Jkchq~_Xj@5aMts}_uWk2wY$A(? zE}zZPwHdO$WdZVZC-az1s33qh2a<}wN>~Zph=LUioMUy?Edp04euD7| z-OLkK>f_QNlj9afErSZ!fDPG*rO@xf&1Pw`02rbF6X^c#q{n735(txh==lL3>z*H+ z_uG9y>MeB_4woS$81bo2FghQ$hmZi{Cw$r+_S^|flkKA_JDu!IAV8$h(?eLSAREVew&w$- zJQ4FT9+WW=0w!W=dQdbyZpYBFkcZGD{8p#D89>u4AWB_y^fnt)xzuEqLp*e2$VrV- z6@YKI3TO(1LSD{unESe?F}=oAxp!^Bxh(*Zz8==Lu#kp8jeDa2dhRfhXj<)kBn{Qb z#1Y53g5hs3?;=aP?kclkSrU+JF`bpEpwF8aJXsWh1ts)5lj!>Bebj%knwf^#@h&dh z&BaB1^HD2{;~E+>963HQg+vCx>mnkJ!H znqPT;(x{=iL^Fv^kaiYh2iL9nAx{V3Hy+0Mt}yI=*-x_ z+7__R4#A2bjC$?BowNxwiKxJhB{_hm00jw(;XFAXLxX5ILnuIx!}%5y$g0gT4mTom z+v6f1uIp*Eh>jp=TeQQS$bu%iIq2;7uy*W-ORoLx0+`DKpj>J|E)RimxetUabxRcd zwg9bN0qp=>`$Yr@<5p6yAleyok_PP$T0KM|6)f1k>M!C+@+oGO)&VLnpb>rrD*%)Q zi}}!9OeJmHufh0jx;zr|=xDy2Od!S4i>v6!umdPzTP87ooEcNxEYOEJaAjR$&UzK1 zm9uB!kMU>o=yI9N6~AX8xAtDv1#!f=?Xhi8nRY{UfgHeY0$fmOsj&2%UvvWE0U=}F zisx@%r&AFcfZTSG`R6>34S4)eBKtGCwSxBlXbUz0`O`wNM4U9~Z7D@v! zQc^_xxxJ3kgFBoi&^>?qkN;{|z&Bv3U=Zow&E^&b2k=dou%N161;>dJVdXn+=k9VOl+w$i_l$%)^E3)p)NkJqn@%3vofx zaAvxLXjMe^cd_3^Cb0pGcHRY%)2bc&=V3dvc}t_Od%N;%=u@ZFV{7SZ_O?ug>M*+$ zX6GsG(^BYzJoK!$?X~?**omA6oQIvbdkQQZC2OceP@D(gKr9TbxZ64q&q~>JjZmNE z#gIycM>*7yBa195#8SNwn8;H4N_zn1vM;*EGlQ89rgK;J!&(g0g98h2S62O@j$7-v zwTxR+oJx&RnBKw4RW_AaMXhBN<&tUT&${UBpyM% z1VdWXVkq8snyp#@j!=(OQR`Fc(^{#>q$rZbz;%I~W8ESr%J~qwVaS^n2qVMuW~b>j z&WD|bH_WNQh!5*6U~8H!5O}(d+iab+nEX2K>BC3gF!^=dvu_@qGWm7fM-RXKmdUT< ze%pA^WbzB1Z<-GoeS0W1yR8S`LZteho}T63#%W7`n-3e!{M&f=t^PJ1JZi}=3f~Qe z!fUF8SH;?lYGV*!?Gc;vfqBVbeFr4KB+SSQlov3PSZu-PwYiXYYa(i3;UMq% z8|8gN3lzl0kO5=S3$f@`jY_yFYN6xT0;^_5PTz7&;gGvFaN=4Y$5$yu> z1EH7}o4lWPFLa7&5f9Z+OuHY7X%SibX?H?3Lj*)C1%fr+ZcCk)BE-0rC3zIz^`o04 znm>IyU7^$-S3@MHb&UKD`d>{Jz|kT*06m}cT_H?$wOfIO_IaXst`0M(=dw3J5b&+t~+WM43^Uwmu0g{n36-gd4Acx)RS@!kOG$*KA$eKCyNhJ zAD3!X6Yx1&Ccdo0lxdG8sRoS9fo`thyJiay;#=M6LH~-sGncSBEMRGP>^2(Bj4#9Twn)n3dEADNJzEdU_M3x8_{so-zTAP4-dsdsN^`cAty?kXQd4=iA@ZrpV# zz=BpUlF2e^??h|rLRY-r7F zel081@UH;=HNV#Iug_QQ6~KQDqs`6a6mIfMR`$2}Li&N?HTfiWxA?SO+5^3|kb)i< zD3kI+D0!h{E;=Omx`Nw+k;~_{FI@q*1L+F69ZFZk?MS*}ZpVNNmAk1kH+0^H&f3&D z8#-g7B<)Oh`23aqolTClc3danVqhCb|LuP}GHfLa;OSve#;n@1vY4O?H_fyr?2!eZ zA$)dNPraQ&JcZ^WOmhl+=EQ=}*xF+)RTjloz&xU%2?7X6RgLyH=Se%k@d(`?^S&8b zj$rT1*m|4`f>E2c>&(+yT8r#f4PcAxAtVC6sTnyB)rNlL@VGwM;$9ZXm`xONSa2Tc zasn(TIuG;pjQ}ALv{XG-?ubhD;ymsIJn}*wL78R!sjvuGaBo^7eG=Vpa-j5rogb3D;UA~4T!H*uT+$pkJS!_PvsDW*mA8hUQUV_(nq z)%kV%T2refM0Br-TrJ%wb(0XJI{2QPEG5u9ux^(cxMLo5Oejh19$e!JF#=h}8}cO! zU9niqajBXvMEZ7~^plC+s+1>6Fln=#hDxx4yxn`?(FUrH1sFMxHk(Swd0Yz+orsxA z1PqU|A8@?c;Gy7Uozml&86!VcPK2yO0wLIH=uibXZj8!yshCPVAWj053BfwFhHf%R z7TH29mKl%f2tmvjwD0p=EFxzJy;O^^fNl19RTJ>2U?-jm4y#iGffU#rXohAc3Jffe#BP;5HD@D<8ZC zhMO4cU~;Q|DO=yhcq5pm)8*XoWJzv6TD<@6DV3|ampm||Kq~Hb?wL>AITh&6p-9%p zfW8dqV}OqVz6|goU|X&g`3A$o@}Kfof~q6i5s;J1_ z@q|fm7(w!U5WavZ{*sbIjLz}${6+f(41^bih!(RY@A^b(~7x&nY!u(NnH=*Z8_ft`g!jt)eSe?yH`8WwAHlpBH{&1cNl0Idgeh za8nF`H>F|wM)%V-9yRN3HDAM5_YHOoVdJ%$C}9+fWxDXNz}HYr_jyl(0zgO~0aB{v zPJ&X5u4?@R01!{hG2bW`4t#9*TM$+wktLHpdj}*yIzM3tEmM(o-_oLT{0?c`JHW|X z3-Jlm>Nj8qPEO7^f2XRHE74ECz#ljmQYU-cId`pUG@4~2J0}f97~JADs?=BzY!4pr98O?%CX#CfG%q> zYx05>$af_MzG<~}=1P_&tyxwj+sR4aHwV786~*}rqE+T~4I3E<;9CN#w3m{ZB~}X6 zb^ON#OX4Fn^SgczSr8hboQso_g46IF2W3z{KP5Csb<$uyX+Fs#mIYg~D_-xiqn=%d z!G0Sg^B|49Cc~)*Ke(pAPn5!R%rJa`sBf}lEc)Qx0-dd2+?p4mZCz~ZeGrlMG^K9% zZ8!})_@m957&kL)sRMjzT|`j`4JvMSzZp zbd9H1k#tR$3*~@5l&A*!QJVti|-l>2)-J22`EB=C5Il0Qr0k#A?Of;xF{sJNOlT#(sj|+4P#d zhu?Rv*avP*mSaDf8|)*XgpgyfpP^Impv+*u@ZGVHpKP-~b3B-Q_2K9DKl1utm-F<( z?0#+ZI;LxPEOK2~U)B>=|La9oGtDo$!ig`!-tEJ!wJCh3;G6e-(YY`&S@$BmaC`Pw z9q=&tyVH;QC_6z`#{%z#wHai)TfPqeq-~M^*e<_;@u!9nu4hC^xv&;gdb35 zv0wS^8}SAv_Nz&ZWP1%x!_giCXZmk|bSNxX`bpqe9l4ErVVd2)GANQA_`R^eabeZj zU!e2n)8!;&U-FrlXVJ@aDi-XM^t=M1AjHl9`*}7~1I(v=GI1r6RQPFx^BJZx4w&h+ zgQL?kCesOwTNNb7whr{uGZsAb5I);tU{Q1?ht|eBvZc zJ>!cwj-hb$IMbO3BtBRS6vO+v*_f@4j3@I%q{i2f2m+m0j1wR*-q$plD!u(P5`hpfgglQhn6s^gJ}N<1E3>;1NMwhekvv-C$#aa+sL#vZ#m|Rb{Cp@kw2-A#i$5?d8cN=>P@t~z zs_`xS3HbBjFMz-BV%2I~tVH8t*?jm7e!po%7t0oOK7E_?ZPE9Xz7OboM&F0@eMH}H z==&{w1%6vGe$U{0s!D57n%1|y8v7@Lr4DQ;za3=A@br<$#egf;F}ordq~ptZwzyiM zIMAv06V`_~6*Iqt7!+9kS(?Inu;MwLi?DX#;ui>Y)V*+QSQCLY>-^Ke3EltC1dL@{ z*s}xbS?KNY|KFwmlXPiiOXkno)^P2bwGR2vDf0fy>inYb@W0WSgca`7>mroK|CQaO#<^! zsH1{qty97|@ScS7TjJUd^^V+TlKdR>q1rszzl|XiX1TVLfaw*i7<|_7nL}2+!SaXm zqHDf}5@^Hbce9T%JLbX6#3{nBWK6-XxORWqwulxU8in4~hjIsR&elXrN}J-iGU+N9{-*EF|(+Gv-awN~&D?;Vlbw zJ62}Wje86}cC&}qkO16j5PEo^yu47E+)BmpPknv^?Lr}$%e|=&zkK&((oZAYs|u%q zn~Y~^gqu+UTZosKUPc1Sh)gXrUSD6k*Qf4u-miarUx)n7W<8c^zIZCKB=|tu)=O0C zH=1tKusQ~$0%_=%*FQoKemR#wC=Euz=7P)mr8@Wv34>{b$(2Dn`g7qXlSwrH{^RQ( z`PYxHJP;~p(UAy;+-Ms0^RL;Z;E*UzfDd~%NYW4jToRF8KN^UuWIE@@a-N!BC{g_j z0K_ub@uk>o^wom=G8p8Aq6^)9!r03;fJyi2d^fx5^JBp1)i~wVCINmwy`vq~r{Ihy ze94~{dlQf2+ za@Pvss)_o0%GQidtvY-#XEqVDkJFu2Q+sh{<0X!~tF2DxHRbq#WItOaC5f^QyhC?l z-f;AgG9`ai>+N3&D}bRohjZ{nFig3Wq&weHpXY@ePtA3~SU#Uz}L zO>5J@o7XECp`zn^rzigA8$C*bd^6Z=KD4$Lv;-E2Kht4C=_<8#TRLXR6Bxig$nykX z7RUi~mS~our1=R&akmBg4sxHI>;=iA32RFokyV*DqSQcFa+M>FThjIh{=TgD+l%>H z>CEGq(G$pa75%DasDZWs;v|Iu(~jNiISd`scXNtSf1a*bb*rE0DEMXp-1onMR;*HYRpUHzWYU_O91xebRIp!Y({YnhnualvlHKX{J8mW^YEw&#?VUXKM=NK)=g2=Zvr1>D_MSC2XbYeQ+^Ka4B+WzmOZb zNs(u?<#zNg2}XD>k*KzZNd_%mbG4By3q)k1s%|t1X^k=yi|t`hH9M&wQK%Bs;`K`s zUE}#aAaAx@MBxWaY9@eO4ArM+3a5d@XL0)~LtX^fEW!6@>LBw?!|qDOJE7!L>nJZ-)VYQ(z+&N^7AY%w$U!lwt=grL~z)yJIM4cf~=P)W+ zAb&#ovGDpcfDSUiYPUHkX^EQ5BY#5rQKa~G?g`fS0_J-m1B7_6{PcZ=38sg#cO~+> zoYan}SRwGTk*oH5Ij|uyQED1IyCgHHlu^a%KqE7&Vzpx;2MVL3MQ~XRunH7m4!?c) z1w6Yx{GxI@fDbPCTHa?>kX9;4|4;>{u0b6JQrDEb)M9^N=tvl#{uYjBf&t0i0Dd$0 z&EOYx*iu#`Q=ncUXaElG2Se{EqC#yz_z`w23(LX8SdN3b#-g}-dnK4awm{+dfaFTE z<+FPX729YYVAUDjSDeyp7(lf(4%~>g5~2hZ%_?x>aOw{m$Yj-g6h~@i(*d^PtCk~G zxML1|0{oTW|MD+_MK(^s;I{+G&c_9CIaY5P^Vp}vR z{WmqK++F>mSp%LoD&c)+Ae)xRruB=aCFs#jOY){Ahnp62vu}f#(UOf!pph^j;!aXG zTeaBo@Yg|C(eAX|?xk$Eytk3vaSLBAl=6x%GYWPphS~5Xh}cN$Kh5S5UdcXaIp8ou zGX{d$&bhTLL(YyHvuT!Keoy$>GzIpeoksD(bH0WDqH!D5u$0?ifjga4E46NYDfS`A zmgE6c8nO^l;)Ld;Jt8?FO1-7>qWQeMXj!-SXSsv53h)kWHU}zz$dT*84yQ$iJT@C3 z+Q_3?z?_HC>TPTqj$zqNeNk=hIZara;p5|{An%L-#gk^;moe?L$k^gS`aLC-a~_)! z=^=}%gzRQZUk(ei!CDr|;9p?jZZHt@CkxY(OCIrbR%!c5-S&ZmQVa0UIYT|{m_wK` zkS*e$$XTibuev?NS-%%^%2ZsiAJ=536lbwv_f(f`4mkQWpr@8)5AwoyB3pT6upimf zky!i#EI#4rKnLHyhvI+zfA%0DP-t0&Vo|s0AC8`aNmAD}`j+JlyAKt{9{vxGvGm^wW9bgY%pr;$ z0Z^t82vbxhMr=q-Hi^_AXg_+?0?|9#gpVJ8vk6cRw<_XwetAwZ+x?1EGR&nCydw?u z{xOOQi=*oB3iYm><&*>y3MY|LHTwQs>7iW6fL3xQV=nR%rnNnj2T8(>;@aGp> zEbhSOZsXAzqU^j$X2J%vADubeZQ<`@yvu4Hf}>O=l)1HV-6fH}Xb~*iS+poG>B@YF z+$g|eFgfY-;StNOF(R>JbPE{?xzzDBu6u2|x+Lavo#2U3eq}!AR(OwC;5}rhj+}Ze zHio~s_kdl(Uj}~*@LxgP4Jvs>ys(RsZ@KE71LQn^rm4=K(3;C4wE?@?RJOYMg6$3= zWtIf5kNVZgEnA?oCSu33l7Did?7G=L4i;k!lf93D$|y?<0a7MEe7cDc7p8^q);&~- z=c7KStbPYPp7EoBD;O4K?PRt}mcrV3Ej;Y@d-v6Z@mLxCwypLSv6D-99a|Sa7(*20I-FltOJ0LFxJN%Qn2Xo1$_z1rS#Nt=Xg&!0!-#lUig?YJE0?IA6tud0Y%}19r)U-2xv; zarPK*Afg=^U<&5kmoa$56=PyNzK0HD84qL(-f+d3KI%5u0oqOpWlZdZ6f;1P&JHcM za!KNVsH)Ent$7H%BNG8PR8cW!m7X57mzQ{p=%fCa~!K{ zn?qs?Ef7uF+M5Bv0_P=~aM-d5x-)PC)s#1Az`q3l70|9ph`wv^0SOlAY#_WfNtlJ@ zjDrVlvRm|KnLOsRNI2^5q*B)qhx~g{HvK5{ast&4QH!6f8%Wohty<_5D-6`mwbC|K z5suEKR9{sh6)YQ(WbZ%-Uc8!QNf_<6g=nmv80R4QtbhhQ#$OfEF<$jC*q7U83FI+tsD07=FPTl-ZXuVc+QqGooB4Cs>Kp;0dHE(D%Sg0y^v_Ue9b= zU$r<|6D3tB+&~Cl3N#3}K4e<7L?TNEf$6kw&>;fLkAA$PwX%(fO9R?QTuhI~(PA(S zkN)cBN{u~8_7!^r^VgrQ@-tcOZ_CzA{#9F=b9Pwu-B*BOn;GeMvbeeTX*;L%diRf}jhZhd^BVypPM}NKu24 zqz<@$Hz>l_DtwJH8D&Ng9`?4Q|=+)Hb69G&?8*LO9-^hed{~Ef z@&njs+f}9diaFhlSc2-D}kDi?vB_xr`tSkdHNOB3jwP3cJIe zv_LMvg-sko@yA*l20i(${1lDhl_MC2$V>NzFuWAt<6{IeMXP*c1TsZ)dSe`gDU3pJ zJwVqPy3Ww`u*YpE>|xJ|3M*E~t8^d9m`6P)F2|Iw)L*GOFcBSazAL(T-G|c3gCc zH0YjJr){NUDcu>OW+tcEoC?;-R4-7f9PKxT7x6xfib1)-0|>RbO-biYv$un^_&}US zNhx28&P|GxxfPtdrxeWx6a#>BgX#6GG`*gv&F=fBm+-Tyj0yhS=;|MwVGK8)kM+n` z#mZF-&wzUSGf>SwG^@Tp1MOl8+IkKSU=Ai|8UyDbPLE;+7UmDh(EBOR=itdnwQS=( z`I_jfs^vi3Uns7%9|y#CNG7j$1}*6~NpdiPwjtXu(5QS$^I8Zwf79~B9wFqF7&a<~ z*b~DW;Vi?c2H`Dqwa|5nu2Xb9K-U9wouTUtT{N?Cg4+=m_egpl(L^W>$6r+GHWqKk z<*4r~QBgVSz2Oy;iA-VP%9WOkOkMI8EH$%Tn_IK)B@~EXn3=P#ZRg&&txWc!b$KkU zZ-P`{Re*hMcmoX%^t+wX#IBH&OCTk4p6=E=qIy%T$h=gPWUHSbpaDR5zoRjSAp^4B zg{+m-POH4Lpv=vIc$EXRP?qOL-3+@b>$OXRK=t@vkf;n`oF_Zo5pnF0o$ibG0tro{ z?kKmVjvPfQTDR@c|LXM-!t7>eQhbtK4Jzd6Gh841wi}&~QGP!d!FgZ!{B#v-+Cj zyas6+Cv{sbYSIjtGr{xV6m_@ZyGHBuCbk5_6AB+)%P?A+tb;sk$ss+v z;;`KELC0x&O-q|yeP^1B+R|Cnpjc;FgKDh0Nj_WpUl7CJ@(nSsvSA0?;d~Ub4;kEtGLnL=X3)+iQM(E;{d>wYP?(*XIeiZ@e4UIA7yF z1aH;e+rVTu&TqhbL*5(U#ZOMw6tZ?O2-Y&RY(QCVWXM*UD!OsjZPH17Vx5oW5P8aP z*fZezUhrZ2hOcQmg)&QXuh4DRcA!Sc4I1TK*`XRcH#quU3hH4wa#26x8GFIHH|#09 zW~-jHm6c*mFS#rQ;Qx-x62SRA&&&RS=jHwhoC`5ApVS{%>_`5fehQfX6MI9h5L|C@ zBgF5qpWxU2vGyJFoj0|YJ@$cj6Y&4QhT#9c$3CKZhvZd%!iB3yva`2uSIk_weMh@=aszK?tL`W0 zE{N~L1XoG@a?KFu2^)eEQxl`?4qXAc$cXC(W$vt_8TS?gNW+ z!M6e5<-5OS*pqZa(D7yaimze>blq>f3W|y7n-tChm?=3Tk@)BDaucH zL2x@aA`Bvi-{Uao@R>Fc{iFv~aYd3Cy5tbZ4xIZelBhIm9+iZIOe|gnYl%-KEVRgdyJ1O;L8diTKH&K7=G6Dvy!Et zPNch*?pE(!$bbN%5UyYOGYp{h@R1J<+?}mGJD;|vD9nf5X^+T0I;5t}Gk_nd{0Kt$ zm`!N~0FQ&c&M+OvU7{%nQ%JZ0=f@b0O~(nGX9XYhwHX2-rXGrPRncBmX}PLYR~5;s z@CQ~2T~%7GDlJtNK~=D9>Pui)@el&>MZ6e1N`@fN=NwUjt}K5?3dC3loa^xg{lqW3 z8A*-M9q7c(8SJw!P4vN>+-ziTLI=vQQyI2qeN2bV{?eRx7cy-h7q>npE+S54#2Ome*0{sA^W7mdse)RmfHM`=pMgf?ZM!s+{{5 zmmPE(<=1)g@Ikac?CSQtRh z1@y9viXs_V?$U)e79cmYar+Q=OLhK)m%PgOZ36w1kS6*NuW%%&<5k+I<7R>v8bOSM zg01#Yfi|%Dh?QXD18iAwV~?(+E+VmeKqu(V>U2g_22B_W7cC^>3WX0XOc#sknBt@p zqS1095=i`|^F?$}rXnx>QY1Pkh0Y0({7DY2#WbEzcQgd>@EM>uCQF3o55(o^%B1SB zEK&l^=&Oon3Vu3dgu>C<<6haa6^D!0vAPPXP6w(6vH}sZo@A0m^M!~PJ4c_$SW)@- zA{+1t3dezh5wa@$`DOf-V8Nffu_`$ir8@lx#zb^~rFs7a1=x6WD|^Q;_l{Ly7JpPK zXt9Q9O9*~V)>#j$mlGcw?pUgQd7pjSV4EMA{RpH8J40K(g>mvDjg!2n1NZK=u~KaF zpJZ>!ZUKnrB3R^lL_5d&#jUd9jjocd+jhXeH-kbcsD9zzo^Cf}p5tL1Zy}WuZ#FOW zIoVL*xw$-*y^zhO}*59$5SFn^FEg^UoIzXExlwo^@Fr)slqS8(Am5zm8j;^333tT9xs%Gq(FKDm*immu{XXGZ6D;QIzo{B$-CZ7RDoMeJP19z7^d&^lB=E`Rkr z^s5Y6p5d&T0Zqx|(pt|u-HWAS@XUd|p*@M{aw*cJM00j1-GBH!Qid!29drxLH*|Y+ z&+!hrMvn)Ult|=O4BocV^ha}1$jH!J(C``YMth)Mjg`+;i0-Jj*}N9O9gTXZrW)vg z7}!4|RDJk@(2ZmwmgkJ6zEh9v9TQ6jyfa`B-NYBu9K9opPKH??kQ-%W*)`Oz1mGaJ z)vx4q-A2v%?QTk^LLJ38(n&j15F_nbhQ&^Ew`nTSJ3Ibg~Scz`3l_%I5 zqGhsBCyTZozPfzW(5h%9-I%AMu)l!PhfJV$?p|T!c%O?Yj@Gn*fy;6wW_$Rp*r0qB z0LEDjKlH|9jUIZe-WiZ|NbRErq+}zcl#f4kj{GR(B7c+oTeL$H-ggeD5AJvuhA90b zXnQiGU+HB1aFc2jm6dZ{J1n#;1=e=GtV#V&A$f%Z=hTu)_$WW1)L;gi z4QgNRl_QN7=uknSw4~mX#|fAdQtguS+EWe1wQ4Rx`OsN_F9L+fDywVS+?I!WqI|lE zsxb0^uM*tOE5}vK!NwB~KI!h?C#F(XDz9f@V z7D~|lo*plGHW2e?(=al>ePj!(S9;iPTec;zKW@lmRmYIjFE`Zz6`BpzaCA3I?pDct zT5>-qxz7Luc{qtiKD@()w(h6^3PnCj6(He%nWPnQIyW#fn@{^m=so}S6J5g>y*lJiY^NEO=aPl95>GU9Wy5`(iJ%f~*RE`1*d9kA5zKeKdv^ac%0iN26&x9r0q zv0K@#Quf4@AOg6bPt)|{bfyhYlKqA}lm++Z`!R|a2Qp%Cp_YO?6j~ns)eb<4(7xYn z9|Y)+hZ-r%gY};p_+yeSB9KEm`)rV;srya+AWC}ufmBxwk*SiWnHHU`i@h359~h8h z7(*{kPX5&Od;0LCd^e>q_xC~R3HWM5(RbxT2lRSOl%f7{C7`e*DmiabR<5J~mRbd% z&5B!pw@8Qw@GHH~W3@?Kj4%EU8@e+p_V%t%b1V;-Z77tF7m-1k%8HK zu;*rrcDrjgV6%CPGTd$l?uBeNKjC$>d~lPs%(f__&NQYI!-kHq+B+k;)OTTYAU*a) zzO|8y`KHBw7NqMY4o-@IOyMd7kWzx%y0-4z4=bAA{)K!cq0tR@74)QV#g zcOGe072u;9TOOR>xl+bFlOn1+?6Jg6LI5O*6MV8Oz~{R@g>%t|VCy#INeK%{jskyR3Vz5t(f*nEtVcOq&Si_%2)NuJ6m)$5RdNnvrbv1Ds$YKxbh(FDIKJlDH~hf zq+&h@Ur!$a@hENp5}NTXE!VIE`E)D8Up4|J)#iOX8i?6$25eI$0|tD`0)Pc?V?y@O zDRm=|#Ikoydp&qtko~zd_5(c6Tu$-_xXfQbzE%F^%>47t^}e60CSpSzjZu$ZR88}w3A8n}=YiGr&n^F;23fz$~iFCN9hZ>|diZXUAT+}VC^d{|L+{I8ms zcwWI-u?Z}9$V8`%y4$T+^5%V03PaO=c?AG}we;f1+}!B}i!uz5DBbUO>Q^@ zHk;(YYNT$8=F8itw7jK%=ORD;yJZahe7RnFd3jmJRX)jA`TPne!Ezm_ zli}{l@6_1eY+^~}Sw6-9L-`m3P#%F@BJm`3j!R7e-UWp1=eaBS9)<(lbl*0 zQ&0mfY`9u{0$hCVfT>mj$Z8+|r98s!#jDYl2 zD?RrKX#A&7YIRY*+-^aHHO_affmE;F6?J05Lp8DpKk*-_yKk{R)~()hx$EG!RJlrd zXZ@dDH6FBM)w8OW73n7*=k~I5cWzKg*j(v91tqYs6jd zJP|N@Rpzrggi_`hF@z6`lcyel{73W-K27txBM}qr_R9CDZTm;ZVYYJ~bi8Aphb(`} zcQ=aHPvxXkPj6_%qdLkiFQ&T=j}(V~Y3u59x<$PjO|1;%`zQt^F=U5<>jN2wt2_-* zDoF1iV@ljQq%1F!NsnhsopS@ zN(SPPVuPsaFz5zWDiLMdL-|Nh$qIwGC{XC;q7nbY)|d{Lq|#Rl%k>kMq+Ytz%ATab z3Y1LJV(wF4e|bCBc-V?YP>qu<^th3crx%Y}uK5!o50hcIXp@8LbBbbAVBac^=h6O!LN%7G z0NfdJ1;17VmADrFCKzlv(A zgZ9?ciI+%8<$J2+U0h#!=05KrU(hR_FU}Q9cEgKNk6XnRy>e5j%<<@-wNBC1db znKD%kZxqp%SE^k(KIU*B6eZxQRmgiGvi=79U0`*c28ss7ot{L|T4KN{$D5dE8LqIvw|xA)+&+e0(TA z1Sa;iRJCk2EZek8Bee34w*?6-`LH-XewU`uQ_cLzaJ3tyZ$@?8GcWfr$^_-hbFX2Bu7AJhMRrm zA>qaOW_BMIxxj9!lT2l5HIx!Zta|TOy@jqGzmd4{2{#=TrmamMcyyj#Y&-N!{Z52> zMIDs}BnpCBzhWRvcLAnQ?s`zM%~cGpsCpVfSSekV@O1|UN?-5t^4tZMw5;kJNS&nktkoGEOK>7m^!Y>mJLW*-P81PM)H& zE;P(miELS*w0kJ69O7oyO8u@27_{CTG=>iuVdP9<5sJV zcIA!8it7k(dXp{LkxReZ?V)P7fRaRCytWg~cZ?BsXzGZI&cq8kW(D$`M<{o;=JccvB{J<1DgpLCA$zz? zMaFM&eGv15uRCv<@z^*N^Amv5bRPkBjPpAaxDUR;1dn%8NX$c|BkE1J@c@vh^d;Tq zqtgerU&CvZJaBwignu&Mp+MQJpISAuaUM$ZQ?MpG7~iM(xQLHc{D4Px-*(URxID!N ztp-+YP#f3-{KCW%!RXcG0A$dvM)NFxaZ}Vp4R}bqY1QxvC7JQ?Xc+EwV)t9K<-tKgXgYyr0Y#bDE8su$0xPR?QR+K5t;v-q+nzD#(ZRJUH-DHDL6S zd-kw(254-#k8&(D>*2ZR_&flZgx4aUiJ-e@^^mD>8!}j43xia2%WYNSzdgkiGUnk< z)He?>lKIoAFxQpdFE!z%vuIvqKl-0w}=Yu+r+FTEYk< z$iU0Fnc7;dghiwWc5)Ku21!E4fz`|M@-j?Wu6>{;b5Kt#t6qS`j)CF~EYff~SLVDf z`H<4(tYU`h03%E@LX7~R@3-pyW+1wmvMO}+!Hc<#<|6IOT2dpEktNeI0X@%(Rv_`I zCcOBN_~u_sOz+O~9PS+7(a9tFMMS?6;TI9UrSCqVO*Xv#P_7o&53ICwM-m0)C8uK4 zP+FcZ+6%h;)Lry=7o)(@ZS;yvSG-Bq4=G0HyFR~aU*RPxOnudpt(Wc`KIv^!$@r0= zerIiC9&2|Q;9}py1AI%IfYe6k*Ysq`-QZJ_-4?LVg8Xj4bF1Oi-4%5shVqG0CVYYd z!0Z}hgRM|Eo33B4P#b%N;@ArHuUDve-P@K&M|MT+HG(vmIdl2yc~)-pgZ2W?MyY)o z&t+J5%oCGMcgRVG%5jXgOJz-z+FG!Lxio$P(rV%_7g1KiX{oZCotm~&G>IB-CsNLx zTE&$_rSNh1osZJlH_g5n>7tAJmY8X4p(1(`G9dXBuZ%|H-Q0@y#vd&{q?7!e!*`j2 zj(I9c4(WDj9a92P9--h8Q~=5pCcw2zl^7n)&LXiuJDos|$@~bB_de2;u{B15(#LJA zS-0OKVhfD$TT(=!w`+)^Q}Hv4%}rS)5n@%nrg0gHEOgpZDI|x$X#z%-#gAi6MRyA% ziy!wCf~M&5CFtY?2-yJHsl-1pIgZ46>+Gxpe_jK)kcKC=sE{LQU5x&m?7h06p1i-6 z#|N}?481?t-9GC>y|PONz$6kI0D^h>Ht1z11j$b51z6ir0tv^&hfR}xlnwHIw!$2I z1D3;Lxg8beb6~k0_NaJz$XR+(T>&@X{q6`&@JOjzMv=R!em+pj7dew~=mCgbC5+0j zzE=z5P)e=zaalT|g#}iu4~SIAbX=UGzO@7cDxmD@6c4X2=R;Y-qTasvWDfDV zH^4OnxJKs*8M7Q&+r;Jo7dys>HS%ic4tU8A)#j%~RC|5~q2~3S`XYKh$Gh{HPTgoe zqy9%*?ypum3xuiieAXrFaRTVZ`Mp1_V?C`=ujE%!s>GG!jtj9TC(<5)uQt{tI|*st z;w}OX%sPDw?J31@9yqi@_;9g}p&yi`A1K($0hTu)K|G|wn@XdXx-2MBo!~rf$NI$+ zpeC`>md1lTHLszE(0+fY2$HbmV9!U90@rr!n`4n>xi020>t6l z4$!oqB#;EiPx(@H3*b7|0B$xu5y?Q(OhChCv%3^iExY=zMIM+s{1`1=%OEM#z|^Vg z;YzL8Y&rgXcqKL0AXjh-P!<4i=sUe@L!s^67RZYCRCcT2D}g3dEnwwgrn*G;g=KAb z+lEW_zk5$$CBNSh1)mcTpHuCJ>ar!LyTLMRCn88AF{kif@4GUdzjO4rfBoMx{c@4q z3>*3fk35q_G|srzyq8GPr-LO8Az>BA%n)RNx}GZ+%YaCt`Nqs4VV76t_nX z+SV-LCG5$S7ENsKysIHi&h2Bmua>q_DX}hv1^YvUsKxGhZW0oh zH)*f8co`b*I|D*I?mAlKc?ospRu7amXDs_7S_SDctX^8JQr~hHQtpVc9Gdv!nV;wd|=jl@>ajh;#s;ECAEBw*5*Yb-Sh9 zxF~O2Sw1NubKSePx>gaR&0}A?*M+@acV)*?_rlW8%RxMZNp;AArPlBNq4`to_ECgX zcK!n#CdwVsnKxP;^YQh+0AK$LwV5&?N!n1EgGL01I961T=tg*<2&0te4$QX-p7g8} z1)V9niE1b*A_=PZv$(eZoE;&*CA)K1EvYn8%CO$QnNN|>TqT@h+JJHza@lU2W z7{Qv2V%$a&SlK+up-DHw99eoI=b`cp-!Hs~D445kgjfo}8IqZMn5)HG+V$=@4OWZ! zRj=M>`)t~6im#Qk03Uf^E6=zw*a8i*u(^lNnqPTFU~GXM+ialVtz|=kEsNbz&P&n8 z5C!Brzax(QM|CT`-h&2EooO0+ zkHC>46^Z8FsR{(=H;u*?I&HI|gt8NhD?hSNg*|32!!Sj|ks{Oji8BC`xz zlu-KDi|dQBoD)%Gyl0(M@ z1I!Rvv}>$sNJ5u3X7l7gM;31z^?4uqZ=8f76i&8G-!bBga9rU8!of7;W();C#6!|UGcxa| zDVGUI0TwI0Lfg#t6h(+jKJA|NoGB_$%>jrE!<#+ZG<=aosH|de-tS!6N46>?j56H1 z^Dfc$usY(~JD$V?vWp319d#Ey3tPBSt(@EZvX&Hwb=UZ&LZs)_h#nuHo63-*9Ng=* zQ=5-F=Cyl`w=}LT8=Rw)6Zpt@yqpCRCw{fBzXi?CFP)C3BoPY z*X<6fJE_C9pREpBO2d~-K<3&Nato>SBUP-gg^+qxK~q+&x>#3KOvA2i`@POfFNCEB zttE)f<|P3K(TLQ21-AOdtqEjm+q12UEzl>Q*UgRx|A3simg(9Z%k1!rF8DTIZZ1q~ zbI~=w-WW3KqIJ=;%nS3vvO17CxZ`GCSlDFJ?eJMuJVjflWcp~c32DclHWB0NLXZNb1OlgfT!saYJxazL<# za<75j5lAM(LxuvLxYr`<$V*4>)eW#G(7T=z8daD)zR4DReaI%#TrVrYE!k#{+>&itH+z6&< zbpS@KoxVFTZlq}s+*-q5SB%4sbQT!FD`G&>@-5rx9G1HSe9;kUYyv_}y?s=S&ed!> zUt}HB%}VA_wp*_hhXmyujo$TYrNtCf(pLYj_-lvbEx=)lRKMUgKS^#vZJ0|rzgN+OlYNW;2~=s!Lkq057|Qqy#k(2 zWqX2Oa*@$knSDR3fh_4v+UmSVe*0~@1XRzb*C3uBWy=|L;?aj+zH=`o5O*Zz(b0T4 zfvMj=(z4!>IyktB<{1>WRWB8lRq-Xe3d2!xBE?{&J5iT(J-K3sC9;t4ksTJ(AdGux zP2J6wzAS?t!s^gfk6f4K%?ESB%4r^g;AKW=yT$UVNztZ@icwDuhxjT+pKemh8<6Uj z8Weh9B(z|CuG2gT$q){*gxD5k{7EVueiXCsfx9Gz`x(6oglb>{-?1Qj#721)E!$$y z2dG1s|D@!Lrl;^GpN*ETpgZwZLl}X+G=4QBL-~05WzMG(0^q*#=IoeYAIVn&GbKX+ z8cMX^{WJ%9BhpWO{H2Sv`%32kmP}|NGcaL0eXQ4 z%hIf~_LII@-RzqKb4f3d;O}XVv=pp12G#f#!yx(F>OF2itCsjctAkz&!<%K8M#VKL z?zBf?5Vw^qt|&c?1wBVyd0l~^4w-Hr-!!joeD76Z4!E;ZMj;Wu}c#eWHpkYi#oUQ z${VwI?M=4c?W*Y^g4h~=L8Mr*W8vwhf8zHl(4Xzr{>p&t$70%mL=L>R_b4G@r0r~^7T92Ixb4BK~CHlPlE*QoT0BGIC<(jX&^5+kX=0uwBS znSA%Sxc@blgs<{6hoT^cV-PLNX=>atU^GC#l2R9lWe`V%cL5F*h%$Wns9U|BheTnl zj}oqd%acrj0mA4h47yWx!_V4RxJ#|nipSk6{Z=V47KSIaL{&cN!=+z275|_kV8ALT zNsAsx!>Gzy(l-UTAbbtgmI5arHBPTFxK$2Lr?5>i7IS#9az83QlvhlmAWjLhACt8ab>huHU=ixgwQ24<*N-?MFRh&+p_ro?7ka9dp)w3bnIm{CU+9z(;A0 z!ZemJ&@8-X>6yS<^d^u!iopvOqllS9j@j#4d8NNkODa}>^1&cM~0UId6F+% zVdM=_rZxUrdv|qB;15hp1MyZJSe)|X2^M=^>4s;hUA)&h&k@y65!JA8K4T+^@fSR) znK>~Jii?Qo35-QhTmKw`2+D9g=oM}LOm+z9P>&G4x$B5^P8lTlutoV+X6Vm1~Zk43jL<+ zF9lHG78d-9uoTMOS-$KBxW86mHF{;M>OwLRy9@-dicJGwM<=@L!Gd_X1bl!4B-n-5 z*mid_YElhZ!~MXXw1m{{k-4L?ndm;gYUINQ1TS;&RjbqVoTgQaiCZI1CtnRhkqzWV zv)3@Q!uXBYi{+hGu z9j0WF0(&K;#^jF0O(r6#ZCO}_S@I=4cd`V2dY&z4j1w;8vkNnM#Ib~>D=#1y2Fp7Z zAEOn`6@+YASv#&l#;pV_t@2GIxd6&$knw%ljuo_{WKaotJ^|~>O52XweaBGVKf1(J zR(n;oD{;dTi``UUfPfXh+3G4epLSOJ`#H#UUc(rZcJw%(b&N>_4C~DD4y2y4YOe&# zd4>X*9yQVrC_Q}pEG*7;cDk1coFfGQ4^4d^iY6(6BI%ZY35@)PmnV6<0E$=Q#*l`? z1J0l1c8bY7*$huY@V86_?;wbK3FQcRik*Qm?<7x$+>b$ESna2%`z+MR`T6Hp&rQi! z+^)PQBzMCPkV>h3@&qMsrGN4Sq;FVkp6;?NN?zJ$T%KaV36KQBg1nrVGXuD(MUoto zZQ#$yYQ#*Arsr}d729^DG6-$YWx5x4t|ZTkjS%y%Q0ayF#pc5L(yI5-l1Tf-$;pem zkow{P+-Z54#qjNR@8V@u_=NdQrG(zBGm=&=X%7cq4t(Ng(-fNpgV}i9U=1ziNSi~= z5+{KBpfvi_`kG9R%8@wecDWRp(qbsQepaqL9o|i_c0@;P8D5yJZlmISt3Z4_a^saH zvrf6OGT4ld+?6b5_5Zeat=nznM*4rALShn4w+K?CoS9_Ffq5)jwj7PejxS?-Xs!?Y zLb7=mDchta=Im?i>+O?lT>v!D-K1oXlg;kgIb#tGpwWeUp-}Zzse#ETUy>DwtpN9@ zkcNQoQ9eyqY!nHI%rPgVs)?BGI zm$Rlyt#zf=SgC<>K$+HRt!lNtu~zHfRI3G^)9kWaH2M~+##}7cjX9jSZ>X(v;$MVN z9^sl=13D>KrD+SvEQ;A9&^|HJOZJRJ!8I8{9!V6PavBOxRT9HX6;V5C=h+M3kUzq3 zE=&R*<9~806|{-P7Ja1sqUYp7K?rXZ4|%JYbdei@h2!yySI>W;n^6_ZFdvc5I zDV3#W_a)UzbgpzJp;ACX+Ryl$_x#ZbG7iu^XVn;n!h$$Y*tQ5C+RPzf?G=Es9kl@F zih4VQv2pJbSSmEuMOK4_npz@@zyy%pkE`c#XBC|GuyrxFKce=`G~d={okMfZsTt?GFWo_aSA*6q-8Wn* z#AE1|o7M<%(;6|~=+@q7Obex4nS55`0GKRbmr+HyT$-=crgtu97MuUBQuPbpwVZC}R))_g61;=R)2PC23 zSRdWN;}h1|ec~1{QL8kF8h=_RR|`%CT9%T?fhALD(FH$uxN2X7^{$f7_sJZp2BRM8 z;@K}j?-E>@QoA9MghLbdMWap@&vsoD;)MdOr=O->Zqpw)r!70pLS#UnTOPk|?&sbC zvxDBkI|{qeD2>kUPMcHo-A$sB<-Cg-r#M}PZ~$93lEal)HTu;RtS&=`3D_n{8MUYA z2X^3O9>UilUJf_L=xqWGy+!1s$skfESyHFKpJQQJ`WhHr{r+B zK~YJrBEqy&_|Xg5$HU0Hx-QSvf#m4eZ!XmCv%qU!ym99B#C&Xlo2>X;i0$D3XqUP$ zjHMk{EEj6oSsLAqxMyp+gbdA(st^VnP$KT329MuYHoU~izMlbGR!&nBZMGKKsI5|8 zBYS=Z9hd+DQo9owrs&Jc%z}cX4NH&jc3pNzw@~s+gsTxo8oaQr1B0C(2sU{@zrN%8=&T1tBxsl}ne{WCkCDChW^$oF@ z&vDyl!Gpfn@F7x$DW->cjXn9khc#i*4O0auR-;w!;*cBDUD;xs~r-6}Zi(GwL6LVl2FMe@pR!N*YYlaZW&*|H&&u5p7i?Suwx4k3K7S;?? zWOx(Qme;BSM>(vhL&r6i@(pf|9bsPi&&h$4<^5&cU6>IUY?Gk}W(U@e3oV;eGDIX2 zm0`Io&{tPUEmTeACVAM!T@Ki9cFfVVn+weZu&p&8ltJd_&XsaYcPTeP*yYOYUl$A1 z*sS|%ASxg|+oyx-k#zjT#$=UUAgbtF!idc)}*VAt9PERLcY6PktRASjN8kY7I(nXmAFtiE)ZoF}|BL6S6z&x08+t-Bxc6(0JHt z;;_@8%G&cGi(nacY?KG9h^_f?foo8{yiP!9&@9H4dTRjL`iLo7*#6q&j?TJPZNqGB z;agB!t7aZPo6$4SrNfTNLla#SG$-UHmQR_S8m8aYh%M+-8al@Gz?4BIM;68td=HlU zX}OdIdBT$?zd1GiP~2!5mSbC+!W5YTDH9#IvD2nbr*WlcJG*V#!E?!Y&AU#!qq!`q zgx|CV4V=v}(lp5&D>w6JNZgzntUd3@8T>J;%O@^%VzHF7hYQE{diUB=u$Mc#qJ5+a zwD&t}A2(KlaPr$%PB3wso%N6khqq(uP7s;ztBE57d`r0_bk#LryR+pnwBgSX3(!js zr9`*i%-2EFSO^vpO)T_%Dno*U>p*04en4aQC-4DxU(w&~5YLpM-h_?_bHV{$a4I~^MmY30k_+vum2n{?`)vMo= zOv`Tk*!X(PU)!Od-s*e$Oaw)S>QKVunR~p*+~e^os$Ll!PW0DWpzM$+oV-RRfA& zH$t&!L}IIy25~D`rlUSiy`@SaM9r?_e>O+H?HM&yHoBn#eT{0x73fi1H_-2nx(!s_h$^UAUts`4%?5VO3f$lZF0d(7O<(rhSi7FzOd&Jw zc|EIk{etdULFJ$>@ve&WRYf!nP#45PRdwmxb;-G}E$Sw%Fn~=0EgeEjYviF=w{%a; z7cs0UFv6E}Xu#($ zz!Z3w%?Q%i_osHEOHaJDC}*I7O5sN(j^g%o?$MN5nMjNAcVt%jTK1Pz_V*vzIjx59 zO}*7x{GyXnZ-3TmOgmIwIMXFj0$SR4A=^TgShKxKhbTEk?`|p&0l%#TI%Qsqp7v8G z&{H&%O+ua!4w#GCCxXm7MNJW}^x~ICd#04V>Fjc^hnnA2b$~}iIy6T7h-d&qSwfHN zz47c*gVmp#CBqy@b~G*7)wG0V@%#F*AcUDae>!G$7d3zSLfLIM>Q$}i(-W)7c)D!t zw0kab9=3)r%4!+QqfihIk1fxr;VzeW#U_X4(tNf|hzaN_WymHv)NR1ljTgL4;D#X_ z(`BzPw{++RIIBxMkafSY^9zf33~Ls`(%Q^zE5rIGF6-L}GateZ$4&!co{@oIs3t@Y zLTU!|h4wisu{eUU^oU`>%E9sQJ>Kus#DEwPU_c`1%EXaYA!t~d;t_;cx40pRSE}Y)_Ot26Zw?O*#!Y`9T~RX}A;(HcG2SMq7UN7nZ*5}0XcvOMmsa5?tjjgY)& zODmd`Iz-RBhw~&2mV5k`z8&RAddGL0C5If_bx~gw4mC-iEs#X3!J2`itq^34;caaN zdds@$CHm;DnMp^WD_pwq7bv}z=0WK`Jx6<=lFNY&w$ar{8|1InF3NmsOG0nSMD&)q z=E~nqjPhXKe4AkJ(6-RJI6i-iz*($DcW(iL?Y96y(Jerr+;g-2sYJwdQ}hEY`oup$ zxz7W%J-e?%-u?E2e*_}4;tvcc^8>Wl|2C*RA1C8~6;vJ|<%>~y2#TjCVL%{H1I$RQ zKzZOdnUY^J1m^+1hQ!!nWYBrW3Y`amd0@o$lc@3F&0}Qq&DCf1NfIt*%USP|kbCwJ zo~MLb`d3c~sPQKPYP^p?jpEk^S|v;x1liWW+xW0i`dAX5F@7U18{&(?iSpl;9;!_2Lb5WR39 zhwV`ZMmPST6wj?j=`(s2CTL33=`+Pm5M4tKba9Kjlja1WvCFdO4ce0q5Losm`*KmK zw}2II%zzxGJ~0w)Wu7^Om42N${Aw9fswb6RV=0sON+7D=!~edxidK!dx?;g%w1)7S z!Wk{Gyj%gs0+~PaH()~d=@JU&1Wjp@*G+);VZfppRC$h*_CkI*3ZV8MjzS!PlOjt` zg*$}K;$Y>PEh0Sr%EY_y%hPh=EqpQIijZRsI%WJgWYGIffm-3`^#9x2~?Gl_tllWGs`)#gHxz+fvfI;>m(5%FPVAx78NTxTRt zBM^;?6$OXDM#xLpMo|%O>~5RBK%YEJ@c_DFgn34!*)xFNNFQN$uIe?1Ds?ymTCiG& zGZfKiT9Cb}Qk$i5P{?5d0~=njBI_6#`pCXI9EHDeJBGsJxU~5agt2HAFQ@{si0YY!BAHFU23b=Z?(CHn+}OW81(lJsD--UT~{YI4%PV#|5VB zB#x2~u)PdTu-Uf|U19|E{dR~huvJ2Vc|;cn$7Pty#856afJ;JoHoR_ijUqsy-Zp9A zBOXU{)b5qp&b8E$1Cc&*+dyPuMXDo_9HPde>5CYVZet}Zi&JGw>NC6`SBrv5f(1b@ z4;S)dJ7yG8TrR7teL1PF5QBG(p*4o+oA{(`3iT-!qqId{QVr?VklqdH<&fT9Q2c`8 z7ZktXcnYFE?I(+Z36+yjITI=;p>igeA6}vm=)rttb9f{L3C2FFhycJ# z0!P}_Q#6+>q55#vT2{T(P``F72xF`mYXy5uRr`)?!1gC~_!9bA{w*s_jYBWq(f*v550 zO2hGr4GBXpXJ_~>&p1Iyazw99X&$Sx-$Nyn0lwlR&ry~MSKng z;z6Paa1qgLKEgu$Se_|)#bdS%Pum6Q@u2$i)gCkq{=GwgYw#Difz**x&9R zabI^cCpj~7&OD!cpL@S|{z)bUSvxn1?%8OHE^zGBy%VYH<_~TG^zGPqE%%IalFKQK z2gzr4J<5=p^{2VV+0`WFDKYp`H(hR55>5{W7nO+J-3z96vAHSqCcc?Pub+Fc$SJ#j zZ368F z{2A`&+o^(&^9Oaccb#u}KRFSX43L=N&BT~|zp!IwZ%|UtKnr}o+VsXEFJ^GT+R3|T6mxEH>~+@5DN0FozqVn*oYnhgsStuxYz{G$ zRZjLiT{dnX(BzrOG=W%sov@yOd=XK2!i7Ehu*$-6UHx+dZa@Tv%279V?m50dz^SF3 z?^#E)Ol@I9qEcvIWtMHpyEaHOXX@`r%`Pi_1z>s)j$&OSbD2On#m*RYzRzjd_FHb_?>^7{0{mQaMr^Bbau_@6-9StGv6N=@a$e2a>Os5#6NmmW?=p%Nbo-V(Y?V9$*hunR0Gx^7-6eU%LKwRH0MsK9|5gRo(>Xx;;^@8SaFTJG+YNWlz9(`sC~5GZ7kC}LhZENwUp`) zd!4Z!u{`^1Y5cNVLG!Dw7i#N{-%TL*#TpIscOq3#YDaC(W8855+y23r^hW{F3r|Jt z* zb#(2Q6C}GIn|y5KV%UEUo=-gjemCx0zHmRBSgF{2^$m71K~h1{$DcUb1(1_9hnR~M z3oR$7d0M>Pd)YSGt;v*p+pNvF3vvycFIBzb5krf8g6XVfSCC6jsL`f@*j(EHG<&Gf zH;1qUR?{S`Vwy{mZZ}g~!R#N@(Dss6s3!sga#YNX@(Ejej@1aJ)5E)I_B^oJWn)|^4V6%_`9DRq82}8byhruBL z8@rf9WG&a|c6~f8y+_=Ojp6QetcBJ&A965>eY}0=Nfg!fJh6vCGV8PpUCB=sRLu`9 zw&IlL`$9jYJ*Dwk9gx;3^te~fvhSgtZ2{sVnR@iBSgGM4w`G)>ubT7z*JU=M3#*b+ z5z{!_gybSGmRJgmps^0Z1hXRu4_!A{ag>E%?6FRabT09oaKu!&cypLG!cnZ*OSMn)t zG8tU_`F6cgiOG6OVo+_&m?NjzJ`yGmrsa&m07&& zaNSpp4h&|qOiNy`45EA$6Vgx|W?s@19u>Gx&T#6NyTQW+bWX~*7*-%VwVc_s0)IVx z(fds`=)CImMb3is&I{wi26(K8gq*cj}gUf`DCxX9JCJOqA1v0vJs|j+0N#$O? z_VC8gYv4LecOqS+FtYOAvMX-;L;kjtMhr+06bb9 z%$qq9G-KpK!^-)vlnK_?wP<)~rLX$VIH?T%5b#jB@RlX)F>$-!zV^K7lFPW8_ICR# zOILAUOF4o5r*+ygg?Cd^ShHObUS_M*sO8D;)nwVZjstZnCZRCETTUxwr6_^Wi6G*!B?@74rJ8q4klKxkxap5?CpjQt84h}a$=JM_1QtAm|2r0 zhW(sX{nK-4Y8IFf-__{EMT-qq8s>zIb48<2;=9+hq))xMsr)u0<3r_zHD7XZUfiqX z;xyZgOe_x$wph^DF<^-5g?Vt}Dd(1CbNB4CQc7?z5HzN%h0;47MR^mQFV4pT`WN28)ceq#c7yA%Jt@BlL;lUmu75`GaH?K=3d!`yCn z`jF&9)Fxsu5jxLTBibMOp? z$?~D$^G}MZ$>PolDdqDgSg1ykY$$x-j>4_xr4wSoGp%F)0pZH(c|Ko*SxiyNG2mke zYX<4W-~su7Wh|#cl!n3@Er&GzCKsW>9)_8AE5u#ad#!MiV?1PxZN#9xi!oNJX$D1> z(=ceQdaE<=CE-xD`fIw*EG=qNT{fhT&@>NqHWC6xZ#jemJo#XZQh1d zpyuA_t&b&G&jAG9VIuR-M%X#VBoTP4PxaZyYRSxRKH?mkATxLqwT;BpTfa3*(Y~&7 zFfSWE&dVW!dQ8HKi4gB_kr6z0tKWRpkU7^XBPV_JGGr_iw~dK60>7J({~ z+VRiDTeNwCqMVG1v>`I4RDP+gUy2tM$$T0>%)d!@jmiO_dz&n<3w2ZZVnmi%6u$N@ zH_pho#f-F&ZKlzNh{YCArD{l$^!wd2wS2$O;5lOd_c_Yj)V~c61AIa1UD%A_?cCxw znV`U+pzhR7W9xKUtm_8W>BU2Ou3O^VqoZ0ku@DsP&JM%enK6@ii6@iV{GHA|8ulJC zl}@_pMbV_ydp8%0kP(mpx}@RMZd^s?{$TP^|My;q4xb+3i(B{OV+IPNp2b#jggreZ z*fDo4rjAjD3o|THx1*|P6I|c+PTXt2BXPgRu%Y^x<%y`{jg~vhJBk{f4^gVe=_?U> z)s9)M@>xnsCdwo`t(X{eC9sE6na=sP?h#*vNJJRV**7@l9&SfUsxYoHC>%3K59-%Z zl2%(Q)Kco{^x20EMWig?k9Sx_smrqH@TaRxow+hnb(g0U-I;4iYdHvcD=oqX?LGM7 z9tc{*@hE0v-L+3_DwKQr@{LRoE%uV4L`buEb7H3e52nu%Cg2I{ExbNUE zDqDfXD18<&R%`)Rg6Ugs*BoIy>gvJ_9pUQnw6n1!cY-;JHQY>5l@E~jL$H2_-`C)# zB~yH^M7szK#GO>V9&~Vck5Muf+ncDd*N$(ohN-0LeOZ2beExZU7WIQ8?x>c?asOj-=bNORD8~{-~pDXXAhJrTE}qc zyi&YVPg!5UsbUW|!Fw_&`AsZCqI>Vi17ty8K-i@(bF(#Q=`FACS=rK&ENJ?er8!ou zYe}Vx3C+-uM)$7-mlAhBGBwXL`aQXMnk`teclq<#;Ad`q{M3Y6{^)3y7CJK>@ZI+* z7pYZMo?wx+wj#Ur2cp>7M5m7uzIWlC6{)8xMPO9V;$C1e)=->xt7a-s+#s;AuVoz2 zzjsI6(D0ytyjVgj1ehC3F^|Fxt7TYwP2|=DO)D+wj{;ufW{yIJG%k-V%7)i%jkt}B zhg+;P$j)fJK|F1(7kRrO@#6ShbL)eh5Z4VaUlKO@nhmwG-Xdna>_A=B>1j!Ay6)mr z)lXCVs|Gcw*n=b-MZ!r`{BX@li@Mm@YfZMaQInqas0Oa_F5iGy3oFX5dC$iw55Ex>+I!;bbvTOLBawe0wRKUP4NJkGC?M(==cAGC;@or&C=Ii zBL{y%ehGaEHZ1@^`-4zEO8%ch0=EpohDbLA^ir`3t@c>zlkvZW_M_sKvJb{TLWBB3 zVD7F^&p%>(_W#5v6hNWwb987ii3tES-~j+!Kg76%YWx>Ph!@fg1hKpHLckFTyA1i# zfSB+PcYictt&~IKT;3o{4h@*c1_0Q90OX@i&}V*f^Y4&t-MrvPDB@Dw^)K~3o|r!k z`Jcs|Xmy{u^+ZxE0AK_N0PtN=PeY&ir8+upHyFt265$PT{V|1CKS2c19tC24yk3ij zY?1%~+&@5;P}d0m69RX$gI-A^>L-&xmelGOh7ON0(FFFN(pW+Xkp3sZ6Kad@8_z3{ z73GgtDj|SQ-m!iEed~D`}*W|0e`(lNS_(fWqydh@a{b@l!%L{uJt2cJSN# zXx3fgt94mI|D;<6;ZL+=qXXvBMT2E0EYmQd2n|As)oAV?703uf~lrEt4Xp&p=|_eu%PC`B`* zt}v!qf6cgDc;X;C2oeHjFY&rKGQVwH-%+>GD?5lWzSagmhp()qU6wnn4nee|+Jl)Yv=Hv|pIY7J|pnrJv*Ln&0$ttx=L;&FW4@u;ssHFa({?}v{ zaQ3{6_|kskpVkM`f?WN_+ceu1O(D~NXd)o)ju5CTNJKzbKuiGU1ph%i=6Do64{>nO S_gw%LdRs#e+L^J-qyGcZ79ENJ literal 0 HcmV?d00001 diff --git a/UI/main.py b/UI/main.py new file mode 100644 index 0000000..6205de3 --- /dev/null +++ b/UI/main.py @@ -0,0 +1,18 @@ +#!/usr/bin/python +import bdsensors +import bmp180 +from flask import Flask, render_template +app = Flask(__name__) + + +@app.route("/") +def main(): + + templateData = {'temperature': bdsensors.read_temp(), + 'pressure': bmp180.readings()} + + return render_template('main.html', **templateData) + + +if __name__ == "__main__": + app.run(host='0.0.0.0', port=80, debug=True) diff --git a/UI/requirements.txt b/UI/requirements.txt new file mode 100644 index 0000000..52dd63c --- /dev/null +++ b/UI/requirements.txt @@ -0,0 +1,3 @@ +apt-get install python-pip +flask +sudo apt install python-smbus \ No newline at end of file diff --git a/UI/static/justgage.js b/UI/static/justgage.js new file mode 100644 index 0000000..c852491 --- /dev/null +++ b/UI/static/justgage.js @@ -0,0 +1,1220 @@ +/** + * JustGage - animated gauges using RaphaelJS + * Check http://www.justgage.com for official releases + * Licensed under MIT. + * @author Bojan Djuricic (@Toorshia) + **/ + +JustGage = function(config) { + + var obj = this; + + // Helps in case developer wants to debug it. unobtrusive + if (config === null || config === undefined) { + console.log('* justgage: Make sure to pass options to the constructor!'); + return false; + } + + var node; + + if (config.id !== null && config.id !== undefined) { + node = document.getElementById(config.id); + if (!node) { + console.log('* justgage: No element with id : %s found', config.id); + return false; + } + } else if (config.parentNode !== null && config.parentNode !== undefined) { + node = config.parentNode; + } else { + console.log('* justgage: Make sure to pass the existing element id or parentNode to the constructor.'); + return false; + } + + var dataset = node.dataset ? node.dataset : {}; + + // check for defaults + var defaults = (config.defaults !== null && config.defaults !== undefined) ? config.defaults : false; + if (defaults !== false) { + config = extend({}, config, defaults); + delete config.defaults; + } + + // configurable parameters + obj.config = { + // id : string + // this is container element id + id: config.id, + + // value : float + // value gauge is showing + value: kvLookup('value', config, dataset, 0, 'float'), + + // defaults : bool + // defaults parameter to use + defaults: kvLookup('defaults', config, dataset, 0, false), + + // parentNode : node object + // this is container element + parentNode: kvLookup('parentNode', config, dataset, null), + + // width : int + // gauge width + width: kvLookup('width', config, dataset, null), + + // height : int + // gauge height + height: kvLookup('height', config, dataset, null), + + // title : string + // gauge title + title: kvLookup('title', config, dataset, ""), + + // titleFontColor : string + // color of gauge title + titleFontColor: kvLookup('titleFontColor', config, dataset, "#999999"), + + // titleFontFamily : string + // color of gauge title + titleFontFamily: kvLookup('titleFontFamily', config, dataset, "sans-serif"), + + // titlePosition : string + // 'above' or 'below' + titlePosition: kvLookup('titlePosition', config, dataset, "above"), + + // valueFontColor : string + // color of label showing current value + valueFontColor: kvLookup('valueFontColor', config, dataset, "#010101"), + + // valueFontFamily : string + // color of label showing current value + valueFontFamily: kvLookup('valueFontFamily', config, dataset, "Arial"), + + // symbol : string + // special symbol to show next to value + symbol: kvLookup('symbol', config, dataset, ''), + + // min : float + // min value + min: kvLookup('min', config, dataset, 0, 'float'), + + // max : float + // max value + max: kvLookup('max', config, dataset, 100, 'float'), + + // reverse : bool + // reverse min and max + reverse: kvLookup('reverse', config, dataset, false), + + // humanFriendlyDecimal : int + // number of decimal places for our human friendly number to contain + humanFriendlyDecimal: kvLookup('humanFriendlyDecimal', config, dataset, 0), + + + // textRenderer: func + // function applied before rendering text + textRenderer: kvLookup('textRenderer', config, dataset, null), + + // gaugeWidthScale : float + // width of the gauge element + gaugeWidthScale: kvLookup('gaugeWidthScale', config, dataset, 1.0), + + // gaugeColor : string + // background color of gauge element + gaugeColor: kvLookup('gaugeColor', config, dataset, "#edebeb"), + + // label : string + // text to show below value + label: kvLookup('label', config, dataset, ''), + + // labelFontColor : string + // color of label showing label under value + labelFontColor: kvLookup('labelFontColor', config, dataset, "#b3b3b3"), + + // shadowOpacity : int + // 0 ~ 1 + shadowOpacity: kvLookup('shadowOpacity', config, dataset, 0.2), + + // shadowSize: int + // inner shadow size + shadowSize: kvLookup('shadowSize', config, dataset, 5), + + // shadowVerticalOffset : int + // how much shadow is offset from top + shadowVerticalOffset: kvLookup('shadowVerticalOffset', config, dataset, 3), + + // levelColors : string[] + // colors of indicator, from lower to upper, in RGB format + levelColors: kvLookup('levelColors', config, dataset, ["#a9d70b", "#f9c802", "#ff0000"], 'array', ','), + + // startAnimationTime : int + // length of initial animation + startAnimationTime: kvLookup('startAnimationTime', config, dataset, 700), + + // startAnimationType : string + // type of initial animation (linear, >, <, <>, bounce) + startAnimationType: kvLookup('startAnimationType', config, dataset, '>'), + + // refreshAnimationTime : int + // length of refresh animation + refreshAnimationTime: kvLookup('refreshAnimationTime', config, dataset, 700), + + // refreshAnimationType : string + // type of refresh animation (linear, >, <, <>, bounce) + refreshAnimationType: kvLookup('refreshAnimationType', config, dataset, '>'), + + // donutStartAngle : int + // angle to start from when in donut mode + donutStartAngle: kvLookup('donutStartAngle', config, dataset, 90), + + // valueMinFontSize : int + // absolute minimum font size for the value + valueMinFontSize: kvLookup('valueMinFontSize', config, dataset, 16), + + // titleMinFontSize + // absolute minimum font size for the title + titleMinFontSize: kvLookup('titleMinFontSize', config, dataset, 10), + + // labelMinFontSize + // absolute minimum font size for the label + labelMinFontSize: kvLookup('labelMinFontSize', config, dataset, 10), + + // minLabelMinFontSize + // absolute minimum font size for the minimum label + minLabelMinFontSize: kvLookup('minLabelMinFontSize', config, dataset, 10), + + // maxLabelMinFontSize + // absolute minimum font size for the maximum label + maxLabelMinFontSize: kvLookup('maxLabelMinFontSize', config, dataset, 10), + + // hideValue : bool + // hide value text + hideValue: kvLookup('hideValue', config, dataset, false), + + // hideMinMax : bool + // hide min and max values + hideMinMax: kvLookup('hideMinMax', config, dataset, false), + + // hideInnerShadow : bool + // hide inner shadow + hideInnerShadow: kvLookup('hideInnerShadow', config, dataset, false), + + // humanFriendly : bool + // convert large numbers for min, max, value to human friendly (e.g. 1234567 -> 1.23M) + humanFriendly: kvLookup('humanFriendly', config, dataset, false), + + // noGradient : bool + // whether to use gradual color change for value, or sector-based + noGradient: kvLookup('noGradient', config, dataset, false), + + // donut : bool + // show full donut gauge + donut: kvLookup('donut', config, dataset, false), + + // relativeGaugeSize : bool + // whether gauge size should follow changes in container element size + relativeGaugeSize: kvLookup('relativeGaugeSize', config, dataset, false), + + // counter : bool + // animate level number change + counter: kvLookup('counter', config, dataset, false), + + // decimals : int + // number of digits after floating point + decimals: kvLookup('decimals', config, dataset, 0), + + // customSectors : [] of objects + // number of digits after floating point + customSectors: kvLookup('customSectors', config, dataset, []), + + // formatNumber: boolean + // formats numbers with commas where appropriate + formatNumber: kvLookup('formatNumber', config, dataset, false), + + // pointer : bool + // show value pointer + pointer: kvLookup('pointer', config, dataset, false), + + // pointerOptions : object + // define pointer look + pointerOptions: kvLookup('pointerOptions', config, dataset, []) + }; + + // variables + var + canvasW, + canvasH, + widgetW, + widgetH, + aspect, + dx, + dy, + titleFontSize, + titleX, + titleY, + valueFontSize, + valueX, + valueY, + labelFontSize, + labelX, + labelY, + minFontSize, + minX, + minY, + maxFontSize, + maxX, + maxY; + + // overflow values + if (obj.config.value > obj.config.max) obj.config.value = obj.config.max; + if (obj.config.value < obj.config.min) obj.config.value = obj.config.min; + obj.originalValue = kvLookup('value', config, dataset, -1, 'float'); + + // create canvas + if (obj.config.id !== null && (document.getElementById(obj.config.id)) !== null) { + obj.canvas = Raphael(obj.config.id, "100%", "100%"); + } else if (obj.config.parentNode !== null) { + obj.canvas = Raphael(obj.config.parentNode, "100%", "100%"); + } + + if (obj.config.relativeGaugeSize === true) { + obj.canvas.setViewBox(0, 0, 200, 150, true); + } + + // canvas dimensions + if (obj.config.relativeGaugeSize === true) { + canvasW = 200; + canvasH = 150; + } else if (obj.config.width !== null && obj.config.height !== null) { + canvasW = obj.config.width; + canvasH = obj.config.height; + } else if (obj.config.parentNode !== null) { + obj.canvas.setViewBox(0, 0, 200, 150, true); + canvasW = 200; + canvasH = 150; + } else { + canvasW = getStyle(document.getElementById(obj.config.id), "width").slice(0, -2) * 1; + canvasH = getStyle(document.getElementById(obj.config.id), "height").slice(0, -2) * 1; + } + + // widget dimensions + if (obj.config.donut === true) { + + // DONUT ******************************* + + // width more than height + if (canvasW > canvasH) { + widgetH = canvasH; + widgetW = widgetH; + // width less than height + } else if (canvasW < canvasH) { + widgetW = canvasW; + widgetH = widgetW; + // if height don't fit, rescale both + if (widgetH > canvasH) { + aspect = widgetH / canvasH; + widgetH = widgetH / aspect; + widgetW = widgetH / aspect; + } + // equal + } else { + widgetW = canvasW; + widgetH = widgetW; + } + + // delta + dx = (canvasW - widgetW) / 2; + dy = (canvasH - widgetH) / 2; + + // title + titleFontSize = ((widgetH / 8) > 10) ? (widgetH / 10) : 10; + titleX = dx + widgetW / 2; + titleY = dy + widgetH / 11; + + // value + valueFontSize = ((widgetH / 6.4) > 16) ? (widgetH / 5.4) : 18; + valueX = dx + widgetW / 2; + if (obj.config.label !== '') { + valueY = dy + widgetH / 1.85; + } else { + valueY = dy + widgetH / 1.7; + } + + // label + labelFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10; + labelX = dx + widgetW / 2; + labelY = valueY + labelFontSize; + + // min + minFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10; + minX = dx + (widgetW / 10) + (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2; + minY = labelY; + + // max + maxFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10; + maxX = dx + widgetW - (widgetW / 10) - (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2; + maxY = labelY; + + } else { + // HALF ******************************* + + // width more than height + if (canvasW > canvasH) { + widgetH = canvasH; + widgetW = widgetH * 1.25; + //if width doesn't fit, rescale both + if (widgetW > canvasW) { + aspect = widgetW / canvasW; + widgetW = widgetW / aspect; + widgetH = widgetH / aspect; + } + // width less than height + } else if (canvasW < canvasH) { + widgetW = canvasW; + widgetH = widgetW / 1.25; + // if height don't fit, rescale both + if (widgetH > canvasH) { + aspect = widgetH / canvasH; + widgetH = widgetH / aspect; + widgetW = widgetH / aspect; + } + // equal + } else { + widgetW = canvasW; + widgetH = widgetW * 0.75; + } + + // delta + dx = (canvasW - widgetW) / 2; + dy = (canvasH - widgetH) / 2; + if (obj.config.titlePosition === 'below') { + // shift whole thing down + dy -= (widgetH / 6.4); + } + + // title + titleFontSize = ((widgetH / 8) > obj.config.titleMinFontSize) ? (widgetH / 10) : obj.config.titleMinFontSize; + titleX = dx + widgetW / 2; + titleY = dy + (obj.config.titlePosition === 'below' ? (widgetH * 1.07) : (widgetH / 6.4)); + + // value + valueFontSize = ((widgetH / 6.5) > obj.config.valueMinFontSize) ? (widgetH / 6.5) : obj.config.valueMinFontSize; + valueX = dx + widgetW / 2; + valueY = dy + widgetH / 1.275; + + // label + labelFontSize = ((widgetH / 16) > obj.config.labelMinFontSize) ? (widgetH / 16) : obj.config.labelMinFontSize; + labelX = dx + widgetW / 2; + labelY = valueY + valueFontSize / 2 + 5; + + // min + minFontSize = ((widgetH / 16) > obj.config.minLabelMinFontSize) ? (widgetH / 16) : obj.config.minLabelMinFontSize; + minX = dx + (widgetW / 10) + (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2; + minY = labelY; + + // max + maxFontSize = ((widgetH / 16) > obj.config.maxLabelMinFontSize) ? (widgetH / 16) : obj.config.maxLabelMinFontSize; + maxX = dx + widgetW - (widgetW / 10) - (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2; + maxY = labelY; + } + + // parameters + obj.params = { + canvasW: canvasW, + canvasH: canvasH, + widgetW: widgetW, + widgetH: widgetH, + dx: dx, + dy: dy, + titleFontSize: titleFontSize, + titleX: titleX, + titleY: titleY, + valueFontSize: valueFontSize, + valueX: valueX, + valueY: valueY, + labelFontSize: labelFontSize, + labelX: labelX, + labelY: labelY, + minFontSize: minFontSize, + minX: minX, + minY: minY, + maxFontSize: maxFontSize, + maxX: maxX, + maxY: maxY + }; + + // var clear + canvasW, canvasH, widgetW, widgetH, aspect, dx, dy, titleFontSize, titleX, titleY, valueFontSize, valueX, valueY, labelFontSize, labelX, labelY, minFontSize, minX, minY, maxFontSize, maxX, maxY = null; + + // pki - custom attribute for generating gauge paths + obj.canvas.customAttributes.pki = function(value, min, max, w, h, dx, dy, gws, donut, reverse) { + + var alpha, Ro, Ri, Cx, Cy, Xo, Yo, Xi, Yi, path; + + if (donut) { + alpha = (1 - 2 * (value - min) / (max - min)) * Math.PI; + Ro = w / 2 - w / 7; + Ri = Ro - w / 6.666666666666667 * gws; + + Cx = w / 2 + dx; + Cy = h / 1.95 + dy; + + Xo = w / 2 + dx + Ro * Math.cos(alpha); + Yo = h - (h - Cy) - Ro * Math.sin(alpha); + Xi = w / 2 + dx + Ri * Math.cos(alpha); + Yi = h - (h - Cy) - Ri * Math.sin(alpha); + + path = "M" + (Cx - Ri) + "," + Cy + " "; + path += "L" + (Cx - Ro) + "," + Cy + " "; + if (value > ((max - min) / 2)) { + path += "A" + Ro + "," + Ro + " 0 0 1 " + (Cx + Ro) + "," + Cy + " "; + } + path += "A" + Ro + "," + Ro + " 0 0 1 " + Xo + "," + Yo + " "; + path += "L" + Xi + "," + Yi + " "; + if (value > ((max - min) / 2)) { + path += "A" + Ri + "," + Ri + " 0 0 0 " + (Cx + Ri) + "," + Cy + " "; + } + path += "A" + Ri + "," + Ri + " 0 0 0 " + (Cx - Ri) + "," + Cy + " "; + path += "Z "; + + return { + path: path + }; + + } else { + alpha = (1 - (value - min) / (max - min)) * Math.PI; + Ro = w / 2 - w / 10; + Ri = Ro - w / 6.666666666666667 * gws; + + Cx = w / 2 + dx; + Cy = h / 1.25 + dy; + + Xo = w / 2 + dx + Ro * Math.cos(alpha); + Yo = h - (h - Cy) - Ro * Math.sin(alpha); + Xi = w / 2 + dx + Ri * Math.cos(alpha); + Yi = h - (h - Cy) - Ri * Math.sin(alpha); + + path = "M" + (Cx - Ri) + "," + Cy + " "; + path += "L" + (Cx - Ro) + "," + Cy + " "; + path += "A" + Ro + "," + Ro + " 0 0 1 " + Xo + "," + Yo + " "; + path += "L" + Xi + "," + Yi + " "; + path += "A" + Ri + "," + Ri + " 0 0 0 " + (Cx - Ri) + "," + Cy + " "; + path += "Z "; + + return { + path: path + }; + } + + // var clear + alpha, Ro, Ri, Cx, Cy, Xo, Yo, Xi, Yi, path = null; + }; + + // ndl - custom attribute for generating needle path + obj.canvas.customAttributes.ndl = function(value, min, max, w, h, dx, dy, gws, donut) { + + var dlt = w * 3.5 / 100; + var dlb = w / 15; + var dw = w / 100; + + if (obj.config.pointerOptions.toplength != null && obj.config.pointerOptions.toplength != undefined) dlt = obj.config.pointerOptions.toplength; + if (obj.config.pointerOptions.bottomlength != null && obj.config.pointerOptions.bottomlength != undefined) dlb = obj.config.pointerOptions.bottomlength; + if (obj.config.pointerOptions.bottomwidth != null && obj.config.pointerOptions.bottomwidth != undefined) dw = obj.config.pointerOptions.bottomwidth; + + var alpha, Ro, Ri, Cx, Cy, Xo, Yo, Xi, Yi, Xc, Yc, Xz, Yz, Xa, Ya, Xb, Yb, path; + + if (donut) { + + alpha = (1 - 2 * (value - min) / (max - min)) * Math.PI; + Ro = w / 2 - w / 7; + Ri = Ro - w / 6.666666666666667 * gws; + + Cx = w / 2 + dx; + Cy = h / 1.95 + dy; + + Xo = w / 2 + dx + Ro * Math.cos(alpha); + Yo = h - (h - Cy) - Ro * Math.sin(alpha); + Xi = w / 2 + dx + Ri * Math.cos(alpha); + Yi = h - (h - Cy) - Ri * Math.sin(alpha); + + Xc = Xo + dlt * Math.cos(alpha); + Yc = Yo - dlt * Math.sin(alpha); + Xz = Xi - dlb * Math.cos(alpha); + Yz = Yi + dlb * Math.sin(alpha); + + Xa = Xz + dw * Math.sin(alpha); + Ya = Yz + dw * Math.cos(alpha); + Xb = Xz - dw * Math.sin(alpha); + Yb = Yz - dw * Math.cos(alpha); + + path = 'M' + Xa + ',' + Ya + ' '; + path += 'L' + Xb + ',' + Yb + ' '; + path += 'L' + Xc + ',' + Yc + ' '; + path += 'Z '; + + return { + path: path + }; + + } else { + alpha = (1 - (value - min) / (max - min)) * Math.PI; + Ro = w / 2 - w / 10; + Ri = Ro - w / 6.666666666666667 * gws; + + Cx = w / 2 + dx; + Cy = h / 1.25 + dy; + + Xo = w / 2 + dx + Ro * Math.cos(alpha); + Yo = h - (h - Cy) - Ro * Math.sin(alpha); + Xi = w / 2 + dx + Ri * Math.cos(alpha); + Yi = h - (h - Cy) - Ri * Math.sin(alpha); + + Xc = Xo + dlt * Math.cos(alpha); + Yc = Yo - dlt * Math.sin(alpha); + Xz = Xi - dlb * Math.cos(alpha); + Yz = Yi + dlb * Math.sin(alpha); + + Xa = Xz + dw * Math.sin(alpha); + Ya = Yz + dw * Math.cos(alpha); + Xb = Xz - dw * Math.sin(alpha); + Yb = Yz - dw * Math.cos(alpha); + + path = 'M' + Xa + ',' + Ya + ' '; + path += 'L' + Xb + ',' + Yb + ' '; + path += 'L' + Xc + ',' + Yc + ' '; + path += 'Z '; + + return { + path: path + }; + } + + // var clear + alpha, Ro, Ri, Cx, Cy, Xo, Yo, Xi, Yi, Xc, Yc, Xz, Yz, Xa, Ya, Xb, Yb, path = null; + }; + + // gauge + obj.gauge = obj.canvas.path().attr({ + "stroke": "none", + "fill": obj.config.gaugeColor, + pki: [ + obj.config.max, + obj.config.min, + obj.config.max, + obj.params.widgetW, + obj.params.widgetH, + obj.params.dx, + obj.params.dy, + obj.config.gaugeWidthScale, + obj.config.donut, + obj.config.reverse + ] + }); + + // level + obj.level = obj.canvas.path().attr({ + "stroke": "none", + "fill": getColor(obj.config.value, (obj.config.value - obj.config.min) / (obj.config.max - obj.config.min), obj.config.levelColors, obj.config.noGradient, obj.config.customSectors), + pki: [ + obj.config.min, + obj.config.min, + obj.config.max, + obj.params.widgetW, + obj.params.widgetH, + obj.params.dx, + obj.params.dy, + obj.config.gaugeWidthScale, + obj.config.donut, + obj.config.reverse + ] + }); + if (obj.config.donut) { + obj.level.transform("r" + obj.config.donutStartAngle + ", " + (obj.params.widgetW / 2 + obj.params.dx) + ", " + (obj.params.widgetH / 1.95 + obj.params.dy)); + } + + if (obj.config.pointer) { + // needle + obj.needle = obj.canvas.path().attr({ + "stroke": (obj.config.pointerOptions.stroke !== null && obj.config.pointerOptions.stroke !== undefined) ? obj.config.pointerOptions.stroke : "none", + "stroke-width": (obj.config.pointerOptions.stroke_width !== null && obj.config.pointerOptions.stroke_width !== undefined) ? obj.config.pointerOptions.stroke_width : 0, + "stroke-linecap": (obj.config.pointerOptions.stroke_linecap !== null && obj.config.pointerOptions.stroke_linecap !== undefined) ? obj.config.pointerOptions.stroke_linecap : "square", + "fill": (obj.config.pointerOptions.color !== null && obj.config.pointerOptions.color !== undefined) ? obj.config.pointerOptions.color : "#000000", + ndl: [ + obj.config.min, + obj.config.min, + obj.config.max, + obj.params.widgetW, + obj.params.widgetH, + obj.params.dx, + obj.params.dy, + obj.config.gaugeWidthScale, + obj.config.donut + ] + }); + + if (obj.config.donut) { + obj.needle.transform("r" + obj.config.donutStartAngle + ", " + (obj.params.widgetW / 2 + obj.params.dx) + ", " + (obj.params.widgetH / 1.95 + obj.params.dy)); + } + + } + + // title + obj.txtTitle = obj.canvas.text(obj.params.titleX, obj.params.titleY, obj.config.title); + obj.txtTitle.attr({ + "font-size": obj.params.titleFontSize, + "font-weight": "bold", + "font-family": obj.config.titleFontFamily, + "fill": obj.config.titleFontColor, + "fill-opacity": "1" + }); + setDy(obj.txtTitle, obj.params.titleFontSize, obj.params.titleY); + + // value + obj.txtValue = obj.canvas.text(obj.params.valueX, obj.params.valueY, 0); + obj.txtValue.attr({ + "font-size": obj.params.valueFontSize, + "font-weight": "bold", + "font-family": obj.config.valueFontFamily, + "fill": obj.config.valueFontColor, + "fill-opacity": "0" + }); + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + + // label + obj.txtLabel = obj.canvas.text(obj.params.labelX, obj.params.labelY, obj.config.label); + obj.txtLabel.attr({ + "font-size": obj.params.labelFontSize, + "font-weight": "normal", + "font-family": "Arial", + "fill": obj.config.labelFontColor, + "fill-opacity": "0" + }); + setDy(obj.txtLabel, obj.params.labelFontSize, obj.params.labelY); + + // min + var min = obj.config.min; + if (obj.config.reverse) { + min = obj.config.max; + } + + obj.txtMinimum = min; + if (obj.config.humanFriendly) { + obj.txtMinimum = humanFriendlyNumber(min, obj.config.humanFriendlyDecimal); + } else if (obj.config.formatNumber) { + obj.txtMinimum = formatNumber(min); + } + obj.txtMin = obj.canvas.text(obj.params.minX, obj.params.minY, obj.txtMinimum); + obj.txtMin.attr({ + "font-size": obj.params.minFontSize, + "font-weight": "normal", + "font-family": "Arial", + "fill": obj.config.labelFontColor, + "fill-opacity": (obj.config.hideMinMax || obj.config.donut) ? "0" : "1" + }); + setDy(obj.txtMin, obj.params.minFontSize, obj.params.minY); + + // max + var max = obj.config.max; + if (obj.config.reverse) { + max = obj.config.min; + } + obj.txtMaximum = max; + if (obj.config.humanFriendly) { + obj.txtMaximum = humanFriendlyNumber(max, obj.config.humanFriendlyDecimal); + } else if (obj.config.formatNumber) { + obj.txtMaximum = formatNumber(max); + } + obj.txtMax = obj.canvas.text(obj.params.maxX, obj.params.maxY, obj.txtMaximum); + obj.txtMax.attr({ + "font-size": obj.params.maxFontSize, + "font-weight": "normal", + "font-family": "Arial", + "fill": obj.config.labelFontColor, + "fill-opacity": (obj.config.hideMinMax || obj.config.donut) ? "0" : "1" + }); + setDy(obj.txtMax, obj.params.maxFontSize, obj.params.maxY); + + var defs = obj.canvas.canvas.childNodes[1]; + var svg = "http://www.w3.org/2000/svg"; + + if (ie !== 'undefined' && ie < 9) { + // VML mode - no SVG & SVG filter support + } else if (ie !== 'undefined') { + onCreateElementNsReady(function() { + obj.generateShadow(svg, defs); + }); + } else { + obj.generateShadow(svg, defs); + } + + // var clear + defs, svg = null; + + // set value to display + if (obj.config.textRenderer) { + obj.originalValue = obj.config.textRenderer(obj.originalValue); + } else if (obj.config.humanFriendly) { + obj.originalValue = humanFriendlyNumber(obj.originalValue, obj.config.humanFriendlyDecimal) + obj.config.symbol; + } else if (obj.config.formatNumber) { + obj.originalValue = formatNumber(obj.originalValue) + obj.config.symbol; + } else { + obj.originalValue = (obj.originalValue * 1).toFixed(obj.config.decimals) + obj.config.symbol; + } + + if (obj.config.counter === true) { + //on each animation frame + eve.on("raphael.anim.frame." + (obj.level.id), function() { + var currentValue = obj.level.attr("pki")[0]; + if (obj.config.reverse) { + currentValue = (obj.config.max * 1) + (obj.config.min * 1) - (obj.level.attr("pki")[0] * 1); + } + if (obj.config.textRenderer) { + obj.txtValue.attr("text", obj.config.textRenderer(Math.floor(currentValue))); + } else if (obj.config.humanFriendly) { + obj.txtValue.attr("text", humanFriendlyNumber(Math.floor(currentValue), obj.config.humanFriendlyDecimal) + obj.config.symbol); + } else if (obj.config.formatNumber) { + obj.txtValue.attr("text", formatNumber(Math.floor(currentValue)) + obj.config.symbol); + } else { + obj.txtValue.attr("text", (currentValue * 1).toFixed(obj.config.decimals) + obj.config.symbol); + } + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + currentValue = null; + }); + //on animation end + eve.on("raphael.anim.finish." + (obj.level.id), function() { + obj.txtValue.attr({ + "text": obj.originalValue + }); + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + }); + } else { + //on animation start + eve.on("raphael.anim.start." + (obj.level.id), function() { + obj.txtValue.attr({ + "text": obj.originalValue + }); + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + }); + } + + // animate gauge level, value & label + var rvl = obj.config.value; + if (obj.config.reverse) { + rvl = (obj.config.max * 1) + (obj.config.min * 1) - (obj.config.value * 1); + } + obj.level.animate({ + pki: [ + rvl, + obj.config.min, + obj.config.max, + obj.params.widgetW, + obj.params.widgetH, + obj.params.dx, + obj.params.dy, + obj.config.gaugeWidthScale, + obj.config.donut, + obj.config.reverse + ] + }, obj.config.startAnimationTime, obj.config.startAnimationType); + + if (obj.config.pointer) { + obj.needle.animate({ + ndl: [ + rvl, + obj.config.min, + obj.config.max, + obj.params.widgetW, + obj.params.widgetH, + obj.params.dx, + obj.params.dy, + obj.config.gaugeWidthScale, + obj.config.donut + ] + }, obj.config.startAnimationTime, obj.config.startAnimationType); + } + + obj.txtValue.animate({ + "fill-opacity": (obj.config.hideValue) ? "0" : "1" + }, obj.config.startAnimationTime, obj.config.startAnimationType); + obj.txtLabel.animate({ + "fill-opacity": "1" + }, obj.config.startAnimationTime, obj.config.startAnimationType); +}; + +/** Refresh gauge level */ +JustGage.prototype.refresh = function(val, max) { + + var obj = this; + var displayVal, color, max = max || null; + + // set new max + if (max !== null) { + obj.config.max = max; + // TODO: update customSectors + + obj.txtMaximum = obj.config.max; + if (obj.config.humanFriendly) { + obj.txtMaximum = humanFriendlyNumber(obj.config.max, obj.config.humanFriendlyDecimal); + } else if (obj.config.formatNumber) { + obj.txtMaximum = formatNumber(obj.config.max); + } + if (!obj.config.reverse) { + obj.txtMax.attr({ + "text": obj.txtMaximum + }); + setDy(obj.txtMax, obj.params.maxFontSize, obj.params.maxY); + } else { + obj.txtMin.attr({ + "text": obj.txtMaximum + }); + setDy(obj.txtMin, obj.params.minFontSize, obj.params.minY); + } + } + + // overflow values + displayVal = val; + if ((val * 1) > (obj.config.max * 1)) { + val = (obj.config.max * 1); + } + if ((val * 1) < (obj.config.min * 1)) { + val = (obj.config.min * 1); + } + + color = getColor(val, (val - obj.config.min) / (obj.config.max - obj.config.min), obj.config.levelColors, obj.config.noGradient, obj.config.customSectors); + + if (obj.config.textRenderer) { + displayVal = obj.config.textRenderer(displayVal); + } else if (obj.config.humanFriendly) { + displayVal = humanFriendlyNumber(displayVal, obj.config.humanFriendlyDecimal) + obj.config.symbol; + } else if (obj.config.formatNumber) { + displayVal = formatNumber((displayVal * 1).toFixed(obj.config.decimals)) + obj.config.symbol; + } else { + displayVal = (displayVal * 1).toFixed(obj.config.decimals) + obj.config.symbol; + } + obj.originalValue = displayVal; + obj.config.value = val * 1; + + if (!obj.config.counter) { + obj.txtValue.attr({ + "text": displayVal + }); + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + } + + var rvl = obj.config.value; + if (obj.config.reverse) { + rvl = (obj.config.max * 1) + (obj.config.min * 1) - (obj.config.value * 1); + } + obj.level.animate({ + pki: [ + rvl, + obj.config.min, + obj.config.max, + obj.params.widgetW, + obj.params.widgetH, + obj.params.dx, + obj.params.dy, + obj.config.gaugeWidthScale, + obj.config.donut, + obj.config.reverse + ], + "fill": color + }, obj.config.refreshAnimationTime, obj.config.refreshAnimationType); + + if (obj.config.pointer) { + obj.needle.animate({ + ndl: [ + rvl, + obj.config.min, + obj.config.max, + obj.params.widgetW, + obj.params.widgetH, + obj.params.dx, + obj.params.dy, + obj.config.gaugeWidthScale, + obj.config.donut + ] + }, obj.config.refreshAnimationTime, obj.config.refreshAnimationType); + } + + // var clear + obj, displayVal, color, max = null; +}; + +/** Generate shadow */ +JustGage.prototype.generateShadow = function(svg, defs) { + + var obj = this; + var sid = "inner-shadow-" + obj.config.id; + var gaussFilter, feOffset, feGaussianBlur, feComposite1, feFlood, feComposite2, feComposite3; + + // FILTER + gaussFilter = document.createElementNS(svg, "filter"); + gaussFilter.setAttribute("id", sid); + defs.appendChild(gaussFilter); + + // offset + feOffset = document.createElementNS(svg, "feOffset"); + feOffset.setAttribute("dx", 0); + feOffset.setAttribute("dy", obj.config.shadowVerticalOffset); + gaussFilter.appendChild(feOffset); + + // blur + feGaussianBlur = document.createElementNS(svg, "feGaussianBlur"); + feGaussianBlur.setAttribute("result", "offset-blur"); + feGaussianBlur.setAttribute("stdDeviation", obj.config.shadowSize); + gaussFilter.appendChild(feGaussianBlur); + + // composite 1 + feComposite1 = document.createElementNS(svg, "feComposite"); + feComposite1.setAttribute("operator", "out"); + feComposite1.setAttribute("in", "SourceGraphic"); + feComposite1.setAttribute("in2", "offset-blur"); + feComposite1.setAttribute("result", "inverse"); + gaussFilter.appendChild(feComposite1); + + // flood + feFlood = document.createElementNS(svg, "feFlood"); + feFlood.setAttribute("flood-color", "black"); + feFlood.setAttribute("flood-opacity", obj.config.shadowOpacity); + feFlood.setAttribute("result", "color"); + gaussFilter.appendChild(feFlood); + + // composite 2 + feComposite2 = document.createElementNS(svg, "feComposite"); + feComposite2.setAttribute("operator", "in"); + feComposite2.setAttribute("in", "color"); + feComposite2.setAttribute("in2", "inverse"); + feComposite2.setAttribute("result", "shadow"); + gaussFilter.appendChild(feComposite2); + + // composite 3 + feComposite3 = document.createElementNS(svg, "feComposite"); + feComposite3.setAttribute("operator", "over"); + feComposite3.setAttribute("in", "shadow"); + feComposite3.setAttribute("in2", "SourceGraphic"); + gaussFilter.appendChild(feComposite3); + + // set shadow + if (!obj.config.hideInnerShadow) { + obj.canvas.canvas.childNodes[2].setAttribute("filter", "url(#" + sid + ")"); + obj.canvas.canvas.childNodes[3].setAttribute("filter", "url(#" + sid + ")"); + } + + // var clear + gaussFilter, feOffset, feGaussianBlur, feComposite1, feFlood, feComposite2, feComposite3 = null; +}; + +// +// tiny helper function to lookup value of a key from two hash tables +// if none found, return defaultvalue +// +// key: string +// tablea: object +// tableb: DOMStringMap|object +// defval: string|integer|float|null +// datatype: return datatype +// delimiter: delimiter to be used in conjunction with datatype formatting +// +function kvLookup(key, tablea, tableb, defval, datatype, delimiter) { + var val = defval; + var canConvert = false; + if (!(key === null || key === undefined)) { + if (tableb !== null && tableb !== undefined && typeof tableb === "object" && key in tableb) { + val = tableb[key]; + canConvert = true; + } else if (tablea !== null && tablea !== undefined && typeof tablea === "object" && key in tablea) { + val = tablea[key]; + canConvert = true; + } else { + val = defval; + } + if (canConvert === true) { + if (datatype !== null && datatype !== undefined) { + switch (datatype) { + case 'int': + val = parseInt(val, 10); + break; + case 'float': + val = parseFloat(val); + break; + default: + break; + } + } + } + } + return val; +}; + +/** Get color for value */ +function getColor(val, pct, col, noGradient, custSec) { + + var no, inc, colors, percentage, rval, gval, bval, lower, upper, range, rangePct, pctLower, pctUpper, color; + var noGradient = noGradient || custSec.length > 0; + + if (custSec.length > 0) { + for (var i = 0; i < custSec.length; i++) { + if (val > custSec[i].lo && val <= custSec[i].hi) { + return custSec[i].color; + } + } + } + + no = col.length; + if (no === 1) return col[0]; + inc = (noGradient) ? (1 / no) : (1 / (no - 1)); + colors = []; + for (i = 0; i < col.length; i++) { + percentage = (noGradient) ? (inc * (i + 1)) : (inc * i); + rval = parseInt((cutHex(col[i])).substring(0, 2), 16); + gval = parseInt((cutHex(col[i])).substring(2, 4), 16); + bval = parseInt((cutHex(col[i])).substring(4, 6), 16); + colors[i] = { + pct: percentage, + color: { + r: rval, + g: gval, + b: bval + } + }; + } + + if (pct === 0) { + return 'rgb(' + [colors[0].color.r, colors[0].color.g, colors[0].color.b].join(',') + ')'; + } + + for (var j = 0; j < colors.length; j++) { + if (pct <= colors[j].pct) { + if (noGradient) { + return 'rgb(' + [colors[j].color.r, colors[j].color.g, colors[j].color.b].join(',') + ')'; + } else { + lower = colors[j - 1]; + upper = colors[j]; + range = upper.pct - lower.pct; + rangePct = (pct - lower.pct) / range; + pctLower = 1 - rangePct; + pctUpper = rangePct; + color = { + r: Math.floor(lower.color.r * pctLower + upper.color.r * pctUpper), + g: Math.floor(lower.color.g * pctLower + upper.color.g * pctUpper), + b: Math.floor(lower.color.b * pctLower + upper.color.b * pctUpper) + }; + return 'rgb(' + [color.r, color.g, color.b].join(',') + ')'; + } + } + } + +} + +/** Fix Raphael display:none tspan dy attribute bug */ +function setDy(elem, fontSize, txtYpos) { + if ((!ie || ie > 9) && elem.node.firstChild.attributes.dy) { + elem.node.firstChild.attributes.dy.value = 0; + } +} + +/** Random integer */ +function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +/** Cut hex */ +function cutHex(str) { + return (str.charAt(0) == "#") ? str.substring(1, 7) : str; +} + +/** Human friendly number suffix - From: http://stackoverflow.com/questions/2692323/code-golf-friendly-number-abbreviator */ +function humanFriendlyNumber(n, d) { + var p, d2, i, s; + + p = Math.pow; + d2 = p(10, d); + i = 7; + while (i) { + s = p(10, i-- * 3); + if (s <= n) { + n = Math.round(n * d2 / s) / d2 + "KMGTPE" [i]; + } + } + return n; +} + +/** Format numbers with commas - From: http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript */ +function formatNumber(x) { + var parts = x.toString().split("."); + parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); + return parts.join("."); +} + +/** Get style */ +function getStyle(oElm, strCssRule) { + var strValue = ""; + if (document.defaultView && document.defaultView.getComputedStyle) { + strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule); + } else if (oElm.currentStyle) { + strCssRule = strCssRule.replace(/\-(\w)/g, function(strMatch, p1) { + return p1.toUpperCase(); + }); + strValue = oElm.currentStyle[strCssRule]; + } + return strValue; +} + +/** Create Element NS Ready */ +function onCreateElementNsReady(func) { + if (document.createElementNS !== undefined) { + func(); + } else { + setTimeout(function() { + onCreateElementNsReady(func); + }, 100); + } +} + +/** Get IE version */ +// ---------------------------------------------------------- +// A short snippet for detecting versions of IE in JavaScript +// without resorting to user-agent sniffing +// ---------------------------------------------------------- +// If you're not in IE (or IE version is less than 5) then: +// ie === undefined +// If you're in IE (>=5) then you can determine which version: +// ie === 7; // IE7 +// Thus, to detect IE: +// if (ie) {} +// And to detect the version: +// ie === 6 // IE6 +// ie > 7 // IE8, IE9 ... +// ie < 9 // Anything less than IE9 +// ---------------------------------------------------------- +// UPDATE: Now using Live NodeList idea from @jdalton +var ie = (function() { + + var undef, + v = 3, + div = document.createElement('div'), + all = div.getElementsByTagName('i'); + + while ( + div.innerHTML = '', + all[0] + ); + return v > 4 ? v : undef; +}()); + +// extend target object with second object +function extend(out) { + out = out || {}; + + for (var i = 1; i < arguments.length; i++) { + if (!arguments[i]) + continue; + + for (var key in arguments[i]) { + if (arguments[i].hasOwnProperty(key)) + out[key] = arguments[i][key]; + } + } + + return out; +}; diff --git a/UI/static/raphael-2.1.4.min.js b/UI/static/raphael-2.1.4.min.js new file mode 100644 index 0000000..b907338 --- /dev/null +++ b/UI/static/raphael-2.1.4.min.js @@ -0,0 +1,12 @@ +// ┌────────────────────────────────────────────────────────────────────┐ \\ +// │ Raphaël 2.1.4 - JavaScript Vector Library │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ +// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com) │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\ +// └────────────────────────────────────────────────────────────────────┘ \\ +!function(a,b){"function"==typeof define&&define.amd?define("eve",function(){return b()}):"object"==typeof exports?module.exports=b():a.eve=b()}(this,function(){var a,b,c="0.4.2",d="hasOwnProperty",e=/[\.\/]/,f="*",g=function(){},h=function(a,b){return a-b},i={n:{}},j=function(c,d){c=String(c);var e,f=b,g=Array.prototype.slice.call(arguments,2),i=j.listeners(c),k=0,l=[],m={},n=[],o=a;a=c,b=0;for(var p=0,q=i.length;q>p;p++)"zIndex"in i[p]&&(l.push(i[p].zIndex),i[p].zIndex<0&&(m[i[p].zIndex]=i[p]));for(l.sort(h);l[k]<0;)if(e=m[l[k++]],n.push(e.apply(d,g)),b)return b=f,n;for(p=0;q>p;p++)if(e=i[p],"zIndex"in e)if(e.zIndex==l[k]){if(n.push(e.apply(d,g)),b)break;do if(k++,e=m[l[k]],e&&n.push(e.apply(d,g)),b)break;while(e)}else m[e.zIndex]=e;else if(n.push(e.apply(d,g)),b)break;return b=f,a=o,n.length?n:null};return j._events=i,j.listeners=function(a){var b,c,d,g,h,j,k,l,m=a.split(e),n=i,o=[n],p=[];for(g=0,h=m.length;h>g;g++){for(l=[],j=0,k=o.length;k>j;j++)for(n=o[j].n,c=[n[m[g]],n[f]],d=2;d--;)b=c[d],b&&(l.push(b),p=p.concat(b.f||[]));o=l}return p},j.on=function(a,b){if(a=String(a),"function"!=typeof b)return function(){};for(var c=a.split(e),d=i,f=0,h=c.length;h>f;f++)d=d.n,d=d.hasOwnProperty(c[f])&&d[c[f]]||(d[c[f]]={n:{}});for(d.f=d.f||[],f=0,h=d.f.length;h>f;f++)if(d.f[f]==b)return g;return d.f.push(b),function(a){+a==+a&&(b.zIndex=+a)}},j.f=function(a){var b=[].slice.call(arguments,1);return function(){j.apply(null,[a,null].concat(b).concat([].slice.call(arguments,0)))}},j.stop=function(){b=1},j.nt=function(b){return b?new RegExp("(?:\\.|\\/|^)"+b+"(?:\\.|\\/|$)").test(a):a},j.nts=function(){return a.split(e)},j.off=j.unbind=function(a,b){if(!a)return void(j._events=i={n:{}});var c,g,h,k,l,m,n,o=a.split(e),p=[i];for(k=0,l=o.length;l>k;k++)for(m=0;mk;k++)for(c=p[k];c.n;){if(b){if(c.f){for(m=0,n=c.f.length;n>m;m++)if(c.f[m]==b){c.f.splice(m,1);break}!c.f.length&&delete c.f}for(g in c.n)if(c.n[d](g)&&c.n[g].f){var q=c.n[g].f;for(m=0,n=q.length;n>m;m++)if(q[m]==b){q.splice(m,1);break}!q.length&&delete c.n[g].f}}else{delete c.f;for(g in c.n)c.n[d](g)&&c.n[g].f&&delete c.n[g].f}c=c.n}},j.once=function(a,b){var c=function(){return j.unbind(a,c),b.apply(this,arguments)};return j.on(a,c)},j.version=c,j.toString=function(){return"You are running Eve "+c},j}),function(a,b){"function"==typeof define&&define.amd?define("raphael.core",["eve"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("eve")):a.Raphael=b(a.eve)}(this,function(a){function b(c){if(b.is(c,"function"))return t?c():a.on("raphael.DOMload",c);if(b.is(c,U))return b._engine.create[C](b,c.splice(0,3+b.is(c[0],S))).add(c);var d=Array.prototype.slice.call(arguments,0);if(b.is(d[d.length-1],"function")){var e=d.pop();return t?e.call(b._engine.create[C](b,d)):a.on("raphael.DOMload",function(){e.call(b._engine.create[C](b,d))})}return b._engine.create[C](b,arguments)}function c(a){if("function"==typeof a||Object(a)!==a)return a;var b=new a.constructor;for(var d in a)a[y](d)&&(b[d]=c(a[d]));return b}function d(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function e(a,b,c){function e(){var f=Array.prototype.slice.call(arguments,0),g=f.join("␀"),h=e.cache=e.cache||{},i=e.count=e.count||[];return h[y](g)?(d(i,g),c?c(h[g]):h[g]):(i.length>=1e3&&delete h[i.shift()],i.push(g),h[g]=a[C](b,f),c?c(h[g]):h[g])}return e}function f(){return this.hex}function g(a,b){for(var c=[],d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}function h(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function i(a,b,c,d,e,f,g,i,j){null==j&&(j=1),j=j>1?1:0>j?0:j;for(var k=j/2,l=12,m=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],n=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],o=0,p=0;l>p;p++){var q=k*m[p]+k,r=h(q,a,c,e,g),s=h(q,b,d,f,i),t=r*r+s*s;o+=n[p]*M.sqrt(t)}return k*o}function j(a,b,c,d,e,f,g,h,j){if(!(0>j||i(a,b,c,d,e,f,g,h)o;)m/=2,n+=(j>k?1:-1)*m,k=i(a,b,c,d,e,f,g,h,n);return n}}function k(a,b,c,d,e,f,g,h){if(!(N(a,c)N(e,g)||N(b,d)N(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(k){var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(!(n<+O(a,c).toFixed(2)||n>+N(a,c).toFixed(2)||n<+O(e,g).toFixed(2)||n>+N(e,g).toFixed(2)||o<+O(b,d).toFixed(2)||o>+N(b,d).toFixed(2)||o<+O(f,h).toFixed(2)||o>+N(f,h).toFixed(2)))return{x:l,y:m}}}}function l(a,c,d){var e=b.bezierBBox(a),f=b.bezierBBox(c);if(!b.isBBoxIntersect(e,f))return d?0:[];for(var g=i.apply(0,a),h=i.apply(0,c),j=N(~~(g/5),1),l=N(~~(h/5),1),m=[],n=[],o={},p=d?0:[],q=0;j+1>q;q++){var r=b.findDotsAtSegment.apply(b,a.concat(q/j));m.push({x:r.x,y:r.y,t:q/j})}for(q=0;l+1>q;q++)r=b.findDotsAtSegment.apply(b,c.concat(q/l)),n.push({x:r.x,y:r.y,t:q/l});for(q=0;j>q;q++)for(var s=0;l>s;s++){var t=m[q],u=m[q+1],v=n[s],w=n[s+1],x=P(u.x-t.x)<.001?"y":"x",y=P(w.x-v.x)<.001?"y":"x",z=k(t.x,t.y,u.x,u.y,v.x,v.y,w.x,w.y);if(z){if(o[z.x.toFixed(4)]==z.y.toFixed(4))continue;o[z.x.toFixed(4)]=z.y.toFixed(4);var A=t.t+P((z[x]-t[x])/(u[x]-t[x]))*(u.t-t.t),B=v.t+P((z[y]-v[y])/(w[y]-v[y]))*(w.t-v.t);A>=0&&1.001>=A&&B>=0&&1.001>=B&&(d?p++:p.push({x:z.x,y:z.y,t1:O(A,1),t2:O(B,1)}))}}return p}function m(a,c,d){a=b._path2curve(a),c=b._path2curve(c);for(var e,f,g,h,i,j,k,m,n,o,p=d?0:[],q=0,r=a.length;r>q;q++){var s=a[q];if("M"==s[0])e=i=s[1],f=j=s[2];else{"C"==s[0]?(n=[e,f].concat(s.slice(1)),e=n[6],f=n[7]):(n=[e,f,e,f,i,j,i,j],e=i,f=j);for(var t=0,u=c.length;u>t;t++){var v=c[t];if("M"==v[0])g=k=v[1],h=m=v[2];else{"C"==v[0]?(o=[g,h].concat(v.slice(1)),g=o[6],h=o[7]):(o=[g,h,g,h,k,m,k,m],g=k,h=m);var w=l(n,o,d);if(d)p+=w;else{for(var x=0,y=w.length;y>x;x++)w[x].segment1=q,w[x].segment2=t,w[x].bez1=n,w[x].bez2=o;p=p.concat(w)}}}}}return p}function n(a,b,c,d,e,f){null!=a?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function o(){return this.x+G+this.y+G+this.width+" × "+this.height}function p(a,b,c,d,e,f){function g(a){return((l*a+k)*a+j)*a}function h(a,b){var c=i(a,b);return((o*c+n)*c+m)*c}function i(a,b){var c,d,e,f,h,i;for(e=a,i=0;8>i;i++){if(f=g(e)-a,P(f)e)return c;if(e>d)return d;for(;d>c;){if(f=g(e),P(f-a)f?c=e:d=e,e=(d-c)/2+c}return e}var j=3*b,k=3*(d-b)-j,l=1-j-k,m=3*c,n=3*(e-c)-m,o=1-m-n;return h(a,1/(200*f))}function q(a,b){var c=[],d={};if(this.ms=b,this.times=1,a){for(var e in a)a[y](e)&&(d[$(e)]=a[e],c.push($(e)));c.sort(ka)}this.anim=d,this.top=c[c.length-1],this.percents=c}function r(c,d,e,f,g,h){e=$(e);var i,j,k,l,m,o,q=c.ms,r={},s={},t={};if(f)for(w=0,x=fb.length;x>w;w++){var u=fb[w];if(u.el.id==d.id&&u.anim==c){u.percent!=e?(fb.splice(w,1),k=1):j=u,d.attr(u.totalOrigin);break}}else f=+s;for(var w=0,x=c.percents.length;x>w;w++){if(c.percents[w]==e||c.percents[w]>f*c.top){e=c.percents[w],m=c.percents[w-1]||0,q=q/c.top*(e-m),l=c.percents[w+1],i=c.anim[e];break}f&&d.attr(c.anim[c.percents[w]])}if(i){if(j)j.initstatus=f,j.start=new Date-j.ms*f;else{for(var z in i)if(i[y](z)&&(ca[y](z)||d.paper.customAttributes[y](z)))switch(r[z]=d.attr(z),null==r[z]&&(r[z]=ba[z]),s[z]=i[z],ca[z]){case S:t[z]=(s[z]-r[z])/q;break;case"colour":r[z]=b.getRGB(r[z]);var A=b.getRGB(s[z]);t[z]={r:(A.r-r[z].r)/q,g:(A.g-r[z].g)/q,b:(A.b-r[z].b)/q};break;case"path":var B=Ia(r[z],s[z]),C=B[1];for(r[z]=B[0],t[z]=[],w=0,x=r[z].length;x>w;w++){t[z][w]=[0];for(var E=1,F=r[z][w].length;F>E;E++)t[z][w][E]=(C[w][E]-r[z][w][E])/q}break;case"transform":var G=d._,J=Na(G[z],s[z]);if(J)for(r[z]=J.from,s[z]=J.to,t[z]=[],t[z].real=!0,w=0,x=r[z].length;x>w;w++)for(t[z][w]=[r[z][w][0]],E=1,F=r[z][w].length;F>E;E++)t[z][w][E]=(s[z][w][E]-r[z][w][E])/q;else{var K=d.matrix||new n,L={_:{transform:G.transform},getBBox:function(){return d.getBBox(1)}};r[z]=[K.a,K.b,K.c,K.d,K.e,K.f],La(L,s[z]),s[z]=L._.transform,t[z]=[(L.matrix.a-K.a)/q,(L.matrix.b-K.b)/q,(L.matrix.c-K.c)/q,(L.matrix.d-K.d)/q,(L.matrix.e-K.e)/q,(L.matrix.f-K.f)/q]}break;case"csv":var M=H(i[z])[I](v),N=H(r[z])[I](v);if("clip-rect"==z)for(r[z]=N,t[z]=[],w=N.length;w--;)t[z][w]=(M[w]-r[z][w])/q;s[z]=M;break;default:for(M=[][D](i[z]),N=[][D](r[z]),t[z]=[],w=d.paper.customAttributes[z].length;w--;)t[z][w]=((M[w]||0)-(N[w]||0))/q}var O=i.easing,P=b.easing_formulas[O];if(!P)if(P=H(O).match(Y),P&&5==P.length){var Q=P;P=function(a){return p(a,+Q[1],+Q[2],+Q[3],+Q[4],q)}}else P=la;if(o=i.start||c.start||+new Date,u={anim:c,percent:e,timestamp:o,start:o+(c.del||0),status:0,initstatus:f||0,stop:!1,ms:q,easing:P,from:r,diff:t,to:s,el:d,callback:i.callback,prev:m,next:l,repeat:h||c.times,origin:d.attr(),totalOrigin:g},fb.push(u),f&&!j&&!k&&(u.stop=!0,u.start=new Date-q*f,1==fb.length))return hb();k&&(u.start=new Date-u.ms*f),1==fb.length&&gb(hb)}a("raphael.anim.start."+d.id,d,c)}}function s(a){for(var b=0;be;e++)for(i=a[e],f=1,h=i.length;h>f;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d;return a};if(b._g=z,b.type=z.win.SVGAngle||z.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML","VML"==b.type){var qa,ra=z.doc.createElement("div");if(ra.innerHTML='',qa=ra.firstChild,qa.style.behavior="url(#default#VML)",!qa||"object"!=typeof qa.adj)return b.type=F;ra=null}b.svg=!(b.vml="VML"==b.type),b._Paper=B,b.fn=u=B.prototype=b.prototype,b._id=0,b._oid=0,b.is=function(a,b){return b=L.call(b),"finite"==b?!X[y](+a):"array"==b?a instanceof Array:"null"==b&&null===a||b==typeof a&&null!==a||"object"==b&&a===Object(a)||"array"==b&&Array.isArray&&Array.isArray(a)||V.call(a).slice(8,-1).toLowerCase()==b},b.angle=function(a,c,d,e,f,g){if(null==f){var h=a-d,i=c-e;return h||i?(180+180*M.atan2(-i,-h)/R+360)%360:0}return b.angle(a,c,f,g)-b.angle(d,e,f,g)},b.rad=function(a){return a%360*R/180},b.deg=function(a){return Math.round(180*a/R%360*1e3)/1e3},b.snapTo=function(a,c,d){if(d=b.is(d,"finite")?d:10,b.is(a,U)){for(var e=a.length;e--;)if(P(a[e]-c)<=d)return a[e]}else{a=+a;var f=c%a;if(d>f)return c-f;if(f>a-d)return c-f+a}return c};b.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=16*M.random()|0,c="x"==a?b:3&b|8;return c.toString(16)});b.setWindow=function(c){a("raphael.setWindow",b,z.win,c),z.win=c,z.doc=z.win.document,b._engine.initWin&&b._engine.initWin(z.win)};var sa=function(a){if(b.vml){var c,d=/^\s+|\s+$/g;try{var f=new ActiveXObject("htmlfile");f.write(""),f.close(),c=f.body}catch(g){c=createPopup().document.body}var h=c.createTextRange();sa=e(function(a){try{c.style.color=H(a).replace(d,F);var b=h.queryCommandValue("ForeColor");return b=(255&b)<<16|65280&b|(16711680&b)>>>16,"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=z.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",z.doc.body.appendChild(i),sa=e(function(a){return i.style.color=a,z.doc.defaultView.getComputedStyle(i,F).getPropertyValue("color")})}return sa(a)},ta=function(){return"hsb("+[this.h,this.s,this.b]+")"},ua=function(){return"hsl("+[this.h,this.s,this.l]+")"},va=function(){return this.hex},wa=function(a,c,d){if(null==c&&b.is(a,"object")&&"r"in a&&"g"in a&&"b"in a&&(d=a.b,c=a.g,a=a.r),null==c&&b.is(a,T)){var e=b.getRGB(a);a=e.r,c=e.g,d=e.b}return(a>1||c>1||d>1)&&(a/=255,c/=255,d/=255),[a,c,d]},xa=function(a,c,d,e){a*=255,c*=255,d*=255;var f={r:a,g:c,b:d,hex:b.rgb(a,c,d),toString:va};return b.is(e,"finite")&&(f.opacity=e),f};b.color=function(a){var c;return b.is(a,"object")&&"h"in a&&"s"in a&&"b"in a?(c=b.hsb2rgb(a),a.r=c.r,a.g=c.g,a.b=c.b,a.hex=c.hex):b.is(a,"object")&&"h"in a&&"s"in a&&"l"in a?(c=b.hsl2rgb(a),a.r=c.r,a.g=c.g,a.b=c.b,a.hex=c.hex):(b.is(a,"string")&&(a=b.getRGB(a)),b.is(a,"object")&&"r"in a&&"g"in a&&"b"in a?(c=b.rgb2hsl(a),a.h=c.h,a.s=c.s,a.l=c.l,c=b.rgb2hsb(a),a.v=c.b):(a={hex:"none"},a.r=a.g=a.b=a.h=a.s=a.v=a.l=-1)),a.toString=va,a},b.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,d=a.o,a=a.h),a*=360;var e,f,g,h,i;return a=a%360/60,i=c*b,h=i*(1-P(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],xa(e,f,g,d)},b.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h),(a>1||b>1||c>1)&&(a/=360,b/=100,c/=100),a*=360;var e,f,g,h,i;return a=a%360/60,i=2*b*(.5>c?c:1-c),h=i*(1-P(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],xa(e,f,g,d)},b.rgb2hsb=function(a,b,c){c=wa(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;return f=N(a,b,c),g=f-O(a,b,c),d=0==g?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=0==g?0:g/f,{h:d,s:e,b:f,toString:ta}},b.rgb2hsl=function(a,b,c){c=wa(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;return g=N(a,b,c),h=O(a,b,c),i=g-h,d=0==i?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=0==i?0:.5>f?i/(2*f):i/(2-2*f),{h:d,s:e,l:f,toString:ua}},b._path2string=function(){return this.join(",").replace(fa,"$1")};b._preload=function(a,b){var c=z.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,z.doc.body.removeChild(this)},c.onerror=function(){z.doc.body.removeChild(this)},z.doc.body.appendChild(c),c.src=a};b.getRGB=e(function(a){if(!a||(a=H(a)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:f};if("none"==a)return{r:-1,g:-1,b:-1,hex:"none",toString:f};!(ea[y](a.toLowerCase().substring(0,2))||"#"==a.charAt())&&(a=sa(a));var c,d,e,g,h,i,j=a.match(W);return j?(j[2]&&(e=_(j[2].substring(5),16),d=_(j[2].substring(3,5),16),c=_(j[2].substring(1,3),16)),j[3]&&(e=_((h=j[3].charAt(3))+h,16),d=_((h=j[3].charAt(2))+h,16),c=_((h=j[3].charAt(1))+h,16)),j[4]&&(i=j[4][I](da),c=$(i[0]),"%"==i[0].slice(-1)&&(c*=2.55),d=$(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=$(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),"rgba"==j[1].toLowerCase().slice(0,4)&&(g=$(i[3])),i[3]&&"%"==i[3].slice(-1)&&(g/=100)),j[5]?(i=j[5][I](da),c=$(i[0]),"%"==i[0].slice(-1)&&(c*=2.55),d=$(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=$(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(c/=360),"hsba"==j[1].toLowerCase().slice(0,4)&&(g=$(i[3])),i[3]&&"%"==i[3].slice(-1)&&(g/=100),b.hsb2rgb(c,d,e,g)):j[6]?(i=j[6][I](da),c=$(i[0]),"%"==i[0].slice(-1)&&(c*=2.55),d=$(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=$(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(c/=360),"hsla"==j[1].toLowerCase().slice(0,4)&&(g=$(i[3])),i[3]&&"%"==i[3].slice(-1)&&(g/=100),b.hsl2rgb(c,d,e,g)):(j={r:c,g:d,b:e,toString:f},j.hex="#"+(16777216|e|d<<8|c<<16).toString(16).slice(1),b.is(g,"finite")&&(j.opacity=g),j)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:f}},b),b.hsb=e(function(a,c,d){return b.hsb2rgb(a,c,d).hex}),b.hsl=e(function(a,c,d){return b.hsl2rgb(a,c,d).hex}),b.rgb=e(function(a,b,c){function d(a){return a+.5|0}return"#"+(16777216|d(c)|d(b)<<8|d(a)<<16).toString(16).slice(1)}),b.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);return b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b})),c.hex},b.getColor.reset=function(){delete this.start},b.parsePathString=function(a){if(!a)return null;var c=ya(a);if(c.arr)return Aa(c.arr);var d={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},e=[];return b.is(a,U)&&b.is(a[0],U)&&(e=Aa(a)),e.length||H(a).replace(ga,function(a,b,c){var f=[],g=b.toLowerCase();if(c.replace(ia,function(a,b){b&&f.push(+b)}),"m"==g&&f.length>2&&(e.push([b][D](f.splice(0,2))),g="l",b="m"==b?"l":"L"),"r"==g)e.push([b][D](f));else for(;f.length>=d[g]&&(e.push([b][D](f.splice(0,d[g]))),d[g]););}),e.toString=b._path2string,c.arr=Aa(e),e},b.parseTransformString=e(function(a){if(!a)return null;var c=[];return b.is(a,U)&&b.is(a[0],U)&&(c=Aa(a)),c.length||H(a).replace(ha,function(a,b,d){{var e=[];L.call(b)}d.replace(ia,function(a,b){b&&e.push(+b)}),c.push([b][D](e))}),c.toString=b._path2string,c});var ya=function(a){var b=ya.ps=ya.ps||{};return b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[y](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])}),b[a]};b.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=Q(j,3),l=Q(j,2),m=i*i,n=m*i,o=k*a+3*l*i*c+3*j*i*i*e+n*g,p=k*b+3*l*i*d+3*j*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,w=j*e+i*g,x=j*f+i*h,y=90-180*M.atan2(q-s,r-t)/R;return(q>s||t>r)&&(y+=180),{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:w,y:x},alpha:y}},b.bezierBBox=function(a,c,d,e,f,g,h,i){b.is(a,"array")||(a=[a,c,d,e,f,g,h,i]);var j=Ha.apply(null,a);return{x:j.min.x,y:j.min.y,x2:j.max.x,y2:j.max.y,width:j.max.x-j.min.x,height:j.max.y-j.min.y}},b.isPointInsideBBox=function(a,b,c){return b>=a.x&&b<=a.x2&&c>=a.y&&c<=a.y2},b.isBBoxIntersect=function(a,c){var d=b.isPointInsideBBox;return d(c,a.x,a.y)||d(c,a.x2,a.y)||d(c,a.x,a.y2)||d(c,a.x2,a.y2)||d(a,c.x,c.y)||d(a,c.x2,c.y)||d(a,c.x,c.y2)||d(a,c.x2,c.y2)||(a.xc.x||c.xa.x)&&(a.yc.y||c.ya.y)},b.pathIntersection=function(a,b){return m(a,b)},b.pathIntersectionNumber=function(a,b){return m(a,b,1)},b.isPointInsidePath=function(a,c,d){var e=b.pathBBox(a);return b.isPointInsideBBox(e,c,d)&&m(a,[["M",c,d],["H",e.x2+10]],1)%2==1},b._removedFactory=function(b){return function(){a("raphael.log",null,"Raphaël: you are calling to method “"+b+"” of removed object",b)}};var za=b.pathBBox=function(a){var b=ya(a);if(b.bbox)return c(b.bbox);if(!a)return{x:0,y:0,width:0,height:0,x2:0,y2:0};a=Ia(a);for(var d,e=0,f=0,g=[],h=[],i=0,j=a.length;j>i;i++)if(d=a[i],"M"==d[0])e=d[1],f=d[2],g.push(e),h.push(f);else{var k=Ha(e,f,d[1],d[2],d[3],d[4],d[5],d[6]);g=g[D](k.min.x,k.max.x),h=h[D](k.min.y,k.max.y),e=d[5],f=d[6]}var l=O[C](0,g),m=O[C](0,h),n=N[C](0,g),o=N[C](0,h),p=n-l,q=o-m,r={x:l,y:m,x2:n,y2:o,width:p,height:q,cx:l+p/2,cy:m+q/2};return b.bbox=c(r),r},Aa=function(a){var d=c(a);return d.toString=b._path2string,d},Ba=b._pathToRelative=function(a){var c=ya(a);if(c.rel)return Aa(c.rel);b.is(a,U)&&b.is(a&&a[0],U)||(a=b.parsePathString(a));var d=[],e=0,f=0,g=0,h=0,i=0;"M"==a[0][0]&&(e=a[0][1],f=a[0][2],g=e,h=f,i++,d.push(["M",e,f]));for(var j=i,k=a.length;k>j;j++){var l=d[j]=[],m=a[j];if(m[0]!=L.call(m[0]))switch(l[0]=L.call(m[0]),l[0]){case"a":l[1]=m[1],l[2]=m[2],l[3]=m[3],l[4]=m[4],l[5]=m[5],l[6]=+(m[6]-e).toFixed(3),l[7]=+(m[7]-f).toFixed(3);break;case"v":l[1]=+(m[1]-f).toFixed(3);break;case"m":g=m[1],h=m[2];default:for(var n=1,o=m.length;o>n;n++)l[n]=+(m[n]-(n%2?e:f)).toFixed(3)}else{l=d[j]=[],"m"==m[0]&&(g=m[1]+e,h=m[2]+f);for(var p=0,q=m.length;q>p;p++)d[j][p]=m[p]}var r=d[j].length;switch(d[j][0]){case"z":e=g,f=h;break;case"h":e+=+d[j][r-1];break;case"v":f+=+d[j][r-1];break;default:e+=+d[j][r-2],f+=+d[j][r-1]}}return d.toString=b._path2string,c.rel=Aa(d),d},Ca=b._pathToAbsolute=function(a){var c=ya(a);if(c.abs)return Aa(c.abs);if(b.is(a,U)&&b.is(a&&a[0],U)||(a=b.parsePathString(a)),!a||!a.length)return[["M",0,0]];var d=[],e=0,f=0,h=0,i=0,j=0;"M"==a[0][0]&&(e=+a[0][1],f=+a[0][2],h=e,i=f,j++,d[0]=["M",e,f]);for(var k,l,m=3==a.length&&"M"==a[0][0]&&"R"==a[1][0].toUpperCase()&&"Z"==a[2][0].toUpperCase(),n=j,o=a.length;o>n;n++){if(d.push(k=[]),l=a[n],l[0]!=aa.call(l[0]))switch(k[0]=aa.call(l[0]),k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+e),k[7]=+(l[7]+f);break;case"V":k[1]=+l[1]+f;break;case"H":k[1]=+l[1]+e;break;case"R":for(var p=[e,f][D](l.slice(1)),q=2,r=p.length;r>q;q++)p[q]=+p[q]+e,p[++q]=+p[q]+f;d.pop(),d=d[D](g(p,m));break;case"M":h=+l[1]+e,i=+l[2]+f;default:for(q=1,r=l.length;r>q;q++)k[q]=+l[q]+(q%2?e:f)}else if("R"==l[0])p=[e,f][D](l.slice(1)),d.pop(),d=d[D](g(p,m)),k=["R"][D](l.slice(-2));else for(var s=0,t=l.length;t>s;s++)k[s]=l[s];switch(k[0]){case"Z":e=h,f=i;break;case"H":e=k[1];break;case"V":f=k[1];break;case"M":h=k[k.length-2],i=k[k.length-1];default:e=k[k.length-2],f=k[k.length-1]}}return d.toString=b._path2string,c.abs=Aa(d),d},Da=function(a,b,c,d){return[a,b,c,d,c,d]},Ea=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},Fa=function(a,b,c,d,f,g,h,i,j,k){var l,m=120*R/180,n=R/180*(+f||0),o=[],p=e(function(a,b,c){var d=a*M.cos(c)-b*M.sin(c),e=a*M.sin(c)+b*M.cos(c);return{x:d,y:e}});if(k)y=k[0],z=k[1],w=k[2],x=k[3];else{l=p(a,b,-n),a=l.x,b=l.y,l=p(i,j,-n),i=l.x,j=l.y;var q=(M.cos(R/180*f),M.sin(R/180*f),(a-i)/2),r=(b-j)/2,s=q*q/(c*c)+r*r/(d*d);s>1&&(s=M.sqrt(s),c=s*c,d=s*d);var t=c*c,u=d*d,v=(g==h?-1:1)*M.sqrt(P((t*u-t*r*r-u*q*q)/(t*r*r+u*q*q))),w=v*c*r/d+(a+i)/2,x=v*-d*q/c+(b+j)/2,y=M.asin(((b-x)/d).toFixed(9)),z=M.asin(((j-x)/d).toFixed(9));y=w>a?R-y:y,z=w>i?R-z:z,0>y&&(y=2*R+y),0>z&&(z=2*R+z),h&&y>z&&(y-=2*R),!h&&z>y&&(z-=2*R)}var A=z-y;if(P(A)>m){var B=z,C=i,E=j;z=y+m*(h&&z>y?1:-1),i=w+c*M.cos(z),j=x+d*M.sin(z),o=Fa(i,j,c,d,f,0,h,C,E,[z,B,w,x])}A=z-y;var F=M.cos(y),G=M.sin(y),H=M.cos(z),J=M.sin(z),K=M.tan(A/4),L=4/3*c*K,N=4/3*d*K,O=[a,b],Q=[a+L*G,b-N*F],S=[i+L*J,j-N*H],T=[i,j];if(Q[0]=2*O[0]-Q[0],Q[1]=2*O[1]-Q[1],k)return[Q,S,T][D](o);o=[Q,S,T][D](o).join()[I](",");for(var U=[],V=0,W=o.length;W>V;V++)U[V]=V%2?p(o[V-1],o[V],n).y:p(o[V],o[V+1],n).x;return U},Ga=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:Q(j,3)*a+3*Q(j,2)*i*c+3*j*i*i*e+Q(i,3)*g,y:Q(j,3)*b+3*Q(j,2)*i*d+3*j*i*i*f+Q(i,3)*h}},Ha=e(function(a,b,c,d,e,f,g,h){var i,j=e-2*c+a-(g-2*e+c),k=2*(c-a)-2*(e-c),l=a-c,m=(-k+M.sqrt(k*k-4*j*l))/2/j,n=(-k-M.sqrt(k*k-4*j*l))/2/j,o=[b,h],p=[a,g];return P(m)>"1e12"&&(m=.5),P(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ga(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ga(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),j=f-2*d+b-(h-2*f+d),k=2*(d-b)-2*(f-d),l=b-d,m=(-k+M.sqrt(k*k-4*j*l))/2/j,n=(-k-M.sqrt(k*k-4*j*l))/2/j,P(m)>"1e12"&&(m=.5),P(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ga(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ga(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),{min:{x:O[C](0,p),y:O[C](0,o)},max:{x:N[C](0,p),y:N[C](0,o)}}}),Ia=b._path2curve=e(function(a,b){var c=!b&&ya(a);if(!b&&c.curve)return Aa(c.curve);for(var d=Ca(a),e=b&&Ca(b),f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},h=(function(a,b,c){var d,e,f={T:1,Q:1};if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];switch(!(a[0]in f)&&(b.qx=b.qy=null),a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][D](Fa[C](0,[b.x,b.y][D](a.slice(1))));break;case"S":"C"==c||"S"==c?(d=2*b.x-b.bx,e=2*b.y-b.by):(d=b.x,e=b.y),a=["C",d,e][D](a.slice(1));break;case"T":"Q"==c||"T"==c?(b.qx=2*b.x-b.qx,b.qy=2*b.y-b.qy):(b.qx=b.x,b.qy=b.y),a=["C"][D](Ea(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][D](Ea(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][D](Da(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][D](Da(b.x,b.y,a[1],b.y));break;case"V":a=["C"][D](Da(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][D](Da(b.x,b.y,b.X,b.Y))}return a}),i=function(a,b){if(a[b].length>7){a[b].shift();for(var c=a[b];c.length;)k[b]="A",e&&(l[b]="A"),a.splice(b++,0,["C"][D](c.splice(0,6)));a.splice(b,1),p=N(d.length,e&&e.length||0)}},j=function(a,b,c,f,g){a&&b&&"M"==a[g][0]&&"M"!=b[g][0]&&(b.splice(g,0,["M",f.x,f.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],p=N(d.length,e&&e.length||0))},k=[],l=[],m="",n="",o=0,p=N(d.length,e&&e.length||0);p>o;o++){d[o]&&(m=d[o][0]),"C"!=m&&(k[o]=m,o&&(n=k[o-1])),d[o]=h(d[o],f,n),"A"!=k[o]&&"C"==m&&(k[o]="C"),i(d,o),e&&(e[o]&&(m=e[o][0]),"C"!=m&&(l[o]=m,o&&(n=l[o-1])),e[o]=h(e[o],g,n),"A"!=l[o]&&"C"==m&&(l[o]="C"),i(e,o)),j(d,e,f,g,o),j(e,d,g,f,o);var q=d[o],r=e&&e[o],s=q.length,t=e&&r.length;f.x=q[s-2],f.y=q[s-1],f.bx=$(q[s-4])||f.x,f.by=$(q[s-3])||f.y,g.bx=e&&($(r[t-4])||g.x),g.by=e&&($(r[t-3])||g.y),g.x=e&&r[t-2],g.y=e&&r[t-1]}return e||(c.curve=Aa(d)),e?[d,e]:d},null,Aa),Ja=(b._parseDots=e(function(a){for(var c=[],d=0,e=a.length;e>d;d++){var f={},g=a[d].match(/^([^:]*):?([\d\.]*)/);if(f.color=b.getRGB(g[1]),f.color.error)return null;f.opacity=f.color.opacity,f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),c.push(f)}for(d=1,e=c.length-1;e>d;d++)if(!c[d].offset){for(var h=$(c[d-1].offset||0),i=0,j=d+1;e>j;j++)if(c[j].offset){i=c[j].offset;break}i||(i=100,j=e),i=$(i);for(var k=(i-h)/(j-d+1);j>d;d++)h+=k,c[d].offset=h+"%"}return c}),b._tear=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)}),Ka=(b._tofront=function(a,b){b.top!==a&&(Ja(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},b._toback=function(a,b){b.bottom!==a&&(Ja(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},b._insertafter=function(a,b,c){Ja(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},b._insertbefore=function(a,b,c){Ja(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},b.toMatrix=function(a,b){var c=za(a),d={_:{transform:F},getBBox:function(){return c}};return La(d,b),d.matrix}),La=(b.transformPath=function(a,b){return pa(a,Ka(a,b))},b._extractTransform=function(a,c){if(null==c)return a._.transform;c=H(c).replace(/\.{3}|\u2026/g,a._.transform||F);var d=b.parseTransformString(c),e=0,f=0,g=0,h=1,i=1,j=a._,k=new n;if(j.transform=d||[],d)for(var l=0,m=d.length;m>l;l++){var o,p,q,r,s,t=d[l],u=t.length,v=H(t[0]).toLowerCase(),w=t[0]!=v,x=w?k.invert():0;"t"==v&&3==u?w?(o=x.x(0,0),p=x.y(0,0),q=x.x(t[1],t[2]),r=x.y(t[1],t[2]),k.translate(q-o,r-p)):k.translate(t[1],t[2]):"r"==v?2==u?(s=s||a.getBBox(1),k.rotate(t[1],s.x+s.width/2,s.y+s.height/2),e+=t[1]):4==u&&(w?(q=x.x(t[2],t[3]),r=x.y(t[2],t[3]),k.rotate(t[1],q,r)):k.rotate(t[1],t[2],t[3]),e+=t[1]):"s"==v?2==u||3==u?(s=s||a.getBBox(1),k.scale(t[1],t[u-1],s.x+s.width/2,s.y+s.height/2),h*=t[1],i*=t[u-1]):5==u&&(w?(q=x.x(t[3],t[4]),r=x.y(t[3],t[4]),k.scale(t[1],t[2],q,r)):k.scale(t[1],t[2],t[3],t[4]),h*=t[1],i*=t[2]):"m"==v&&7==u&&k.add(t[1],t[2],t[3],t[4],t[5],t[6]),j.dirtyT=1,a.matrix=k}a.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.e,j.dy=g=k.f,1==h&&1==i&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1}),Ma=function(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return 4==a.length?[b,0,a[2],a[3]]:[b,0];case"s":return 5==a.length?[b,1,1,a[3],a[4]]:3==a.length?[b,1,1]:[b,1]}},Na=b._equaliseTransform=function(a,c){ +c=H(c).replace(/\.{3}|\u2026/g,a),a=b.parseTransformString(a)||[],c=b.parseTransformString(c)||[];for(var d,e,f,g,h=N(a.length,c.length),i=[],j=[],k=0;h>k;k++){if(f=a[k]||Ma(c[k]),g=c[k]||Ma(f),f[0]!=g[0]||"r"==f[0].toLowerCase()&&(f[2]!=g[2]||f[3]!=g[3])||"s"==f[0].toLowerCase()&&(f[3]!=g[3]||f[4]!=g[4]))return;for(i[k]=[],j[k]=[],d=0,e=N(f.length,g.length);e>d;d++)d in f&&(i[k][d]=f[d]),d in g&&(j[k][d]=g[d])}return{from:i,to:j}};b._getContainer=function(a,c,d,e){var f;return f=null!=e||b.is(a,"object")?a:z.doc.getElementById(a),null!=f?f.tagName?null==c?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:c,height:d}:{container:1,x:a,y:c,width:d,height:e}:void 0},b.pathToRelative=Ba,b._engine={},b.path2curve=Ia,b.matrix=function(a,b,c,d,e,f){return new n(a,b,c,d,e,f)},function(a){function c(a){return a[0]*a[0]+a[1]*a[1]}function d(a){var b=M.sqrt(c(a));a[0]&&(a[0]/=b),a[1]&&(a[1]/=b)}a.add=function(a,b,c,d,e,f){var g,h,i,j,k=[[],[],[]],l=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],m=[[a,c,e],[b,d,f],[0,0,1]];for(a&&a instanceof n&&(m=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]),g=0;3>g;g++)for(h=0;3>h;h++){for(j=0,i=0;3>i;i++)j+=l[g][i]*m[i][h];k[g][h]=j}this.a=k[0][0],this.b=k[1][0],this.c=k[0][1],this.d=k[1][1],this.e=k[0][2],this.f=k[1][2]},a.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new n(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},a.clone=function(){return new n(this.a,this.b,this.c,this.d,this.e,this.f)},a.translate=function(a,b){this.add(1,0,0,1,a,b)},a.scale=function(a,b,c,d){null==b&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d)},a.rotate=function(a,c,d){a=b.rad(a),c=c||0,d=d||0;var e=+M.cos(a).toFixed(9),f=+M.sin(a).toFixed(9);this.add(e,f,-f,e,c,d),this.add(1,0,0,1,-c,-d)},a.x=function(a,b){return a*this.a+b*this.c+this.e},a.y=function(a,b){return a*this.b+b*this.d+this.f},a.get=function(a){return+this[H.fromCharCode(97+a)].toFixed(4)},a.toString=function(){return b.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},a.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},a.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},a.split=function(){var a={};a.dx=this.e,a.dy=this.f;var e=[[this.a,this.c],[this.b,this.d]];a.scalex=M.sqrt(c(e[0])),d(e[0]),a.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*a.shear,e[1][1]-e[0][1]*a.shear],a.scaley=M.sqrt(c(e[1])),d(e[1]),a.shear/=a.scaley;var f=-e[0][1],g=e[1][1];return 0>g?(a.rotate=b.deg(M.acos(g)),0>f&&(a.rotate=360-a.rotate)):a.rotate=b.deg(M.asin(f)),a.isSimple=!(+a.shear.toFixed(9)||a.scalex.toFixed(9)!=a.scaley.toFixed(9)&&a.rotate),a.isSuperSimple=!+a.shear.toFixed(9)&&a.scalex.toFixed(9)==a.scaley.toFixed(9)&&!a.rotate,a.noRotation=!+a.shear.toFixed(9)&&!a.rotate,a},a.toTransformString=function(a){var b=a||this[I]();return b.isSimple?(b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4),(b.dx||b.dy?"t"+[b.dx,b.dy]:F)+(1!=b.scalex||1!=b.scaley?"s"+[b.scalex,b.scaley,0,0]:F)+(b.rotate?"r"+[b.rotate,0,0]:F)):"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(n.prototype);for(var Oa=function(){this.returnValue=!1},Pa=function(){return this.originalEvent.preventDefault()},Qa=function(){this.cancelBubble=!0},Ra=function(){return this.originalEvent.stopPropagation()},Sa=function(a){var b=z.doc.documentElement.scrollTop||z.doc.body.scrollTop,c=z.doc.documentElement.scrollLeft||z.doc.body.scrollLeft;return{x:a.clientX+c,y:a.clientY+b}},Ta=function(){return z.doc.addEventListener?function(a,b,c,d){var e=function(a){var b=Sa(a);return c.call(d,a,b.x,b.y)};if(a.addEventListener(b,e,!1),E&&K[b]){var f=function(b){for(var e=Sa(b),f=b,g=0,h=b.targetTouches&&b.targetTouches.length;h>g;g++)if(b.targetTouches[g].target==a){b=b.targetTouches[g],b.originalEvent=f,b.preventDefault=Pa,b.stopPropagation=Ra;break}return c.call(d,b,e.x,e.y)};a.addEventListener(K[b],f,!1)}return function(){return a.removeEventListener(b,e,!1),E&&K[b]&&a.removeEventListener(K[b],f,!1),!0}}:z.doc.attachEvent?function(a,b,c,d){var e=function(a){a=a||z.win.event;var b=z.doc.documentElement.scrollTop||z.doc.body.scrollTop,e=z.doc.documentElement.scrollLeft||z.doc.body.scrollLeft,f=a.clientX+e,g=a.clientY+b;return a.preventDefault=a.preventDefault||Oa,a.stopPropagation=a.stopPropagation||Qa,c.call(d,a,f,g)};a.attachEvent("on"+b,e);var f=function(){return a.detachEvent("on"+b,e),!0};return f}:void 0}(),Ua=[],Va=function(b){for(var c,d=b.clientX,e=b.clientY,f=z.doc.documentElement.scrollTop||z.doc.body.scrollTop,g=z.doc.documentElement.scrollLeft||z.doc.body.scrollLeft,h=Ua.length;h--;){if(c=Ua[h],E&&b.touches){for(var i,j=b.touches.length;j--;)if(i=b.touches[j],i.identifier==c.el._drag.id){d=i.clientX,e=i.clientY,(b.originalEvent?b.originalEvent:b).preventDefault();break}}else b.preventDefault();var k,l=c.el.node,m=l.nextSibling,n=l.parentNode,o=l.style.display;z.win.opera&&n.removeChild(l),l.style.display="none",k=c.el.paper.getElementByPoint(d,e),l.style.display=o,z.win.opera&&(m?n.insertBefore(l,m):n.appendChild(l)),k&&a("raphael.drag.over."+c.el.id,c.el,k),d+=g,e+=f,a("raphael.drag.move."+c.el.id,c.move_scope||c.el,d-c.el._drag.x,e-c.el._drag.y,d,e,b)}},Wa=function(c){b.unmousemove(Va).unmouseup(Wa);for(var d,e=Ua.length;e--;)d=Ua[e],d.el._drag={},a("raphael.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,c);Ua=[]},Xa=b.el={},Ya=J.length;Ya--;)!function(a){b[a]=Xa[a]=function(c,d){return b.is(c,"function")&&(this.events=this.events||[],this.events.push({name:a,f:c,unbind:Ta(this.shape||this.node||z.doc,a,c,d||this)})),this},b["un"+a]=Xa["un"+a]=function(c){for(var d=this.events||[],e=d.length;e--;)d[e].name!=a||!b.is(c,"undefined")&&d[e].f!=c||(d[e].unbind(),d.splice(e,1),!d.length&&delete this.events);return this}}(J[Ya]);Xa.data=function(c,d){var e=ja[this.id]=ja[this.id]||{};if(0==arguments.length)return e;if(1==arguments.length){if(b.is(c,"object")){for(var f in c)c[y](f)&&this.data(f,c[f]);return this}return a("raphael.data.get."+this.id,this,e[c],c),e[c]}return e[c]=d,a("raphael.data.set."+this.id,this,d,c),this},Xa.removeData=function(a){return null==a?ja[this.id]={}:ja[this.id]&&delete ja[this.id][a],this},Xa.getData=function(){return c(ja[this.id]||{})},Xa.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},Xa.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var Za=[];Xa.drag=function(c,d,e,f,g,h){function i(i){(i.originalEvent||i).preventDefault();var j=i.clientX,k=i.clientY,l=z.doc.documentElement.scrollTop||z.doc.body.scrollTop,m=z.doc.documentElement.scrollLeft||z.doc.body.scrollLeft;if(this._drag.id=i.identifier,E&&i.touches)for(var n,o=i.touches.length;o--;)if(n=i.touches[o],this._drag.id=n.identifier,n.identifier==this._drag.id){j=n.clientX,k=n.clientY;break}this._drag.x=j+m,this._drag.y=k+l,!Ua.length&&b.mousemove(Va).mouseup(Wa),Ua.push({el:this,move_scope:f,start_scope:g,end_scope:h}),d&&a.on("raphael.drag.start."+this.id,d),c&&a.on("raphael.drag.move."+this.id,c),e&&a.on("raphael.drag.end."+this.id,e),a("raphael.drag.start."+this.id,g||f||this,i.clientX+m,i.clientY+l,i)}return this._drag={},Za.push({el:this,start:i}),this.mousedown(i),this},Xa.onDragOver=function(b){b?a.on("raphael.drag.over."+this.id,b):a.unbind("raphael.drag.over."+this.id)},Xa.undrag=function(){for(var c=Za.length;c--;)Za[c].el==this&&(this.unmousedown(Za[c].start),Za.splice(c,1),a.unbind("raphael.drag.*."+this.id));!Za.length&&b.unmousemove(Va).unmouseup(Wa),Ua=[]},u.circle=function(a,c,d){var e=b._engine.circle(this,a||0,c||0,d||0);return this.__set__&&this.__set__.push(e),e},u.rect=function(a,c,d,e,f){var g=b._engine.rect(this,a||0,c||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},u.ellipse=function(a,c,d,e){var f=b._engine.ellipse(this,a||0,c||0,d||0,e||0);return this.__set__&&this.__set__.push(f),f},u.path=function(a){a&&!b.is(a,T)&&!b.is(a[0],U)&&(a+=F);var c=b._engine.path(b.format[C](b,arguments),this);return this.__set__&&this.__set__.push(c),c},u.image=function(a,c,d,e,f){var g=b._engine.image(this,a||"about:blank",c||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},u.text=function(a,c,d){var e=b._engine.text(this,a||0,c||0,H(d));return this.__set__&&this.__set__.push(e),e},u.set=function(a){!b.is(a,"array")&&(a=Array.prototype.splice.call(arguments,0,arguments.length));var c=new jb(a);return this.__set__&&this.__set__.push(c),c.paper=this,c.type="set",c},u.setStart=function(a){this.__set__=a||this.set()},u.setFinish=function(a){var b=this.__set__;return delete this.__set__,b},u.getSize=function(){var a=this.canvas.parentNode;return{width:a.offsetWidth,height:a.offsetHeight}},u.setSize=function(a,c){return b._engine.setSize.call(this,a,c)},u.setViewBox=function(a,c,d,e,f){return b._engine.setViewBox.call(this,a,c,d,e,f)},u.top=u.bottom=null,u.raphael=b;var $a=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,g=e.clientLeft||d.clientLeft||0,h=b.top+(z.win.pageYOffset||e.scrollTop||d.scrollTop)-f,i=b.left+(z.win.pageXOffset||e.scrollLeft||d.scrollLeft)-g;return{y:h,x:i}};u.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=z.doc.elementFromPoint(a,b);if(z.win.opera&&"svg"==e.tagName){var f=$a(d),g=d.createSVGRect();g.x=a-f.x,g.y=b-f.y,g.width=g.height=1;var h=d.getIntersectionList(g,null);h.length&&(e=h[h.length-1])}if(!e)return null;for(;e.parentNode&&e!=d.parentNode&&!e.raphael;)e=e.parentNode;return e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null},u.getElementsByBBox=function(a){var c=this.set();return this.forEach(function(d){b.isBBoxIntersect(d.getBBox(),a)&&c.push(d)}),c},u.getById=function(a){for(var b=this.bottom;b;){if(b.id==a)return b;b=b.next}return null},u.forEach=function(a,b){for(var c=this.bottom;c;){if(a.call(b,c)===!1)return this;c=c.next}return this},u.getElementsByPoint=function(a,b){var c=this.set();return this.forEach(function(d){d.isPointInside(a,b)&&c.push(d)}),c},Xa.isPointInside=function(a,c){var d=this.realPath=oa[this.type](this);return this.attr("transform")&&this.attr("transform").length&&(d=b.transformPath(d,this.attr("transform"))),b.isPointInsidePath(d,a,c)},Xa.getBBox=function(a){if(this.removed)return{};var b=this._;return a?((b.dirty||!b.bboxwt)&&(this.realPath=oa[this.type](this),b.bboxwt=za(this.realPath),b.bboxwt.toString=o,b.dirty=0),b.bboxwt):((b.dirty||b.dirtyT||!b.bbox)&&((b.dirty||!this.realPath)&&(b.bboxwt=0,this.realPath=oa[this.type](this)),b.bbox=za(pa(this.realPath,this.matrix)),b.bbox.toString=o,b.dirty=b.dirtyT=0),b.bbox)},Xa.clone=function(){if(this.removed)return null;var a=this.paper[this.type]().attr(this.attr());return this.__set__&&this.__set__.push(a),a},Xa.glow=function(a){if("text"==this.type)return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:null==a.opacity?.5:a.opacity,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||oa[this.type](this);f=this.matrix?pa(f,this.matrix):f;for(var g=1;c+1>g;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var _a=function(a,c,d,e,f,g,h,k,l){return null==l?i(a,c,d,e,f,g,h,k):b.findDotsAtSegment(a,c,d,e,f,g,h,k,j(a,c,d,e,f,g,h,k,l))},ab=function(a,c){return function(d,e,f){d=Ia(d);for(var g,h,i,j,k,l="",m={},n=0,o=0,p=d.length;p>o;o++){if(i=d[o],"M"==i[0])g=+i[1],h=+i[2];else{if(j=_a(g,h,i[1],i[2],i[3],i[4],i[5],i[6]),n+j>e){if(c&&!m.start){if(k=_a(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),l+=["C"+k.start.x,k.start.y,k.m.x,k.m.y,k.x,k.y],f)return l;m.start=l,l=["M"+k.x,k.y+"C"+k.n.x,k.n.y,k.end.x,k.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!a&&!c)return k=_a(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),{x:k.x,y:k.y,alpha:k.alpha}}n+=j,g=+i[5],h=+i[6]}l+=i.shift()+i}return m.end=l,k=a?n:c?m:b.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),k.alpha&&(k={x:k.x,y:k.y,alpha:k.alpha}),k}},bb=ab(1),cb=ab(),db=ab(0,1);b.getTotalLength=bb,b.getPointAtLength=cb,b.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return db(a,b).end;var d=db(a,c,1);return b?db(d,b).end:d},Xa.getTotalLength=function(){var a=this.getPath();if(a)return this.node.getTotalLength?this.node.getTotalLength():bb(a)},Xa.getPointAtLength=function(a){var b=this.getPath();if(b)return cb(b,a)},Xa.getPath=function(){var a,c=b._getPath[this.type];if("text"!=this.type&&"set"!=this.type)return c&&(a=c(this)),a},Xa.getSubpath=function(a,c){var d=this.getPath();if(d)return b.getSubpath(d,a,c)};var eb=b.easing_formulas={linear:function(a){return a},"<":function(a){return Q(a,1.7)},">":function(a){return Q(a,.48)},"<>":function(a){var b=.48-a/1.04,c=M.sqrt(.1734+b*b),d=c-b,e=Q(P(d),1/3)*(0>d?-1:1),f=-c-b,g=Q(P(f),1/3)*(0>f?-1:1),h=e+g+.5;return 3*(1-h)*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a-=1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){return a==!!a?a:Q(2,-10*a)*M.sin(2*(a-.075)*R/.3)+1},bounce:function(a){var b,c=7.5625,d=2.75;return 1/d>a?b=c*a*a:2/d>a?(a-=1.5/d,b=c*a*a+.75):2.5/d>a?(a-=2.25/d,b=c*a*a+.9375):(a-=2.625/d,b=c*a*a+.984375),b}};eb.easeIn=eb["ease-in"]=eb["<"],eb.easeOut=eb["ease-out"]=eb[">"],eb.easeInOut=eb["ease-in-out"]=eb["<>"],eb["back-in"]=eb.backIn,eb["back-out"]=eb.backOut;var fb=[],gb=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},hb=function(){for(var c=+new Date,d=0;dh))if(i>h){var q=j(h/i);for(var s in k)if(k[y](s)){switch(ca[s]){case S:f=+k[s]+q*i*l[s];break;case"colour":f="rgb("+[ib(Z(k[s].r+q*i*l[s].r)),ib(Z(k[s].g+q*i*l[s].g)),ib(Z(k[s].b+q*i*l[s].b))].join(",")+")";break;case"path":f=[];for(var t=0,u=k[s].length;u>t;t++){f[t]=[k[s][t][0]];for(var v=1,w=k[s][t].length;w>v;v++)f[t][v]=+k[s][t][v]+q*i*l[s][t][v];f[t]=f[t].join(G)}f=f.join(G);break;case"transform":if(l[s].real)for(f=[],t=0,u=k[s].length;u>t;t++)for(f[t]=[k[s][t][0]],v=1,w=k[s][t].length;w>v;v++)f[t][v]=k[s][t][v]+q*i*l[s][t][v];else{var x=function(a){return+k[s][a]+q*i*l[s][a]};f=[["m",x(0),x(1),x(2),x(3),x(4),x(5)]]}break;case"csv":if("clip-rect"==s)for(f=[],t=4;t--;)f[t]=+k[s][t]+q*i*l[s][t];break;default:var z=[][D](k[s]);for(f=[],t=n.paper.customAttributes[s].length;t--;)f[t]=+z[t]+q*i*l[s][t]}o[s]=f}n.attr(o),function(b,c,d){setTimeout(function(){a("raphael.anim.frame."+b,c,d)})}(n.id,n,e.anim)}else{if(function(c,d,e){setTimeout(function(){a("raphael.anim.frame."+d.id,d,e),a("raphael.anim.finish."+d.id,d,e),b.is(c,"function")&&c.call(d)})}(e.callback,n,e.anim),n.attr(m),fb.splice(d--,1),e.repeat>1&&!e.next){for(g in m)m[y](g)&&(p[g]=e.totalOrigin[g]);e.el.attr(p),r(e.anim,e.el,e.anim.percents[0],null,e.totalOrigin,e.repeat-1)}e.next&&!e.stop&&r(e.anim,e.el,e.next,null,e.totalOrigin,e.repeat)}}}fb.length&&gb(hb)},ib=function(a){return a>255?255:0>a?0:a};Xa.animateWith=function(a,c,d,e,f,g){var h=this;if(h.removed)return g&&g.call(h),h;var i=d instanceof q?d:b.animation(d,e,f,g);r(i,h,i.percents[0],null,h.attr());for(var j=0,k=fb.length;k>j;j++)if(fb[j].anim==c&&fb[j].el==a){fb[k-1].start=fb[j].start;break}return h},Xa.onAnimation=function(b){return b?a.on("raphael.anim.frame."+this.id,b):a.unbind("raphael.anim.frame."+this.id),this},q.prototype.delay=function(a){var b=new q(this.anim,this.ms);return b.times=this.times,b.del=+a||0,b},q.prototype.repeat=function(a){var b=new q(this.anim,this.ms);return b.del=this.del,b.times=M.floor(N(a,0))||1,b},b.animation=function(a,c,d,e){if(a instanceof q)return a;(b.is(d,"function")||!d)&&(e=e||d||null,d=null),a=Object(a),c=+c||0;var f,g,h={};for(g in a)a[y](g)&&$(g)!=g&&$(g)+"%"!=g&&(f=!0,h[g]=a[g]);if(f)return d&&(h.easing=d),e&&(h.callback=e),new q({100:h},c);if(e){var i=0;for(var j in a){var k=_(j);a[y](j)&&k>i&&(i=k)}i+="%",!a[i].callback&&(a[i].callback=e)}return new q(a,c)},Xa.animate=function(a,c,d,e){var f=this;if(f.removed)return e&&e.call(f),f;var g=a instanceof q?a:b.animation(a,c,d,e);return r(g,f,g.percents[0],null,f.attr()),f},Xa.setTime=function(a,b){return a&&null!=b&&this.status(a,O(b,a.ms)/a.ms),this},Xa.status=function(a,b){var c,d,e=[],f=0;if(null!=b)return r(a,this,-1,O(b,1)),this;for(c=fb.length;c>f;f++)if(d=fb[f],d.el.id==this.id&&(!a||d.anim==a)){if(a)return d.status;e.push({anim:d.anim,status:d.status})}return a?0:e},Xa.pause=function(b){for(var c=0;cb;b++)!a[b]||a[b].constructor!=Xa.constructor&&a[b].constructor!=jb||(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},kb=jb.prototype;kb.push=function(){for(var a,b,c=0,d=arguments.length;d>c;c++)a=arguments[c],!a||a.constructor!=Xa.constructor&&a.constructor!=jb||(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},kb.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},kb.forEach=function(a,b){for(var c=0,d=this.items.length;d>c;c++)if(a.call(b,this.items[c],c)===!1)return this;return this};for(var lb in Xa)Xa[y](lb)&&(kb[lb]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][C](c,b)})}}(lb));return kb.attr=function(a,c){if(a&&b.is(a,U)&&b.is(a[0],"object"))for(var d=0,e=a.length;e>d;d++)this.items[d].attr(a[d]);else for(var f=0,g=this.items.length;g>f;f++)this.items[f].attr(a,c);return this},kb.clear=function(){for(;this.length;)this.pop()},kb.splice=function(a,b,c){a=0>a?N(this.length+a,0):a,b=N(0,O(this.length-a,b));var d,e=[],f=[],g=[];for(d=2;dd;d++)f.push(this[a+d]);for(;dd?g[d]:e[d-h];for(d=this.items.length=this.length-=b-h;this[d];)delete this[d++];return new jb(f)},kb.exclude=function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]==a)return this.splice(b,1),!0},kb.animate=function(a,c,d,e){(b.is(d,"function")||!d)&&(e=d||null);var f,g,h=this.items.length,i=h,j=this;if(!h)return this;e&&(g=function(){!--h&&e.call(j)}),d=b.is(d,T)?d:g;var k=b.animation(a,c,d,g);for(f=this.items[--i].animate(k);i--;)this.items[i]&&!this.items[i].removed&&this.items[i].animateWith(f,k,k),this.items[i]&&!this.items[i].removed||h--;return this},kb.insertAfter=function(a){for(var b=this.items.length;b--;)this.items[b].insertAfter(a);return this},kb.getBBox=function(){for(var a=[],b=[],c=[],d=[],e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}return a=O[C](0,a),b=O[C](0,b),c=N[C](0,c),d=N[C](0,d),{x:a,y:b,x2:c,y2:d,width:c-a,height:d-b}},kb.clone=function(a){a=this.paper.set();for(var b=0,c=this.items.length;c>b;b++)a.push(this.items[b].clone());return a},kb.toString=function(){return"Raphaël‘s set"},kb.glow=function(a){var b=this.paper.set();return this.forEach(function(c,d){var e=c.glow(a);null!=e&&e.forEach(function(a,c){b.push(a)})}),b},kb.isPointInside=function(a,b){var c=!1;return this.forEach(function(d){return d.isPointInside(a,b)?(c=!0,!1):void 0}),c},b.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[y](d)&&(b.face[d]=a.face[d]);if(this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b],!a.svg){b.face["units-per-em"]=_(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[y](e)){var f=a.glyphs[e];if(b.glyphs[e]={w:f.w,k:{},d:f.d&&"M"+f.d.replace(/[mlcxtrv]/g,function(a){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[a]||"M"})+"z"},f.k)for(var g in f.k)f[y](g)&&(b.glyphs[e].k[g]=f.k[g])}}return a},u.getFont=function(a,c,d,e){if(e=e||"normal",d=d||"normal",c=+c||{normal:400,bold:700,lighter:300,bolder:800}[c]||400,b.fonts){var f=b.fonts[a];if(!f){var g=new RegExp("(^|\\s)"+a.replace(/[^\w\d\s+!~.:_-]/g,F)+"(\\s|$)","i");for(var h in b.fonts)if(b.fonts[y](h)&&g.test(h)){f=b.fonts[h];break}}var i;if(f)for(var j=0,k=f.length;k>j&&(i=f[j],i.face["font-weight"]!=c||i.face["font-style"]!=d&&i.face["font-style"]||i.face["font-stretch"]!=e);j++);return i}},u.print=function(a,c,d,e,f,g,h,i){g=g||"middle",h=N(O(h||0,1),-1),i=N(O(i||1,3),1);var j,k=H(d)[I](F),l=0,m=0,n=F;if(b.is(e,"string")&&(e=this.getFont(e)),e){j=(f||16)/e.face["units-per-em"];for(var o=e.face.bbox[I](v),p=+o[0],q=o[3]-o[1],r=0,s=+o[1]+("baseline"==g?q+ +e.face.descent:q/2),t=0,u=k.length;u>t;t++){if("\n"==k[t])l=0,x=0,m=0,r+=q*i;else{var w=m&&e.glyphs[k[t-1]]||{},x=e.glyphs[k[t]];l+=m?(w.w||e.w)+(w.k&&w.k[k[t]]||0)+e.w*h:0,m=1}x&&x.d&&(n+=b.transformPath(x.d,["t",l*j,r*j,"s",j,j,p,s,"t",(a-p)/j,(c-s)/j]))}}return this.path(n).attr({fill:"#000",stroke:"none"})},u.add=function(a){if(b.is(a,"array"))for(var c,d=this.set(),e=0,f=a.length;f>e;e++)c=a[e]||{},w[y](c.type)&&d.push(this[c.type]().attr(c));return d},b.format=function(a,c){var d=b.is(c,U)?[0][D](c):arguments;return a&&b.is(a,T)&&d.length-1&&(a=a.replace(x,function(a,b){return null==d[++b]?F:d[b]})),a||F},b.fullfill=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;return c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),"function"==typeof e&&f&&(e=e()))}),e=(null==e||e==d?a:e)+""};return function(b,d){return String(b).replace(a,function(a,b){return c(a,b,d)})}}(),b.ninja=function(){return A.was?z.win.Raphael=A.is:delete Raphael,b},b.st=kb,a.on("raphael.DOMload",function(){t=!0}),function(a,c,d){function e(){/in/.test(a.readyState)?setTimeout(e,9):b.eve("raphael.DOMload")}null==a.readyState&&a.addEventListener&&(a.addEventListener(c,d=function(){a.removeEventListener(c,d,!1),a.readyState="complete"},!1),a.readyState="loading"),e()}(document,"DOMContentLoaded"),b}),function(a,b){"function"==typeof define&&define.amd?define("raphael.svg",["raphael.core"],function(a){return b(a)}):b("object"==typeof exports?require("./raphael.core"):a.Raphael)}(this,function(a){if(!a||a.svg){var b="hasOwnProperty",c=String,d=parseFloat,e=parseInt,f=Math,g=f.max,h=f.abs,i=f.pow,j=/[, ]+/,k=a.eve,l="",m=" ",n="http://www.w3.org/1999/xlink",o={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},p={};a.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var q=function(d,e){if(e){"string"==typeof d&&(d=q(d));for(var f in e)e[b](f)&&("xlink:"==f.substring(0,6)?d.setAttributeNS(n,f.substring(6),c(e[f])):d.setAttribute(f,c(e[f])))}else d=a._g.doc.createElementNS("http://www.w3.org/2000/svg",d),d.style&&(d.style.webkitTapHighlightColor="rgba(0,0,0,0)");return d},r=function(b,e){var j="linear",k=b.id+e,m=.5,n=.5,o=b.node,p=b.paper,r=o.style,s=a._g.doc.getElementById(k);if(!s){if(e=c(e).replace(a._radial_gradient,function(a,b,c){if(j="radial",b&&c){m=d(b),n=d(c);var e=2*(n>.5)-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&.5!=n&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/),"linear"==j){var t=e.shift();if(t=-d(t),isNaN(t))return null;var u=[0,0,f.cos(a.rad(t)),f.sin(a.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=a._parseDots(e);if(!w)return null;if(k=k.replace(/[\(\)\s,\xb0#]/g,"_"),b.gradient&&k!=b.gradient.id&&(p.defs.removeChild(b.gradient),delete b.gradient),!b.gradient){s=q(j+"Gradient",{id:k}),b.gradient=s,q(s,"radial"==j?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:b.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;y>x;x++)s.appendChild(q("stop",{offset:w[x].offset?w[x].offset:x?"100%":"0%","stop-color":w[x].color||"#fff","stop-opacity":isFinite(w[x].opacity)?w[x].opacity:1}))}}return q(o,{fill:"url('"+document.location.origin+document.location.pathname+"#"+k+"')",opacity:1,"fill-opacity":1}),r.fill=l,r.opacity=1,r.fillOpacity=1,1},s=function(a){var b=a.getBBox(1);q(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},t=function(d,e,f){if("path"==d.type){for(var g,h,i,j,k,m=c(e).toLowerCase().split("-"),n=d.paper,r=f?"end":"start",s=d.node,t=d.attrs,u=t["stroke-width"],v=m.length,w="classic",x=3,y=3,z=5;v--;)switch(m[v]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":w=m[v];break;case"wide":y=5;break;case"narrow":y=2;break;case"long":x=5;break;case"short":x=2}if("open"==w?(x+=2,y+=2,z+=2,i=1,j=f?4:1,k={fill:"none",stroke:t.stroke}):(j=i=x/2,k={fill:t.stroke,stroke:"none"}),d._.arrows?f?(d._.arrows.endPath&&p[d._.arrows.endPath]--,d._.arrows.endMarker&&p[d._.arrows.endMarker]--):(d._.arrows.startPath&&p[d._.arrows.startPath]--,d._.arrows.startMarker&&p[d._.arrows.startMarker]--):d._.arrows={},"none"!=w){var A="raphael-marker-"+w,B="raphael-marker-"+r+w+x+y+"-obj"+d.id;a._g.doc.getElementById(A)?p[A]++:(n.defs.appendChild(q(q("path"),{"stroke-linecap":"round",d:o[w],id:A})),p[A]=1);var C,D=a._g.doc.getElementById(B);D?(p[B]++,C=D.getElementsByTagName("use")[0]):(D=q(q("marker"),{id:B,markerHeight:y,markerWidth:x,orient:"auto",refX:j,refY:y/2}),C=q(q("use"),{"xlink:href":"#"+A,transform:(f?"rotate(180 "+x/2+" "+y/2+") ":l)+"scale("+x/z+","+y/z+")","stroke-width":(1/((x/z+y/z)/2)).toFixed(4)}),D.appendChild(C),n.defs.appendChild(D),p[B]=1),q(C,k);var E=i*("diamond"!=w&&"oval"!=w);f?(g=d._.arrows.startdx*u||0,h=a.getTotalLength(t.path)-E*u):(g=E*u,h=a.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),k={},k["marker-"+r]="url(#"+B+")",(h||g)&&(k.d=a.getSubpath(t.path,g,h)),q(s,k),d._.arrows[r+"Path"]=A,d._.arrows[r+"Marker"]=B,d._.arrows[r+"dx"]=E,d._.arrows[r+"Type"]=w,d._.arrows[r+"String"]=e}else f?(g=d._.arrows.startdx*u||0,h=a.getTotalLength(t.path)-g):(g=0,h=a.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),d._.arrows[r+"Path"]&&q(s,{d:a.getSubpath(t.path,g,h)}),delete d._.arrows[r+"Path"],delete d._.arrows[r+"Marker"],delete d._.arrows[r+"dx"],delete d._.arrows[r+"Type"],delete d._.arrows[r+"String"];for(k in p)if(p[b](k)&&!p[k]){var F=a._g.doc.getElementById(k);F&&F.parentNode.removeChild(F)}}},u={"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},v=function(a,b,d){if(b=u[c(b).toLowerCase()]){for(var e=a.attrs["stroke-width"]||"1",f={round:e,square:e,butt:0}[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],h=b.length;h--;)g[h]=b[h]*e+(h%2?1:-1)*f;q(a.node,{"stroke-dasharray":g.join(",")})}else q(a.node,{"stroke-dasharray":"none"})},w=function(d,f){var i=d.node,k=d.attrs,m=i.style.visibility;i.style.visibility="hidden";for(var o in f)if(f[b](o)){if(!a._availableAttrs[b](o))continue;var p=f[o];switch(k[o]=p,o){case"blur":d.blur(p);break;case"title":var u=i.getElementsByTagName("title");if(u.length&&(u=u[0]))u.firstChild.nodeValue=p;else{u=q("title");var w=a._g.doc.createTextNode(p);u.appendChild(w),i.appendChild(u)}break;case"href":case"target":var x=i.parentNode;if("a"!=x.tagName.toLowerCase()){var z=q("a");x.insertBefore(z,i),z.appendChild(i),x=z}"target"==o?x.setAttributeNS(n,"show","blank"==p?"new":p):x.setAttributeNS(n,o,p);break;case"cursor":i.style.cursor=p;break;case"transform":d.transform(p);break;case"arrow-start":t(d,p);break;case"arrow-end":t(d,p,1);break;case"clip-rect":var A=c(p).split(j);if(4==A.length){d.clip&&d.clip.parentNode.parentNode.removeChild(d.clip.parentNode);var B=q("clipPath"),C=q("rect");B.id=a.createUUID(),q(C,{x:A[0],y:A[1],width:A[2],height:A[3]}),B.appendChild(C),d.paper.defs.appendChild(B),q(i,{"clip-path":"url(#"+B.id+")"}),d.clip=C}if(!p){var D=i.getAttribute("clip-path");if(D){var E=a._g.doc.getElementById(D.replace(/(^url\(#|\)$)/g,l));E&&E.parentNode.removeChild(E),q(i,{"clip-path":l}),delete d.clip}}break;case"path":"path"==d.type&&(q(i,{d:p?k.path=a._pathToAbsolute(p):"M0,0"}),d._.dirty=1,d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1)));break;case"width":if(i.setAttribute(o,p),d._.dirty=1,!k.fx)break;o="x",p=k.x;case"x":k.fx&&(p=-k.x-(k.width||0));case"rx":if("rx"==o&&"rect"==d.type)break;case"cx":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"height":if(i.setAttribute(o,p),d._.dirty=1,!k.fy)break;o="y",p=k.y;case"y":k.fy&&(p=-k.y-(k.height||0));case"ry":if("ry"==o&&"rect"==d.type)break;case"cy":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"r":"rect"==d.type?q(i,{rx:p,ry:p}):i.setAttribute(o,p),d._.dirty=1;break;case"src":"image"==d.type&&i.setAttributeNS(n,"href",p);break;case"stroke-width":(1!=d._.sx||1!=d._.sy)&&(p/=g(h(d._.sx),h(d._.sy))||1),i.setAttribute(o,p),k["stroke-dasharray"]&&v(d,k["stroke-dasharray"],f),d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"stroke-dasharray":v(d,p,f);break;case"fill":var F=c(p).match(a._ISURL);if(F){B=q("pattern");var G=q("image");B.id=a.createUUID(),q(B,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),q(G,{x:0,y:0,"xlink:href":F[1]}),B.appendChild(G),function(b){a._preload(F[1],function(){var a=this.offsetWidth,c=this.offsetHeight;q(b,{width:a,height:c}),q(G,{width:a,height:c})})}(B),d.paper.defs.appendChild(B),q(i,{fill:"url(#"+B.id+")"}),d.pattern=B,d.pattern&&s(d);break}var H=a.getRGB(p);if(H.error){if(("circle"==d.type||"ellipse"==d.type||"r"!=c(p).charAt())&&r(d,p)){if("opacity"in k||"fill-opacity"in k){var I=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l));if(I){var J=I.getElementsByTagName("stop");q(J[J.length-1],{"stop-opacity":("opacity"in k?k.opacity:1)*("fill-opacity"in k?k["fill-opacity"]:1)})}}k.gradient=p,k.fill="none";break}}else delete f.gradient,delete k.gradient,!a.is(k.opacity,"undefined")&&a.is(f.opacity,"undefined")&&q(i,{opacity:k.opacity}),!a.is(k["fill-opacity"],"undefined")&&a.is(f["fill-opacity"],"undefined")&&q(i,{"fill-opacity":k["fill-opacity"]});H[b]("opacity")&&q(i,{"fill-opacity":H.opacity>1?H.opacity/100:H.opacity});case"stroke":H=a.getRGB(p),i.setAttribute(o,H.hex),"stroke"==o&&H[b]("opacity")&&q(i,{"stroke-opacity":H.opacity>1?H.opacity/100:H.opacity}),"stroke"==o&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":("circle"==d.type||"ellipse"==d.type||"r"!=c(p).charAt())&&r(d,p); + +break;case"opacity":k.gradient&&!k[b]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){I=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),I&&(J=I.getElementsByTagName("stop"),q(J[J.length-1],{"stop-opacity":p}));break}default:"font-size"==o&&(p=e(p,10)+"px");var K=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[K]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if("text"==d.type&&(f[b]("text")||f[b]("font")||f[b]("font-size")||f[b]("x")||f[b]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(a._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;if(f[b]("text")){for(g.text=f.text;h.firstChild;)h.removeChild(h.firstChild);for(var j,k=c(f.text).split("\n"),m=[],n=0,o=k.length;o>n;n++)j=q("tspan"),n&&q(j,{dy:i*x,x:g.x}),j.appendChild(a._g.doc.createTextNode(k[n])),h.appendChild(j),m[n]=j}else for(m=h.getElementsByTagName("tspan"),n=0,o=m.length;o>n;n++)n?q(m[n],{dy:i*x,x:g.x}):q(m[0],{dy:0});q(h,{x:g.x,y:g.y}),d._.dirty=1;var p=d._getBBox(),r=g.y-(p.y+p.height/2);r&&a.is(r,"finite")&&q(m[0],{dy:r})}},z=function(a){return a.parentNode&&"a"===a.parentNode.tagName.toLowerCase()?a.parentNode:a},A=function(b,c){this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.matrix=a.matrix(),this.realPath=null,this.paper=c,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},B=a.el;A.prototype=B,B.constructor=A,a._engine.path=function(a,b){var c=q("path");b.canvas&&b.canvas.appendChild(c);var d=new A(c,b);return d.type="path",w(d,{fill:"none",stroke:"#000",path:a}),d},B.rotate=function(a,b,e){if(this.removed)return this;if(a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(b=e),null==b||null==e){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2}return this.transform(this._.transform.concat([["r",a,b,e]])),this},B.scale=function(a,b,e,f){if(this.removed)return this;if(a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3])),a=d(a[0]),null==b&&(b=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]])),this},B.translate=function(a,b){return this.removed?this:(a=c(a).split(j),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this.transform(this._.transform.concat([["t",a,b]])),this)},B.transform=function(c){var d=this._;if(null==c)return d.transform;if(a._extractTransform(this,c),this.clip&&q(this.clip,{transform:this.matrix.invert()}),this.pattern&&s(this),this.node&&q(this.node,{transform:this.matrix}),1!=d.sx||1!=d.sy){var e=this.attrs[b]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":e})}return this},B.hide=function(){return this.removed||(this.node.style.display="none"),this},B.show=function(){return this.removed||(this.node.style.display=""),this},B.remove=function(){var b=z(this.node);if(!this.removed&&b.parentNode){var c=this.paper;c.__set__&&c.__set__.exclude(this),k.unbind("raphael.*.*."+this.id),this.gradient&&c.defs.removeChild(this.gradient),a._tear(this,c),b.parentNode.removeChild(b),this.removeData();for(var d in this)this[d]="function"==typeof this[d]?a._removedFactory(d):null;this.removed=!0}},B._getBBox=function(){if("none"==this.node.style.display){this.show();var a=!0}var b,c=!1;this.paper.canvas.parentElement?b=this.paper.canvas.parentElement.style:this.paper.canvas.parentNode&&(b=this.paper.canvas.parentNode.style),b&&"none"==b.display&&(c=!0,b.display="");var d={};try{d=this.node.getBBox()}catch(e){d={x:this.node.clientLeft,y:this.node.clientTop,width:this.node.clientWidth,height:this.node.clientHeight}}finally{d=d||{},c&&(b.display="none")}return a&&this.hide(),d},B.attr=function(c,d){if(this.removed)return this;if(null==c){var e={};for(var f in this.attrs)this.attrs[b](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&a.is(c,"string")){if("fill"==c&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;if("transform"==c)return this._.transform;for(var g=c.split(j),h={},i=0,l=g.length;l>i;i++)c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return l-1?h:h[g[0]]}if(null==d&&a.is(c,"array")){for(h={},i=0,l=c.length;l>i;i++)h[c[i]]=this.attr(c[i]);return h}if(null!=d){var m={};m[c]=d}else null!=c&&a.is(c,"object")&&(m=c);for(var n in m)k("raphael.attr."+n+"."+this.id,this,m[n]);for(n in this.paper.customAttributes)if(this.paper.customAttributes[b](n)&&m[b](n)&&a.is(this.paper.customAttributes[n],"function")){var o=this.paper.customAttributes[n].apply(this,[].concat(m[n]));this.attrs[n]=m[n];for(var p in o)o[b](p)&&(m[p]=o[p])}return w(this,m),this},B.toFront=function(){if(this.removed)return this;var b=z(this.node);b.parentNode.appendChild(b);var c=this.paper;return c.top!=this&&a._tofront(this,c),this},B.toBack=function(){if(this.removed)return this;var b=z(this.node),c=b.parentNode;c.insertBefore(b,c.firstChild),a._toback(this,this.paper);this.paper;return this},B.insertAfter=function(b){if(this.removed||!b)return this;var c=z(this.node),d=z(b.node||b[b.length-1].node);return d.nextSibling?d.parentNode.insertBefore(c,d.nextSibling):d.parentNode.appendChild(c),a._insertafter(this,b,this.paper),this},B.insertBefore=function(b){if(this.removed||!b)return this;var c=z(this.node),d=z(b.node||b[0].node);return d.parentNode.insertBefore(c,d),a._insertbefore(this,b,this.paper),this},B.blur=function(b){var c=this;if(0!==+b){var d=q("filter"),e=q("feGaussianBlur");c.attrs.blur=b,d.id=a.createUUID(),q(e,{stdDeviation:+b||1.5}),d.appendChild(e),c.paper.defs.appendChild(d),c._blur=d,q(c.node,{filter:"url(#"+d.id+")"})}else c._blur&&(c._blur.parentNode.removeChild(c._blur),delete c._blur,delete c.attrs.blur),c.node.removeAttribute("filter");return c},a._engine.circle=function(a,b,c,d){var e=q("circle");a.canvas&&a.canvas.appendChild(e);var f=new A(e,a);return f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",q(e,f.attrs),f},a._engine.rect=function(a,b,c,d,e,f){var g=q("rect");a.canvas&&a.canvas.appendChild(g);var h=new A(g,a);return h.attrs={x:b,y:c,width:d,height:e,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",q(g,h.attrs),h},a._engine.ellipse=function(a,b,c,d,e){var f=q("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new A(f,a);return g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",q(f,g.attrs),g},a._engine.image=function(a,b,c,d,e,f){var g=q("image");q(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(n,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new A(g,a);return h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image",h},a._engine.text=function(b,c,d,e){var f=q("text");b.canvas&&b.canvas.appendChild(f);var g=new A(f,b);return g.attrs={x:c,y:d,"text-anchor":"middle",text:e,"font-family":a._availableAttrs["font-family"],"font-size":a._availableAttrs["font-size"],stroke:"none",fill:"#000"},g.type="text",w(g,g.attrs),g},a._engine.setSize=function(a,b){return this.width=a||this.width,this.height=b||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox),this},a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b&&b.container,d=b.x,e=b.y,f=b.width,g=b.height;if(!c)throw new Error("SVG container not found.");var h,i=q("svg"),j="overflow:hidden;";return d=d||0,e=e||0,f=f||512,g=g||342,q(i,{height:g,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink"}),1==c?(i.style.cssText=j+"position:absolute;left:"+d+"px;top:"+e+"px",a._g.doc.body.appendChild(i),h=1):(i.style.cssText=j+"position:relative",c.firstChild?c.insertBefore(i,c.firstChild):c.appendChild(i)),c=new a._Paper,c.width=f,c.height=g,c.canvas=i,c.clear(),c._left=c._top=0,h&&(c.renderfix=function(){}),c.renderfix(),c},a._engine.setViewBox=function(a,b,c,d,e){k("raphael.setViewBox",this,this._viewBox,[a,b,c,d,e]);var f,h,i=this.getSize(),j=g(c/i.width,d/i.height),l=this.top,n=e?"xMidYMid meet":"xMinYMin";for(null==a?(this._vbSize&&(j=1),delete this._vbSize,f="0 0 "+this.width+m+this.height):(this._vbSize=j,f=a+m+b+m+c+m+d),q(this.canvas,{viewBox:f,preserveAspectRatio:n});j&&l;)h="stroke-width"in l.attrs?l.attrs["stroke-width"]:1,l.attr({"stroke-width":h}),l._.dirty=1,l._.dirtyT=1,l=l.prev;return this._viewBox=[a,b,c,d,!!e],this},a.prototype.renderfix=function(){var a,b=this.canvas,c=b.style;try{a=b.getScreenCTM()||b.createSVGMatrix()}catch(d){a=b.createSVGMatrix()}var e=-a.e%1,f=-a.f%1;(e||f)&&(e&&(this._left=(this._left+e)%1,c.left=this._left+"px"),f&&(this._top=(this._top+f)%1,c.top=this._top+"px"))},a.prototype.clear=function(){a.eve("raphael.clear",this);for(var b=this.canvas;b.firstChild;)b.removeChild(b.firstChild);this.bottom=this.top=null,(this.desc=q("desc")).appendChild(a._g.doc.createTextNode("Created with Raphaël "+a.version)),b.appendChild(this.desc),b.appendChild(this.defs=q("defs"))},a.prototype.remove=function(){k("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]="function"==typeof this[b]?a._removedFactory(b):null};var C=a.st;for(var D in B)B[b](D)&&!C[b](D)&&(C[D]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(D))}}),function(a,b){"function"==typeof define&&define.amd?define("raphael.vml",["raphael.core"],function(a){return b(a)}):b("object"==typeof exports?require("./raphael.core"):a.Raphael)}(this,function(a){if(!a||a.vml){var b="hasOwnProperty",c=String,d=parseFloat,e=Math,f=e.round,g=e.max,h=e.min,i=e.abs,j="fill",k=/[, ]+/,l=a.eve,m=" progid:DXImageTransform.Microsoft",n=" ",o="",p={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},q=/([clmz]),?([^clmz]*)/gi,r=/ progid:\S+Blur\([^\)]+\)/g,s=/-?[^,\s-]+/g,t="position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)",u=21600,v={path:1,rect:1,image:1},w={circle:1,ellipse:1},x=function(b){var d=/[ahqstv]/gi,e=a._pathToAbsolute;if(c(b).match(d)&&(e=a._path2curve),d=/[clmz]/g,e==a._pathToAbsolute&&!c(b).match(d)){var g=c(b).replace(q,function(a,b,c){var d=[],e="m"==b.toLowerCase(),g=p[b];return c.replace(s,function(a){e&&2==d.length&&(g+=d+p["m"==b?"l":"L"],d=[]),d.push(f(a*u))}),g+d});return g}var h,i,j=e(b);g=[];for(var k=0,l=j.length;l>k;k++){h=j[k],i=j[k][0].toLowerCase(),"z"==i&&(i="x");for(var m=1,r=h.length;r>m;m++)i+=f(h[m]*u)+(m!=r-1?",":o);g.push(i)}return g.join(n)},y=function(b,c,d){var e=a.matrix();return e.rotate(-b,.5,.5),{dx:e.x(c,d),dy:e.y(c,d)}},z=function(a,b,c,d,e,f){var g=a._,h=a.matrix,k=g.fillpos,l=a.node,m=l.style,o=1,p="",q=u/b,r=u/c;if(m.visibility="hidden",b&&c){if(l.coordsize=i(q)+n+i(r),m.rotation=f*(0>b*c?-1:1),f){var s=y(f,d,e);d=s.dx,e=s.dy}if(0>b&&(p+="x"),0>c&&(p+=" y")&&(o=-1),m.flip=p,l.coordorigin=d*-q+n+e*-r,k||g.fillsize){var t=l.getElementsByTagName(j);t=t&&t[0],l.removeChild(t),k&&(s=y(f,h.x(k[0],k[1]),h.y(k[0],k[1])),t.position=s.dx*o+n+s.dy*o),g.fillsize&&(t.size=g.fillsize[0]*i(b)+n+g.fillsize[1]*i(c)),l.appendChild(t)}m.visibility="visible"}};a.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var A=function(a,b,d){for(var e=c(b).toLowerCase().split("-"),f=d?"end":"start",g=e.length,h="classic",i="medium",j="medium";g--;)switch(e[g]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":h=e[g];break;case"wide":case"narrow":j=e[g];break;case"long":case"short":i=e[g]}var k=a.node.getElementsByTagName("stroke")[0];k[f+"arrow"]=h,k[f+"arrowlength"]=i,k[f+"arrowwidth"]=j},B=function(e,i){e.attrs=e.attrs||{};var l=e.node,m=e.attrs,p=l.style,q=v[e.type]&&(i.x!=m.x||i.y!=m.y||i.width!=m.width||i.height!=m.height||i.cx!=m.cx||i.cy!=m.cy||i.rx!=m.rx||i.ry!=m.ry||i.r!=m.r),r=w[e.type]&&(m.cx!=i.cx||m.cy!=i.cy||m.r!=i.r||m.rx!=i.rx||m.ry!=i.ry),s=e;for(var t in i)i[b](t)&&(m[t]=i[t]);if(q&&(m.path=a._getPath[e.type](e),e._.dirty=1),i.href&&(l.href=i.href),i.title&&(l.title=i.title),i.target&&(l.target=i.target),i.cursor&&(p.cursor=i.cursor),"blur"in i&&e.blur(i.blur),(i.path&&"path"==e.type||q)&&(l.path=x(~c(m.path).toLowerCase().indexOf("r")?a._pathToAbsolute(m.path):m.path),e._.dirty=1,"image"==e.type&&(e._.fillpos=[m.x,m.y],e._.fillsize=[m.width,m.height],z(e,1,1,0,0,0))),"transform"in i&&e.transform(i.transform),r){var y=+m.cx,B=+m.cy,D=+m.rx||+m.r||0,E=+m.ry||+m.r||0;l.path=a.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",f((y-D)*u),f((B-E)*u),f((y+D)*u),f((B+E)*u),f(y*u)),e._.dirty=1}if("clip-rect"in i){var G=c(i["clip-rect"]).split(k);if(4==G.length){G[2]=+G[2]+ +G[0],G[3]=+G[3]+ +G[1];var H=l.clipRect||a._g.doc.createElement("div"),I=H.style;I.clip=a.format("rect({1}px {2}px {3}px {0}px)",G),l.clipRect||(I.position="absolute",I.top=0,I.left=0,I.width=e.paper.width+"px",I.height=e.paper.height+"px",l.parentNode.insertBefore(H,l),H.appendChild(l),l.clipRect=H)}i["clip-rect"]||l.clipRect&&(l.clipRect.style.clip="auto")}if(e.textpath){var J=e.textpath.style;i.font&&(J.font=i.font),i["font-family"]&&(J.fontFamily='"'+i["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),i["font-size"]&&(J.fontSize=i["font-size"]),i["font-weight"]&&(J.fontWeight=i["font-weight"]),i["font-style"]&&(J.fontStyle=i["font-style"])}if("arrow-start"in i&&A(s,i["arrow-start"]),"arrow-end"in i&&A(s,i["arrow-end"],1),null!=i.opacity||null!=i["stroke-width"]||null!=i.fill||null!=i.src||null!=i.stroke||null!=i["stroke-width"]||null!=i["stroke-opacity"]||null!=i["fill-opacity"]||null!=i["stroke-dasharray"]||null!=i["stroke-miterlimit"]||null!=i["stroke-linejoin"]||null!=i["stroke-linecap"]){var K=l.getElementsByTagName(j),L=!1;if(K=K&&K[0],!K&&(L=K=F(j)),"image"==e.type&&i.src&&(K.src=i.src),i.fill&&(K.on=!0),(null==K.on||"none"==i.fill||null===i.fill)&&(K.on=!1),K.on&&i.fill){var M=c(i.fill).match(a._ISURL);if(M){K.parentNode==l&&l.removeChild(K),K.rotate=!0,K.src=M[1],K.type="tile";var N=e.getBBox(1);K.position=N.x+n+N.y,e._.fillpos=[N.x,N.y],a._preload(M[1],function(){e._.fillsize=[this.offsetWidth,this.offsetHeight]})}else K.color=a.getRGB(i.fill).hex,K.src=o,K.type="solid",a.getRGB(i.fill).error&&(s.type in{circle:1,ellipse:1}||"r"!=c(i.fill).charAt())&&C(s,i.fill,K)&&(m.fill="none",m.gradient=i.fill,K.rotate=!1)}if("fill-opacity"in i||"opacity"in i){var O=((+m["fill-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+a.getRGB(i.fill).o+1||2)-1);O=h(g(O,0),1),K.opacity=O,K.src&&(K.color="none")}l.appendChild(K);var P=l.getElementsByTagName("stroke")&&l.getElementsByTagName("stroke")[0],Q=!1;!P&&(Q=P=F("stroke")),(i.stroke&&"none"!=i.stroke||i["stroke-width"]||null!=i["stroke-opacity"]||i["stroke-dasharray"]||i["stroke-miterlimit"]||i["stroke-linejoin"]||i["stroke-linecap"])&&(P.on=!0),("none"==i.stroke||null===i.stroke||null==P.on||0==i.stroke||0==i["stroke-width"])&&(P.on=!1);var R=a.getRGB(i.stroke);P.on&&i.stroke&&(P.color=R.hex),O=((+m["stroke-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+R.o+1||2)-1);var S=.75*(d(i["stroke-width"])||1);if(O=h(g(O,0),1),null==i["stroke-width"]&&(S=m["stroke-width"]),i["stroke-width"]&&(P.weight=S),S&&1>S&&(O*=S)&&(P.weight=1),P.opacity=O,i["stroke-linejoin"]&&(P.joinstyle=i["stroke-linejoin"]||"miter"),P.miterlimit=i["stroke-miterlimit"]||8,i["stroke-linecap"]&&(P.endcap="butt"==i["stroke-linecap"]?"flat":"square"==i["stroke-linecap"]?"square":"round"),"stroke-dasharray"in i){var T={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};P.dashstyle=T[b](i["stroke-dasharray"])?T[i["stroke-dasharray"]]:o}Q&&l.appendChild(P)}if("text"==s.type){s.paper.canvas.style.display=o;var U=s.paper.span,V=100,W=m.font&&m.font.match(/\d+(?:\.\d*)?(?=px)/);p=U.style,m.font&&(p.font=m.font),m["font-family"]&&(p.fontFamily=m["font-family"]),m["font-weight"]&&(p.fontWeight=m["font-weight"]),m["font-style"]&&(p.fontStyle=m["font-style"]),W=d(m["font-size"]||W&&W[0])||10,p.fontSize=W*V+"px",s.textpath.string&&(U.innerHTML=c(s.textpath.string).replace(/"));var X=U.getBoundingClientRect();s.W=m.w=(X.right-X.left)/V,s.H=m.h=(X.bottom-X.top)/V,s.X=m.x,s.Y=m.y+s.H/2,("x"in i||"y"in i)&&(s.path.v=a.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));for(var Y=["x","y","text","font","font-family","font-weight","font-style","font-size"],Z=0,$=Y.length;$>Z;Z++)if(Y[Z]in i){s._.dirty=1;break}switch(m["text-anchor"]){case"start":s.textpath.style["v-text-align"]="left",s.bbx=s.W/2;break;case"end":s.textpath.style["v-text-align"]="right",s.bbx=-s.W/2;break;default:s.textpath.style["v-text-align"]="center",s.bbx=0}s.textpath.style["v-text-kern"]=!0}},C=function(b,f,g){b.attrs=b.attrs||{};var h=(b.attrs,Math.pow),i="linear",j=".5 .5";if(b.attrs.gradient=f,f=c(f).replace(a._radial_gradient,function(a,b,c){return i="radial",b&&c&&(b=d(b),c=d(c),h(b-.5,2)+h(c-.5,2)>.25&&(c=e.sqrt(.25-h(b-.5,2))*(2*(c>.5)-1)+.5),j=b+n+c),o}),f=f.split(/\s*\-\s*/),"linear"==i){var k=f.shift();if(k=-d(k),isNaN(k))return null}var l=a._parseDots(f);if(!l)return null;if(b=b.shape||b.node,l.length){b.removeChild(g),g.on=!0,g.method="none",g.color=l[0].color,g.color2=l[l.length-1].color;for(var m=[],p=0,q=l.length;q>p;p++)l[p].offset&&m.push(l[p].offset+n+l[p].color);g.colors=m.length?m.join():"0% "+g.color,"radial"==i?(g.type="gradientTitle",g.focus="100%",g.focussize="0 0",g.focusposition=j,g.angle=0):(g.type="gradient",g.angle=(270-k)%360),b.appendChild(g)}return 1},D=function(b,c){this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=c,this.matrix=a.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},E=a.el;D.prototype=E,E.constructor=D,E.transform=function(b){if(null==b)return this._.transform;var d,e=this.paper._viewBoxShift,f=e?"s"+[e.scale,e.scale]+"-1-1t"+[e.dx,e.dy]:o;e&&(d=b=c(b).replace(/\.{3}|\u2026/g,this._.transform||o)),a._extractTransform(this,f+b);var g,h=this.matrix.clone(),i=this.skew,j=this.node,k=~c(this.attrs.fill).indexOf("-"),l=!c(this.attrs.fill).indexOf("url(");if(h.translate(1,1),l||k||"image"==this.type)if(i.matrix="1 0 0 1",i.offset="0 0",g=h.split(),k&&g.noRotation||!g.isSimple){j.style.filter=h.toFilter();var m=this.getBBox(),p=this.getBBox(1),q=m.x-p.x,r=m.y-p.y;j.coordorigin=q*-u+n+r*-u,z(this,1,1,q,r,0)}else j.style.filter=o,z(this,g.scalex,g.scaley,g.dx,g.dy,g.rotate);else j.style.filter=o,i.matrix=c(h),i.offset=h.offset();return null!==d&&(this._.transform=d,a._extractTransform(this,d)),this},E.rotate=function(a,b,e){if(this.removed)return this;if(null!=a){if(a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(b=e),null==b||null==e){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2}return this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,b,e]])),this}},E.translate=function(a,b){return this.removed?this:(a=c(a).split(k),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=b),this.transform(this._.transform.concat([["t",a,b]])),this)},E.scale=function(a,b,e,f){if(this.removed)return this;if(a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3]),isNaN(e)&&(e=null),isNaN(f)&&(f=null)),a=d(a[0]),null==b&&(b=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]])),this._.dirtyT=1,this},E.hide=function(){return!this.removed&&(this.node.style.display="none"),this},E.show=function(){return!this.removed&&(this.node.style.display=o),this},E.auxGetBBox=a.el.getBBox,E.getBBox=function(){var a=this.auxGetBBox();if(this.paper&&this.paper._viewBoxShift){var b={},c=1/this.paper._viewBoxShift.scale;return b.x=a.x-this.paper._viewBoxShift.dx,b.x*=c,b.y=a.y-this.paper._viewBoxShift.dy,b.y*=c,b.width=a.width*c,b.height=a.height*c,b.x2=b.x+b.width,b.y2=b.y+b.height,b}return a},E._getBBox=function(){return this.removed?{}:{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),a.eve.unbind("raphael.*.*."+this.id),a._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var b in this)this[b]="function"==typeof this[b]?a._removedFactory(b):null;this.removed=!0}},E.attr=function(c,d){if(this.removed)return this;if(null==c){var e={};for(var f in this.attrs)this.attrs[b](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&a.is(c,"string")){if(c==j&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;for(var g=c.split(k),h={},i=0,m=g.length;m>i;i++)c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return m-1?h:h[g[0]]}if(this.attrs&&null==d&&a.is(c,"array")){for(h={},i=0,m=c.length;m>i;i++)h[c[i]]=this.attr(c[i]);return h}var n;null!=d&&(n={},n[c]=d),null==d&&a.is(c,"object")&&(n=c);for(var o in n)l("raphael.attr."+o+"."+this.id,this,n[o]);if(n){for(o in this.paper.customAttributes)if(this.paper.customAttributes[b](o)&&n[b](o)&&a.is(this.paper.customAttributes[o],"function")){var p=this.paper.customAttributes[o].apply(this,[].concat(n[o]));this.attrs[o]=n[o];for(var q in p)p[b](q)&&(n[q]=p[q])}n.text&&"text"==this.type&&(this.textpath.string=n.text),B(this,n)}return this},E.toFront=function(){return!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&a._tofront(this,this.paper),this},E.toBack=function(){return this.removed?this:(this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),a._toback(this,this.paper)),this)},E.insertAfter=function(b){return this.removed?this:(b.constructor==a.st.constructor&&(b=b[b.length-1]),b.node.nextSibling?b.node.parentNode.insertBefore(this.node,b.node.nextSibling):b.node.parentNode.appendChild(this.node),a._insertafter(this,b,this.paper),this)},E.insertBefore=function(b){return this.removed?this:(b.constructor==a.st.constructor&&(b=b[0]),b.node.parentNode.insertBefore(this.node,b.node),a._insertbefore(this,b,this.paper),this)},E.blur=function(b){var c=this.node.runtimeStyle,d=c.filter;return d=d.replace(r,o),0!==+b?(this.attrs.blur=b,c.filter=d+n+m+".Blur(pixelradius="+(+b||1.5)+")",c.margin=a.format("-{0}px 0 0 -{0}px",f(+b||1.5))):(c.filter=d,c.margin=0,delete this.attrs.blur),this},a._engine.path=function(a,b){var c=F("shape");c.style.cssText=t,c.coordsize=u+n+u,c.coordorigin=b.coordorigin;var d=new D(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,B(d,e),b.canvas.appendChild(c);var f=F("skew");return f.on=!0,c.appendChild(f),d.skew=f,d.transform(o),d},a._engine.rect=function(b,c,d,e,f,g){var h=a._rectPath(c,d,e,f,g),i=b.path(h),j=i.attrs;return i.X=j.x=c,i.Y=j.y=d,i.W=j.width=e,i.H=j.height=f,j.r=g,j.path=h,i.type="rect",i},a._engine.ellipse=function(a,b,c,d,e){{var f=a.path();f.attrs}return f.X=b-d,f.Y=c-e,f.W=2*d,f.H=2*e,f.type="ellipse",B(f,{cx:b,cy:c,rx:d,ry:e}),f},a._engine.circle=function(a,b,c,d){{var e=a.path();e.attrs}return e.X=b-d,e.Y=c-d,e.W=e.H=2*d,e.type="circle",B(e,{cx:b,cy:c,r:d}),e},a._engine.image=function(b,c,d,e,f,g){var h=a._rectPath(d,e,f,g),i=b.path(h).attr({stroke:"none"}),k=i.attrs,l=i.node,m=l.getElementsByTagName(j)[0];return k.src=c,i.X=k.x=d,i.Y=k.y=e,i.W=k.width=f,i.H=k.height=g,k.path=h,i.type="image",m.parentNode==l&&l.removeChild(m),m.rotate=!0,m.src=c,m.type="tile",i._.fillpos=[d,e],i._.fillsize=[f,g],l.appendChild(m),z(i,1,1,0,0,0),i},a._engine.text=function(b,d,e,g){var h=F("shape"),i=F("path"),j=F("textpath");d=d||0,e=e||0,g=g||"",i.v=a.format("m{0},{1}l{2},{1}",f(d*u),f(e*u),f(d*u)+1),i.textpathok=!0,j.string=c(g),j.on=!0,h.style.cssText=t,h.coordsize=u+n+u,h.coordorigin="0 0";var k=new D(h,b),l={fill:"#000",stroke:"none",font:a._availableAttrs.font,text:g};k.shape=h,k.path=i,k.textpath=j,k.type="text",k.attrs.text=c(g),k.attrs.x=d,k.attrs.y=e,k.attrs.w=1,k.attrs.h=1,B(k,l),h.appendChild(j),h.appendChild(i),b.canvas.appendChild(h);var m=F("skew");return m.on=!0,h.appendChild(m),k.skew=m,k.transform(o),k},a._engine.setSize=function(b,c){var d=this.canvas.style;return this.width=b,this.height=c,b==+b&&(b+="px"),c==+c&&(c+="px"),d.width=b,d.height=c,d.clip="rect(0 "+b+" "+c+" 0)",this._viewBox&&a._engine.setViewBox.apply(this,this._viewBox),this},a._engine.setViewBox=function(b,c,d,e,f){a.eve("raphael.setViewBox",this,this._viewBox,[b,c,d,e,f]);var g,h,i=this.getSize(),j=i.width,k=i.height;return f&&(g=k/e,h=j/d,j>d*g&&(b-=(j-d*g)/2/g),k>e*h&&(c-=(k-e*h)/2/h)),this._viewBox=[b,c,d,e,!!f],this._viewBoxShift={dx:-b,dy:-c,scale:i},this.forEach(function(a){a.transform("...")}),this};var F;a._engine.initWin=function(a){var b=a.document;b.styleSheets.length<31?b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)"):b.styleSheets[0].addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),F=function(a){return b.createElement("')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},a._engine.initWin(a._g.win),a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b.container,d=b.height,e=b.width,f=b.x,g=b.y;if(!c)throw new Error("VML container not found.");var h=new a._Paper,i=h.canvas=a._g.doc.createElement("div"),j=i.style;return f=f||0,g=g||0,e=e||512,d=d||342,h.width=e,h.height=d,e==+e&&(e+="px"),d==+d&&(d+="px"),h.coordsize=1e3*u+n+1e3*u,h.coordorigin="0 0",h.span=a._g.doc.createElement("span"),h.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",i.appendChild(h.span),j.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",e,d),1==c?(a._g.doc.body.appendChild(i),j.left=f+"px",j.top=g+"px",j.position="absolute"):c.firstChild?c.insertBefore(i,c.firstChild):c.appendChild(i),h.renderfix=function(){},h},a.prototype.clear=function(){a.eve("raphael.clear",this),this.canvas.innerHTML=o,this.span=a._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},a.prototype.remove=function(){a.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]="function"==typeof this[b]?a._removedFactory(b):null;return!0};var G=a.st;for(var H in E)E[b](H)&&!G[b](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}}); \ No newline at end of file diff --git a/UI/templates/main.html b/UI/templates/main.html new file mode 100644 index 0000000..c1d5bb4 --- /dev/null +++ b/UI/templates/main.html @@ -0,0 +1,77 @@ + + + + + Dynamic Resize + + + + +
+
+
+ +
+ + + + + \ No newline at end of file