Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Léo-Paul Géneau
gitlab-ce
Commits
6b66a766
Commit
6b66a766
authored
Nov 13, 2011
by
Valery Sizov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Graph: build json
parent
ef088725
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
308 additions
and
1 deletion
+308
-1
.rbenv-version
.rbenv-version
+1
-0
app/assets/javascripts/application.js
app/assets/javascripts/application.js
+3
-1
app/controllers/projects_controller.rb
app/controllers/projects_controller.rb
+40
-0
app/views/layouts/project.html.haml
app/views/layouts/project.html.haml
+1
-0
config/routes.rb
config/routes.rb
+1
-0
lib/assets/javascripts/branch-graph.js
lib/assets/javascripts/branch-graph.js
+170
-0
lib/commit_ext.rb
lib/commit_ext.rb
+3
-0
lib/graph_commit.rb
lib/graph_commit.rb
+82
-0
vendor/assets/javascripts/raphael.js
vendor/assets/javascripts/raphael.js
+7
-0
No files found.
.rbenv-version
0 → 100644
View file @
6b66a766
1.9.2-p290
app/assets/javascripts/application.js
View file @
6b66a766
...
@@ -10,6 +10,8 @@
...
@@ -10,6 +10,8 @@
//= require jquery.ui.selectmenu
//= require jquery.ui.selectmenu
//= require jquery.tagify
//= require jquery.tagify
//= require jquery.cookie
//= require jquery.cookie
//= require raphael
//= require branch-graph
//= require_tree .
//= require_tree .
$
(
function
(){
$
(
function
(){
...
...
app/controllers/projects_controller.rb
View file @
6b66a766
require
File
.
join
(
Rails
.
root
,
'lib'
,
'graph_commit'
)
class
ProjectsController
<
ApplicationController
class
ProjectsController
<
ApplicationController
before_filter
:project
,
:except
=>
[
:index
,
:new
,
:create
]
before_filter
:project
,
:except
=>
[
:index
,
:new
,
:create
]
layout
:determine_layout
layout
:determine_layout
...
@@ -125,6 +127,36 @@ class ProjectsController < ApplicationController
...
@@ -125,6 +127,36 @@ class ProjectsController < ApplicationController
return
render_404
return
render_404
end
end
def
graph
@repo
=
project
.
repo
commits
=
Grit
::
Commit
.
find_all
(
@repo
,
nil
,
{
:max_count
=>
650
})
ref_cache
=
{}
commits
.
collect!
do
|
commit
|
add_refs
(
commit
,
ref_cache
)
GraphCommit
.
new
(
commit
)
end
days
=
GraphCommit
.
index_commits
(
commits
)
@days_json
=
days
.
compact
.
collect
{
|
d
|
[
d
.
day
,
d
.
strftime
(
"%b"
)]
}.
to_json
@commits_json
=
commits
.
collect
do
|
c
|
h
=
{}
h
[
:parents
]
=
c
.
parents
.
collect
do
|
p
|
[
p
.
id
,
0
,
0
]
end
h
[
:author
]
=
c
.
author
.
name
.
force_encoding
(
"UTF-8"
)
h
[
:time
]
=
c
.
time
h
[
:space
]
=
c
.
space
h
[
:refs
]
=
c
.
refs
.
collect
{
|
r
|
r
.
name
}.
join
(
" "
)
unless
c
.
refs
.
nil?
h
[
:id
]
=
c
.
sha
h
[
:date
]
=
c
.
date
h
[
:message
]
=
c
.
message
.
force_encoding
(
"UTF-8"
)
h
[
:email
]
=
c
.
author
.
email
h
end
.
to_json
render
:text
=>
@commits_json
end
def
blob
def
blob
@repo
=
project
.
repo
@repo
=
project
.
repo
@commit
=
project
.
commit
(
params
[
:commit_id
])
@commit
=
project
.
commit
(
params
[
:commit_id
])
...
@@ -149,6 +181,14 @@ class ProjectsController < ApplicationController
...
@@ -149,6 +181,14 @@ class ProjectsController < ApplicationController
protected
protected
def
add_refs
(
commit
,
ref_cache
)
if
ref_cache
.
empty?
@repo
.
refs
.
each
{
|
ref
|
ref_cache
[
ref
.
commit
.
id
]
||=
[];
ref_cache
[
ref
.
commit
.
id
]
<<
ref
}
end
commit
.
refs
=
ref_cache
[
commit
.
id
]
if
ref_cache
.
include?
commit
.
id
commit
.
refs
||=
[]
end
def
project
def
project
@project
||=
Project
.
find_by_code
(
params
[
:id
])
@project
||=
Project
.
find_by_code
(
params
[
:id
])
end
end
...
...
app/views/layouts/project.html.haml
View file @
6b66a766
...
@@ -22,6 +22,7 @@
...
@@ -22,6 +22,7 @@
=
link_to
"History"
,
project_path
(
@project
),
:class
=>
current_page?
(
:controller
=>
"projects"
,
:action
=>
"show"
,
:id
=>
@project
)
?
"current"
:
nil
=
link_to
"History"
,
project_path
(
@project
),
:class
=>
current_page?
(
:controller
=>
"projects"
,
:action
=>
"show"
,
:id
=>
@project
)
?
"current"
:
nil
=
link_to
"Tree"
,
tree_project_path
(
@project
),
:class
=>
current_page?
(
:controller
=>
"projects"
,
:action
=>
"tree"
,
:id
=>
@project
)
?
"current"
:
nil
=
link_to
"Tree"
,
tree_project_path
(
@project
),
:class
=>
current_page?
(
:controller
=>
"projects"
,
:action
=>
"tree"
,
:id
=>
@project
)
?
"current"
:
nil
=
link_to
"Commits"
,
project_commits_path
(
@project
),
:class
=>
current_page?
(
:controller
=>
"commits"
,
:action
=>
"index"
,
:project_id
=>
@project
)
?
"current"
:
nil
=
link_to
"Commits"
,
project_commits_path
(
@project
),
:class
=>
current_page?
(
:controller
=>
"commits"
,
:action
=>
"index"
,
:project_id
=>
@project
)
?
"current"
:
nil
=
link_to
"Network graph"
,
graph_project_path
(
@project
),
:class
=>
current_page?
(
:controller
=>
"projects"
,
:action
=>
"graph"
,
:project_id
=>
@project
)
?
"current"
:
nil
=
link_to
team_project_path
(
@project
),
:class
=>
(
current_page?
(
:controller
=>
"projects"
,
:action
=>
"team"
,
:id
=>
@project
)
||
controller
.
controller_name
==
"team_members"
)
?
"current"
:
nil
do
=
link_to
team_project_path
(
@project
),
:class
=>
(
current_page?
(
:controller
=>
"projects"
,
:action
=>
"team"
,
:id
=>
@project
)
||
controller
.
controller_name
==
"team_members"
)
?
"current"
:
nil
do
Team
Team
-
if
@project
.
users_projects
.
count
>
0
-
if
@project
.
users_projects
.
count
>
0
...
...
config/routes.rb
View file @
6b66a766
...
@@ -34,6 +34,7 @@ Gitlab::Application.routes.draw do
...
@@ -34,6 +34,7 @@ Gitlab::Application.routes.draw do
get
"blob"
get
"blob"
get
"team"
get
"team"
get
"wall"
get
"wall"
get
"graph"
# tree viewer
# tree viewer
get
"tree/:commit_id"
=>
"projects#tree"
get
"tree/:commit_id"
=>
"projects#tree"
...
...
lib/assets/javascripts/branch-graph.js
0 → 100644
View file @
6b66a766
var
commits
=
chunk1
.
commits
,
comms
=
{},
pixelsX
=
[],
pixelsY
=
[],
mmax
=
Math
.
max
,
mtime
=
0
,
mspace
=
0
,
parents
=
{};
for
(
var
i
=
0
,
ii
=
commits
.
length
;
i
<
ii
;
i
++
)
{
for
(
var
j
=
0
,
jj
=
commits
[
i
].
parents
.
length
;
j
<
jj
;
j
++
)
{
parents
[
commits
[
i
].
parents
[
j
][
0
]]
=
true
;
}
mtime
=
Math
.
max
(
mtime
,
commits
[
i
].
time
);
mspace
=
Math
.
max
(
mspace
,
commits
[
i
].
space
);
}
mtime
=
mtime
+
4
;
mspace
=
mspace
+
10
;
for
(
i
=
0
;
i
<
ii
;
i
++
)
{
if
(
commits
[
i
].
id
in
parents
)
{
commits
[
i
].
isParent
=
true
;
}
comms
[
commits
[
i
].
id
]
=
commits
[
i
];
}
var
colors
=
[
"
#000
"
];
for
(
var
k
=
0
;
k
<
mspace
;
k
++
)
{
colors
.
push
(
Raphael
.
getColor
());
}
function
branchGraph
(
holder
)
{
var
ch
=
mspace
*
20
+
20
,
cw
=
mtime
*
20
+
20
,
r
=
Raphael
(
"
holder
"
,
cw
,
ch
),
top
=
r
.
set
();
var
cuday
=
0
,
cumonth
=
""
;
r
.
rect
(
0
,
0
,
days
.
length
*
20
+
20
,
40
).
attr
({
fill
:
"
#999
"
});
for
(
mm
=
0
;
mm
<
days
.
length
;
mm
++
)
{
if
(
days
[
mm
]
!=
null
){
if
(
cuday
!=
days
[
mm
][
0
]){
r
.
text
(
10
+
mm
*
20
,
30
,
days
[
mm
][
0
]).
attr
({
font
:
"
12px Fontin-Sans, Arial
"
,
fill
:
"
#444
"
});
cuday
=
days
[
mm
][
0
]
}
if
(
cumonth
!=
days
[
mm
][
1
]){
r
.
text
(
10
+
mm
*
20
,
10
,
days
[
mm
][
1
]).
attr
({
font
:
"
12px Fontin-Sans, Arial
"
,
fill
:
"
#444
"
});
cumonth
=
days
[
mm
][
1
]
}
}
}
for
(
i
=
0
;
i
<
ii
;
i
++
)
{
var
x
=
10
+
20
*
commits
[
i
].
time
,
y
=
70
+
20
*
commits
[
i
].
space
;
r
.
circle
(
x
,
y
,
3
).
attr
({
fill
:
colors
[
commits
[
i
].
space
],
stroke
:
"
none
"
});
if
(
commits
[
i
].
refs
!=
null
&&
commits
[
i
].
refs
!=
""
)
{
var
longrefs
=
commits
[
i
].
refs
var
shortrefs
=
commits
[
i
].
refs
;
if
(
shortrefs
.
length
>
15
){
shortrefs
=
shortrefs
.
substr
(
0
,
13
)
+
"
...
"
;
}
var
t
=
r
.
text
(
x
+
5
,
y
+
5
,
shortrefs
).
attr
({
font
:
"
12px Fontin-Sans, Arial
"
,
fill
:
"
#666
"
,
title
:
longrefs
,
cursor
:
"
pointer
"
,
rotation
:
"
90
"
});
var
textbox
=
t
.
getBBox
();
t
.
translate
(
textbox
.
height
/-
4
,
textbox
.
width
/
2
);
}
for
(
var
j
=
0
,
jj
=
commits
[
i
].
parents
.
length
;
j
<
jj
;
j
++
)
{
var
c
=
comms
[
commits
[
i
].
parents
[
j
][
0
]];
if
(
c
)
{
var
cx
=
10
+
20
*
c
.
time
,
cy
=
70
+
20
*
c
.
space
;
if
(
c
.
space
==
commits
[
i
].
space
)
{
r
.
path
(
"
M
"
+
(
x
-
5
)
+
"
,
"
+
(
y
+
.
0001
)
+
"
L
"
+
(
15
+
20
*
c
.
time
)
+
"
,
"
+
(
y
+
.
0001
))
.
attr
({
stroke
:
colors
[
c
.
space
],
"
stroke-width
"
:
2
});
}
else
if
(
c
.
space
<
commits
[
i
].
space
)
{
r
.
path
([
"
M
"
,
x
-
5
,
y
+
.
0001
,
"
l-5-2,0,4,5,-2C
"
,
x
-
5
,
y
,
x
-
17
,
y
+
2
,
x
-
20
,
y
-
10
,
"
L
"
,
cx
,
y
-
10
,
cx
,
cy
])
.
attr
({
stroke
:
colors
[
commits
[
i
].
space
],
"
stroke-width
"
:
2
});
}
else
{
r
.
path
([
"
M
"
,
x
-
5
,
y
,
"
l-5-2,0,4,5,-2C
"
,
x
-
5
,
y
,
x
-
17
,
y
-
2
,
x
-
20
,
y
+
10
,
"
L
"
,
cx
,
y
+
10
,
cx
,
cy
])
.
attr
({
stroke
:
colors
[
commits
[
i
].
space
],
"
stroke-width
"
:
2
});
}
}
}
(
function
(
c
,
x
,
y
)
{
top
.
push
(
r
.
circle
(
x
,
y
,
10
).
attr
({
fill
:
"
#000
"
,
opacity
:
0
,
cursor
:
"
pointer
"
})
.
hover
(
function
()
{
var
s
=
r
.
text
(
100
,
100
,
c
.
author
+
"
\n
\n
"
+
c
.
id
+
"
\n
\n
"
+
c
.
message
).
attr
({
fill
:
"
#fff
"
});
this
.
popup
=
r
.
popupit
(
x
,
y
+
5
,
s
,
0
);
top
.
push
(
this
.
popup
.
insertBefore
(
this
));
},
function
()
{
this
.
popup
&&
this
.
popup
.
remove
()
&&
delete
this
.
popup
;
}));
}(
commits
[
i
],
x
,
y
));
}
top
.
toFront
();
var
hw
=
holder
.
offsetWidth
,
hh
=
holder
.
offsetHeight
,
v
=
r
.
rect
(
hw
-
8
,
0
,
4
,
Math
.
pow
(
hh
,
2
)
/
ch
,
2
).
attr
({
fill
:
"
#000
"
,
opacity
:
0
}),
h
=
r
.
rect
(
0
,
hh
-
8
,
Math
.
pow
(
hw
,
2
)
/
cw
,
4
,
2
).
attr
({
fill
:
"
#000
"
,
opacity
:
0
}),
bars
=
r
.
set
(
v
,
h
),
drag
,
dragger
=
function
(
e
)
{
if
(
drag
)
{
e
=
e
||
window
.
event
;
holder
.
scrollLeft
=
drag
.
sl
-
(
e
.
clientX
-
drag
.
x
);
holder
.
scrollTop
=
drag
.
st
-
(
e
.
clientY
-
drag
.
y
);
}
};
holder
.
onmousedown
=
function
(
e
)
{
e
=
e
||
window
.
event
;
drag
=
{
x
:
e
.
clientX
,
y
:
e
.
clientY
,
st
:
holder
.
scrollTop
,
sl
:
holder
.
scrollLeft
};
document
.
onmousemove
=
dragger
;
bars
.
animate
({
opacity
:
.
5
},
300
);
};
document
.
onmouseup
=
function
()
{
drag
=
false
;
document
.
onmousemove
=
null
;
bars
.
animate
({
opacity
:
0
},
300
);
};
holder
.
scrollLeft
=
cw
;
};
Raphael
.
fn
.
popupit
=
function
(
x
,
y
,
set
,
dir
,
size
)
{
dir
=
dir
==
null
?
2
:
dir
;
size
=
size
||
5
;
x
=
Math
.
round
(
x
);
y
=
Math
.
round
(
y
);
var
bb
=
set
.
getBBox
(),
w
=
Math
.
round
(
bb
.
width
/
2
),
h
=
Math
.
round
(
bb
.
height
/
2
),
dx
=
[
0
,
w
+
size
*
2
,
0
,
-
w
-
size
*
2
],
dy
=
[
-
h
*
2
-
size
*
3
,
-
h
-
size
,
0
,
-
h
-
size
],
p
=
[
"
M
"
,
x
-
dx
[
dir
],
y
-
dy
[
dir
],
"
l
"
,
-
size
,
(
dir
==
2
)
*
-
size
,
-
mmax
(
w
-
size
,
0
),
0
,
"
a
"
,
size
,
size
,
0
,
0
,
1
,
-
size
,
-
size
,
"
l
"
,
0
,
-
mmax
(
h
-
size
,
0
),
(
dir
==
3
)
*
-
size
,
-
size
,
(
dir
==
3
)
*
size
,
-
size
,
0
,
-
mmax
(
h
-
size
,
0
),
"
a
"
,
size
,
size
,
0
,
0
,
1
,
size
,
-
size
,
"
l
"
,
mmax
(
w
-
size
,
0
),
0
,
size
,
!
dir
*
-
size
,
size
,
!
dir
*
size
,
mmax
(
w
-
size
,
0
),
0
,
"
a
"
,
size
,
size
,
0
,
0
,
1
,
size
,
size
,
"
l
"
,
0
,
mmax
(
h
-
size
,
0
),
(
dir
==
1
)
*
size
,
size
,
(
dir
==
1
)
*
-
size
,
size
,
0
,
mmax
(
h
-
size
,
0
),
"
a
"
,
size
,
size
,
0
,
0
,
1
,
-
size
,
size
,
"
l
"
,
-
mmax
(
w
-
size
,
0
),
0
,
"
z
"
].
join
(
"
,
"
),
xy
=
[{
x
:
x
,
y
:
y
+
size
*
2
+
h
},
{
x
:
x
-
size
*
2
-
w
,
y
:
y
},
{
x
:
x
,
y
:
y
-
size
*
2
-
h
},
{
x
:
x
+
size
*
2
+
w
,
y
:
y
}][
dir
];
set
.
translate
(
xy
.
x
-
w
-
bb
.
x
,
xy
.
y
-
h
-
bb
.
y
);
return
this
.
set
(
this
.
path
(
p
).
attr
({
fill
:
"
#234
"
,
stroke
:
"
none
"
}).
insertBefore
(
set
.
node
?
set
:
set
[
0
]),
set
);
};
Raphael
.
fn
.
popup
=
function
(
x
,
y
,
text
,
dir
,
size
)
{
dir
=
dir
==
null
?
2
:
dir
>
3
?
3
:
dir
;
size
=
size
||
5
;
text
=
text
||
"
$9.99
"
;
var
res
=
this
.
set
(),
d
=
3
;
res
.
push
(
this
.
path
().
attr
({
fill
:
"
#000
"
,
stroke
:
"
#000
"
}));
res
.
push
(
this
.
text
(
x
,
y
,
text
).
attr
(
this
.
g
.
txtattr
).
attr
({
fill
:
"
#fff
"
,
"
font-family
"
:
"
Helvetica, Arial
"
}));
res
.
update
=
function
(
X
,
Y
,
withAnimation
)
{
X
=
X
||
x
;
Y
=
Y
||
y
;
var
bb
=
this
[
1
].
getBBox
(),
w
=
bb
.
width
/
2
,
h
=
bb
.
height
/
2
,
dx
=
[
0
,
w
+
size
*
2
,
0
,
-
w
-
size
*
2
],
dy
=
[
-
h
*
2
-
size
*
3
,
-
h
-
size
,
0
,
-
h
-
size
],
p
=
[
"
M
"
,
X
-
dx
[
dir
],
Y
-
dy
[
dir
],
"
l
"
,
-
size
,
(
dir
==
2
)
*
-
size
,
-
mmax
(
w
-
size
,
0
),
0
,
"
a
"
,
size
,
size
,
0
,
0
,
1
,
-
size
,
-
size
,
"
l
"
,
0
,
-
mmax
(
h
-
size
,
0
),
(
dir
==
3
)
*
-
size
,
-
size
,
(
dir
==
3
)
*
size
,
-
size
,
0
,
-
mmax
(
h
-
size
,
0
),
"
a
"
,
size
,
size
,
0
,
0
,
1
,
size
,
-
size
,
"
l
"
,
mmax
(
w
-
size
,
0
),
0
,
size
,
!
dir
*
-
size
,
size
,
!
dir
*
size
,
mmax
(
w
-
size
,
0
),
0
,
"
a
"
,
size
,
size
,
0
,
0
,
1
,
size
,
size
,
"
l
"
,
0
,
mmax
(
h
-
size
,
0
),
(
dir
==
1
)
*
size
,
size
,
(
dir
==
1
)
*
-
size
,
size
,
0
,
mmax
(
h
-
size
,
0
),
"
a
"
,
size
,
size
,
0
,
0
,
1
,
-
size
,
size
,
"
l
"
,
-
mmax
(
w
-
size
,
0
),
0
,
"
z
"
].
join
(
"
,
"
),
xy
=
[{
x
:
X
,
y
:
Y
+
size
*
2
+
h
},
{
x
:
X
-
size
*
2
-
w
,
y
:
Y
},
{
x
:
X
,
y
:
Y
-
size
*
2
-
h
},
{
x
:
X
+
size
*
2
+
w
,
y
:
Y
}][
dir
];
xy
.
path
=
p
;
if
(
withAnimation
)
{
this
.
animate
(
xy
,
500
,
"
>
"
);
}
else
{
this
.
attr
(
xy
);
}
return
this
;
};
return
res
.
update
(
x
,
y
);
};
lib/commit_ext.rb
View file @
6b66a766
module
CommitExt
module
CommitExt
attr_accessor
:refs
def
safe_message
def
safe_message
message
.
encode
(
"UTF-8"
,
message
.
encode
(
"UTF-8"
,
:invalid
=>
:replace
,
:invalid
=>
:replace
,
...
...
lib/graph_commit.rb
0 → 100644
View file @
6b66a766
require
"grit"
class
GraphCommit
attr_accessor
:time
,
:space
def
initialize
(
commit
)
@_commit
=
commit
@time
=
-
1
@space
=
0
end
def
method_missing
(
m
,
*
args
,
&
block
)
@_commit
.
send
(
m
,
*
args
,
&
block
)
end
# Method is adding time and space on the
# list of commits. As well as returns date list
# corelated with time set on commits.
#
# @param [Array<GraphCommit>] comits to index
#
# @return [Array<TimeDate>] list of commit dates corelated with time on commits
def
self
.
index_commits
(
commits
)
days
,
heads
=
[],
[]
map
=
{}
commits
.
reverse
.
each_with_index
do
|
c
,
i
|
c
.
time
=
i
days
[
i
]
=
c
.
committed_date
map
[
c
.
id
]
=
c
heads
+=
c
.
refs
unless
c
.
refs
.
nil?
end
heads
.
select!
{
|
h
|
h
.
is_a?
Grit
::
Head
or
h
.
is_a?
Grit
::
Remote
}
# sort heads so the master is top and current branches are closer
heads
.
sort!
do
|
a
,
b
|
if
a
.
name
==
"master"
-
1
elsif
b
.
name
==
"master"
1
else
b
.
commit
.
committed_date
<=>
a
.
commit
.
committed_date
end
end
j
=
0
heads
.
each
do
|
h
|
if
map
.
include?
h
.
commit
.
id
then
j
=
mark_chain
(
j
+=
1
,
map
[
h
.
commit
.
id
],
map
)
end
end
days
end
# Add space mark on commit and its parents
#
# @param [Fixnum] space (row on the graph) to be set
# @param [GraphCommit] the commit object.
# @param [Hash<String,GraphCommit>] map of commits
#
# @return [Fixnum] max space used.
def
self
.
mark_chain
(
mark
,
commit
,
map
)
commit
.
space
=
mark
if
commit
.
space
==
0
m1
=
mark
-
1
marks
=
commit
.
parents
.
collect
do
|
p
|
if
map
.
include?
p
.
id
and
map
[
p
.
id
].
space
==
0
then
mark_chain
(
m1
+=
1
,
map
[
p
.
id
],
map
)
else
m1
+
1
end
end
marks
<<
mark
marks
.
compact
.
max
end
def
self
.
add_refs
(
commit
,
ref_cache
)
if
ref_cache
.
empty?
@repo
.
refs
.
each
{
|
ref
|
ref_cache
[
ref
.
commit
.
id
]
||=
[];
ref_cache
[
ref
.
commit
.
id
]
<<
ref
}
end
commit
.
refs
=
ref_cache
[
commit
.
id
]
if
ref_cache
.
include?
commit
.
id
commit
.
refs
||=
[]
end
end
vendor/assets/javascripts/raphael.js
0 → 100644
View file @
6b66a766
/*
* Raphael 1.5.2 - JavaScript Vector Library
*
* Copyright (c) 2010 Dmitry Baranovskiy (http://raphaeljs.com)
* Licensed under the MIT (http://raphaeljs.com/license.html) license.
*/
(
function
(){
function
cC
(
a
,
b
,
c
,
d
,
e
,
f
){
function
o
(
a
,
b
){
var
c
,
d
,
e
,
f
,
j
,
k
;
for
(
e
=
a
,
k
=
0
;
k
<
8
;
k
++
){
f
=
m
(
e
)
-
a
;
if
(
B
(
f
)
<
b
)
return
e
;
j
=
(
3
*
i
*
e
+
2
*
h
)
*
e
+
g
;
if
(
B
(
j
)
<
1
e
-
6
)
break
;
e
=
e
-
f
/
j
}
c
=
0
,
d
=
1
,
e
=
a
;
if
(
e
<
c
)
return
c
;
if
(
e
>
d
)
return
d
;
while
(
c
<
d
){
f
=
m
(
e
);
if
(
B
(
f
-
a
)
<
b
)
return
e
;
a
>
f
?
c
=
e
:
d
=
e
,
e
=
(
d
-
c
)
/
2
+
c
}
return
e
}
function
n
(
a
,
b
){
var
c
=
o
(
a
,
b
);
return
((
l
*
c
+
k
)
*
c
+
j
)
*
c
}
function
m
(
a
){
return
((
i
*
a
+
h
)
*
a
+
g
)
*
a
}
var
g
=
3
*
b
,
h
=
3
*
(
d
-
b
)
-
g
,
i
=
1
-
g
-
h
,
j
=
3
*
c
,
k
=
3
*
(
e
-
c
)
-
j
,
l
=
1
-
j
-
k
;
return
n
(
a
,
1
/
(
200
*
f
))}
function
cB
(
b
){
return
function
(
c
,
d
,
e
,
f
){
var
g
=
{
back
:
b
};
a
.
is
(
e
,
"
function
"
)?
f
=
e
:
g
.
rot
=
e
,
c
&&
c
.
constructor
==
bN
&&
(
c
=
c
.
attrs
.
path
),
c
&&
(
g
.
along
=
c
);
return
this
.
animate
(
g
,
d
,
f
)}}
function
cp
(){
return
this
.
x
+
q
+
this
.
y
}
function
bm
(
a
,
b
,
c
){
function
d
(){
var
g
=
Array
[
e
].
slice
.
call
(
arguments
,
0
),
h
=
g
[
v
](
"
►
"
),
i
=
d
.
cache
=
d
.
cache
||
{},
j
=
d
.
count
=
d
.
count
||
[];
if
(
i
[
f
](
h
))
return
c
?
c
(
i
[
h
]):
i
[
h
];
j
[
w
]
>=
1
e3
&&
delete
i
[
j
.
shift
()],
j
[
L
](
h
),
i
[
h
]
=
a
[
m
](
b
,
g
);
return
c
?
c
(
i
[
h
]):
i
[
h
]}
return
d
}
function
bh
(){
var
a
=
[],
b
=
0
;
for
(;
b
<
32
;
b
++
)
a
[
b
]
=
(
~~
(
y
.
random
()
*
16
))[
H
](
16
);
a
[
12
]
=
4
,
a
[
16
]
=
(
a
[
16
]
&
3
|
8
)[
H
](
16
);
return
"
r-
"
+
a
[
v
](
""
)}
function
a
(){
if
(
a
.
is
(
arguments
[
0
],
G
)){
var
b
=
arguments
[
0
],
d
=
bV
[
m
](
a
,
b
.
splice
(
0
,
3
+
a
.
is
(
b
[
0
],
E
))),
e
=
d
.
set
();
for
(
var
g
=
0
,
h
=
b
[
w
];
g
<
h
;
g
++
){
var
i
=
b
[
g
]
||
{};
c
[
f
](
i
.
type
)
&&
e
[
L
](
d
[
i
.
type
]().
attr
(
i
))}
return
e
}
return
bV
[
m
](
a
,
arguments
)}
a
.
version
=
"
1.5.2
"
;
var
b
=
/
[
,
]
+/
,
c
=
{
circle
:
1
,
rect
:
1
,
path
:
1
,
ellipse
:
1
,
text
:
1
,
image
:
1
},
d
=
/
\{(\d
+
)\}
/g
,
e
=
"
prototype
"
,
f
=
"
hasOwnProperty
"
,
g
=
document
,
h
=
window
,
i
=
{
was
:
Object
[
e
][
f
].
call
(
h
,
"
Raphael
"
),
is
:
h
.
Raphael
},
j
=
function
(){
this
.
customAttributes
=
{}},
k
,
l
=
"
appendChild
"
,
m
=
"
apply
"
,
n
=
"
concat
"
,
o
=
"
createTouch
"
in
g
,
p
=
""
,
q
=
"
"
,
r
=
String
,
s
=
"
split
"
,
t
=
"
click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend
"
[
s
](
q
),
u
=
{
mousedown
:
"
touchstart
"
,
mousemove
:
"
touchmove
"
,
mouseup
:
"
touchend
"
},
v
=
"
join
"
,
w
=
"
length
"
,
x
=
r
[
e
].
toLowerCase
,
y
=
Math
,
z
=
y
.
max
,
A
=
y
.
min
,
B
=
y
.
abs
,
C
=
y
.
pow
,
D
=
y
.
PI
,
E
=
"
number
"
,
F
=
"
string
"
,
G
=
"
array
"
,
H
=
"
toString
"
,
I
=
"
fill
"
,
J
=
Object
[
e
][
H
],
K
=
{},
L
=
"
push
"
,
M
=
/^url
\([
'"
]?([^\)]
+
?)[
'"
]?\)
$/i
,
N
=
/^
\s
*
((
#
[
a-f
\d]{6})
|
(
#
[
a-f
\d]{3})
|rgba
?\(\s
*
([\d\.]
+%
?\s
*,
\s
*
[\d\.]
+%
?\s
*,
\s
*
[\d\.]
+
(?:
%
?\s
*,
\s
*
[\d\.]
+
)?)
%
?\s
*
\)
|hsba
?\(\s
*
([\d\.]
+
(?:
deg|
\x
b0|%
)?\s
*,
\s
*
[\d\.]
+%
?\s
*,
\s
*
[\d\.]
+
(?:
%
?\s
*,
\s
*
[\d\.]
+
)?)
%
?\s
*
\)
|hsla
?\(\s
*
([\d\.]
+
(?:
deg|
\x
b0|%
)?\s
*,
\s
*
[\d\.]
+%
?\s
*,
\s
*
[\d\.]
+
(?:
%
?\s
*,
\s
*
[\d\.]
+
)?)
%
?\s
*
\))\s
*$/i
,
O
=
{
NaN
:
1
,
Infinity
:
1
,
"
-Infinity
"
:
1
},
P
=
/^
(?:
cubic-
)?
bezier
\(([^
,
]
+
)
,
([^
,
]
+
)
,
([^
,
]
+
)
,
([^\)]
+
)\)
/
,
Q
=
y
.
round
,
R
=
"
setAttribute
"
,
S
=
parseFloat
,
T
=
parseInt
,
U
=
"
progid:DXImageTransform.Microsoft
"
,
V
=
r
[
e
].
toUpperCase
,
W
=
{
blur
:
0
,
"
clip-rect
"
:
"
0 0 1e9 1e9
"
,
cursor
:
"
default
"
,
cx
:
0
,
cy
:
0
,
fill
:
"
#fff
"
,
"
fill-opacity
"
:
1
,
font
:
'
10px "Arial"
'
,
"
font-family
"
:
'
"Arial"
'
,
"
font-size
"
:
"
10
"
,
"
font-style
"
:
"
normal
"
,
"
font-weight
"
:
400
,
gradient
:
0
,
height
:
0
,
href
:
"
http://raphaeljs.com/
"
,
opacity
:
1
,
path
:
"
M0,0
"
,
r
:
0
,
rotation
:
0
,
rx
:
0
,
ry
:
0
,
scale
:
"
1 1
"
,
src
:
""
,
stroke
:
"
#000
"
,
"
stroke-dasharray
"
:
""
,
"
stroke-linecap
"
:
"
butt
"
,
"
stroke-linejoin
"
:
"
butt
"
,
"
stroke-miterlimit
"
:
0
,
"
stroke-opacity
"
:
1
,
"
stroke-width
"
:
1
,
target
:
"
_blank
"
,
"
text-anchor
"
:
"
middle
"
,
title
:
"
Raphael
"
,
translation
:
"
0 0
"
,
width
:
0
,
x
:
0
,
y
:
0
},
X
=
{
along
:
"
along
"
,
blur
:
E
,
"
clip-rect
"
:
"
csv
"
,
cx
:
E
,
cy
:
E
,
fill
:
"
colour
"
,
"
fill-opacity
"
:
E
,
"
font-size
"
:
E
,
height
:
E
,
opacity
:
E
,
path
:
"
path
"
,
r
:
E
,
rotation
:
"
csv
"
,
rx
:
E
,
ry
:
E
,
scale
:
"
csv
"
,
stroke
:
"
colour
"
,
"
stroke-opacity
"
:
E
,
"
stroke-width
"
:
E
,
translation
:
"
csv
"
,
width
:
E
,
x
:
E
,
y
:
E
},
Y
=
"
replace
"
,
Z
=
/^
(
from|to|
\d
+%
?)
$/
,
$
=
/
\s
*,
\s
*/
,
_
=
{
hs
:
1
,
rg
:
1
},
ba
=
/,
?([
achlmqrstvxz
])
,
?
/gi
,
bb
=
/
([
achlmqstvz
])[\s
,
]
*
((
-
?\d
*
\.?\d
*
(?:
e
[
-+
]?\d
+
)?\s
*,
?\s
*
)
+
)
/ig
,
bc
=
/
(
-
?\d
*
\.?\d
*
(?:
e
[
-+
]?\d
+
)?)\s
*,
?\s
*/ig
,
bd
=
/^r
(?:\(([^
,
]
+
?)\s
*,
\s
*
([^\)]
+
?)\))?
/
,
be
=
function
(
a
,
b
){
return
a
.
key
-
b
.
key
};
a
.
type
=
h
.
SVGAngle
||
g
.
implementation
.
hasFeature
(
"
http://www.w3.org/TR/SVG11/feature#BasicStructure
"
,
"
1.1
"
)?
"
SVG
"
:
"
VML
"
;
if
(
a
.
type
==
"
VML
"
){
var
bf
=
g
.
createElement
(
"
div
"
),
bg
;
bf
.
innerHTML
=
'
<v:shape adj="1"/>
'
,
bg
=
bf
.
firstChild
,
bg
.
style
.
behavior
=
"
url(#default#VML)
"
;
if
(
!
bg
||
typeof
bg
.
adj
!=
"
object
"
)
return
a
.
type
=
null
;
bf
=
null
}
a
.
svg
=!
(
a
.
vml
=
a
.
type
==
"
VML
"
),
j
[
e
]
=
a
[
e
],
k
=
j
[
e
],
a
.
_id
=
0
,
a
.
_oid
=
0
,
a
.
fn
=
{},
a
.
is
=
function
(
a
,
b
){
b
=
x
.
call
(
b
);
if
(
b
==
"
finite
"
)
return
!
O
[
f
](
+
a
);
return
b
==
"
null
"
&&
a
===
null
||
b
==
typeof
a
||
b
==
"
object
"
&&
a
===
Object
(
a
)
||
b
==
"
array
"
&&
Array
.
isArray
&&
Array
.
isArray
(
a
)
||
J
.
call
(
a
).
slice
(
8
,
-
1
).
toLowerCase
()
==
b
},
a
.
angle
=
function
(
b
,
c
,
d
,
e
,
f
,
g
){
if
(
f
==
null
){
var
h
=
b
-
d
,
i
=
c
-
e
;
if
(
!
h
&&!
i
)
return
0
;
return
((
h
<
0
)
*
180
+
y
.
atan
(
-
i
/-
h
)
*
180
/
D
+
360
)
%
360
}
return
a
.
angle
(
b
,
c
,
f
,
g
)
-
a
.
angle
(
d
,
e
,
f
,
g
)},
a
.
rad
=
function
(
a
){
return
a
%
360
*
D
/
180
},
a
.
deg
=
function
(
a
){
return
a
*
180
/
D
%
360
},
a
.
snapTo
=
function
(
b
,
c
,
d
){
d
=
a
.
is
(
d
,
"
finite
"
)?
d
:
10
;
if
(
a
.
is
(
b
,
G
)){
var
e
=
b
.
length
;
while
(
e
--
)
if
(
B
(
b
[
e
]
-
c
)
<=
d
)
return
b
[
e
]}
else
{
b
=+
b
;
var
f
=
c
%
b
;
if
(
f
<
d
)
return
c
-
f
;
if
(
f
>
b
-
d
)
return
c
-
f
+
b
}
return
c
},
a
.
setWindow
=
function
(
a
){
h
=
a
,
g
=
h
.
document
};
var
bi
=
function
(
b
){
if
(
a
.
vml
){
var
c
=
/^
\s
+|
\s
+$/g
,
d
;
try
{
var
e
=
new
ActiveXObject
(
"
htmlfile
"
);
e
.
write
(
"
<body>
"
),
e
.
close
(),
d
=
e
.
body
}
catch
(
f
){
d
=
createPopup
().
document
.
body
}
var
h
=
d
.
createTextRange
();
bi
=
bm
(
function
(
a
){
try
{
d
.
style
.
color
=
r
(
a
)[
Y
](
c
,
p
);
var
b
=
h
.
queryCommandValue
(
"
ForeColor
"
);
b
=
(
b
&
255
)
<<
16
|
b
&
65280
|
(
b
&
16711680
)
>>>
16
;
return
"
#
"
+
(
"
000000
"
+
b
[
H
](
16
)).
slice
(
-
6
)}
catch
(
e
){
return
"
none
"
}})}
else
{
var
i
=
g
.
createElement
(
"
i
"
);
i
.
title
=
"
Raphaël Colour Picker
"
,
i
.
style
.
display
=
"
none
"
,
g
.
body
[
l
](
i
),
bi
=
bm
(
function
(
a
){
i
.
style
.
color
=
a
;
return
g
.
defaultView
.
getComputedStyle
(
i
,
p
).
getPropertyValue
(
"
color
"
)})}
return
bi
(
b
)},
bj
=
function
(){
return
"
hsb(
"
+
[
this
.
h
,
this
.
s
,
this
.
b
]
+
"
)
"
},
bk
=
function
(){
return
"
hsl(
"
+
[
this
.
h
,
this
.
s
,
this
.
l
]
+
"
)
"
},
bl
=
function
(){
return
this
.
hex
};
a
.
hsb2rgb
=
function
(
b
,
c
,
d
,
e
){
a
.
is
(
b
,
"
object
"
)
&&
"
h
"
in
b
&&
"
s
"
in
b
&&
"
b
"
in
b
&&
(
d
=
b
.
b
,
c
=
b
.
s
,
b
=
b
.
h
,
e
=
b
.
o
);
return
a
.
hsl2rgb
(
b
,
c
,
d
/
2
,
e
)},
a
.
hsl2rgb
=
function
(
b
,
c
,
d
,
e
){
a
.
is
(
b
,
"
object
"
)
&&
"
h
"
in
b
&&
"
s
"
in
b
&&
"
l
"
in
b
&&
(
d
=
b
.
l
,
c
=
b
.
s
,
b
=
b
.
h
);
if
(
b
>
1
||
c
>
1
||
d
>
1
)
b
/=
360
,
c
/=
100
,
d
/=
100
;
var
f
=
{},
g
=
[
"
r
"
,
"
g
"
,
"
b
"
],
h
,
i
,
j
,
k
,
l
,
m
;
if
(
!
c
)
f
=
{
r
:
d
,
g
:
d
,
b
:
d
};
else
{
d
<
.
5
?
h
=
d
*
(
1
+
c
):
h
=
d
+
c
-
d
*
c
,
i
=
2
*
d
-
h
;
for
(
var
n
=
0
;
n
<
3
;
n
++
)
j
=
b
+
1
/
3
*-
(
n
-
1
),
j
<
0
&&
j
++
,
j
>
1
&&
j
--
,
j
*
6
<
1
?
f
[
g
[
n
]]
=
i
+
(
h
-
i
)
*
6
*
j
:
j
*
2
<
1
?
f
[
g
[
n
]]
=
h
:
j
*
3
<
2
?
f
[
g
[
n
]]
=
i
+
(
h
-
i
)
*
(
2
/
3
-
j
)
*
6
:
f
[
g
[
n
]]
=
i
}
f
.
r
*=
255
,
f
.
g
*=
255
,
f
.
b
*=
255
,
f
.
hex
=
"
#
"
+
(
16777216
|
f
.
b
|
f
.
g
<<
8
|
f
.
r
<<
16
).
toString
(
16
).
slice
(
1
),
a
.
is
(
e
,
"
finite
"
)
&&
(
f
.
opacity
=
e
),
f
.
toString
=
bl
;
return
f
},
a
.
rgb2hsb
=
function
(
b
,
c
,
d
){
c
==
null
&&
a
.
is
(
b
,
"
object
"
)
&&
"
r
"
in
b
&&
"
g
"
in
b
&&
"
b
"
in
b
&&
(
d
=
b
.
b
,
c
=
b
.
g
,
b
=
b
.
r
);
if
(
c
==
null
&&
a
.
is
(
b
,
F
)){
var
e
=
a
.
getRGB
(
b
);
b
=
e
.
r
,
c
=
e
.
g
,
d
=
e
.
b
}
if
(
b
>
1
||
c
>
1
||
d
>
1
)
b
/=
255
,
c
/=
255
,
d
/=
255
;
var
f
=
z
(
b
,
c
,
d
),
g
=
A
(
b
,
c
,
d
),
h
,
i
,
j
=
f
;
if
(
g
==
f
)
return
{
h
:
0
,
s
:
0
,
b
:
f
,
toString
:
bj
};
var
k
=
f
-
g
;
i
=
k
/
f
,
b
==
f
?
h
=
(
c
-
d
)
/
k
:
c
==
f
?
h
=
2
+
(
d
-
b
)
/
k
:
h
=
4
+
(
b
-
c
)
/
k
,
h
/=
6
,
h
<
0
&&
h
++
,
h
>
1
&&
h
--
;
return
{
h
:
h
,
s
:
i
,
b
:
j
,
toString
:
bj
}},
a
.
rgb2hsl
=
function
(
b
,
c
,
d
){
c
==
null
&&
a
.
is
(
b
,
"
object
"
)
&&
"
r
"
in
b
&&
"
g
"
in
b
&&
"
b
"
in
b
&&
(
d
=
b
.
b
,
c
=
b
.
g
,
b
=
b
.
r
);
if
(
c
==
null
&&
a
.
is
(
b
,
F
)){
var
e
=
a
.
getRGB
(
b
);
b
=
e
.
r
,
c
=
e
.
g
,
d
=
e
.
b
}
if
(
b
>
1
||
c
>
1
||
d
>
1
)
b
/=
255
,
c
/=
255
,
d
/=
255
;
var
f
=
z
(
b
,
c
,
d
),
g
=
A
(
b
,
c
,
d
),
h
,
i
,
j
=
(
f
+
g
)
/
2
,
k
;
if
(
g
==
f
)
k
=
{
h
:
0
,
s
:
0
,
l
:
j
};
else
{
var
l
=
f
-
g
;
i
=
j
<
.
5
?
l
/
(
f
+
g
):
l
/
(
2
-
f
-
g
),
b
==
f
?
h
=
(
c
-
d
)
/
l
:
c
==
f
?
h
=
2
+
(
d
-
b
)
/
l
:
h
=
4
+
(
b
-
c
)
/
l
,
h
/=
6
,
h
<
0
&&
h
++
,
h
>
1
&&
h
--
,
k
=
{
h
:
h
,
s
:
i
,
l
:
j
}}
k
.
toString
=
bk
;
return
k
},
a
.
_path2string
=
function
(){
return
this
.
join
(
"
,
"
)[
Y
](
ba
,
"
$1
"
)},
a
.
getRGB
=
bm
(
function
(
b
){
if
(
!
b
||!!
((
b
=
r
(
b
)).
indexOf
(
"
-
"
)
+
1
))
return
{
r
:
-
1
,
g
:
-
1
,
b
:
-
1
,
hex
:
"
none
"
,
error
:
1
};
if
(
b
==
"
none
"
)
return
{
r
:
-
1
,
g
:
-
1
,
b
:
-
1
,
hex
:
"
none
"
};
!
_
[
f
](
b
.
toLowerCase
().
substring
(
0
,
2
))
&&
b
.
charAt
()
!=
"
#
"
&&
(
b
=
bi
(
b
));
var
c
,
d
,
e
,
g
,
h
,
i
,
j
,
k
=
b
.
match
(
N
);
if
(
k
){
k
[
2
]
&&
(
g
=
T
(
k
[
2
].
substring
(
5
),
16
),
e
=
T
(
k
[
2
].
substring
(
3
,
5
),
16
),
d
=
T
(
k
[
2
].
substring
(
1
,
3
),
16
)),
k
[
3
]
&&
(
g
=
T
((
i
=
k
[
3
].
charAt
(
3
))
+
i
,
16
),
e
=
T
((
i
=
k
[
3
].
charAt
(
2
))
+
i
,
16
),
d
=
T
((
i
=
k
[
3
].
charAt
(
1
))
+
i
,
16
)),
k
[
4
]
&&
(
j
=
k
[
4
][
s
](
$
),
d
=
S
(
j
[
0
]),
j
[
0
].
slice
(
-
1
)
==
"
%
"
&&
(
d
*=
2.55
),
e
=
S
(
j
[
1
]),
j
[
1
].
slice
(
-
1
)
==
"
%
"
&&
(
e
*=
2.55
),
g
=
S
(
j
[
2
]),
j
[
2
].
slice
(
-
1
)
==
"
%
"
&&
(
g
*=
2.55
),
k
[
1
].
toLowerCase
().
slice
(
0
,
4
)
==
"
rgba
"
&&
(
h
=
S
(
j
[
3
])),
j
[
3
]
&&
j
[
3
].
slice
(
-
1
)
==
"
%
"
&&
(
h
/=
100
));
if
(
k
[
5
]){
j
=
k
[
5
][
s
](
$
),
d
=
S
(
j
[
0
]),
j
[
0
].
slice
(
-
1
)
==
"
%
"
&&
(
d
*=
2.55
),
e
=
S
(
j
[
1
]),
j
[
1
].
slice
(
-
1
)
==
"
%
"
&&
(
e
*=
2.55
),
g
=
S
(
j
[
2
]),
j
[
2
].
slice
(
-
1
)
==
"
%
"
&&
(
g
*=
2.55
),(
j
[
0
].
slice
(
-
3
)
==
"
deg
"
||
j
[
0
].
slice
(
-
1
)
==
"
°
"
)
&&
(
d
/=
360
),
k
[
1
].
toLowerCase
().
slice
(
0
,
4
)
==
"
hsba
"
&&
(
h
=
S
(
j
[
3
])),
j
[
3
]
&&
j
[
3
].
slice
(
-
1
)
==
"
%
"
&&
(
h
/=
100
);
return
a
.
hsb2rgb
(
d
,
e
,
g
,
h
)}
if
(
k
[
6
]){
j
=
k
[
6
][
s
](
$
),
d
=
S
(
j
[
0
]),
j
[
0
].
slice
(
-
1
)
==
"
%
"
&&
(
d
*=
2.55
),
e
=
S
(
j
[
1
]),
j
[
1
].
slice
(
-
1
)
==
"
%
"
&&
(
e
*=
2.55
),
g
=
S
(
j
[
2
]),
j
[
2
].
slice
(
-
1
)
==
"
%
"
&&
(
g
*=
2.55
),(
j
[
0
].
slice
(
-
3
)
==
"
deg
"
||
j
[
0
].
slice
(
-
1
)
==
"
°
"
)
&&
(
d
/=
360
),
k
[
1
].
toLowerCase
().
slice
(
0
,
4
)
==
"
hsla
"
&&
(
h
=
S
(
j
[
3
])),
j
[
3
]
&&
j
[
3
].
slice
(
-
1
)
==
"
%
"
&&
(
h
/=
100
);
return
a
.
hsl2rgb
(
d
,
e
,
g
,
h
)}
k
=
{
r
:
d
,
g
:
e
,
b
:
g
},
k
.
hex
=
"
#
"
+
(
16777216
|
g
|
e
<<
8
|
d
<<
16
).
toString
(
16
).
slice
(
1
),
a
.
is
(
h
,
"
finite
"
)
&&
(
k
.
opacity
=
h
);
return
k
}
return
{
r
:
-
1
,
g
:
-
1
,
b
:
-
1
,
hex
:
"
none
"
,
error
:
1
}},
a
),
a
.
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
);
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
}));
return
c
.
hex
},
a
.
getColor
.
reset
=
function
(){
delete
this
.
start
},
a
.
parsePathString
=
bm
(
function
(
b
){
if
(
!
b
)
return
null
;
var
c
=
{
a
:
7
,
c
:
6
,
h
:
1
,
l
:
2
,
m
:
2
,
q
:
4
,
s
:
4
,
t
:
2
,
v
:
1
,
z
:
0
},
d
=
[];
a
.
is
(
b
,
G
)
&&
a
.
is
(
b
[
0
],
G
)
&&
(
d
=
bo
(
b
)),
d
[
w
]
||
r
(
b
)[
Y
](
bb
,
function
(
a
,
b
,
e
){
var
f
=
[],
g
=
x
.
call
(
b
);
e
[
Y
](
bc
,
function
(
a
,
b
){
b
&&
f
[
L
](
+
b
)}),
g
==
"
m
"
&&
f
[
w
]
>
2
&&
(
d
[
L
]([
b
][
n
](
f
.
splice
(
0
,
2
))),
g
=
"
l
"
,
b
=
b
==
"
m
"
?
"
l
"
:
"
L
"
);
while
(
f
[
w
]
>=
c
[
g
]){
d
[
L
]([
b
][
n
](
f
.
splice
(
0
,
c
[
g
])));
if
(
!
c
[
g
])
break
}}),
d
[
H
]
=
a
.
_path2string
;
return
d
}),
a
.
findDotsAtSegment
=
function
(
a
,
b
,
c
,
d
,
e
,
f
,
g
,
h
,
i
){
var
j
=
1
-
i
,
k
=
C
(
j
,
3
)
*
a
+
C
(
j
,
2
)
*
3
*
i
*
c
+
j
*
3
*
i
*
i
*
e
+
C
(
i
,
3
)
*
g
,
l
=
C
(
j
,
3
)
*
b
+
C
(
j
,
2
)
*
3
*
i
*
d
+
j
*
3
*
i
*
i
*
f
+
C
(
i
,
3
)
*
h
,
m
=
a
+
2
*
i
*
(
c
-
a
)
+
i
*
i
*
(
e
-
2
*
c
+
a
),
n
=
b
+
2
*
i
*
(
d
-
b
)
+
i
*
i
*
(
f
-
2
*
d
+
b
),
o
=
c
+
2
*
i
*
(
e
-
c
)
+
i
*
i
*
(
g
-
2
*
e
+
c
),
p
=
d
+
2
*
i
*
(
f
-
d
)
+
i
*
i
*
(
h
-
2
*
f
+
d
),
q
=
(
1
-
i
)
*
a
+
i
*
c
,
r
=
(
1
-
i
)
*
b
+
i
*
d
,
s
=
(
1
-
i
)
*
e
+
i
*
g
,
t
=
(
1
-
i
)
*
f
+
i
*
h
,
u
=
90
-
y
.
atan
((
m
-
o
)
/
(
n
-
p
))
*
180
/
D
;(
m
>
o
||
n
<
p
)
&&
(
u
+=
180
);
return
{
x
:
k
,
y
:
l
,
m
:{
x
:
m
,
y
:
n
},
n
:{
x
:
o
,
y
:
p
},
start
:{
x
:
q
,
y
:
r
},
end
:{
x
:
s
,
y
:
t
},
alpha
:
u
}};
var
bn
=
bm
(
function
(
a
){
if
(
!
a
)
return
{
x
:
0
,
y
:
0
,
width
:
0
,
height
:
0
};
a
=
bw
(
a
);
var
b
=
0
,
c
=
0
,
d
=
[],
e
=
[],
f
;
for
(
var
g
=
0
,
h
=
a
[
w
];
g
<
h
;
g
++
){
f
=
a
[
g
];
if
(
f
[
0
]
==
"
M
"
)
b
=
f
[
1
],
c
=
f
[
2
],
d
[
L
](
b
),
e
[
L
](
c
);
else
{
var
i
=
bv
(
b
,
c
,
f
[
1
],
f
[
2
],
f
[
3
],
f
[
4
],
f
[
5
],
f
[
6
]);
d
=
d
[
n
](
i
.
min
.
x
,
i
.
max
.
x
),
e
=
e
[
n
](
i
.
min
.
y
,
i
.
max
.
y
),
b
=
f
[
5
],
c
=
f
[
6
]}}
var
j
=
A
[
m
](
0
,
d
),
k
=
A
[
m
](
0
,
e
);
return
{
x
:
j
,
y
:
k
,
width
:
z
[
m
](
0
,
d
)
-
j
,
height
:
z
[
m
](
0
,
e
)
-
k
}}),
bo
=
function
(
b
){
var
c
=
[];
if
(
!
a
.
is
(
b
,
G
)
||!
a
.
is
(
b
&&
b
[
0
],
G
))
b
=
a
.
parsePathString
(
b
);
for
(
var
d
=
0
,
e
=
b
[
w
];
d
<
e
;
d
++
){
c
[
d
]
=
[];
for
(
var
f
=
0
,
g
=
b
[
d
][
w
];
f
<
g
;
f
++
)
c
[
d
][
f
]
=
b
[
d
][
f
]}
c
[
H
]
=
a
.
_path2string
;
return
c
},
bp
=
bm
(
function
(
b
){
if
(
!
a
.
is
(
b
,
G
)
||!
a
.
is
(
b
&&
b
[
0
],
G
))
b
=
a
.
parsePathString
(
b
);
var
c
=
[],
d
=
0
,
e
=
0
,
f
=
0
,
g
=
0
,
h
=
0
;
b
[
0
][
0
]
==
"
M
"
&&
(
d
=
b
[
0
][
1
],
e
=
b
[
0
][
2
],
f
=
d
,
g
=
e
,
h
++
,
c
[
L
]([
"
M
"
,
d
,
e
]));
for
(
var
i
=
h
,
j
=
b
[
w
];
i
<
j
;
i
++
){
var
k
=
c
[
i
]
=
[],
l
=
b
[
i
];
if
(
l
[
0
]
!=
x
.
call
(
l
[
0
])){
k
[
0
]
=
x
.
call
(
l
[
0
]);
switch
(
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
]
-
d
).
toFixed
(
3
),
k
[
7
]
=+
(
l
[
7
]
-
e
).
toFixed
(
3
);
break
;
case
"
v
"
:
k
[
1
]
=+
(
l
[
1
]
-
e
).
toFixed
(
3
);
break
;
case
"
m
"
:
f
=
l
[
1
],
g
=
l
[
2
];
default
:
for
(
var
m
=
1
,
n
=
l
[
w
];
m
<
n
;
m
++
)
k
[
m
]
=+
(
l
[
m
]
-
(
m
%
2
?
d
:
e
)).
toFixed
(
3
)}}
else
{
k
=
c
[
i
]
=
[],
l
[
0
]
==
"
m
"
&&
(
f
=
l
[
1
]
+
d
,
g
=
l
[
2
]
+
e
);
for
(
var
o
=
0
,
p
=
l
[
w
];
o
<
p
;
o
++
)
c
[
i
][
o
]
=
l
[
o
]}
var
q
=
c
[
i
][
w
];
switch
(
c
[
i
][
0
]){
case
"
z
"
:
d
=
f
,
e
=
g
;
break
;
case
"
h
"
:
d
+=+
c
[
i
][
q
-
1
];
break
;
case
"
v
"
:
e
+=+
c
[
i
][
q
-
1
];
break
;
default
:
d
+=+
c
[
i
][
q
-
2
],
e
+=+
c
[
i
][
q
-
1
]}}
c
[
H
]
=
a
.
_path2string
;
return
c
},
0
,
bo
),
bq
=
bm
(
function
(
b
){
if
(
!
a
.
is
(
b
,
G
)
||!
a
.
is
(
b
&&
b
[
0
],
G
))
b
=
a
.
parsePathString
(
b
);
var
c
=
[],
d
=
0
,
e
=
0
,
f
=
0
,
g
=
0
,
h
=
0
;
b
[
0
][
0
]
==
"
M
"
&&
(
d
=+
b
[
0
][
1
],
e
=+
b
[
0
][
2
],
f
=
d
,
g
=
e
,
h
++
,
c
[
0
]
=
[
"
M
"
,
d
,
e
]);
for
(
var
i
=
h
,
j
=
b
[
w
];
i
<
j
;
i
++
){
var
k
=
c
[
i
]
=
[],
l
=
b
[
i
];
if
(
l
[
0
]
!=
V
.
call
(
l
[
0
])){
k
[
0
]
=
V
.
call
(
l
[
0
]);
switch
(
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
]
+
d
),
k
[
7
]
=+
(
l
[
7
]
+
e
);
break
;
case
"
V
"
:
k
[
1
]
=+
l
[
1
]
+
e
;
break
;
case
"
H
"
:
k
[
1
]
=+
l
[
1
]
+
d
;
break
;
case
"
M
"
:
f
=+
l
[
1
]
+
d
,
g
=+
l
[
2
]
+
e
;
default
:
for
(
var
m
=
1
,
n
=
l
[
w
];
m
<
n
;
m
++
)
k
[
m
]
=+
l
[
m
]
+
(
m
%
2
?
d
:
e
)}}
else
for
(
var
o
=
0
,
p
=
l
[
w
];
o
<
p
;
o
++
)
c
[
i
][
o
]
=
l
[
o
];
switch
(
k
[
0
]){
case
"
Z
"
:
d
=
f
,
e
=
g
;
break
;
case
"
H
"
:
d
=
k
[
1
];
break
;
case
"
V
"
:
e
=
k
[
1
];
break
;
case
"
M
"
:
f
=
c
[
i
][
c
[
i
][
w
]
-
2
],
g
=
c
[
i
][
c
[
i
][
w
]
-
1
];
default
:
d
=
c
[
i
][
c
[
i
][
w
]
-
2
],
e
=
c
[
i
][
c
[
i
][
w
]
-
1
]}}
c
[
H
]
=
a
.
_path2string
;
return
c
},
null
,
bo
),
br
=
function
(
a
,
b
,
c
,
d
){
return
[
a
,
b
,
c
,
d
,
c
,
d
]},
bs
=
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
]},
bt
=
function
(
a
,
b
,
c
,
d
,
e
,
f
,
g
,
h
,
i
,
j
){
var
k
=
D
*
120
/
180
,
l
=
D
/
180
*
(
+
e
||
0
),
m
=
[],
o
,
p
=
bm
(
function
(
a
,
b
,
c
){
var
d
=
a
*
y
.
cos
(
c
)
-
b
*
y
.
sin
(
c
),
e
=
a
*
y
.
sin
(
c
)
+
b
*
y
.
cos
(
c
);
return
{
x
:
d
,
y
:
e
}});
if
(
!
j
){
o
=
p
(
a
,
b
,
-
l
),
a
=
o
.
x
,
b
=
o
.
y
,
o
=
p
(
h
,
i
,
-
l
),
h
=
o
.
x
,
i
=
o
.
y
;
var
q
=
y
.
cos
(
D
/
180
*
e
),
r
=
y
.
sin
(
D
/
180
*
e
),
t
=
(
a
-
h
)
/
2
,
u
=
(
b
-
i
)
/
2
,
x
=
t
*
t
/
(
c
*
c
)
+
u
*
u
/
(
d
*
d
);
x
>
1
&&
(
x
=
y
.
sqrt
(
x
),
c
=
x
*
c
,
d
=
x
*
d
);
var
z
=
c
*
c
,
A
=
d
*
d
,
C
=
(
f
==
g
?
-
1
:
1
)
*
y
.
sqrt
(
B
((
z
*
A
-
z
*
u
*
u
-
A
*
t
*
t
)
/
(
z
*
u
*
u
+
A
*
t
*
t
))),
E
=
C
*
c
*
u
/
d
+
(
a
+
h
)
/
2
,
F
=
C
*-
d
*
t
/
c
+
(
b
+
i
)
/
2
,
G
=
y
.
asin
(((
b
-
F
)
/
d
).
toFixed
(
9
)),
H
=
y
.
asin
(((
i
-
F
)
/
d
).
toFixed
(
9
));
G
=
a
<
E
?
D
-
G
:
G
,
H
=
h
<
E
?
D
-
H
:
H
,
G
<
0
&&
(
G
=
D
*
2
+
G
),
H
<
0
&&
(
H
=
D
*
2
+
H
),
g
&&
G
>
H
&&
(
G
=
G
-
D
*
2
),
!
g
&&
H
>
G
&&
(
H
=
H
-
D
*
2
)}
else
G
=
j
[
0
],
H
=
j
[
1
],
E
=
j
[
2
],
F
=
j
[
3
];
var
I
=
H
-
G
;
if
(
B
(
I
)
>
k
){
var
J
=
H
,
K
=
h
,
L
=
i
;
H
=
G
+
k
*
(
g
&&
H
>
G
?
1
:
-
1
),
h
=
E
+
c
*
y
.
cos
(
H
),
i
=
F
+
d
*
y
.
sin
(
H
),
m
=
bt
(
h
,
i
,
c
,
d
,
e
,
0
,
g
,
K
,
L
,[
H
,
J
,
E
,
F
])}
I
=
H
-
G
;
var
M
=
y
.
cos
(
G
),
N
=
y
.
sin
(
G
),
O
=
y
.
cos
(
H
),
P
=
y
.
sin
(
H
),
Q
=
y
.
tan
(
I
/
4
),
R
=
4
/
3
*
c
*
Q
,
S
=
4
/
3
*
d
*
Q
,
T
=
[
a
,
b
],
U
=
[
a
+
R
*
N
,
b
-
S
*
M
],
V
=
[
h
+
R
*
P
,
i
-
S
*
O
],
W
=
[
h
,
i
];
U
[
0
]
=
2
*
T
[
0
]
-
U
[
0
],
U
[
1
]
=
2
*
T
[
1
]
-
U
[
1
];
if
(
j
)
return
[
U
,
V
,
W
][
n
](
m
);
m
=
[
U
,
V
,
W
][
n
](
m
)[
v
]()[
s
](
"
,
"
);
var
X
=
[];
for
(
var
Y
=
0
,
Z
=
m
[
w
];
Y
<
Z
;
Y
++
)
X
[
Y
]
=
Y
%
2
?
p
(
m
[
Y
-
1
],
m
[
Y
],
l
).
y
:
p
(
m
[
Y
],
m
[
Y
+
1
],
l
).
x
;
return
X
},
bu
=
function
(
a
,
b
,
c
,
d
,
e
,
f
,
g
,
h
,
i
){
var
j
=
1
-
i
;
return
{
x
:
C
(
j
,
3
)
*
a
+
C
(
j
,
2
)
*
3
*
i
*
c
+
j
*
3
*
i
*
i
*
e
+
C
(
i
,
3
)
*
g
,
y
:
C
(
j
,
3
)
*
b
+
C
(
j
,
2
)
*
3
*
i
*
d
+
j
*
3
*
i
*
i
*
f
+
C
(
i
,
3
)
*
h
}},
bv
=
bm
(
function
(
a
,
b
,
c
,
d
,
e
,
f
,
g
,
h
){
var
i
=
e
-
2
*
c
+
a
-
(
g
-
2
*
e
+
c
),
j
=
2
*
(
c
-
a
)
-
2
*
(
e
-
c
),
k
=
a
-
c
,
l
=
(
-
j
+
y
.
sqrt
(
j
*
j
-
4
*
i
*
k
))
/
2
/
i
,
n
=
(
-
j
-
y
.
sqrt
(
j
*
j
-
4
*
i
*
k
))
/
2
/
i
,
o
=
[
b
,
h
],
p
=
[
a
,
g
],
q
;
B
(
l
)
>
"
1e12
"
&&
(
l
=
.
5
),
B
(
n
)
>
"
1e12
"
&&
(
n
=
.
5
),
l
>
0
&&
l
<
1
&&
(
q
=
bu
(
a
,
b
,
c
,
d
,
e
,
f
,
g
,
h
,
l
),
p
[
L
](
q
.
x
),
o
[
L
](
q
.
y
)),
n
>
0
&&
n
<
1
&&
(
q
=
bu
(
a
,
b
,
c
,
d
,
e
,
f
,
g
,
h
,
n
),
p
[
L
](
q
.
x
),
o
[
L
](
q
.
y
)),
i
=
f
-
2
*
d
+
b
-
(
h
-
2
*
f
+
d
),
j
=
2
*
(
d
-
b
)
-
2
*
(
f
-
d
),
k
=
b
-
d
,
l
=
(
-
j
+
y
.
sqrt
(
j
*
j
-
4
*
i
*
k
))
/
2
/
i
,
n
=
(
-
j
-
y
.
sqrt
(
j
*
j
-
4
*
i
*
k
))
/
2
/
i
,
B
(
l
)
>
"
1e12
"
&&
(
l
=
.
5
),
B
(
n
)
>
"
1e12
"
&&
(
n
=
.
5
),
l
>
0
&&
l
<
1
&&
(
q
=
bu
(
a
,
b
,
c
,
d
,
e
,
f
,
g
,
h
,
l
),
p
[
L
](
q
.
x
),
o
[
L
](
q
.
y
)),
n
>
0
&&
n
<
1
&&
(
q
=
bu
(
a
,
b
,
c
,
d
,
e
,
f
,
g
,
h
,
n
),
p
[
L
](
q
.
x
),
o
[
L
](
q
.
y
));
return
{
min
:{
x
:
A
[
m
](
0
,
p
),
y
:
A
[
m
](
0
,
o
)},
max
:{
x
:
z
[
m
](
0
,
p
),
y
:
z
[
m
](
0
,
o
)}}}),
bw
=
bm
(
function
(
a
,
b
){
var
c
=
bq
(
a
),
d
=
b
&&
bq
(
b
),
e
=
{
x
:
0
,
y
:
0
,
bx
:
0
,
by
:
0
,
X
:
0
,
Y
:
0
,
qx
:
null
,
qy
:
null
},
f
=
{
x
:
0
,
y
:
0
,
bx
:
0
,
by
:
0
,
X
:
0
,
Y
:
0
,
qx
:
null
,
qy
:
null
},
g
=
function
(
a
,
b
){
var
c
,
d
;
if
(
!
a
)
return
[
"
C
"
,
b
.
x
,
b
.
y
,
b
.
x
,
b
.
y
,
b
.
x
,
b
.
y
];
!
(
a
[
0
]
in
{
T
:
1
,
Q
:
1
})
&&
(
b
.
qx
=
b
.
qy
=
null
);
switch
(
a
[
0
]){
case
"
M
"
:
b
.
X
=
a
[
1
],
b
.
Y
=
a
[
2
];
break
;
case
"
A
"
:
a
=
[
"
C
"
][
n
](
bt
[
m
](
0
,[
b
.
x
,
b
.
y
][
n
](
a
.
slice
(
1
))));
break
;
case
"
S
"
:
c
=
b
.
x
+
(
b
.
x
-
(
b
.
bx
||
b
.
x
)),
d
=
b
.
y
+
(
b
.
y
-
(
b
.
by
||
b
.
y
)),
a
=
[
"
C
"
,
c
,
d
][
n
](
a
.
slice
(
1
));
break
;
case
"
T
"
:
b
.
qx
=
b
.
x
+
(
b
.
x
-
(
b
.
qx
||
b
.
x
)),
b
.
qy
=
b
.
y
+
(
b
.
y
-
(
b
.
qy
||
b
.
y
)),
a
=
[
"
C
"
][
n
](
bs
(
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
"
][
n
](
bs
(
b
.
x
,
b
.
y
,
a
[
1
],
a
[
2
],
a
[
3
],
a
[
4
]));
break
;
case
"
L
"
:
a
=
[
"
C
"
][
n
](
br
(
b
.
x
,
b
.
y
,
a
[
1
],
a
[
2
]));
break
;
case
"
H
"
:
a
=
[
"
C
"
][
n
](
br
(
b
.
x
,
b
.
y
,
a
[
1
],
b
.
y
));
break
;
case
"
V
"
:
a
=
[
"
C
"
][
n
](
br
(
b
.
x
,
b
.
y
,
b
.
x
,
a
[
1
]));
break
;
case
"
Z
"
:
a
=
[
"
C
"
][
n
](
br
(
b
.
x
,
b
.
y
,
b
.
X
,
b
.
Y
))}
return
a
},
h
=
function
(
a
,
b
){
if
(
a
[
b
][
w
]
>
7
){
a
[
b
].
shift
();
var
e
=
a
[
b
];
while
(
e
[
w
])
a
.
splice
(
b
++
,
0
,[
"
C
"
][
n
](
e
.
splice
(
0
,
6
)));
a
.
splice
(
b
,
1
),
k
=
z
(
c
[
w
],
d
&&
d
[
w
]
||
0
)}},
i
=
function
(
a
,
b
,
e
,
f
,
g
){
a
&&
b
&&
a
[
g
][
0
]
==
"
M
"
&&
b
[
g
][
0
]
!=
"
M
"
&&
(
b
.
splice
(
g
,
0
,[
"
M
"
,
f
.
x
,
f
.
y
]),
e
.
bx
=
0
,
e
.
by
=
0
,
e
.
x
=
a
[
g
][
1
],
e
.
y
=
a
[
g
][
2
],
k
=
z
(
c
[
w
],
d
&&
d
[
w
]
||
0
))};
for
(
var
j
=
0
,
k
=
z
(
c
[
w
],
d
&&
d
[
w
]
||
0
);
j
<
k
;
j
++
){
c
[
j
]
=
g
(
c
[
j
],
e
),
h
(
c
,
j
),
d
&&
(
d
[
j
]
=
g
(
d
[
j
],
f
)),
d
&&
h
(
d
,
j
),
i
(
c
,
d
,
e
,
f
,
j
),
i
(
d
,
c
,
f
,
e
,
j
);
var
l
=
c
[
j
],
o
=
d
&&
d
[
j
],
p
=
l
[
w
],
q
=
d
&&
o
[
w
];
e
.
x
=
l
[
p
-
2
],
e
.
y
=
l
[
p
-
1
],
e
.
bx
=
S
(
l
[
p
-
4
])
||
e
.
x
,
e
.
by
=
S
(
l
[
p
-
3
])
||
e
.
y
,
f
.
bx
=
d
&&
(
S
(
o
[
q
-
4
])
||
f
.
x
),
f
.
by
=
d
&&
(
S
(
o
[
q
-
3
])
||
f
.
y
),
f
.
x
=
d
&&
o
[
q
-
2
],
f
.
y
=
d
&&
o
[
q
-
1
]}
return
d
?[
c
,
d
]:
c
},
null
,
bo
),
bx
=
bm
(
function
(
b
){
var
c
=
[];
for
(
var
d
=
0
,
e
=
b
[
w
];
d
<
e
;
d
++
){
var
f
=
{},
g
=
b
[
d
].
match
(
/^
([^
:
]
*
)
:
?([\d\.]
*
)
/
);
f
.
color
=
a
.
getRGB
(
g
[
1
]);
if
(
f
.
color
.
error
)
return
null
;
f
.
color
=
f
.
color
.
hex
,
g
[
2
]
&&
(
f
.
offset
=
g
[
2
]
+
"
%
"
),
c
[
L
](
f
)}
for
(
d
=
1
,
e
=
c
[
w
]
-
1
;
d
<
e
;
d
++
)
if
(
!
c
[
d
].
offset
){
var
h
=
S
(
c
[
d
-
1
].
offset
||
0
),
i
=
0
;
for
(
var
j
=
d
+
1
;
j
<
e
;
j
++
)
if
(
c
[
j
].
offset
){
i
=
c
[
j
].
offset
;
break
}
i
||
(
i
=
100
,
j
=
e
),
i
=
S
(
i
);
var
k
=
(
i
-
h
)
/
(
j
-
d
+
1
);
for
(;
d
<
j
;
d
++
)
h
+=
k
,
c
[
d
].
offset
=
h
+
"
%
"
}
return
c
}),
by
=
function
(
b
,
c
,
d
,
e
){
var
f
;
if
(
!
a
.
is
(
b
,
F
)
&&!
a
.
is
(
b
,
"
object
"
))
return
{
container
:
1
,
x
:
b
,
y
:
c
,
width
:
d
,
height
:
e
};
f
=
a
.
is
(
b
,
F
)?
g
.
getElementById
(
b
):
b
;
if
(
f
.
tagName
)
return
c
==
null
?{
container
:
f
,
width
:
f
.
style
.
pixelWidth
||
f
.
offsetWidth
,
height
:
f
.
style
.
pixelHeight
||
f
.
offsetHeight
}:{
container
:
f
,
width
:
c
,
height
:
d
}},
bz
=
function
(
a
,
b
){
var
c
=
this
;
for
(
var
d
in
b
)
if
(
b
[
f
](
d
)
&&!
(
d
in
a
))
switch
(
typeof
b
[
d
]){
case
"
function
"
:(
function
(
b
){
a
[
d
]
=
a
===
c
?
b
:
function
(){
return
b
[
m
](
c
,
arguments
)}})(
b
[
d
]);
break
;
case
"
object
"
:
a
[
d
]
=
a
[
d
]
||
{},
bz
.
call
(
this
,
a
[
d
],
b
[
d
]);
break
;
default
:
a
[
d
]
=
b
[
d
]}},
bA
=
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
)},
bB
=
function
(
a
,
b
){
b
.
top
!==
a
&&
(
bA
(
a
,
b
),
a
.
next
=
null
,
a
.
prev
=
b
.
top
,
b
.
top
.
next
=
a
,
b
.
top
=
a
)},
bC
=
function
(
a
,
b
){
b
.
bottom
!==
a
&&
(
bA
(
a
,
b
),
a
.
next
=
b
.
bottom
,
a
.
prev
=
null
,
b
.
bottom
.
prev
=
a
,
b
.
bottom
=
a
)},
bD
=
function
(
a
,
b
,
c
){
bA
(
a
,
c
),
b
==
c
.
top
&&
(
c
.
top
=
a
),
b
.
next
&&
(
b
.
next
.
prev
=
a
),
a
.
next
=
b
.
next
,
a
.
prev
=
b
,
b
.
next
=
a
},
bE
=
function
(
a
,
b
,
c
){
bA
(
a
,
c
),
b
==
c
.
bottom
&&
(
c
.
bottom
=
a
),
b
.
prev
&&
(
b
.
prev
.
next
=
a
),
a
.
prev
=
b
.
prev
,
b
.
prev
=
a
,
a
.
next
=
b
},
bF
=
function
(
a
){
return
function
(){
throw
new
Error
(
"
Raphaël: you are calling to method “
"
+
a
+
"
” of removed object
"
)}};
a
.
pathToRelative
=
bp
;
if
(
a
.
svg
){
k
.
svgns
=
"
http://www.w3.org/2000/svg
"
,
k
.
xlink
=
"
http://www.w3.org/1999/xlink
"
,
Q
=
function
(
a
){
return
+
a
+
(
~~
a
===
a
)
*
.
5
};
var
bG
=
function
(
a
,
b
){
if
(
!
b
){
a
=
g
.
createElementNS
(
k
.
svgns
,
a
),
a
.
style
.
webkitTapHighlightColor
=
"
rgba(0,0,0,0)
"
;
return
a
}
for
(
var
c
in
b
)
b
[
f
](
c
)
&&
a
[
R
](
c
,
r
(
b
[
c
]))};
a
[
H
]
=
function
(){
return
"
Your browser supports SVG.
\n
You are running Raphaël
"
+
this
.
version
};
var
bH
=
function
(
a
,
b
){
var
c
=
bG
(
"
path
"
);
b
.
canvas
&&
b
.
canvas
[
l
](
c
);
var
d
=
new
bN
(
c
,
b
);
d
.
type
=
"
path
"
,
bK
(
d
,{
fill
:
"
none
"
,
stroke
:
"
#000
"
,
path
:
a
});
return
d
},
bI
=
function
(
a
,
b
,
c
){
var
d
=
"
linear
"
,
e
=
.
5
,
f
=
.
5
,
h
=
a
.
style
;
b
=
r
(
b
)[
Y
](
bd
,
function
(
a
,
b
,
c
){
d
=
"
radial
"
;
if
(
b
&&
c
){
e
=
S
(
b
),
f
=
S
(
c
);
var
g
=
(
f
>
.
5
)
*
2
-
1
;
C
(
e
-
.
5
,
2
)
+
C
(
f
-
.
5
,
2
)
>
.
25
&&
(
f
=
y
.
sqrt
(.
25
-
C
(
e
-
.
5
,
2
))
*
g
+
.
5
)
&&
f
!=
.
5
&&
(
f
=
f
.
toFixed
(
5
)
-
1
e
-
5
*
g
)}
return
p
}),
b
=
b
[
s
](
/
\s
*
\-\s
*/
);
if
(
d
==
"
linear
"
){
var
i
=
b
.
shift
();
i
=-
S
(
i
);
if
(
isNaN
(
i
))
return
null
;
var
j
=
[
0
,
0
,
y
.
cos
(
i
*
D
/
180
),
y
.
sin
(
i
*
D
/
180
)],
k
=
1
/
(
z
(
B
(
j
[
2
]),
B
(
j
[
3
]))
||
1
);
j
[
2
]
*=
k
,
j
[
3
]
*=
k
,
j
[
2
]
<
0
&&
(
j
[
0
]
=-
j
[
2
],
j
[
2
]
=
0
),
j
[
3
]
<
0
&&
(
j
[
1
]
=-
j
[
3
],
j
[
3
]
=
0
)}
var
m
=
bx
(
b
);
if
(
!
m
)
return
null
;
var
n
=
a
.
getAttribute
(
I
);
n
=
n
.
match
(
/^url
\(
#
(
.*
)\)
$/
),
n
&&
c
.
defs
.
removeChild
(
g
.
getElementById
(
n
[
1
]));
var
o
=
bG
(
d
+
"
Gradient
"
);
o
.
id
=
bh
(),
bG
(
o
,
d
==
"
radial
"
?{
fx
:
e
,
fy
:
f
}:{
x1
:
j
[
0
],
y1
:
j
[
1
],
x2
:
j
[
2
],
y2
:
j
[
3
]}),
c
.
defs
[
l
](
o
);
for
(
var
q
=
0
,
t
=
m
[
w
];
q
<
t
;
q
++
){
var
u
=
bG
(
"
stop
"
);
bG
(
u
,{
offset
:
m
[
q
].
offset
?
m
[
q
].
offset
:
q
?
"
100%
"
:
"
0%
"
,
"
stop-color
"
:
m
[
q
].
color
||
"
#fff
"
}),
o
[
l
](
u
)}
bG
(
a
,{
fill
:
"
url(#
"
+
o
.
id
+
"
)
"
,
opacity
:
1
,
"
fill-opacity
"
:
1
}),
h
.
fill
=
p
,
h
.
opacity
=
1
,
h
.
fillOpacity
=
1
;
return
1
},
bJ
=
function
(
b
){
var
c
=
b
.
getBBox
();
bG
(
b
.
pattern
,{
patternTransform
:
a
.
format
(
"
translate({0},{1})
"
,
c
.
x
,
c
.
y
)})},
bK
=
function
(
c
,
d
){
var
e
=
{
""
:[
0
],
none
:[
0
],
"
-
"
:[
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
]},
h
=
c
.
node
,
i
=
c
.
attrs
,
j
=
c
.
rotate
(),
k
=
function
(
a
,
b
){
b
=
e
[
x
.
call
(
b
)];
if
(
b
){
var
c
=
a
.
attrs
[
"
stroke-width
"
]
||
"
1
"
,
f
=
({
round
:
c
,
square
:
c
,
butt
:
0
})[
a
.
attrs
[
"
stroke-linecap
"
]
||
d
[
"
stroke-linecap
"
]]
||
0
,
g
=
[],
i
=
b
[
w
];
while
(
i
--
)
g
[
i
]
=
b
[
i
]
*
c
+
(
i
%
2
?
1
:
-
1
)
*
f
;
bG
(
h
,{
"
stroke-dasharray
"
:
g
[
v
](
"
,
"
)})}};
d
[
f
](
"
rotation
"
)
&&
(
j
=
d
.
rotation
);
var
m
=
r
(
j
)[
s
](
b
);
m
.
length
-
1
?(
m
[
1
]
=+
m
[
1
],
m
[
2
]
=+
m
[
2
]):
m
=
null
,
S
(
j
)
&&
c
.
rotate
(
0
,
!
0
);
for
(
var
n
in
d
)
if
(
d
[
f
](
n
)){
if
(
!
W
[
f
](
n
))
continue
;
var
o
=
d
[
n
];
i
[
n
]
=
o
;
switch
(
n
){
case
"
blur
"
:
c
.
blur
(
o
);
break
;
case
"
rotation
"
:
c
.
rotate
(
o
,
!
0
);
break
;
case
"
href
"
:
case
"
title
"
:
case
"
target
"
:
var
t
=
h
.
parentNode
;
if
(
x
.
call
(
t
.
tagName
)
!=
"
a
"
){
var
u
=
bG
(
"
a
"
);
t
.
insertBefore
(
u
,
h
),
u
[
l
](
h
),
t
=
u
}
n
==
"
target
"
&&
o
==
"
blank
"
?
t
.
setAttributeNS
(
c
.
paper
.
xlink
,
"
show
"
,
"
new
"
):
t
.
setAttributeNS
(
c
.
paper
.
xlink
,
n
,
o
);
break
;
case
"
cursor
"
:
h
.
style
.
cursor
=
o
;
break
;
case
"
clip-rect
"
:
var
y
=
r
(
o
)[
s
](
b
);
if
(
y
[
w
]
==
4
){
c
.
clip
&&
c
.
clip
.
parentNode
.
parentNode
.
removeChild
(
c
.
clip
.
parentNode
);
var
z
=
bG
(
"
clipPath
"
),
A
=
bG
(
"
rect
"
);
z
.
id
=
bh
(),
bG
(
A
,{
x
:
y
[
0
],
y
:
y
[
1
],
width
:
y
[
2
],
height
:
y
[
3
]}),
z
[
l
](
A
),
c
.
paper
.
defs
[
l
](
z
),
bG
(
h
,{
"
clip-path
"
:
"
url(#
"
+
z
.
id
+
"
)
"
}),
c
.
clip
=
A
}
if
(
!
o
){
var
B
=
g
.
getElementById
(
h
.
getAttribute
(
"
clip-path
"
)[
Y
](
/
(
^url
\(
#|
\)
$
)
/g
,
p
));
B
&&
B
.
parentNode
.
removeChild
(
B
),
bG
(
h
,{
"
clip-path
"
:
p
}),
delete
c
.
clip
}
break
;
case
"
path
"
:
c
.
type
==
"
path
"
&&
bG
(
h
,{
d
:
o
?
i
.
path
=
bq
(
o
):
"
M0,0
"
});
break
;
case
"
width
"
:
h
[
R
](
n
,
o
);
if
(
i
.
fx
)
n
=
"
x
"
,
o
=
i
.
x
;
else
break
;
case
"
x
"
:
i
.
fx
&&
(
o
=-
i
.
x
-
(
i
.
width
||
0
));
case
"
rx
"
:
if
(
n
==
"
rx
"
&&
c
.
type
==
"
rect
"
)
break
;
case
"
cx
"
:
m
&&
(
n
==
"
x
"
||
n
==
"
cx
"
)
&&
(
m
[
1
]
+=
o
-
i
[
n
]),
h
[
R
](
n
,
o
),
c
.
pattern
&&
bJ
(
c
);
break
;
case
"
height
"
:
h
[
R
](
n
,
o
);
if
(
i
.
fy
)
n
=
"
y
"
,
o
=
i
.
y
;
else
break
;
case
"
y
"
:
i
.
fy
&&
(
o
=-
i
.
y
-
(
i
.
height
||
0
));
case
"
ry
"
:
if
(
n
==
"
ry
"
&&
c
.
type
==
"
rect
"
)
break
;
case
"
cy
"
:
m
&&
(
n
==
"
y
"
||
n
==
"
cy
"
)
&&
(
m
[
2
]
+=
o
-
i
[
n
]),
h
[
R
](
n
,
o
),
c
.
pattern
&&
bJ
(
c
);
break
;
case
"
r
"
:
c
.
type
==
"
rect
"
?
bG
(
h
,{
rx
:
o
,
ry
:
o
}):
h
[
R
](
n
,
o
);
break
;
case
"
src
"
:
c
.
type
==
"
image
"
&&
h
.
setAttributeNS
(
c
.
paper
.
xlink
,
"
href
"
,
o
);
break
;
case
"
stroke-width
"
:
h
.
style
.
strokeWidth
=
o
,
h
[
R
](
n
,
o
),
i
[
"
stroke-dasharray
"
]
&&
k
(
c
,
i
[
"
stroke-dasharray
"
]);
break
;
case
"
stroke-dasharray
"
:
k
(
c
,
o
);
break
;
case
"
translation
"
:
var
C
=
r
(
o
)[
s
](
b
);
C
[
0
]
=+
C
[
0
]
||
0
,
C
[
1
]
=+
C
[
1
]
||
0
,
m
&&
(
m
[
1
]
+=
C
[
0
],
m
[
2
]
+=
C
[
1
]),
cA
.
call
(
c
,
C
[
0
],
C
[
1
]);
break
;
case
"
scale
"
:
C
=
r
(
o
)[
s
](
b
),
c
.
scale
(
+
C
[
0
]
||
1
,
+
C
[
1
]
||+
C
[
0
]
||
1
,
isNaN
(
S
(
C
[
2
]))?
null
:
+
C
[
2
],
isNaN
(
S
(
C
[
3
]))?
null
:
+
C
[
3
]);
break
;
case
I
:
var
D
=
r
(
o
).
match
(
M
);
if
(
D
){
z
=
bG
(
"
pattern
"
);
var
E
=
bG
(
"
image
"
);
z
.
id
=
bh
(),
bG
(
z
,{
x
:
0
,
y
:
0
,
patternUnits
:
"
userSpaceOnUse
"
,
height
:
1
,
width
:
1
}),
bG
(
E
,{
x
:
0
,
y
:
0
}),
E
.
setAttributeNS
(
c
.
paper
.
xlink
,
"
href
"
,
D
[
1
]),
z
[
l
](
E
);
var
F
=
g
.
createElement
(
"
img
"
);
F
.
style
.
cssText
=
"
position:absolute;left:-9999em;top-9999em
"
,
F
.
onload
=
function
(){
bG
(
z
,{
width
:
this
.
offsetWidth
,
height
:
this
.
offsetHeight
}),
bG
(
E
,{
width
:
this
.
offsetWidth
,
height
:
this
.
offsetHeight
}),
g
.
body
.
removeChild
(
this
),
c
.
paper
.
safari
()},
g
.
body
[
l
](
F
),
F
.
src
=
D
[
1
],
c
.
paper
.
defs
[
l
](
z
),
h
.
style
.
fill
=
"
url(#
"
+
z
.
id
+
"
)
"
,
bG
(
h
,{
fill
:
"
url(#
"
+
z
.
id
+
"
)
"
}),
c
.
pattern
=
z
,
c
.
pattern
&&
bJ
(
c
);
break
}
var
G
=
a
.
getRGB
(
o
);
if
(
!
G
.
error
)
delete
d
.
gradient
,
delete
i
.
gradient
,
!
a
.
is
(
i
.
opacity
,
"
undefined
"
)
&&
a
.
is
(
d
.
opacity
,
"
undefined
"
)
&&
bG
(
h
,{
opacity
:
i
.
opacity
}),
!
a
.
is
(
i
[
"
fill-opacity
"
],
"
undefined
"
)
&&
a
.
is
(
d
[
"
fill-opacity
"
],
"
undefined
"
)
&&
bG
(
h
,{
"
fill-opacity
"
:
i
[
"
fill-opacity
"
]});
else
if
((({
circle
:
1
,
ellipse
:
1
})[
f
](
c
.
type
)
||
r
(
o
).
charAt
()
!=
"
r
"
)
&&
bI
(
h
,
o
,
c
.
paper
)){
i
.
gradient
=
o
,
i
.
fill
=
"
none
"
;
break
}
G
[
f
](
"
opacity
"
)
&&
bG
(
h
,{
"
fill-opacity
"
:
G
.
opacity
>
1
?
G
.
opacity
/
100
:
G
.
opacity
});
case
"
stroke
"
:
G
=
a
.
getRGB
(
o
),
h
[
R
](
n
,
G
.
hex
),
n
==
"
stroke
"
&&
G
[
f
](
"
opacity
"
)
&&
bG
(
h
,{
"
stroke-opacity
"
:
G
.
opacity
>
1
?
G
.
opacity
/
100
:
G
.
opacity
});
break
;
case
"
gradient
"
:(({
circle
:
1
,
ellipse
:
1
})[
f
](
c
.
type
)
||
r
(
o
).
charAt
()
!=
"
r
"
)
&&
bI
(
h
,
o
,
c
.
paper
);
break
;
case
"
opacity
"
:
i
.
gradient
&&!
i
[
f
](
"
stroke-opacity
"
)
&&
bG
(
h
,{
"
stroke-opacity
"
:
o
>
1
?
o
/
100
:
o
});
case
"
fill-opacity
"
:
if
(
i
.
gradient
){
var
H
=
g
.
getElementById
(
h
.
getAttribute
(
I
)[
Y
](
/^url
\(
#|
\)
$/g
,
p
));
if
(
H
){
var
J
=
H
.
getElementsByTagName
(
"
stop
"
);
J
[
J
[
w
]
-
1
][
R
](
"
stop-opacity
"
,
o
)}
break
};
default
:
n
==
"
font-size
"
&&
(
o
=
T
(
o
,
10
)
+
"
px
"
);
var
K
=
n
[
Y
](
/
(\-
.
)
/g
,
function
(
a
){
return
V
.
call
(
a
.
substring
(
1
))});
h
.
style
[
K
]
=
o
,
h
[
R
](
n
,
o
)}}
bM
(
c
,
d
),
m
?
c
.
rotate
(
m
.
join
(
q
)):
S
(
j
)
&&
c
.
rotate
(
j
,
!
0
)},
bL
=
1.2
,
bM
=
function
(
b
,
c
){
if
(
b
.
type
==
"
text
"
&&!!
(
c
[
f
](
"
text
"
)
||
c
[
f
](
"
font
"
)
||
c
[
f
](
"
font-size
"
)
||
c
[
f
](
"
x
"
)
||
c
[
f
](
"
y
"
))){
var
d
=
b
.
attrs
,
e
=
b
.
node
,
h
=
e
.
firstChild
?
T
(
g
.
defaultView
.
getComputedStyle
(
e
.
firstChild
,
p
).
getPropertyValue
(
"
font-size
"
),
10
):
10
;
if
(
c
[
f
](
"
text
"
)){
d
.
text
=
c
.
text
;
while
(
e
.
firstChild
)
e
.
removeChild
(
e
.
firstChild
);
var
i
=
r
(
c
.
text
)[
s
](
"
\n
"
);
for
(
var
j
=
0
,
k
=
i
[
w
];
j
<
k
;
j
++
)
if
(
i
[
j
]){
var
m
=
bG
(
"
tspan
"
);
j
&&
bG
(
m
,{
dy
:
h
*
bL
,
x
:
d
.
x
}),
m
[
l
](
g
.
createTextNode
(
i
[
j
])),
e
[
l
](
m
)}}
else
{
i
=
e
.
getElementsByTagName
(
"
tspan
"
);
for
(
j
=
0
,
k
=
i
[
w
];
j
<
k
;
j
++
)
j
&&
bG
(
i
[
j
],{
dy
:
h
*
bL
,
x
:
d
.
x
})}
bG
(
e
,{
y
:
d
.
y
});
var
n
=
b
.
getBBox
(),
o
=
d
.
y
-
(
n
.
y
+
n
.
height
/
2
);
o
&&
a
.
is
(
o
,
"
finite
"
)
&&
bG
(
e
,{
y
:
d
.
y
+
o
})}},
bN
=
function
(
b
,
c
){
var
d
=
0
,
e
=
0
;
this
[
0
]
=
b
,
this
.
id
=
a
.
_oid
++
,
this
.
node
=
b
,
b
.
raphael
=
this
,
this
.
paper
=
c
,
this
.
attrs
=
this
.
attrs
||
{},
this
.
transformations
=
[],
this
.
_
=
{
tx
:
0
,
ty
:
0
,
rt
:{
deg
:
0
,
cx
:
0
,
cy
:
0
},
sx
:
1
,
sy
:
1
},
!
c
.
bottom
&&
(
c
.
bottom
=
this
),
this
.
prev
=
c
.
top
,
c
.
top
&&
(
c
.
top
.
next
=
this
),
c
.
top
=
this
,
this
.
next
=
null
},
bO
=
bN
[
e
];
bN
[
e
].
rotate
=
function
(
c
,
d
,
e
){
if
(
this
.
removed
)
return
this
;
if
(
c
==
null
){
if
(
this
.
_
.
rt
.
cx
)
return
[
this
.
_
.
rt
.
deg
,
this
.
_
.
rt
.
cx
,
this
.
_
.
rt
.
cy
][
v
](
q
);
return
this
.
_
.
rt
.
deg
}
var
f
=
this
.
getBBox
();
c
=
r
(
c
)[
s
](
b
),
c
[
w
]
-
1
&&
(
d
=
S
(
c
[
1
]),
e
=
S
(
c
[
2
])),
c
=
S
(
c
[
0
]),
d
!=
null
&&
d
!==!
1
?
this
.
_
.
rt
.
deg
=
c
:
this
.
_
.
rt
.
deg
+=
c
,
e
==
null
&&
(
d
=
null
),
this
.
_
.
rt
.
cx
=
d
,
this
.
_
.
rt
.
cy
=
e
,
d
=
d
==
null
?
f
.
x
+
f
.
width
/
2
:
d
,
e
=
e
==
null
?
f
.
y
+
f
.
height
/
2
:
e
,
this
.
_
.
rt
.
deg
?(
this
.
transformations
[
0
]
=
a
.
format
(
"
rotate({0} {1} {2})
"
,
this
.
_
.
rt
.
deg
,
d
,
e
),
this
.
clip
&&
bG
(
this
.
clip
,{
transform
:
a
.
format
(
"
rotate({0} {1} {2})
"
,
-
this
.
_
.
rt
.
deg
,
d
,
e
)})):(
this
.
transformations
[
0
]
=
p
,
this
.
clip
&&
bG
(
this
.
clip
,{
transform
:
p
})),
bG
(
this
.
node
,{
transform
:
this
.
transformations
[
v
](
q
)});
return
this
},
bN
[
e
].
hide
=
function
(){
!
this
.
removed
&&
(
this
.
node
.
style
.
display
=
"
none
"
);
return
this
},
bN
[
e
].
show
=
function
(){
!
this
.
removed
&&
(
this
.
node
.
style
.
display
=
""
);
return
this
},
bN
[
e
].
remove
=
function
(){
if
(
!
this
.
removed
){
bA
(
this
,
this
.
paper
),
this
.
node
.
parentNode
.
removeChild
(
this
.
node
);
for
(
var
a
in
this
)
delete
this
[
a
];
this
.
removed
=!
0
}},
bN
[
e
].
getBBox
=
function
(){
if
(
this
.
removed
)
return
this
;
if
(
this
.
type
==
"
path
"
)
return
bn
(
this
.
attrs
.
path
);
if
(
this
.
node
.
style
.
display
==
"
none
"
){
this
.
show
();
var
a
=!
0
}
var
b
=
{};
try
{
b
=
this
.
node
.
getBBox
()}
catch
(
c
){}
finally
{
b
=
b
||
{}}
if
(
this
.
type
==
"
text
"
){
b
=
{
x
:
b
.
x
,
y
:
Infinity
,
width
:
0
,
height
:
0
};
for
(
var
d
=
0
,
e
=
this
.
node
.
getNumberOfChars
();
d
<
e
;
d
++
){
var
f
=
this
.
node
.
getExtentOfChar
(
d
);
f
.
y
<
b
.
y
&&
(
b
.
y
=
f
.
y
),
f
.
y
+
f
.
height
-
b
.
y
>
b
.
height
&&
(
b
.
height
=
f
.
y
+
f
.
height
-
b
.
y
),
f
.
x
+
f
.
width
-
b
.
x
>
b
.
width
&&
(
b
.
width
=
f
.
x
+
f
.
width
-
b
.
x
)}}
a
&&
this
.
hide
();
return
b
},
bN
[
e
].
attr
=
function
(
b
,
c
){
if
(
this
.
removed
)
return
this
;
if
(
b
==
null
){
var
d
=
{};
for
(
var
e
in
this
.
attrs
)
this
.
attrs
[
f
](
e
)
&&
(
d
[
e
]
=
this
.
attrs
[
e
]);
this
.
_
.
rt
.
deg
&&
(
d
.
rotation
=
this
.
rotate
()),(
this
.
_
.
sx
!=
1
||
this
.
_
.
sy
!=
1
)
&&
(
d
.
scale
=
this
.
scale
()),
d
.
gradient
&&
d
.
fill
==
"
none
"
&&
(
d
.
fill
=
d
.
gradient
)
&&
delete
d
.
gradient
;
return
d
}
if
(
c
==
null
&&
a
.
is
(
b
,
F
)){
if
(
b
==
"
translation
"
)
return
cA
.
call
(
this
);
if
(
b
==
"
rotation
"
)
return
this
.
rotate
();
if
(
b
==
"
scale
"
)
return
this
.
scale
();
if
(
b
==
I
&&
this
.
attrs
.
fill
==
"
none
"
&&
this
.
attrs
.
gradient
)
return
this
.
attrs
.
gradient
;
return
this
.
attrs
[
b
]}
if
(
c
==
null
&&
a
.
is
(
b
,
G
)){
var
g
=
{};
for
(
var
h
=
0
,
i
=
b
.
length
;
h
<
i
;
h
++
)
g
[
b
[
h
]]
=
this
.
attr
(
b
[
h
]);
return
g
}
if
(
c
!=
null
){
var
j
=
{};
j
[
b
]
=
c
}
else
b
!=
null
&&
a
.
is
(
b
,
"
object
"
)
&&
(
j
=
b
);
for
(
var
k
in
this
.
paper
.
customAttributes
)
if
(
this
.
paper
.
customAttributes
[
f
](
k
)
&&
j
[
f
](
k
)
&&
a
.
is
(
this
.
paper
.
customAttributes
[
k
],
"
function
"
)){
var
l
=
this
.
paper
.
customAttributes
[
k
].
apply
(
this
,[][
n
](
j
[
k
]));
this
.
attrs
[
k
]
=
j
[
k
];
for
(
var
m
in
l
)
l
[
f
](
m
)
&&
(
j
[
m
]
=
l
[
m
])}
bK
(
this
,
j
);
return
this
},
bN
[
e
].
toFront
=
function
(){
if
(
this
.
removed
)
return
this
;
this
.
node
.
parentNode
[
l
](
this
.
node
);
var
a
=
this
.
paper
;
a
.
top
!=
this
&&
bB
(
this
,
a
);
return
this
},
bN
[
e
].
toBack
=
function
(){
if
(
this
.
removed
)
return
this
;
if
(
this
.
node
.
parentNode
.
firstChild
!=
this
.
node
){
this
.
node
.
parentNode
.
insertBefore
(
this
.
node
,
this
.
node
.
parentNode
.
firstChild
),
bC
(
this
,
this
.
paper
);
var
a
=
this
.
paper
}
return
this
},
bN
[
e
].
insertAfter
=
function
(
a
){
if
(
this
.
removed
)
return
this
;
var
b
=
a
.
node
||
a
[
a
.
length
-
1
].
node
;
b
.
nextSibling
?
b
.
parentNode
.
insertBefore
(
this
.
node
,
b
.
nextSibling
):
b
.
parentNode
[
l
](
this
.
node
),
bD
(
this
,
a
,
this
.
paper
);
return
this
},
bN
[
e
].
insertBefore
=
function
(
a
){
if
(
this
.
removed
)
return
this
;
var
b
=
a
.
node
||
a
[
0
].
node
;
b
.
parentNode
.
insertBefore
(
this
.
node
,
b
),
bE
(
this
,
a
,
this
.
paper
);
return
this
},
bN
[
e
].
blur
=
function
(
a
){
var
b
=
this
;
if
(
+
a
!==
0
){
var
c
=
bG
(
"
filter
"
),
d
=
bG
(
"
feGaussianBlur
"
);
b
.
attrs
.
blur
=
a
,
c
.
id
=
bh
(),
bG
(
d
,{
stdDeviation
:
+
a
||
1.5
}),
c
.
appendChild
(
d
),
b
.
paper
.
defs
.
appendChild
(
c
),
b
.
_blur
=
c
,
bG
(
b
.
node
,{
filter
:
"
url(#
"
+
c
.
id
+
"
)
"
})}
else
b
.
_blur
&&
(
b
.
_blur
.
parentNode
.
removeChild
(
b
.
_blur
),
delete
b
.
_blur
,
delete
b
.
attrs
.
blur
),
b
.
node
.
removeAttribute
(
"
filter
"
)};
var
bP
=
function
(
a
,
b
,
c
,
d
){
var
e
=
bG
(
"
circle
"
);
a
.
canvas
&&
a
.
canvas
[
l
](
e
);
var
f
=
new
bN
(
e
,
a
);
f
.
attrs
=
{
cx
:
b
,
cy
:
c
,
r
:
d
,
fill
:
"
none
"
,
stroke
:
"
#000
"
},
f
.
type
=
"
circle
"
,
bG
(
e
,
f
.
attrs
);
return
f
},
bQ
=
function
(
a
,
b
,
c
,
d
,
e
,
f
){
var
g
=
bG
(
"
rect
"
);
a
.
canvas
&&
a
.
canvas
[
l
](
g
);
var
h
=
new
bN
(
g
,
a
);
h
.
attrs
=
{
x
:
b
,
y
:
c
,
width
:
d
,
height
:
e
,
r
:
f
||
0
,
rx
:
f
||
0
,
ry
:
f
||
0
,
fill
:
"
none
"
,
stroke
:
"
#000
"
},
h
.
type
=
"
rect
"
,
bG
(
g
,
h
.
attrs
);
return
h
},
bR
=
function
(
a
,
b
,
c
,
d
,
e
){
var
f
=
bG
(
"
ellipse
"
);
a
.
canvas
&&
a
.
canvas
[
l
](
f
);
var
g
=
new
bN
(
f
,
a
);
g
.
attrs
=
{
cx
:
b
,
cy
:
c
,
rx
:
d
,
ry
:
e
,
fill
:
"
none
"
,
stroke
:
"
#000
"
},
g
.
type
=
"
ellipse
"
,
bG
(
f
,
g
.
attrs
);
return
g
},
bS
=
function
(
a
,
b
,
c
,
d
,
e
,
f
){
var
g
=
bG
(
"
image
"
);
bG
(
g
,{
x
:
c
,
y
:
d
,
width
:
e
,
height
:
f
,
preserveAspectRatio
:
"
none
"
}),
g
.
setAttributeNS
(
a
.
xlink
,
"
href
"
,
b
),
a
.
canvas
&&
a
.
canvas
[
l
](
g
);
var
h
=
new
bN
(
g
,
a
);
h
.
attrs
=
{
x
:
c
,
y
:
d
,
width
:
e
,
height
:
f
,
src
:
b
},
h
.
type
=
"
image
"
;
return
h
},
bT
=
function
(
a
,
b
,
c
,
d
){
var
e
=
bG
(
"
text
"
);
bG
(
e
,{
x
:
b
,
y
:
c
,
"
text-anchor
"
:
"
middle
"
}),
a
.
canvas
&&
a
.
canvas
[
l
](
e
);
var
f
=
new
bN
(
e
,
a
);
f
.
attrs
=
{
x
:
b
,
y
:
c
,
"
text-anchor
"
:
"
middle
"
,
text
:
d
,
font
:
W
.
font
,
stroke
:
"
none
"
,
fill
:
"
#000
"
},
f
.
type
=
"
text
"
,
bK
(
f
,
f
.
attrs
);
return
f
},
bU
=
function
(
a
,
b
){
this
.
width
=
a
||
this
.
width
,
this
.
height
=
b
||
this
.
height
,
this
.
canvas
[
R
](
"
width
"
,
this
.
width
),
this
.
canvas
[
R
](
"
height
"
,
this
.
height
);
return
this
},
bV
=
function
(){
var
b
=
by
[
m
](
0
,
arguments
),
c
=
b
&&
b
.
container
,
d
=
b
.
x
,
e
=
b
.
y
,
f
=
b
.
width
,
h
=
b
.
height
;
if
(
!
c
)
throw
new
Error
(
"
SVG container not found.
"
);
var
i
=
bG
(
"
svg
"
);
d
=
d
||
0
,
e
=
e
||
0
,
f
=
f
||
512
,
h
=
h
||
342
,
bG
(
i
,{
xmlns
:
"
http://www.w3.org/2000/svg
"
,
version
:
1.1
,
width
:
f
,
height
:
h
}),
c
==
1
?(
i
.
style
.
cssText
=
"
position:absolute;left:
"
+
d
+
"
px;top:
"
+
e
+
"
px
"
,
g
.
body
[
l
](
i
)):
c
.
firstChild
?
c
.
insertBefore
(
i
,
c
.
firstChild
):
c
[
l
](
i
),
c
=
new
j
,
c
.
width
=
f
,
c
.
height
=
h
,
c
.
canvas
=
i
,
bz
.
call
(
c
,
c
,
a
.
fn
),
c
.
clear
();
return
c
};
k
.
clear
=
function
(){
var
a
=
this
.
canvas
;
while
(
a
.
firstChild
)
a
.
removeChild
(
a
.
firstChild
);
this
.
bottom
=
this
.
top
=
null
,(
this
.
desc
=
bG
(
"
desc
"
))[
l
](
g
.
createTextNode
(
"
Created with Raphaël
"
)),
a
[
l
](
this
.
desc
),
a
[
l
](
this
.
defs
=
bG
(
"
defs
"
))},
k
.
remove
=
function
(){
this
.
canvas
.
parentNode
&&
this
.
canvas
.
parentNode
.
removeChild
(
this
.
canvas
);
for
(
var
a
in
this
)
this
[
a
]
=
bF
(
a
)}}
if
(
a
.
vml
){
var
bW
=
{
M
:
"
m
"
,
L
:
"
l
"
,
C
:
"
c
"
,
Z
:
"
x
"
,
m
:
"
t
"
,
l
:
"
r
"
,
c
:
"
v
"
,
z
:
"
x
"
},
bX
=
/
([
clmz
])
,
?([^
clmz
]
*
)
/gi
,
bY
=
/ progid:
\S
+Blur
\([^\)]
+
\)
/g
,
bZ
=
/-
?[^
,
\s
-
]
+/g
,
b$
=
1
e3
+
q
+
1
e3
,
b_
=
10
,
ca
=
{
path
:
1
,
rect
:
1
},
cb
=
function
(
a
){
var
b
=
/
[
ahqstv
]
/ig
,
c
=
bq
;
r
(
a
).
match
(
b
)
&&
(
c
=
bw
),
b
=
/
[
clmz
]
/g
;
if
(
c
==
bq
&&!
r
(
a
).
match
(
b
)){
var
d
=
r
(
a
)[
Y
](
bX
,
function
(
a
,
b
,
c
){
var
d
=
[],
e
=
x
.
call
(
b
)
==
"
m
"
,
f
=
bW
[
b
];
c
[
Y
](
bZ
,
function
(
a
){
e
&&
d
[
w
]
==
2
&&
(
f
+=
d
+
bW
[
b
==
"
m
"
?
"
l
"
:
"
L
"
],
d
=
[]),
d
[
L
](
Q
(
a
*
b_
))});
return
f
+
d
});
return
d
}
var
e
=
c
(
a
),
f
,
g
;
d
=
[];
for
(
var
h
=
0
,
i
=
e
[
w
];
h
<
i
;
h
++
){
f
=
e
[
h
],
g
=
x
.
call
(
e
[
h
][
0
]),
g
==
"
z
"
&&
(
g
=
"
x
"
);
for
(
var
j
=
1
,
k
=
f
[
w
];
j
<
k
;
j
++
)
g
+=
Q
(
f
[
j
]
*
b_
)
+
(
j
!=
k
-
1
?
"
,
"
:
p
);
d
[
L
](
g
)}
return
d
[
v
](
q
)};
a
[
H
]
=
function
(){
return
"
Your browser doesn’t support SVG. Falling down to VML.
\n
You are running Raphaël
"
+
this
.
version
},
bH
=
function
(
a
,
b
){
var
c
=
cd
(
"
group
"
);
c
.
style
.
cssText
=
"
position:absolute;left:0;top:0;width:
"
+
b
.
width
+
"
px;height:
"
+
b
.
height
+
"
px
"
,
c
.
coordsize
=
b
.
coordsize
,
c
.
coordorigin
=
b
.
coordorigin
;
var
d
=
cd
(
"
shape
"
),
e
=
d
.
style
;
e
.
width
=
b
.
width
+
"
px
"
,
e
.
height
=
b
.
height
+
"
px
"
,
d
.
coordsize
=
b$
,
d
.
coordorigin
=
b
.
coordorigin
,
c
[
l
](
d
);
var
f
=
new
bN
(
d
,
c
,
b
),
g
=
{
fill
:
"
none
"
,
stroke
:
"
#000
"
};
a
&&
(
g
.
path
=
a
),
f
.
type
=
"
path
"
,
f
.
path
=
[],
f
.
Path
=
p
,
bK
(
f
,
g
),
b
.
canvas
[
l
](
c
);
var
h
=
cd
(
"
skew
"
);
h
.
on
=!
0
,
d
.
appendChild
(
h
),
f
.
skew
=
h
;
return
f
},
bK
=
function
(
c
,
d
){
c
.
attrs
=
c
.
attrs
||
{};
var
e
=
c
.
node
,
h
=
c
.
attrs
,
i
=
e
.
style
,
j
,
k
=
(
d
.
x
!=
h
.
x
||
d
.
y
!=
h
.
y
||
d
.
width
!=
h
.
width
||
d
.
height
!=
h
.
height
||
d
.
r
!=
h
.
r
)
&&
c
.
type
==
"
rect
"
,
m
=
c
;
for
(
var
n
in
d
)
d
[
f
](
n
)
&&
(
h
[
n
]
=
d
[
n
]);
k
&&
(
h
.
path
=
cc
(
h
.
x
,
h
.
y
,
h
.
width
,
h
.
height
,
h
.
r
),
c
.
X
=
h
.
x
,
c
.
Y
=
h
.
y
,
c
.
W
=
h
.
width
,
c
.
H
=
h
.
height
),
d
.
href
&&
(
e
.
href
=
d
.
href
),
d
.
title
&&
(
e
.
title
=
d
.
title
),
d
.
target
&&
(
e
.
target
=
d
.
target
),
d
.
cursor
&&
(
i
.
cursor
=
d
.
cursor
),
"
blur
"
in
d
&&
c
.
blur
(
d
.
blur
);
if
(
d
.
path
&&
c
.
type
==
"
path
"
||
k
)
e
.
path
=
cb
(
h
.
path
);
d
.
rotation
!=
null
&&
c
.
rotate
(
d
.
rotation
,
!
0
),
d
.
translation
&&
(
j
=
r
(
d
.
translation
)[
s
](
b
),
cA
.
call
(
c
,
j
[
0
],
j
[
1
]),
c
.
_
.
rt
.
cx
!=
null
&&
(
c
.
_
.
rt
.
cx
+=+
j
[
0
],
c
.
_
.
rt
.
cy
+=+
j
[
1
],
c
.
setBox
(
c
.
attrs
,
j
[
0
],
j
[
1
]))),
d
.
scale
&&
(
j
=
r
(
d
.
scale
)[
s
](
b
),
c
.
scale
(
+
j
[
0
]
||
1
,
+
j
[
1
]
||+
j
[
0
]
||
1
,
+
j
[
2
]
||
null
,
+
j
[
3
]
||
null
));
if
(
"
clip-rect
"
in
d
){
var
o
=
r
(
d
[
"
clip-rect
"
])[
s
](
b
);
if
(
o
[
w
]
==
4
){
o
[
2
]
=+
o
[
2
]
+
+
o
[
0
],
o
[
3
]
=+
o
[
3
]
+
+
o
[
1
];
var
q
=
e
.
clipRect
||
g
.
createElement
(
"
div
"
),
t
=
q
.
style
,
u
=
e
.
parentNode
;
t
.
clip
=
a
.
format
(
"
rect({1}px {2}px {3}px {0}px)
"
,
o
),
e
.
clipRect
||
(
t
.
position
=
"
absolute
"
,
t
.
top
=
0
,
t
.
left
=
0
,
t
.
width
=
c
.
paper
.
width
+
"
px
"
,
t
.
height
=
c
.
paper
.
height
+
"
px
"
,
u
.
parentNode
.
insertBefore
(
q
,
u
),
q
[
l
](
u
),
e
.
clipRect
=
q
)}
d
[
"
clip-rect
"
]
||
e
.
clipRect
&&
(
e
.
clipRect
.
style
.
clip
=
p
)}
c
.
type
==
"
image
"
&&
d
.
src
&&
(
e
.
src
=
d
.
src
),
c
.
type
==
"
image
"
&&
d
.
opacity
&&
(
e
.
filterOpacity
=
U
+
"
.Alpha(opacity=
"
+
d
.
opacity
*
100
+
"
)
"
,
i
.
filter
=
(
e
.
filterMatrix
||
p
)
+
(
e
.
filterOpacity
||
p
)),
d
.
font
&&
(
i
.
font
=
d
.
font
),
d
[
"
font-family
"
]
&&
(
i
.
fontFamily
=
'
"
'
+
d
[
"
font-family
"
][
s
](
"
,
"
)[
0
][
Y
](
/^
[
'"
]
+|
[
'"
]
+$/g
,
p
)
+
'
"
'
),
d
[
"
font-size
"
]
&&
(
i
.
fontSize
=
d
[
"
font-size
"
]),
d
[
"
font-weight
"
]
&&
(
i
.
fontWeight
=
d
[
"
font-weight
"
]),
d
[
"
font-style
"
]
&&
(
i
.
fontStyle
=
d
[
"
font-style
"
]);
if
(
d
.
opacity
!=
null
||
d
[
"
stroke-width
"
]
!=
null
||
d
.
fill
!=
null
||
d
.
stroke
!=
null
||
d
[
"
stroke-width
"
]
!=
null
||
d
[
"
stroke-opacity
"
]
!=
null
||
d
[
"
fill-opacity
"
]
!=
null
||
d
[
"
stroke-dasharray
"
]
!=
null
||
d
[
"
stroke-miterlimit
"
]
!=
null
||
d
[
"
stroke-linejoin
"
]
!=
null
||
d
[
"
stroke-linecap
"
]
!=
null
){
e
=
c
.
shape
||
e
;
var
v
=
e
.
getElementsByTagName
(
I
)
&&
e
.
getElementsByTagName
(
I
)[
0
],
x
=!
1
;
!
v
&&
(
x
=
v
=
cd
(
I
));
if
(
"
fill-opacity
"
in
d
||
"
opacity
"
in
d
){
var
y
=
((
+
h
[
"
fill-opacity
"
]
+
1
||
2
)
-
1
)
*
((
+
h
.
opacity
+
1
||
2
)
-
1
)
*
((
+
a
.
getRGB
(
d
.
fill
).
o
+
1
||
2
)
-
1
);
y
=
A
(
z
(
y
,
0
),
1
),
v
.
opacity
=
y
}
d
.
fill
&&
(
v
.
on
=!
0
);
if
(
v
.
on
==
null
||
d
.
fill
==
"
none
"
)
v
.
on
=!
1
;
if
(
v
.
on
&&
d
.
fill
){
var
B
=
d
.
fill
.
match
(
M
);
B
?(
v
.
src
=
B
[
1
],
v
.
type
=
"
tile
"
):(
v
.
color
=
a
.
getRGB
(
d
.
fill
).
hex
,
v
.
src
=
p
,
v
.
type
=
"
solid
"
,
a
.
getRGB
(
d
.
fill
).
error
&&
(
m
.
type
in
{
circle
:
1
,
ellipse
:
1
}
||
r
(
d
.
fill
).
charAt
()
!=
"
r
"
)
&&
bI
(
m
,
d
.
fill
)
&&
(
h
.
fill
=
"
none
"
,
h
.
gradient
=
d
.
fill
))}
x
&&
e
[
l
](
v
);
var
C
=
e
.
getElementsByTagName
(
"
stroke
"
)
&&
e
.
getElementsByTagName
(
"
stroke
"
)[
0
],
D
=!
1
;
!
C
&&
(
D
=
C
=
cd
(
"
stroke
"
));
if
(
d
.
stroke
&&
d
.
stroke
!=
"
none
"
||
d
[
"
stroke-width
"
]
||
d
[
"
stroke-opacity
"
]
!=
null
||
d
[
"
stroke-dasharray
"
]
||
d
[
"
stroke-miterlimit
"
]
||
d
[
"
stroke-linejoin
"
]
||
d
[
"
stroke-linecap
"
])
C
.
on
=!
0
;(
d
.
stroke
==
"
none
"
||
C
.
on
==
null
||
d
.
stroke
==
0
||
d
[
"
stroke-width
"
]
==
0
)
&&
(
C
.
on
=!
1
);
var
E
=
a
.
getRGB
(
d
.
stroke
);
C
.
on
&&
d
.
stroke
&&
(
C
.
color
=
E
.
hex
),
y
=
((
+
h
[
"
stroke-opacity
"
]
+
1
||
2
)
-
1
)
*
((
+
h
.
opacity
+
1
||
2
)
-
1
)
*
((
+
E
.
o
+
1
||
2
)
-
1
);
var
F
=
(
S
(
d
[
"
stroke-width
"
])
||
1
)
*
.
75
;
y
=
A
(
z
(
y
,
0
),
1
),
d
[
"
stroke-width
"
]
==
null
&&
(
F
=
h
[
"
stroke-width
"
]),
d
[
"
stroke-width
"
]
&&
(
C
.
weight
=
F
),
F
&&
F
<
1
&&
(
y
*=
F
)
&&
(
C
.
weight
=
1
),
C
.
opacity
=
y
,
d
[
"
stroke-linejoin
"
]
&&
(
C
.
joinstyle
=
d
[
"
stroke-linejoin
"
]
||
"
miter
"
),
C
.
miterlimit
=
d
[
"
stroke-miterlimit
"
]
||
8
,
d
[
"
stroke-linecap
"
]
&&
(
C
.
endcap
=
d
[
"
stroke-linecap
"
]
==
"
butt
"
?
"
flat
"
:
d
[
"
stroke-linecap
"
]
==
"
square
"
?
"
square
"
:
"
round
"
);
if
(
d
[
"
stroke-dasharray
"
]){
var
G
=
{
"
-
"
:
"
shortdash
"
,
"
.
"
:
"
shortdot
"
,
"
-.
"
:
"
shortdashdot
"
,
"
-..
"
:
"
shortdashdotdot
"
,
"
.
"
:
"
dot
"
,
"
-
"
:
"
dash
"
,
"
--
"
:
"
longdash
"
,
"
- .
"
:
"
dashdot
"
,
"
--.
"
:
"
longdashdot
"
,
"
--..
"
:
"
longdashdotdot
"
};
C
.
dashstyle
=
G
[
f
](
d
[
"
stroke-dasharray
"
])?
G
[
d
[
"
stroke-dasharray
"
]]:
p
}
D
&&
e
[
l
](
C
)}
if
(
m
.
type
==
"
text
"
){
i
=
m
.
paper
.
span
.
style
,
h
.
font
&&
(
i
.
font
=
h
.
font
),
h
[
"
font-family
"
]
&&
(
i
.
fontFamily
=
h
[
"
font-family
"
]),
h
[
"
font-size
"
]
&&
(
i
.
fontSize
=
h
[
"
font-size
"
]),
h
[
"
font-weight
"
]
&&
(
i
.
fontWeight
=
h
[
"
font-weight
"
]),
h
[
"
font-style
"
]
&&
(
i
.
fontStyle
=
h
[
"
font-style
"
]),
m
.
node
.
string
&&
(
m
.
paper
.
span
.
innerHTML
=
r
(
m
.
node
.
string
)[
Y
](
/</g
,
"
<
"
)[
Y
](
/&/g
,
"
&
"
)[
Y
](
/
\n
/g
,
"
<br>
"
)),
m
.
W
=
h
.
w
=
m
.
paper
.
span
.
offsetWidth
,
m
.
H
=
h
.
h
=
m
.
paper
.
span
.
offsetHeight
,
m
.
X
=
h
.
x
,
m
.
Y
=
h
.
y
+
Q
(
m
.
H
/
2
);
switch
(
h
[
"
text-anchor
"
]){
case
"
start
"
:
m
.
node
.
style
[
"
v-text-align
"
]
=
"
left
"
,
m
.
bbx
=
Q
(
m
.
W
/
2
);
break
;
case
"
end
"
:
m
.
node
.
style
[
"
v-text-align
"
]
=
"
right
"
,
m
.
bbx
=-
Q
(
m
.
W
/
2
);
break
;
default
:
m
.
node
.
style
[
"
v-text-align
"
]
=
"
center
"
}}},
bI
=
function
(
a
,
b
){
a
.
attrs
=
a
.
attrs
||
{};
var
c
=
a
.
attrs
,
d
,
e
=
"
linear
"
,
f
=
"
.5 .5
"
;
a
.
attrs
.
gradient
=
b
,
b
=
r
(
b
)[
Y
](
bd
,
function
(
a
,
b
,
c
){
e
=
"
radial
"
,
b
&&
c
&&
(
b
=
S
(
b
),
c
=
S
(
c
),
C
(
b
-
.
5
,
2
)
+
C
(
c
-
.
5
,
2
)
>
.
25
&&
(
c
=
y
.
sqrt
(.
25
-
C
(
b
-
.
5
,
2
))
*
((
c
>
.
5
)
*
2
-
1
)
+
.
5
),
f
=
b
+
q
+
c
);
return
p
}),
b
=
b
[
s
](
/
\s
*
\-\s
*/
);
if
(
e
==
"
linear
"
){
var
g
=
b
.
shift
();
g
=-
S
(
g
);
if
(
isNaN
(
g
))
return
null
}
var
h
=
bx
(
b
);
if
(
!
h
)
return
null
;
a
=
a
.
shape
||
a
.
node
,
d
=
a
.
getElementsByTagName
(
I
)[
0
]
||
cd
(
I
),
!
d
.
parentNode
&&
a
.
appendChild
(
d
);
if
(
h
[
w
]){
d
.
on
=!
0
,
d
.
method
=
"
none
"
,
d
.
color
=
h
[
0
].
color
,
d
.
color2
=
h
[
h
[
w
]
-
1
].
color
;
var
i
=
[];
for
(
var
j
=
0
,
k
=
h
[
w
];
j
<
k
;
j
++
)
h
[
j
].
offset
&&
i
[
L
](
h
[
j
].
offset
+
q
+
h
[
j
].
color
);
d
.
colors
&&
(
d
.
colors
.
value
=
i
[
w
]?
i
[
v
]():
"
0%
"
+
d
.
color
),
e
==
"
radial
"
?(
d
.
type
=
"
gradientradial
"
,
d
.
focus
=
"
100%
"
,
d
.
focussize
=
f
,
d
.
focusposition
=
f
):(
d
.
type
=
"
gradient
"
,
d
.
angle
=
(
270
-
g
)
%
360
)}
return
1
},
bN
=
function
(
b
,
c
,
d
){
var
e
=
0
,
f
=
0
,
g
=
0
,
h
=
1
;
this
[
0
]
=
b
,
this
.
id
=
a
.
_oid
++
,
this
.
node
=
b
,
b
.
raphael
=
this
,
this
.
X
=
0
,
this
.
Y
=
0
,
this
.
attrs
=
{},
this
.
Group
=
c
,
this
.
paper
=
d
,
this
.
_
=
{
tx
:
0
,
ty
:
0
,
rt
:{
deg
:
0
},
sx
:
1
,
sy
:
1
},
!
d
.
bottom
&&
(
d
.
bottom
=
this
),
this
.
prev
=
d
.
top
,
d
.
top
&&
(
d
.
top
.
next
=
this
),
d
.
top
=
this
,
this
.
next
=
null
},
bO
=
bN
[
e
],
bO
.
rotate
=
function
(
a
,
c
,
d
){
if
(
this
.
removed
)
return
this
;
if
(
a
==
null
){
if
(
this
.
_
.
rt
.
cx
)
return
[
this
.
_
.
rt
.
deg
,
this
.
_
.
rt
.
cx
,
this
.
_
.
rt
.
cy
][
v
](
q
);
return
this
.
_
.
rt
.
deg
}
a
=
r
(
a
)[
s
](
b
),
a
[
w
]
-
1
&&
(
c
=
S
(
a
[
1
]),
d
=
S
(
a
[
2
])),
a
=
S
(
a
[
0
]),
c
!=
null
?
this
.
_
.
rt
.
deg
=
a
:
this
.
_
.
rt
.
deg
+=
a
,
d
==
null
&&
(
c
=
null
),
this
.
_
.
rt
.
cx
=
c
,
this
.
_
.
rt
.
cy
=
d
,
this
.
setBox
(
this
.
attrs
,
c
,
d
),
this
.
Group
.
style
.
rotation
=
this
.
_
.
rt
.
deg
;
return
this
},
bO
.
setBox
=
function
(
a
,
b
,
c
){
if
(
this
.
removed
)
return
this
;
var
d
=
this
.
Group
.
style
,
e
=
this
.
shape
&&
this
.
shape
.
style
||
this
.
node
.
style
;
a
=
a
||
{};
for
(
var
g
in
a
)
a
[
f
](
g
)
&&
(
this
.
attrs
[
g
]
=
a
[
g
]);
b
=
b
||
this
.
_
.
rt
.
cx
,
c
=
c
||
this
.
_
.
rt
.
cy
;
var
h
=
this
.
attrs
,
i
,
j
,
k
,
l
;
switch
(
this
.
type
){
case
"
circle
"
:
i
=
h
.
cx
-
h
.
r
,
j
=
h
.
cy
-
h
.
r
,
k
=
l
=
h
.
r
*
2
;
break
;
case
"
ellipse
"
:
i
=
h
.
cx
-
h
.
rx
,
j
=
h
.
cy
-
h
.
ry
,
k
=
h
.
rx
*
2
,
l
=
h
.
ry
*
2
;
break
;
case
"
image
"
:
i
=+
h
.
x
,
j
=+
h
.
y
,
k
=
h
.
width
||
0
,
l
=
h
.
height
||
0
;
break
;
case
"
text
"
:
this
.
textpath
.
v
=
[
"
m
"
,
Q
(
h
.
x
),
"
,
"
,
Q
(
h
.
y
-
2
),
"
l
"
,
Q
(
h
.
x
)
+
1
,
"
,
"
,
Q
(
h
.
y
-
2
)][
v
](
p
),
i
=
h
.
x
-
Q
(
this
.
W
/
2
),
j
=
h
.
y
-
this
.
H
/
2
,
k
=
this
.
W
,
l
=
this
.
H
;
break
;
case
"
rect
"
:
case
"
path
"
:
if
(
!
this
.
attrs
.
path
)
i
=
0
,
j
=
0
,
k
=
this
.
paper
.
width
,
l
=
this
.
paper
.
height
;
else
{
var
m
=
bn
(
this
.
attrs
.
path
);
i
=
m
.
x
,
j
=
m
.
y
,
k
=
m
.
width
,
l
=
m
.
height
}
break
;
default
:
i
=
0
,
j
=
0
,
k
=
this
.
paper
.
width
,
l
=
this
.
paper
.
height
}
b
=
b
==
null
?
i
+
k
/
2
:
b
,
c
=
c
==
null
?
j
+
l
/
2
:
c
;
var
n
=
b
-
this
.
paper
.
width
/
2
,
o
=
c
-
this
.
paper
.
height
/
2
,
q
;
d
.
left
!=
(
q
=
n
+
"
px
"
)
&&
(
d
.
left
=
q
),
d
.
top
!=
(
q
=
o
+
"
px
"
)
&&
(
d
.
top
=
q
),
this
.
X
=
ca
[
f
](
this
.
type
)?
-
n
:
i
,
this
.
Y
=
ca
[
f
](
this
.
type
)?
-
o
:
j
,
this
.
W
=
k
,
this
.
H
=
l
,
ca
[
f
](
this
.
type
)?(
e
.
left
!=
(
q
=-
n
*
b_
+
"
px
"
)
&&
(
e
.
left
=
q
),
e
.
top
!=
(
q
=-
o
*
b_
+
"
px
"
)
&&
(
e
.
top
=
q
)):
this
.
type
==
"
text
"
?(
e
.
left
!=
(
q
=-
n
+
"
px
"
)
&&
(
e
.
left
=
q
),
e
.
top
!=
(
q
=-
o
+
"
px
"
)
&&
(
e
.
top
=
q
)):(
d
.
width
!=
(
q
=
this
.
paper
.
width
+
"
px
"
)
&&
(
d
.
width
=
q
),
d
.
height
!=
(
q
=
this
.
paper
.
height
+
"
px
"
)
&&
(
d
.
height
=
q
),
e
.
left
!=
(
q
=
i
-
n
+
"
px
"
)
&&
(
e
.
left
=
q
),
e
.
top
!=
(
q
=
j
-
o
+
"
px
"
)
&&
(
e
.
top
=
q
),
e
.
width
!=
(
q
=
k
+
"
px
"
)
&&
(
e
.
width
=
q
),
e
.
height
!=
(
q
=
l
+
"
px
"
)
&&
(
e
.
height
=
q
))},
bO
.
hide
=
function
(){
!
this
.
removed
&&
(
this
.
Group
.
style
.
display
=
"
none
"
);
return
this
},
bO
.
show
=
function
(){
!
this
.
removed
&&
(
this
.
Group
.
style
.
display
=
"
block
"
);
return
this
},
bO
.
getBBox
=
function
(){
if
(
this
.
removed
)
return
this
;
if
(
ca
[
f
](
this
.
type
))
return
bn
(
this
.
attrs
.
path
);
return
{
x
:
this
.
X
+
(
this
.
bbx
||
0
),
y
:
this
.
Y
,
width
:
this
.
W
,
height
:
this
.
H
}},
bO
.
remove
=
function
(){
if
(
!
this
.
removed
){
bA
(
this
,
this
.
paper
),
this
.
node
.
parentNode
.
removeChild
(
this
.
node
),
this
.
Group
.
parentNode
.
removeChild
(
this
.
Group
),
this
.
shape
&&
this
.
shape
.
parentNode
.
removeChild
(
this
.
shape
);
for
(
var
a
in
this
)
delete
this
[
a
];
this
.
removed
=!
0
}},
bO
.
attr
=
function
(
b
,
c
){
if
(
this
.
removed
)
return
this
;
if
(
b
==
null
){
var
d
=
{};
for
(
var
e
in
this
.
attrs
)
this
.
attrs
[
f
](
e
)
&&
(
d
[
e
]
=
this
.
attrs
[
e
]);
this
.
_
.
rt
.
deg
&&
(
d
.
rotation
=
this
.
rotate
()),(
this
.
_
.
sx
!=
1
||
this
.
_
.
sy
!=
1
)
&&
(
d
.
scale
=
this
.
scale
()),
d
.
gradient
&&
d
.
fill
==
"
none
"
&&
(
d
.
fill
=
d
.
gradient
)
&&
delete
d
.
gradient
;
return
d
}
if
(
c
==
null
&&
a
.
is
(
b
,
"
string
"
)){
if
(
b
==
"
translation
"
)
return
cA
.
call
(
this
);
if
(
b
==
"
rotation
"
)
return
this
.
rotate
();
if
(
b
==
"
scale
"
)
return
this
.
scale
();
if
(
b
==
I
&&
this
.
attrs
.
fill
==
"
none
"
&&
this
.
attrs
.
gradient
)
return
this
.
attrs
.
gradient
;
return
this
.
attrs
[
b
]}
if
(
this
.
attrs
&&
c
==
null
&&
a
.
is
(
b
,
G
)){
var
g
,
h
=
{};
for
(
e
=
0
,
g
=
b
[
w
];
e
<
g
;
e
++
)
h
[
b
[
e
]]
=
this
.
attr
(
b
[
e
]);
return
h
}
var
i
;
c
!=
null
&&
(
i
=
{},
i
[
b
]
=
c
),
c
==
null
&&
a
.
is
(
b
,
"
object
"
)
&&
(
i
=
b
);
if
(
i
){
for
(
var
j
in
this
.
paper
.
customAttributes
)
if
(
this
.
paper
.
customAttributes
[
f
](
j
)
&&
i
[
f
](
j
)
&&
a
.
is
(
this
.
paper
.
customAttributes
[
j
],
"
function
"
)){
var
k
=
this
.
paper
.
customAttributes
[
j
].
apply
(
this
,[][
n
](
i
[
j
]));
this
.
attrs
[
j
]
=
i
[
j
];
for
(
var
l
in
k
)
k
[
f
](
l
)
&&
(
i
[
l
]
=
k
[
l
])}
i
.
text
&&
this
.
type
==
"
text
"
&&
(
this
.
node
.
string
=
i
.
text
),
bK
(
this
,
i
),
i
.
gradient
&&
(({
circle
:
1
,
ellipse
:
1
})[
f
](
this
.
type
)
||
r
(
i
.
gradient
).
charAt
()
!=
"
r
"
)
&&
bI
(
this
,
i
.
gradient
),(
!
ca
[
f
](
this
.
type
)
||
this
.
_
.
rt
.
deg
)
&&
this
.
setBox
(
this
.
attrs
)}
return
this
},
bO
.
toFront
=
function
(){
!
this
.
removed
&&
this
.
Group
.
parentNode
[
l
](
this
.
Group
),
this
.
paper
.
top
!=
this
&&
bB
(
this
,
this
.
paper
);
return
this
},
bO
.
toBack
=
function
(){
if
(
this
.
removed
)
return
this
;
this
.
Group
.
parentNode
.
firstChild
!=
this
.
Group
&&
(
this
.
Group
.
parentNode
.
insertBefore
(
this
.
Group
,
this
.
Group
.
parentNode
.
firstChild
),
bC
(
this
,
this
.
paper
));
return
this
},
bO
.
insertAfter
=
function
(
a
){
if
(
this
.
removed
)
return
this
;
a
.
constructor
==
cD
&&
(
a
=
a
[
a
.
length
-
1
]),
a
.
Group
.
nextSibling
?
a
.
Group
.
parentNode
.
insertBefore
(
this
.
Group
,
a
.
Group
.
nextSibling
):
a
.
Group
.
parentNode
[
l
](
this
.
Group
),
bD
(
this
,
a
,
this
.
paper
);
return
this
},
bO
.
insertBefore
=
function
(
a
){
if
(
this
.
removed
)
return
this
;
a
.
constructor
==
cD
&&
(
a
=
a
[
0
]),
a
.
Group
.
parentNode
.
insertBefore
(
this
.
Group
,
a
.
Group
),
bE
(
this
,
a
,
this
.
paper
);
return
this
},
bO
.
blur
=
function
(
b
){
var
c
=
this
.
node
.
runtimeStyle
,
d
=
c
.
filter
;
d
=
d
.
replace
(
bY
,
p
),
+
b
!==
0
?(
this
.
attrs
.
blur
=
b
,
c
.
filter
=
d
+
q
+
U
+
"
.Blur(pixelradius=
"
+
(
+
b
||
1.5
)
+
"
)
"
,
c
.
margin
=
a
.
format
(
"
-{0}px 0 0 -{0}px
"
,
Q
(
+
b
||
1.5
))):(
c
.
filter
=
d
,
c
.
margin
=
0
,
delete
this
.
attrs
.
blur
)},
bP
=
function
(
a
,
b
,
c
,
d
){
var
e
=
cd
(
"
group
"
),
f
=
cd
(
"
oval
"
),
g
=
f
.
style
;
e
.
style
.
cssText
=
"
position:absolute;left:0;top:0;width:
"
+
a
.
width
+
"
px;height:
"
+
a
.
height
+
"
px
"
,
e
.
coordsize
=
b$
,
e
.
coordorigin
=
a
.
coordorigin
,
e
[
l
](
f
);
var
h
=
new
bN
(
f
,
e
,
a
);
h
.
type
=
"
circle
"
,
bK
(
h
,{
stroke
:
"
#000
"
,
fill
:
"
none
"
}),
h
.
attrs
.
cx
=
b
,
h
.
attrs
.
cy
=
c
,
h
.
attrs
.
r
=
d
,
h
.
setBox
({
x
:
b
-
d
,
y
:
c
-
d
,
width
:
d
*
2
,
height
:
d
*
2
}),
a
.
canvas
[
l
](
e
);
return
h
};
function
cc
(
b
,
c
,
d
,
e
,
f
){
return
f
?
a
.
format
(
"
M{0},{1}l{2},0a{3},{3},0,0,1,{3},{3}l0,{5}a{3},{3},0,0,1,{4},{3}l{6},0a{3},{3},0,0,1,{4},{4}l0,{7}a{3},{3},0,0,1,{3},{4}z
"
,
b
+
f
,
c
,
d
-
f
*
2
,
f
,
-
f
,
e
-
f
*
2
,
f
*
2
-
d
,
f
*
2
-
e
):
a
.
format
(
"
M{0},{1}l{2},0,0,{3},{4},0z
"
,
b
,
c
,
d
,
e
,
-
d
)}
bQ
=
function
(
a
,
b
,
c
,
d
,
e
,
f
){
var
g
=
cc
(
b
,
c
,
d
,
e
,
f
),
h
=
a
.
path
(
g
),
i
=
h
.
attrs
;
h
.
X
=
i
.
x
=
b
,
h
.
Y
=
i
.
y
=
c
,
h
.
W
=
i
.
width
=
d
,
h
.
H
=
i
.
height
=
e
,
i
.
r
=
f
,
i
.
path
=
g
,
h
.
type
=
"
rect
"
;
return
h
},
bR
=
function
(
a
,
b
,
c
,
d
,
e
){
var
f
=
cd
(
"
group
"
),
g
=
cd
(
"
oval
"
),
h
=
g
.
style
;
f
.
style
.
cssText
=
"
position:absolute;left:0;top:0;width:
"
+
a
.
width
+
"
px;height:
"
+
a
.
height
+
"
px
"
,
f
.
coordsize
=
b$
,
f
.
coordorigin
=
a
.
coordorigin
,
f
[
l
](
g
);
var
i
=
new
bN
(
g
,
f
,
a
);
i
.
type
=
"
ellipse
"
,
bK
(
i
,{
stroke
:
"
#000
"
}),
i
.
attrs
.
cx
=
b
,
i
.
attrs
.
cy
=
c
,
i
.
attrs
.
rx
=
d
,
i
.
attrs
.
ry
=
e
,
i
.
setBox
({
x
:
b
-
d
,
y
:
c
-
e
,
width
:
d
*
2
,
height
:
e
*
2
}),
a
.
canvas
[
l
](
f
);
return
i
},
bS
=
function
(
a
,
b
,
c
,
d
,
e
,
f
){
var
g
=
cd
(
"
group
"
),
h
=
cd
(
"
image
"
);
g
.
style
.
cssText
=
"
position:absolute;left:0;top:0;width:
"
+
a
.
width
+
"
px;height:
"
+
a
.
height
+
"
px
"
,
g
.
coordsize
=
b$
,
g
.
coordorigin
=
a
.
coordorigin
,
h
.
src
=
b
,
g
[
l
](
h
);
var
i
=
new
bN
(
h
,
g
,
a
);
i
.
type
=
"
image
"
,
i
.
attrs
.
src
=
b
,
i
.
attrs
.
x
=
c
,
i
.
attrs
.
y
=
d
,
i
.
attrs
.
w
=
e
,
i
.
attrs
.
h
=
f
,
i
.
setBox
({
x
:
c
,
y
:
d
,
width
:
e
,
height
:
f
}),
a
.
canvas
[
l
](
g
);
var
j
=
cd
(
"
skew
"
);
j
.
on
=!
0
,
h
.
appendChild
(
j
),
i
.
skew
=
j
;
return
i
},
bT
=
function
(
b
,
c
,
d
,
e
){
var
f
=
cd
(
"
group
"
),
g
=
cd
(
"
shape
"
),
h
=
g
.
style
,
i
=
cd
(
"
path
"
),
j
=
i
.
style
,
k
=
cd
(
"
textpath
"
);
f
.
style
.
cssText
=
"
position:absolute;left:0;top:0;width:
"
+
b
.
width
+
"
px;height:
"
+
b
.
height
+
"
px
"
,
f
.
coordsize
=
b$
,
f
.
coordorigin
=
b
.
coordorigin
,
i
.
v
=
a
.
format
(
"
m{0},{1}l{2},{1}
"
,
Q
(
c
*
10
),
Q
(
d
*
10
),
Q
(
c
*
10
)
+
1
),
i
.
textpathok
=!
0
,
h
.
width
=
b
.
width
,
h
.
height
=
b
.
height
,
k
.
string
=
r
(
e
),
k
.
on
=!
0
,
g
[
l
](
k
),
g
[
l
](
i
),
f
[
l
](
g
);
var
m
=
new
bN
(
k
,
f
,
b
);
m
.
shape
=
g
,
m
.
textpath
=
i
,
m
.
type
=
"
text
"
,
m
.
attrs
.
text
=
e
,
m
.
attrs
.
x
=
c
,
m
.
attrs
.
y
=
d
,
m
.
attrs
.
w
=
1
,
m
.
attrs
.
h
=
1
,
bK
(
m
,{
font
:
W
.
font
,
stroke
:
"
none
"
,
fill
:
"
#000
"
}),
m
.
setBox
(),
b
.
canvas
[
l
](
f
);
return
m
},
bU
=
function
(
a
,
b
){
var
c
=
this
.
canvas
.
style
;
a
==+
a
&&
(
a
+=
"
px
"
),
b
==+
b
&&
(
b
+=
"
px
"
),
c
.
width
=
a
,
c
.
height
=
b
,
c
.
clip
=
"
rect(0
"
+
a
+
"
"
+
b
+
"
0)
"
;
return
this
};
var
cd
;
g
.
createStyleSheet
().
addRule
(
"
.rvml
"
,
"
behavior:url(#default#VML)
"
);
try
{
!
g
.
namespaces
.
rvml
&&
g
.
namespaces
.
add
(
"
rvml
"
,
"
urn:schemas-microsoft-com:vml
"
),
cd
=
function
(
a
){
return
g
.
createElement
(
"
<rvml:
"
+
a
+
'
class="rvml">
'
)}}
catch
(
ce
){
cd
=
function
(
a
){
return
g
.
createElement
(
"
<
"
+
a
+
'
xmlns="urn:schemas-microsoft.com:vml" class="rvml">
'
)}}
bV
=
function
(){
var
b
=
by
[
m
](
0
,
arguments
),
c
=
b
.
container
,
d
=
b
.
height
,
e
,
f
=
b
.
width
,
h
=
b
.
x
,
i
=
b
.
y
;
if
(
!
c
)
throw
new
Error
(
"
VML container not found.
"
);
var
k
=
new
j
,
n
=
k
.
canvas
=
g
.
createElement
(
"
div
"
),
o
=
n
.
style
;
h
=
h
||
0
,
i
=
i
||
0
,
f
=
f
||
512
,
d
=
d
||
342
,
f
==+
f
&&
(
f
+=
"
px
"
),
d
==+
d
&&
(
d
+=
"
px
"
),
k
.
width
=
1
e3
,
k
.
height
=
1
e3
,
k
.
coordsize
=
b_
*
1
e3
+
q
+
b_
*
1
e3
,
k
.
coordorigin
=
"
0 0
"
,
k
.
span
=
g
.
createElement
(
"
span
"
),
k
.
span
.
style
.
cssText
=
"
position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;
"
,
n
[
l
](
k
.
span
),
o
.
cssText
=
a
.
format
(
"
top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden
"
,
f
,
d
),
c
==
1
?(
g
.
body
[
l
](
n
),
o
.
left
=
h
+
"
px
"
,
o
.
top
=
i
+
"
px
"
,
o
.
position
=
"
absolute
"
):
c
.
firstChild
?
c
.
insertBefore
(
n
,
c
.
firstChild
):
c
[
l
](
n
),
bz
.
call
(
k
,
k
,
a
.
fn
);
return
k
},
k
.
clear
=
function
(){
this
.
canvas
.
innerHTML
=
p
,
this
.
span
=
g
.
createElement
(
"
span
"
),
this
.
span
.
style
.
cssText
=
"
position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;
"
,
this
.
canvas
[
l
](
this
.
span
),
this
.
bottom
=
this
.
top
=
null
},
k
.
remove
=
function
(){
this
.
canvas
.
parentNode
.
removeChild
(
this
.
canvas
);
for
(
var
a
in
this
)
this
[
a
]
=
bF
(
a
);
return
!
0
}}
var
cf
=
navigator
.
userAgent
.
match
(
/Version
\/(
.*
?)\s
/
);
navigator
.
vendor
==
"
Apple Computer, Inc.
"
&&
(
cf
&&
cf
[
1
]
<
4
||
navigator
.
platform
.
slice
(
0
,
2
)
==
"
iP
"
)?
k
.
safari
=
function
(){
var
a
=
this
.
rect
(
-
99
,
-
99
,
this
.
width
+
99
,
this
.
height
+
99
).
attr
({
stroke
:
"
none
"
});
h
.
setTimeout
(
function
(){
a
.
remove
()})}:
k
.
safari
=
function
(){};
var
cg
=
function
(){
this
.
returnValue
=!
1
},
ch
=
function
(){
return
this
.
originalEvent
.
preventDefault
()},
ci
=
function
(){
this
.
cancelBubble
=!
0
},
cj
=
function
(){
return
this
.
originalEvent
.
stopPropagation
()},
ck
=
function
(){
if
(
g
.
addEventListener
)
return
function
(
a
,
b
,
c
,
d
){
var
e
=
o
&&
u
[
b
]?
u
[
b
]:
b
,
g
=
function
(
e
){
if
(
o
&&
u
[
f
](
b
))
for
(
var
g
=
0
,
h
=
e
.
targetTouches
&&
e
.
targetTouches
.
length
;
g
<
h
;
g
++
)
if
(
e
.
targetTouches
[
g
].
target
==
a
){
var
i
=
e
;
e
=
e
.
targetTouches
[
g
],
e
.
originalEvent
=
i
,
e
.
preventDefault
=
ch
,
e
.
stopPropagation
=
cj
;
break
}
return
c
.
call
(
d
,
e
)};
a
.
addEventListener
(
e
,
g
,
!
1
);
return
function
(){
a
.
removeEventListener
(
e
,
g
,
!
1
);
return
!
0
}};
if
(
g
.
attachEvent
)
return
function
(
a
,
b
,
c
,
d
){
var
e
=
function
(
a
){
a
=
a
||
h
.
event
,
a
.
preventDefault
=
a
.
preventDefault
||
cg
,
a
.
stopPropagation
=
a
.
stopPropagation
||
ci
;
return
c
.
call
(
d
,
a
)};
a
.
attachEvent
(
"
on
"
+
b
,
e
);
var
f
=
function
(){
a
.
detachEvent
(
"
on
"
+
b
,
e
);
return
!
0
};
return
f
}}(),
cl
=
[],
cm
=
function
(
a
){
var
b
=
a
.
clientX
,
c
=
a
.
clientY
,
d
=
g
.
documentElement
.
scrollTop
||
g
.
body
.
scrollTop
,
e
=
g
.
documentElement
.
scrollLeft
||
g
.
body
.
scrollLeft
,
f
,
h
=
cl
.
length
;
while
(
h
--
){
f
=
cl
[
h
];
if
(
o
){
var
i
=
a
.
touches
.
length
,
j
;
while
(
i
--
){
j
=
a
.
touches
[
i
];
if
(
j
.
identifier
==
f
.
el
.
_drag
.
id
){
b
=
j
.
clientX
,
c
=
j
.
clientY
,(
a
.
originalEvent
?
a
.
originalEvent
:
a
).
preventDefault
();
break
}}}
else
a
.
preventDefault
();
b
+=
e
,
c
+=
d
,
f
.
move
&&
f
.
move
.
call
(
f
.
move_scope
||
f
.
el
,
b
-
f
.
el
.
_drag
.
x
,
c
-
f
.
el
.
_drag
.
y
,
b
,
c
,
a
)}},
cn
=
function
(
b
){
a
.
unmousemove
(
cm
).
unmouseup
(
cn
);
var
c
=
cl
.
length
,
d
;
while
(
c
--
)
d
=
cl
[
c
],
d
.
el
.
_drag
=
{},
d
.
end
&&
d
.
end
.
call
(
d
.
end_scope
||
d
.
start_scope
||
d
.
move_scope
||
d
.
el
,
b
);
cl
=
[]};
for
(
var
co
=
t
[
w
];
co
--
;)(
function
(
b
){
a
[
b
]
=
bN
[
e
][
b
]
=
function
(
c
,
d
){
a
.
is
(
c
,
"
function
"
)
&&
(
this
.
events
=
this
.
events
||
[],
this
.
events
.
push
({
name
:
b
,
f
:
c
,
unbind
:
ck
(
this
.
shape
||
this
.
node
||
g
,
b
,
c
,
d
||
this
)}));
return
this
},
a
[
"
un
"
+
b
]
=
bN
[
e
][
"
un
"
+
b
]
=
function
(
a
){
var
c
=
this
.
events
,
d
=
c
[
w
];
while
(
d
--
)
if
(
c
[
d
].
name
==
b
&&
c
[
d
].
f
==
a
){
c
[
d
].
unbind
(),
c
.
splice
(
d
,
1
),
!
c
.
length
&&
delete
this
.
events
;
return
this
}
return
this
}})(
t
[
co
]);
bO
.
hover
=
function
(
a
,
b
,
c
,
d
){
return
this
.
mouseover
(
a
,
c
).
mouseout
(
b
,
d
||
c
)},
bO
.
unhover
=
function
(
a
,
b
){
return
this
.
unmouseover
(
a
).
unmouseout
(
b
)},
bO
.
drag
=
function
(
b
,
c
,
d
,
e
,
f
,
h
){
this
.
_drag
=
{},
this
.
mousedown
(
function
(
i
){(
i
.
originalEvent
||
i
).
preventDefault
();
var
j
=
g
.
documentElement
.
scrollTop
||
g
.
body
.
scrollTop
,
k
=
g
.
documentElement
.
scrollLeft
||
g
.
body
.
scrollLeft
;
this
.
_drag
.
x
=
i
.
clientX
+
k
,
this
.
_drag
.
y
=
i
.
clientY
+
j
,
this
.
_drag
.
id
=
i
.
identifier
,
c
&&
c
.
call
(
f
||
e
||
this
,
i
.
clientX
+
k
,
i
.
clientY
+
j
,
i
),
!
cl
.
length
&&
a
.
mousemove
(
cm
).
mouseup
(
cn
),
cl
.
push
({
el
:
this
,
move
:
b
,
end
:
d
,
move_scope
:
e
,
start_scope
:
f
,
end_scope
:
h
})});
return
this
},
bO
.
undrag
=
function
(
b
,
c
,
d
){
var
e
=
cl
.
length
;
while
(
e
--
)
cl
[
e
].
el
==
this
&&
cl
[
e
].
move
==
b
&&
cl
[
e
].
end
==
d
&&
cl
.
splice
(
e
++
,
1
);
!
cl
.
length
&&
a
.
unmousemove
(
cm
).
unmouseup
(
cn
)},
k
.
circle
=
function
(
a
,
b
,
c
){
return
bP
(
this
,
a
||
0
,
b
||
0
,
c
||
0
)},
k
.
rect
=
function
(
a
,
b
,
c
,
d
,
e
){
return
bQ
(
this
,
a
||
0
,
b
||
0
,
c
||
0
,
d
||
0
,
e
||
0
)},
k
.
ellipse
=
function
(
a
,
b
,
c
,
d
){
return
bR
(
this
,
a
||
0
,
b
||
0
,
c
||
0
,
d
||
0
)},
k
.
path
=
function
(
b
){
b
&&!
a
.
is
(
b
,
F
)
&&!
a
.
is
(
b
[
0
],
G
)
&&
(
b
+=
p
);
return
bH
(
a
.
format
[
m
](
a
,
arguments
),
this
)},
k
.
image
=
function
(
a
,
b
,
c
,
d
,
e
){
return
bS
(
this
,
a
||
"
about:blank
"
,
b
||
0
,
c
||
0
,
d
||
0
,
e
||
0
)},
k
.
text
=
function
(
a
,
b
,
c
){
return
bT
(
this
,
a
||
0
,
b
||
0
,
r
(
c
))},
k
.
set
=
function
(
a
){
arguments
[
w
]
>
1
&&
(
a
=
Array
[
e
].
splice
.
call
(
arguments
,
0
,
arguments
[
w
]));
return
new
cD
(
a
)},
k
.
setSize
=
bU
,
k
.
top
=
k
.
bottom
=
null
,
k
.
raphael
=
a
,
bO
.
resetScale
=
function
(){
if
(
this
.
removed
)
return
this
;
this
.
_
.
sx
=
1
,
this
.
_
.
sy
=
1
,
this
.
attrs
.
scale
=
"
1 1
"
},
bO
.
scale
=
function
(
a
,
b
,
c
,
d
){
if
(
this
.
removed
)
return
this
;
if
(
a
==
null
&&
b
==
null
)
return
{
x
:
this
.
_
.
sx
,
y
:
this
.
_
.
sy
,
toString
:
cp
};
b
=
b
||
a
,
!+
b
&&
(
b
=
a
);
var
e
,
f
,
g
,
h
,
i
=
this
.
attrs
;
if
(
a
!=
0
){
var
j
=
this
.
getBBox
(),
k
=
j
.
x
+
j
.
width
/
2
,
l
=
j
.
y
+
j
.
height
/
2
,
m
=
B
(
a
/
this
.
_
.
sx
),
o
=
B
(
b
/
this
.
_
.
sy
);
c
=+
c
||
c
==
0
?
c
:
k
,
d
=+
d
||
d
==
0
?
d
:
l
;
var
r
=
this
.
_
.
sx
>
0
,
s
=
this
.
_
.
sy
>
0
,
t
=~~
(
a
/
B
(
a
)),
u
=~~
(
b
/
B
(
b
)),
x
=
m
*
t
,
y
=
o
*
u
,
z
=
this
.
node
.
style
,
A
=
c
+
B
(
k
-
c
)
*
x
*
(
k
>
c
==
r
?
1
:
-
1
),
C
=
d
+
B
(
l
-
d
)
*
y
*
(
l
>
d
==
s
?
1
:
-
1
),
D
=
a
*
t
>
b
*
u
?
o
:
m
;
switch
(
this
.
type
){
case
"
rect
"
:
case
"
image
"
:
var
E
=
i
.
width
*
m
,
F
=
i
.
height
*
o
;
this
.
attr
({
height
:
F
,
r
:
i
.
r
*
D
,
width
:
E
,
x
:
A
-
E
/
2
,
y
:
C
-
F
/
2
});
break
;
case
"
circle
"
:
case
"
ellipse
"
:
this
.
attr
({
rx
:
i
.
rx
*
m
,
ry
:
i
.
ry
*
o
,
r
:
i
.
r
*
D
,
cx
:
A
,
cy
:
C
});
break
;
case
"
text
"
:
this
.
attr
({
x
:
A
,
y
:
C
});
break
;
case
"
path
"
:
var
G
=
bp
(
i
.
path
),
H
=!
0
,
I
=
r
?
x
:
m
,
J
=
s
?
y
:
o
;
for
(
var
K
=
0
,
L
=
G
[
w
];
K
<
L
;
K
++
){
var
M
=
G
[
K
],
N
=
V
.
call
(
M
[
0
]);
if
(
N
==
"
M
"
&&
H
)
continue
;
H
=!
1
;
if
(
N
==
"
A
"
)
M
[
G
[
K
][
w
]
-
2
]
*=
I
,
M
[
G
[
K
][
w
]
-
1
]
*=
J
,
M
[
1
]
*=
m
,
M
[
2
]
*=
o
,
M
[
5
]
=+
(
t
+
u
?
!!+
M
[
5
]:
!+
M
[
5
]);
else
if
(
N
==
"
H
"
)
for
(
var
O
=
1
,
P
=
M
[
w
];
O
<
P
;
O
++
)
M
[
O
]
*=
I
;
else
if
(
N
==
"
V
"
)
for
(
O
=
1
,
P
=
M
[
w
];
O
<
P
;
O
++
)
M
[
O
]
*=
J
;
else
for
(
O
=
1
,
P
=
M
[
w
];
O
<
P
;
O
++
)
M
[
O
]
*=
O
%
2
?
I
:
J
}
var
Q
=
bn
(
G
);
e
=
A
-
Q
.
x
-
Q
.
width
/
2
,
f
=
C
-
Q
.
y
-
Q
.
height
/
2
,
G
[
0
][
1
]
+=
e
,
G
[
0
][
2
]
+=
f
,
this
.
attr
({
path
:
G
})}
this
.
type
in
{
text
:
1
,
image
:
1
}
&&
(
t
!=
1
||
u
!=
1
)?
this
.
transformations
?(
this
.
transformations
[
2
]
=
"
scale(
"
[
n
](
t
,
"
,
"
,
u
,
"
)
"
),
this
.
node
[
R
](
"
transform
"
,
this
.
transformations
[
v
](
q
)),
e
=
t
==-
1
?
-
i
.
x
-
(
E
||
0
):
i
.
x
,
f
=
u
==-
1
?
-
i
.
y
-
(
F
||
0
):
i
.
y
,
this
.
attr
({
x
:
e
,
y
:
f
}),
i
.
fx
=
t
-
1
,
i
.
fy
=
u
-
1
):(
this
.
node
.
filterMatrix
=
U
+
"
.Matrix(M11=
"
[
n
](
t
,
"
, M12=0, M21=0, M22=
"
,
u
,
"
, Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')
"
),
z
.
filter
=
(
this
.
node
.
filterMatrix
||
p
)
+
(
this
.
node
.
filterOpacity
||
p
)):
this
.
transformations
?(
this
.
transformations
[
2
]
=
p
,
this
.
node
[
R
](
"
transform
"
,
this
.
transformations
[
v
](
q
)),
i
.
fx
=
0
,
i
.
fy
=
0
):(
this
.
node
.
filterMatrix
=
p
,
z
.
filter
=
(
this
.
node
.
filterMatrix
||
p
)
+
(
this
.
node
.
filterOpacity
||
p
)),
i
.
scale
=
[
a
,
b
,
c
,
d
][
v
](
q
),
this
.
_
.
sx
=
a
,
this
.
_
.
sy
=
b
}
return
this
},
bO
.
clone
=
function
(){
if
(
this
.
removed
)
return
null
;
var
a
=
this
.
attr
();
delete
a
.
scale
,
delete
a
.
translation
;
return
this
.
paper
[
this
.
type
]().
attr
(
a
)};
var
cq
=
{},
cr
=
function
(
b
,
c
,
d
,
e
,
f
,
g
,
h
,
i
,
j
){
var
k
=
0
,
l
=
100
,
m
=
[
b
,
c
,
d
,
e
,
f
,
g
,
h
,
i
].
join
(),
n
=
cq
[
m
],
o
,
p
;
!
n
&&
(
cq
[
m
]
=
n
=
{
data
:[]}),
n
.
timer
&&
clearTimeout
(
n
.
timer
),
n
.
timer
=
setTimeout
(
function
(){
delete
cq
[
m
]},
2
e3
);
if
(
j
!=
null
){
var
q
=
cr
(
b
,
c
,
d
,
e
,
f
,
g
,
h
,
i
);
l
=~~
q
*
10
}
for
(
var
r
=
0
;
r
<
l
+
1
;
r
++
){
n
.
data
[
j
]
>
r
?
p
=
n
.
data
[
r
*
l
]:(
p
=
a
.
findDotsAtSegment
(
b
,
c
,
d
,
e
,
f
,
g
,
h
,
i
,
r
/
l
),
n
.
data
[
r
]
=
p
),
r
&&
(
k
+=
C
(
C
(
o
.
x
-
p
.
x
,
2
)
+
C
(
o
.
y
-
p
.
y
,
2
),.
5
));
if
(
j
!=
null
&&
k
>=
j
)
return
p
;
o
=
p
}
if
(
j
==
null
)
return
k
},
cs
=
function
(
b
,
c
){
return
function
(
d
,
e
,
f
){
d
=
bw
(
d
);
var
g
,
h
,
i
,
j
,
k
=
""
,
l
=
{},
m
,
n
=
0
;
for
(
var
o
=
0
,
p
=
d
.
length
;
o
<
p
;
o
++
){
i
=
d
[
o
];
if
(
i
[
0
]
==
"
M
"
)
g
=+
i
[
1
],
h
=+
i
[
2
];
else
{
j
=
cr
(
g
,
h
,
i
[
1
],
i
[
2
],
i
[
3
],
i
[
4
],
i
[
5
],
i
[
6
]);
if
(
n
+
j
>
e
){
if
(
c
&&!
l
.
start
){
m
=
cr
(
g
,
h
,
i
[
1
],
i
[
2
],
i
[
3
],
i
[
4
],
i
[
5
],
i
[
6
],
e
-
n
),
k
+=
[
"
C
"
,
m
.
start
.
x
,
m
.
start
.
y
,
m
.
m
.
x
,
m
.
m
.
y
,
m
.
x
,
m
.
y
];
if
(
f
)
return
k
;
l
.
start
=
k
,
k
=
[
"
M
"
,
m
.
x
,
m
.
y
+
"
C
"
,
m
.
n
.
x
,
m
.
n
.
y
,
m
.
end
.
x
,
m
.
end
.
y
,
i
[
5
],
i
[
6
]][
v
](),
n
+=
j
,
g
=+
i
[
5
],
h
=+
i
[
6
];
continue
}
if
(
!
b
&&!
c
){
m
=
cr
(
g
,
h
,
i
[
1
],
i
[
2
],
i
[
3
],
i
[
4
],
i
[
5
],
i
[
6
],
e
-
n
);
return
{
x
:
m
.
x
,
y
:
m
.
y
,
alpha
:
m
.
alpha
}}}
n
+=
j
,
g
=+
i
[
5
],
h
=+
i
[
6
]}
k
+=
i
}
l
.
end
=
k
,
m
=
b
?
n
:
c
?
l
:
a
.
findDotsAtSegment
(
g
,
h
,
i
[
1
],
i
[
2
],
i
[
3
],
i
[
4
],
i
[
5
],
i
[
6
],
1
),
m
.
alpha
&&
(
m
=
{
x
:
m
.
x
,
y
:
m
.
y
,
alpha
:
m
.
alpha
});
return
m
}},
ct
=
cs
(
1
),
cu
=
cs
(),
cv
=
cs
(
0
,
1
);
bO
.
getTotalLength
=
function
(){
if
(
this
.
type
==
"
path
"
){
if
(
this
.
node
.
getTotalLength
)
return
this
.
node
.
getTotalLength
();
return
ct
(
this
.
attrs
.
path
)}},
bO
.
getPointAtLength
=
function
(
a
){
if
(
this
.
type
==
"
path
"
)
return
cu
(
this
.
attrs
.
path
,
a
)},
bO
.
getSubpath
=
function
(
a
,
b
){
if
(
this
.
type
==
"
path
"
){
if
(
B
(
this
.
getTotalLength
()
-
b
)
<
"
1e-6
"
)
return
cv
(
this
.
attrs
.
path
,
a
).
end
;
var
c
=
cv
(
this
.
attrs
.
path
,
b
,
1
);
return
a
?
cv
(
c
,
a
).
end
:
c
}},
a
.
easing_formulas
=
{
linear
:
function
(
a
){
return
a
},
"
<
"
:
function
(
a
){
return
C
(
a
,
3
)},
"
>
"
:
function
(
a
){
return
C
(
a
-
1
,
3
)
+
1
},
"
<>
"
:
function
(
a
){
a
=
a
*
2
;
if
(
a
<
1
)
return
C
(
a
,
3
)
/
2
;
a
-=
2
;
return
(
C
(
a
,
3
)
+
2
)
/
2
},
backIn
:
function
(
a
){
var
b
=
1.70158
;
return
a
*
a
*
((
b
+
1
)
*
a
-
b
)},
backOut
:
function
(
a
){
a
=
a
-
1
;
var
b
=
1.70158
;
return
a
*
a
*
((
b
+
1
)
*
a
+
b
)
+
1
},
elastic
:
function
(
a
){
if
(
a
==
0
||
a
==
1
)
return
a
;
var
b
=
.
3
,
c
=
b
/
4
;
return
C
(
2
,
-
10
*
a
)
*
y
.
sin
((
a
-
c
)
*
2
*
D
/
b
)
+
1
},
bounce
:
function
(
a
){
var
b
=
7.5625
,
c
=
2.75
,
d
;
a
<
1
/
c
?
d
=
b
*
a
*
a
:
a
<
2
/
c
?(
a
-=
1.5
/
c
,
d
=
b
*
a
*
a
+
.
75
):
a
<
2.5
/
c
?(
a
-=
2.25
/
c
,
d
=
b
*
a
*
a
+
.
9375
):(
a
-=
2.625
/
c
,
d
=
b
*
a
*
a
+
.
984375
);
return
d
}};
var
cw
=
[],
cx
=
function
(){
var
b
=+
(
new
Date
);
for
(
var
c
=
0
;
c
<
cw
[
w
];
c
++
){
var
d
=
cw
[
c
];
if
(
d
.
stop
||
d
.
el
.
removed
)
continue
;
var
e
=
b
-
d
.
start
,
g
=
d
.
ms
,
h
=
d
.
easing
,
i
=
d
.
from
,
j
=
d
.
diff
,
k
=
d
.
to
,
l
=
d
.
t
,
m
=
d
.
el
,
n
=
{},
o
;
if
(
e
<
g
){
var
r
=
h
(
e
/
g
);
for
(
var
s
in
i
)
if
(
i
[
f
](
s
)){
switch
(
X
[
s
]){
case
"
along
"
:
o
=
r
*
g
*
j
[
s
],
k
.
back
&&
(
o
=
k
.
len
-
o
);
var
t
=
cu
(
k
[
s
],
o
);
m
.
translate
(
j
.
sx
-
j
.
x
||
0
,
j
.
sy
-
j
.
y
||
0
),
j
.
x
=
t
.
x
,
j
.
y
=
t
.
y
,
m
.
translate
(
t
.
x
-
j
.
sx
,
t
.
y
-
j
.
sy
),
k
.
rot
&&
m
.
rotate
(
j
.
r
+
t
.
alpha
,
t
.
x
,
t
.
y
);
break
;
case
E
:
o
=+
i
[
s
]
+
r
*
g
*
j
[
s
];
break
;
case
"
colour
"
:
o
=
"
rgb(
"
+
[
cz
(
Q
(
i
[
s
].
r
+
r
*
g
*
j
[
s
].
r
)),
cz
(
Q
(
i
[
s
].
g
+
r
*
g
*
j
[
s
].
g
)),
cz
(
Q
(
i
[
s
].
b
+
r
*
g
*
j
[
s
].
b
))][
v
](
"
,
"
)
+
"
)
"
;
break
;
case
"
path
"
:
o
=
[];
for
(
var
u
=
0
,
x
=
i
[
s
][
w
];
u
<
x
;
u
++
){
o
[
u
]
=
[
i
[
s
][
u
][
0
]];
for
(
var
y
=
1
,
z
=
i
[
s
][
u
][
w
];
y
<
z
;
y
++
)
o
[
u
][
y
]
=+
i
[
s
][
u
][
y
]
+
r
*
g
*
j
[
s
][
u
][
y
];
o
[
u
]
=
o
[
u
][
v
](
q
)}
o
=
o
[
v
](
q
);
break
;
case
"
csv
"
:
switch
(
s
){
case
"
translation
"
:
var
A
=
r
*
g
*
j
[
s
][
0
]
-
l
.
x
,
B
=
r
*
g
*
j
[
s
][
1
]
-
l
.
y
;
l
.
x
+=
A
,
l
.
y
+=
B
,
o
=
A
+
q
+
B
;
break
;
case
"
rotation
"
:
o
=+
i
[
s
][
0
]
+
r
*
g
*
j
[
s
][
0
],
i
[
s
][
1
]
&&
(
o
+=
"
,
"
+
i
[
s
][
1
]
+
"
,
"
+
i
[
s
][
2
]);
break
;
case
"
scale
"
:
o
=
[
+
i
[
s
][
0
]
+
r
*
g
*
j
[
s
][
0
],
+
i
[
s
][
1
]
+
r
*
g
*
j
[
s
][
1
],
2
in
k
[
s
]?
k
[
s
][
2
]:
p
,
3
in
k
[
s
]?
k
[
s
][
3
]:
p
][
v
](
q
);
break
;
case
"
clip-rect
"
:
o
=
[],
u
=
4
;
while
(
u
--
)
o
[
u
]
=+
i
[
s
][
u
]
+
r
*
g
*
j
[
s
][
u
]}
break
;
default
:
var
C
=
[].
concat
(
i
[
s
]);
o
=
[],
u
=
m
.
paper
.
customAttributes
[
s
].
length
;
while
(
u
--
)
o
[
u
]
=+
C
[
u
]
+
r
*
g
*
j
[
s
][
u
]}
n
[
s
]
=
o
}
m
.
attr
(
n
),
m
.
_run
&&
m
.
_run
.
call
(
m
)}
else
k
.
along
&&
(
t
=
cu
(
k
.
along
,
k
.
len
*!
k
.
back
),
m
.
translate
(
j
.
sx
-
(
j
.
x
||
0
)
+
t
.
x
-
j
.
sx
,
j
.
sy
-
(
j
.
y
||
0
)
+
t
.
y
-
j
.
sy
),
k
.
rot
&&
m
.
rotate
(
j
.
r
+
t
.
alpha
,
t
.
x
,
t
.
y
)),(
l
.
x
||
l
.
y
)
&&
m
.
translate
(
-
l
.
x
,
-
l
.
y
),
k
.
scale
&&
(
k
.
scale
+=
p
),
m
.
attr
(
k
),
cw
.
splice
(
c
--
,
1
)}
a
.
svg
&&
m
&&
m
.
paper
&&
m
.
paper
.
safari
(),
cw
[
w
]
&&
setTimeout
(
cx
)},
cy
=
function
(
b
,
c
,
d
,
e
,
f
){
var
g
=
d
-
e
;
c
.
timeouts
.
push
(
setTimeout
(
function
(){
a
.
is
(
f
,
"
function
"
)
&&
f
.
call
(
c
),
c
.
animate
(
b
,
g
,
b
.
easing
)},
e
))},
cz
=
function
(
a
){
return
z
(
A
(
a
,
255
),
0
)},
cA
=
function
(
a
,
b
){
if
(
a
==
null
)
return
{
x
:
this
.
_
.
tx
,
y
:
this
.
_
.
ty
,
toString
:
cp
};
this
.
_
.
tx
+=+
a
,
this
.
_
.
ty
+=+
b
;
switch
(
this
.
type
){
case
"
circle
"
:
case
"
ellipse
"
:
this
.
attr
({
cx
:
+
a
+
this
.
attrs
.
cx
,
cy
:
+
b
+
this
.
attrs
.
cy
});
break
;
case
"
rect
"
:
case
"
image
"
:
case
"
text
"
:
this
.
attr
({
x
:
+
a
+
this
.
attrs
.
x
,
y
:
+
b
+
this
.
attrs
.
y
});
break
;
case
"
path
"
:
var
c
=
bp
(
this
.
attrs
.
path
);
c
[
0
][
1
]
+=+
a
,
c
[
0
][
2
]
+=+
b
,
this
.
attr
({
path
:
c
})}
return
this
};
bO
.
animateWith
=
function
(
a
,
b
,
c
,
d
,
e
){
for
(
var
f
=
0
,
g
=
cw
.
length
;
f
<
g
;
f
++
)
cw
[
f
].
el
.
id
==
a
.
id
&&
(
b
.
start
=
cw
[
f
].
start
);
return
this
.
animate
(
b
,
c
,
d
,
e
)},
bO
.
animateAlong
=
cB
(),
bO
.
animateAlongBack
=
cB
(
1
),
bO
.
onAnimation
=
function
(
a
){
this
.
_run
=
a
||
0
;
return
this
},
bO
.
animate
=
function
(
c
,
d
,
e
,
g
){
var
h
=
this
;
h
.
timeouts
=
h
.
timeouts
||
[];
if
(
a
.
is
(
e
,
"
function
"
)
||!
e
)
g
=
e
||
null
;
if
(
h
.
removed
){
g
&&
g
.
call
(
h
);
return
h
}
var
i
=
{},
j
=
{},
k
=!
1
,
l
=
{};
for
(
var
m
in
c
)
if
(
c
[
f
](
m
))
if
(
X
[
f
](
m
)
||
h
.
paper
.
customAttributes
[
f
](
m
)){
k
=!
0
,
i
[
m
]
=
h
.
attr
(
m
),
i
[
m
]
==
null
&&
(
i
[
m
]
=
W
[
m
]),
j
[
m
]
=
c
[
m
];
switch
(
X
[
m
]){
case
"
along
"
:
var
n
=
ct
(
c
[
m
]),
o
=
cu
(
c
[
m
],
n
*!!
c
.
back
),
p
=
h
.
getBBox
();
l
[
m
]
=
n
/
d
,
l
.
tx
=
p
.
x
,
l
.
ty
=
p
.
y
,
l
.
sx
=
o
.
x
,
l
.
sy
=
o
.
y
,
j
.
rot
=
c
.
rot
,
j
.
back
=
c
.
back
,
j
.
len
=
n
,
c
.
rot
&&
(
l
.
r
=
S
(
h
.
rotate
())
||
0
);
break
;
case
E
:
l
[
m
]
=
(
j
[
m
]
-
i
[
m
])
/
d
;
break
;
case
"
colour
"
:
i
[
m
]
=
a
.
getRGB
(
i
[
m
]);
var
q
=
a
.
getRGB
(
j
[
m
]);
l
[
m
]
=
{
r
:(
q
.
r
-
i
[
m
].
r
)
/
d
,
g
:(
q
.
g
-
i
[
m
].
g
)
/
d
,
b
:(
q
.
b
-
i
[
m
].
b
)
/
d
};
break
;
case
"
path
"
:
var
t
=
bw
(
i
[
m
],
j
[
m
]);
i
[
m
]
=
t
[
0
];
var
u
=
t
[
1
];
l
[
m
]
=
[];
for
(
var
v
=
0
,
x
=
i
[
m
][
w
];
v
<
x
;
v
++
){
l
[
m
][
v
]
=
[
0
];
for
(
var
y
=
1
,
z
=
i
[
m
][
v
][
w
];
y
<
z
;
y
++
)
l
[
m
][
v
][
y
]
=
(
u
[
v
][
y
]
-
i
[
m
][
v
][
y
])
/
d
}
break
;
case
"
csv
"
:
var
A
=
r
(
c
[
m
])[
s
](
b
),
B
=
r
(
i
[
m
])[
s
](
b
);
switch
(
m
){
case
"
translation
"
:
i
[
m
]
=
[
0
,
0
],
l
[
m
]
=
[
A
[
0
]
/
d
,
A
[
1
]
/
d
];
break
;
case
"
rotation
"
:
i
[
m
]
=
B
[
1
]
==
A
[
1
]
&&
B
[
2
]
==
A
[
2
]?
B
:[
0
,
A
[
1
],
A
[
2
]],
l
[
m
]
=
[(
A
[
0
]
-
i
[
m
][
0
])
/
d
,
0
,
0
];
break
;
case
"
scale
"
:
c
[
m
]
=
A
,
i
[
m
]
=
r
(
i
[
m
])[
s
](
b
),
l
[
m
]
=
[(
A
[
0
]
-
i
[
m
][
0
])
/
d
,(
A
[
1
]
-
i
[
m
][
1
])
/
d
,
0
,
0
];
break
;
case
"
clip-rect
"
:
i
[
m
]
=
r
(
i
[
m
])[
s
](
b
),
l
[
m
]
=
[],
v
=
4
;
while
(
v
--
)
l
[
m
][
v
]
=
(
A
[
v
]
-
i
[
m
][
v
])
/
d
}
j
[
m
]
=
A
;
break
;
default
:
A
=
[].
concat
(
c
[
m
]),
B
=
[].
concat
(
i
[
m
]),
l
[
m
]
=
[],
v
=
h
.
paper
.
customAttributes
[
m
][
w
];
while
(
v
--
)
l
[
m
][
v
]
=
((
A
[
v
]
||
0
)
-
(
B
[
v
]
||
0
))
/
d
}}
if
(
!
k
){
var
C
=
[],
D
;
for
(
var
F
in
c
)
c
[
f
](
F
)
&&
Z
.
test
(
F
)
&&
(
m
=
{
value
:
c
[
F
]},
F
==
"
from
"
&&
(
F
=
0
),
F
==
"
to
"
&&
(
F
=
100
),
m
.
key
=
T
(
F
,
10
),
C
.
push
(
m
));
C
.
sort
(
be
),
C
[
0
].
key
&&
C
.
unshift
({
key
:
0
,
value
:
h
.
attrs
});
for
(
v
=
0
,
x
=
C
[
w
];
v
<
x
;
v
++
)
cy
(
C
[
v
].
value
,
h
,
d
/
100
*
C
[
v
].
key
,
d
/
100
*
(
C
[
v
-
1
]
&&
C
[
v
-
1
].
key
||
0
),
C
[
v
-
1
]
&&
C
[
v
-
1
].
value
.
callback
);
D
=
C
[
C
[
w
]
-
1
].
value
.
callback
,
D
&&
h
.
timeouts
.
push
(
setTimeout
(
function
(){
D
.
call
(
h
)},
d
))}
else
{
var
G
=
a
.
easing_formulas
[
e
];
if
(
!
G
){
G
=
r
(
e
).
match
(
P
);
if
(
G
&&
G
[
w
]
==
5
){
var
H
=
G
;
G
=
function
(
a
){
return
cC
(
a
,
+
H
[
1
],
+
H
[
2
],
+
H
[
3
],
+
H
[
4
],
d
)}}
else
G
=
function
(
a
){
return
a
}}
cw
.
push
({
start
:
c
.
start
||+
(
new
Date
),
ms
:
d
,
easing
:
G
,
from
:
i
,
diff
:
l
,
to
:
j
,
el
:
h
,
t
:{
x
:
0
,
y
:
0
}}),
a
.
is
(
g
,
"
function
"
)
&&
(
h
.
_ac
=
setTimeout
(
function
(){
g
.
call
(
h
)},
d
)),
cw
[
w
]
==
1
&&
setTimeout
(
cx
)}
return
this
},
bO
.
stop
=
function
(){
for
(
var
a
=
0
;
a
<
cw
.
length
;
a
++
)
cw
[
a
].
el
.
id
==
this
.
id
&&
cw
.
splice
(
a
--
,
1
);
for
(
a
=
0
,
ii
=
this
.
timeouts
&&
this
.
timeouts
.
length
;
a
<
ii
;
a
++
)
clearTimeout
(
this
.
timeouts
[
a
]);
this
.
timeouts
=
[],
clearTimeout
(
this
.
_ac
),
delete
this
.
_ac
;
return
this
},
bO
.
translate
=
function
(
a
,
b
){
return
this
.
attr
({
translation
:
a
+
"
"
+
b
})},
bO
[
H
]
=
function
(){
return
"
Raphaël’s object
"
},
a
.
ae
=
cw
;
var
cD
=
function
(
a
){
this
.
items
=
[],
this
[
w
]
=
0
,
this
.
type
=
"
set
"
;
if
(
a
)
for
(
var
b
=
0
,
c
=
a
[
w
];
b
<
c
;
b
++
)
a
[
b
]
&&
(
a
[
b
].
constructor
==
bN
||
a
[
b
].
constructor
==
cD
)
&&
(
this
[
this
.
items
[
w
]]
=
this
.
items
[
this
.
items
[
w
]]
=
a
[
b
],
this
[
w
]
++
)};
cD
[
e
][
L
]
=
function
(){
var
a
,
b
;
for
(
var
c
=
0
,
d
=
arguments
[
w
];
c
<
d
;
c
++
)
a
=
arguments
[
c
],
a
&&
(
a
.
constructor
==
bN
||
a
.
constructor
==
cD
)
&&
(
b
=
this
.
items
[
w
],
this
[
b
]
=
this
.
items
[
b
]
=
a
,
this
[
w
]
++
);
return
this
},
cD
[
e
].
pop
=
function
(){
delete
this
[
this
[
w
]
--
];
return
this
.
items
.
pop
()};
for
(
var
cE
in
bO
)
bO
[
f
](
cE
)
&&
(
cD
[
e
][
cE
]
=
function
(
a
){
return
function
(){
for
(
var
b
=
0
,
c
=
this
.
items
[
w
];
b
<
c
;
b
++
)
this
.
items
[
b
][
a
][
m
](
this
.
items
[
b
],
arguments
);
return
this
}}(
cE
));
cD
[
e
].
attr
=
function
(
b
,
c
){
if
(
b
&&
a
.
is
(
b
,
G
)
&&
a
.
is
(
b
[
0
],
"
object
"
))
for
(
var
d
=
0
,
e
=
b
[
w
];
d
<
e
;
d
++
)
this
.
items
[
d
].
attr
(
b
[
d
]);
else
for
(
var
f
=
0
,
g
=
this
.
items
[
w
];
f
<
g
;
f
++
)
this
.
items
[
f
].
attr
(
b
,
c
);
return
this
},
cD
[
e
].
animate
=
function
(
b
,
c
,
d
,
e
){(
a
.
is
(
d
,
"
function
"
)
||!
d
)
&&
(
e
=
d
||
null
);
var
f
=
this
.
items
[
w
],
g
=
f
,
h
,
i
=
this
,
j
;
e
&&
(
j
=
function
(){
!--
f
&&
e
.
call
(
i
)}),
d
=
a
.
is
(
d
,
F
)?
d
:
j
,
h
=
this
.
items
[
--
g
].
animate
(
b
,
c
,
d
,
j
);
while
(
g
--
)
this
.
items
[
g
]
&&!
this
.
items
[
g
].
removed
&&
this
.
items
[
g
].
animateWith
(
h
,
b
,
c
,
d
,
j
);
return
this
},
cD
[
e
].
insertAfter
=
function
(
a
){
var
b
=
this
.
items
[
w
];
while
(
b
--
)
this
.
items
[
b
].
insertAfter
(
a
);
return
this
},
cD
[
e
].
getBBox
=
function
(){
var
a
=
[],
b
=
[],
c
=
[],
d
=
[];
for
(
var
e
=
this
.
items
[
w
];
e
--
;){
var
f
=
this
.
items
[
e
].
getBBox
();
a
[
L
](
f
.
x
),
b
[
L
](
f
.
y
),
c
[
L
](
f
.
x
+
f
.
width
),
d
[
L
](
f
.
y
+
f
.
height
)}
a
=
A
[
m
](
0
,
a
),
b
=
A
[
m
](
0
,
b
);
return
{
x
:
a
,
y
:
b
,
width
:
z
[
m
](
0
,
c
)
-
a
,
height
:
z
[
m
](
0
,
d
)
-
b
}},
cD
[
e
].
clone
=
function
(
a
){
a
=
new
cD
;
for
(
var
b
=
0
,
c
=
this
.
items
[
w
];
b
<
c
;
b
++
)
a
[
L
](
this
.
items
[
b
].
clone
());
return
a
},
a
.
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
[
f
](
d
)
&&
(
b
.
face
[
d
]
=
a
.
face
[
d
]);
this
.
fonts
[
c
]?
this
.
fonts
[
c
][
L
](
b
):
this
.
fonts
[
c
]
=
[
b
];
if
(
!
a
.
svg
){
b
.
face
[
"
units-per-em
"
]
=
T
(
a
.
face
[
"
units-per-em
"
],
10
);
for
(
var
e
in
a
.
glyphs
)
if
(
a
.
glyphs
[
f
](
e
)){
var
g
=
a
.
glyphs
[
e
];
b
.
glyphs
[
e
]
=
{
w
:
g
.
w
,
k
:{},
d
:
g
.
d
&&
"
M
"
+
g
.
d
[
Y
](
/
[
mlcxtrv
]
/g
,
function
(
a
){
return
({
l
:
"
L
"
,
c
:
"
C
"
,
x
:
"
z
"
,
t
:
"
m
"
,
r
:
"
l
"
,
v
:
"
c
"
})[
a
]
||
"
M
"
})
+
"
z
"
};
if
(
g
.
k
)
for
(
var
h
in
g
.
k
)
g
[
f
](
h
)
&&
(
b
.
glyphs
[
e
].
k
[
h
]
=
g
.
k
[
h
])}}
return
a
},
k
.
getFont
=
function
(
b
,
c
,
d
,
e
){
e
=
e
||
"
normal
"
,
d
=
d
||
"
normal
"
,
c
=+
c
||
({
normal
:
400
,
bold
:
700
,
lighter
:
300
,
bolder
:
800
})[
c
]
||
400
;
if
(
!!
a
.
fonts
){
var
g
=
a
.
fonts
[
b
];
if
(
!
g
){
var
h
=
new
RegExp
(
"
(^|
\\
s)
"
+
b
[
Y
](
/
[^\w\d\s
+!~.:_-
]
/g
,
p
)
+
"
(
\\
s|$)
"
,
"
i
"
);
for
(
var
i
in
a
.
fonts
)
if
(
a
.
fonts
[
f
](
i
)
&&
h
.
test
(
i
)){
g
=
a
.
fonts
[
i
];
break
}}
var
j
;
if
(
g
)
for
(
var
k
=
0
,
l
=
g
[
w
];
k
<
l
;
k
++
){
j
=
g
[
k
];
if
(
j
.
face
[
"
font-weight
"
]
==
c
&&
(
j
.
face
[
"
font-style
"
]
==
d
||!
j
.
face
[
"
font-style
"
])
&&
j
.
face
[
"
font-stretch
"
]
==
e
)
break
}
return
j
}},
k
.
print
=
function
(
c
,
d
,
e
,
f
,
g
,
h
,
i
){
h
=
h
||
"
middle
"
,
i
=
z
(
A
(
i
||
0
,
1
),
-
1
);
var
j
=
this
.
set
(),
k
=
r
(
e
)[
s
](
p
),
l
=
0
,
m
=
p
,
n
;
a
.
is
(
f
,
e
)
&&
(
f
=
this
.
getFont
(
f
));
if
(
f
){
n
=
(
g
||
16
)
/
f
.
face
[
"
units-per-em
"
];
var
o
=
f
.
face
.
bbox
.
split
(
b
),
q
=+
o
[
0
],
t
=+
o
[
1
]
+
(
h
==
"
baseline
"
?
o
[
3
]
-
o
[
1
]
+
+
f
.
face
.
descent
:(
o
[
3
]
-
o
[
1
])
/
2
);
for
(
var
u
=
0
,
v
=
k
[
w
];
u
<
v
;
u
++
){
var
x
=
u
&&
f
.
glyphs
[
k
[
u
-
1
]]
||
{},
y
=
f
.
glyphs
[
k
[
u
]];
l
+=
u
?(
x
.
w
||
f
.
w
)
+
(
x
.
k
&&
x
.
k
[
k
[
u
]]
||
0
)
+
f
.
w
*
i
:
0
,
y
&&
y
.
d
&&
j
[
L
](
this
.
path
(
y
.
d
).
attr
({
fill
:
"
#000
"
,
stroke
:
"
none
"
,
translation
:[
l
,
0
]}))}
j
.
scale
(
n
,
n
,
q
,
t
).
translate
(
c
-
q
,
d
-
t
)}
return
j
},
a
.
format
=
function
(
b
,
c
){
var
e
=
a
.
is
(
c
,
G
)?[
0
][
n
](
c
):
arguments
;
b
&&
a
.
is
(
b
,
F
)
&&
e
[
w
]
-
1
&&
(
b
=
b
[
Y
](
d
,
function
(
a
,
b
){
return
e
[
++
b
]
==
null
?
p
:
e
[
b
]}));
return
b
||
p
},
a
.
ninja
=
function
(){
i
.
was
?
h
.
Raphael
=
i
.
is
:
delete
Raphael
;
return
a
},
a
.
el
=
bO
,
a
.
st
=
cD
[
e
],
i
.
was
?
h
.
Raphael
=
a
:
Raphael
=
a
})()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment