Compare commits
1903 Commits
release-10
...
release-10
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c25db80cbd | ||
|
|
e33ffbe9aa | ||
|
|
f68bdaa276 | ||
|
|
e804227d6d | ||
|
|
9092d7fc06 | ||
|
|
148920f2f9 | ||
|
|
482fa20364 | ||
|
|
b102201607 | ||
|
|
7909c0874b | ||
|
|
d691f4c38f | ||
|
|
b4adc677fd | ||
|
|
fd66c5a3fb | ||
|
|
364bbc988d | ||
|
|
51722fd225 | ||
|
|
a158b1f85a | ||
|
|
0bb732c60a | ||
|
|
2782127ba8 | ||
|
|
6a80b4caeb | ||
|
|
b2e95b0ee6 | ||
|
|
b262b98e83 | ||
|
|
b52cb34319 | ||
|
|
914ef1e566 | ||
|
|
f832206145 | ||
|
|
46fcdf91b8 | ||
|
|
3c953d5ffd | ||
|
|
6c28570e82 | ||
|
|
acf632e77e | ||
|
|
44c273f531 | ||
|
|
ef09b24f0c | ||
|
|
87bcf40e81 | ||
|
|
3cae48be23 | ||
|
|
ecc65dfa3b | ||
|
|
9be3f2e731 | ||
|
|
44c7b75dbb | ||
|
|
253b0d96d6 | ||
|
|
7fb75c6d82 | ||
|
|
98816bcce0 | ||
|
|
067e43c0d3 | ||
|
|
a956d602f9 | ||
|
|
9cf6ccc73c | ||
|
|
b3b9f355c3 | ||
|
|
b2d2b1360c | ||
|
|
af7f626a43 | ||
|
|
5568d945a7 | ||
|
|
4dc5535a02 | ||
|
|
b6f5435750 | ||
|
|
8db63ab520 | ||
|
|
527c5fb43e | ||
|
|
9ef4e95467 | ||
|
|
9a4d992c7c | ||
|
|
430c44dc55 | ||
|
|
24ea7fb086 | ||
|
|
73df9a0de8 | ||
|
|
108c36c359 | ||
|
|
1eaaa0fbab | ||
|
|
ef0df64357 | ||
|
|
a2a04dc6b0 | ||
|
|
f63f8543fa | ||
|
|
bc2305696e | ||
|
|
ea74e16ef6 | ||
|
|
2a99df8365 | ||
|
|
75bbd4c8ba | ||
|
|
feacdcd1aa | ||
|
|
9576cd61e0 | ||
|
|
acd9fe92b8 | ||
|
|
dcaa87e4cb | ||
|
|
45353d2e26 | ||
|
|
9bf8731a59 | ||
|
|
7cb83755e6 | ||
|
|
137acb23a8 | ||
|
|
a76583de60 | ||
|
|
e89d3e8cce | ||
|
|
f3f50ab6fa | ||
|
|
156d571bd6 | ||
|
|
d4cef1cf4e | ||
|
|
6dd0d3b361 | ||
|
|
45db8f6e70 | ||
|
|
ae35618875 | ||
|
|
cb3efea457 | ||
|
|
df19087f7c | ||
|
|
94da80c494 | ||
|
|
cd33c8c52c | ||
|
|
ef624fb6f7 | ||
|
|
0a542d5a62 | ||
|
|
c8cb5c2de3 | ||
|
|
21a3db2374 | ||
|
|
da9c811350 | ||
|
|
67554037db | ||
|
|
62f5d40cc0 | ||
|
|
40f6ad3040 | ||
|
|
ea8007428e | ||
|
|
ac255e0593 | ||
|
|
acea76b450 | ||
|
|
1bcd33e011 | ||
|
|
4e9a2e2064 | ||
|
|
2aa07e1a37 | ||
|
|
a80f5e50e7 | ||
|
|
36e5f23266 | ||
|
|
0a9f26b141 | ||
|
|
2b817073d8 | ||
|
|
36a26e698d | ||
|
|
2915de6e0e | ||
|
|
5838fc7da0 | ||
|
|
4dd09a0586 | ||
|
|
d2e2f83e14 | ||
|
|
44e8e462a1 | ||
|
|
af8088d25b | ||
|
|
4d66c53263 | ||
|
|
a44a9c0d7a | ||
|
|
9e459e3a29 | ||
|
|
7f019dfffb | ||
|
|
4cedbc1c89 | ||
|
|
c8836c61f3 | ||
|
|
f094b68159 | ||
|
|
15425175fc | ||
|
|
3d4590b292 | ||
|
|
e7fa3eae9d | ||
|
|
318dbd9da1 | ||
|
|
264e0163ff | ||
|
|
5f5b0185b5 | ||
|
|
8a69092106 | ||
|
|
9162f53b98 | ||
|
|
1f6c140413 | ||
|
|
1e1b868882 | ||
|
|
7de575b6c5 | ||
|
|
b1d1cee634 | ||
|
|
29232ac727 | ||
|
|
0e6ddc34b4 | ||
|
|
cb55e1a825 | ||
|
|
a98b99850e | ||
|
|
7eee7d0d44 | ||
|
|
42649af9f7 | ||
|
|
36abdf9349 | ||
|
|
3310d5b239 | ||
|
|
ef97bdd9af | ||
|
|
cac592ce13 | ||
|
|
6f35d6696e | ||
|
|
e6034e9bf2 | ||
|
|
57bc5e5ee4 | ||
|
|
94cdd38de1 | ||
|
|
4fdab1e8b6 | ||
|
|
89d340e86f | ||
|
|
d1e482946f | ||
|
|
0b95302e4c | ||
|
|
e5dcd1031a | ||
|
|
c0ac5a3256 | ||
|
|
1f7b41e303 | ||
|
|
9c84b8268f | ||
|
|
440675fbee | ||
|
|
8a200e54af | ||
|
|
04a3505672 | ||
|
|
7e369da67b | ||
|
|
ac50a0b196 | ||
|
|
e5a978feeb | ||
|
|
d0dafcc266 | ||
|
|
1914593eaa | ||
|
|
8cdeaa8190 | ||
|
|
6f0b735b3d | ||
|
|
15ef6bf945 | ||
|
|
c46c6c2203 | ||
|
|
89a5c2d590 | ||
|
|
ee506b82c3 | ||
|
|
f888dcd744 | ||
|
|
33bbd40174 | ||
|
|
ce2fdc9df2 | ||
|
|
6acff39055 | ||
|
|
4c297573f1 | ||
|
|
210e241c77 | ||
|
|
29e7c4775b | ||
|
|
b30469654f | ||
|
|
75ac5ed8b2 | ||
|
|
23c3536ace | ||
|
|
f12e24b1cb | ||
|
|
75b7afd531 | ||
|
|
36224ce5f7 | ||
|
|
45acf52548 | ||
|
|
335dc4eff4 | ||
|
|
fb2fe462df | ||
|
|
f7997d5270 | ||
|
|
8a1c7fb6f0 | ||
|
|
fbf675f919 | ||
|
|
3fd2a2b59d | ||
|
|
c4c3078e06 | ||
|
|
911017a5df | ||
|
|
b3da19a596 | ||
|
|
9091284b78 | ||
|
|
7d558dbc7e | ||
|
|
92cd838633 | ||
|
|
cd1f5512e3 | ||
|
|
494558f7dd | ||
|
|
ac589eb922 | ||
|
|
f60e396908 | ||
|
|
c87c6cb52a | ||
|
|
6924d082f5 | ||
|
|
1540e02146 | ||
|
|
baea3593a5 | ||
|
|
a9be94a803 | ||
|
|
a87c4d97a0 | ||
|
|
4268a01e30 | ||
|
|
5fb2c8bd82 | ||
|
|
6d71fd9772 | ||
|
|
b20bd4d4b9 | ||
|
|
de28101f66 | ||
|
|
25f3be7e70 | ||
|
|
4b99f00552 | ||
|
|
9334e1babe | ||
|
|
a75d37390e | ||
|
|
a26091a165 | ||
|
|
598402d953 | ||
|
|
519ca6ba0b | ||
|
|
ac02fb2d23 | ||
|
|
a57e9c4f40 | ||
|
|
a897460d8b | ||
|
|
c762d32040 | ||
|
|
6de77f364b | ||
|
|
5ff1eb9801 | ||
|
|
bfb2b618ef | ||
|
|
ff914d715e | ||
|
|
10891bf6e2 | ||
|
|
73f625ee02 | ||
|
|
cfafd519e8 | ||
|
|
78a2760092 | ||
|
|
b1065db0af | ||
|
|
b488656814 | ||
|
|
813693fd89 | ||
|
|
99f5818a6c | ||
|
|
f7d383f76a | ||
|
|
a12da2309f | ||
|
|
b377878fd3 | ||
|
|
2d41eb769f | ||
|
|
87a4f39844 | ||
|
|
a1f6db48b1 | ||
|
|
c85e5ec48b | ||
|
|
b3fa02cbc1 | ||
|
|
3b5a63f930 | ||
|
|
6b2faaed8d | ||
|
|
f52075eb26 | ||
|
|
41ea428237 | ||
|
|
9f42297077 | ||
|
|
c3f518a4c4 | ||
|
|
17d931035e | ||
|
|
ac46dbe3ac | ||
|
|
5159d851ca | ||
|
|
fb29a45087 | ||
|
|
af80b62376 | ||
|
|
80c2fe2318 | ||
|
|
805394d9a3 | ||
|
|
bafac46a33 | ||
|
|
4ea3b98c27 | ||
|
|
7e6cbe685c | ||
|
|
4be2aed45c | ||
|
|
2d509e9fb6 | ||
|
|
7e58b448cd | ||
|
|
c3c0f6f3c6 | ||
|
|
2cd1edda3b | ||
|
|
dd5ec11ded | ||
|
|
b8c90dcc7f | ||
|
|
5a1f3c1614 | ||
|
|
5256f98c94 | ||
|
|
e125ad7057 | ||
|
|
a77b281a95 | ||
|
|
62c580f249 | ||
|
|
1eef18c0f1 | ||
|
|
5aae08cab9 | ||
|
|
a68b0baa74 | ||
|
|
bd596777aa | ||
|
|
f1fb59ec26 | ||
|
|
cb48def4ae | ||
|
|
04c5f4bfdd | ||
|
|
485549fedf | ||
|
|
c354e16b52 | ||
|
|
6ad85b3c45 | ||
|
|
07268df35a | ||
|
|
54fdd34f77 | ||
|
|
7a9fbb3edf | ||
|
|
ac9807d93a | ||
|
|
bf2caf5957 | ||
|
|
fb5adbce2d | ||
|
|
a491c6b832 | ||
|
|
bef1747c3f | ||
|
|
479fe2c889 | ||
|
|
df81f33360 | ||
|
|
e12e6731b2 | ||
|
|
e5343cada8 | ||
|
|
2557ec8fd3 | ||
|
|
75fc964b9e | ||
|
|
18aa3e31e0 | ||
|
|
ce959724af | ||
|
|
32663bee2e | ||
|
|
229785b908 | ||
|
|
60f990052f | ||
|
|
a98b961b94 | ||
|
|
23b4dfc8fa | ||
|
|
52ad0febe0 | ||
|
|
a47214bbb9 | ||
|
|
0e506a24b1 | ||
|
|
ad0b67d2f6 | ||
|
|
bb1ba5a29e | ||
|
|
990e0de950 | ||
|
|
c9685d6614 | ||
|
|
dec26f6c0e | ||
|
|
92d14bed85 | ||
|
|
36118b926b | ||
|
|
85a6a444fe | ||
|
|
fe228a867e | ||
|
|
798a679842 | ||
|
|
a0fa065667 | ||
|
|
91c8776fbd | ||
|
|
5e84544c16 | ||
|
|
4c4f8ff800 | ||
|
|
8b1a23a56b | ||
|
|
dc95a76e10 | ||
|
|
f68f3634c0 | ||
|
|
e13e6f38d5 | ||
|
|
c62976845e | ||
|
|
c4824abfb0 | ||
|
|
7faa4dab2b | ||
|
|
417e4bd12e | ||
|
|
6374802309 | ||
|
|
4acd0525dc | ||
|
|
077b682149 | ||
|
|
91631f266d | ||
|
|
c6835f9c41 | ||
|
|
cc84fce75b | ||
|
|
40c7dad241 | ||
|
|
20a20ff9d1 | ||
|
|
c44b94a7b7 | ||
|
|
fe23ede57b | ||
|
|
59b1ec6431 | ||
|
|
0b779d2fb5 | ||
|
|
220bbb50a8 | ||
|
|
1f91034aa9 | ||
|
|
be23d14f48 | ||
|
|
8c81ce4a42 | ||
|
|
b04b52d599 | ||
|
|
0a6de37929 | ||
|
|
7e3609407c | ||
|
|
c78a242f09 | ||
|
|
737c2f29be | ||
|
|
22d1d69a2e | ||
|
|
cb938d55de | ||
|
|
0a4eec4110 | ||
|
|
99dcafa45f | ||
|
|
fbb6e673a8 | ||
|
|
58cb50a2d6 | ||
|
|
1225800e7e | ||
|
|
a9833ba398 | ||
|
|
726a949514 | ||
|
|
4fc39ff94c | ||
|
|
1250c04c38 | ||
|
|
0d0f210c6a | ||
|
|
ec2cad0c8d | ||
|
|
34b7c65090 | ||
|
|
1ece06e12a | ||
|
|
e70628c890 | ||
|
|
5271ad8137 | ||
|
|
6c68d37e99 | ||
|
|
446f10a989 | ||
|
|
68ddf19605 | ||
|
|
4965e31737 | ||
|
|
55d902b71a | ||
|
|
5e47ca1a17 | ||
|
|
0f31f8a261 | ||
|
|
9580732c9f | ||
|
|
07d3e16ff5 | ||
|
|
8b8f84bd42 | ||
|
|
1448ce1199 | ||
|
|
3b82d9f438 | ||
|
|
6902ec9b4c | ||
|
|
8689e4965f | ||
|
|
90bd682334 | ||
|
|
af4e76b4e7 | ||
|
|
f8c544c1cf | ||
|
|
145324a209 | ||
|
|
bf55c427a5 | ||
|
|
3a9de3f709 | ||
|
|
bf4207cc36 | ||
|
|
417e7dae88 | ||
|
|
1619646f0a | ||
|
|
1e202d1271 | ||
|
|
1b23895e81 | ||
|
|
532d73a80b | ||
|
|
ca06c47b55 | ||
|
|
c706a09c53 | ||
|
|
a9ace59451 | ||
|
|
8ac0cde29e | ||
|
|
2b4cf6f5b7 | ||
|
|
ab0a9ef065 | ||
|
|
17f9480188 | ||
|
|
58579c3b27 | ||
|
|
3051f6f067 | ||
|
|
efbfbb822e | ||
|
|
8d02d05441 | ||
|
|
f84411a5b8 | ||
|
|
db1cf86219 | ||
|
|
a8c979ceaf | ||
|
|
5e86eb8431 | ||
|
|
9c92dbcdb4 | ||
|
|
2c44558de2 | ||
|
|
d25ba7c711 | ||
|
|
3b84aef183 | ||
|
|
8a28a65ab9 | ||
|
|
f3a6a27da8 | ||
|
|
a27ebf3fa0 | ||
|
|
c2ffca6d56 | ||
|
|
9c21e92e04 | ||
|
|
5dd2a73f6f | ||
|
|
17f70fcb27 | ||
|
|
ae5bea2a94 | ||
|
|
2e6b2b5f82 | ||
|
|
a72d05db84 | ||
|
|
128dc8598b | ||
|
|
34ef761077 | ||
|
|
f2735dc5a2 | ||
|
|
c9de45e55a | ||
|
|
c4b0c27259 | ||
|
|
e8e47cc457 | ||
|
|
e24bed00e9 | ||
|
|
17514b6d2f | ||
|
|
b273853f0c | ||
|
|
9ef1dfc362 | ||
|
|
3ea1696072 | ||
|
|
f7daecb42d | ||
|
|
d104d03e5c | ||
|
|
65de99f6dd | ||
|
|
6d6cce02af | ||
|
|
d3d482dcac | ||
|
|
b59ab3605e | ||
|
|
19ce553160 | ||
|
|
f2ca10aae9 | ||
|
|
1b45bf1aae | ||
|
|
072118ab65 | ||
|
|
0144192318 | ||
|
|
ccfaf11218 | ||
|
|
b113f25327 | ||
|
|
06f64190e6 | ||
|
|
4bea999849 | ||
|
|
74530fe4d9 | ||
|
|
254c69b2f1 | ||
|
|
51cece9c25 | ||
|
|
9b253c5ff7 | ||
|
|
5de30b9f0f | ||
|
|
9f105c477e | ||
|
|
acfb152cb9 | ||
|
|
16c75e9e5e | ||
|
|
5cb141caa3 | ||
|
|
b06afa3305 | ||
|
|
f2c24921e1 | ||
|
|
1a3037229d | ||
|
|
c60dbbb3ae | ||
|
|
af75183d2a | ||
|
|
3c24afb75e | ||
|
|
261089fb00 | ||
|
|
c1b9a094af | ||
|
|
d989d7b007 | ||
|
|
e3de93dae6 | ||
|
|
d310cbf008 | ||
|
|
4f1ca80515 | ||
|
|
effd0f1a0b | ||
|
|
ae8f3b74c2 | ||
|
|
cdefae3dee | ||
|
|
02c820de5b | ||
|
|
5df8202d7d | ||
|
|
b2c7af194c | ||
|
|
b6e0495a1f | ||
|
|
9df2d1bc37 | ||
|
|
9ac45e140d | ||
|
|
21c68e4598 | ||
|
|
4e030db832 | ||
|
|
28d2985f70 | ||
|
|
86484bc9b4 | ||
|
|
c60eff507b | ||
|
|
cb04a5aa91 | ||
|
|
e85ea5fe1c | ||
|
|
16b6e7e4ed | ||
|
|
ddf7eae55b | ||
|
|
08b4d9aa73 | ||
|
|
4debe9b847 | ||
|
|
aef4fede3c | ||
|
|
3aceb5c1b2 | ||
|
|
df06442518 | ||
|
|
e4c2950bbe | ||
|
|
23c6b5daaf | ||
|
|
7af58a03dd | ||
|
|
3ce568eac8 | ||
|
|
2657d9aeda | ||
|
|
e2ac37996c | ||
|
|
9e1633d583 | ||
|
|
908cda32f1 | ||
|
|
f0b740762e | ||
|
|
807a45505a | ||
|
|
3682d3c222 | ||
|
|
c49f632f62 | ||
|
|
b3558a0dc6 | ||
|
|
6bea97ef0f | ||
|
|
2ee9828d0d | ||
|
|
a06c56d3d0 | ||
|
|
8f8ebc485d | ||
|
|
ec22a1cd90 | ||
|
|
49dd48a3e9 | ||
|
|
a9ca46b6d8 | ||
|
|
ca4e3294e8 | ||
|
|
0b11883451 | ||
|
|
9580124968 | ||
|
|
4b5eb8e063 | ||
|
|
d93c16ea72 | ||
|
|
c96aad1c95 | ||
|
|
8634ae8400 | ||
|
|
1646cac34a | ||
|
|
c53d92accf | ||
|
|
e411ceab5a | ||
|
|
27714cb8fb | ||
|
|
ce79cb6537 | ||
|
|
cc377df8f3 | ||
|
|
ae0040165a | ||
|
|
fafd0d4ea0 | ||
|
|
a896a6bcad | ||
|
|
ea28429cdf | ||
|
|
2a074d10f1 | ||
|
|
c7264691d2 | ||
|
|
870a48e78b | ||
|
|
61719e3ab2 | ||
|
|
c243d00add | ||
|
|
2ac83a43d1 | ||
|
|
0c0853a80a | ||
|
|
f290604615 | ||
|
|
b2e2cf2012 | ||
|
|
8a272313cf | ||
|
|
58c9f71a7d | ||
|
|
04a4ca9a57 | ||
|
|
43ffbed471 | ||
|
|
88cd834a19 | ||
|
|
e3d7040910 | ||
|
|
eef526df2c | ||
|
|
ba8b34cd56 | ||
|
|
2a89f31383 | ||
|
|
ff67afeaa7 | ||
|
|
361d6372b0 | ||
|
|
51d9176d8b | ||
|
|
0ec0326c9d | ||
|
|
1458697bb2 | ||
|
|
ad48356d3d | ||
|
|
1ebf03d21b | ||
|
|
07359c3f1f | ||
|
|
6e8c963c35 | ||
|
|
e3dd871500 | ||
|
|
1f4af044b0 | ||
|
|
5dbbfdd750 | ||
|
|
5446e9a625 | ||
|
|
7b6c923aad | ||
|
|
509497e234 | ||
|
|
7f187b504b | ||
|
|
50b96b0afb | ||
|
|
ae325bd747 | ||
|
|
07c67f0382 | ||
|
|
154a24bdb0 | ||
|
|
9415cdc73c | ||
|
|
6728f5b718 | ||
|
|
709b48a8a8 | ||
|
|
ed777cdea2 | ||
|
|
2c4cc578ca | ||
|
|
f647a1b4c3 | ||
|
|
bee1b9f979 | ||
|
|
3634ae3383 | ||
|
|
0d3a2179da | ||
|
|
a592ac2b1a | ||
|
|
050013d6e8 | ||
|
|
f3426a97a1 | ||
|
|
5a6eb5eeec | ||
|
|
0c9ae31417 | ||
|
|
040b86c74b | ||
|
|
131e982d37 | ||
|
|
a28596dc6f | ||
|
|
e5e2c387d7 | ||
|
|
f05fd60371 | ||
|
|
de82a262df | ||
|
|
f1429d007b | ||
|
|
e706f8bee0 | ||
|
|
474e53cc47 | ||
|
|
4939f2fd60 | ||
|
|
91f5866d35 | ||
|
|
5fb98e950b | ||
|
|
b9b3cc7c2e | ||
|
|
50d6864a68 | ||
|
|
a25e5d7f9b | ||
|
|
633999e528 | ||
|
|
6c56234171 | ||
|
|
519c3ada79 | ||
|
|
d345e32333 | ||
|
|
961e720852 | ||
|
|
5da3367ad3 | ||
|
|
60e64f8a58 | ||
|
|
143cd2bfad | ||
|
|
779e378288 | ||
|
|
361a6acc96 | ||
|
|
736086d068 | ||
|
|
8152c95bfa | ||
|
|
02f6928fcd | ||
|
|
c6177fb7fd | ||
|
|
6a4de9d253 | ||
|
|
7395a23b48 | ||
|
|
894c44d11d | ||
|
|
3ce9162fb5 | ||
|
|
4e1f0477f6 | ||
|
|
ac435adda3 | ||
|
|
cdfd41c0e2 | ||
|
|
af38a136ec | ||
|
|
d9378932d4 | ||
|
|
bdd2002cf4 | ||
|
|
cb14982e16 | ||
|
|
33ed166ec9 | ||
|
|
e1af774665 | ||
|
|
06abc6cee2 | ||
|
|
969d957d5f | ||
|
|
51786e8c84 | ||
|
|
ec6ce5aa14 | ||
|
|
75185f0b23 | ||
|
|
fa31b8140f | ||
|
|
7b4578ec10 | ||
|
|
abb0269f07 | ||
|
|
5b8756addf | ||
|
|
cca897bb15 | ||
|
|
b9ee5c7c24 | ||
|
|
a821b78a8b | ||
|
|
b051caa8a9 | ||
|
|
5a41d706c5 | ||
|
|
c87b0b8263 | ||
|
|
ea68085229 | ||
|
|
1889dad8cc | ||
|
|
80c8ea6a48 | ||
|
|
12da467cfa | ||
|
|
baad6dc4b0 | ||
|
|
53b5f83299 | ||
|
|
4a5088f35e | ||
|
|
01bee79fd0 | ||
|
|
4f9a314606 | ||
|
|
faa6d8e62a | ||
|
|
dbeff55a12 | ||
|
|
95f55c2358 | ||
|
|
f40556f007 | ||
|
|
7a7027b813 | ||
|
|
89cf454e91 | ||
|
|
89b28d76f5 | ||
|
|
db349d860f | ||
|
|
02924e30ac | ||
|
|
ad6e477e7c | ||
|
|
531c673e93 | ||
|
|
0a3f13630b | ||
|
|
1118103a3c | ||
|
|
e6731640f9 | ||
|
|
3dfec6aa9a | ||
|
|
16106145d2 | ||
|
|
9a3bce6cbf | ||
|
|
84abfe4a9c | ||
|
|
5941c914fc | ||
|
|
df74931794 | ||
|
|
927fd4d7e6 | ||
|
|
00469f9577 | ||
|
|
69251cff48 | ||
|
|
040f4af781 | ||
|
|
28dfc698b5 | ||
|
|
442487799a | ||
|
|
5c448bc482 | ||
|
|
5b46f0263a | ||
|
|
11934ba43e | ||
|
|
26096894e0 | ||
|
|
a993bb15da | ||
|
|
7195bbb489 | ||
|
|
2d3c474ab4 | ||
|
|
917e050180 | ||
|
|
88d8c580e5 | ||
|
|
44ca739cba | ||
|
|
8a0da464cd | ||
|
|
5427e5307d | ||
|
|
43e8b33a85 | ||
|
|
e57b747fbc | ||
|
|
7ff79e1139 | ||
|
|
ec8b71fc58 | ||
|
|
07731c8227 | ||
|
|
88bdb57be8 | ||
|
|
15d7a1f66a | ||
|
|
aa3e414ba1 | ||
|
|
19861962af | ||
|
|
3047b12382 | ||
|
|
da87b4a620 | ||
|
|
1922cfe51a | ||
|
|
747bbca7fe | ||
|
|
367f55cf59 | ||
|
|
b8fbd57015 | ||
|
|
83ed8a7d2c | ||
|
|
8d7e749ed8 | ||
|
|
21066f06f0 | ||
|
|
503dbb5767 | ||
|
|
86bf6ab8d2 | ||
|
|
0bd50d67ec | ||
|
|
ac3410abc9 | ||
|
|
1b6f14b1e4 | ||
|
|
4bb2f2f4ea | ||
|
|
ceeca0e0fa | ||
|
|
d963fe5cab | ||
|
|
27ff0e7241 | ||
|
|
0a5660643e | ||
|
|
01776ae86f | ||
|
|
2978e64b9b | ||
|
|
2db6bb4acf | ||
|
|
a02e80a08c | ||
|
|
f805b45229 | ||
|
|
4771e6466e | ||
|
|
bd097773b0 | ||
|
|
d6dc3fe7e4 | ||
|
|
37ca2d683a | ||
|
|
2f4cf8248b | ||
|
|
57c779b4f6 | ||
|
|
8f60d62919 | ||
|
|
a08d142db2 | ||
|
|
a8fd4b6940 | ||
|
|
3a39baa92c | ||
|
|
0d43f336fe | ||
|
|
239d8d795a | ||
|
|
cec0337703 | ||
|
|
6b76dc69d7 | ||
|
|
deff77a21f | ||
|
|
07556fbce8 | ||
|
|
1d7f7ce0c3 | ||
|
|
3d32901470 | ||
|
|
7a9117f136 | ||
|
|
552390a9f9 | ||
|
|
4d48e441fe | ||
|
|
915a6b20c3 | ||
|
|
8c8e9df22f | ||
|
|
baf7d31c55 | ||
|
|
74b6e7b78b | ||
|
|
34b155cbae | ||
|
|
4610398cb5 | ||
|
|
a5f09cdfd8 | ||
|
|
47817d230f | ||
|
|
9ecbc46517 | ||
|
|
115d267c51 | ||
|
|
492d668ad3 | ||
|
|
2a80c9c593 | ||
|
|
fef18d9648 | ||
|
|
549482896f | ||
|
|
e9d09e9552 | ||
|
|
4a09a7df16 | ||
|
|
8188e6f380 | ||
|
|
6e39a97bf2 | ||
|
|
a73da9f46b | ||
|
|
0600fb26a3 | ||
|
|
d2f478b200 | ||
|
|
ad91c897d7 | ||
|
|
f693800fe0 | ||
|
|
f1c65a01b6 | ||
|
|
8ff600eaec | ||
|
|
725dfdd0a1 | ||
|
|
3a57ffb860 | ||
|
|
b1f212676f | ||
|
|
d5a3699fed | ||
|
|
e6fa1b2e31 | ||
|
|
8130549900 | ||
|
|
a6d1a6358d | ||
|
|
b2b67b81ef | ||
|
|
97e80101d0 | ||
|
|
a5ec665cfa | ||
|
|
f92c05b9d3 | ||
|
|
ac9fece8cc | ||
|
|
4e72a857c4 | ||
|
|
e0d6686bb4 | ||
|
|
019d3730df | ||
|
|
93e2aa2d3f | ||
|
|
e23d834608 | ||
|
|
f0ef911e61 | ||
|
|
1897818a39 | ||
|
|
4acf4f071e | ||
|
|
bbf1f8d5df | ||
|
|
29d6835415 | ||
|
|
be15a9d7a2 | ||
|
|
73a9672c4b | ||
|
|
253e8f5f80 | ||
|
|
e1b8f9837e | ||
|
|
83edce20aa | ||
|
|
6f165eab15 | ||
|
|
b56cc14a1b | ||
|
|
ecf0ee0c34 | ||
|
|
01259f401e | ||
|
|
2e5656aeea | ||
|
|
a87be24b8b | ||
|
|
2ade13e07c | ||
|
|
d08cd4d1cd | ||
|
|
6b4d1a6b92 | ||
|
|
509af1a0c3 | ||
|
|
89b1fd7ce0 | ||
|
|
fc871b31fd | ||
|
|
193e0681f2 | ||
|
|
e21babea0b | ||
|
|
1be3b13ba0 | ||
|
|
5d4b9abe5f | ||
|
|
957ccc2eaf | ||
|
|
5cb1de5f22 | ||
|
|
1da1e34526 | ||
|
|
2afe6a2f05 | ||
|
|
ac914047a5 | ||
|
|
8192c6dc44 | ||
|
|
0f8a059c05 | ||
|
|
2b12a86cd9 | ||
|
|
144164cd2a | ||
|
|
0930ec67a2 | ||
|
|
c58d79b61b | ||
|
|
92a19f2c98 | ||
|
|
fb8fd901b2 | ||
|
|
8423c8ec38 | ||
|
|
48d308a7b2 | ||
|
|
10ed4b85f9 | ||
|
|
4a687380ac | ||
|
|
7f2cc73e63 | ||
|
|
e84753827c | ||
|
|
5e3b2a642d | ||
|
|
77fd191d99 | ||
|
|
8e9b094d4b | ||
|
|
f7f83f08d4 | ||
|
|
1fdb0a8c56 | ||
|
|
f3f64585e4 | ||
|
|
7c66d51a64 | ||
|
|
05a200915e | ||
|
|
bf801f1800 | ||
|
|
cef7186000 | ||
|
|
fc7c666653 | ||
|
|
e043edc912 | ||
|
|
d9757956a3 | ||
|
|
dfe0b86495 | ||
|
|
36f60d5923 | ||
|
|
935cdfceea | ||
|
|
a1f45f8e77 | ||
|
|
d118bd4a6d | ||
|
|
7833ac7e39 | ||
|
|
d111e8cf4d | ||
|
|
4f71cc1814 | ||
|
|
ab68bacef3 | ||
|
|
7e9a3477d8 | ||
|
|
cbb9ee7d26 | ||
|
|
bc748df41e | ||
|
|
2cb4d7be96 | ||
|
|
547dbf5d67 | ||
|
|
afeaaba873 | ||
|
|
cac136fecc | ||
|
|
7f2f10a595 | ||
|
|
07994e0a40 | ||
|
|
4bf12b1682 | ||
|
|
30ca4a3290 | ||
|
|
9489ad7134 | ||
|
|
bff5918c85 | ||
|
|
f036ccc674 | ||
|
|
758477f1ae | ||
|
|
3aad09c5fd | ||
|
|
34c0d6019e | ||
|
|
a612fdf87c | ||
|
|
a0aa88f206 | ||
|
|
953f54ec67 | ||
|
|
9730911a01 | ||
|
|
180e47af8e | ||
|
|
934517add3 | ||
|
|
4382149f83 | ||
|
|
6fd23f14f6 | ||
|
|
5eabf926ea | ||
|
|
b24bcd9127 | ||
|
|
1f48ae3b2d | ||
|
|
18b0c5f92b | ||
|
|
2676fc3f38 | ||
|
|
34579f1db5 | ||
|
|
8a8ca1aebc | ||
|
|
c591809a84 | ||
|
|
fccc86c80c | ||
|
|
b681ab4e72 | ||
|
|
585aa3ad82 | ||
|
|
142d309ac0 | ||
|
|
39f102e2da | ||
|
|
8e1cf00909 | ||
|
|
2ffe9e5418 | ||
|
|
5fe2908d74 | ||
|
|
88f37eaa25 | ||
|
|
43500b10b3 | ||
|
|
c820976680 | ||
|
|
2115bd9355 | ||
|
|
62594b246f | ||
|
|
1ec42f9759 | ||
|
|
cad75511eb | ||
|
|
0608870c29 | ||
|
|
e18d49556e | ||
|
|
4e683c4fca | ||
|
|
e108997376 | ||
|
|
5badb22aa3 | ||
|
|
abb2433b0b | ||
|
|
aa8fb992aa | ||
|
|
9cc20ebc4c | ||
|
|
af79d6fd69 | ||
|
|
e09f868d99 | ||
|
|
156f162d2e | ||
|
|
08b00ac385 | ||
|
|
dbbe5809e1 | ||
|
|
a2734a34bc | ||
|
|
7f292093eb | ||
|
|
67e289d363 | ||
|
|
b0d4b94140 | ||
|
|
aca0fb09bc | ||
|
|
7b61b5d2e0 | ||
|
|
e376ddff08 | ||
|
|
867a9b3a58 | ||
|
|
6a16d84e71 | ||
|
|
03b608490f | ||
|
|
909156711c | ||
|
|
398b399ec6 | ||
|
|
8fd766ccb2 | ||
|
|
d7d196bc38 | ||
|
|
61b94914b3 | ||
|
|
ea2f4b08ba | ||
|
|
a285fbc7e1 | ||
|
|
bcb799593d | ||
|
|
832e8c00e7 | ||
|
|
11c4aeffdb | ||
|
|
ca1c05eeee | ||
|
|
ed59c25c1b | ||
|
|
23028abe4c | ||
|
|
d544877050 | ||
|
|
7ab2676093 | ||
|
|
eebeb24db2 | ||
|
|
a177940c3e | ||
|
|
8394fa59b7 | ||
|
|
5f41eef198 | ||
|
|
44ec998690 | ||
|
|
ba8949aa36 | ||
|
|
f8ccbcc5c7 | ||
|
|
b67e31791d | ||
|
|
b35a6e17eb | ||
|
|
3b1ff61ea3 | ||
|
|
9599273f00 | ||
|
|
e3fbfbeeff | ||
|
|
21321a8d8e | ||
|
|
89465d2c82 | ||
|
|
38e4c75a86 | ||
|
|
595067e98e | ||
|
|
7c4810974f | ||
|
|
fa6a90f0f4 | ||
|
|
50ca98b2a2 | ||
|
|
900f92d7e0 | ||
|
|
69b90fa9cb | ||
|
|
f32e3dfcf9 | ||
|
|
375934ed13 | ||
|
|
5a5bb04559 | ||
|
|
6c84f3c845 | ||
|
|
c7064d1786 | ||
|
|
cf4bb3ef98 | ||
|
|
cedaa66bf8 | ||
|
|
396652d31b | ||
|
|
6fc86211c6 | ||
|
|
ec2e153f9c | ||
|
|
4a0cfb5be9 | ||
|
|
e896716011 | ||
|
|
a000b17bcd | ||
|
|
ef18ab4a72 | ||
|
|
61ce341e6f | ||
|
|
eb92a68568 | ||
|
|
7abe22780b | ||
|
|
5e4cc4f258 | ||
|
|
e1009d3d67 | ||
|
|
0821d0ad9e | ||
|
|
78fd41ef05 | ||
|
|
ecc3b17aca | ||
|
|
7be7e9fd67 | ||
|
|
d709bb9104 | ||
|
|
e3ce8a1e1a | ||
|
|
358b4825e1 | ||
|
|
81b78035c0 | ||
|
|
ecabb4cf65 | ||
|
|
7afdc4b2b1 | ||
|
|
06b42973f4 | ||
|
|
cff7f3b9cb | ||
|
|
eb8eb50a8a | ||
|
|
906442fba0 | ||
|
|
59e9be84dd | ||
|
|
953ac77e4d | ||
|
|
f444c6c910 | ||
|
|
7af9af26d5 | ||
|
|
0eddf1317c | ||
|
|
be886982a2 | ||
|
|
bf6b621337 | ||
|
|
1a63de77e1 | ||
|
|
f28074fb9e | ||
|
|
bcf79b2d57 | ||
|
|
1f2d8ecc13 | ||
|
|
c677708819 | ||
|
|
3752db775b | ||
|
|
1d045d172b | ||
|
|
1d0e56c0ae | ||
|
|
29a8f95b74 | ||
|
|
fc5f4f674b | ||
|
|
01d84c2077 | ||
|
|
a9c1425ddd | ||
|
|
e3c21d56d5 | ||
|
|
04ce2744eb | ||
|
|
175c7ed252 | ||
|
|
1fb7e6c839 | ||
|
|
ed06b15afd | ||
|
|
9b71211a10 | ||
|
|
c97089b52c | ||
|
|
81fe0b47f3 | ||
|
|
d4a8bc9f37 | ||
|
|
54fb804459 | ||
|
|
4441c32c4b | ||
|
|
615b814cd9 | ||
|
|
a93a8c2a54 | ||
|
|
bad156654b | ||
|
|
6068ac02ff | ||
|
|
080b3365d6 | ||
|
|
79cd6a7552 | ||
|
|
5af72d6c9f | ||
|
|
515fcab3e3 | ||
|
|
acc132cc6c | ||
|
|
016eb79885 | ||
|
|
3f913bcd29 | ||
|
|
b7b34cba15 | ||
|
|
34474aea01 | ||
|
|
3d26136c5d | ||
|
|
b77143797c | ||
|
|
3f52ec10a0 | ||
|
|
dca0700770 | ||
|
|
38ac5766c8 | ||
|
|
3739741786 | ||
|
|
092a8fd3e0 | ||
|
|
347a0e1910 | ||
|
|
0b0ea7f406 | ||
|
|
cd63b5ef3a | ||
|
|
72c2be06ae | ||
|
|
ba22a1ecef | ||
|
|
8a360772a2 | ||
|
|
58b09ca999 | ||
|
|
a37e0fb47a | ||
|
|
1690ffb86d | ||
|
|
21b942cf39 | ||
|
|
d74939f754 | ||
|
|
b3df632164 | ||
|
|
e86058dc8c | ||
|
|
90f565166e | ||
|
|
0502e984ad | ||
|
|
fe87abc5a8 | ||
|
|
c0fbce32ce | ||
|
|
cbd64f6b4e | ||
|
|
c0783dbe8e | ||
|
|
f7fd716f50 | ||
|
|
16feba6dff | ||
|
|
3a6275a05c | ||
|
|
e05e635b44 | ||
|
|
e8875f8362 | ||
|
|
f1cce1ad76 | ||
|
|
5453881ea1 | ||
|
|
3419230e89 | ||
|
|
800137886c | ||
|
|
c1b866d9c9 | ||
|
|
1da8876811 | ||
|
|
10a572661a | ||
|
|
647f403f08 | ||
|
|
beedbca92c | ||
|
|
957184b81c | ||
|
|
cb61fa699f | ||
|
|
6348367711 | ||
|
|
d869a24286 | ||
|
|
d65011449b | ||
|
|
3283bf2393 | ||
|
|
b19d45d2f9 | ||
|
|
b5840abc46 | ||
|
|
d64cd25482 | ||
|
|
496ee55a3a | ||
|
|
109ea9e50c | ||
|
|
22d0a5705d | ||
|
|
e907350700 | ||
|
|
472d391641 | ||
|
|
e588edbcca | ||
|
|
3962dcf58e | ||
|
|
7a10be5933 | ||
|
|
b004915f96 | ||
|
|
11b6e83d69 | ||
|
|
475af6a0da | ||
|
|
ff2b27b32b | ||
|
|
cdfa115ec0 | ||
|
|
88db651eea | ||
|
|
ce62c58b08 | ||
|
|
8df85172cb | ||
|
|
e090b78d66 | ||
|
|
4b869a41c6 | ||
|
|
6ad9e090f6 | ||
|
|
17ea143b6b | ||
|
|
ad8fe23ef8 | ||
|
|
ffd3886372 | ||
|
|
b124427039 | ||
|
|
105891b409 | ||
|
|
d11e93b0da | ||
|
|
9c47f8fc1c | ||
|
|
d260cf5390 | ||
|
|
3896c18e26 | ||
|
|
33f016bb09 | ||
|
|
0880f36dab | ||
|
|
321da7ae3e | ||
|
|
c10f3feb31 | ||
|
|
863eb067c2 | ||
|
|
af2b49ac30 | ||
|
|
77a8828018 | ||
|
|
3a4892d71f | ||
|
|
23677db990 | ||
|
|
dd109c3324 | ||
|
|
d536866ed5 | ||
|
|
faa1a263b9 | ||
|
|
d3c3501632 | ||
|
|
f98a43f06f | ||
|
|
536e44c495 | ||
|
|
cf6c077b93 | ||
|
|
09227c8e84 | ||
|
|
230424b321 | ||
|
|
ef546edf89 | ||
|
|
bdc6796184 | ||
|
|
aecd2a5b27 | ||
|
|
643a7289b4 | ||
|
|
79266230f9 | ||
|
|
a944bc62ef | ||
|
|
4cb0cd5f95 | ||
|
|
2124bbbdaa | ||
|
|
71c148fc01 | ||
|
|
f6a8b81959 | ||
|
|
365240e17a | ||
|
|
a9b439e458 | ||
|
|
ee0b3f9ce9 | ||
|
|
e7023dd51a | ||
|
|
0b13b0328a | ||
|
|
d20b1fed68 | ||
|
|
1927c2eb9b | ||
|
|
1abc7283ab | ||
|
|
5eb28e69d0 | ||
|
|
96bed86736 | ||
|
|
2498014aac | ||
|
|
d916dd7268 | ||
|
|
54de766bb7 | ||
|
|
99c8134b1a | ||
|
|
1c84e18c8a | ||
|
|
1e5568943c | ||
|
|
651a53d64a | ||
|
|
f64c1c08a3 | ||
|
|
c565c9015b | ||
|
|
e89a45e887 | ||
|
|
5bd7b3d0dd | ||
|
|
3ad7993d13 | ||
|
|
ee1149644d | ||
|
|
47b8c2bcb3 | ||
|
|
2542339e42 | ||
|
|
aca1fca0c2 | ||
|
|
effd80caa2 | ||
|
|
c30e6b56a3 | ||
|
|
608a3e3200 | ||
|
|
f6eedbb221 | ||
|
|
82fdc6fc33 | ||
|
|
a36663da43 | ||
|
|
fdb7c99ed4 | ||
|
|
0d8bc6fb46 | ||
|
|
1a2019bb0e | ||
|
|
d2b796e3cd | ||
|
|
fe8155c226 | ||
|
|
ab7d3b16e6 | ||
|
|
6eed80c863 | ||
|
|
3f3e5e6da5 | ||
|
|
5eb6a4b5ba | ||
|
|
d5464834c4 | ||
|
|
6208f2b1c3 | ||
|
|
5a4498dca1 | ||
|
|
c1d88b1540 | ||
|
|
f547188775 | ||
|
|
a5e71664ba | ||
|
|
4999690d0c | ||
|
|
5099c95c22 | ||
|
|
e8af133ed2 | ||
|
|
08f249b007 | ||
|
|
b6db366d0e | ||
|
|
529e9102cd | ||
|
|
78576a7cb2 | ||
|
|
639637956e | ||
|
|
4abfc56fa8 | ||
|
|
5461d81275 | ||
|
|
21a794d845 | ||
|
|
437aa60c4b | ||
|
|
eaeccec0c9 | ||
|
|
363b81c16b | ||
|
|
9063e153c1 | ||
|
|
9538478814 | ||
|
|
223945bd36 | ||
|
|
1e3b03dde1 | ||
|
|
df720d2d14 | ||
|
|
5d23c354d2 | ||
|
|
d09da51477 | ||
|
|
9207ece95f | ||
|
|
9954eec88d | ||
|
|
c7284dba87 | ||
|
|
1d2744d7b9 | ||
|
|
0e6c54ecc2 | ||
|
|
a1538a4ba6 | ||
|
|
79cd65ea82 | ||
|
|
0299223b81 | ||
|
|
d4862df266 | ||
|
|
ba5623e32c | ||
|
|
b16534ba0a | ||
|
|
36fae11a38 | ||
|
|
e3d8b14245 | ||
|
|
d30ca44997 | ||
|
|
a971c33b1e | ||
|
|
66f3de495b | ||
|
|
5ce69ae514 | ||
|
|
011fe01fd6 | ||
|
|
e2e8114bc8 | ||
|
|
90f711c723 | ||
|
|
461a91890d | ||
|
|
e538a6d62c | ||
|
|
1d1042513f | ||
|
|
f6617cb28c | ||
|
|
e3cb0db53a | ||
|
|
bccb1e6147 | ||
|
|
6bf18d80e0 | ||
|
|
8bdb6d795e | ||
|
|
b51a3fb497 | ||
|
|
19ff6ae97a | ||
|
|
155ad2c6d2 | ||
|
|
697c652f7c | ||
|
|
1ec2c59e87 | ||
|
|
d5c91f872b | ||
|
|
bc44aa5604 | ||
|
|
4185456863 | ||
|
|
63f804df32 | ||
|
|
adf7b1ae0c | ||
|
|
877fd6a809 | ||
|
|
1d5c7173d9 | ||
|
|
b853ea169d | ||
|
|
03a16287a0 | ||
|
|
af3579f328 | ||
|
|
d467499a7a | ||
|
|
029e015068 | ||
|
|
bedd206df9 | ||
|
|
b4e5e4cb15 | ||
|
|
2c111d2a59 | ||
|
|
07aa20a2f7 | ||
|
|
08ae592e0b | ||
|
|
72cb4bd169 | ||
|
|
cae2898da2 | ||
|
|
f86d2d47ac | ||
|
|
3957592f31 | ||
|
|
0f268a4413 | ||
|
|
c750ba55b4 | ||
|
|
2e4591b9ae | ||
|
|
29086a19c7 | ||
|
|
3558ca28ef | ||
|
|
0980707826 | ||
|
|
352573e5a6 | ||
|
|
7aa5d28510 | ||
|
|
8496b3d1f5 | ||
|
|
3b7facd073 | ||
|
|
b725d137a0 | ||
|
|
61897f15e2 | ||
|
|
6eb8e1b8fa | ||
|
|
0e306cad76 | ||
|
|
e7570d856f | ||
|
|
930727eb28 | ||
|
|
7616b1cd35 | ||
|
|
95c682482e | ||
|
|
9fd2933f25 | ||
|
|
37e2cc8746 | ||
|
|
307e664286 | ||
|
|
678b558935 | ||
|
|
5ebf1bda80 | ||
|
|
e0cf014197 | ||
|
|
e192f1f3c6 | ||
|
|
c94e970ac0 | ||
|
|
f9b6b10ef4 | ||
|
|
3464b847a6 | ||
|
|
fe08645a98 | ||
|
|
5bed7bbf35 | ||
|
|
850c2c4baf | ||
|
|
f5e62cbd65 | ||
|
|
44ba92261d | ||
|
|
ecccf00fcb | ||
|
|
f7c8d7b044 | ||
|
|
40e4f6a27a | ||
|
|
af8d421a8c | ||
|
|
40b8a0d881 | ||
|
|
264f07a604 | ||
|
|
e0711335aa | ||
|
|
1fd13b16b3 | ||
|
|
27944af119 | ||
|
|
8a01f41e4c | ||
|
|
87661308a5 | ||
|
|
ad8741f9e7 | ||
|
|
05327879d6 | ||
|
|
bda4d9e00e | ||
|
|
a92aae3a43 | ||
|
|
5619295646 | ||
|
|
591a1d3baa | ||
|
|
97cdd43019 | ||
|
|
f7d1c9fb1b | ||
|
|
c34ecdc9a7 | ||
|
|
8bb9e26526 | ||
|
|
8d112f3eec | ||
|
|
24d4b80b43 | ||
|
|
51cea78c98 | ||
|
|
2477c8343c | ||
|
|
28380365b4 | ||
|
|
01f09eaa77 | ||
|
|
c407350d7a | ||
|
|
d3cdf32b32 | ||
|
|
b19d3cfc0e | ||
|
|
586bce429d | ||
|
|
e7e1fd279b | ||
|
|
4b6ea2d087 | ||
|
|
0c1c855eb8 | ||
|
|
a260e33182 | ||
|
|
c36a916e20 | ||
|
|
0e752f0e45 | ||
|
|
b4da29b815 | ||
|
|
60f560f65b | ||
|
|
dc09a3dd9d | ||
|
|
b5e36e6f73 | ||
|
|
0fb8ef23b0 | ||
|
|
76ac8c4dfc | ||
|
|
cb6920c51f | ||
|
|
2572de460b | ||
|
|
716ac36031 | ||
|
|
dc6f7dcb8f | ||
|
|
ac4c7c7b71 | ||
|
|
e7610b0e4a | ||
|
|
9bb5fe0f0b | ||
|
|
02a23ffaee | ||
|
|
bbc5a5f491 | ||
|
|
1a85c16e89 | ||
|
|
7e19600a2b | ||
|
|
1d5f6effa9 | ||
|
|
832c1d8308 | ||
|
|
3bf97ce66e | ||
|
|
0a6e8feb40 | ||
|
|
166d0df0b4 | ||
|
|
8c446624d7 | ||
|
|
6c22fab547 | ||
|
|
1a3b954882 | ||
|
|
65dbd1991f | ||
|
|
59686f28b3 | ||
|
|
6c566847db | ||
|
|
5d6e6c5db9 | ||
|
|
350463a1e7 | ||
|
|
7d0f971fe7 | ||
|
|
d975b1743f | ||
|
|
62803bac5d | ||
|
|
cc468aeac3 | ||
|
|
c5f7f6d5c0 | ||
|
|
6facb1b646 | ||
|
|
c679336b87 | ||
|
|
0286cc60d5 | ||
|
|
bcb13acccd | ||
|
|
c77803af89 | ||
|
|
714773fe83 | ||
|
|
0e2163b396 | ||
|
|
4c3af5b9dd | ||
|
|
76ec5e088b | ||
|
|
3f1fd61e9c | ||
|
|
0e9d890409 | ||
|
|
bc30e5a626 | ||
|
|
0a26243e9a | ||
|
|
3317c09e1c | ||
|
|
306004a2db | ||
|
|
74abce4354 | ||
|
|
5974c511f9 | ||
|
|
4ab84e369b | ||
|
|
61639af3f7 | ||
|
|
ff9a0ba4e7 | ||
|
|
b95f894a7a | ||
|
|
545efb1b57 | ||
|
|
20c23dc728 | ||
|
|
c22da5a4ab | ||
|
|
865e196b40 | ||
|
|
86984972e8 | ||
|
|
a272a6fcd5 | ||
|
|
cac028eb6a | ||
|
|
3b3f230eff | ||
|
|
2c9fe360a6 | ||
|
|
5cb4c195d7 | ||
|
|
0c337e11a6 | ||
|
|
ff68a0d550 | ||
|
|
98e83600dc | ||
|
|
110b148c55 | ||
|
|
e4f7e95f46 | ||
|
|
13f65932d4 | ||
|
|
e6f55c4eca | ||
|
|
d2984b7abd | ||
|
|
df82636845 | ||
|
|
b06e9b5842 | ||
|
|
a2bde879aa | ||
|
|
a12954f4f9 | ||
|
|
75195a4846 | ||
|
|
c5e008a73a | ||
|
|
e62b7f2e3d | ||
|
|
09e38ca931 | ||
|
|
81e98409d0 | ||
|
|
2d917f3807 | ||
|
|
db8410602a | ||
|
|
4bb18b02e5 | ||
|
|
aca14802e0 | ||
|
|
6bef3fc63e | ||
|
|
97a5f84ced | ||
|
|
51bbe65262 | ||
|
|
b2a2b03b37 | ||
|
|
f8c018b77e | ||
|
|
4196e279ea | ||
|
|
e2cc98c7a4 | ||
|
|
5104aabead | ||
|
|
1f0f1dc1b3 | ||
|
|
ed956f8eba | ||
|
|
ba0d637f91 | ||
|
|
9ab6756e39 | ||
|
|
0aca394e1e | ||
|
|
26644c06c4 | ||
|
|
5a802c35b8 | ||
|
|
81bc57678b | ||
|
|
d555840384 | ||
|
|
100ca5ba45 | ||
|
|
7f6d97d0d5 | ||
|
|
c2a0de8202 | ||
|
|
54ca2e9381 | ||
|
|
52136b57a2 | ||
|
|
e9e9b4bca9 | ||
|
|
4f084bad1c | ||
|
|
f2123d03cc | ||
|
|
fdbdaa1982 | ||
|
|
f7d5d4480d | ||
|
|
8ee530c0ec | ||
|
|
f8d894b269 | ||
|
|
ebbd3f11ab | ||
|
|
1a9432b642 | ||
|
|
2240edce26 | ||
|
|
ffe4087f0a | ||
|
|
f1ba5c63c0 | ||
|
|
a640781d4e | ||
|
|
76ddb4d55f | ||
|
|
27f39e39c4 | ||
|
|
9956084443 | ||
|
|
2690381144 | ||
|
|
a1c66f31fc | ||
|
|
ed34530b1e | ||
|
|
120b3106aa | ||
|
|
3226ad47a5 | ||
|
|
e46ddedf0c | ||
|
|
db7e016aa7 | ||
|
|
266aac4364 | ||
|
|
0c22b76035 | ||
|
|
476eaff384 | ||
|
|
a28270bdd3 | ||
|
|
9e0d13ebaf | ||
|
|
96584b5786 | ||
|
|
2f0683f826 | ||
|
|
57d87caaeb | ||
|
|
1379477723 | ||
|
|
342267cf92 | ||
|
|
644d4ac062 | ||
|
|
85f9e79e4b | ||
|
|
2e44bc4ef8 | ||
|
|
8c2f56394f | ||
|
|
ea86b3f9e7 | ||
|
|
5f9a499c98 | ||
|
|
e9d2c73c5e | ||
|
|
a61ef5bf30 | ||
|
|
742354baee | ||
|
|
e4e315b1e0 | ||
|
|
7a904bb363 | ||
|
|
3b0a2f4caa | ||
|
|
e8ae9b3605 | ||
|
|
f862838458 | ||
|
|
1be3a7f205 | ||
|
|
86df74ad52 | ||
|
|
cfb82dd161 | ||
|
|
20923d5ab8 | ||
|
|
b4a5794573 | ||
|
|
baa87d2dfb | ||
|
|
a4dabc1644 | ||
|
|
295d6e32a3 | ||
|
|
df2ae88a72 | ||
|
|
0d17fcdfeb | ||
|
|
6d3c617c28 | ||
|
|
babb4f1028 | ||
|
|
d53a095728 | ||
|
|
a7dfb236d0 | ||
|
|
1dec316dc2 | ||
|
|
ebd8ab08d5 | ||
|
|
505cda6f76 | ||
|
|
867a5e664c | ||
|
|
6d345343df | ||
|
|
c184bc6833 | ||
|
|
8a0c268973 | ||
|
|
a8f904dc42 | ||
|
|
63cc1e0860 | ||
|
|
2ffbc14cd7 | ||
|
|
101d0b1139 | ||
|
|
42c8ef6262 | ||
|
|
af49586b1b | ||
|
|
75729ed7d2 | ||
|
|
b58473b366 | ||
|
|
046deb4a50 | ||
|
|
92a847dfc1 | ||
|
|
7ad0958d83 | ||
|
|
c8f392bdd4 | ||
|
|
7d585fde1b | ||
|
|
0ea9faee08 | ||
|
|
437729d3f3 | ||
|
|
f72d26b9da | ||
|
|
099b028978 | ||
|
|
c2cfc1d1d3 | ||
|
|
5bb480eace | ||
|
|
a653ba5308 | ||
|
|
93ee8b4afa | ||
|
|
1c5b428e56 | ||
|
|
2c579b4942 | ||
|
|
bd0bfc1c48 | ||
|
|
54093fd90a | ||
|
|
ae0d2107cd | ||
|
|
5d2c0402f1 | ||
|
|
a6db774318 | ||
|
|
b326b4be31 | ||
|
|
61f5a649ff | ||
|
|
76923c3dc9 | ||
|
|
8f956658d4 | ||
|
|
ee46631d00 | ||
|
|
6b32af12da | ||
|
|
569d6456b1 | ||
|
|
cb1d56defb | ||
|
|
5fda5a8738 | ||
|
|
c46f577f08 | ||
|
|
9177456f64 | ||
|
|
20573a8086 | ||
|
|
cdacc0175e | ||
|
|
017bc94506 | ||
|
|
6978a9d9df | ||
|
|
8bec0ad63d | ||
|
|
cfb67bb5d1 | ||
|
|
a9982263b0 | ||
|
|
40cc2fbd0c | ||
|
|
29c077d2cb | ||
|
|
e20f7e02ea | ||
|
|
0b6369fdcb | ||
|
|
cf352b6af2 | ||
|
|
5a0da2f815 | ||
|
|
5ce7310a8e | ||
|
|
1fa5a2158d | ||
|
|
8101dac3d4 | ||
|
|
fe40316927 | ||
|
|
30da850d22 | ||
|
|
a2f38df470 | ||
|
|
4f73d55d81 | ||
|
|
36d59348b1 | ||
|
|
9f35086e2f | ||
|
|
339b35cfb6 | ||
|
|
a5c4e5c54d | ||
|
|
4b5aec42f7 | ||
|
|
520a9853c7 | ||
|
|
61c49a1604 | ||
|
|
d66e2358ab | ||
|
|
658eabbc20 | ||
|
|
d48df625f3 | ||
|
|
d5fb30166c | ||
|
|
7ea2142c73 | ||
|
|
8db44000de | ||
|
|
86a6a15b9f | ||
|
|
86ae2840fc | ||
|
|
1323bfc735 | ||
|
|
1131327ede | ||
|
|
c7363267cf | ||
|
|
74104bb5ad | ||
|
|
fea5621432 | ||
|
|
752212413c | ||
|
|
f3707153a0 | ||
|
|
2587ac94b3 | ||
|
|
e715abde0b | ||
|
|
a3cc4a8ba9 | ||
|
|
c04e001986 | ||
|
|
7119ee3df5 | ||
|
|
168201f0d7 | ||
|
|
5c96a86f90 | ||
|
|
fd540c579a | ||
|
|
2a06f96d07 | ||
|
|
9c579b6c93 | ||
|
|
221f4edc8b | ||
|
|
01a1cd0700 | ||
|
|
33fa67af54 | ||
|
|
fee99120d5 | ||
|
|
4a31e857f5 | ||
|
|
9cc0491e3a | ||
|
|
6d52868166 | ||
|
|
bcb66ac150 | ||
|
|
f936c04d15 | ||
|
|
d11167eae5 | ||
|
|
bf5f3b3fde | ||
|
|
d2213841dc | ||
|
|
f12af9f40c | ||
|
|
963b6e075c | ||
|
|
accaac3405 | ||
|
|
81be6592d6 | ||
|
|
8147f7847d | ||
|
|
9f86f68d2f | ||
|
|
9107a28cc5 | ||
|
|
bae555928f | ||
|
|
a678037eec | ||
|
|
5f80642193 | ||
|
|
3788b7b323 | ||
|
|
75521c8414 | ||
|
|
e358f84bec | ||
|
|
9c9d4ba58c | ||
|
|
63b4249c34 | ||
|
|
5135fd37b3 | ||
|
|
73b14386ef | ||
|
|
976ec25e3b | ||
|
|
b5b4bb7c7a | ||
|
|
b592abbeff | ||
|
|
3ea6bb5094 | ||
|
|
52a4a5bfa9 | ||
|
|
66fe51ee7c | ||
|
|
45ab20a031 | ||
|
|
2609bda89d | ||
|
|
22d46667df | ||
|
|
69c43d9e30 | ||
|
|
93003ec6d4 | ||
|
|
24250cb4b0 | ||
|
|
43c50d1722 | ||
|
|
51a8569c15 | ||
|
|
e0efe1c2d4 | ||
|
|
391851a200 | ||
|
|
3eb4c8ffbb | ||
|
|
df4537b1bc | ||
|
|
fde71bbbf5 | ||
|
|
b19c1b0282 | ||
|
|
816b30e657 | ||
|
|
aafb7c0be7 | ||
|
|
38bed87e92 | ||
|
|
abd0b0130f | ||
|
|
bffd8f9bd9 | ||
|
|
f6ccabc886 | ||
|
|
e8d566803d | ||
|
|
a56ee7f528 | ||
|
|
4a3bf18d73 | ||
|
|
43ec4ff0e7 | ||
|
|
ebbfec1927 | ||
|
|
1122b5b5d9 | ||
|
|
dbfa1e4f8f | ||
|
|
dcd4a7631d | ||
|
|
6188ff74bc | ||
|
|
fa6883d341 | ||
|
|
9d9003f78e | ||
|
|
10270b8488 | ||
|
|
d33c87a99c | ||
|
|
8b09235e46 | ||
|
|
de0b26fd61 | ||
|
|
e6b60f99c4 | ||
|
|
4166aed39d | ||
|
|
e21763dfcd | ||
|
|
166c95ea3a | ||
|
|
36d1cf3a59 | ||
|
|
ad0d4c2d40 | ||
|
|
76d5f8474c | ||
|
|
cec8640443 | ||
|
|
2a3532f530 | ||
|
|
9b313d3378 | ||
|
|
6d5cf2d975 | ||
|
|
5e6350a121 | ||
|
|
9139a962d4 | ||
|
|
061ef4e458 | ||
|
|
314dc2bd97 | ||
|
|
6f569bfdff | ||
|
|
33c40b366d | ||
|
|
aafddb38d2 | ||
|
|
b61a5b53e5 | ||
|
|
b32cc719c8 | ||
|
|
f3667305f2 | ||
|
|
6c6a02598b | ||
|
|
3d07b51f41 | ||
|
|
d5d21b4bc6 | ||
|
|
a579fa7d61 | ||
|
|
8e69ce75b5 | ||
|
|
d976734d61 | ||
|
|
1d07d513ea | ||
|
|
73a6a23353 | ||
|
|
7e07e391cc | ||
|
|
2b01b560ba | ||
|
|
6890403a68 | ||
|
|
f0e97bbfbf | ||
|
|
aa27dfd5ea | ||
|
|
1d9306fd90 | ||
|
|
4804afdb04 | ||
|
|
dcb02a6707 | ||
|
|
e1b7304118 | ||
|
|
ef4915c656 | ||
|
|
62c3f8edda | ||
|
|
036c73c44b | ||
|
|
116e719a97 | ||
|
|
2d68b13ef5 | ||
|
|
30ffa4b13e | ||
|
|
82aacf1c48 | ||
|
|
42af630e7b | ||
|
|
8bff927997 | ||
|
|
faa6040516 | ||
|
|
d316556817 | ||
|
|
92a5bf6d80 | ||
|
|
f2b4f9e602 | ||
|
|
2901a4a5d6 | ||
|
|
f6a0e2ebae | ||
|
|
8eda13c092 | ||
|
|
c14c603feb | ||
|
|
8b638635c5 | ||
|
|
64862269a1 | ||
|
|
2141f56273 | ||
|
|
e67f637d0e | ||
|
|
5734d5d07d | ||
|
|
e3ebf34d44 | ||
|
|
09c5f07ad7 | ||
|
|
3f4994af9c | ||
|
|
c72b090823 | ||
|
|
d410067df3 | ||
|
|
a3e1c452df | ||
|
|
b2270db44b | ||
|
|
ff74aeb302 | ||
|
|
450680888d | ||
|
|
d232e06b40 | ||
|
|
54fa486a58 | ||
|
|
4ad7d984fd | ||
|
|
1e1ac1a843 | ||
|
|
069ff009a8 | ||
|
|
bc06fc23ee | ||
|
|
549d982e77 | ||
|
|
edbe4c4345 | ||
|
|
da16b3eaf0 | ||
|
|
e07b83c844 | ||
|
|
61de82e7fe | ||
|
|
fd6d3079c2 | ||
|
|
fa50f3521c | ||
|
|
ba9382e1bd | ||
|
|
ac98d7100f | ||
|
|
2779037bbf | ||
|
|
6b81388bab | ||
|
|
18cd87799d | ||
|
|
036ce21849 | ||
|
|
0f67caab69 | ||
|
|
8f30b70bfb | ||
|
|
43dacfae90 | ||
|
|
840a9f2b50 | ||
|
|
4d32ae9396 | ||
|
|
6a227be842 | ||
|
|
13b4fba8bd | ||
|
|
7cbf9cf686 | ||
|
|
669c87d3fb | ||
|
|
6726a20762 | ||
|
|
5f7cb3c14e | ||
|
|
7157cbbe92 | ||
|
|
3f6721ddb9 | ||
|
|
b3c48466f8 | ||
|
|
e8f11b9e72 | ||
|
|
674a1fd55c | ||
|
|
c417464586 | ||
|
|
4a4dd5ddc3 | ||
|
|
7792889c5a | ||
|
|
db57c85f0a | ||
|
|
a0de3e0f2d | ||
|
|
48c7c8bd9f | ||
|
|
9d150f0002 | ||
|
|
1e2cc14f29 | ||
|
|
2ac4a210e7 | ||
|
|
0fbb374478 | ||
|
|
6a772d25db | ||
|
|
d9c5856ff7 | ||
|
|
8538356d27 | ||
|
|
673ee5c5df | ||
|
|
087dde45fc | ||
|
|
184b6efe8d | ||
|
|
97d7395148 | ||
|
|
3245e5c0d8 | ||
|
|
7e0100ef3f | ||
|
|
dd2cd4ab8a | ||
|
|
31fe3a9f61 | ||
|
|
90b88898b2 | ||
|
|
8c1446266c | ||
|
|
f2ef23c9a8 | ||
|
|
3c8361d87c | ||
|
|
17fbb3a312 | ||
|
|
93be06bdd4 | ||
|
|
71d59feb76 | ||
|
|
c8e695f9c6 | ||
|
|
0f075fe6c4 | ||
|
|
2a527e5e20 | ||
|
|
79e5fde63b | ||
|
|
c4ef42ea77 | ||
|
|
dad4225d03 | ||
|
|
e21f7f10ed | ||
|
|
1341a53543 | ||
|
|
aac1c52a2f | ||
|
|
aa14b34035 | ||
|
|
a5bad54c51 | ||
|
|
b41ae5f483 | ||
|
|
e833225ab3 | ||
|
|
fa27a839f3 | ||
|
|
5fc92c915f | ||
|
|
d4ea091ab5 | ||
|
|
ac0bb40e1d | ||
|
|
a14b2b337c | ||
|
|
8bd840bedc | ||
|
|
d641543ff6 | ||
|
|
55fd49bbca | ||
|
|
58dfadccbe | ||
|
|
ec387c5246 | ||
|
|
0785e6b36c | ||
|
|
3377042ad3 | ||
|
|
1da48cd363 | ||
|
|
ce51c8012d | ||
|
|
6502446f88 | ||
|
|
ede8b3397d | ||
|
|
315cbb1fc6 | ||
|
|
5662841c2c | ||
|
|
12f8cf10d5 | ||
|
|
b293f6e0f9 | ||
|
|
efa3ff1730 | ||
|
|
19530c4ade | ||
|
|
536eb398f9 | ||
|
|
b62f6edbc4 | ||
|
|
8a1ea0ae5f | ||
|
|
658aedf96a | ||
|
|
9cb1f3f306 | ||
|
|
8b703187d0 | ||
|
|
6216aaf937 | ||
|
|
a80067859d | ||
|
|
8f2c33eaa5 | ||
|
|
12589460cf | ||
|
|
53cfcfd976 | ||
|
|
d7a0a9b5bc | ||
|
|
4d8ec5b466 | ||
|
|
78a780f5c4 | ||
|
|
914b270d5e | ||
|
|
d84fec2c02 | ||
|
|
d50f57abb1 | ||
|
|
c56584d236 | ||
|
|
d5200f78b6 | ||
|
|
575cf4ff28 | ||
|
|
d8bcd9c32d | ||
|
|
d33d0ea3e3 | ||
|
|
c491731322 | ||
|
|
8039d656af | ||
|
|
f071e420bd | ||
|
|
bca2b35d49 | ||
|
|
099fe24f8a | ||
|
|
5dcbf946f6 | ||
|
|
6ee9772eca | ||
|
|
588c8c8fc7 | ||
|
|
304ce9ef77 | ||
|
|
8b5004dda4 | ||
|
|
f86be307ae | ||
|
|
9c4517957a | ||
|
|
ed80f5109c | ||
|
|
0c2a5f0c5e | ||
|
|
e5885dfd02 | ||
|
|
e098fffea8 | ||
|
|
0a5f08ecb0 | ||
|
|
3ac33728ec | ||
|
|
145c4462f7 | ||
|
|
99a79b62e1 | ||
|
|
c3b0f2fea6 | ||
|
|
9ee281bfba | ||
|
|
df51418753 | ||
|
|
df3d3bc7d3 | ||
|
|
a18160ae4b | ||
|
|
01ee2fca0e | ||
|
|
d90684689a | ||
|
|
932d2d93b2 | ||
|
|
0a59b836c0 | ||
|
|
75009450e7 | ||
|
|
58dd96bdea | ||
|
|
fa998abfbc | ||
|
|
dbca80b0b3 | ||
|
|
35ef6a4fd5 | ||
|
|
266ba6ea99 | ||
|
|
415ec9e91b | ||
|
|
275fd078e2 | ||
|
|
ff48e97262 | ||
|
|
8e3d5ccd17 | ||
|
|
4301bb64c6 | ||
|
|
7f4895465d | ||
|
|
28a5552d96 | ||
|
|
ac5b545ce4 | ||
|
|
6ca5ad6441 | ||
|
|
3f4b750288 | ||
|
|
3eec1cf2f7 | ||
|
|
c0ae6b75e4 | ||
|
|
27c4a005de | ||
|
|
bdc7623216 | ||
|
|
e0d40e29a3 | ||
|
|
b3716dc20b | ||
|
|
91241ceea1 | ||
|
|
450a72792f | ||
|
|
66d12b6d2d | ||
|
|
ba1219f78b | ||
|
|
658d77c15f | ||
|
|
16faeb05fe | ||
|
|
b1eae70cae | ||
|
|
25cf88d0f8 |
63
.ci/azure-pipelines.yml
Normal file
@@ -0,0 +1,63 @@
|
||||
trigger:
|
||||
batch: true
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- release-*
|
||||
tags:
|
||||
include:
|
||||
- '*'
|
||||
|
||||
jobs:
|
||||
- job: main_build
|
||||
displayName: 'Main Build'
|
||||
|
||||
dependsOn: lint
|
||||
condition: succeeded()
|
||||
|
||||
pool:
|
||||
vmImage: 'ubuntu-latest'
|
||||
|
||||
steps:
|
||||
- task: NodeTool@0
|
||||
displayName: 'Install Node'
|
||||
inputs:
|
||||
versionSpec: '10.x'
|
||||
|
||||
- script: 'yarn install'
|
||||
displayName: 'Install Dependencies'
|
||||
|
||||
- script: 'test -d dist'
|
||||
displayName: 'Check Build'
|
||||
|
||||
- script: 'yarn pack --filename jellyfin-web.tgz'
|
||||
displayName: 'Bundle Release'
|
||||
|
||||
- task: PublishPipelineArtifact@1
|
||||
displayName: 'Publish Release'
|
||||
condition: succeeded()
|
||||
inputs:
|
||||
targetPath: '$(Build.SourcesDirectory)/jellyfin-web.tgz'
|
||||
artifactName: 'jellyfin-web'
|
||||
|
||||
- job: lint
|
||||
displayName: 'Lint'
|
||||
|
||||
pool:
|
||||
vmImage: 'ubuntu-latest'
|
||||
|
||||
steps:
|
||||
- task: NodeTool@0
|
||||
displayName: 'Install Node'
|
||||
inputs:
|
||||
versionSpec: '10.x'
|
||||
|
||||
- script: 'yarn install'
|
||||
displayName: 'Install Dependencies'
|
||||
|
||||
- script: 'yarn run lint'
|
||||
displayName: 'Run ESLint'
|
||||
|
||||
- script: |
|
||||
yarn run stylelint
|
||||
displayName: 'Run stylelint'
|
||||
@@ -1,9 +0,0 @@
|
||||
---
|
||||
kind: pipeline
|
||||
name: eslint
|
||||
|
||||
steps:
|
||||
- name: run
|
||||
image: nextcloudci/eslint:eslint-1
|
||||
commands:
|
||||
- ./run-eslint.sh
|
||||
9
.editorconfig
Normal file
@@ -0,0 +1,9 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
end_of_line = lf
|
||||
1
.eslintignore
Normal file
@@ -0,0 +1 @@
|
||||
libraries/
|
||||
@@ -1,3 +1,71 @@
|
||||
env:
|
||||
es6: false
|
||||
browser: true
|
||||
amd: true
|
||||
|
||||
globals:
|
||||
# New browser globals
|
||||
DataView: readonly
|
||||
MediaMetadata: readonly
|
||||
Promise: readonly
|
||||
# Deprecated browser globals
|
||||
DocumentTouch: readonly
|
||||
# Tizen globals
|
||||
tizen: readonly
|
||||
webapis: readonly
|
||||
# WebOS globals
|
||||
webOS: readonly
|
||||
# Dependency globals
|
||||
$: readonly
|
||||
jQuery: readonly
|
||||
queryString: readonly
|
||||
requirejs: readonly
|
||||
# Jellyfin globals
|
||||
ApiClient: writable
|
||||
AppInfo: writable
|
||||
chrome: writable
|
||||
ConnectionManager: writable
|
||||
DlnaProfilePage: writable
|
||||
Dashboard: writable
|
||||
DashboardPage: writable
|
||||
Emby: readonly
|
||||
Events: writable
|
||||
getParameterByName: writable
|
||||
getWindowLocationSearch: writable
|
||||
Globalize: writable
|
||||
Hls: writable
|
||||
humaneDate: writable
|
||||
humaneElapsed: writable
|
||||
LibraryMenu: writable
|
||||
LinkParser: writable
|
||||
LiveTvHelpers: writable
|
||||
MetadataEditor: writable
|
||||
pageClassOn: writable
|
||||
pageIdOn: writable
|
||||
PlaylistViewer: writable
|
||||
UserParentalControlPage: writable
|
||||
Windows: readonly
|
||||
|
||||
extends:
|
||||
- eslint:recommended
|
||||
|
||||
rules:
|
||||
block-spacing: ["error"]
|
||||
brace-style: ["error"]
|
||||
comma-dangle: ["error", "never"]
|
||||
comma-spacing: ["error"]
|
||||
eol-last: ["error"]
|
||||
indent: ["error", 4, { "SwitchCase": 1 }]
|
||||
keyword-spacing: ["error"]
|
||||
max-statements-per-line: ["error"]
|
||||
no-floating-decimal: ["error"]
|
||||
no-multi-spaces: ["error"]
|
||||
no-multiple-empty-lines: ["error", { "max": 1 }]
|
||||
no-trailing-spaces: ["error"]
|
||||
one-var: ["error", "never"]
|
||||
semi: ["warn"]
|
||||
space-before-blocks: ["error"]
|
||||
# TODO: Fix warnings and remove these rules
|
||||
no-redeclare: ["warn"]
|
||||
no-unused-vars: ["warn"]
|
||||
no-useless-escape: ["warn"]
|
||||
|
||||
20
.github/ISSUE_TEMPLATE/enhancement-request.md
vendored
@@ -1,20 +0,0 @@
|
||||
---
|
||||
name: Enhancement request
|
||||
about: Suggest an modification to an existing feature
|
||||
title: ''
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
|
||||
|
||||
**Describe the solution you'd like**
|
||||
<!-- A clear and concise description of what you want to happen. -->
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
|
||||
|
||||
**Additional context**
|
||||
<!-- Add any other context or screenshots about the feature request here. -->
|
||||
14
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,14 +0,0 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest a new feature
|
||||
title: ''
|
||||
labels: feature
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the feature you'd like**
|
||||
<!-- A clear and concise description of what you want to happen. -->
|
||||
|
||||
**Additional context**
|
||||
<!-- Add any other context or screenshots about the feature request here. -->
|
||||
2
.github/pull_request_template.md
vendored
@@ -1,6 +1,6 @@
|
||||
<!--
|
||||
Ensure your title is short, descriptive, and in the imperative mood (Fix X, Change Y, instead of Fixed X, Changed Y).
|
||||
For a good inspiration of what to write in commit messages and PRs please review https://chris.beams.io/posts/git-commit/ and our https://jellyfin.readthedocs.io/en/latest/developer-docs/contributing/ page.
|
||||
For a good inspiration of what to write in commit messages and PRs please review https://chris.beams.io/posts/git-commit/ and our https://docs.jellyfin.org/general/contributing/issues.html page.
|
||||
-->
|
||||
|
||||
**Changes**
|
||||
|
||||
20
.github/stale.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
# Number of days of inactivity before an issue becomes stale
|
||||
daysUntilStale: 90
|
||||
# Number of days of inactivity before a stale issue is closed
|
||||
daysUntilClose: 14
|
||||
# Issues with these labels will never be considered stale
|
||||
exemptLabels:
|
||||
- regression
|
||||
- future
|
||||
- feature
|
||||
- enhancement
|
||||
- confirmed
|
||||
# Label to use when marking an issue as stale
|
||||
staleLabel: stale
|
||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||
markComment: >
|
||||
Issues go stale after 90d of inactivity. Mark the issue as fresh by adding a comment or commit. Stale issues close after an additional 14d of inactivity.
|
||||
If this issue is safe to close now please do so.
|
||||
If you have any questions you can reach us on [Matrix or Social Media](https://docs.jellyfin.org/general/getting-help.html).
|
||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||
closeComment: false
|
||||
5
.gitignore
vendored
@@ -81,6 +81,9 @@ build/Release
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# Dependency lockfile
|
||||
package-lock.json
|
||||
|
||||
# TypeScript v1 declaration files
|
||||
typings/
|
||||
|
||||
@@ -572,4 +575,4 @@ healthchecksdb
|
||||
# End of https://www.gitignore.io/api/node,rider,macos,linux,windows,visualstudio,visualstudiocode
|
||||
|
||||
# dist for webpack output
|
||||
dist
|
||||
dist
|
||||
|
||||
9
.npmignore
Normal file
@@ -0,0 +1,9 @@
|
||||
.editorconfig
|
||||
.ci
|
||||
.gitattributes
|
||||
.github
|
||||
.eslintrc.yml
|
||||
run-eslint.sh
|
||||
webpack.config.js
|
||||
yarn.lock
|
||||
src
|
||||
143
.stylelintrc
Normal file
@@ -0,0 +1,143 @@
|
||||
{
|
||||
"plugins": [
|
||||
"stylelint-no-browser-hacks/lib",
|
||||
],
|
||||
"rules": {
|
||||
"at-rule-empty-line-before": [ "always", {
|
||||
except: [
|
||||
"blockless-after-same-name-blockless",
|
||||
"first-nested",
|
||||
],
|
||||
ignore: ["after-comment"],
|
||||
} ],
|
||||
"at-rule-name-case": "lower",
|
||||
"at-rule-name-space-after": "always-single-line",
|
||||
"at-rule-no-unknown": true,
|
||||
"at-rule-semicolon-newline-after": "always",
|
||||
"block-closing-brace-empty-line-before": "never",
|
||||
"block-closing-brace-newline-after": "always",
|
||||
"block-closing-brace-newline-before": "always-multi-line",
|
||||
"block-closing-brace-space-before": "always-single-line",
|
||||
"block-no-empty": true,
|
||||
"block-opening-brace-newline-after": "always-multi-line",
|
||||
"block-opening-brace-space-after": "always-single-line",
|
||||
"block-opening-brace-space-before": "always",
|
||||
"color-hex-case": "lower",
|
||||
"color-hex-length": "short",
|
||||
"color-no-invalid-hex": true,
|
||||
"comment-empty-line-before": [ "always", {
|
||||
except: ["first-nested"],
|
||||
ignore: ["stylelint-commands"],
|
||||
} ],
|
||||
"comment-no-empty": true,
|
||||
"comment-whitespace-inside": "always",
|
||||
"custom-property-empty-line-before": [ "always", {
|
||||
except: [
|
||||
"after-custom-property",
|
||||
"first-nested",
|
||||
],
|
||||
ignore: [
|
||||
"after-comment",
|
||||
"inside-single-line-block",
|
||||
],
|
||||
} ],
|
||||
"declaration-bang-space-after": "never",
|
||||
"declaration-bang-space-before": "always",
|
||||
"declaration-block-no-duplicate-properties": [
|
||||
true,
|
||||
{
|
||||
ignore: ["consecutive-duplicates-with-different-values"]
|
||||
}
|
||||
],
|
||||
"declaration-block-no-shorthand-property-overrides": true,
|
||||
"declaration-block-semicolon-newline-after": "always-multi-line",
|
||||
"declaration-block-semicolon-space-after": "always-single-line",
|
||||
"declaration-block-semicolon-space-before": "never",
|
||||
"declaration-block-single-line-max-declarations": 1,
|
||||
"declaration-block-trailing-semicolon": "always",
|
||||
"declaration-colon-newline-after": "always-multi-line",
|
||||
"declaration-colon-space-after": "always-single-line",
|
||||
"declaration-colon-space-before": "never",
|
||||
"font-family-no-duplicate-names": true,
|
||||
"function-calc-no-invalid": true,
|
||||
"function-calc-no-unspaced-operator": true,
|
||||
"function-comma-newline-after": "always-multi-line",
|
||||
"function-comma-space-after": "always-single-line",
|
||||
"function-comma-space-before": "never",
|
||||
"function-linear-gradient-no-nonstandard-direction": true,
|
||||
"function-max-empty-lines": 0,
|
||||
"function-name-case": "lower",
|
||||
"function-parentheses-newline-inside": "always-multi-line",
|
||||
"function-parentheses-space-inside": "never-single-line",
|
||||
"function-whitespace-after": "always",
|
||||
"indentation": 4,
|
||||
"keyframe-declaration-no-important": true,
|
||||
"length-zero-no-unit": true,
|
||||
"max-empty-lines": 1,
|
||||
"media-feature-colon-space-after": "always",
|
||||
"media-feature-colon-space-before": "never",
|
||||
"media-feature-name-case": "lower",
|
||||
"media-feature-name-no-unknown": true,
|
||||
"media-feature-parentheses-space-inside": "never",
|
||||
"media-feature-range-operator-space-after": "always",
|
||||
"media-feature-range-operator-space-before": "always",
|
||||
"media-query-list-comma-newline-after": "always-multi-line",
|
||||
"media-query-list-comma-space-after": "always-single-line",
|
||||
"media-query-list-comma-space-before": "never",
|
||||
"no-descending-specificity": true,
|
||||
"no-duplicate-at-import-rules": true,
|
||||
"no-duplicate-selectors": true,
|
||||
"no-empty-source": true,
|
||||
"no-eol-whitespace": true,
|
||||
"no-extra-semicolons": true,
|
||||
"no-invalid-double-slash-comments": true,
|
||||
"no-missing-end-of-source-newline": true,
|
||||
"number-leading-zero": "always",
|
||||
"number-no-trailing-zeros": true,
|
||||
"plugin/no-browser-hacks": true,
|
||||
"property-case": "lower",
|
||||
"property-no-unknown": [
|
||||
true,
|
||||
{
|
||||
"ignoreProperties": [
|
||||
"user-drag"
|
||||
]
|
||||
}
|
||||
],
|
||||
"rule-empty-line-before": [ "always-multi-line", {
|
||||
except: ["first-nested"],
|
||||
ignore: ["after-comment"],
|
||||
} ],
|
||||
"selector-attribute-brackets-space-inside": "never",
|
||||
"selector-attribute-operator-space-after": "never",
|
||||
"selector-attribute-operator-space-before": "never",
|
||||
"selector-combinator-space-after": "always",
|
||||
"selector-combinator-space-before": "always",
|
||||
"selector-descendant-combinator-no-non-space": true,
|
||||
"selector-list-comma-newline-after": "always",
|
||||
"selector-list-comma-space-before": "never",
|
||||
"selector-max-empty-lines": 0,
|
||||
"selector-pseudo-class-case": "lower",
|
||||
"selector-pseudo-class-no-unknown": true,
|
||||
"selector-pseudo-class-parentheses-space-inside": "never",
|
||||
"selector-pseudo-element-case": "lower",
|
||||
"selector-pseudo-element-colon-notation": "double",
|
||||
"selector-pseudo-element-no-unknown": [
|
||||
true,
|
||||
{
|
||||
"ignorePseudoElements": [
|
||||
"cue"
|
||||
]
|
||||
}
|
||||
],
|
||||
"selector-type-case": "lower",
|
||||
"selector-type-no-unknown": true,
|
||||
"string-no-newline": true,
|
||||
"unit-case": "lower",
|
||||
"unit-no-unknown": true,
|
||||
"value-list-comma-newline-after": "always-multi-line",
|
||||
"value-list-comma-space-after": "always-single-line",
|
||||
"value-list-comma-space-before": "never",
|
||||
"value-list-max-empty-lines": 0,
|
||||
}
|
||||
}
|
||||
@@ -21,8 +21,19 @@
|
||||
- [RazeLighter777](https://github.com/RazeLighter777)
|
||||
- [LogicalPhallacy](https://github.com/LogicalPhallacy)
|
||||
- [thornbill](https://github.com/thornbill)
|
||||
- [redSpoutnik](https://github.com/redSpoutnik)
|
||||
- [DrPandemic](https://github.com/drpandemic)
|
||||
- [Oddstr13](https://github.com/oddstr13)
|
||||
- [petermcneil](https://github.com/petermcneil)
|
||||
- [lewazo](https://github.com/lewazo)
|
||||
- [Raghu Saxena](https://github.com/ckcr4lyf)
|
||||
- [Nickbert7](https://github.com/Nickbert7)
|
||||
- [ferferga](https://github.com/ferferga)
|
||||
- [bilde2910](https://github.com/bilde2910)
|
||||
- [Daniel Hartung](https://github.com/dhartung)
|
||||
- [Ryan Hartzell](https://github.com/ryan-hartzell)
|
||||
- [Thibault Nocchi](https://github.com/ThibaultNocchi)
|
||||
- [MrTimscampi](https://github.com/MrTimscampi)
|
||||
|
||||
# Emby Contributors
|
||||
|
||||
|
||||
63
README.md
@@ -1,7 +1,64 @@
|
||||
<h1 align="center">Jellyfin Web UI</h1>
|
||||
<h3 align="center">The Free Software Media System</h3>
|
||||
<h1 align="center">Jellyfin Web</h1>
|
||||
<h3 align="center">Part of the <a href="https://jellyfin.org">Jellyfin Project</a></h3>
|
||||
|
||||
---
|
||||
|
||||
<p align="center">
|
||||
Jellyfin is a free software media system that puts you in control of managing and streaming your media.
|
||||
<img alt="Logo Banner" src="https://raw.githubusercontent.com/jellyfin/jellyfin-ux/master/branding/SVG/banner-logo-solid.svg?sanitize=true"/>
|
||||
<br/>
|
||||
<br/>
|
||||
<a href="https://github.com/jellyfin/jellyfin-web">
|
||||
<img alt="GPL 2.0 License" src="https://img.shields.io/github/license/jellyfin/jellyfin-web.svg"/>
|
||||
</a>
|
||||
<a href="https://github.com/jellyfin/jellyfin-web/releases">
|
||||
<img alt="Current Release" src="https://img.shields.io/github/release/jellyfin/jellyfin-web.svg"/>
|
||||
</a>
|
||||
<a href="https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/?utm_source=widget">
|
||||
<img src="https://translate.jellyfin.org/widgets/jellyfin/-/jellyfin-web/svg-badge.svg" alt="Translation Status"/>
|
||||
</a>
|
||||
<br/>
|
||||
<a href="https://opencollective.com/jellyfin">
|
||||
<img alt="Donate" src="https://img.shields.io/opencollective/all/jellyfin.svg?label=backers"/>
|
||||
</a>
|
||||
<a href="https://features.jellyfin.org">
|
||||
<img alt="Feature Requests" src="https://img.shields.io/badge/fider-vote%20on%20features-success.svg"/>
|
||||
</a>
|
||||
<a href="https://forum.jellyfin.org">
|
||||
<img alt="Discuss on our Forum" src="https://img.shields.io/discourse/https/forum.jellyfin.org/users.svg"/>
|
||||
</a>
|
||||
<a href="https://matrix.to/#/+jellyfin:matrix.org">
|
||||
<img alt="Chat on Matrix" src="https://img.shields.io/matrix/jellyfin:matrix.org.svg?logo=matrix"/>
|
||||
</a>
|
||||
<a href="https://www.reddit.com/r/jellyfin">
|
||||
<img alt="Join our Subreddit" src="https://img.shields.io/badge/reddit-r%2Fjellyfin-%23FF5700.svg"/>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
Jellyfin Web is the frontend used for most of the clients available for end users, such as desktop browsers, Android, and iOS. We welcome all contributions and pull requests! If you have a larger feature in mind please open an issue so we can discuss the implementation before you start. Translations can be improved very easily from our <a href="https://translate.jellyfin.org/projects/jellyfin/jellyfin-web">Weblate</a> instance. Look through the following graphic to see if your native language could use some work!
|
||||
|
||||
<a href="https://translate.jellyfin.org/engage/jellyfin/?utm_source=widget">
|
||||
<img src="https://translate.jellyfin.org/widgets/jellyfin/-/jellyfin-web/multi-auto.svg" alt="Detailed Translation Status"/>
|
||||
</a>
|
||||
|
||||
## Build Process
|
||||
|
||||
### Dependencies
|
||||
|
||||
- Yarn
|
||||
|
||||
### Getting Started
|
||||
|
||||
1. Clone or download this repository.
|
||||
```sh
|
||||
git clone https://github.com/jellyfin/jellyfin-web.git
|
||||
cd jellyfin-web
|
||||
```
|
||||
2. Install build dependencies in the project directory.
|
||||
```sh
|
||||
yarn install
|
||||
```
|
||||
|
||||
3. Run the web client with webpack for local development.
|
||||
```sh
|
||||
yarn serve
|
||||
```
|
||||
|
||||
61
package.json
@@ -3,9 +3,64 @@
|
||||
"version": "0.0.0",
|
||||
"description": "Web interface for Jellyfin",
|
||||
"repository": "https://github.com/jellyfin/jellyfin-web",
|
||||
"license": "GPL-2",
|
||||
"license": "GPL-2.0-or-later",
|
||||
"devDependencies": {
|
||||
"webpack": "^4.29.5",
|
||||
"webpack-cli": "^3.2.3"
|
||||
"clean-webpack-plugin": "^3.0.0",
|
||||
"copy-webpack-plugin": "^5.1.1",
|
||||
"css-loader": "^3.4.2",
|
||||
"eslint": "^6.8.0",
|
||||
"file-loader": "^5.0.2",
|
||||
"html-webpack-plugin": "^3.2.0",
|
||||
"style-loader": "^1.1.3",
|
||||
"stylelint": "^13.1.0",
|
||||
"stylelint-config-rational-order": "^0.1.2",
|
||||
"stylelint-no-browser-hacks": "^1.2.1",
|
||||
"stylelint-order": "^4.0.0",
|
||||
"webpack": "^4.41.5",
|
||||
"webpack-cli": "^3.3.10",
|
||||
"webpack-concat-plugin": "^3.0.0",
|
||||
"webpack-dev-server": "^3.10.3",
|
||||
"webpack-merge": "^4.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"alameda": "^1.4.0",
|
||||
"document-register-element": "^1.14.3",
|
||||
"flv.js": "^1.5.0",
|
||||
"hls.js": "^0.13.1",
|
||||
"howler": "^2.1.3",
|
||||
"jellyfin-noto": "https://github.com/jellyfin/jellyfin-noto",
|
||||
"jquery": "^3.4.1",
|
||||
"jstree": "^3.3.7",
|
||||
"libass-wasm": "https://github.com/jellyfin/JavascriptSubtitlesOctopus#4.0.0-jf-cordova",
|
||||
"libjass": "^0.11.0",
|
||||
"material-design-icons-iconfont": "^5.0.1",
|
||||
"native-promise-only": "^0.8.0-a",
|
||||
"resize-observer-polyfill": "^1.5.1",
|
||||
"shaka-player": "^2.5.9",
|
||||
"sortablejs": "^1.10.2",
|
||||
"swiper": "^5.3.1",
|
||||
"webcomponents.js": "^0.7.24",
|
||||
"whatwg-fetch": "^3.0.0"
|
||||
},
|
||||
"browserslist": [
|
||||
"last 2 Firefox versions",
|
||||
"last 2 Chrome versions",
|
||||
"last 2 ChromeAndroid versions",
|
||||
"last 2 Safari versions",
|
||||
"last 2 iOS versions",
|
||||
"last 2 Edge versions",
|
||||
"Chrome 38",
|
||||
"Chrome 47",
|
||||
"Chrome 53",
|
||||
"Chrome 56",
|
||||
"Chrome 63",
|
||||
"Firefox ESR"
|
||||
],
|
||||
"scripts": {
|
||||
"serve": "webpack-dev-server --config webpack.dev.js --open",
|
||||
"build": "webpack --config webpack.prod.js",
|
||||
"lint": "eslint \"src\"",
|
||||
"stylelint": "stylelint \"src/**/*.css\"",
|
||||
"prepare": "webpack --config webpack.prod.js"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
# used this pull request for reference
|
||||
# https://github.com/nextcloud/spreed/pull/48
|
||||
ESLINT=$(which eslint || true)
|
||||
if [ -z "$ESLINT" ]
|
||||
then
|
||||
echo "could not find eslint in $PATH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo checking scripts with $ESLINT
|
||||
find -name "*.js" -print0 | xargs -0 $ESLINT
|
||||
|
||||
# use this line to test changes locally
|
||||
#find src -name "*.js" -exec sh -c 'npx eslint $1' -- {} \;
|
||||
41
scripts/scdup.py
Normal file
@@ -0,0 +1,41 @@
|
||||
import sys
|
||||
import os
|
||||
import json
|
||||
|
||||
# load every key in the source language
|
||||
# check the keys in all translations
|
||||
# remove keys that only exist in translations
|
||||
|
||||
cwd = os.getcwd()
|
||||
langdir = cwd + '/../src/strings'
|
||||
langlst = os.listdir(langdir)
|
||||
|
||||
langlst.remove('en-us.json')
|
||||
print(langlst)
|
||||
input('press enter to continue')
|
||||
|
||||
keysus = []
|
||||
with open(langdir + '/' + 'en-us.json') as en:
|
||||
langus = json.load(en)
|
||||
for key in langus:
|
||||
keysus.append(key)
|
||||
|
||||
for lang in langlst:
|
||||
with open(langdir + '/' + lang, 'r') as f:
|
||||
inde = 2
|
||||
if '\n \"' in f.read():
|
||||
inde = 4
|
||||
f.close()
|
||||
with open(langdir + '/' + lang, 'r+') as f:
|
||||
langjson = json.load(f)
|
||||
langjnew = {}
|
||||
for key in langjson:
|
||||
if key in keysus:
|
||||
langjnew[key] = langjson[key]
|
||||
f.seek(0)
|
||||
f.write(json.dumps(langjnew, indent=inde, sort_keys=False, ensure_ascii=False))
|
||||
f.write('\n')
|
||||
f.truncate()
|
||||
f.close()
|
||||
|
||||
print('DONE')
|
||||
40
scripts/scgen.py
Normal file
@@ -0,0 +1,40 @@
|
||||
import os
|
||||
import subprocess
|
||||
import json
|
||||
|
||||
# load all keys in the source language
|
||||
# check entire codebase for usages
|
||||
# print unused keys to a text file
|
||||
# TODO: dynamic string usages cause false positives
|
||||
|
||||
cwd = os.getcwd()
|
||||
langdir = cwd + '/../src/strings'
|
||||
langlst = []
|
||||
langlst.append('en-us.json')
|
||||
|
||||
# unused keys
|
||||
dep = []
|
||||
|
||||
def grep(key):
|
||||
command = 'grep -r -E "(\(\\\"|\(\'|\{)%s(\\\"|\'|\})" --include=\*.{js,html} --exclude-dir=../src/strings ../src' % key
|
||||
p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||
output = p.stdout.readlines()
|
||||
if output:
|
||||
print('DONE: ' + key)
|
||||
return True
|
||||
print('UNUSED: ' + key)
|
||||
dep.append(key)
|
||||
return False
|
||||
|
||||
for lang in langlst:
|
||||
with open(langdir + '/' + lang) as f:
|
||||
langjson = json.load(f)
|
||||
for key in langjson:
|
||||
grep(key)
|
||||
|
||||
print(dep)
|
||||
print('LENGTH: ' + str(len(dep)))
|
||||
with open('scout.txt', 'w') as out:
|
||||
for item in dep:
|
||||
out.write(item + '\n')
|
||||
out.close()
|
||||
34
scripts/scrm.py
Normal file
@@ -0,0 +1,34 @@
|
||||
import sys
|
||||
import os
|
||||
import json
|
||||
|
||||
# load text file containing unused keys
|
||||
# remove the keys from all string files
|
||||
|
||||
cwd = os.getcwd()
|
||||
langdir = cwd + '/../src/strings'
|
||||
langlst = os.listdir(langdir)
|
||||
|
||||
keys = []
|
||||
|
||||
with open('scout.txt', 'r') as f:
|
||||
for line in f:
|
||||
keys.append(line.strip('\n'))
|
||||
|
||||
for lang in langlst:
|
||||
with open(langdir + '/' + lang, 'r') as f:
|
||||
inde = 2
|
||||
if '\n \"' in f.read():
|
||||
inde = 4
|
||||
f.close()
|
||||
with open(langdir + '/' + lang, 'r+') as f:
|
||||
langjson = json.load(f)
|
||||
for key in keys:
|
||||
langjson.pop(key, None)
|
||||
f.seek(0)
|
||||
f.write(json.dumps(langjson, indent=inde, sort_keys=False, ensure_ascii=False))
|
||||
f.write('\n')
|
||||
f.truncate()
|
||||
f.close()
|
||||
|
||||
print('DONE')
|
||||
@@ -1,21 +1,16 @@
|
||||
<div id="addPluginPage" data-role="page" class="page type-interior pluginConfigurationPage" data-backbutton="true" data-require="emby-select,emby-collapse,emby-button">
|
||||
|
||||
<div id="addPluginPage" data-role="page" class="page type-interior pluginConfigurationPage" data-backbutton="true">
|
||||
<div>
|
||||
<div class="content-primary">
|
||||
|
||||
<div class="readOnlyContent">
|
||||
|
||||
<div class="verticalSection">
|
||||
<div class="sectionTitleContainer flex align-items-center">
|
||||
<h1 class="sectionTitle pluginName"></h1>
|
||||
<a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://jellyfin.readthedocs.io/en/latest/administrator-docs/plugins/">${Help}</a>
|
||||
<a is="emby-linkbutton" class="raised button-alt headerHelpButton" target="_blank" href="https://docs.jellyfin.org/general/server/plugins/index.html">${Help}</a>
|
||||
</div>
|
||||
|
||||
<p id="tagline" style="font-style: italic;"></p>
|
||||
<p id="pPreviewImage"></p>
|
||||
|
||||
<p id="overview"></p>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="verticalSection">
|
||||
@@ -27,12 +22,12 @@
|
||||
<select id="selectVersion" name="selectVersion" is="emby-select" label="${LabelSelectVersionToInstall}"></select>
|
||||
</div>
|
||||
|
||||
<p id="btnInstallDiv" class="hide">
|
||||
<div id="btnInstallDiv" class="hide">
|
||||
<button is="emby-button" type="submit" id="btnInstall" class="raised button-submit block">
|
||||
<span>${Install}</span>
|
||||
</button>
|
||||
<div class="fieldDescription">${ServerRestartNeededAfterPluginInstall}</div>
|
||||
</p>
|
||||
</div>
|
||||
<p id="nonServerMsg"></p>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -1,20 +1,16 @@
|
||||
<div data-role="page" class="page standalonePage">
|
||||
<div class="padded-left padded-right padded-bottom-page">
|
||||
<form class="manualServerForm" style="margin: 0 auto;">
|
||||
<h1 style="text-align: left;">${HeaderConnectToServer}</h1>
|
||||
<form class="addServerForm" style="margin: 0 auto;">
|
||||
<h1>${HeaderConnectToServer}</h1>
|
||||
<div class="inputContainer">
|
||||
<input is="emby-input" type="text" id="txtServerHost" required="required" label="${LabelServerHost}" autocomplete="off" spellcheck="false" autocapitalize="none" autocorrect="off" />
|
||||
<div class="fieldDescription" style="text-align: left;">${LabelServerHostHelp}</div>
|
||||
</div>
|
||||
<br />
|
||||
<div class="inputContainer">
|
||||
<input is="emby-input" type="number" id="txtServerPort" step="1" min="0" value="8096" label="${LabelServerPort}" />
|
||||
<div class="fieldDescription">${LabelServerHostHelp}</div>
|
||||
</div>
|
||||
<br />
|
||||
<button is="emby-button" type="submit" class="raised button-submit block">
|
||||
<span>${ButtonConnect}</span>
|
||||
</button>
|
||||
<button is="emby-button" type="button" class="raised button-cancel block btnCancelManualServer">
|
||||
<button is="emby-button" type="button" class="raised button-cancel block btnCancel">
|
||||
<span>${ButtonCancel}</span>
|
||||
</button>
|
||||
</form>
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
<div id="serverSecurityPage" data-role="page" class="page type-interior advancedConfigurationPage withTabs fullWidthContent" data-require="scripts/serversecurity,detailtablecss,emby-button">
|
||||
<div id="apiKeysPage" data-role="page" class="page type-interior advancedConfigurationPage fullWidthContent">
|
||||
<div>
|
||||
<div class="content-primary">
|
||||
<div class="detailSectionHeader">
|
||||
<h2 style="margin:.6em 0;vertical-align:middle;display:inline-block;">
|
||||
${HeaderApiKeys}
|
||||
</h2>
|
||||
<h2 style="margin:.6em 0;vertical-align:middle;display:inline-block;">${HeaderApiKeys}</h2>
|
||||
<button is="emby-button" type="button" class="fab btnNewKey submit" style="margin-left:1em;" title="${ButtonAdd}">
|
||||
<i class="md-icon">add</i>
|
||||
<i class="material-icons">add</i>
|
||||
</button>
|
||||
</div>
|
||||
<p>${HeaderApiKeysHelp}</p>
|
||||
@@ -24,4 +22,4 @@
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -9,4 +9,4 @@
|
||||
vertical-align: middle;
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
}
|
||||
}
|
||||
466
src/assets/css/dashboard.css
Normal file
@@ -0,0 +1,466 @@
|
||||
.dashboardColumn,
|
||||
.dashboardSections {
|
||||
flex-direction: column;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-box-direction: normal;
|
||||
}
|
||||
|
||||
.dashboardFooter {
|
||||
margin-top: 3.5em;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.dashboardFooter a {
|
||||
margin: 0 0.7em;
|
||||
}
|
||||
|
||||
progress {
|
||||
appearance: none;
|
||||
-moz-appearance: none;
|
||||
-webkit-appearance: none;
|
||||
margin: 0;
|
||||
background: #ccc !important;
|
||||
}
|
||||
|
||||
progress[role]::after {
|
||||
background-image: none;
|
||||
}
|
||||
|
||||
progress::-webkit-progress-bar {
|
||||
background: #ccc;
|
||||
}
|
||||
|
||||
progress::-moz-progress-bar {
|
||||
background-color: #00a4dc;
|
||||
}
|
||||
|
||||
progress::-webkit-progress-value {
|
||||
background-color: #00a4dc;
|
||||
}
|
||||
|
||||
progress[aria-valuenow]::before {
|
||||
border-radius: 0.4em;
|
||||
background-color: #00a4dc;
|
||||
}
|
||||
|
||||
.localnav {
|
||||
margin-bottom: 2.2em !important;
|
||||
}
|
||||
|
||||
@media all and (min-width: 50em) {
|
||||
.type-interior > div[data-role=content],
|
||||
.type-interior > .ui-panel-content-wrap > div[data-role=content] {
|
||||
padding-right: 0;
|
||||
padding-left: 0;
|
||||
padding-top: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
.dashboardDocument .dashboardEntryHeaderButton,
|
||||
.dashboardDocument .lnkManageServer {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.adminDrawerLogo {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.layout-mobile .adminDrawerLogo {
|
||||
padding: 1.5em 1em 1.2em;
|
||||
border-bottom: 1px solid #e0e0e0;
|
||||
margin-bottom: 1em;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.adminDrawerLogo img {
|
||||
height: 4em;
|
||||
}
|
||||
|
||||
a[data-role=button] {
|
||||
background: #292929 !important;
|
||||
background-clip: padding-box;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-webkit-user-select: none;
|
||||
-webkit-background-clip: padding-box;
|
||||
cursor: pointer !important;
|
||||
font-family: inherit !important;
|
||||
font-weight: 500 !important;
|
||||
margin: 0 0.25em !important;
|
||||
display: inline-block;
|
||||
padding: 0.8em 1em;
|
||||
text-align: center;
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
div[data-role=controlgroup] a[data-role=button] {
|
||||
display: inline-block !important;
|
||||
margin: 0 !important;
|
||||
-webkit-box-shadow: none !important;
|
||||
box-shadow: none !important;
|
||||
-webkit-border-radius: 0;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
div[data-role=controlgroup] a[data-role=button]:first-child {
|
||||
-webkit-border-bottom-left-radius: 0.3125em;
|
||||
border-bottom-left-radius: 0.3125em;
|
||||
-webkit-border-top-left-radius: 0.3125em;
|
||||
border-top-left-radius: 0.3125em;
|
||||
}
|
||||
|
||||
div[data-role=controlgroup] a[data-role=button]:last-child {
|
||||
-webkit-border-bottom-right-radius: 0.3125em;
|
||||
border-bottom-right-radius: 0.3125em;
|
||||
-webkit-border-top-right-radius: 0.3125em;
|
||||
border-top-right-radius: 0.3125em;
|
||||
}
|
||||
|
||||
div[data-role=controlgroup] a[data-role=button] + a[data-role=button] {
|
||||
border-left-width: 0 !important;
|
||||
margin: 0 0 0 -0.4em !important;
|
||||
}
|
||||
|
||||
div[data-role=controlgroup] a.ui-btn-active {
|
||||
background: #00a4dc !important;
|
||||
color: #292929 !important;
|
||||
}
|
||||
|
||||
.sessionAppInfo img {
|
||||
max-width: 40px;
|
||||
max-height: 40px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.appLinks img {
|
||||
height: 36px;
|
||||
}
|
||||
|
||||
.wizardContent h2 img {
|
||||
height: 2.5em;
|
||||
vertical-align: middle;
|
||||
margin-right: 0.5em;
|
||||
position: relative;
|
||||
top: -0.3em;
|
||||
}
|
||||
|
||||
.header .imageLink {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.header .imageLink img {
|
||||
height: 2.1em;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.content-primary {
|
||||
padding-top: 6em;
|
||||
padding-right: 1em;
|
||||
padding-left: 1em;
|
||||
}
|
||||
|
||||
.withTabs .content-primary {
|
||||
padding-top: 9em !important;
|
||||
}
|
||||
|
||||
@media all and (min-width: 40em) {
|
||||
.content-primary {
|
||||
padding-top: 4.6em;
|
||||
}
|
||||
|
||||
.withTabs .content-primary {
|
||||
padding-top: 10em !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media all and (min-width: 84em) {
|
||||
.withTabs .content-primary {
|
||||
padding-top: 7em !important;
|
||||
}
|
||||
}
|
||||
|
||||
.content-primary ul:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.dashboardSections {
|
||||
display: -webkit-box;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
-webkit-flex-direction: column;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.dashboardColumn {
|
||||
display: -webkit-box;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
-webkit-flex-direction: column;
|
||||
flex-direction: column;
|
||||
-webkit-flex-shrink: 0;
|
||||
flex-shrink: 0;
|
||||
-webkit-box-flex: 1;
|
||||
-webkit-flex-grow: 1;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.sessionNowPlayingContent {
|
||||
-webkit-background-size: cover;
|
||||
background-size: cover;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center center;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
.activeSession:not(.playingSession) .sessionNowPlayingContent {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.dashboardSection {
|
||||
-webkit-flex-shrink: 0;
|
||||
flex-shrink: 0;
|
||||
margin: 0 0 2em;
|
||||
}
|
||||
|
||||
.dashboardSection h3 {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
.activeRecordingItems > .card {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
@media all and (min-width: 70em) {
|
||||
.dashboardSections {
|
||||
-webkit-flex-wrap: wrap;
|
||||
flex-wrap: wrap;
|
||||
-webkit-box-orient: horizontal;
|
||||
-webkit-box-direction: normal;
|
||||
-webkit-flex-direction: row;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.dashboardColumn-2-60 {
|
||||
width: 46%;
|
||||
}
|
||||
|
||||
.dashboardColumn-2-40 {
|
||||
width: 27%;
|
||||
}
|
||||
|
||||
.dashboardSection {
|
||||
padding: 0 1.5em;
|
||||
}
|
||||
|
||||
.activeRecordingItems > .card {
|
||||
width: 25%;
|
||||
}
|
||||
}
|
||||
|
||||
.wizardContent {
|
||||
max-width: 62em;
|
||||
padding: 0.5em 2em 1em;
|
||||
margin: 0 auto;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.wizardNavigation {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.wizardContent form {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.scheduledTaskPaperIconItem {
|
||||
outline: 0 !important;
|
||||
}
|
||||
|
||||
.activeSession {
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
.activitylogUserPhoto {
|
||||
height: 1.71em;
|
||||
width: 1.71em;
|
||||
border-radius: 100%;
|
||||
margin-right: 0.5em;
|
||||
background-size: cover;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
}
|
||||
|
||||
@media all and (min-width: 40em) {
|
||||
.activeSession {
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media all and (min-width: 50em) {
|
||||
.activeSession {
|
||||
width: 50% !important;
|
||||
}
|
||||
}
|
||||
|
||||
.sessionCardFooter {
|
||||
padding-top: 0.5em !important;
|
||||
padding-bottom: 1em !important;
|
||||
border-top: 1px solid #eee;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.sessionAppInfo {
|
||||
padding: 0.5em;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.sessionCardButtons {
|
||||
min-height: 2.7em;
|
||||
}
|
||||
|
||||
.sessionCardButton {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.sessionNowPlayingInnerContent {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.sessionNowPlayingContent-withbackground + .sessionNowPlayingInnerContent {
|
||||
color: #fff !important;
|
||||
background: rgba(0, 0, 0, 0.7);
|
||||
}
|
||||
|
||||
.sessionAppName {
|
||||
vertical-align: top;
|
||||
max-width: 200px;
|
||||
}
|
||||
|
||||
.sessionNowPlayingDetails {
|
||||
display: flex;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.sessionNowPlayingInfo {
|
||||
flex-grow: 1;
|
||||
text-overflow: ellipsis;
|
||||
padding: 0.8em 0.5em;
|
||||
}
|
||||
|
||||
.sessionNowPlayingTime {
|
||||
flex-shrink: 0;
|
||||
align-self: flex-end;
|
||||
text-overflow: ellipsis;
|
||||
padding: 0.8em 0.5em;
|
||||
}
|
||||
|
||||
.sessionNowPlayingStreamInfo {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.playbackProgress,
|
||||
.transcodingProgress {
|
||||
margin: 0;
|
||||
width: 100%;
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
.activeSession .playbackProgress,
|
||||
.activeSession .transcodingProgress {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
height: 6px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.playbackProgress > div {
|
||||
z-index: 1000;
|
||||
background-color: #00a4dc;
|
||||
}
|
||||
|
||||
.transcodingProgress > div {
|
||||
background-color: #dd4919;
|
||||
}
|
||||
|
||||
@media all and (max-width: 34.375em) {
|
||||
.sessionAppName {
|
||||
max-width: 160px;
|
||||
}
|
||||
}
|
||||
|
||||
@media all and (max-width: 31.25em) {
|
||||
.sessionAppName {
|
||||
max-width: 150px;
|
||||
}
|
||||
}
|
||||
|
||||
.disabledUser {
|
||||
-webkit-filter: grayscale(100%);
|
||||
filter: grayscale(100%);
|
||||
}
|
||||
|
||||
.disabledUserBanner {
|
||||
margin: 0 0 2em;
|
||||
}
|
||||
|
||||
.appLinks a {
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
.appLinks a + a {
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
@-webkit-keyframes rotating {
|
||||
from {
|
||||
-webkit-transform: rotate(0);
|
||||
transform: rotate(0);
|
||||
}
|
||||
|
||||
to {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes rotating {
|
||||
from {
|
||||
-webkit-transform: rotate(0);
|
||||
transform: rotate(0);
|
||||
}
|
||||
|
||||
to {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
.rotatingCircle {
|
||||
-webkit-animation: rotating 2s linear infinite;
|
||||
animation: rotating 2s linear infinite;
|
||||
}
|
||||
|
||||
.pluginPreviewImg {
|
||||
-webkit-box-shadow: 0 0.0725em 0.29em 0 rgba(0, 0, 0, 0.37);
|
||||
box-shadow: 0 0.0725em 0.29em 0 rgba(0, 0, 0, 0.37);
|
||||
}
|
||||
|
||||
.ui-bar-a {
|
||||
text-align: center;
|
||||
padding: 0 20px;
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
.detailTableBodyCell,
|
||||
.detailTableHeaderCell {
|
||||
border-spacing: 0;
|
||||
padding: .4em
|
||||
padding: 0.4em;
|
||||
}
|
||||
|
||||
.detailTable {
|
||||
@@ -9,11 +9,11 @@
|
||||
border-spacing: 0;
|
||||
text-align: left;
|
||||
width: 100%;
|
||||
margin: 0 auto
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.detailTableHeaderCell {
|
||||
font-weight: 700;
|
||||
text-align: left;
|
||||
vertical-align: top
|
||||
}
|
||||
vertical-align: top;
|
||||
}
|
||||
@@ -44,4 +44,4 @@
|
||||
|
||||
.align-self-flex-end {
|
||||
align-self: flex-end;
|
||||
}
|
||||
}
|
||||
37
src/assets/css/fonts.css
Normal file
@@ -0,0 +1,37 @@
|
||||
html {
|
||||
font-family: "Noto Sans", sans-serif;
|
||||
font-size: 93%;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
text-size-adjust: 100%;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
text-rendering: optimizeLegibility;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3 {
|
||||
font-family: "Noto Sans", sans-serif;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-weight: 400;
|
||||
font-size: 1.8em;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-weight: 400;
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-weight: 400;
|
||||
font-size: 1.17em;
|
||||
}
|
||||
|
||||
.layout-tv {
|
||||
font-size: 130%;
|
||||
}
|
||||
|
||||
.layout-mobile {
|
||||
font-size: 90%;
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
h1 {
|
||||
font-weight: 500;
|
||||
font-weight: 400;
|
||||
font-size: 1.8em;
|
||||
}
|
||||
|
||||
@@ -8,12 +8,12 @@ h1 {
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-weight: 500;
|
||||
font-weight: 400;
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-weight: 500;
|
||||
font-weight: 400;
|
||||
font-size: 1.17em;
|
||||
}
|
||||
|
||||
@@ -25,7 +25,6 @@ h3 {
|
||||
|
||||
/* This is supposed to be 1080p, but had to reduce the min height to account for possible browser chrome */
|
||||
@media all and (min-height: 1000px) {
|
||||
|
||||
html {
|
||||
font-size: 27px;
|
||||
}
|
||||
8
src/assets/css/ios.css
Normal file
@@ -0,0 +1,8 @@
|
||||
html {
|
||||
font-size: 82% !important;
|
||||
}
|
||||
|
||||
.formDialogFooter {
|
||||
position: static !important;
|
||||
margin: 0 -1em !important;
|
||||
}
|
||||
1108
src/assets/css/librarybrowser.css
Normal file
9
src/assets/css/livetv.css
Normal file
@@ -0,0 +1,9 @@
|
||||
.guideVerticalScroller {
|
||||
padding-bottom: 15em;
|
||||
}
|
||||
|
||||
@media all and (min-width: 62.5em) {
|
||||
#guideTab {
|
||||
padding-left: 0.5em;
|
||||
}
|
||||
}
|
||||
@@ -1,29 +1,29 @@
|
||||
.editPageSidebar {
|
||||
display: block
|
||||
display: block;
|
||||
}
|
||||
|
||||
.editPageSidebar-withcontent {
|
||||
display: none
|
||||
display: none;
|
||||
}
|
||||
|
||||
.libraryTree {
|
||||
margin-left: .25em
|
||||
margin-left: 0.25em;
|
||||
}
|
||||
|
||||
.offlineEditorNode {
|
||||
color: #c33
|
||||
color: #c33;
|
||||
}
|
||||
|
||||
.editorNode img {
|
||||
height: 18px;
|
||||
margin: 0 .35em;
|
||||
margin: 0 0.35em;
|
||||
vertical-align: middle;
|
||||
position: relative;
|
||||
top: -2px
|
||||
top: -2px;
|
||||
}
|
||||
|
||||
.jstree-anchor {
|
||||
font-weight: 400 !important
|
||||
font-weight: 400 !important;
|
||||
}
|
||||
|
||||
.jstree-wholerow-hovered {
|
||||
@@ -31,7 +31,7 @@
|
||||
-webkit-border-radius: 0 !important;
|
||||
border-radius: 0 !important;
|
||||
-webkit-box-shadow: none !important;
|
||||
box-shadow: none !important
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
.jstree-default .jstree-hovered {
|
||||
@@ -40,14 +40,18 @@
|
||||
border-radius: 0 !important;
|
||||
-webkit-box-shadow: none !important;
|
||||
box-shadow: none !important;
|
||||
color: #fff !important
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.jstree-default .jstree-wholerow-clicked {
|
||||
background: #00a4dc !important
|
||||
background: #00a4dc !important;
|
||||
}
|
||||
|
||||
@media all and (min-width:50em) {
|
||||
.metadataSidebarIcon {
|
||||
margin-right: 0.4em;
|
||||
}
|
||||
|
||||
@media all and (min-width: 50em) {
|
||||
.editPageSidebar {
|
||||
position: fixed;
|
||||
top: 5.2em;
|
||||
@@ -55,21 +59,21 @@
|
||||
left: 0;
|
||||
width: 30%;
|
||||
border-right: 1px solid #555;
|
||||
display: block
|
||||
display: block;
|
||||
}
|
||||
|
||||
.editPageInnerContent {
|
||||
float: right;
|
||||
width: 68.5%
|
||||
width: 68.5%;
|
||||
}
|
||||
}
|
||||
|
||||
@media all and (min-width:112.5em) {
|
||||
@media all and (min-width: 112.5em) {
|
||||
.editPageSidebar {
|
||||
width: 25%
|
||||
width: 25%;
|
||||
}
|
||||
|
||||
.editPageInnerContent {
|
||||
width: 73.5%
|
||||
width: 73.5%;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,17 +9,17 @@
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
|
||||
.hiddenScrollX, .layout-tv .scrollX {
|
||||
.hiddenScrollX,
|
||||
.layout-tv .scrollX {
|
||||
-ms-overflow-style: none;
|
||||
/* Can't do this because it not only hides the scrollbar, but also prevents scrolling */
|
||||
/*overflow: -moz-scrollbars-none;*/
|
||||
}
|
||||
|
||||
.hiddenScrollX-forced {
|
||||
overflow: -moz-scrollbars-none;
|
||||
}
|
||||
|
||||
.hiddenScrollX::-webkit-scrollbar, .layout-tv .scrollX::-webkit-scrollbar {
|
||||
.hiddenScrollX::-webkit-scrollbar,
|
||||
.layout-tv .scrollX::-webkit-scrollbar {
|
||||
height: 0 !important;
|
||||
display: none;
|
||||
}
|
||||
@@ -37,17 +37,22 @@
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
|
||||
.hiddenScrollY, .layout-tv .smoothScrollY {
|
||||
.hiddenScrollY,
|
||||
.layout-tv .smoothScrollY {
|
||||
-ms-overflow-style: none;
|
||||
|
||||
/* Can't do this because it not only hides the scrollbar, but also prevents scrolling */
|
||||
/*overflow: -moz-scrollbars-none;*/
|
||||
|
||||
/* overflow: -moz-scrollbars-none; */
|
||||
}
|
||||
|
||||
.hiddenScrollY-forced {
|
||||
overflow: -moz-scrollbars-none;
|
||||
}
|
||||
|
||||
.hiddenScrollY::-webkit-scrollbar, .layout-tv .smoothScrollY::-webkit-scrollbar, .layout-tv .scrollY::-webkit-scrollbar {
|
||||
.hiddenScrollY::-webkit-scrollbar,
|
||||
.layout-tv .smoothScrollY::-webkit-scrollbar,
|
||||
.layout-tv .scrollY::-webkit-scrollbar {
|
||||
width: 0 !important;
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
98
src/assets/css/site.css
Normal file
@@ -0,0 +1,98 @@
|
||||
body,
|
||||
html {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.material-icons {
|
||||
/* Fix font ligatures on older WebOS versions */
|
||||
-webkit-font-feature-settings: "liga";
|
||||
}
|
||||
|
||||
.backgroundContainer {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
contain: strict;
|
||||
}
|
||||
|
||||
html {
|
||||
line-height: 1.35;
|
||||
}
|
||||
|
||||
.layout-mobile,
|
||||
.layout-tv {
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
body {
|
||||
overflow-x: hidden;
|
||||
background-color: transparent !important;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
.mainAnimatedPage {
|
||||
contain: style size !important;
|
||||
}
|
||||
|
||||
.pageContainer {
|
||||
overflow-x: visible !important;
|
||||
}
|
||||
|
||||
.bodyWithPopupOpen {
|
||||
overflow-y: hidden !important;
|
||||
}
|
||||
|
||||
div[data-role=page] {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
.pageTitle {
|
||||
margin-top: 0;
|
||||
font-family: inherit;
|
||||
}
|
||||
|
||||
.fieldDescription {
|
||||
padding-left: 0.15em;
|
||||
font-weight: 400;
|
||||
white-space: normal !important;
|
||||
}
|
||||
|
||||
.fieldDescription + .fieldDescription {
|
||||
margin-top: 0.3em;
|
||||
}
|
||||
|
||||
.content-primary,
|
||||
.padded-bottom-page,
|
||||
.page,
|
||||
.pageWithAbsoluteTabs .pageTabContent {
|
||||
/* provides room for the music controls */
|
||||
padding-bottom: 5em !important;
|
||||
}
|
||||
|
||||
@media all and (min-width: 50em) {
|
||||
.readOnlyContent,
|
||||
form {
|
||||
max-width: 54em;
|
||||
}
|
||||
}
|
||||
|
||||
.headerHelpButton {
|
||||
margin-left: 1.25em !important;
|
||||
padding-bottom: 0.4em !important;
|
||||
padding-top: 0.4em !important;
|
||||
}
|
||||
|
||||
.mediaInfoContent {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
width: 85%;
|
||||
}
|
||||
@@ -1,8 +1,9 @@
|
||||
.chapterThumbTextContainer,
|
||||
.videoOsdBottom {
|
||||
user-select: none;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none
|
||||
-ms-user-select: none;
|
||||
}
|
||||
|
||||
.osdPoster img,
|
||||
@@ -10,32 +11,27 @@
|
||||
.videoOsdBottom {
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.osdHeader {
|
||||
padding-bottom: 3vh;
|
||||
-webkit-transition: opacity .3s ease-out;
|
||||
-o-transition: opacity .3s ease-out;
|
||||
transition: opacity .3s ease-out;
|
||||
-webkit-transition: opacity 0.3s ease-out;
|
||||
-o-transition: opacity 0.3s ease-out;
|
||||
transition: opacity 0.3s ease-out;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
background-color: rgba(0, 0, 0, .3) !important;
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .6)), to(rgba(0, 0, 0, 0))) !important;
|
||||
background: -webkit-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)) !important;
|
||||
background: -o-linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)) !important;
|
||||
background: linear-gradient(rgba(0, 0, 0, .6), rgba(0, 0, 0, 0)) !important;
|
||||
background: rgba(0, 0, 0, 0.7) !important;
|
||||
-webkit-backdrop-filter: none !important;
|
||||
backdrop-filter: none !important;
|
||||
color: #eee
|
||||
color: #eee !important;
|
||||
}
|
||||
|
||||
.osdHeader-hidden {
|
||||
opacity: 0
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.osdHeader .headerButton:not(.headerBackButton):not(.headerCastButton) {
|
||||
display: none
|
||||
display: none;
|
||||
}
|
||||
|
||||
.chapterThumbContainer {
|
||||
@@ -44,7 +40,7 @@
|
||||
-webkit-box-flex: 1;
|
||||
-webkit-flex-grow: 1;
|
||||
flex-grow: 1;
|
||||
position: relative
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.chapterThumb {
|
||||
@@ -54,20 +50,20 @@
|
||||
background-repeat: no-repeat;
|
||||
border: 0;
|
||||
height: 20vh;
|
||||
min-width: 20vh
|
||||
min-width: 20vh;
|
||||
}
|
||||
|
||||
@media all and (orientation:portrait) {
|
||||
@media all and (orientation: portrait) {
|
||||
.chapterThumb {
|
||||
height: 30vw;
|
||||
min-width: 30vw
|
||||
min-width: 30vw;
|
||||
}
|
||||
}
|
||||
|
||||
@media all and (max-height:50em) and (orientation:landscape) {
|
||||
@media all and (max-height: 50em) and (orientation: landscape) {
|
||||
.chapterThumb {
|
||||
height: 30vh;
|
||||
min-width: 30vh
|
||||
min-width: 30vh;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,24 +72,24 @@
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background: rgba(0, 0, 0, .7);
|
||||
padding: .25em .5em;
|
||||
user-select: none
|
||||
background: rgba(0, 0, 0, 0.7);
|
||||
padding: 0.25em 0.5em;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.chapterThumbText {
|
||||
padding: .25em 0;
|
||||
padding: 0.25em 0;
|
||||
margin: 0;
|
||||
opacity: 1
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.chapterThumbText-dim {
|
||||
opacity: .6
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
.videoOsdBottom {
|
||||
position: fixed;
|
||||
background-color: rgba(0, 0, 0, .7);
|
||||
background-color: rgba(0, 0, 0, 0.7);
|
||||
padding: 1%;
|
||||
display: -webkit-box;
|
||||
display: -webkit-flex;
|
||||
@@ -103,30 +99,26 @@
|
||||
-webkit-flex-direction: row;
|
||||
flex-direction: row;
|
||||
will-change: opacity;
|
||||
-webkit-transition: opacity .3s ease-out;
|
||||
-o-transition: opacity .3s ease-out;
|
||||
transition: opacity .3s ease-out;
|
||||
background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .8)));
|
||||
background: -webkit-linear-gradient(rgba(0, 0, 0, .5), rgba(0, 0, 0, .8));
|
||||
background: -o-linear-gradient(rgba(0, 0, 0, .5), rgba(0, 0, 0, .8));
|
||||
background: linear-gradient(rgba(0, 0, 0, .5), rgba(0, 0, 0, .8));
|
||||
-webkit-transition: opacity 0.3s ease-out;
|
||||
-o-transition: opacity 0.3s ease-out;
|
||||
transition: opacity 0.3s ease-out;
|
||||
color: #fff;
|
||||
user-select: none;
|
||||
-webkit-touch-callout: none
|
||||
-webkit-touch-callout: none;
|
||||
}
|
||||
|
||||
.videoOsdBottom-hidden {
|
||||
opacity: 0
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.osdControls {
|
||||
-webkit-box-flex: 1;
|
||||
-webkit-flex-grow: 1;
|
||||
flex-grow: 1
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.videoOsdBottom .buttons {
|
||||
padding: .25em 0 0;
|
||||
padding: 0.25em 0 0;
|
||||
display: -webkit-box;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
@@ -134,28 +126,30 @@
|
||||
flex-wrap: wrap;
|
||||
-webkit-box-align: center;
|
||||
-webkit-align-items: center;
|
||||
align-items: center
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.osdVolumeSliderContainer {
|
||||
width: 9em;
|
||||
-webkit-box-flex: 1;
|
||||
-webkit-flex-grow: 1;
|
||||
flex-grow: 1
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.osdMediaInfo,
|
||||
.volumeButtons {
|
||||
display: flex;
|
||||
display: -webkit-box;
|
||||
display: -webkit-flex;
|
||||
-webkit-box-align: center
|
||||
align-items: center;
|
||||
-webkit-box-align: center;
|
||||
}
|
||||
|
||||
.volumeButtons {
|
||||
margin: 0 .5em 0 auto;
|
||||
margin: 0 0.5em 0 auto;
|
||||
display: flex;
|
||||
-webkit-align-items: center;
|
||||
align-items: center
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.osdTimeText {
|
||||
@@ -163,13 +157,13 @@
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.osdPoster {
|
||||
width: 10%;
|
||||
position: relative;
|
||||
margin-right: .5em
|
||||
margin-right: 0.5em;
|
||||
}
|
||||
|
||||
.osdPoster img {
|
||||
@@ -178,28 +172,28 @@
|
||||
width: 100%;
|
||||
-webkit-box-shadow: 0 0 1.9vh #000;
|
||||
box-shadow: 0 0 1.9vh #000;
|
||||
border: .08em solid #222;
|
||||
border: 0.08em solid #222;
|
||||
user-drag: none;
|
||||
user-select: none;
|
||||
-moz-user-select: none;
|
||||
-webkit-user-drag: none;
|
||||
-webkit-user-select: none;
|
||||
-ms-user-select: none
|
||||
-ms-user-select: none;
|
||||
}
|
||||
|
||||
.osdTitle,
|
||||
.osdTitleSmall {
|
||||
margin: 0 1em 0 0
|
||||
margin: 0 1em 0 0;
|
||||
}
|
||||
|
||||
.osdMediaInfo {
|
||||
display: flex;
|
||||
-webkit-align-items: center;
|
||||
align-items: center
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.osdSecondaryMediaInfo {
|
||||
padding-left: .6em !important
|
||||
padding-left: 0.6em !important;
|
||||
}
|
||||
|
||||
.osdTextContainer {
|
||||
@@ -213,50 +207,83 @@
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
margin-bottom: .7em;
|
||||
padding-left: .5em
|
||||
margin-bottom: 0.7em;
|
||||
padding-left: 0.5em;
|
||||
}
|
||||
|
||||
.osdMainTextContainer {
|
||||
-webkit-box-align: baseline;
|
||||
-webkit-align-items: baseline;
|
||||
align-items: baseline
|
||||
align-items: baseline;
|
||||
}
|
||||
|
||||
.osdMediaStatus {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
@-moz-keyframes spin {
|
||||
100% {
|
||||
-moz-transform: rotate(360deg);
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes spin {
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
.osdMediaStatus .animate {
|
||||
-webkit-animation: spin 4s linear infinite;
|
||||
-moz-animation: spin 4s linear infinite;
|
||||
animation: spin 4s linear infinite;
|
||||
}
|
||||
|
||||
.pageContainer {
|
||||
top: 0;
|
||||
position: fixed
|
||||
position: fixed;
|
||||
}
|
||||
|
||||
@media all and (max-width:30em) {
|
||||
|
||||
@media all and (max-width: 30em) {
|
||||
.btnFastForward,
|
||||
.btnRewind,
|
||||
.osdMediaInfo,
|
||||
.osdPoster {
|
||||
display: none !important
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media all and (max-width:33.75em) {
|
||||
@media all and (max-width: 33.75em) {
|
||||
.videoOsdBottom .paper-icon-button-light {
|
||||
margin: 0
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media all and (max-width:43em) {
|
||||
.videoOsdBottom .volumeButtons {
|
||||
display: none !important
|
||||
}
|
||||
}
|
||||
@media all and (max-width:50em) {
|
||||
.videoOsdBottom .btnFastForward, .videoOsdBottom .btnRewind {
|
||||
display: none !important
|
||||
@media all and (max-width: 43em) {
|
||||
.videoOsdBottom .volumeButtons,
|
||||
.osdMediaStatus span {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media all and (max-width:75em) {
|
||||
@media all and (max-width: 50em) {
|
||||
.videoOsdBottom .btnFastForward,
|
||||
.videoOsdBottom .btnRewind {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media all and (max-width: 75em) {
|
||||
.videoOsdBottom .endsAtText {
|
||||
display: none !important
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
BIN
src/assets/img/avatar.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
4
src/assets/img/devices/android.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M24 19H0a13.6 13.6 0 0 1 2.21-6.07A11.2 11.2 0 0 1 5.87 9.4l.41-.23-2.02-3.41a.51.51 0 0 1 .17-.7.5.5 0 0 1 .69.18l2.08 3.5a12.62 12.62 0 0 1 4.84-.9 12.2 12.2 0 0 1 4.75.9l2.07-3.5a.5.5 0 0 1 .7-.17.51.51 0 0 1 .16.7L17.7 9.19l.5.28a11.38 11.38 0 0 1 3.63 3.62A14.48 14.48 0 0 1 24 19zm-7.5-4.48a1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0-1-1 1 1 0 0 0-1 1zm-11 0a1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0-1-1 1 1 0 0 0-1 1z" fill="#fff"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 563 B |
1
src/assets/img/devices/chrome.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Google Chrome icon</title><path d="M16.214 8.69l6.715-1.679A12.027 12.027 0 0 1 24 11.972C24 18.57 18.569 24 11.968 24c-.302 0-.605-.011-.907-.034l4.905-8.347c.356-.376.655-.803.881-1.271a5.451 5.451 0 0 0-.043-4.748 5.156 5.156 0 0 0-.59-.91zm-3.24 8.575l-2.121 6.682C4.738 23.345 0 18.14 0 11.977 0 9.592.709 7.26 2.038 5.279l4.834 8.377c.18.539 1.119 2.581 3.067 3.327.998.382 2.041.481 3.035.282zM11.973 7.62c-2.006.019-3.878 1.544-4.281 3.512a4.478 4.478 0 0 0 1.237 4.032c1.214 1.186 3.14 1.578 4.734.927 1.408-.576 2.47-1.927 2.691-3.431.272-1.856-.788-3.832-2.495-4.629a4.413 4.413 0 0 0-1.886-.411zM7.046 9.962L2.259 4.963A12.043 12.043 0 0 1 11.997 0c4.56 0 8.744 2.592 10.774 6.675H12.558c-1.811-.125-3.288.52-4.265 1.453a5.345 5.345 0 0 0-1.247 1.834z" fill="#fff"/></svg>
|
||||
|
After Width: | Height: | Size: 863 B |
1
src/assets/img/devices/edge.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24"><title>Microsoft Edge icon</title><path d="M23.158 14.25H7.821c0 .578.086 1.103.262 1.575.188.465.431.881.743 1.245.31.364.675.675 1.102.938.413.262.863.48 1.343.648.476.173.975.3 1.48.383a10.078 10.078 0 0 0 3.311-.026c.564-.105 1.111-.244 1.651-.42.54-.177 1.061-.387 1.583-.627.525-.24 1.057-.502 1.605-.795v5.085c-.612.3-1.212.552-1.812.769-.6.21-1.2.394-1.81.54-.612.15-1.23.263-1.865.33a18.41 18.41 0 0 1-1.957.105c-.9 0-1.77-.105-2.606-.311a10.217 10.217 0 0 1-2.355-.893 9.869 9.869 0 0 1-2.018-1.417 8.957 8.957 0 0 1-2.595-4.148 9.359 9.359 0 0 1-.356-2.61c0-.986.135-1.924.405-2.82.274-.9.66-1.717 1.17-2.467a8.92 8.92 0 0 1 1.856-1.999A9.82 9.82 0 0 1 9.426 5.91a5.206 5.206 0 0 0-1.163 1.774 7.671 7.671 0 0 0-.536 2.055h8.542c0-.863-.086-1.613-.262-2.258-.176-.645-.458-1.181-.851-1.605-.39-.427-.893-.75-1.512-.96-.618-.214-1.365-.322-2.238-.322-1.032 0-2.063.15-3.094.461-1.031.3-2.01.731-2.94 1.275-.93.551-1.785 1.2-2.565 1.942-.78.75-1.436 1.557-1.969 2.43a14 14 0 0 1 .649-2.913C1.798 6.863 2.21 6 2.706 5.2a11.606 11.606 0 0 1 1.74-2.152c.663-.645 1.398-1.2 2.212-1.65C7.472.949 8.334.585 9.272.34A13.4 13.4 0 0 1 12.257 0c.615 0 1.226.056 1.837.165.612.113 1.208.263 1.79.458 1.154.397 2.185.952 3.093 1.657a10.553 10.553 0 0 1 2.287 2.449c.62.926 1.088 1.95 1.41 3.063.323 1.114.488 2.273.488 3.477v2.981z" fill="#fff"/></svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
1
src/assets/img/devices/firefox.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg viewBox="0 0 24 24" role="img" xmlns="http://www.w3.org/2000/svg"><title>Mozilla Firefox icon</title><path d="M23.41 10.98c-.03-.21-.07-.34-.07-.34s-.08.1-.22.28c-.04-.51-.13-1.02-.27-1.51-.18-.62-.41-1.22-.7-1.79-.18-.38-.39-.75-.64-1.09-.13-.2-.24-.35-.26-.38-.43-.7-.91-1.12-1.48-1.92-.36-.61-.61-1.29-.73-1.99-.16.42-.28.86-.36 1.3-.57-.58-1.08-1-1.38-1.28C15.8.86 15.98.14 15.98.14s-2.8 3.12-1.59 6.37c.42 1.1 1.14 2.07 2.09 2.78 1.17.96 2.43 1.72 3.09 3.67-.53-1.03-1.34-1.88-2.33-2.47.3.71.45 1.46.44 2.23 0 2.92-2.37 5.29-5.3 5.29-.39 0-.79-.04-1.17-.13-.46-.09-.9-.24-1.31-.45-.62-.37-1.16-.86-1.58-1.45v-.01c.05.02.08.03.09.03.22.08.44.14.67.18.9.19 1.83.08 2.66-.31.84-.47 1.35-.81 1.76-.68.41.13.72-.26.44-.67-.5-.65-1.32-.96-2.12-.82-.84.12-1.61.71-2.7.14-.08-.04-.14-.08-.21-.12-.07-.05.24.06.16.01-.24-.12-.47-.25-.69-.41-.01-.01.17.05.15.04-.28-.19-.53-.44-.72-.73-.19-.35-.21-.78-.05-1.15.11-.19.26-.33.45-.42.14.07.23.12.23.12s-.07-.12-.1-.18c.01-.01.02 0 .04-.01.12.05.39.19.54.28.1.05.18.13.25.22 0 0 .05-.02.01-.13-.05-.13-.14-.24-.26-.31h.02c.11.06.21.12.31.2.09-.22.14-.44.13-.67.01-.13-.01-.26-.05-.37-.04-.08.02-.11.09-.03-.01-.06-.03-.12-.06-.18 0 0 .04-.06.06-.07.05-.05.1-.1.16-.13.35-.22.71-.41 1.09-.56.31-.13.56-.24.61-.27.08-.05.15-.1.22-.16.26-.22.43-.52.49-.85.01-.05.01-.09.01-.13V7.75c-.04-.17-.33-.29-1.84-.44-.53-.08-.96-.48-1.08-1.01v.01c-.02.05-.04.11-.06.17.02-.06.04-.11.06-.17V6.3c.29-.75.81-1.4 1.48-1.84.04-.03-.15.01-.11-.02.12-.06.25-.12.39-.17.07-.02-.29-.16-.61-.13-.19.01-.38.06-.56.13.08-.06.3-.14.25-.14-.41.07-.8.22-1.15.43 0-.04.01-.07.02-.1-.28.12-.53.31-.71.55v-.13c-.13.1-.24.21-.35.33h-.01c-.83-.32-1.73-.4-2.61-.22l-.01-.01h.01c-.18-.14-.34-.32-.46-.52l-.01.01-.02-.02c-.06-.08-.11-.18-.17-.29-.05-.07-.09-.16-.14-.25 0 0 0-.01-.01-.01s-.03.09-.04.06c-.15-.4-.23-.83-.21-1.25h-.01c-.25.17-.44.41-.53.7-.05.1-.08.15-.11.21v-.03l.03-.15c-.01.01-.01.02-.02.03-.07.08-.13.17-.18.27-.05.09-.09.19-.12.29v-.05c0-.04.01-.1 0-.08l-.01.03c-.32.71-.53 1.47-.6 2.25-.02.14-.02.27-.02.4v.02c-.23.25-.43.52-.61.81-.58.98-1.01 2.04-1.28 3.15.19-.42.42-.83.69-1.21C.76 10.66.5 12.04.5 13.44c.09-.41.2-.81.33-1.21-.08 1.65.24 3.3.93 4.81.93 2.08 2.47 3.83 4.43 5.01.79.54 1.66.96 2.57 1.24.12.04.25.09.37.13-.04-.02-.07-.04-.11-.05 1.08.32 2.21.49 3.34.49 4.01 0 5.33-1.53 5.46-1.68.19-.18.36-.39.47-.64.08-.03.15-.06.23-.1l.05-.02c.06-.03.09-.04.09-.04.61-.29 1.18-.64 1.7-1.06.78-.56 1.33-1.38 1.57-2.31.15-.34.15-.71.03-1.06.06-.1.11-.19.12-.21.86-1.38 1.35-2.96 1.42-4.59v-.01-.13c0-.34-.03-.69-.09-1.03z" fill="#fff"/></svg>
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
1
src/assets/img/devices/html5.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>HTML5 icon</title><path d="M1.5 0h21l-1.91 21.563L11.977 24l-8.564-2.438L1.5 0zm7.031 9.75l-.232-2.718 10.059.003.23-2.622L5.412 4.41l.698 8.01h9.126l-.326 3.426-2.91.804-2.955-.81-.188-2.11H6.248l.33 4.171L12 19.351l5.379-1.443.744-8.157H8.531z" fill="#fff"/></svg>
|
||||
|
After Width: | Height: | Size: 345 B |
11
src/assets/img/devices/kodi.svg
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="translate(-36.173 -93.796)">
|
||||
<g transform="matrix(.08 0 0 .08 40.527 88.485)">
|
||||
<path d="m53.295 119.35v-39.688h79.375v79.375h-79.375z" fill="#fcfdfd" stroke-width=".26458"/>
|
||||
</g>
|
||||
<g transform="matrix(1.3761 0 0 1.3825 -26.63 -38.456)" fill="#fff">
|
||||
<path transform="matrix(.08 0 0 .08 40.527 88.485)" d="m86.822 141.89c-4.738-4.7596-5.2168-5.3235-5.2168-6.1442 0-0.82158 0.47505-1.3787 5.2329-6.1365 4.7552-4.7552 5.3153-5.2329 6.1353-5.2329 0.81617 0 1.3676 0.46161 5.7678 4.8286 4.8692 4.8324 5.6182 5.7452 5.6182 6.8466 0 0.41218-1.5697 2.1641-5.2274 5.834-4.8206 4.8367-5.3 5.2449-6.1603 5.2449-0.86046 0-1.3378-0.40681-6.1497-5.2406zm22.168-12.455c-0.43656-0.27248-2.9071-2.6371-5.4901-5.2547-4.1957-4.2519-4.6964-4.8534-4.6964-5.6418 0-0.7938 0.52954-1.414 5.2644-6.1655 4.6582-4.6746 5.362-5.2829 6.1127-5.2829 0.75071 0 1.4546 0.60829 6.1127 5.2829 4.7729 4.7898 5.2644 5.3668 5.2644 6.1818 0 0.81542-0.48628 1.3851-5.2394 6.1382-5.6104 5.6104-5.7707 5.7142-7.3283 4.742zm-40.16-5.2731c-3.5636-3.5816-4.9518-5.1483-4.9518-5.5886 0-0.75745 9.3384-10.601 10.057-10.601 0.2584 0 0.54208 0.18833 0.63041 0.41851s0.1606 4.7624 0.1606 10.072c0 9.1098-0.10948 10.677-0.74606 10.677-0.10905 0-2.4266-2.2396-5.1501-4.9768zm13.2-1.5272c-0.08833-0.23018-0.1606-5.3558-0.1606-11.39 0-8.9734 0.06852-11.102 0.37621-11.686 0.20691-0.39296 2.447-2.7683 4.9781-5.2785 4.3226-4.2871 4.6624-4.5641 5.5987-4.5641 0.94583 0 1.2591 0.26717 6.1277 5.2255 4.658 4.7439 5.1315 5.3102 5.1376 6.1439 6e-3 0.85888-0.67407 1.6-10.506 11.443-5.782 5.7887-10.71 10.525-10.952 10.525s-0.51144-0.18833-0.59977-0.41852z" fill="#fff" stroke-width=".26458"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
1
src/assets/img/devices/msie.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24"><title>Internet Explorer icon</title><path d="M22.8 7.381c1.125-2.7 1.2-4.95-.15-6.3-1.5-1.499-5.1-1.05-8.924.75h-.45c-2.7 0-5.324.976-7.274 2.7-1.65 1.5-2.85 3.45-3.375 5.625.375-.45 2.475-2.925 4.875-4.275.075 0 .675-.375.675-.375-.075 0-1.2 1.125-1.425 1.35-5.25 5.4-8.324 13.574-5.924 15.973 1.574 1.575 4.424 1.2 7.724-.6 1.425.675 3 .975 4.724.975 2.25 0 4.35-.6 6.15-1.8 1.874-1.2 3.224-3.074 4.05-5.249h-5.85c-.75 1.425-2.475 2.4-4.275 2.4-2.55 0-4.65-2.1-4.724-4.5V13.83h15.298v-.225c0-.375.075-.825.075-1.124 0-1.8-.45-3.525-1.2-5.1zM2.477 22.38c-1.2-1.2-.824-3.524.6-6.299.675 1.875 1.8 3.525 3.225 4.725.45.375.975.75 1.5 1.05-2.4 1.274-4.35 1.5-5.325.524zm15.374-11.398H8.702v-.075c.15-2.325 2.324-4.35 4.874-4.35 2.4 0 4.35 1.875 4.5 4.35v.075zm4.574-4.2c-.45-.75-1.05-1.5-1.725-2.1a11.213 11.213 0 0 0-3.6-2.25c2.4-1.124 4.425-1.274 5.475-.224.825.975.75 2.624-.15 4.574 0 .075 0 .075 0 0 0 .075 0 .075 0 0z" fill="#fff"/></svg>
|
||||
|
After Width: | Height: | Size: 1015 B |
1
src/assets/img/devices/opera.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Opera icon</title><path d="M8.051 5.238c-1.328 1.566-2.186 3.883-2.246 6.48v.564c.061 2.598.918 4.912 2.246 6.479 1.721 2.236 4.279 3.654 7.139 3.654 1.756 0 3.4-.537 4.807-1.471C17.879 22.846 15.074 24 12 24c-.192 0-.383-.004-.57-.014C5.064 23.689 0 18.436 0 12 0 5.371 5.373 0 12 0h.045c3.055.012 5.84 1.166 7.953 3.055-1.408-.93-3.051-1.471-4.81-1.471-2.858 0-5.417 1.42-7.14 3.654h.003zM24 12c0 3.556-1.545 6.748-4.002 8.945-3.078 1.5-5.946.451-6.896-.205 3.023-.664 5.307-4.32 5.307-8.74 0-4.422-2.283-8.075-5.307-8.74.949-.654 3.818-1.703 6.896-.205C22.455 5.25 24 8.445 24 12z" fill="#fff"/></svg>
|
||||
|
After Width: | Height: | Size: 683 B |
1
src/assets/img/devices/other.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M3 6h18V4H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h4v-2H3V6zm10 6H9v1.78c-.61.55-1 1.33-1 2.22s.39 1.67 1 2.22V20h4v-1.78c.61-.55 1-1.34 1-2.22s-.39-1.67-1-2.22V12zm-2 5.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM22 8h-6c-.5 0-1 .5-1 1v10c0 .5.5 1 1 1h6c.5 0 1-.5 1-1V9c0-.5-.5-1-1-1zm-1 10h-4v-8h4v8z" fill="#fff"/></svg>
|
||||
|
After Width: | Height: | Size: 453 B |
1
src/assets/img/devices/playstation.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>PlayStation icon</title><path d="M8.985 2.596v17.548l3.915 1.261V6.688c0-.69.304-1.151.794-.991.636.181.76.814.76 1.505v5.876c2.441 1.193 4.362-.002 4.362-3.153 0-3.237-1.126-4.675-4.438-5.827-1.307-.448-3.728-1.186-5.391-1.502h-.002zm4.656 16.242l6.296-2.275c.715-.258.826-.625.246-.818-.586-.192-1.637-.139-2.357.123l-4.205 1.499v-2.385l.24-.085s1.201-.42 2.913-.615c1.696-.18 3.785.029 5.437.661 1.848.601 2.041 1.472 1.576 2.072s-1.622 1.036-1.622 1.036l-8.544 3.107v-2.297l.02-.023zM1.808 18.6c-1.9-.545-2.214-1.668-1.352-2.321.801-.585 2.159-1.051 2.159-1.051l5.616-2.013v2.313L4.206 17c-.705.271-.825.632-.239.826.586.195 1.637.15 2.343-.12L8.248 17v2.074c-.121.029-.256.044-.391.073-1.938.331-3.995.196-6.037-.479l-.012-.068z" fill="#fff"/></svg>
|
||||
|
After Width: | Height: | Size: 833 B |
1
src/assets/img/devices/safari.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>safari icon</title><path d="M12 24C5.373 24 0 18.627 0 12S5.373 0 12 0s12 5.373 12 12-5.373 12-12 12zm0-.75c6.213 0 11.25-5.037 11.25-11.25S18.213.75 12 .75.75 5.787.75 12 5.787 23.25 12 23.25zM12 2a.25.25 0 0 1 .25.25v1a.25.25 0 1 1-.5 0v-1A.25.25 0 0 1 12 2zm0 18.5a.25.25 0 0 1 .25.25v1a.25.25 0 1 1-.5 0v-1a.25.25 0 0 1 .25-.25zm7.071-15.571a.25.25 0 0 1 0 .353l-.707.708a.25.25 0 0 1-.354-.354l.708-.707a.25.25 0 0 1 .353 0zM5.99 18.01a.25.25 0 0 1 0 .354l-.708.707a.25.25 0 1 1-.353-.353l.707-.708a.25.25 0 0 1 .354 0zM4.929 4.93a.25.25 0 0 1 .353 0l.708.707a.25.25 0 0 1-.354.354l-.707-.708a.25.25 0 0 1 0-.353zM18.01 18.01a.25.25 0 0 1 .354 0l.707.708a.25.25 0 1 1-.353.353l-.708-.707a.25.25 0 0 1 0-.354zM2 12a.25.25 0 0 1 .25-.25h1a.25.25 0 1 1 0 .5h-1A.25.25 0 0 1 2 12zm18.5 0a.25.25 0 0 1 .25-.25h1a.25.25 0 1 1 0 .5h-1a.25.25 0 0 1-.25-.25zm-4.593-9.205a.25.25 0 0 1 .133.328l-.391.92a.25.25 0 1 1-.46-.195l.39-.92a.25.25 0 0 1 .328-.133zM8.68 19.825a.25.25 0 0 1 .132.327l-.39.92a.25.25 0 0 1-.46-.195l.39-.92a.25.25 0 0 1 .328-.133zM21.272 8.253a.25.25 0 0 1-.138.325l-.927.375a.25.25 0 1 1-.188-.464l.927-.374a.25.25 0 0 1 .326.138zm-17.153 6.93a.25.25 0 0 1-.138.326l-.927.374a.25.25 0 1 1-.188-.463l.927-.375a.25.25 0 0 1 .326.138zM8.254 2.728a.25.25 0 0 1 .325.138l.375.927a.25.25 0 0 1-.464.188l-.374-.927a.25.25 0 0 1 .138-.326zm6.93 17.153a.25.25 0 0 1 .326.138l.374.927a.25.25 0 1 1-.463.188l-.375-.927a.25.25 0 0 1 .138-.326zM2.795 8.093a.25.25 0 0 1 .328-.133l.92.391a.25.25 0 0 1-.195.46l-.92-.39a.25.25 0 0 1-.133-.328zm17.03 7.228a.25.25 0 0 1 .327-.132l.92.39a.25.25 0 1 1-.195.46l-.92-.39a.25.25 0 0 1-.133-.328zM12.879 12.879L11.12 11.12l-4.141 5.9 5.899-4.142zm6.192-7.95l-5.834 8.308-8.308 5.834 5.834-8.308 8.308-5.834z" fill="#fff"/></svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
1
src/assets/img/devices/samsungtv.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24"><title>Samsung icon</title><path d="M19.8166 10.2808l.0459 2.6934h-.023l-.7793-2.6934h-1.2837v3.3925h.8481l-.0458-2.785h.023l.8366 2.785h1.2264v-3.3925zm-16.149 0l-.6418 3.427h.9284l.4699-3.1175h.0229l.4585 3.1174h.9169l-.6304-3.4269zm5.1805 0l-.424 2.6132h-.023l-.424-2.6132H6.5788l-.0688 3.427h.8596l.023-3.0832h.0114l.573 3.0831h.8711l.5731-3.083h.023l.0228 3.083h.8596l-.0802-3.4269zm-7.2664 2.4527c.0343.0802.0229.1949.0114.2522-.0229.1146-.1031.2292-.3324.2292-.2177 0-.3438-.126-.3438-.3095v-.3323H0v.2636c0 .7679.6074.9971 1.2493.9971.6189 0 1.1346-.2178 1.2149-.7794.0458-.298.0114-.4928 0-.5616-.1605-.722-1.467-.9283-1.5588-1.3295-.0114-.0688-.0114-.1375 0-.1834.023-.1146.1032-.2292.3095-.2292.2063 0 .321.126.321.3095v.2063h.8595v-.2407c0-.745-.6762-.8596-1.1576-.8596-.6074 0-1.1117.2063-1.2034.7564-.023.149-.0344.2866.0114.4585.1376.7106 1.364.9169 1.5358 1.3524m11.152 0c.0343.0803.0228.1834.0114.2522-.023.1146-.1032.2292-.3324.2292-.2178 0-.3438-.126-.3438-.3095v-.3323h-.917v.2636c0 .7564.596.9857 1.2379.9857.6189 0 1.1232-.2063 1.2034-.7794.0459-.298.0115-.4814 0-.5616-.1375-.7106-1.4327-.9284-1.5243-1.318-.0115-.0688-.0115-.1376 0-.1835.0229-.1146.1031-.2292.3094-.2292.1948 0 .321.126.321.3095v.2063h.848v-.2407c0-.745-.6647-.8596-1.146-.8596-.6075 0-1.1004.1948-1.192.7564-.023.149-.023.2866.0114.4585.1376.7106 1.341.9054 1.513 1.3524m2.8882.4585c.2407 0 .3094-.1605.3323-.2522.0115-.0343.0115-.0917.0115-.126v-2.533h.871v2.4642c0 .0688 0 .1948-.0114.2292-.0573.6419-.5616.8482-1.192.8482-.6303 0-1.1346-.2063-1.192-.8482 0-.0344-.0114-.1604-.0114-.2292v-2.4642h.871v2.533c0 .0458 0 .0916.0115.126 0 .0917.0688.2522.3095.2522m7.1518-.0344c.2522 0 .3324-.1605.3553-.2522.0115-.0343.0115-.0917.0115-.126v-.4929h-.3553v-.5043H24v.917c0 .0687 0 .1145-.0115.2292-.0573.6303-.596.8481-1.2034.8481-.6075 0-1.1461-.2178-1.2034-.8481-.0115-.1147-.0115-.1605-.0115-.2293v-1.444c0-.0574.0115-.172.0115-.2293.0802-.6419.596-.8482 1.2034-.8482s1.1347.2063 1.2034.8482c.0115.1031.0115.2292.0115.2292v.1146h-.8596v-.1948s0-.0803-.0115-.1261c-.0114-.0802-.0802-.2521-.3438-.2521-.2521 0-.321.1604-.3438.2521-.0115.0458-.0115.1032-.0115.1605v1.5702c0 .0458 0 .0916.0115.126 0 .0917.0917.2522.3323.2522" fill="#fff"/></svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
1
src/assets/img/devices/windows.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Windows icon</title><path d="M0 3.449L9.75 2.1v9.451H0m10.949-9.602L24 0v11.4H10.949M0 12.6h9.75v9.451L0 20.699M10.949 12.6H24V24l-12.9-1.801" fill="#fff"/></svg>
|
||||
|
After Width: | Height: | Size: 241 B |
1
src/assets/img/devices/xbox.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Xbox icon</title><path d="M4.102 21.033C6.211 22.881 8.977 24 12 24c3.026 0 5.789-1.119 7.902-2.967 1.877-1.912-4.316-8.709-7.902-11.417-3.582 2.708-9.779 9.505-7.898 11.417zm11.16-14.406c2.5 2.961 7.484 10.313 6.076 12.912C23.002 17.48 24 14.861 24 12.004c0-3.34-1.365-6.362-3.57-8.536 0 0-.027-.022-.082-.042-.063-.022-.152-.045-.281-.045-.592 0-1.985.434-4.805 3.246zM3.654 3.426c-.057.02-.082.041-.086.042C1.365 5.642 0 8.664 0 12.004c0 2.854.998 5.473 2.661 7.533-1.401-2.605 3.579-9.951 6.08-12.91-2.82-2.813-4.216-3.245-4.806-3.245-.131 0-.223.021-.281.046v-.002zM12 3.551S9.055 1.828 6.755 1.746c-.903-.033-1.454.295-1.521.339C7.379.646 9.659 0 11.984 0H12c2.334 0 4.605.646 6.766 2.085-.068-.046-.615-.372-1.52-.339C14.946 1.828 12 3.545 12 3.545v.006z" fill="#fff"/></svg>
|
||||
|
After Width: | Height: | Size: 861 B |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
20
src/assets/img/fresh.svg
Normal file
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg id="svg3390" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="141.25" viewBox="0 0 138.75 141.25" width="138.75" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<metadata id="metadata3396">
|
||||
<rdf:RDF>
|
||||
<cc:Work rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<dc:title/>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g id="layer1" fill="#f93208">
|
||||
<path id="path3412" d="m20.154 40.829c-28.149 27.622-13.657 61.011-5.734 71.931 35.254 41.954 92.792 25.339 111.89-5.9071 4.7608-8.2027 22.554-53.467-23.976-78.009z"/>
|
||||
<path id="path3471" d="m39.613 39.265 4.7778-8.8607 28.406-5.0384 11.119 9.2082z"/>
|
||||
</g>
|
||||
<g id="layer2">
|
||||
<path id="path3437" d="m39.436 8.5696 8.9682-5.2826 6.7569 15.479c3.7925-6.3226 13.79-16.316 24.939-4.6684-4.7281 1.2636-7.5161 3.8553-7.7397 8.4768 15.145-4.1697 31.343 3.2127 33.539 9.0911-10.951-4.314-27.695 10.377-41.771 2.334 0.009 15.045-12.617 16.636-19.902 17.076 2.077-4.996 5.591-9.994 1.474-14.987-7.618 8.171-13.874 10.668-33.17 4.668 4.876-1.679 14.843-11.39 24.448-11.425-6.775-2.467-12.29-2.087-17.814-1.475 2.917-3.961 12.149-15.197 28.625-8.476z" fill="#02902e"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
BIN
src/assets/img/icon-transparent.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
1
src/assets/img/rotten.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="145" height="140"><path fill="#0fc755" d="M47.4 35.342c-13.607-7.935-12.32-25.203 2.097-31.88 26.124-6.531 29.117 13.78 22.652 30.412-6.542 24.11 18.095 23.662 19.925 10.067 3.605-18.412 19.394-26.695 31.67-16.359 12.598 12.135 7.074 36.581-17.827 34.187-16.03-1.545-19.552 19.585.839 21.183 32.228 1.915 42.49 22.167 31.04 35.865-15.993 15.15-37.691-4.439-45.512-19.505-6.8-9.307-17.321.11-13.423 6.502 12.983 19.465 2.923 31.229-10.906 30.62-13.37-.85-20.96-9.06-13.214-29.15 3.897-12.481-8.595-15.386-16.57-5.45-11.707 19.61-28.865 13.68-33.976 4.19-3.243-7.621-2.921-25.846 24.119-23.696 16.688 4.137 11.776-12.561-.63-13.633-9.245-.443-30.501-7.304-22.86-24.54 7.34-11.056 24.958-11.768 33.348 6.293 3.037 4.232 8.361 11.042 18.037 5.033 3.51-5.197 1.21-13.9-8.809-20.135z"/></svg>
|
||||
|
After Width: | Height: | Size: 833 B |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
@@ -5,4 +5,4 @@
|
||||
<div id="pluginTiles" style="text-align:left;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
139
src/bower_components/Sortable/Sortable.html
vendored
@@ -1,139 +0,0 @@
|
||||
<link rel="import" href="../polymer/polymer.html">
|
||||
<script src="./Sortable.js"></script>
|
||||
|
||||
<dom-module id="sortable-js">
|
||||
<template>
|
||||
<content></content>
|
||||
</template>
|
||||
</dom-module>
|
||||
<script>
|
||||
Polymer({
|
||||
is: "sortable-js",
|
||||
|
||||
properties: {
|
||||
group : { type: String, value: () => Math.random(), observer: "groupChanged" },
|
||||
sort : { type: Boolean, value: true, observer: "sortChanged" },
|
||||
disabled : { type: Boolean, value: false, observer: "disabledChanged" },
|
||||
store : { type: Object, value: null, observer: "storeChanged" },
|
||||
handle : { type: String, value: null, observer: "handleChanged" },
|
||||
scrollSensitivity : { type: Number, value: 30, observer: "scrollSensitivityChanged" },
|
||||
scrollSpeed : { type: Number, value: 10, observer: "scrollSpeedChanged" },
|
||||
ghostClass : { type: String, value: "sortable-ghost", observer: "ghostClassChanged" },
|
||||
chosenClass : { type: String, value: "sortable-chosen", observer: "chosenClassChanged" },
|
||||
ignore : { type: String, value: "a, img", observer: "ignoreChanged" },
|
||||
filter : { type: Object, value: null, observer: "filterChanged" },
|
||||
animation : { type: Number, value: 0, observer: "animationChanged" },
|
||||
dropBubble : { type: Boolean, value: false, observer: "dropBubbleChanged" },
|
||||
dragoverBubble : { type: Boolean, value: false, observer: "dragoverBubbleChanged" },
|
||||
dataIdAttr : { type: String, value: "data-id", observer: "dataIdAttrChanged" },
|
||||
delay : { type: Number, value: 0, observer: "delayChanged" },
|
||||
forceFallback : { type: Boolean, value: false, observer: "forceFallbackChanged" },
|
||||
fallbackClass : { type: String, value: "sortable-fallback", observer: "fallbackClassChanged" },
|
||||
fallbackOnBody : { type: Boolean, value: false, observer: "fallbackOnBodyChanged" },
|
||||
draggable : {},
|
||||
scroll : {}
|
||||
},
|
||||
|
||||
created() {
|
||||
// override default DOM property behavior
|
||||
Object.defineProperties(this, {
|
||||
draggable: { get() { return this._draggable || this.getAttribute("draggable") || ">*"}, set(value) { this._draggable = value; this.draggableChanged(value)} },
|
||||
scroll: { get() { return this._scroll || JSON.parse(this.getAttribute("scroll") || "true") }, set(value) { this._scroll = value; this.scrollChanged(value)} }
|
||||
})
|
||||
},
|
||||
|
||||
attached: function() {
|
||||
// Given
|
||||
// <sortable-js>
|
||||
// <template is="dom-repeat" items={{data}}>
|
||||
// <div>
|
||||
// <template is="dom-if" if="true">
|
||||
// <span>hello</span></template></div>
|
||||
// After render, it becomes
|
||||
// <sortable-js>
|
||||
// <div>
|
||||
// <span>hello</span>
|
||||
// <template is="dom-if">
|
||||
// <tempalte is="dom-repeat">
|
||||
var templates = this.querySelectorAll("template[is='dom-repeat']")
|
||||
var template = templates[templates.length-1]
|
||||
|
||||
var options = {}
|
||||
Object.keys(this.properties).forEach(key => {
|
||||
options[key] = this[key]
|
||||
})
|
||||
|
||||
this.sortable = Sortable.create(this, Object.assign(options, {
|
||||
onUpdate: e => {
|
||||
if (template) {
|
||||
template.splice("items", e.newIndex, 0, template.splice("items", e.oldIndex, 1)[0])
|
||||
}
|
||||
this.fire("update", e)
|
||||
},
|
||||
|
||||
onAdd: e => {
|
||||
if (template) {
|
||||
var froms = e.from.querySelectorAll("template[is='dom-repeat']")
|
||||
var from = froms[froms.length-1]
|
||||
var item = from.items[e.oldIndex]
|
||||
template.splice("items", e.newIndex, 0, item)
|
||||
}
|
||||
this.fire("add", e)
|
||||
},
|
||||
|
||||
onRemove: e => {
|
||||
if (template) {
|
||||
template.splice("items", e.oldIndex, 1)[0]
|
||||
}
|
||||
this.fire("remove", e)
|
||||
},
|
||||
|
||||
onStart: e => {
|
||||
this.fire("start", e)
|
||||
},
|
||||
|
||||
onEnd: e => {
|
||||
this.fire("end", e)
|
||||
},
|
||||
|
||||
onSort: e => {
|
||||
this.fire("sort", e)
|
||||
},
|
||||
|
||||
onFilter: e => {
|
||||
this.fire("filter", e)
|
||||
},
|
||||
|
||||
onMove: e => {
|
||||
this.fire("move", e)
|
||||
}
|
||||
}))
|
||||
},
|
||||
|
||||
detached: function() {
|
||||
this.sortable.destroy()
|
||||
},
|
||||
|
||||
groupChanged : function(value) { this.sortable && this.sortable.option("group", value) },
|
||||
sortChanged : function(value) { this.sortable && this.sortable.option("sort", value) },
|
||||
disabledChanged : function(value) { this.sortable && this.sortable.option("disabled", value) },
|
||||
storeChanged : function(value) { this.sortable && this.sortable.option("store", value) },
|
||||
handleChanged : function(value) { this.sortable && this.sortable.option("handle", value) },
|
||||
scrollChanged : function(value) { this.sortable && this.sortable.option("scroll", value) },
|
||||
scrollSensitivityChanged : function(value) { this.sortable && this.sortable.option("scrollSensitivity", value) },
|
||||
scrollSpeedChanged : function(value) { this.sortable && this.sortable.option("scrollSpeed", value) },
|
||||
draggableChanged : function(value) { this.sortable && this.sortable.option("draggable", value) },
|
||||
ghostClassChanged : function(value) { this.sortable && this.sortable.option("ghostClass", value) },
|
||||
chosenClassChanged : function(value) { this.sortable && this.sortable.option("chosenClass", value) },
|
||||
ignoreChanged : function(value) { this.sortable && this.sortable.option("ignore", value) },
|
||||
filterChanged : function(value) { this.sortable && this.sortable.option("filter", value) },
|
||||
animationChanged : function(value) { this.sortable && this.sortable.option("animation", value) },
|
||||
dropBubbleChanged : function(value) { this.sortable && this.sortable.option("dropBubble", value) },
|
||||
dragoverBubbleChanged : function(value) { this.sortable && this.sortable.option("dragoverBubble", value) },
|
||||
dataIdAttrChanged : function(value) { this.sortable && this.sortable.option("dataIdAttr", value) },
|
||||
delayChanged : function(value) { this.sortable && this.sortable.option("delay", value) },
|
||||
forceFallbackChanged : function(value) { this.sortable && this.sortable.option("forceFallback", value) },
|
||||
fallbackClassChanged : function(value) { this.sortable && this.sortable.option("fallbackClass", value) },
|
||||
fallbackOnBodyChanged : function(value) { this.sortable && this.sortable.option("fallbackOnBody", value) }
|
||||
})
|
||||
</script>
|
||||
393
src/bower_components/Sortable/Sortable.min.js
vendored
@@ -1,393 +0,0 @@
|
||||
/*! Sortable 1.4.2 - MIT | git://github.com/rubaxa/Sortable.git */ ! function(a) {
|
||||
"use strict";
|
||||
"function" == typeof define && define.amd ? define(a) : "undefined" != typeof module && "undefined" != typeof module.exports ? module.exports = a() : "undefined" != typeof Package ? Sortable = a() : window.Sortable = a()
|
||||
}(function() {
|
||||
"use strict";
|
||||
|
||||
function a(a, b) {
|
||||
if (!a || !a.nodeType || 1 !== a.nodeType) throw "Sortable: `el` must be HTMLElement, and not " + {}.toString.call(a);
|
||||
this.el = a, this.options = b = r({}, b), a[L] = this;
|
||||
var c = {
|
||||
group: Math.random(),
|
||||
sort: !0,
|
||||
disabled: !1,
|
||||
store: null,
|
||||
handle: null,
|
||||
scroll: !0,
|
||||
scrollSensitivity: 30,
|
||||
scrollSpeed: 10,
|
||||
draggable: /[uo]l/i.test(a.nodeName) ? "li" : ">*",
|
||||
ghostClass: "sortable-ghost",
|
||||
chosenClass: "sortable-chosen",
|
||||
ignore: "a, img",
|
||||
filter: null,
|
||||
animation: 0,
|
||||
setData: function(a, b) {
|
||||
a.setData("Text", b.textContent)
|
||||
},
|
||||
dropBubble: !1,
|
||||
dragoverBubble: !1,
|
||||
dataIdAttr: "data-id",
|
||||
delay: 0,
|
||||
forceFallback: !1,
|
||||
fallbackClass: "sortable-fallback",
|
||||
fallbackOnBody: !1
|
||||
};
|
||||
for (var d in c) !(d in b) && (b[d] = c[d]);
|
||||
V(b);
|
||||
for (var f in this) "_" === f.charAt(0) && (this[f] = this[f].bind(this));
|
||||
this.nativeDraggable = b.forceFallback ? !1 : P, e(a, "mousedown", this._onTapStart), e(a, "touchstart", this._onTapStart), this.nativeDraggable && (e(a, "dragover", this), e(a, "dragenter", this)), T.push(this._onDragOver), b.store && this.sort(b.store.get(this))
|
||||
}
|
||||
|
||||
function b(a) {
|
||||
v && v.state !== a && (h(v, "display", a ? "none" : ""), !a && v.state && w.insertBefore(v, s), v.state = a)
|
||||
}
|
||||
|
||||
function c(a, b, c) {
|
||||
if (a) {
|
||||
c = c || N, b = b.split(".");
|
||||
var d = b.shift().toUpperCase(),
|
||||
e = new RegExp("\\s(" + b.join("|") + ")(?=\\s)", "g");
|
||||
do
|
||||
if (">*" === d && a.parentNode === c || ("" === d || a.nodeName.toUpperCase() == d) && (!b.length || ((" " + a.className + " ").match(e) || []).length == b.length)) return a; while (a !== c && (a = a.parentNode))
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
function d(a) {
|
||||
a.dataTransfer && (a.dataTransfer.dropEffect = "move"), a.preventDefault()
|
||||
}
|
||||
|
||||
function e(a, b, c) {
|
||||
a.addEventListener(b, c, !1)
|
||||
}
|
||||
|
||||
function f(a, b, c) {
|
||||
a.removeEventListener(b, c, !1)
|
||||
}
|
||||
|
||||
function g(a, b, c) {
|
||||
if (a)
|
||||
if (a.classList) a.classList[c ? "add" : "remove"](b);
|
||||
else {
|
||||
var d = (" " + a.className + " ").replace(K, " ").replace(" " + b + " ", " ");
|
||||
a.className = (d + (c ? " " + b : "")).replace(K, " ")
|
||||
}
|
||||
}
|
||||
|
||||
function h(a, b, c) {
|
||||
var d = a && a.style;
|
||||
if (d) {
|
||||
if (void 0 === c) return N.defaultView && N.defaultView.getComputedStyle ? c = N.defaultView.getComputedStyle(a, "") : a.currentStyle && (c = a.currentStyle), void 0 === b ? c : c[b];
|
||||
b in d || (b = "-webkit-" + b), d[b] = c + ("string" == typeof c ? "" : "px")
|
||||
}
|
||||
}
|
||||
|
||||
function i(a, b, c) {
|
||||
if (a) {
|
||||
var d = a.getElementsByTagName(b),
|
||||
e = 0,
|
||||
f = d.length;
|
||||
if (c)
|
||||
for (; f > e; e++) c(d[e], e);
|
||||
return d
|
||||
}
|
||||
return []
|
||||
}
|
||||
|
||||
function j(a, b, c, d, e, f, g) {
|
||||
var h = N.createEvent("Event"),
|
||||
i = (a || b[L]).options,
|
||||
j = "on" + c.charAt(0).toUpperCase() + c.substr(1);
|
||||
h.initEvent(c, !0, !0), h.to = b, h.from = e || b, h.item = d || b, h.clone = v, h.oldIndex = f, h.newIndex = g, b.dispatchEvent(h), i[j] && i[j].call(a, h)
|
||||
}
|
||||
|
||||
function k(a, b, c, d, e, f) {
|
||||
var g, h, i = a[L],
|
||||
j = i.options.onMove;
|
||||
return g = N.createEvent("Event"), g.initEvent("move", !0, !0), g.to = b, g.from = a, g.dragged = c, g.draggedRect = d, g.related = e || b, g.relatedRect = f || b.getBoundingClientRect(), a.dispatchEvent(g), j && (h = j.call(i, g)), h
|
||||
}
|
||||
|
||||
function l(a) {
|
||||
a.draggable = !1
|
||||
}
|
||||
|
||||
function m() {
|
||||
R = !1
|
||||
}
|
||||
|
||||
function n(a, b) {
|
||||
var c = a.lastElementChild,
|
||||
d = c.getBoundingClientRect();
|
||||
return (b.clientY - (d.top + d.height) > 5 || b.clientX - (d.right + d.width) > 5) && c
|
||||
}
|
||||
|
||||
function o(a) {
|
||||
for (var b = a.tagName + a.className + a.src + a.href + a.textContent, c = b.length, d = 0; c--;) d += b.charCodeAt(c);
|
||||
return d.toString(36)
|
||||
}
|
||||
|
||||
function p(a) {
|
||||
var b = 0;
|
||||
if (!a || !a.parentNode) return -1;
|
||||
for (; a && (a = a.previousElementSibling);) "TEMPLATE" !== a.nodeName.toUpperCase() && b++;
|
||||
return b
|
||||
}
|
||||
|
||||
function q(a, b) {
|
||||
var c, d;
|
||||
return function() {
|
||||
void 0 === c && (c = arguments, d = this, setTimeout(function() {
|
||||
1 === c.length ? a.call(d, c[0]) : a.apply(d, c), c = void 0
|
||||
}, b))
|
||||
}
|
||||
}
|
||||
|
||||
function r(a, b) {
|
||||
if (a && b)
|
||||
for (var c in b) b.hasOwnProperty(c) && (a[c] = b[c]);
|
||||
return a
|
||||
}
|
||||
var s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J = {},
|
||||
K = /\s+/g,
|
||||
L = "Sortable" + (new Date).getTime(),
|
||||
M = window,
|
||||
N = M.document,
|
||||
O = M.parseInt,
|
||||
P = !!("draggable" in N.createElement("div")),
|
||||
Q = function(a) {
|
||||
return a = N.createElement("x"), a.style.cssText = "pointer-events:auto", "auto" === a.style.pointerEvents
|
||||
}(),
|
||||
R = !1,
|
||||
S = Math.abs,
|
||||
T = ([].slice, []),
|
||||
U = q(function(a, b, c) {
|
||||
if (c && b.scroll) {
|
||||
var d, e, f, g, h = b.scrollSensitivity,
|
||||
i = b.scrollSpeed,
|
||||
j = a.clientX,
|
||||
k = a.clientY,
|
||||
l = window.innerWidth,
|
||||
m = window.innerHeight;
|
||||
if (z !== c && (y = b.scroll, z = c, y === !0)) {
|
||||
y = c;
|
||||
do
|
||||
if (y.offsetWidth < y.scrollWidth || y.offsetHeight < y.scrollHeight) break; while (y = y.parentNode)
|
||||
}
|
||||
y && (d = y, e = y.getBoundingClientRect(), f = (S(e.right - j) <= h) - (S(e.left - j) <= h), g = (S(e.bottom - k) <= h) - (S(e.top - k) <= h)), f || g || (f = (h >= l - j) - (h >= j), g = (h >= m - k) - (h >= k), (f || g) && (d = M)), (J.vx !== f || J.vy !== g || J.el !== d) && (J.el = d, J.vx = f, J.vy = g, clearInterval(J.pid), d && (J.pid = setInterval(function() {
|
||||
d === M ? M.scrollTo(M.pageXOffset + f * i, M.pageYOffset + g * i) : (g && (d.scrollTop += g * i), f && (d.scrollLeft += f * i))
|
||||
}, 24)))
|
||||
}
|
||||
}, 30),
|
||||
V = function(a) {
|
||||
var b = a.group;
|
||||
b && "object" == typeof b || (b = a.group = {
|
||||
name: b
|
||||
}), ["pull", "put"].forEach(function(a) {
|
||||
a in b || (b[a] = !0)
|
||||
}), a.groups = " " + b.name + (b.put.join ? " " + b.put.join(" ") : "") + " "
|
||||
};
|
||||
return a.prototype = {
|
||||
constructor: a,
|
||||
_onTapStart: function(a) {
|
||||
var b = this,
|
||||
d = this.el,
|
||||
e = this.options,
|
||||
f = a.type,
|
||||
g = a.touches && a.touches[0],
|
||||
h = (g || a).target,
|
||||
i = h,
|
||||
k = e.filter;
|
||||
if (!("mousedown" === f && 0 !== a.button || e.disabled) && (h = c(h, e.draggable, d))) {
|
||||
if (D = p(h), "function" == typeof k) {
|
||||
if (k.call(this, a, h, this)) return j(b, i, "filter", h, d, D), void a.preventDefault()
|
||||
} else if (k && (k = k.split(",").some(function(a) {
|
||||
return a = c(i, a.trim(), d), a ? (j(b, a, "filter", h, d, D), !0) : void 0
|
||||
}))) return void a.preventDefault();
|
||||
(!e.handle || c(i, e.handle, d)) && this._prepareDragStart(a, g, h)
|
||||
}
|
||||
},
|
||||
_prepareDragStart: function(a, b, c) {
|
||||
var d, f = this,
|
||||
h = f.el,
|
||||
j = f.options,
|
||||
k = h.ownerDocument;
|
||||
c && !s && c.parentNode === h && (G = a, w = h, s = c, t = s.parentNode, x = s.nextSibling, F = j.group, d = function() {
|
||||
f._disableDelayedDrag(), s.draggable = !0, g(s, f.options.chosenClass, !0), f._triggerDragStart(b)
|
||||
}, j.ignore.split(",").forEach(function(a) {
|
||||
i(s, a.trim(), l)
|
||||
}), e(k, "mouseup", f._onDrop), e(k, "touchend", f._onDrop), e(k, "touchcancel", f._onDrop), j.delay ? (e(k, "mouseup", f._disableDelayedDrag), e(k, "touchend", f._disableDelayedDrag), e(k, "touchcancel", f._disableDelayedDrag), e(k, "mousemove", f._disableDelayedDrag), e(k, "touchmove", f._disableDelayedDrag), f._dragStartTimer = setTimeout(d, j.delay)) : d())
|
||||
},
|
||||
_disableDelayedDrag: function() {
|
||||
var a = this.el.ownerDocument;
|
||||
clearTimeout(this._dragStartTimer), f(a, "mouseup", this._disableDelayedDrag), f(a, "touchend", this._disableDelayedDrag), f(a, "touchcancel", this._disableDelayedDrag), f(a, "mousemove", this._disableDelayedDrag), f(a, "touchmove", this._disableDelayedDrag)
|
||||
},
|
||||
_triggerDragStart: function(a) {
|
||||
a ? (G = {
|
||||
target: s,
|
||||
clientX: a.clientX,
|
||||
clientY: a.clientY
|
||||
}, this._onDragStart(G, "touch")) : this.nativeDraggable ? (e(s, "dragend", this), e(w, "dragstart", this._onDragStart)) : this._onDragStart(G, !0);
|
||||
try {
|
||||
N.selection ? N.selection.empty() : window.getSelection().removeAllRanges()
|
||||
} catch (b) {}
|
||||
},
|
||||
_dragStarted: function() {
|
||||
w && s && (g(s, this.options.ghostClass, !0), a.active = this, j(this, w, "start", s, w, D))
|
||||
},
|
||||
_emulateDragOver: function() {
|
||||
if (H) {
|
||||
if (this._lastX === H.clientX && this._lastY === H.clientY) return;
|
||||
this._lastX = H.clientX, this._lastY = H.clientY, Q || h(u, "display", "none");
|
||||
var a = N.elementFromPoint(H.clientX, H.clientY),
|
||||
b = a,
|
||||
c = " " + this.options.group.name,
|
||||
d = T.length;
|
||||
if (b)
|
||||
do {
|
||||
if (b[L] && b[L].options.groups.indexOf(c) > -1) {
|
||||
for (; d--;) T[d]({
|
||||
clientX: H.clientX,
|
||||
clientY: H.clientY,
|
||||
target: a,
|
||||
rootEl: b
|
||||
});
|
||||
break
|
||||
}
|
||||
a = b
|
||||
} while (b = b.parentNode);
|
||||
Q || h(u, "display", "")
|
||||
}
|
||||
},
|
||||
_onTouchMove: function(b) {
|
||||
if (G) {
|
||||
a.active || this._dragStarted(), this._appendGhost();
|
||||
var c = b.touches ? b.touches[0] : b,
|
||||
d = c.clientX - G.clientX,
|
||||
e = c.clientY - G.clientY,
|
||||
f = b.touches ? "translate3d(" + d + "px," + e + "px,0)" : "translate(" + d + "px," + e + "px)";
|
||||
I = !0, H = c, h(u, "webkitTransform", f), h(u, "mozTransform", f), h(u, "msTransform", f), h(u, "transform", f), b.preventDefault()
|
||||
}
|
||||
},
|
||||
_appendGhost: function() {
|
||||
if (!u) {
|
||||
var a, b = s.getBoundingClientRect(),
|
||||
c = h(s),
|
||||
d = this.options;
|
||||
u = s.cloneNode(!0), g(u, d.ghostClass, !1), g(u, d.fallbackClass, !0), h(u, "top", b.top - O(c.marginTop, 10)), h(u, "left", b.left - O(c.marginLeft, 10)), h(u, "width", b.width), h(u, "height", b.height), h(u, "opacity", "0.8"), h(u, "position", "fixed"), h(u, "zIndex", "100000"), h(u, "pointerEvents", "none"), d.fallbackOnBody && N.body.appendChild(u) || w.appendChild(u), a = u.getBoundingClientRect(), h(u, "width", 2 * b.width - a.width), h(u, "height", 2 * b.height - a.height)
|
||||
}
|
||||
},
|
||||
_onDragStart: function(a, b) {
|
||||
var c = a.dataTransfer,
|
||||
d = this.options;
|
||||
this._offUpEvents(), "clone" == F.pull && (v = s.cloneNode(!0), h(v, "display", "none"), w.insertBefore(v, s)), b ? ("touch" === b ? (e(N, "touchmove", this._onTouchMove), e(N, "touchend", this._onDrop), e(N, "touchcancel", this._onDrop)) : (e(N, "mousemove", this._onTouchMove), e(N, "mouseup", this._onDrop)), this._loopId = setInterval(this._emulateDragOver, 50)) : (c && (c.effectAllowed = "move", d.setData && d.setData.call(this, c, s)), e(N, "drop", this), setTimeout(this._dragStarted, 0))
|
||||
},
|
||||
_onDragOver: function(a) {
|
||||
var d, e, f, g = this.el,
|
||||
i = this.options,
|
||||
j = i.group,
|
||||
l = j.put,
|
||||
o = F === j,
|
||||
p = i.sort;
|
||||
if (void 0 !== a.preventDefault && (a.preventDefault(), !i.dragoverBubble && a.stopPropagation()), I = !0, F && !i.disabled && (o ? p || (f = !w.contains(s)) : F.pull && l && (F.name === j.name || l.indexOf && ~l.indexOf(F.name))) && (void 0 === a.rootEl || a.rootEl === this.el)) {
|
||||
if (U(a, i, this.el), R) return;
|
||||
if (d = c(a.target, i.draggable, g), e = s.getBoundingClientRect(), f) return b(!0), void(v || x ? w.insertBefore(s, v || x) : p || w.appendChild(s));
|
||||
if (0 === g.children.length || g.children[0] === u || g === a.target && (d = n(g, a))) {
|
||||
if (d) {
|
||||
if (d.animated) return;
|
||||
r = d.getBoundingClientRect()
|
||||
}
|
||||
b(o), k(w, g, s, e, d, r) !== !1 && (s.contains(g) || (g.appendChild(s), t = g), this._animate(e, s), d && this._animate(r, d))
|
||||
} else if (d && !d.animated && d !== s && void 0 !== d.parentNode[L]) {
|
||||
A !== d && (A = d, B = h(d), C = h(d.parentNode));
|
||||
var q, r = d.getBoundingClientRect(),
|
||||
y = r.right - r.left,
|
||||
z = r.bottom - r.top,
|
||||
D = /left|right|inline/.test(B.cssFloat + B.display) || "flex" == C.display && 0 === C["flex-direction"].indexOf("row"),
|
||||
E = d.offsetWidth > s.offsetWidth,
|
||||
G = d.offsetHeight > s.offsetHeight,
|
||||
H = (D ? (a.clientX - r.left) / y : (a.clientY - r.top) / z) > .5,
|
||||
J = d.nextElementSibling,
|
||||
K = k(w, g, s, e, d, r);
|
||||
if (K !== !1) {
|
||||
if (R = !0, setTimeout(m, 30), b(o), 1 === K || -1 === K) q = 1 === K;
|
||||
else if (D) {
|
||||
var M = s.offsetTop,
|
||||
N = d.offsetTop;
|
||||
q = M === N ? d.previousElementSibling === s && !E || H && E : N > M
|
||||
} else q = J !== s && !G || H && G;
|
||||
s.contains(g) || (q && !J ? g.appendChild(s) : d.parentNode.insertBefore(s, q ? J : d)), t = s.parentNode, this._animate(e, s), this._animate(r, d)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
_animate: function(a, b) {
|
||||
var c = this.options.animation;
|
||||
if (c) {
|
||||
var d = b.getBoundingClientRect();
|
||||
h(b, "transition", "none"), h(b, "transform", "translate3d(" + (a.left - d.left) + "px," + (a.top - d.top) + "px,0)"), b.offsetWidth, h(b, "transition", "all " + c + "ms"), h(b, "transform", "translate3d(0,0,0)"), clearTimeout(b.animated), b.animated = setTimeout(function() {
|
||||
h(b, "transition", ""), h(b, "transform", ""), b.animated = !1
|
||||
}, c)
|
||||
}
|
||||
},
|
||||
_offUpEvents: function() {
|
||||
var a = this.el.ownerDocument;
|
||||
f(N, "touchmove", this._onTouchMove), f(a, "mouseup", this._onDrop), f(a, "touchend", this._onDrop), f(a, "touchcancel", this._onDrop)
|
||||
},
|
||||
_onDrop: function(b) {
|
||||
var c = this.el,
|
||||
d = this.options;
|
||||
clearInterval(this._loopId), clearInterval(J.pid), clearTimeout(this._dragStartTimer), f(N, "mousemove", this._onTouchMove), this.nativeDraggable && (f(N, "drop", this), f(c, "dragstart", this._onDragStart)), this._offUpEvents(), b && (I && (b.preventDefault(), !d.dropBubble && b.stopPropagation()), u && u.parentNode.removeChild(u), s && (this.nativeDraggable && f(s, "dragend", this), l(s), g(s, this.options.ghostClass, !1), g(s, this.options.chosenClass, !1), w !== t ? (E = p(s), E >= 0 && (j(null, t, "sort", s, w, D, E), j(this, w, "sort", s, w, D, E), j(null, t, "add", s, w, D, E), j(this, w, "remove", s, w, D, E))) : (v && v.parentNode.removeChild(v), s.nextSibling !== x && (E = p(s), E >= 0 && (j(this, w, "update", s, w, D, E), j(this, w, "sort", s, w, D, E)))), a.active && ((null === E || -1 === E) && (E = D), j(this, w, "end", s, w, D, E), this.save())), w = s = t = u = x = v = y = z = G = H = I = E = A = B = F = a.active = null)
|
||||
},
|
||||
handleEvent: function(a) {
|
||||
var b = a.type;
|
||||
"dragover" === b || "dragenter" === b ? s && (this._onDragOver(a), d(a)) : ("drop" === b || "dragend" === b) && this._onDrop(a)
|
||||
},
|
||||
toArray: function() {
|
||||
for (var a, b = [], d = this.el.children, e = 0, f = d.length, g = this.options; f > e; e++) a = d[e], c(a, g.draggable, this.el) && b.push(a.getAttribute(g.dataIdAttr) || o(a));
|
||||
return b
|
||||
},
|
||||
sort: function(a) {
|
||||
var b = {},
|
||||
d = this.el;
|
||||
this.toArray().forEach(function(a, e) {
|
||||
var f = d.children[e];
|
||||
c(f, this.options.draggable, d) && (b[a] = f)
|
||||
}, this), a.forEach(function(a) {
|
||||
b[a] && (d.removeChild(b[a]), d.appendChild(b[a]))
|
||||
})
|
||||
},
|
||||
save: function() {
|
||||
var a = this.options.store;
|
||||
a && a.set(this)
|
||||
},
|
||||
closest: function(a, b) {
|
||||
return c(a, b || this.options.draggable, this.el)
|
||||
},
|
||||
option: function(a, b) {
|
||||
var c = this.options;
|
||||
return void 0 === b ? c[a] : (c[a] = b, void("group" === a && V(c)))
|
||||
},
|
||||
destroy: function() {
|
||||
var a = this.el;
|
||||
a[L] = null, f(a, "mousedown", this._onTapStart), f(a, "touchstart", this._onTapStart), this.nativeDraggable && (f(a, "dragover", this), f(a, "dragenter", this)), Array.prototype.forEach.call(a.querySelectorAll("[draggable]"), function(a) {
|
||||
a.removeAttribute("draggable")
|
||||
}), T.splice(T.indexOf(this._onDragOver), 1), this._onDrop(), this.el = a = null
|
||||
}
|
||||
}, a.utils = {
|
||||
on: e,
|
||||
off: f,
|
||||
css: h,
|
||||
find: i,
|
||||
is: function(a, b) {
|
||||
return !!c(a, b, a)
|
||||
},
|
||||
extend: r,
|
||||
throttle: q,
|
||||
closest: c,
|
||||
toggleClass: g,
|
||||
index: p
|
||||
}, a.create = function(b, c) {
|
||||
return new a(b, c)
|
||||
}, a.version = "1.4.2", a
|
||||
});
|
||||
344
src/bower_components/Sortable/index.html
vendored
@@ -1,344 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
|
||||
<meta property="og:image" content="/st/og-image.png"/>
|
||||
|
||||
<title>Sortable. No jQuery.</title>
|
||||
|
||||
<meta name="keywords" content="sortable, reorder, list, javascript, html5, drag and drop, dnd, animation, groups, angular, ng-sortable, react, mixin, effects, rubaxa"/>
|
||||
<meta name="description" content="Sortable - is a minimalist JavaScript library for reorderable drag-and-drop lists on modern browsers and touch devices. No jQuery. Supports Meteor, AngularJS, React and any CSS library, e.g. Bootstrap."/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.5"/>
|
||||
|
||||
<link href="//rubaxa.github.io/Ply/ply.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="//fonts.googleapis.com/css?family=Roboto:300" rel="stylesheet" type="text/css"/>
|
||||
|
||||
<link href="st/app.css" rel="stylesheet" type="text/css"/>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<a href="https://github.com/RubaXa/Sortable"><img style="position: fixed; top: 0; right: 0; border: 0; z-index: 10000;" src="//s3.amazonaws.com/github/ribbons/forkme_right_orange_ff7600.png" alt="Fork me on GitHub"></a>
|
||||
|
||||
<div class="container">
|
||||
<div style="padding: 80px 150px 0; height: 160px;">
|
||||
<a class="logo" href="https://github.com/RubaXa/Sortable"><img src="st/logo.png"/></a>
|
||||
<h1 data-force="40" data-force-y="2.5">The JavaScript library for modern browsers and touch devices. No jQuery.</h1>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Connected lists -->
|
||||
<div class="container" style="height: 520px">
|
||||
<div data-force="30" class="layer block" style="left: 14.5%; top: 0; width: 37%">
|
||||
<div class="layer title">List A</div>
|
||||
<ul id="foo" class="block__list block__list_words">
|
||||
<li>бегемот</li>
|
||||
<li>корм</li>
|
||||
<li>антон</li>
|
||||
<li>сало</li>
|
||||
<li>железосталь</li>
|
||||
<li>валик</li>
|
||||
<li>кровать</li>
|
||||
<li>краб</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div data-force="18" class="layer block" style="left: 58%; top: 143px; width: 40%;">
|
||||
<div class="layer title">List B</div>
|
||||
<ul id="bar" class="block__list block__list_tags">
|
||||
<li>казнить</li>
|
||||
<li>,</li>
|
||||
<li>нельзя</li>
|
||||
<li>помиловать</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Multi connected lists -->
|
||||
<a name="m"></a>
|
||||
<div class="container">
|
||||
<div id="multi" style="margin-left: 30px">
|
||||
<div><div data-force="5" class="layer title title_xl">Multi</div></div>
|
||||
|
||||
<div class="layer tile" data-force="30">
|
||||
<div class="tile__name">Group A</div>
|
||||
<div class="tile__list">
|
||||
<img src="st/face-01.jpg"/><!--
|
||||
--><img src="st/face-02.jpg"/><!--
|
||||
--><img src="st/face-03.jpg"/><!--
|
||||
--><img src="st/face-04.jpg"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layer tile" data-force="25">
|
||||
<div class="tile__name">Group B</div>
|
||||
<div class="tile__list">
|
||||
<img src="st/face-05.jpg"/><!--
|
||||
--><img src="st/face-06.jpg"/><!--
|
||||
--><img src="st/face-07.jpg"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layer tile" data-force="20">
|
||||
<div class="tile__name">Group C</div>
|
||||
<div class="tile__list">
|
||||
<img src="st/face-08.jpg"/><!--
|
||||
--><img src="st/face-09.jpg"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Editable list -->
|
||||
<a name="e"></a>
|
||||
<div class="container" style="margin-top: 100px">
|
||||
<div id="filter" style="margin-left: 30px">
|
||||
<div><div data-force="5" class="layer title title_xl">Editable list</div></div>
|
||||
|
||||
<div style="margin-top: -8px; margin-left: 10px" class="block__list block__list_words">
|
||||
<ul id="editable">
|
||||
<li>Оля<i class="js-remove">✖</i></li>
|
||||
<li>Владимир<i class="js-remove">✖</i></li>
|
||||
<li>Алина<i class="js-remove">✖</i></li>
|
||||
</ul>
|
||||
|
||||
<button id="addUser">Add</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Advanced connected lists -->
|
||||
<a name="ag"></a>
|
||||
<div class="container" style="margin-top: 100px;">
|
||||
<div id="advanced" style="margin-left: 30px;">
|
||||
<div><div data-force="5" class="layer title title_xl">Advanced groups</div></div>
|
||||
|
||||
<div style="width: 25%; float: left; margin-top: 15px; margin-left: 10px" class="block__list block__list_words">
|
||||
<div class="block__list-title">pull & put</div>
|
||||
<ul id="advanced-1">
|
||||
<li>Meat</li>
|
||||
<li>Potato</li>
|
||||
<li>Tea</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div style="width: 25%; float: left; margin-top: 15px; margin-left: 10px" class="block__list block__list_words">
|
||||
<div class="block__list-title">only pull (clone) no reordering</div>
|
||||
<ul id="advanced-2">
|
||||
<li>Sex</li>
|
||||
<li>Drugs</li>
|
||||
<li>Rock'n'roll</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div style="width: 25%; float: left; margin-top: 15px; margin-left: 10px" class="block__list block__list_words">
|
||||
<div class="block__list-title">only put</div>
|
||||
<ul id="advanced-3">
|
||||
<li>Money</li>
|
||||
<li>Force</li>
|
||||
<li>Agility</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 'handle' option -->
|
||||
<a name="h"></a>
|
||||
<div class="container" style="margin-top: 100px;">
|
||||
<div id="handle" style="margin-left: 30px;">
|
||||
<div><div data-force="5" class="layer title title_xl">Drag handle and selectable text</div></div>
|
||||
|
||||
<div style="width: 30%; margin-left: 10px" class="block__list_words">
|
||||
<ul id="handle-1">
|
||||
<li><span class="drag-handle">☰</span>Select text freely</li>
|
||||
<li><span class="drag-handle">☰</span>Drag my handle</li>
|
||||
<li><span class="drag-handle">☰</span>Best of both worlds</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Angular -->
|
||||
<a name="ng"></a>
|
||||
<div id="todos" ng-app="todoApp" class="container" style="margin-top: 100px">
|
||||
<div style="margin-left: 30px">
|
||||
<div><div data-force="5" class="layer title title_xl">AngularJS / ng-sortable</div></div>
|
||||
|
||||
<div style="width: 30%; margin-top: -8px; margin-left: 10px; float: left;" class="block__list block__list_words">
|
||||
<div ng-controller="TodoController">
|
||||
<span style="padding-left: 20px">{{remaining()}} of {{todos.length}} remaining</span>
|
||||
[ <a href="" ng-click="archive()">archive</a> ]
|
||||
<ul ng-sortable="{ group: 'todo', animation: 150 }" class="unstyled">
|
||||
<li ng-repeat="todo in todos">
|
||||
<input type="checkbox" ng-model="todo.done">
|
||||
<span class="done-{{todo.done}}">{{todo.text}}</span>
|
||||
</li>
|
||||
</ul>
|
||||
<form ng-submit="addTodo()" style="padding-left: 20px">
|
||||
<input type="text" ng-model="todoText" size="30"
|
||||
placeholder="add new todo here">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div style="width: 30%; margin-top: -8px; margin-left: 10px; float: left;" class="block__list block__list_words">
|
||||
<div ng-controller="TodoControllerNext">
|
||||
<span style="padding-left: 20px">{{remaining()}} of {{todos.length}} remaining</span>
|
||||
<ul ng-sortable="sortableConfig" class="unstyled">
|
||||
<li ng-repeat="todo in todos">
|
||||
<input type="checkbox" ng-model="todo.done">
|
||||
<span class="done-{{todo.done}}">{{todo.text}}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Code example -->
|
||||
<a name="c"></a>
|
||||
<div class="container" style="margin-top: 100px">
|
||||
<div style="margin-left: 30px">
|
||||
<div><div class="layer title title_xl">Code example</div></div>
|
||||
<pre data-force="100" class="layer javascript" style="margin-top: -8px; margin-left: 10px; width: 90%"><code>// Simple list
|
||||
var list = document.getElementById("my-ui-list");
|
||||
Sortable.create(list); // That's all.
|
||||
|
||||
|
||||
// Grouping
|
||||
var foo = document.getElementById("foo");
|
||||
Sortable.create(foo, { group: "omega" });
|
||||
|
||||
var bar = document.getElementById("bar");
|
||||
Sortable.create(bar, { group: "omega" });
|
||||
|
||||
|
||||
// Or
|
||||
var container = document.getElementById("multi");
|
||||
var sort = Sortable.create(container, {
|
||||
animation: 150, // ms, animation speed moving items when sorting, `0` — without animation
|
||||
handle: ".tile__title", // Restricts sort start click/touch to the specified element
|
||||
draggable: ".tile", // Specifies which items inside the element should be sortable
|
||||
onUpdate: function (evt/**Event*/){
|
||||
var item = evt.item; // the current dragged HTMLElement
|
||||
}
|
||||
});
|
||||
|
||||
// ..
|
||||
sort.destroy();
|
||||
|
||||
|
||||
// Editable list
|
||||
var editableList = Sortable.create(editable, {
|
||||
filter: '.js-remove',
|
||||
onFilter: function (evt) {
|
||||
var el = editableList.closest(evt.item); // get dragged item
|
||||
el && el.parentNode.removeChild(el);
|
||||
}
|
||||
});
|
||||
</code></pre>
|
||||
</div>
|
||||
|
||||
<div class="container" style="margin: 100px 0;">
|
||||
<div style="margin-left: 30px">
|
||||
<div><div class="layer title title_xl">See also</div></div>
|
||||
<div id="rubaxa-repos" data-force="100" class="layer" style="margin-top: -8px; margin-left: 10px; width: 90%; background-color: #fff;">Loading…</div>
|
||||
<script src="//rubaxa.github.io/repos.js"></script>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<script src="Sortable.js"></script>
|
||||
<script src="//rubaxa.github.io/Ply/Ply.min.js"></script>
|
||||
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js"></script>
|
||||
<script src="ng-sortable.js"></script>
|
||||
|
||||
<script src="st/app.js"></script>
|
||||
|
||||
|
||||
|
||||
<!-- highlight.js -->
|
||||
<style>
|
||||
/* Tomorrow Theme */
|
||||
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
|
||||
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
|
||||
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
|
||||
.tomorrow-comment, pre .comment, pre .title {
|
||||
color: #8e908c;
|
||||
}
|
||||
|
||||
.tomorrow-red, pre .variable, pre .attribute, pre .tag, pre .regexp, pre .ruby .constant, pre .xml .tag .title, pre .xml .pi, pre .xml .doctype, pre .html .doctype, pre .css .id, pre .css .class, pre .css .pseudo {
|
||||
color: #c82829;
|
||||
}
|
||||
|
||||
.tomorrow-orange, pre .number, pre .preprocessor, pre .built_in, pre .literal, pre .params, pre .constant {
|
||||
color: #f5871f;
|
||||
}
|
||||
|
||||
.tomorrow-yellow, pre .class, pre .ruby .class .title, pre .css .rules .attribute {
|
||||
color: #eab700;
|
||||
}
|
||||
|
||||
.tomorrow-green, pre .string, pre .value, pre .inheritance, pre .header, pre .ruby .symbol, pre .xml .cdata {
|
||||
color: #718c00;
|
||||
}
|
||||
|
||||
.tomorrow-aqua, pre .css .hexcolor {
|
||||
color: #3e999f;
|
||||
}
|
||||
|
||||
.tomorrow-blue, pre .function, pre .python .decorator, pre .python .title, pre .ruby .function .title, pre .ruby .title .keyword, pre .perl .sub, pre .javascript .title, pre .coffeescript .title {
|
||||
color: #4271ae;
|
||||
}
|
||||
|
||||
.tomorrow-purple, pre .keyword, pre .javascript .function {
|
||||
color: #8959a8;
|
||||
}
|
||||
|
||||
pre {
|
||||
border: 0;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
pre code {
|
||||
display: block;
|
||||
color: #4d4d4c;
|
||||
font-size: 15px;
|
||||
font-family: Menlo, Monaco, Consolas, monospace;
|
||||
line-height: 1.5;
|
||||
padding: 30px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="//yandex.st/highlightjs/7.5/highlight.min.js"></script>
|
||||
<script>hljs.initHighlightingOnLoad();</script>
|
||||
|
||||
<script>
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||
|
||||
ga('create', 'UA-16483888-3', 'rubaxa.github.io');
|
||||
ga('send', 'pageview');
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
17
src/bower_components/Sortable/jquery.binding.js
vendored
@@ -1,17 +0,0 @@
|
||||
! function(factory) {
|
||||
"use strict";
|
||||
"function" == typeof define && define.amd ? define(["jquery"], factory) : factory(jQuery)
|
||||
}(function($) {
|
||||
"use strict";
|
||||
$.fn.sortable = function(options) {
|
||||
var retVal, args = arguments;
|
||||
return this.each(function() {
|
||||
var $el = $(this),
|
||||
sortable = $el.data("sortable");
|
||||
if (sortable || !(options instanceof Object) && options || (sortable = new Sortable(this, options), $el.data("sortable", sortable)), sortable) {
|
||||
if ("widget" === options) return sortable;
|
||||
"destroy" === options ? (sortable.destroy(), $el.removeData("sortable")) : "function" == typeof sortable[options] ? retVal = sortable[options].apply(sortable, [].slice.call(args, 1)) : options in sortable.options && (retVal = sortable.option.apply(sortable, args))
|
||||
}
|
||||
}), void 0 === retVal ? this : retVal
|
||||
}
|
||||
});
|
||||
@@ -1,97 +0,0 @@
|
||||
! function(factory) {
|
||||
"use strict";
|
||||
if ("function" == typeof define && define.amd) define(["knockout"], factory);
|
||||
else if ("function" == typeof require && "object" == typeof exports && "object" == typeof module) {
|
||||
var ko = require("knockout");
|
||||
factory(ko)
|
||||
} else factory(window.ko)
|
||||
}(function(ko) {
|
||||
"use strict";
|
||||
var init = function(element, valueAccessor, allBindings, viewModel, bindingContext, sortableOptions) {
|
||||
var options = buildOptions(valueAccessor, sortableOptions);
|
||||
["onStart", "onEnd", "onRemove", "onAdd", "onUpdate", "onSort", "onFilter"].forEach(function(e) {
|
||||
(options[e] || eventHandlers[e]) && (options[e] = function(eventType, parentVM, parentBindings, handler, e) {
|
||||
var itemVM = ko.dataFor(e.item),
|
||||
bindings = ko.utils.peekObservable(parentBindings()),
|
||||
bindingHandlerBinding = bindings.sortable || bindings.draggable,
|
||||
collection = bindingHandlerBinding.collection || bindingHandlerBinding.foreach;
|
||||
handler && handler(e, itemVM, parentVM, collection, bindings), eventHandlers[eventType] && eventHandlers[eventType](e, itemVM, parentVM, collection, bindings)
|
||||
}.bind(void 0, e, viewModel, allBindings, options[e]))
|
||||
});
|
||||
var sortableElement = Sortable.create(element, options);
|
||||
return ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
|
||||
sortableElement.destroy()
|
||||
}), ko.bindingHandlers.template.init(element, valueAccessor)
|
||||
},
|
||||
update = function(element, valueAccessor, allBindings, viewModel, bindingContext, sortableOptions) {
|
||||
return ko.bindingHandlers.template.update(element, valueAccessor, allBindings, viewModel, bindingContext)
|
||||
},
|
||||
eventHandlers = function(handlers) {
|
||||
var moveOperations = [],
|
||||
tryMoveOperation = function(e, itemVM, parentVM, collection, parentBindings) {
|
||||
var currentOperation = {
|
||||
event: e,
|
||||
itemVM: itemVM,
|
||||
parentVM: parentVM,
|
||||
collection: collection,
|
||||
parentBindings: parentBindings
|
||||
},
|
||||
existingOperation = moveOperations.filter(function(op) {
|
||||
return op.itemVM === currentOperation.itemVM
|
||||
})[0];
|
||||
if (existingOperation) {
|
||||
moveOperations.splice(moveOperations.indexOf(existingOperation), 1);
|
||||
var removeOperation = "remove" === currentOperation.event.type ? currentOperation : existingOperation,
|
||||
addOperation = "add" === currentOperation.event.type ? currentOperation : existingOperation;
|
||||
moveItem(itemVM, removeOperation.collection, addOperation.collection, addOperation.event.clone, addOperation.event)
|
||||
} else moveOperations.push(currentOperation)
|
||||
},
|
||||
moveItem = function(itemVM, from, to, clone, e) {
|
||||
var fromArray = from(),
|
||||
originalIndex = fromArray.indexOf(itemVM),
|
||||
newIndex = e.newIndex;
|
||||
e.item.previousElementSibling && (newIndex = fromArray.indexOf(ko.dataFor(e.item.previousElementSibling)), originalIndex > newIndex && (newIndex += 1)), e.item.parentNode.removeChild(e.item), fromArray.splice(originalIndex, 1), from.valueHasMutated(), clone && from !== to && (fromArray.splice(originalIndex, 0, itemVM), from.valueHasMutated()), to().splice(newIndex, 0, itemVM), to.valueHasMutated()
|
||||
};
|
||||
return handlers.onRemove = tryMoveOperation, handlers.onAdd = tryMoveOperation, handlers.onUpdate = function(e, itemVM, parentVM, collection, parentBindings) {
|
||||
moveItem(itemVM, collection, collection, !1, e)
|
||||
}, handlers
|
||||
}({}),
|
||||
buildOptions = function(bindingOptions, options) {
|
||||
var merge = function(into, from) {
|
||||
for (var prop in from) "[object Object]" === Object.prototype.toString.call(from[prop]) ? ("[object Object]" !== Object.prototype.toString.call(into[prop]) && (into[prop] = {}), into[prop] = merge(into[prop], from[prop])) : into[prop] = from[prop];
|
||||
return into
|
||||
},
|
||||
unwrappedOptions = ko.utils.peekObservable(bindingOptions()).options || {};
|
||||
return options = merge({}, options), unwrappedOptions.group && "[object Object]" !== Object.prototype.toString.call(unwrappedOptions.group) && (unwrappedOptions.group = {
|
||||
name: unwrappedOptions.group
|
||||
}), merge(options, unwrappedOptions)
|
||||
};
|
||||
ko.bindingHandlers.draggable = {
|
||||
sortableOptions: {
|
||||
group: {
|
||||
pull: "clone",
|
||||
put: !1
|
||||
},
|
||||
sort: !1
|
||||
},
|
||||
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
|
||||
return init(element, valueAccessor, allBindings, viewModel, 0, ko.bindingHandlers.draggable.sortableOptions)
|
||||
},
|
||||
update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
|
||||
return update(element, valueAccessor, allBindings, viewModel, bindingContext, ko.bindingHandlers.draggable.sortableOptions)
|
||||
}
|
||||
}, ko.bindingHandlers.sortable = {
|
||||
sortableOptions: {
|
||||
group: {
|
||||
pull: !0,
|
||||
put: !0
|
||||
}
|
||||
},
|
||||
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
|
||||
return init(element, valueAccessor, allBindings, viewModel, 0, ko.bindingHandlers.sortable.sortableOptions)
|
||||
},
|
||||
update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
|
||||
return update(element, valueAccessor, allBindings, viewModel, bindingContext, ko.bindingHandlers.sortable.sortableOptions)
|
||||
}
|
||||
}
|
||||
});
|
||||
87
src/bower_components/Sortable/ng-sortable.js
vendored
@@ -1,87 +0,0 @@
|
||||
! function(factory) {
|
||||
"use strict";
|
||||
"function" == typeof define && define.amd ? define(["angular", "./Sortable"], factory) : "function" == typeof require && "object" == typeof exports && "object" == typeof module ? (require("angular"), factory(angular, require("./Sortable")), module.exports = "ng-sortable") : window.angular && window.Sortable && factory(angular, Sortable)
|
||||
}(function(angular, Sortable) {
|
||||
"use strict";
|
||||
var expando = "Sortable:ng-sortable";
|
||||
angular.module("ng-sortable", []).constant("ngSortableVersion", "0.4.0").constant("ngSortableConfig", {}).directive("ngSortable", ["$parse", "ngSortableConfig", function($parse, ngSortableConfig) {
|
||||
var removed, nextSibling, getSourceFactory = function(el, scope) {
|
||||
var ngRepeat = [].filter.call(el.childNodes, function(node) {
|
||||
return 8 === node.nodeType && -1 !== node.nodeValue.indexOf("ngRepeat:")
|
||||
})[0];
|
||||
if (!ngRepeat) return function() {
|
||||
return null
|
||||
};
|
||||
ngRepeat = ngRepeat.nodeValue.match(/ngRepeat:\s*(?:\(.*?,\s*)?([^\s)]+)[\s)]+in\s+([^\s|]+)/);
|
||||
var itemsExpr = $parse(ngRepeat[2]);
|
||||
return function() {
|
||||
return itemsExpr(scope.$parent) || []
|
||||
}
|
||||
};
|
||||
return {
|
||||
restrict: "AC",
|
||||
scope: {
|
||||
ngSortable: "=?"
|
||||
},
|
||||
link: function(scope, $el) {
|
||||
function _emitEvent(evt, item) {
|
||||
var name = "on" + evt.type.charAt(0).toUpperCase() + evt.type.substr(1),
|
||||
source = getSource();
|
||||
options[name] && options[name]({
|
||||
model: item || source[evt.newIndex],
|
||||
models: source,
|
||||
oldIndex: evt.oldIndex,
|
||||
newIndex: evt.newIndex
|
||||
})
|
||||
}
|
||||
|
||||
function _sync(evt) {
|
||||
var items = getSource();
|
||||
if (items) {
|
||||
var oldIndex = evt.oldIndex,
|
||||
newIndex = evt.newIndex;
|
||||
if (el !== evt.from) {
|
||||
var prevItems = evt.from[expando]();
|
||||
removed = prevItems[oldIndex], evt.clone ? (removed = angular.copy(removed), prevItems.splice(Sortable.utils.index(evt.clone), 0, prevItems.splice(oldIndex, 1)[0]), evt.from.removeChild(evt.clone)) : prevItems.splice(oldIndex, 1), items.splice(newIndex, 0, removed), evt.from.insertBefore(evt.item, nextSibling)
|
||||
} else items.splice(newIndex, 0, items.splice(oldIndex, 1)[0]);
|
||||
scope.$apply()
|
||||
}
|
||||
}
|
||||
var sortable, el = $el[0],
|
||||
options = angular.extend(scope.ngSortable || {}, ngSortableConfig),
|
||||
watchers = [],
|
||||
getSource = getSourceFactory(el, scope);
|
||||
el[expando] = getSource, sortable = Sortable.create(el, Object.keys(options).reduce(function(opts, name) {
|
||||
return opts[name] = opts[name] || options[name], opts
|
||||
}, {
|
||||
onStart: function(evt) {
|
||||
nextSibling = evt.item.nextSibling, _emitEvent(evt), scope.$apply()
|
||||
},
|
||||
onEnd: function(evt) {
|
||||
_emitEvent(evt, removed), scope.$apply()
|
||||
},
|
||||
onAdd: function(evt) {
|
||||
_sync(evt), _emitEvent(evt, removed), scope.$apply()
|
||||
},
|
||||
onUpdate: function(evt) {
|
||||
_sync(evt), _emitEvent(evt)
|
||||
},
|
||||
onRemove: function(evt) {
|
||||
_emitEvent(evt, removed)
|
||||
},
|
||||
onSort: function(evt) {
|
||||
_emitEvent(evt)
|
||||
}
|
||||
})), $el.on("$destroy", function() {
|
||||
angular.forEach(watchers, function(unwatch) {
|
||||
unwatch()
|
||||
}), sortable.destroy(), el[expando] = null, el = null, watchers = null, sortable = null, nextSibling = null
|
||||
}), angular.forEach(["sort", "disabled", "draggable", "handle", "animation", "group", "ghostClass", "filter", "onStart", "onEnd", "onAdd", "onUpdate", "onRemove", "onSort"], function(name) {
|
||||
watchers.push(scope.$watch("ngSortable." + name, function(value) {
|
||||
void 0 !== value && (options[name] = value, /^on[A-Z]/.test(name) || sortable.option(name, value))
|
||||
}))
|
||||
})
|
||||
}
|
||||
}
|
||||
}])
|
||||
});
|
||||
@@ -1,71 +0,0 @@
|
||||
! function(factory) {
|
||||
"use strict";
|
||||
"undefined" != typeof module && void 0 !== module.exports ? module.exports = factory(require("./Sortable")) : "function" == typeof define && define.amd ? define(["./Sortable"], factory) : window.SortableMixin = factory(Sortable)
|
||||
}(function(Sortable) {
|
||||
"use strict";
|
||||
|
||||
function _getModelName(component) {
|
||||
return component.sortableOptions && component.sortableOptions.model || _defaultOptions.model
|
||||
}
|
||||
|
||||
function _getModelItems(component) {
|
||||
var name = _getModelName(component);
|
||||
return (component.state && component.state[name] || component.props[name]).slice()
|
||||
}
|
||||
|
||||
function _extend(dst, src) {
|
||||
for (var key in src) src.hasOwnProperty(key) && (dst[key] = src[key]);
|
||||
return dst
|
||||
}
|
||||
var _nextSibling, _activeComponent, _defaultOptions = {
|
||||
ref: "list",
|
||||
model: "items",
|
||||
animation: 100,
|
||||
onStart: "handleStart",
|
||||
onEnd: "handleEnd",
|
||||
onAdd: "handleAdd",
|
||||
onUpdate: "handleUpdate",
|
||||
onRemove: "handleRemove",
|
||||
onSort: "handleSort",
|
||||
onFilter: "handleFilter",
|
||||
onMove: "handleMove"
|
||||
};
|
||||
return {
|
||||
sortableMixinVersion: "0.1.1",
|
||||
_sortableInstance: null,
|
||||
componentDidMount: function() {
|
||||
var DOMNode, options = _extend(_extend({}, _defaultOptions), this.sortableOptions || {}),
|
||||
copyOptions = _extend({}, options),
|
||||
emitEvent = function(type, evt) {
|
||||
var method = this[options[type]];
|
||||
method && method.call(this, evt, this._sortableInstance)
|
||||
}.bind(this);
|
||||
"onStart onEnd onAdd onSort onUpdate onRemove onFilter onMove".split(" ").forEach(function(name) {
|
||||
copyOptions[name] = function(evt) {
|
||||
if ("onStart" === name) _nextSibling = evt.item.nextElementSibling, _activeComponent = this;
|
||||
else if ("onAdd" === name || "onUpdate" === name) {
|
||||
evt.from.insertBefore(evt.item, _nextSibling);
|
||||
var remoteItems, item, newState = {},
|
||||
remoteState = {},
|
||||
oldIndex = evt.oldIndex,
|
||||
newIndex = evt.newIndex,
|
||||
items = _getModelItems(this);
|
||||
"onAdd" === name ? (remoteItems = _getModelItems(_activeComponent), item = remoteItems.splice(oldIndex, 1)[0], items.splice(newIndex, 0, item), remoteState[_getModelName(_activeComponent)] = remoteItems) : items.splice(newIndex, 0, items.splice(oldIndex, 1)[0]), newState[_getModelName(this)] = items, copyOptions.stateHandler ? this[copyOptions.stateHandler](newState) : this.setState(newState), this !== _activeComponent && _activeComponent.setState(remoteState)
|
||||
}
|
||||
setTimeout(function() {
|
||||
emitEvent(name, evt)
|
||||
}, 0)
|
||||
}.bind(this)
|
||||
}, this), DOMNode = this.getDOMNode() ? (this.refs[options.ref] || this).getDOMNode() : this.refs[options.ref] || this, this._sortableInstance = Sortable.create(DOMNode, copyOptions)
|
||||
},
|
||||
componentWillReceiveProps: function(nextProps) {
|
||||
var newState = {},
|
||||
modelName = _getModelName(this),
|
||||
items = nextProps[modelName];
|
||||
items && (newState[modelName] = items, this.setState(newState))
|
||||
},
|
||||
componentWillUnmount: function() {
|
||||
this._sortableInstance.destroy(), this._sortableInstance = null
|
||||
}
|
||||
}
|
||||
});
|
||||
582
src/bower_components/Swiper/dist/css/swiper.min.css
vendored
@@ -1,582 +0,0 @@
|
||||
/**
|
||||
* Swiper 3.3.1
|
||||
* Most modern mobile touch slider and framework with hardware accelerated transitions
|
||||
*
|
||||
* http://www.idangero.us/swiper/
|
||||
*
|
||||
* Copyright 2016, Vladimir Kharlampidi
|
||||
* The iDangero.us
|
||||
* http://www.idangero.us/
|
||||
*
|
||||
* Licensed under MIT
|
||||
*
|
||||
* Released on: February 7, 2016
|
||||
*/
|
||||
.swiper-container {
|
||||
margin: 0 auto;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
z-index: 1
|
||||
}
|
||||
|
||||
.swiper-container-no-flexbox .swiper-slide {
|
||||
float: left
|
||||
}
|
||||
|
||||
.swiper-container-vertical>.swiper-wrapper {
|
||||
-webkit-box-orient: vertical;
|
||||
-moz-box-orient: vertical;
|
||||
-ms-flex-direction: column;
|
||||
-webkit-flex-direction: column;
|
||||
flex-direction: column
|
||||
}
|
||||
|
||||
.swiper-wrapper {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 1;
|
||||
display: -webkit-box;
|
||||
display: -moz-box;
|
||||
display: -ms-flexbox;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
-webkit-transition-property: -webkit-transform;
|
||||
-moz-transition-property: -moz-transform;
|
||||
-o-transition-property: -o-transform;
|
||||
-ms-transition-property: -ms-transform;
|
||||
transition-property: transform;
|
||||
-webkit-box-sizing: content-box;
|
||||
-moz-box-sizing: content-box;
|
||||
box-sizing: content-box
|
||||
}
|
||||
|
||||
.swiper-container-android .swiper-slide,
|
||||
.swiper-wrapper {
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
-moz-transform: translate3d(0, 0, 0);
|
||||
-o-transform: translate(0, 0);
|
||||
-ms-transform: translate3d(0, 0, 0);
|
||||
transform: translate3d(0, 0, 0)
|
||||
}
|
||||
|
||||
.swiper-container-multirow>.swiper-wrapper {
|
||||
-webkit-box-lines: multiple;
|
||||
-moz-box-lines: multiple;
|
||||
-ms-flex-wrap: wrap;
|
||||
-webkit-flex-wrap: wrap;
|
||||
flex-wrap: wrap
|
||||
}
|
||||
|
||||
.swiper-container-free-mode>.swiper-wrapper {
|
||||
-webkit-transition-timing-function: ease-out;
|
||||
-moz-transition-timing-function: ease-out;
|
||||
-ms-transition-timing-function: ease-out;
|
||||
-o-transition-timing-function: ease-out;
|
||||
transition-timing-function: ease-out;
|
||||
margin: 0 auto
|
||||
}
|
||||
|
||||
.swiper-slide {
|
||||
-webkit-flex-shrink: 0;
|
||||
-ms-flex: 0 0 auto;
|
||||
flex-shrink: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: relative
|
||||
}
|
||||
|
||||
.swiper-container-autoheight,
|
||||
.swiper-container-autoheight .swiper-slide {
|
||||
height: auto
|
||||
}
|
||||
|
||||
.swiper-container-autoheight .swiper-wrapper {
|
||||
-webkit-box-align: start;
|
||||
-ms-flex-align: start;
|
||||
-webkit-align-items: flex-start;
|
||||
align-items: flex-start;
|
||||
-webkit-transition-property: -webkit-transform, height;
|
||||
-moz-transition-property: -moz-transform;
|
||||
-o-transition-property: -o-transform;
|
||||
-ms-transition-property: -ms-transform;
|
||||
transition-property: transform, height
|
||||
}
|
||||
|
||||
.swiper-container .swiper-notification {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
z-index: -1000
|
||||
}
|
||||
|
||||
.swiper-wp8-horizontal {
|
||||
-ms-touch-action: pan-y;
|
||||
touch-action: pan-y
|
||||
}
|
||||
|
||||
.swiper-wp8-vertical {
|
||||
-ms-touch-action: pan-x;
|
||||
touch-action: pan-x
|
||||
}
|
||||
|
||||
.swiper-button-next,
|
||||
.swiper-button-prev {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
width: 27px;
|
||||
height: 44px;
|
||||
margin-top: -22px;
|
||||
z-index: 10;
|
||||
cursor: pointer;
|
||||
-moz-background-size: 27px 44px;
|
||||
-webkit-background-size: 27px 44px;
|
||||
background-size: 27px 44px;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat
|
||||
}
|
||||
|
||||
.swiper-button-next.swiper-button-disabled,
|
||||
.swiper-button-prev.swiper-button-disabled {
|
||||
opacity: .35;
|
||||
cursor: auto;
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.swiper-button-prev,
|
||||
.swiper-container-rtl .swiper-button-next {
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");
|
||||
left: 10px;
|
||||
right: auto
|
||||
}
|
||||
|
||||
.swiper-button-prev.swiper-button-black,
|
||||
.swiper-container-rtl .swiper-button-next.swiper-button-black {
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")
|
||||
}
|
||||
|
||||
.swiper-button-prev.swiper-button-white,
|
||||
.swiper-container-rtl .swiper-button-next.swiper-button-white {
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")
|
||||
}
|
||||
|
||||
.swiper-button-next,
|
||||
.swiper-container-rtl .swiper-button-prev {
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");
|
||||
right: 10px;
|
||||
left: auto
|
||||
}
|
||||
|
||||
.swiper-button-next.swiper-button-black,
|
||||
.swiper-container-rtl .swiper-button-prev.swiper-button-black {
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")
|
||||
}
|
||||
|
||||
.swiper-button-next.swiper-button-white,
|
||||
.swiper-container-rtl .swiper-button-prev.swiper-button-white {
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")
|
||||
}
|
||||
|
||||
.swiper-pagination {
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
-webkit-transition: .3s;
|
||||
-moz-transition: .3s;
|
||||
-o-transition: .3s;
|
||||
transition: .3s;
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
-ms-transform: translate3d(0, 0, 0);
|
||||
-o-transform: translate3d(0, 0, 0);
|
||||
transform: translate3d(0, 0, 0);
|
||||
z-index: 10
|
||||
}
|
||||
|
||||
.swiper-pagination.swiper-pagination-hidden {
|
||||
opacity: 0
|
||||
}
|
||||
|
||||
.swiper-container-horizontal>.swiper-pagination-bullets,
|
||||
.swiper-pagination-custom,
|
||||
.swiper-pagination-fraction {
|
||||
bottom: 10px;
|
||||
left: 0;
|
||||
width: 100%
|
||||
}
|
||||
|
||||
.swiper-pagination-bullet {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
display: inline-block;
|
||||
border-radius: 100%;
|
||||
background: #000;
|
||||
opacity: .2
|
||||
}
|
||||
|
||||
button.swiper-pagination-bullet {
|
||||
border: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-shadow: none;
|
||||
-moz-appearance: none;
|
||||
-ms-appearance: none;
|
||||
-webkit-appearance: none;
|
||||
appearance: none
|
||||
}
|
||||
|
||||
.swiper-pagination-clickable .swiper-pagination-bullet {
|
||||
cursor: pointer
|
||||
}
|
||||
|
||||
.swiper-pagination-white .swiper-pagination-bullet {
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.swiper-pagination-bullet-active {
|
||||
opacity: 1;
|
||||
background: #007aff
|
||||
}
|
||||
|
||||
.swiper-pagination-white .swiper-pagination-bullet-active {
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.swiper-pagination-black .swiper-pagination-bullet-active {
|
||||
background: #000
|
||||
}
|
||||
|
||||
.swiper-container-vertical>.swiper-pagination-bullets {
|
||||
right: 10px;
|
||||
top: 50%;
|
||||
-webkit-transform: translate3d(0, -50%, 0);
|
||||
-moz-transform: translate3d(0, -50%, 0);
|
||||
-o-transform: translate(0, -50%);
|
||||
-ms-transform: translate3d(0, -50%, 0);
|
||||
transform: translate3d(0, -50%, 0)
|
||||
}
|
||||
|
||||
.swiper-container-vertical>.swiper-pagination-bullets .swiper-pagination-bullet {
|
||||
margin: 5px 0;
|
||||
display: block
|
||||
}
|
||||
|
||||
.swiper-container-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet {
|
||||
margin: 0 5px
|
||||
}
|
||||
|
||||
.swiper-pagination-progress {
|
||||
background: rgba(0, 0, 0, .25);
|
||||
position: absolute
|
||||
}
|
||||
|
||||
.swiper-pagination-progress .swiper-pagination-progressbar {
|
||||
background: #007aff;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
-webkit-transform: scale(0);
|
||||
-ms-transform: scale(0);
|
||||
-o-transform: scale(0);
|
||||
transform: scale(0);
|
||||
-webkit-transform-origin: left top;
|
||||
-moz-transform-origin: left top;
|
||||
-ms-transform-origin: left top;
|
||||
-o-transform-origin: left top;
|
||||
transform-origin: left top
|
||||
}
|
||||
|
||||
.swiper-container-rtl .swiper-pagination-progress .swiper-pagination-progressbar {
|
||||
-webkit-transform-origin: right top;
|
||||
-moz-transform-origin: right top;
|
||||
-ms-transform-origin: right top;
|
||||
-o-transform-origin: right top;
|
||||
transform-origin: right top
|
||||
}
|
||||
|
||||
.swiper-container-horizontal>.swiper-pagination-progress {
|
||||
width: 100%;
|
||||
height: 4px;
|
||||
left: 0;
|
||||
top: 0
|
||||
}
|
||||
|
||||
.swiper-container-vertical>.swiper-pagination-progress {
|
||||
width: 4px;
|
||||
height: 100%;
|
||||
left: 0;
|
||||
top: 0
|
||||
}
|
||||
|
||||
.swiper-pagination-progress.swiper-pagination-white {
|
||||
background: rgba(255, 255, 255, .5)
|
||||
}
|
||||
|
||||
.swiper-pagination-progress.swiper-pagination-white .swiper-pagination-progressbar {
|
||||
background: #fff
|
||||
}
|
||||
|
||||
.swiper-pagination-progress.swiper-pagination-black .swiper-pagination-progressbar {
|
||||
background: #000
|
||||
}
|
||||
|
||||
.swiper-container-3d {
|
||||
-webkit-perspective: 1200px;
|
||||
-moz-perspective: 1200px;
|
||||
-o-perspective: 1200px;
|
||||
perspective: 1200px
|
||||
}
|
||||
|
||||
.swiper-container-3d .swiper-cube-shadow,
|
||||
.swiper-container-3d .swiper-slide,
|
||||
.swiper-container-3d .swiper-slide-shadow-bottom,
|
||||
.swiper-container-3d .swiper-slide-shadow-left,
|
||||
.swiper-container-3d .swiper-slide-shadow-right,
|
||||
.swiper-container-3d .swiper-slide-shadow-top,
|
||||
.swiper-container-3d .swiper-wrapper {
|
||||
-webkit-transform-style: preserve-3d;
|
||||
-moz-transform-style: preserve-3d;
|
||||
-ms-transform-style: preserve-3d;
|
||||
transform-style: preserve-3d
|
||||
}
|
||||
|
||||
.swiper-container-3d .swiper-slide-shadow-bottom,
|
||||
.swiper-container-3d .swiper-slide-shadow-left,
|
||||
.swiper-container-3d .swiper-slide-shadow-right,
|
||||
.swiper-container-3d .swiper-slide-shadow-top {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
pointer-events: none;
|
||||
z-index: 10
|
||||
}
|
||||
|
||||
.swiper-container-3d .swiper-slide-shadow-left {
|
||||
background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, 0)));
|
||||
background-image: -webkit-linear-gradient(right, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: -moz-linear-gradient(right, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: -o-linear-gradient(right, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: linear-gradient(to left, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0))
|
||||
}
|
||||
|
||||
.swiper-container-3d .swiper-slide-shadow-right {
|
||||
background-image: -webkit-gradient(linear, right top, left top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, 0)));
|
||||
background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: -moz-linear-gradient(left, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: linear-gradient(to right, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0))
|
||||
}
|
||||
|
||||
.swiper-container-3d .swiper-slide-shadow-top {
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, 0)));
|
||||
background-image: -webkit-linear-gradient(bottom, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: -moz-linear-gradient(bottom, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: linear-gradient(to top, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0))
|
||||
}
|
||||
|
||||
.swiper-container-3d .swiper-slide-shadow-bottom {
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, 0)));
|
||||
background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: -moz-linear-gradient(top, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: -o-linear-gradient(top, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0));
|
||||
background-image: linear-gradient(to bottom, rgba(0, 0, 0, .5), rgba(0, 0, 0, 0))
|
||||
}
|
||||
|
||||
.swiper-container-coverflow .swiper-wrapper,
|
||||
.swiper-container-flip .swiper-wrapper {
|
||||
-ms-perspective: 1200px
|
||||
}
|
||||
|
||||
.swiper-container-cube,
|
||||
.swiper-container-flip {
|
||||
overflow: visible
|
||||
}
|
||||
|
||||
.swiper-container-cube .swiper-slide,
|
||||
.swiper-container-flip .swiper-slide {
|
||||
pointer-events: none;
|
||||
-webkit-backface-visibility: hidden;
|
||||
-moz-backface-visibility: hidden;
|
||||
-ms-backface-visibility: hidden;
|
||||
backface-visibility: hidden;
|
||||
z-index: 1
|
||||
}
|
||||
|
||||
.swiper-container-cube .swiper-slide .swiper-slide,
|
||||
.swiper-container-flip .swiper-slide .swiper-slide {
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.swiper-container-cube .swiper-slide-active,
|
||||
.swiper-container-cube .swiper-slide-active .swiper-slide-active,
|
||||
.swiper-container-flip .swiper-slide-active,
|
||||
.swiper-container-flip .swiper-slide-active .swiper-slide-active {
|
||||
pointer-events: auto
|
||||
}
|
||||
|
||||
.swiper-container-cube .swiper-slide-shadow-bottom,
|
||||
.swiper-container-cube .swiper-slide-shadow-left,
|
||||
.swiper-container-cube .swiper-slide-shadow-right,
|
||||
.swiper-container-cube .swiper-slide-shadow-top,
|
||||
.swiper-container-flip .swiper-slide-shadow-bottom,
|
||||
.swiper-container-flip .swiper-slide-shadow-left,
|
||||
.swiper-container-flip .swiper-slide-shadow-right,
|
||||
.swiper-container-flip .swiper-slide-shadow-top {
|
||||
z-index: 0;
|
||||
-webkit-backface-visibility: hidden;
|
||||
-moz-backface-visibility: hidden;
|
||||
-ms-backface-visibility: hidden;
|
||||
backface-visibility: hidden
|
||||
}
|
||||
|
||||
.swiper-container-cube .swiper-slide {
|
||||
visibility: hidden;
|
||||
-webkit-transform-origin: 0 0;
|
||||
-moz-transform-origin: 0 0;
|
||||
-ms-transform-origin: 0 0;
|
||||
transform-origin: 0 0;
|
||||
width: 100%;
|
||||
height: 100%
|
||||
}
|
||||
|
||||
.swiper-container-cube.swiper-container-rtl .swiper-slide {
|
||||
-webkit-transform-origin: 100% 0;
|
||||
-moz-transform-origin: 100% 0;
|
||||
-ms-transform-origin: 100% 0;
|
||||
transform-origin: 100% 0
|
||||
}
|
||||
|
||||
.swiper-container-cube .swiper-slide-active,
|
||||
.swiper-container-cube .swiper-slide-next,
|
||||
.swiper-container-cube .swiper-slide-next+.swiper-slide,
|
||||
.swiper-container-cube .swiper-slide-prev {
|
||||
pointer-events: auto;
|
||||
visibility: visible
|
||||
}
|
||||
|
||||
.swiper-container-cube .swiper-cube-shadow {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: #000;
|
||||
opacity: .6;
|
||||
-webkit-filter: blur(50px);
|
||||
filter: blur(50px);
|
||||
z-index: 0
|
||||
}
|
||||
|
||||
.swiper-container-fade.swiper-container-free-mode .swiper-slide {
|
||||
-webkit-transition-timing-function: ease-out;
|
||||
-moz-transition-timing-function: ease-out;
|
||||
-ms-transition-timing-function: ease-out;
|
||||
-o-transition-timing-function: ease-out;
|
||||
transition-timing-function: ease-out
|
||||
}
|
||||
|
||||
.swiper-container-fade .swiper-slide {
|
||||
pointer-events: none;
|
||||
-webkit-transition-property: opacity;
|
||||
-moz-transition-property: opacity;
|
||||
-o-transition-property: opacity;
|
||||
transition-property: opacity
|
||||
}
|
||||
|
||||
.swiper-container-fade .swiper-slide .swiper-slide {
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.swiper-container-fade .swiper-slide-active,
|
||||
.swiper-container-fade .swiper-slide-active .swiper-slide-active {
|
||||
pointer-events: auto
|
||||
}
|
||||
|
||||
.swiper-scrollbar {
|
||||
border-radius: 10px;
|
||||
position: relative;
|
||||
-ms-touch-action: none;
|
||||
background: rgba(0, 0, 0, .1)
|
||||
}
|
||||
|
||||
.swiper-container-horizontal>.swiper-scrollbar {
|
||||
position: absolute;
|
||||
left: 1%;
|
||||
bottom: 3px;
|
||||
z-index: 50;
|
||||
height: 5px;
|
||||
width: 98%
|
||||
}
|
||||
|
||||
.swiper-container-vertical>.swiper-scrollbar {
|
||||
position: absolute;
|
||||
right: 3px;
|
||||
top: 1%;
|
||||
z-index: 50;
|
||||
width: 5px;
|
||||
height: 98%
|
||||
}
|
||||
|
||||
.swiper-scrollbar-drag {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
background: rgba(0, 0, 0, .5);
|
||||
border-radius: 10px;
|
||||
left: 0;
|
||||
top: 0
|
||||
}
|
||||
|
||||
.swiper-scrollbar-cursor-drag {
|
||||
cursor: move
|
||||
}
|
||||
|
||||
.swiper-lazy-preloader {
|
||||
width: 42px;
|
||||
height: 42px;
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
margin-left: -21px;
|
||||
margin-top: -21px;
|
||||
z-index: 10;
|
||||
-webkit-transform-origin: 50%;
|
||||
-moz-transform-origin: 50%;
|
||||
transform-origin: 50%;
|
||||
-webkit-animation: swiper-preloader-spin 1s steps(12, end) infinite;
|
||||
-moz-animation: swiper-preloader-spin 1s steps(12, end) infinite;
|
||||
animation: swiper-preloader-spin 1s steps(12, end) infinite
|
||||
}
|
||||
|
||||
.swiper-lazy-preloader:after {
|
||||
display: block;
|
||||
content: "";
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
|
||||
background-position: 50%;
|
||||
-webkit-background-size: 100%;
|
||||
background-size: 100%;
|
||||
background-repeat: no-repeat
|
||||
}
|
||||
|
||||
.swiper-lazy-preloader-white:after {
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")
|
||||
}
|
||||
|
||||
@-webkit-keyframes swiper-preloader-spin {
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg)
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes swiper-preloader-spin {
|
||||
100% {
|
||||
transform: rotate(360deg)
|
||||
}
|
||||
}
|
||||
1606
src/bower_components/Swiper/dist/js/swiper.min.js
vendored
9
src/bower_components/Swiper/package.js
vendored
@@ -1,9 +0,0 @@
|
||||
var version = "3.3.1";
|
||||
Package.describe({
|
||||
name: "nolimits4web:swiper",
|
||||
summary: "iDangero.us Swiper - mobile touch slider with hardware accelerated transitions and native behavior",
|
||||
version: version,
|
||||
git: "https://github.com/nolimits4web/Swiper"
|
||||
}), Package.onUse(function(api) {
|
||||
api.versionsFrom("1.1.0.2"), api.addFiles(["dist/css/swiper.min.css", "dist/js/swiper.js"], ["client"])
|
||||
}), Package.onTest(function(api) {});
|
||||
419
src/bower_components/alameda/alameda.js
vendored
@@ -1,419 +0,0 @@
|
||||
var requirejs, require, define;
|
||||
! function(global, Promise, undef) {
|
||||
function commentReplace(match, singlePrefix) {
|
||||
return singlePrefix || ""
|
||||
}
|
||||
|
||||
function hasProp(obj, prop) {
|
||||
return hasOwn.call(obj, prop)
|
||||
}
|
||||
|
||||
function getOwn(obj, prop) {
|
||||
return obj && hasProp(obj, prop) && obj[prop]
|
||||
}
|
||||
|
||||
function obj() {
|
||||
return Object.create(null)
|
||||
}
|
||||
|
||||
function eachProp(obj, func) {
|
||||
var prop;
|
||||
for (prop in obj)
|
||||
if (hasProp(obj, prop) && func(obj[prop], prop)) break
|
||||
}
|
||||
|
||||
function mixin(target, source, force, deepStringMixin) {
|
||||
return source && eachProp(source, function(value, prop) {
|
||||
!force && hasProp(target, prop) || (!deepStringMixin || "object" != typeof value || !value || Array.isArray(value) || "function" == typeof value || value instanceof RegExp ? target[prop] = value : (target[prop] || (target[prop] = {}), mixin(target[prop], value, force, deepStringMixin)))
|
||||
}), target
|
||||
}
|
||||
|
||||
function getGlobal(value) {
|
||||
if (!value) return value;
|
||||
var g = global;
|
||||
return value.split(".").forEach(function(part) {
|
||||
g = g[part]
|
||||
}), g
|
||||
}
|
||||
|
||||
function newContext(contextName) {
|
||||
function trimDots(ary) {
|
||||
var i, part, length = ary.length;
|
||||
for (i = 0; i < length; i++)
|
||||
if ("." === (part = ary[i])) ary.splice(i, 1), i -= 1;
|
||||
else if (".." === part) {
|
||||
if (0 === i || 1 === i && ".." === ary[2] || ".." === ary[i - 1]) continue;
|
||||
i > 0 && (ary.splice(i - 1, 2), i -= 2)
|
||||
}
|
||||
}
|
||||
|
||||
function normalize(name, baseName, applyMap) {
|
||||
var mapValue, nameParts, i, j, nameSegment, lastIndex, foundMap, foundI, foundStarMap, starI, baseParts = baseName && baseName.split("/"),
|
||||
normalizedBaseParts = baseParts,
|
||||
map = config.map,
|
||||
starMap = map && map["*"];
|
||||
if (name && (name = name.split("/"), lastIndex = name.length - 1, config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex]) && (name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, "")), "." === name[0].charAt(0) && baseParts && (normalizedBaseParts = baseParts.slice(0, baseParts.length - 1), name = normalizedBaseParts.concat(name)), trimDots(name), name = name.join("/")), applyMap && map && (baseParts || starMap)) {
|
||||
nameParts = name.split("/");
|
||||
outerLoop: for (i = nameParts.length; i > 0; i -= 1) {
|
||||
if (nameSegment = nameParts.slice(0, i).join("/"), baseParts)
|
||||
for (j = baseParts.length; j > 0; j -= 1)
|
||||
if ((mapValue = getOwn(map, baseParts.slice(0, j).join("/"))) && (mapValue = getOwn(mapValue, nameSegment))) {
|
||||
foundMap = mapValue, foundI = i;
|
||||
break outerLoop
|
||||
}! foundStarMap && starMap && getOwn(starMap, nameSegment) && (foundStarMap = getOwn(starMap, nameSegment), starI = i)
|
||||
}!foundMap && foundStarMap && (foundMap = foundStarMap, foundI = starI), foundMap && (nameParts.splice(0, foundI, foundMap), name = nameParts.join("/"))
|
||||
}
|
||||
return getOwn(config.pkgs, name) || name
|
||||
}
|
||||
|
||||
function makeShimExports(value) {
|
||||
function fn() {
|
||||
var ret;
|
||||
return value.init && (ret = value.init.apply(global, arguments)), ret || value.exports && getGlobal(value.exports)
|
||||
}
|
||||
return fn
|
||||
}
|
||||
|
||||
function takeQueue(anonId) {
|
||||
var i, id, args, shim;
|
||||
for (i = 0; i < queue.length; i += 1) {
|
||||
if ("string" != typeof queue[i][0]) {
|
||||
if (!anonId) break;
|
||||
queue[i].unshift(anonId), anonId = undef
|
||||
}
|
||||
args = queue.shift(), id = args[0], i -= 1, id in defined || id in waiting || (id in deferreds ? main.apply(undef, args) : waiting[id] = args)
|
||||
}
|
||||
anonId && (shim = getOwn(config.shim, anonId) || {}, main(anonId, shim.deps || [], shim.exportsFn))
|
||||
}
|
||||
|
||||
function makeRequire(relName, topLevel) {
|
||||
var req = function(deps, callback, errback, alt) {
|
||||
var name, cfg;
|
||||
if (topLevel && takeQueue(), "string" == typeof deps) {
|
||||
if (handlers[deps]) return handlers[deps](relName);
|
||||
if (!((name = makeMap(deps, relName, !0).id) in defined)) throw new Error("Not loaded: " + name);
|
||||
return defined[name]
|
||||
}
|
||||
return deps && !Array.isArray(deps) && (cfg = deps, deps = undef, Array.isArray(callback) && (deps = callback, callback = errback, errback = alt), topLevel) ? req.config(cfg)(deps, callback, errback) : (callback = callback || function() {
|
||||
return slice.call(arguments, 0)
|
||||
}, asyncResolve.then(function() {
|
||||
return takeQueue(), main(undef, deps || [], callback, errback, relName)
|
||||
}))
|
||||
};
|
||||
return req.isBrowser = "undefined" != typeof document && "undefined" != typeof navigator, req.nameToUrl = function(moduleName, ext, skipExt) {
|
||||
var paths, syms, i, parentModule, url, parentPath, bundleId, pkgMain = getOwn(config.pkgs, moduleName);
|
||||
if (pkgMain && (moduleName = pkgMain), bundleId = getOwn(bundlesMap, moduleName)) return req.nameToUrl(bundleId, ext, skipExt);
|
||||
if (urlRegExp.test(moduleName)) url = moduleName + (ext || "");
|
||||
else {
|
||||
for (paths = config.paths, syms = moduleName.split("/"), i = syms.length; i > 0; i -= 1)
|
||||
if (parentModule = syms.slice(0, i).join("/"), parentPath = getOwn(paths, parentModule)) {
|
||||
Array.isArray(parentPath) && (parentPath = parentPath[0]), syms.splice(0, i, parentPath);
|
||||
break
|
||||
} url = syms.join("/"), url += ext || (/^data\:|^blob\:|\?/.test(url) || skipExt ? "" : ".js"), url = ("/" === url.charAt(0) || url.match(/^[\w\+\.\-]+:/) ? "" : config.baseUrl) + url
|
||||
}
|
||||
return config.urlArgs && !/^blob\:/.test(url) ? url + config.urlArgs(moduleName, url) : url
|
||||
}, req.toUrl = function(moduleNamePlusExt) {
|
||||
var ext, index = moduleNamePlusExt.lastIndexOf("."),
|
||||
segment = moduleNamePlusExt.split("/")[0],
|
||||
isRelative = "." === segment || ".." === segment;
|
||||
return -1 !== index && (!isRelative || index > 1) && (ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length), moduleNamePlusExt = moduleNamePlusExt.substring(0, index)), req.nameToUrl(normalize(moduleNamePlusExt, relName), ext, !0)
|
||||
}, req.defined = function(id) {
|
||||
return makeMap(id, relName, !0).id in defined
|
||||
}, req.specified = function(id) {
|
||||
return (id = makeMap(id, relName, !0).id) in defined || id in deferreds
|
||||
}, req
|
||||
}
|
||||
|
||||
function resolve(name, d, value) {
|
||||
name && (defined[name] = value, requirejs.onResourceLoad && requirejs.onResourceLoad(context, d.map, d.deps)), d.finished = !0, d.resolve(value)
|
||||
}
|
||||
|
||||
function reject(d, err) {
|
||||
d.finished = !0, d.rejected = !0, d.reject(err)
|
||||
}
|
||||
|
||||
function makeNormalize(relName) {
|
||||
return function(name) {
|
||||
return normalize(name, relName, !0)
|
||||
}
|
||||
}
|
||||
|
||||
function defineModule(d) {
|
||||
d.factoryCalled = !0;
|
||||
var ret, name = d.map.id;
|
||||
try {
|
||||
ret = context.execCb(name, d.factory, d.values, defined[name])
|
||||
} catch (err) {
|
||||
return reject(d, err)
|
||||
}
|
||||
name ? ret === undef && (d.cjsModule ? ret = d.cjsModule.exports : d.usingExports && (ret = defined[name])) : requireDeferreds.splice(requireDeferreds.indexOf(d), 1), resolve(name, d, ret)
|
||||
}
|
||||
|
||||
function depFinished(val, i) {
|
||||
this.rejected || this.depDefined[i] || (this.depDefined[i] = !0, this.depCount += 1, this.values[i] = val, this.depending || this.depCount !== this.depMax || defineModule(this))
|
||||
}
|
||||
|
||||
function makeDefer(name, calculatedMap) {
|
||||
var d = {};
|
||||
return d.promise = new Promise(function(resolve, reject) {
|
||||
d.resolve = resolve, d.reject = function(err) {
|
||||
name || requireDeferreds.splice(requireDeferreds.indexOf(d), 1), reject(err)
|
||||
}
|
||||
}), d.map = name ? calculatedMap || makeMap(name) : {}, d.depCount = 0, d.depMax = 0, d.values = [], d.depDefined = [], d.depFinished = depFinished, d.map.pr && (d.deps = [makeMap(d.map.pr)]), d
|
||||
}
|
||||
|
||||
function getDefer(name, calculatedMap) {
|
||||
var d;
|
||||
return name ? (d = name in deferreds && deferreds[name]) || (d = deferreds[name] = makeDefer(name, calculatedMap)) : (d = makeDefer(), requireDeferreds.push(d)), d
|
||||
}
|
||||
|
||||
function makeErrback(d, name) {
|
||||
return function(err) {
|
||||
d.rejected || (err.dynaId || (err.dynaId = "id" + (errCount += 1), err.requireModules = [name]), reject(d, err))
|
||||
}
|
||||
}
|
||||
|
||||
function waitForDep(depMap, relName, d, i) {
|
||||
d.depMax += 1, callDep(depMap, relName).then(function(val) {
|
||||
d.depFinished(val, i)
|
||||
}, makeErrback(d, depMap.id)).catch(makeErrback(d, d.map.id))
|
||||
}
|
||||
|
||||
function makeLoad(id) {
|
||||
function load(value) {
|
||||
fromTextCalled || resolve(id, getDefer(id), value)
|
||||
}
|
||||
var fromTextCalled;
|
||||
return load.error = function(err) {
|
||||
reject(getDefer(id), err)
|
||||
}, load.fromText = function(text, textAlt) {
|
||||
var execError, d = getDefer(id),
|
||||
map = makeMap(makeMap(id).n),
|
||||
plainId = map.id;
|
||||
fromTextCalled = !0, d.factory = function(p, val) {
|
||||
return val
|
||||
}, textAlt && (text = textAlt), hasProp(config.config, id) && (config.config[plainId] = config.config[id]);
|
||||
try {
|
||||
req.exec(text)
|
||||
} catch (e) {
|
||||
execError = new Error("fromText eval for " + plainId + " failed: " + e), execError.requireType = "fromtexteval", reject(d, execError)
|
||||
}
|
||||
takeQueue(plainId), d.deps = [map], waitForDep(map, null, d, d.deps.length)
|
||||
}, load
|
||||
}
|
||||
|
||||
function callPlugin(plugin, map, relName) {
|
||||
plugin.load(map.n, makeRequire(relName), makeLoad(map.id), config)
|
||||
}
|
||||
|
||||
function splitPrefix(name) {
|
||||
var prefix, index = name ? name.indexOf("!") : -1;
|
||||
return index > -1 && (prefix = name.substring(0, index), name = name.substring(index + 1, name.length)), [prefix, name]
|
||||
}
|
||||
|
||||
function breakCycle(d, traced, processed) {
|
||||
var id = d.map.id;
|
||||
traced[id] = !0, !d.finished && d.deps && d.deps.forEach(function(depMap) {
|
||||
var depId = depMap.id,
|
||||
dep = !hasProp(handlers, depId) && getDefer(depId, depMap);
|
||||
!dep || dep.finished || processed[depId] || (hasProp(traced, depId) ? d.deps.forEach(function(depMap, i) {
|
||||
depMap.id === depId && d.depFinished(defined[depId], i)
|
||||
}) : breakCycle(dep, traced, processed))
|
||||
}), processed[id] = !0
|
||||
}
|
||||
|
||||
function check(d) {
|
||||
var err, mid, dfd, notFinished = [],
|
||||
waitInterval = 1e3 * config.waitSeconds,
|
||||
expired = waitInterval && startTime + waitInterval < (new Date).getTime();
|
||||
if (0 === loadCount && (d ? d.finished || breakCycle(d, {}, {}) : requireDeferreds.length && requireDeferreds.forEach(function(d) {
|
||||
breakCycle(d, {}, {})
|
||||
})), expired) {
|
||||
for (mid in deferreds) dfd = deferreds[mid], dfd.finished || notFinished.push(dfd.map.id);
|
||||
err = new Error("Timeout for modules: " + notFinished), err.requireModules = notFinished, err.requireType = "timeout", notFinished.forEach(function(id) {
|
||||
reject(getDefer(id), err)
|
||||
})
|
||||
} else(loadCount || requireDeferreds.length) && (checkingLater || (checkingLater = !0, setTimeout(function() {
|
||||
checkingLater = !1, check()
|
||||
}, 70)))
|
||||
}
|
||||
|
||||
function delayedError(e) {
|
||||
console.log(e.stack);
|
||||
return setTimeout(function() {
|
||||
e.dynaId && trackedErrors[e.dynaId] || (trackedErrors[e.dynaId] = !0, req.onError(e))
|
||||
}), e
|
||||
}
|
||||
var req, main, makeMap, callDep, handlers, checkingLater, load, context, defined = obj(),
|
||||
waiting = obj(),
|
||||
config = {
|
||||
waitSeconds: 7,
|
||||
baseUrl: "./",
|
||||
paths: {},
|
||||
bundles: {},
|
||||
pkgs: {},
|
||||
shim: {},
|
||||
config: {}
|
||||
},
|
||||
mapCache = obj(),
|
||||
requireDeferreds = [],
|
||||
deferreds = obj(),
|
||||
calledDefine = obj(),
|
||||
calledPlugin = obj(),
|
||||
loadCount = 0,
|
||||
startTime = (new Date).getTime(),
|
||||
errCount = 0,
|
||||
trackedErrors = obj(),
|
||||
urlFetched = obj(),
|
||||
bundlesMap = obj(),
|
||||
asyncResolve = Promise.resolve(undefined);
|
||||
return load = "function" == typeof importScripts ? function(map) {
|
||||
var url = map.url;
|
||||
urlFetched[url] || (urlFetched[url] = !0, getDefer(map.id), importScripts(url), takeQueue(map.id))
|
||||
} : function(map) {
|
||||
var script, id = map.id,
|
||||
url = map.url;
|
||||
urlFetched[url] || (urlFetched[url] = !0, script = document.createElement("script"), script.setAttribute("data-requiremodule", id), script.type = config.scriptType || "text/javascript", script.charset = "utf-8", script.async = !0, loadCount += 1, script.addEventListener("load", function() {
|
||||
loadCount -= 1, takeQueue(id)
|
||||
}, !1), script.addEventListener("error", function() {
|
||||
loadCount -= 1;
|
||||
var err, pathConfig = getOwn(config.paths, id);
|
||||
if (pathConfig && Array.isArray(pathConfig) && pathConfig.length > 1) {
|
||||
script.parentNode.removeChild(script), pathConfig.shift();
|
||||
var d = getDefer(id);
|
||||
d.map = makeMap(id), d.map.url = req.nameToUrl(id), load(d.map)
|
||||
} else err = new Error("Load failed: " + id + ": " + script.src), err.requireModules = [id], err.requireType = "scripterror", reject(getDefer(id), err)
|
||||
}, !1), script.src = url, 10 === document.documentMode ? asap.then(function() {
|
||||
document.head.appendChild(script)
|
||||
}) : document.head.appendChild(script))
|
||||
}, callDep = function(map, relName) {
|
||||
var args, bundleId, name = map.id,
|
||||
shim = config.shim[name];
|
||||
if (name in waiting) args = waiting[name], delete waiting[name], main.apply(undef, args);
|
||||
else if (!(name in deferreds))
|
||||
if (map.pr) {
|
||||
if (!(bundleId = getOwn(bundlesMap, name))) return callDep(makeMap(map.pr)).then(function(plugin) {
|
||||
var newMap = map.prn ? map : makeMap(name, relName, !0),
|
||||
newId = newMap.id,
|
||||
shim = getOwn(config.shim, newId);
|
||||
return newId in calledPlugin || (calledPlugin[newId] = !0, shim && shim.deps ? req(shim.deps, function() {
|
||||
callPlugin(plugin, newMap, relName)
|
||||
}) : callPlugin(plugin, newMap, relName)), getDefer(newId).promise
|
||||
});
|
||||
map.url = req.nameToUrl(bundleId), load(map)
|
||||
} else shim && shim.deps ? req(shim.deps, function() {
|
||||
load(map)
|
||||
}) : load(map);
|
||||
return getDefer(name).promise
|
||||
}, makeMap = function(name, relName, applyMap) {
|
||||
if ("string" != typeof name) return name;
|
||||
var plugin, url, parts, prefix, result, prefixNormalized, cacheKey = name + " & " + (relName || "") + " & " + !!applyMap;
|
||||
return parts = splitPrefix(name), prefix = parts[0], name = parts[1], !prefix && cacheKey in mapCache ? mapCache[cacheKey] : (prefix && (prefix = normalize(prefix, relName, applyMap), plugin = prefix in defined && defined[prefix]), prefix ? plugin && plugin.normalize ? (name = plugin.normalize(name, makeNormalize(relName)), prefixNormalized = !0) : name = -1 === name.indexOf("!") ? normalize(name, relName, applyMap) : name : (name = normalize(name, relName, applyMap), parts = splitPrefix(name), prefix = parts[0], name = parts[1], url = req.nameToUrl(name)), result = {
|
||||
id: prefix ? prefix + "!" + name : name,
|
||||
n: name,
|
||||
pr: prefix,
|
||||
url: url,
|
||||
prn: prefix && prefixNormalized
|
||||
}, prefix || (mapCache[cacheKey] = result), result)
|
||||
}, handlers = {
|
||||
require: function(name) {
|
||||
return makeRequire(name)
|
||||
},
|
||||
exports: function(name) {
|
||||
var e = defined[name];
|
||||
return void 0 !== e ? e : defined[name] = {}
|
||||
},
|
||||
module: function(name) {
|
||||
return {
|
||||
id: name,
|
||||
uri: "",
|
||||
exports: handlers.exports(name),
|
||||
config: function() {
|
||||
return getOwn(config.config, name) || {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}, main = function(name, deps, factory, errback, relName) {
|
||||
if (name) {
|
||||
if (name in calledDefine) return;
|
||||
calledDefine[name] = !0
|
||||
}
|
||||
var d = getDefer(name);
|
||||
return deps && !Array.isArray(deps) && (factory = deps, deps = []), deps = deps ? slice.call(deps, 0) : null, errback || (hasProp(config, "defaultErrback") ? config.defaultErrback && (errback = config.defaultErrback) : errback = delayedError), errback && d.promise.catch(errback), relName = relName || name, "function" == typeof factory ? (!deps.length && factory.length && (factory.toString().replace(commentRegExp, commentReplace).replace(cjsRequireRegExp, function(match, dep) {
|
||||
deps.push(dep)
|
||||
}), deps = (1 === factory.length ? ["require"] : ["require", "exports", "module"]).concat(deps)), d.factory = factory, d.deps = deps, d.depending = !0, deps.forEach(function(depName, i) {
|
||||
var depMap;
|
||||
deps[i] = depMap = makeMap(depName, relName, !0), depName = depMap.id, "require" === depName ? d.values[i] = handlers.require(name) : "exports" === depName ? (d.values[i] = handlers.exports(name), d.usingExports = !0) : "module" === depName ? d.values[i] = d.cjsModule = handlers.module(name) : void 0 === depName ? d.values[i] = void 0 : waitForDep(depMap, relName, d, i)
|
||||
}), d.depending = !1, d.depCount === d.depMax && defineModule(d)) : name && resolve(name, d, factory), startTime = (new Date).getTime(), name || check(d), d.promise
|
||||
}, req = makeRequire(null, !0), req.config = function(cfg) {
|
||||
if (cfg.context && cfg.context !== contextName) {
|
||||
var existingContext = getOwn(contexts, cfg.context);
|
||||
return existingContext ? existingContext.req.config(cfg) : newContext(cfg.context).config(cfg)
|
||||
}
|
||||
if (mapCache = obj(), cfg.baseUrl && "/" !== cfg.baseUrl.charAt(cfg.baseUrl.length - 1) && (cfg.baseUrl += "/"), "string" == typeof cfg.urlArgs) {
|
||||
var urlArgs = cfg.urlArgs;
|
||||
cfg.urlArgs = function(id, url) {
|
||||
return (-1 === url.indexOf("?") ? "?" : "&") + urlArgs
|
||||
}
|
||||
}
|
||||
var shim = config.shim,
|
||||
objs = {
|
||||
paths: !0,
|
||||
bundles: !0,
|
||||
config: !0,
|
||||
map: !0
|
||||
};
|
||||
return eachProp(cfg, function(value, prop) {
|
||||
objs[prop] ? (config[prop] || (config[prop] = {}), mixin(config[prop], value, !0, !0)) : config[prop] = value
|
||||
}), cfg.bundles && eachProp(cfg.bundles, function(value, prop) {
|
||||
value.forEach(function(v) {
|
||||
v !== prop && (bundlesMap[v] = prop)
|
||||
})
|
||||
}), cfg.shim && (eachProp(cfg.shim, function(value, id) {
|
||||
Array.isArray(value) && (value = {
|
||||
deps: value
|
||||
}), !value.exports && !value.init || value.exportsFn || (value.exportsFn = makeShimExports(value)), shim[id] = value
|
||||
}), config.shim = shim), cfg.packages && cfg.packages.forEach(function(pkgObj) {
|
||||
var location, name;
|
||||
pkgObj = "string" == typeof pkgObj ? {
|
||||
name: pkgObj
|
||||
} : pkgObj, name = pkgObj.name, location = pkgObj.location, location && (config.paths[name] = pkgObj.location), config.pkgs[name] = pkgObj.name + "/" + (pkgObj.main || "main").replace(currDirRegExp, "").replace(jsSuffixRegExp, "")
|
||||
}), (cfg.deps || cfg.callback) && req(cfg.deps, cfg.callback), req
|
||||
}, req.onError = function(err) {
|
||||
throw err
|
||||
}, context = {
|
||||
id: contextName,
|
||||
defined: defined,
|
||||
waiting: waiting,
|
||||
config: config,
|
||||
deferreds: deferreds,
|
||||
req: req,
|
||||
execCb: function(name, callback, args, exports) {
|
||||
return callback.apply(exports, args)
|
||||
}
|
||||
}, contexts[contextName] = context, req
|
||||
}
|
||||
if (!Promise) throw new Error("No Promise implementation available");
|
||||
var topReq, dataMain, src, subPath, bootstrapConfig = requirejs || require,
|
||||
hasOwn = Object.prototype.hasOwnProperty,
|
||||
contexts = {},
|
||||
queue = [],
|
||||
currDirRegExp = /^\.\//,
|
||||
urlRegExp = /^\/|\:|\?|\.js$/,
|
||||
commentRegExp = /\/\*[\s\S]*?\*\/|([^:"'=]|^)\/\/.*$/gm,
|
||||
cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
|
||||
jsSuffixRegExp = /\.js$/,
|
||||
slice = Array.prototype.slice;
|
||||
if ("function" != typeof requirejs) {
|
||||
var asap = Promise.resolve(void 0);
|
||||
requirejs = topReq = newContext("_"), "function" != typeof require && (require = topReq), topReq.exec = function(text) {
|
||||
return eval(text)
|
||||
}, topReq.contexts = contexts, define = function() {
|
||||
queue.push(slice.call(arguments, 0))
|
||||
}, define.amd = {
|
||||
jQuery: !0
|
||||
}, bootstrapConfig && topReq.config(bootstrapConfig), topReq.isBrowser && !contexts._.config.skipDataMain && (dataMain = document.querySelectorAll("script[data-main]")[0], (dataMain = dataMain && dataMain.getAttribute("data-main")) && (dataMain = dataMain.replace(jsSuffixRegExp, ""), bootstrapConfig && bootstrapConfig.baseUrl || -1 !== dataMain.indexOf("!") || (src = dataMain.split("/"), dataMain = src.pop(), subPath = src.length ? src.join("/") + "/" : "./", topReq.config({
|
||||
baseUrl: subPath
|
||||
})), topReq([dataMain])))
|
||||
}
|
||||
}(this, "undefined" != typeof Promise ? Promise : void 0);
|
||||
747
src/bower_components/apiclient/connectionmanager.js
vendored
@@ -1,747 +0,0 @@
|
||||
define(["events", "apiclient", "appStorage"], function(events, apiClientFactory, appStorage) {
|
||||
"use strict";
|
||||
|
||||
function getServerAddress(server, mode) {
|
||||
switch (mode) {
|
||||
case ConnectionMode.Local:
|
||||
return server.LocalAddress;
|
||||
case ConnectionMode.Manual:
|
||||
return server.ManualAddress;
|
||||
case ConnectionMode.Remote:
|
||||
return server.RemoteAddress;
|
||||
default:
|
||||
return server.ManualAddress || server.LocalAddress || server.RemoteAddress
|
||||
}
|
||||
}
|
||||
|
||||
function paramsToString(params) {
|
||||
var values = [];
|
||||
for (var key in params) {
|
||||
var value = params[key];
|
||||
null !== value && void 0 !== value && "" !== value && values.push(encodeURIComponent(key) + "=" + encodeURIComponent(value))
|
||||
}
|
||||
return values.join("&")
|
||||
}
|
||||
|
||||
function resolveFailure(instance, resolve) {
|
||||
resolve({
|
||||
State: "Unavailable",
|
||||
ConnectUser: instance.connectUser()
|
||||
})
|
||||
}
|
||||
|
||||
function mergeServers(credentialProvider, list1, list2) {
|
||||
for (var i = 0, length = list2.length; i < length; i++) credentialProvider.addOrUpdateServer(list1, list2[i]);
|
||||
return list1
|
||||
}
|
||||
|
||||
function updateServerInfo(server, systemInfo) {
|
||||
server.Name = systemInfo.ServerName, systemInfo.Id && (server.Id = systemInfo.Id), systemInfo.LocalAddress && (server.LocalAddress = systemInfo.LocalAddress), systemInfo.WanAddress && (server.RemoteAddress = systemInfo.WanAddress)
|
||||
}
|
||||
|
||||
function getEmbyServerUrl(baseUrl, handler) {
|
||||
return baseUrl + "/emby/" + handler
|
||||
}
|
||||
|
||||
function getFetchPromise(request) {
|
||||
var headers = request.headers || {};
|
||||
"json" === request.dataType && (headers.accept = "application/json");
|
||||
var fetchRequest = {
|
||||
headers: headers,
|
||||
method: request.type,
|
||||
credentials: "same-origin"
|
||||
},
|
||||
contentType = request.contentType;
|
||||
return request.data && ("string" == typeof request.data ? fetchRequest.body = request.data : (fetchRequest.body = paramsToString(request.data), contentType = contentType || "application/x-www-form-urlencoded; charset=UTF-8")), contentType && (headers["Content-Type"] = contentType), request.timeout ? fetchWithTimeout(request.url, fetchRequest, request.timeout) : fetch(request.url, fetchRequest)
|
||||
}
|
||||
|
||||
function fetchWithTimeout(url, options, timeoutMs) {
|
||||
return console.log("fetchWithTimeout: timeoutMs: " + timeoutMs + ", url: " + url), new Promise(function(resolve, reject) {
|
||||
var timeout = setTimeout(reject, timeoutMs);
|
||||
options = options || {}, options.credentials = "same-origin", fetch(url, options).then(function(response) {
|
||||
clearTimeout(timeout), console.log("fetchWithTimeout: succeeded connecting to url: " + url), resolve(response)
|
||||
}, function(error) {
|
||||
clearTimeout(timeout), console.log("fetchWithTimeout: timed out connecting to url: " + url), reject()
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function ajax(request) {
|
||||
if (!request) throw new Error("Request cannot be null");
|
||||
return request.headers = request.headers || {}, console.log("ConnectionManager requesting url: " + request.url), getFetchPromise(request).then(function(response) {
|
||||
return console.log("ConnectionManager response status: " + response.status + ", url: " + request.url), response.status < 400 ? "json" === request.dataType || "application/json" === request.headers.accept ? response.json() : response : Promise.reject(response)
|
||||
}, function(err) {
|
||||
throw console.log("ConnectionManager request failed to url: " + request.url), err
|
||||
})
|
||||
}
|
||||
|
||||
function getConnectUrl(handler) {
|
||||
return "https://connect.emby.media/service/" + handler
|
||||
}
|
||||
|
||||
function replaceAll(originalString, strReplace, strWith) {
|
||||
var reg = new RegExp(strReplace, "ig");
|
||||
return originalString.replace(reg, strWith)
|
||||
}
|
||||
|
||||
function normalizeAddress(address) {
|
||||
return address = address.trim(), 0 !== address.toLowerCase().indexOf("http") && (address = "http://" + address), address = replaceAll(address, "Http:", "http:"), address = replaceAll(address, "Https:", "https:")
|
||||
}
|
||||
|
||||
function stringEqualsIgnoreCase(str1, str2) {
|
||||
return (str1 || "").toLowerCase() === (str2 || "").toLowerCase()
|
||||
}
|
||||
|
||||
function compareVersions(a, b) {
|
||||
a = a.split("."), b = b.split(".");
|
||||
for (var i = 0, length = Math.max(a.length, b.length); i < length; i++) {
|
||||
var aVal = parseInt(a[i] || "0"),
|
||||
bVal = parseInt(b[i] || "0");
|
||||
if (aVal < bVal) return -1;
|
||||
if (aVal > bVal) return 1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
var defaultTimeout = 2e4,
|
||||
ConnectionMode = {
|
||||
Local: 0,
|
||||
Remote: 1,
|
||||
Manual: 2
|
||||
},
|
||||
ConnectionManager = function(credentialProvider, appName, appVersion, deviceName, deviceId, capabilities, devicePixelRatio) {
|
||||
function onConnectUserSignIn(user) {
|
||||
connectUser = user, events.trigger(self, "connectusersignedin", [user])
|
||||
}
|
||||
|
||||
function onAuthenticated(apiClient, result, options, saveCredentials) {
|
||||
var credentials = credentialProvider.credentials(),
|
||||
servers = credentials.Servers.filter(function(s) {
|
||||
return s.Id === result.ServerId
|
||||
}),
|
||||
server = servers.length ? servers[0] : apiClient.serverInfo();
|
||||
return !1 !== options.updateDateLastAccessed && (server.DateLastAccessed = (new Date).getTime()), server.Id = result.ServerId, saveCredentials ? (server.UserId = result.User.Id, server.AccessToken = result.AccessToken) : (server.UserId = null, server.AccessToken = null), credentialProvider.addOrUpdateServer(credentials.Servers, server), credentialProvider.credentials(credentials), apiClient.enableAutomaticBitrateDetection = options.enableAutomaticBitrateDetection, apiClient.serverInfo(server), afterConnected(apiClient, options), onLocalUserSignIn(server, apiClient.serverAddress(), result.User)
|
||||
}
|
||||
|
||||
function afterConnected(apiClient, options) {
|
||||
options = options || {}, !1 !== options.reportCapabilities && apiClient.reportCapabilities(capabilities), apiClient.enableAutomaticBitrateDetection = options.enableAutomaticBitrateDetection, !1 !== options.enableWebSocket && (console.log("calling apiClient.ensureWebSocket"), apiClient.ensureWebSocket())
|
||||
}
|
||||
|
||||
function onLocalUserSignIn(server, serverUrl, user) {
|
||||
return self._getOrAddApiClient(server, serverUrl), (self.onLocalUserSignedIn ? self.onLocalUserSignedIn.call(self, user) : Promise.resolve()).then(function() {
|
||||
events.trigger(self, "localusersignedin", [user])
|
||||
})
|
||||
}
|
||||
|
||||
function ensureConnectUser(credentials) {
|
||||
return connectUser && connectUser.Id === credentials.ConnectUserId ? Promise.resolve() : credentials.ConnectUserId && credentials.ConnectAccessToken ? (connectUser = null, getConnectUser(credentials.ConnectUserId, credentials.ConnectAccessToken).then(function(user) {
|
||||
return onConnectUserSignIn(user), Promise.resolve()
|
||||
}, function() {
|
||||
return Promise.resolve()
|
||||
})) : Promise.resolve()
|
||||
}
|
||||
|
||||
function getConnectUser(userId, accessToken) {
|
||||
if (!userId) throw new Error("null userId");
|
||||
if (!accessToken) throw new Error("null accessToken");
|
||||
return ajax({
|
||||
type: "GET",
|
||||
url: "https://connect.emby.media/service/user?id=" + userId,
|
||||
dataType: "json",
|
||||
headers: {
|
||||
"X-Application": appName + "/" + appVersion,
|
||||
"X-Connect-UserToken": accessToken
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function addAuthenticationInfoFromConnect(server, serverUrl, credentials) {
|
||||
if (!server.ExchangeToken) throw new Error("server.ExchangeToken cannot be null");
|
||||
if (!credentials.ConnectUserId) throw new Error("credentials.ConnectUserId cannot be null");
|
||||
var url = getEmbyServerUrl(serverUrl, "Connect/Exchange?format=json&ConnectUserId=" + credentials.ConnectUserId),
|
||||
auth = 'MediaBrowser Client="' + appName + '", Device="' + deviceName + '", DeviceId="' + deviceId + '", Version="' + appVersion + '"';
|
||||
return ajax({
|
||||
type: "GET",
|
||||
url: url,
|
||||
dataType: "json",
|
||||
headers: {
|
||||
"X-MediaBrowser-Token": server.ExchangeToken,
|
||||
"X-Emby-Authorization": auth
|
||||
}
|
||||
}).then(function(auth) {
|
||||
return server.UserId = auth.LocalUserId, server.AccessToken = auth.AccessToken, auth
|
||||
}, function() {
|
||||
return server.UserId = null, server.AccessToken = null, Promise.reject()
|
||||
})
|
||||
}
|
||||
|
||||
function validateAuthentication(server, serverUrl) {
|
||||
return ajax({
|
||||
type: "GET",
|
||||
url: getEmbyServerUrl(serverUrl, "System/Info"),
|
||||
dataType: "json",
|
||||
headers: {
|
||||
"X-MediaBrowser-Token": server.AccessToken
|
||||
}
|
||||
}).then(function(systemInfo) {
|
||||
return updateServerInfo(server, systemInfo), Promise.resolve()
|
||||
}, function() {
|
||||
return server.UserId = null, server.AccessToken = null, Promise.resolve()
|
||||
})
|
||||
}
|
||||
|
||||
function getImageUrl(localUser) {
|
||||
if (connectUser && connectUser.ImageUrl) return {
|
||||
url: connectUser.ImageUrl
|
||||
};
|
||||
if (localUser && localUser.PrimaryImageTag) {
|
||||
return {
|
||||
url: self.getApiClient(localUser).getUserImageUrl(localUser.Id, {
|
||||
tag: localUser.PrimaryImageTag,
|
||||
type: "Primary"
|
||||
}),
|
||||
supportsParams: !0
|
||||
}
|
||||
}
|
||||
return {
|
||||
url: null,
|
||||
supportsParams: !1
|
||||
}
|
||||
}
|
||||
|
||||
function logoutOfServer(apiClient) {
|
||||
var serverInfo = apiClient.serverInfo() || {},
|
||||
logoutInfo = {
|
||||
serverId: serverInfo.Id
|
||||
};
|
||||
return apiClient.logout().then(function() {
|
||||
events.trigger(self, "localusersignedout", [logoutInfo])
|
||||
}, function() {
|
||||
events.trigger(self, "localusersignedout", [logoutInfo])
|
||||
})
|
||||
}
|
||||
|
||||
function getConnectServers(credentials) {
|
||||
return console.log("Begin getConnectServers"), credentials.ConnectAccessToken && credentials.ConnectUserId ? ajax({
|
||||
type: "GET",
|
||||
url: "https://connect.emby.media/service/servers?userId=" + credentials.ConnectUserId,
|
||||
dataType: "json",
|
||||
headers: {
|
||||
"X-Application": appName + "/" + appVersion,
|
||||
"X-Connect-UserToken": credentials.ConnectAccessToken
|
||||
}
|
||||
}).then(function(servers) {
|
||||
return servers.map(function(i) {
|
||||
return {
|
||||
ExchangeToken: i.AccessKey,
|
||||
ConnectServerId: i.Id,
|
||||
Id: i.SystemId,
|
||||
Name: i.Name,
|
||||
RemoteAddress: i.Url,
|
||||
LocalAddress: i.LocalAddress,
|
||||
UserLinkType: "guest" === (i.UserType || "").toLowerCase() ? "Guest" : "LinkedUser"
|
||||
}
|
||||
})
|
||||
}, function() {
|
||||
return credentials.Servers.slice(0).filter(function(s) {
|
||||
return s.ExchangeToken
|
||||
})
|
||||
}) : Promise.resolve([])
|
||||
}
|
||||
|
||||
function filterServers(servers, connectServers) {
|
||||
return servers.filter(function(server) {
|
||||
return !server.ExchangeToken || connectServers.filter(function(connectServer) {
|
||||
return server.Id === connectServer.Id
|
||||
}).length > 0
|
||||
})
|
||||
}
|
||||
|
||||
function findServers() {
|
||||
return new Promise(function(resolve, reject) {
|
||||
var onFinish = function(foundServers) {
|
||||
var servers = foundServers.map(function(foundServer) {
|
||||
var info = {
|
||||
Id: foundServer.Id,
|
||||
LocalAddress: convertEndpointAddressToManualAddress(foundServer) || foundServer.Address,
|
||||
Name: foundServer.Name
|
||||
};
|
||||
return info.LastConnectionMode = info.ManualAddress ? ConnectionMode.Manual : ConnectionMode.Local, info
|
||||
});
|
||||
resolve(servers)
|
||||
};
|
||||
|
||||
if (window.NativeShell && typeof window.NativeShell.findServers === 'function') {
|
||||
window.NativeShell.findServers(1e3).then(onFinish, function() {
|
||||
onFinish([])
|
||||
});
|
||||
} else {
|
||||
resolve([]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function convertEndpointAddressToManualAddress(info) {
|
||||
if (info.Address && info.EndpointAddress) {
|
||||
var address = info.EndpointAddress.split(":")[0],
|
||||
parts = info.Address.split(":");
|
||||
if (parts.length > 1) {
|
||||
var portString = parts[parts.length - 1];
|
||||
isNaN(parseInt(portString)) || (address += ":" + portString)
|
||||
}
|
||||
return normalizeAddress(address)
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
function getTryConnectPromise(url, connectionMode, state, resolve, reject) {
|
||||
console.log("getTryConnectPromise " + url), ajax({
|
||||
url: getEmbyServerUrl(url, "system/info/public"),
|
||||
timeout: defaultTimeout,
|
||||
type: "GET",
|
||||
dataType: "json"
|
||||
}).then(function(result) {
|
||||
state.resolved || (state.resolved = !0, console.log("Reconnect succeeded to " + url), resolve({
|
||||
url: url,
|
||||
connectionMode: connectionMode,
|
||||
data: result
|
||||
}))
|
||||
}, function() {
|
||||
state.resolved || (console.log("Reconnect failed to " + url), ++state.rejects >= state.numAddresses && reject())
|
||||
})
|
||||
}
|
||||
|
||||
function tryReconnect(serverInfo) {
|
||||
var addresses = [],
|
||||
addressesStrings = [];
|
||||
return !serverInfo.manualAddressOnly && serverInfo.LocalAddress && -1 === addressesStrings.indexOf(serverInfo.LocalAddress) && (addresses.push({
|
||||
url: serverInfo.LocalAddress,
|
||||
mode: ConnectionMode.Local,
|
||||
timeout: 0
|
||||
}), addressesStrings.push(addresses[addresses.length - 1].url)), serverInfo.ManualAddress && -1 === addressesStrings.indexOf(serverInfo.ManualAddress) && (addresses.push({
|
||||
url: serverInfo.ManualAddress,
|
||||
mode: ConnectionMode.Manual,
|
||||
timeout: 100
|
||||
}), addressesStrings.push(addresses[addresses.length - 1].url)), !serverInfo.manualAddressOnly && serverInfo.RemoteAddress && -1 === addressesStrings.indexOf(serverInfo.RemoteAddress) && (addresses.push({
|
||||
url: serverInfo.RemoteAddress,
|
||||
mode: ConnectionMode.Remote,
|
||||
timeout: 200
|
||||
}), addressesStrings.push(addresses[addresses.length - 1].url)), console.log("tryReconnect: " + addressesStrings.join("|")), new Promise(function(resolve, reject) {
|
||||
var state = {};
|
||||
state.numAddresses = addresses.length, state.rejects = 0, addresses.map(function(url) {
|
||||
setTimeout(function() {
|
||||
state.resolved || getTryConnectPromise(url.url, url.mode, state, resolve, reject)
|
||||
}, url.timeout)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function onSuccessfulConnection(server, systemInfo, connectionMode, serverUrl, options, resolve) {
|
||||
var credentials = credentialProvider.credentials();
|
||||
options = options || {}, credentials.ConnectAccessToken && !1 !== options.enableAutoLogin ? ensureConnectUser(credentials).then(function() {
|
||||
server.ExchangeToken ? addAuthenticationInfoFromConnect(server, serverUrl, credentials).then(function() {
|
||||
afterConnectValidated(server, credentials, systemInfo, connectionMode, serverUrl, !0, options, resolve)
|
||||
}, function() {
|
||||
afterConnectValidated(server, credentials, systemInfo, connectionMode, serverUrl, !0, options, resolve)
|
||||
}) : afterConnectValidated(server, credentials, systemInfo, connectionMode, serverUrl, !0, options, resolve)
|
||||
}) : afterConnectValidated(server, credentials, systemInfo, connectionMode, serverUrl, !0, options, resolve)
|
||||
}
|
||||
|
||||
function afterConnectValidated(server, credentials, systemInfo, connectionMode, serverUrl, verifyLocalAuthentication, options, resolve) {
|
||||
if (options = options || {}, !1 === options.enableAutoLogin) server.UserId = null, server.AccessToken = null;
|
||||
else if (verifyLocalAuthentication && server.AccessToken && !1 !== options.enableAutoLogin) return void validateAuthentication(server, serverUrl).then(function() {
|
||||
afterConnectValidated(server, credentials, systemInfo, connectionMode, serverUrl, !1, options, resolve)
|
||||
});
|
||||
updateServerInfo(server, systemInfo), server.LastConnectionMode = connectionMode, !1 !== options.updateDateLastAccessed && (server.DateLastAccessed = (new Date).getTime()), credentialProvider.addOrUpdateServer(credentials.Servers, server), credentialProvider.credentials(credentials);
|
||||
var result = {
|
||||
Servers: []
|
||||
};
|
||||
result.ApiClient = self._getOrAddApiClient(server, serverUrl), result.ApiClient.setSystemInfo(systemInfo), result.State = server.AccessToken && !1 !== options.enableAutoLogin ? "SignedIn" : "ServerSignIn", result.Servers.push(server), result.ApiClient.enableAutomaticBitrateDetection = options.enableAutomaticBitrateDetection, result.ApiClient.updateServerInfo(server, serverUrl);
|
||||
var resolveActions = function() {
|
||||
resolve(result), events.trigger(self, "connected", [result])
|
||||
};
|
||||
"SignedIn" === result.State ? (afterConnected(result.ApiClient, options), result.ApiClient.getCurrentUser().then(function(user) {
|
||||
onLocalUserSignIn(server, serverUrl, user).then(resolveActions, resolveActions)
|
||||
}, resolveActions)) : resolveActions()
|
||||
}
|
||||
|
||||
function getCacheKey(feature, apiClient, options) {
|
||||
options = options || {};
|
||||
var viewOnly = options.viewOnly,
|
||||
cacheKey = "regInfo-" + apiClient.serverId();
|
||||
return viewOnly && (cacheKey += "-viewonly"), cacheKey
|
||||
}
|
||||
|
||||
function addAppInfoToConnectRequest(request) {
|
||||
request.headers = request.headers || {}, request.headers["X-Application"] = appName + "/" + appVersion
|
||||
}
|
||||
|
||||
function exchangePin(pinInfo) {
|
||||
if (!pinInfo) throw new Error("pinInfo cannot be null");
|
||||
var request = {
|
||||
type: "POST",
|
||||
url: getConnectUrl("pin/authenticate"),
|
||||
data: {
|
||||
deviceId: pinInfo.DeviceId,
|
||||
pin: pinInfo.Pin
|
||||
},
|
||||
dataType: "json"
|
||||
};
|
||||
return addAppInfoToConnectRequest(request), ajax(request)
|
||||
}
|
||||
console.log("Begin ConnectionManager constructor");
|
||||
var self = this;
|
||||
this._apiClients = [];
|
||||
var connectUser;
|
||||
self.connectUser = function() {
|
||||
return connectUser
|
||||
}, self._minServerVersion = "3.2.33", self.appVersion = function() {
|
||||
return appVersion
|
||||
}, self.appName = function() {
|
||||
return appName
|
||||
}, self.capabilities = function() {
|
||||
return capabilities
|
||||
}, self.deviceId = function() {
|
||||
return deviceId
|
||||
}, self.credentialProvider = function() {
|
||||
return credentialProvider
|
||||
}, self.connectUserId = function() {
|
||||
return credentialProvider.credentials().ConnectUserId
|
||||
}, self.connectToken = function() {
|
||||
return credentialProvider.credentials().ConnectAccessToken
|
||||
}, self.getServerInfo = function(id) {
|
||||
return credentialProvider.credentials().Servers.filter(function(s) {
|
||||
return s.Id === id
|
||||
})[0]
|
||||
}, self.getLastUsedServer = function() {
|
||||
var servers = credentialProvider.credentials().Servers;
|
||||
return servers.sort(function(a, b) {
|
||||
return (b.DateLastAccessed || 0) - (a.DateLastAccessed || 0)
|
||||
}), servers.length ? servers[0] : null
|
||||
}, self.addApiClient = function(apiClient) {
|
||||
self._apiClients.push(apiClient);
|
||||
var existingServers = credentialProvider.credentials().Servers.filter(function(s) {
|
||||
return stringEqualsIgnoreCase(s.ManualAddress, apiClient.serverAddress()) || stringEqualsIgnoreCase(s.LocalAddress, apiClient.serverAddress()) || stringEqualsIgnoreCase(s.RemoteAddress, apiClient.serverAddress())
|
||||
}),
|
||||
existingServer = existingServers.length ? existingServers[0] : apiClient.serverInfo();
|
||||
if (existingServer.DateLastAccessed = (new Date).getTime(), existingServer.LastConnectionMode = ConnectionMode.Manual, existingServer.ManualAddress = apiClient.serverAddress(), apiClient.manualAddressOnly && (existingServer.manualAddressOnly = !0), apiClient.serverInfo(existingServer), apiClient.onAuthenticated = function(instance, result) {
|
||||
return onAuthenticated(instance, result, {}, !0)
|
||||
}, !existingServers.length) {
|
||||
var credentials = credentialProvider.credentials();
|
||||
credentials.Servers = [existingServer], credentialProvider.credentials(credentials)
|
||||
}
|
||||
events.trigger(self, "apiclientcreated", [apiClient])
|
||||
}, self.clearData = function() {
|
||||
console.log("connection manager clearing data"), connectUser = null;
|
||||
var credentials = credentialProvider.credentials();
|
||||
credentials.ConnectAccessToken = null, credentials.ConnectUserId = null, credentials.Servers = [], credentialProvider.credentials(credentials)
|
||||
}, self._getOrAddApiClient = function(server, serverUrl) {
|
||||
var apiClient = self.getApiClient(server.Id);
|
||||
return apiClient || (apiClient = new apiClientFactory(serverUrl, appName, appVersion, deviceName, deviceId, devicePixelRatio), self._apiClients.push(apiClient), apiClient.serverInfo(server), apiClient.onAuthenticated = function(instance, result) {
|
||||
return onAuthenticated(instance, result, {}, !0)
|
||||
}, events.trigger(self, "apiclientcreated", [apiClient])), console.log("returning instance from getOrAddApiClient"), apiClient
|
||||
}, self.getOrCreateApiClient = function(serverId) {
|
||||
var credentials = credentialProvider.credentials(),
|
||||
servers = credentials.Servers.filter(function(s) {
|
||||
return stringEqualsIgnoreCase(s.Id, serverId)
|
||||
});
|
||||
if (!servers.length) throw new Error("Server not found: " + serverId);
|
||||
var server = servers[0];
|
||||
return self._getOrAddApiClient(server, getServerAddress(server, server.LastConnectionMode))
|
||||
}, self.user = function(apiClient) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
function onLocalUserDone(e) {
|
||||
var image = getImageUrl(localUser);
|
||||
resolve({
|
||||
localUser: localUser,
|
||||
name: connectUser ? connectUser.Name : localUser ? localUser.Name : null,
|
||||
imageUrl: image.url,
|
||||
supportsImageParams: image.supportsParams,
|
||||
connectUser: connectUser
|
||||
})
|
||||
}
|
||||
|
||||
function onEnsureConnectUserDone() {
|
||||
apiClient && apiClient.getCurrentUserId() ? apiClient.getCurrentUser().then(function(u) {
|
||||
localUser = u, onLocalUserDone()
|
||||
}, onLocalUserDone) : onLocalUserDone()
|
||||
}
|
||||
var localUser, credentials = credentialProvider.credentials();
|
||||
!credentials.ConnectUserId || !credentials.ConnectAccessToken || apiClient && apiClient.getCurrentUserId() ? onEnsureConnectUserDone() : ensureConnectUser(credentials).then(onEnsureConnectUserDone, onEnsureConnectUserDone)
|
||||
})
|
||||
}, self.logout = function() {
|
||||
console.log("begin connectionManager loguot");
|
||||
for (var promises = [], i = 0, length = self._apiClients.length; i < length; i++) {
|
||||
var apiClient = self._apiClients[i];
|
||||
apiClient.accessToken() && promises.push(logoutOfServer(apiClient))
|
||||
}
|
||||
return Promise.all(promises).then(function() {
|
||||
for (var credentials = credentialProvider.credentials(), servers = credentials.Servers.filter(function(u) {
|
||||
return "Guest" !== u.UserLinkType
|
||||
}), j = 0, numServers = servers.length; j < numServers; j++) {
|
||||
var server = servers[j];
|
||||
server.UserId = null, server.AccessToken = null, server.ExchangeToken = null
|
||||
}
|
||||
credentials.Servers = servers, credentials.ConnectAccessToken = null, credentials.ConnectUserId = null, credentialProvider.credentials(credentials), connectUser && (connectUser = null, events.trigger(self, "connectusersignedout"))
|
||||
})
|
||||
}, self.getSavedServers = function() {
|
||||
var credentials = credentialProvider.credentials(),
|
||||
servers = credentials.Servers.slice(0);
|
||||
return servers.sort(function(a, b) {
|
||||
return (b.DateLastAccessed || 0) - (a.DateLastAccessed || 0)
|
||||
}), servers
|
||||
}, self.getAvailableServers = function() {
|
||||
console.log("Begin getAvailableServers");
|
||||
var credentials = credentialProvider.credentials();
|
||||
return Promise.all([getConnectServers(credentials), findServers()]).then(function(responses) {
|
||||
var connectServers = responses[0],
|
||||
foundServers = responses[1],
|
||||
servers = credentials.Servers.slice(0);
|
||||
return mergeServers(credentialProvider, servers, foundServers), mergeServers(credentialProvider, servers, connectServers), servers = filterServers(servers, connectServers), servers.sort(function(a, b) {
|
||||
return (b.DateLastAccessed || 0) - (a.DateLastAccessed || 0)
|
||||
}), credentials.Servers = servers, credentialProvider.credentials(credentials), servers
|
||||
})
|
||||
}, self.connectToServers = function(servers, options) {
|
||||
console.log("Begin connectToServers, with " + servers.length + " servers");
|
||||
var firstServer = servers.length ? servers[0] : null;
|
||||
return firstServer ? self.connectToServer(firstServer, options).then(function(result) {
|
||||
return "Unavailable" === result.State && (result.State = "ServerSelection"), console.log("resolving connectToServers with result.State: " + result.State), result
|
||||
}) : Promise.resolve({
|
||||
Servers: servers,
|
||||
State: servers.length || self.connectUser() ? "ServerSelection" : "ConnectSignIn",
|
||||
ConnectUser: self.connectUser()
|
||||
})
|
||||
}, self.connectToServer = function(server, options) {
|
||||
return console.log("begin connectToServer"), new Promise(function(resolve, reject) {
|
||||
options = options || {}, tryReconnect(server).then(function(result) {
|
||||
var serverUrl = result.url,
|
||||
connectionMode = result.connectionMode;
|
||||
result = result.data, 1 === compareVersions(self.minServerVersion(), result.Version) ? (console.log("minServerVersion requirement not met. Server version: " + result.Version), resolve({
|
||||
State: "ServerUpdateNeeded",
|
||||
Servers: [server]
|
||||
})) : server.Id && result.Id !== server.Id ? (console.log("http request succeeded, but found a different server Id than what was expected"), resolveFailure(self, resolve)) : onSuccessfulConnection(server, result, connectionMode, serverUrl, options, resolve)
|
||||
}, function() {
|
||||
resolveFailure(self, resolve)
|
||||
})
|
||||
})
|
||||
}, self.connectToAddress = function(address, options) {
|
||||
function onFail() {
|
||||
return console.log("connectToAddress " + address + " failed"), Promise.resolve({
|
||||
State: "Unavailable",
|
||||
ConnectUser: instance.connectUser()
|
||||
})
|
||||
}
|
||||
if (!address) return Promise.reject();
|
||||
address = normalizeAddress(address);
|
||||
var instance = this,
|
||||
server = {
|
||||
ManualAddress: address,
|
||||
LastConnectionMode: ConnectionMode.Manual
|
||||
};
|
||||
return self.connectToServer(server, options).catch(onFail)
|
||||
}, self.loginToConnect = function(username, password) {
|
||||
return username && password ? ajax({
|
||||
type: "POST",
|
||||
url: "https://connect.emby.media/service/user/authenticate",
|
||||
data: {
|
||||
nameOrEmail: username,
|
||||
rawpw: password
|
||||
},
|
||||
dataType: "json",
|
||||
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
|
||||
headers: {
|
||||
"X-Application": appName + "/" + appVersion
|
||||
}
|
||||
}).then(function(result) {
|
||||
var credentials = credentialProvider.credentials();
|
||||
return credentials.ConnectAccessToken = result.AccessToken, credentials.ConnectUserId = result.User.Id, credentialProvider.credentials(credentials), onConnectUserSignIn(result.User), result
|
||||
}) : Promise.reject()
|
||||
}, self.signupForConnect = function(options) {
|
||||
var email = options.email,
|
||||
username = options.username,
|
||||
password = options.password,
|
||||
passwordConfirm = options.passwordConfirm;
|
||||
if (!email) return Promise.reject({
|
||||
errorCode: "invalidinput"
|
||||
});
|
||||
if (!username) return Promise.reject({
|
||||
errorCode: "invalidinput"
|
||||
});
|
||||
if (!password) return Promise.reject({
|
||||
errorCode: "invalidinput"
|
||||
});
|
||||
if (!passwordConfirm) return Promise.reject({
|
||||
errorCode: "passwordmatch"
|
||||
});
|
||||
if (password !== passwordConfirm) return Promise.reject({
|
||||
errorCode: "passwordmatch"
|
||||
});
|
||||
var data = {
|
||||
email: email,
|
||||
userName: username,
|
||||
rawpw: password
|
||||
};
|
||||
return options.grecaptcha && (data.grecaptcha = options.grecaptcha), ajax({
|
||||
type: "POST",
|
||||
url: "https://connect.emby.media/service/register",
|
||||
data: data,
|
||||
dataType: "json",
|
||||
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
|
||||
headers: {
|
||||
"X-Application": appName + "/" + appVersion,
|
||||
"X-CONNECT-TOKEN": "CONNECT-REGISTER"
|
||||
}
|
||||
}).catch(function(response) {
|
||||
try {
|
||||
return response.json()
|
||||
} catch (err) {
|
||||
throw err
|
||||
}
|
||||
}).then(function(result) {
|
||||
if (result && result.Status) return "SUCCESS" === result.Status ? Promise.resolve(result) : Promise.reject({
|
||||
errorCode: result.Status
|
||||
});
|
||||
Promise.reject()
|
||||
})
|
||||
}, self.getUserInvitations = function() {
|
||||
var connectToken = self.connectToken();
|
||||
if (!connectToken) throw new Error("null connectToken");
|
||||
if (!self.connectUserId()) throw new Error("null connectUserId");
|
||||
return ajax({
|
||||
type: "GET",
|
||||
url: "https://connect.emby.media/service/servers?userId=" + self.connectUserId() + "&status=Waiting",
|
||||
dataType: "json",
|
||||
headers: {
|
||||
"X-Connect-UserToken": connectToken,
|
||||
"X-Application": appName + "/" + appVersion
|
||||
}
|
||||
})
|
||||
}, self.deleteServer = function(serverId) {
|
||||
if (!serverId) throw new Error("null serverId");
|
||||
var server = credentialProvider.credentials().Servers.filter(function(s) {
|
||||
return s.Id === serverId
|
||||
});
|
||||
return server = server.length ? server[0] : null, new Promise(function(resolve, reject) {
|
||||
function onDone() {
|
||||
var credentials = credentialProvider.credentials();
|
||||
credentials.Servers = credentials.Servers.filter(function(s) {
|
||||
return s.Id !== serverId
|
||||
}), credentialProvider.credentials(credentials), resolve()
|
||||
}
|
||||
if (!server.ConnectServerId) return void onDone();
|
||||
var connectToken = self.connectToken(),
|
||||
connectUserId = self.connectUserId();
|
||||
if (!connectToken || !connectUserId) return void onDone();
|
||||
ajax({
|
||||
type: "DELETE",
|
||||
url: "https://connect.emby.media/service/serverAuthorizations?serverId=" + server.ConnectServerId + "&userId=" + connectUserId,
|
||||
headers: {
|
||||
"X-Connect-UserToken": connectToken,
|
||||
"X-Application": appName + "/" + appVersion
|
||||
}
|
||||
}).then(onDone, onDone)
|
||||
})
|
||||
}, self.rejectServer = function(serverId) {
|
||||
var connectToken = self.connectToken();
|
||||
if (!serverId) throw new Error("null serverId");
|
||||
if (!connectToken) throw new Error("null connectToken");
|
||||
if (!self.connectUserId()) throw new Error("null connectUserId");
|
||||
var url = "https://connect.emby.media/service/serverAuthorizations?serverId=" + serverId + "&userId=" + self.connectUserId();
|
||||
return fetch(url, {
|
||||
method: "DELETE",
|
||||
headers: {
|
||||
"X-Connect-UserToken": connectToken,
|
||||
"X-Application": appName + "/" + appVersion
|
||||
}
|
||||
})
|
||||
}, self.acceptServer = function(serverId) {
|
||||
var connectToken = self.connectToken();
|
||||
if (!serverId) throw new Error("null serverId");
|
||||
if (!connectToken) throw new Error("null connectToken");
|
||||
if (!self.connectUserId()) throw new Error("null connectUserId");
|
||||
return ajax({
|
||||
type: "GET",
|
||||
url: "https://connect.emby.media/service/ServerAuthorizations/accept?serverId=" + serverId + "&userId=" + self.connectUserId(),
|
||||
headers: {
|
||||
"X-Connect-UserToken": connectToken,
|
||||
"X-Application": appName + "/" + appVersion
|
||||
}
|
||||
})
|
||||
}, self.resetRegistrationInfo = function(apiClient) {
|
||||
var cacheKey = getCacheKey("themes", apiClient, {
|
||||
viewOnly: !0
|
||||
});
|
||||
appStorage.removeItem(cacheKey), cacheKey = getCacheKey("themes", apiClient, {
|
||||
viewOnly: !1
|
||||
}), appStorage.removeItem(cacheKey)
|
||||
}, self.getRegistrationInfo = function(feature, apiClient, options) {
|
||||
var cacheKey = getCacheKey(feature, apiClient, options);
|
||||
appStorage.setItem(cacheKey, JSON.stringify({
|
||||
lastValidDate: new Date().getTime(),
|
||||
deviceId: self.deviceId()
|
||||
}));
|
||||
return Promise.resolve();
|
||||
}, self.createPin = function() {
|
||||
var request = {
|
||||
type: "POST",
|
||||
url: getConnectUrl("pin"),
|
||||
data: {
|
||||
deviceId: deviceId
|
||||
},
|
||||
dataType: "json"
|
||||
};
|
||||
return addAppInfoToConnectRequest(request), ajax(request)
|
||||
}, self.getPinStatus = function(pinInfo) {
|
||||
if (!pinInfo) throw new Error("pinInfo cannot be null");
|
||||
var queryString = {
|
||||
deviceId: pinInfo.DeviceId,
|
||||
pin: pinInfo.Pin
|
||||
},
|
||||
request = {
|
||||
type: "GET",
|
||||
url: getConnectUrl("pin") + "?" + paramsToString(queryString),
|
||||
dataType: "json"
|
||||
};
|
||||
return addAppInfoToConnectRequest(request), ajax(request)
|
||||
}, self.exchangePin = function(pinInfo) {
|
||||
if (!pinInfo) throw new Error("pinInfo cannot be null");
|
||||
return exchangePin(pinInfo).then(function(result) {
|
||||
var credentials = credentialProvider.credentials();
|
||||
return credentials.ConnectAccessToken = result.AccessToken, credentials.ConnectUserId = result.UserId, credentialProvider.credentials(credentials), ensureConnectUser(credentials)
|
||||
})
|
||||
}
|
||||
};
|
||||
return ConnectionManager.prototype.connect = function(options) {
|
||||
console.log("Begin connect");
|
||||
var instance = this;
|
||||
return instance.getAvailableServers().then(function(servers) {
|
||||
return instance.connectToServers(servers, options)
|
||||
})
|
||||
}, ConnectionManager.prototype.isLoggedIntoConnect = function() {
|
||||
return !(!this.connectToken() || !this.connectUserId())
|
||||
}, ConnectionManager.prototype.getApiClients = function() {
|
||||
for (var servers = this.getSavedServers(), i = 0, length = servers.length; i < length; i++) {
|
||||
var server = servers[i];
|
||||
server.Id && this._getOrAddApiClient(server, getServerAddress(server, server.LastConnectionMode))
|
||||
}
|
||||
return this._apiClients
|
||||
}, ConnectionManager.prototype.getApiClient = function(item) {
|
||||
if (!item) throw new Error("item or serverId cannot be null");
|
||||
return item.ServerId && (item = item.ServerId), this._apiClients.filter(function(a) {
|
||||
var serverInfo = a.serverInfo();
|
||||
return !serverInfo || serverInfo.Id === item
|
||||
})[0]
|
||||
}, ConnectionManager.prototype.minServerVersion = function(val) {
|
||||
return val && (this._minServerVersion = val), this._minServerVersion
|
||||
}, ConnectionManager.prototype.handleMessageReceived = function(msg) {
|
||||
var serverId = msg.ServerId;
|
||||
if (serverId) {
|
||||
var apiClient = this.getApiClient(serverId);
|
||||
if (apiClient) {
|
||||
if ("string" == typeof msg.Data) try {
|
||||
msg.Data = JSON.parse(msg.Data)
|
||||
} catch (err) {}
|
||||
apiClient.handleMessageReceived(msg)
|
||||
}
|
||||
}
|
||||
}, ConnectionManager
|
||||
});
|
||||
@@ -1,22 +0,0 @@
|
||||
define(["serversync"], function(ServerSync) {
|
||||
"use strict";
|
||||
|
||||
function syncNext(connectionManager, servers, index, options, resolve, reject) {
|
||||
var length = servers.length;
|
||||
if (index >= length) return console.log("MultiServerSync.sync complete"), void resolve();
|
||||
var server = servers[index];
|
||||
console.log("Creating ServerSync to server: " + server.Id), (new ServerSync).sync(connectionManager, server, options).then(function() {
|
||||
console.log("ServerSync succeeded to server: " + server.Id), syncNext(connectionManager, servers, index + 1, options, resolve, reject)
|
||||
}, function(err) {
|
||||
console.log("ServerSync failed to server: " + server.Id + ". " + err), syncNext(connectionManager, servers, index + 1, options, resolve, reject)
|
||||
})
|
||||
}
|
||||
|
||||
function MultiServerSync() {}
|
||||
return MultiServerSync.prototype.sync = function(connectionManager, options) {
|
||||
return console.log("MultiServerSync.sync starting..."), new Promise(function(resolve, reject) {
|
||||
var servers = connectionManager.getSavedServers();
|
||||
syncNext(connectionManager, servers, 0, options, resolve, reject)
|
||||
})
|
||||
}, MultiServerSync
|
||||
});
|
||||
@@ -1,12 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>testing my-element</title>
|
||||
<script src="build/document-register-element.js"></script>
|
||||
<script src="test/my-element.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<my-element>
|
||||
some content
|
||||
</my-element>
|
||||
</body>
|
||||
@@ -1,246 +0,0 @@
|
||||
/*! (C) WebReflection Mit Style License */
|
||||
(function(e, t, n, r) {
|
||||
"use strict";
|
||||
|
||||
function rt(e, t) {
|
||||
for (var n = 0, r = e.length; n < r; n++) vt(e[n], t)
|
||||
}
|
||||
|
||||
function it(e) {
|
||||
for (var t = 0, n = e.length, r; t < n; t++) r = e[t], nt(r, b[ot(r)])
|
||||
}
|
||||
|
||||
function st(e) {
|
||||
return function(t) {
|
||||
j(t) && (vt(t, e), rt(t.querySelectorAll(w), e))
|
||||
}
|
||||
}
|
||||
|
||||
function ot(e) {
|
||||
var t = e.getAttribute("is"),
|
||||
n = e.nodeName.toUpperCase(),
|
||||
r = S.call(y, t ? v + t.toUpperCase() : d + n);
|
||||
return t && -1 < r && !ut(n, t) ? -1 : r
|
||||
}
|
||||
|
||||
function ut(e, t) {
|
||||
return -1 < w.indexOf(e + '[is="' + t + '"]')
|
||||
}
|
||||
|
||||
function at(e) {
|
||||
var t = e.currentTarget,
|
||||
n = e.attrChange,
|
||||
r = e.attrName,
|
||||
i = e.target;
|
||||
Q && (!i || i === t) && t.attributeChangedCallback && r !== "style" && e.prevValue !== e.newValue && t.attributeChangedCallback(r, n === e[a] ? null : e.prevValue, n === e[l] ? null : e.newValue)
|
||||
}
|
||||
|
||||
function ft(e) {
|
||||
var t = st(e);
|
||||
return function(e) {
|
||||
X.push(t, e.target)
|
||||
}
|
||||
}
|
||||
|
||||
function lt(e) {
|
||||
K && (K = !1, e.currentTarget.removeEventListener(h, lt)), rt((e.target || t).querySelectorAll(w), e.detail === o ? o : s), B && pt()
|
||||
}
|
||||
|
||||
function ct(e, t) {
|
||||
var n = this;
|
||||
q.call(n, e, t), G.call(n, {
|
||||
target: n
|
||||
})
|
||||
}
|
||||
|
||||
function ht(e, t) {
|
||||
D(e, t), et ? et.observe(e, z) : (J && (e.setAttribute = ct, e[i] = Z(e), e.addEventListener(p, G)), e.addEventListener(c, at)), e.createdCallback && Q && (e.created = !0, e.createdCallback(), e.created = !1)
|
||||
}
|
||||
|
||||
function pt() {
|
||||
for (var e, t = 0, n = F.length; t < n; t++) e = F[t], E.contains(e) || (n--, F.splice(t--, 1), vt(e, o))
|
||||
}
|
||||
|
||||
function dt(e) {
|
||||
throw new Error("A " + e + " type is already registered")
|
||||
}
|
||||
|
||||
function vt(e, t) {
|
||||
var n, r = ot(e); - 1 < r && (tt(e, b[r]), r = 0, t === s && !e[s] ? (e[o] = !1, e[s] = !0, r = 1, B && S.call(F, e) < 0 && F.push(e)) : t === o && !e[o] && (e[s] = !1, e[o] = !0, r = 1), r && (n = e[t + "Callback"]) && n.call(e))
|
||||
}
|
||||
if (r in t) return;
|
||||
var i = "__" + r + (Math.random() * 1e5 >> 0),
|
||||
s = "attached",
|
||||
o = "detached",
|
||||
u = "extends",
|
||||
a = "ADDITION",
|
||||
f = "MODIFICATION",
|
||||
l = "REMOVAL",
|
||||
c = "DOMAttrModified",
|
||||
h = "DOMContentLoaded",
|
||||
p = "DOMSubtreeModified",
|
||||
d = "<",
|
||||
v = "=",
|
||||
m = /^[A-Z][A-Z0-9]*(?:-[A-Z0-9]+)+$/,
|
||||
g = ["ANNOTATION-XML", "COLOR-PROFILE", "FONT-FACE", "FONT-FACE-SRC", "FONT-FACE-URI", "FONT-FACE-FORMAT", "FONT-FACE-NAME", "MISSING-GLYPH"],
|
||||
y = [],
|
||||
b = [],
|
||||
w = "",
|
||||
E = t.documentElement,
|
||||
S = y.indexOf || function(e) {
|
||||
for (var t = this.length; t-- && this[t] !== e;);
|
||||
return t
|
||||
},
|
||||
x = n.prototype,
|
||||
T = x.hasOwnProperty,
|
||||
N = x.isPrototypeOf,
|
||||
C = n.defineProperty,
|
||||
k = n.getOwnPropertyDescriptor,
|
||||
L = n.getOwnPropertyNames,
|
||||
A = n.getPrototypeOf,
|
||||
O = n.setPrototypeOf,
|
||||
M = !!n.__proto__,
|
||||
_ = n.create || function mt(e) {
|
||||
return e ? (mt.prototype = e, new mt) : this
|
||||
},
|
||||
D = O || (M ? function(e, t) {
|
||||
return e.__proto__ = t, e
|
||||
} : L && k ? function() {
|
||||
function e(e, t) {
|
||||
for (var n, r = L(t), i = 0, s = r.length; i < s; i++) n = r[i], T.call(e, n) || C(e, n, k(t, n))
|
||||
}
|
||||
return function(t, n) {
|
||||
do e(t, n); while ((n = A(n)) && !N.call(n, t));
|
||||
return t
|
||||
}
|
||||
}() : function(e, t) {
|
||||
for (var n in t) e[n] = t[n];
|
||||
return e
|
||||
}),
|
||||
P = e.MutationObserver || e.WebKitMutationObserver,
|
||||
H = (e.HTMLElement || e.Element || e.Node).prototype,
|
||||
B = !N.call(H, E),
|
||||
j = B ? function(e) {
|
||||
return e.nodeType === 1
|
||||
} : function(e) {
|
||||
return N.call(H, e)
|
||||
},
|
||||
F = B && [],
|
||||
I = H.cloneNode,
|
||||
q = H.setAttribute,
|
||||
R = H.removeAttribute,
|
||||
U = t.createElement,
|
||||
z = P && {
|
||||
attributes: !0,
|
||||
characterData: !0,
|
||||
attributeOldValue: !0
|
||||
},
|
||||
W = P || function(e) {
|
||||
J = !1, E.removeEventListener(c, W)
|
||||
},
|
||||
X, V = e.requestAnimationFrame || e.webkitRequestAnimationFrame || e.mozRequestAnimationFrame || e.msRequestAnimationFrame || function(e) {
|
||||
setTimeout(e, 10)
|
||||
},
|
||||
$ = !1,
|
||||
J = !0,
|
||||
K = !0,
|
||||
Q = !0,
|
||||
G, Y, Z, et, tt, nt;
|
||||
O || M ? (tt = function(e, t) {
|
||||
N.call(t, e) || ht(e, t)
|
||||
}, nt = ht) : (tt = function(e, t) {
|
||||
e[i] || (e[i] = n(!0), ht(e, t))
|
||||
}, nt = tt), B ? (J = !1, function() {
|
||||
var e = k(H, "addEventListener"),
|
||||
t = e.value,
|
||||
n = function(e) {
|
||||
var t = new CustomEvent(c, {
|
||||
bubbles: !0
|
||||
});
|
||||
t.attrName = e, t.prevValue = this.getAttribute(e), t.newValue = null, t[l] = t.attrChange = 2, R.call(this, e), this.dispatchEvent(t)
|
||||
},
|
||||
r = function(e, t) {
|
||||
var n = this.hasAttribute(e),
|
||||
r = n && this.getAttribute(e),
|
||||
i = new CustomEvent(c, {
|
||||
bubbles: !0
|
||||
});
|
||||
q.call(this, e, t), i.attrName = e, i.prevValue = n ? r : null, i.newValue = t, n ? i[f] = i.attrChange = 1 : i[a] = i.attrChange = 0, this.dispatchEvent(i)
|
||||
},
|
||||
s = function(e) {
|
||||
var t = e.currentTarget,
|
||||
n = t[i],
|
||||
r = e.propertyName,
|
||||
s;
|
||||
n.hasOwnProperty(r) && (n = n[r], s = new CustomEvent(c, {
|
||||
bubbles: !0
|
||||
}), s.attrName = n.name, s.prevValue = n.value || null, s.newValue = n.value = t[r] || null, s.prevValue == null ? s[a] = s.attrChange = 0 : s[f] = s.attrChange = 1, t.dispatchEvent(s))
|
||||
};
|
||||
e.value = function(e, o, u) {
|
||||
e === c && this.attributeChangedCallback && this.setAttribute !== r && (this[i] = {
|
||||
className: {
|
||||
name: "class",
|
||||
value: this.className
|
||||
}
|
||||
}, this.setAttribute = r, this.removeAttribute = n, t.call(this, "propertychange", s)), t.call(this, e, o, u)
|
||||
}, C(H, "addEventListener", e)
|
||||
}()) : P || (E.addEventListener(c, W), E.setAttribute(i, 1), E.removeAttribute(i), J && (G = function(e) {
|
||||
var t = this,
|
||||
n, r, s;
|
||||
if (t === e.target) {
|
||||
n = t[i], t[i] = r = Z(t);
|
||||
for (s in r) {
|
||||
if (!(s in n)) return Y(0, t, s, n[s], r[s], a);
|
||||
if (r[s] !== n[s]) return Y(1, t, s, n[s], r[s], f)
|
||||
}
|
||||
for (s in n)
|
||||
if (!(s in r)) return Y(2, t, s, n[s], r[s], l)
|
||||
}
|
||||
}, Y = function(e, t, n, r, i, s) {
|
||||
var o = {
|
||||
attrChange: e,
|
||||
currentTarget: t,
|
||||
attrName: n,
|
||||
prevValue: r,
|
||||
newValue: i
|
||||
};
|
||||
o[s] = e, at(o)
|
||||
}, Z = function(e) {
|
||||
for (var t, n, r = {}, i = e.attributes, s = 0, o = i.length; s < o; s++) t = i[s], n = t.name, n !== "setAttribute" && (r[n] = t.value);
|
||||
return r
|
||||
})), t[r] = function(n, r) {
|
||||
c = n.toUpperCase(), $ || ($ = !0, P ? (et = function(e, t) {
|
||||
function n(e, t) {
|
||||
for (var n = 0, r = e.length; n < r; t(e[n++]));
|
||||
}
|
||||
return new P(function(r) {
|
||||
for (var i, s, o, u = 0, a = r.length; u < a; u++) i = r[u], i.type === "childList" ? (n(i.addedNodes, e), n(i.removedNodes, t)) : (s = i.target, Q && s.attributeChangedCallback && i.attributeName !== "style" && (o = s.getAttribute(i.attributeName), o !== i.oldValue && s.attributeChangedCallback(i.attributeName, i.oldValue, o)))
|
||||
})
|
||||
}(st(s), st(o)), et.observe(t, {
|
||||
childList: !0,
|
||||
subtree: !0
|
||||
})) : (X = [], V(function E() {
|
||||
while (X.length) X.shift().call(null, X.shift());
|
||||
V(E)
|
||||
}), t.addEventListener("DOMNodeInserted", ft(s)), t.addEventListener("DOMNodeRemoved", ft(o))), t.addEventListener(h, lt), t.addEventListener("readystatechange", lt), t.createElement = function(e, n) {
|
||||
var r = U.apply(t, arguments),
|
||||
i = "" + e,
|
||||
s = S.call(y, (n ? v : d) + (n || i).toUpperCase()),
|
||||
o = -1 < s;
|
||||
return n && (r.setAttribute("is", n = n.toLowerCase()), o && (o = ut(i.toUpperCase(), n))), Q = !t.createElement.innerHTMLHelper, o && nt(r, b[s]), r
|
||||
}, H.cloneNode = function(e) {
|
||||
var t = I.call(this, !!e),
|
||||
n = ot(t);
|
||||
return -1 < n && nt(t, b[n]), e && it(t.querySelectorAll(w)), t
|
||||
}), -2 < S.call(y, v + c) + S.call(y, d + c) && dt(n);
|
||||
if (!m.test(c) || -1 < S.call(g, c)) throw new Error("The type " + n + " is invalid");
|
||||
var i = function() {
|
||||
return f ? t.createElement(l, c) : t.createElement(l)
|
||||
},
|
||||
a = r || x,
|
||||
f = T.call(a, u),
|
||||
l = f ? r[u].toUpperCase() : c,
|
||||
c, p;
|
||||
return f && -1 < S.call(y, d + l) && dt(l), p = y.push((f ? v : d) + c) - 1, w = w.concat(w.length ? "," : "", f ? l + '[is="' + n.toLowerCase() + '"]' : l), i.prototype = b[p] = T.call(a, "prototype") ? a.prototype : _(H), rt(t.querySelectorAll(w), s), i
|
||||
}
|
||||
})(window, document, Object, "registerElement");
|
||||
263
src/bower_components/fetch/fetch.js
vendored
@@ -1,263 +0,0 @@
|
||||
! function(self) {
|
||||
"use strict";
|
||||
|
||||
function normalizeName(name) {
|
||||
if ("string" != typeof name && (name = String(name)), /[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) throw new TypeError("Invalid character in header field name");
|
||||
return name.toLowerCase()
|
||||
}
|
||||
|
||||
function normalizeValue(value) {
|
||||
return "string" != typeof value && (value = String(value)), value
|
||||
}
|
||||
|
||||
function iteratorFor(items) {
|
||||
var iterator = {
|
||||
next: function() {
|
||||
var value = items.shift();
|
||||
return {
|
||||
done: void 0 === value,
|
||||
value: value
|
||||
}
|
||||
}
|
||||
};
|
||||
return support.iterable && (iterator[Symbol.iterator] = function() {
|
||||
return iterator
|
||||
}), iterator
|
||||
}
|
||||
|
||||
function Headers(headers) {
|
||||
this.map = {}, headers instanceof Headers ? headers.forEach(function(value, name) {
|
||||
this.append(name, value)
|
||||
}, this) : headers && Object.getOwnPropertyNames(headers).forEach(function(name) {
|
||||
this.append(name, headers[name])
|
||||
}, this)
|
||||
}
|
||||
|
||||
function consumed(body) {
|
||||
if (body.bodyUsed) return Promise.reject(new TypeError("Already read"));
|
||||
body.bodyUsed = !0
|
||||
}
|
||||
|
||||
function fileReaderReady(reader) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
reader.onload = function() {
|
||||
resolve(reader.result)
|
||||
}, reader.onerror = function() {
|
||||
reject(reader.error)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function readBlobAsArrayBuffer(blob) {
|
||||
var reader = new FileReader,
|
||||
promise = fileReaderReady(reader);
|
||||
return reader.readAsArrayBuffer(blob), promise
|
||||
}
|
||||
|
||||
function readBlobAsText(blob) {
|
||||
var reader = new FileReader,
|
||||
promise = fileReaderReady(reader);
|
||||
return reader.readAsText(blob), promise
|
||||
}
|
||||
|
||||
function readArrayBufferAsText(buf) {
|
||||
for (var view = new Uint8Array(buf), chars = new Array(view.length), i = 0; i < view.length; i++) chars[i] = String.fromCharCode(view[i]);
|
||||
return chars.join("")
|
||||
}
|
||||
|
||||
function bufferClone(buf) {
|
||||
if (buf.slice) return buf.slice(0);
|
||||
var view = new Uint8Array(buf.byteLength);
|
||||
return view.set(new Uint8Array(buf)), view.buffer
|
||||
}
|
||||
|
||||
function Body() {
|
||||
return this.bodyUsed = !1, this._initBody = function(body) {
|
||||
if (this._bodyInit = body, body)
|
||||
if ("string" == typeof body) this._bodyText = body;
|
||||
else if (support.blob && Blob.prototype.isPrototypeOf(body)) this._bodyBlob = body;
|
||||
else if (support.formData && FormData.prototype.isPrototypeOf(body)) this._bodyFormData = body;
|
||||
else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) this._bodyText = body.toString();
|
||||
else if (support.arrayBuffer && support.blob && isDataView(body)) this._bodyArrayBuffer = bufferClone(body.buffer), this._bodyInit = new Blob([this._bodyArrayBuffer]);
|
||||
else {
|
||||
if (!support.arrayBuffer || !ArrayBuffer.prototype.isPrototypeOf(body) && !isArrayBufferView(body)) throw new Error("unsupported BodyInit type");
|
||||
this._bodyArrayBuffer = bufferClone(body)
|
||||
} else this._bodyText = "";
|
||||
this.headers.get("content-type") || ("string" == typeof body ? this.headers.set("content-type", "text/plain;charset=UTF-8") : this._bodyBlob && this._bodyBlob.type ? this.headers.set("content-type", this._bodyBlob.type) : support.searchParams && URLSearchParams.prototype.isPrototypeOf(body) && this.headers.set("content-type", "application/x-www-form-urlencoded;charset=UTF-8"))
|
||||
}, support.blob && (this.blob = function() {
|
||||
var rejected = consumed(this);
|
||||
if (rejected) return rejected;
|
||||
if (this._bodyBlob) return Promise.resolve(this._bodyBlob);
|
||||
if (this._bodyArrayBuffer) return Promise.resolve(new Blob([this._bodyArrayBuffer]));
|
||||
if (this._bodyFormData) throw new Error("could not read FormData body as blob");
|
||||
return Promise.resolve(new Blob([this._bodyText]))
|
||||
}, this.arrayBuffer = function() {
|
||||
return this._bodyArrayBuffer ? consumed(this) || Promise.resolve(this._bodyArrayBuffer) : this.blob().then(readBlobAsArrayBuffer)
|
||||
}), this.text = function() {
|
||||
var rejected = consumed(this);
|
||||
if (rejected) return rejected;
|
||||
if (this._bodyBlob) return readBlobAsText(this._bodyBlob);
|
||||
if (this._bodyArrayBuffer) return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer));
|
||||
if (this._bodyFormData) throw new Error("could not read FormData body as text");
|
||||
return Promise.resolve(this._bodyText)
|
||||
}, support.formData && (this.formData = function() {
|
||||
return this.text().then(decode)
|
||||
}), this.json = function() {
|
||||
return this.text().then(JSON.parse)
|
||||
}, this
|
||||
}
|
||||
|
||||
function normalizeMethod(method) {
|
||||
var upcased = method.toUpperCase();
|
||||
return methods.indexOf(upcased) > -1 ? upcased : method
|
||||
}
|
||||
|
||||
function Request(input, options) {
|
||||
options = options || {};
|
||||
var body = options.body;
|
||||
if ("string" == typeof input) this.url = input;
|
||||
else {
|
||||
if (input.bodyUsed) throw new TypeError("Already read");
|
||||
this.url = input.url, this.credentials = input.credentials, options.headers || (this.headers = new Headers(input.headers)), this.method = input.method, this.mode = input.mode, body || null == input._bodyInit || (body = input._bodyInit, input.bodyUsed = !0)
|
||||
}
|
||||
if (this.credentials = options.credentials || this.credentials || "omit", !options.headers && this.headers || (this.headers = new Headers(options.headers)), this.method = normalizeMethod(options.method || this.method || "GET"), this.mode = options.mode || this.mode || null, this.referrer = null, ("GET" === this.method || "HEAD" === this.method) && body) throw new TypeError("Body not allowed for GET or HEAD requests");
|
||||
this._initBody(body)
|
||||
}
|
||||
|
||||
function decode(body) {
|
||||
var form = new FormData;
|
||||
return body.trim().split("&").forEach(function(bytes) {
|
||||
if (bytes) {
|
||||
var split = bytes.split("="),
|
||||
name = split.shift().replace(/\+/g, " "),
|
||||
value = split.join("=").replace(/\+/g, " ");
|
||||
form.append(decodeURIComponent(name), decodeURIComponent(value))
|
||||
}
|
||||
}), form
|
||||
}
|
||||
|
||||
function parseHeaders(rawHeaders) {
|
||||
var headers = new Headers;
|
||||
return rawHeaders.split("\r\n").forEach(function(line) {
|
||||
var parts = line.split(":"),
|
||||
key = parts.shift().trim();
|
||||
if (key) {
|
||||
var value = parts.join(":").trim();
|
||||
headers.append(key, value)
|
||||
}
|
||||
}), headers
|
||||
}
|
||||
|
||||
function Response(bodyInit, options) {
|
||||
options || (options = {}), this.type = "default", this.status = "status" in options ? options.status : 200, this.ok = this.status >= 200 && this.status < 300, this.statusText = "statusText" in options ? options.statusText : "OK", this.headers = new Headers(options.headers), this.url = options.url || "", this._initBody(bodyInit)
|
||||
}
|
||||
if (!self.fetch) {
|
||||
var support = {
|
||||
searchParams: "URLSearchParams" in self,
|
||||
iterable: "Symbol" in self && "iterator" in Symbol,
|
||||
blob: "FileReader" in self && "Blob" in self && function() {
|
||||
try {
|
||||
return new Blob, !0
|
||||
} catch (e) {
|
||||
return !1
|
||||
}
|
||||
}(),
|
||||
formData: "FormData" in self,
|
||||
arrayBuffer: "ArrayBuffer" in self
|
||||
};
|
||||
if (support.arrayBuffer) var viewClasses = ["[object Int8Array]", "[object Uint8Array]", "[object Uint8ClampedArray]", "[object Int16Array]", "[object Uint16Array]", "[object Int32Array]", "[object Uint32Array]", "[object Float32Array]", "[object Float64Array]"],
|
||||
isDataView = function(obj) {
|
||||
return obj && DataView.prototype.isPrototypeOf(obj)
|
||||
},
|
||||
isArrayBufferView = ArrayBuffer.isView || function(obj) {
|
||||
return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
|
||||
};
|
||||
Headers.prototype.append = function(name, value) {
|
||||
name = normalizeName(name), value = normalizeValue(value);
|
||||
var list = this.map[name];
|
||||
list || (list = [], this.map[name] = list), list.push(value)
|
||||
}, Headers.prototype.delete = function(name) {
|
||||
delete this.map[normalizeName(name)]
|
||||
}, Headers.prototype.get = function(name) {
|
||||
var values = this.map[normalizeName(name)];
|
||||
return values ? values[0] : null
|
||||
}, Headers.prototype.getAll = function(name) {
|
||||
return this.map[normalizeName(name)] || []
|
||||
}, Headers.prototype.has = function(name) {
|
||||
return this.map.hasOwnProperty(normalizeName(name))
|
||||
}, Headers.prototype.set = function(name, value) {
|
||||
this.map[normalizeName(name)] = [normalizeValue(value)]
|
||||
}, Headers.prototype.forEach = function(callback, thisArg) {
|
||||
Object.getOwnPropertyNames(this.map).forEach(function(name) {
|
||||
this.map[name].forEach(function(value) {
|
||||
callback.call(thisArg, value, name, this)
|
||||
}, this)
|
||||
}, this)
|
||||
}, Headers.prototype.keys = function() {
|
||||
var items = [];
|
||||
return this.forEach(function(value, name) {
|
||||
items.push(name)
|
||||
}), iteratorFor(items)
|
||||
}, Headers.prototype.values = function() {
|
||||
var items = [];
|
||||
return this.forEach(function(value) {
|
||||
items.push(value)
|
||||
}), iteratorFor(items)
|
||||
}, Headers.prototype.entries = function() {
|
||||
var items = [];
|
||||
return this.forEach(function(value, name) {
|
||||
items.push([name, value])
|
||||
}), iteratorFor(items)
|
||||
}, support.iterable && (Headers.prototype[Symbol.iterator] = Headers.prototype.entries);
|
||||
var methods = ["DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT"];
|
||||
Request.prototype.clone = function() {
|
||||
return new Request(this, {
|
||||
body: this._bodyInit
|
||||
})
|
||||
}, Body.call(Request.prototype), Body.call(Response.prototype), Response.prototype.clone = function() {
|
||||
return new Response(this._bodyInit, {
|
||||
status: this.status,
|
||||
statusText: this.statusText,
|
||||
headers: new Headers(this.headers),
|
||||
url: this.url
|
||||
})
|
||||
}, Response.error = function() {
|
||||
var response = new Response(null, {
|
||||
status: 0,
|
||||
statusText: ""
|
||||
});
|
||||
return response.type = "error", response
|
||||
};
|
||||
var redirectStatuses = [301, 302, 303, 307, 308];
|
||||
Response.redirect = function(url, status) {
|
||||
if (-1 === redirectStatuses.indexOf(status)) throw new RangeError("Invalid status code");
|
||||
return new Response(null, {
|
||||
status: status,
|
||||
headers: {
|
||||
location: url
|
||||
}
|
||||
})
|
||||
}, self.Headers = Headers, self.Request = Request, self.Response = Response, self.fetch = function(input, init) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
var request = new Request(input, init),
|
||||
xhr = new XMLHttpRequest;
|
||||
xhr.onload = function() {
|
||||
var options = {
|
||||
status: xhr.status,
|
||||
statusText: xhr.statusText,
|
||||
headers: parseHeaders(xhr.getAllResponseHeaders() || "")
|
||||
};
|
||||
options.url = "responseURL" in xhr ? xhr.responseURL : options.headers.get("X-Request-URL");
|
||||
var body = "response" in xhr ? xhr.response : xhr.responseText;
|
||||
resolve(new Response(body, options))
|
||||
}, xhr.onerror = function() {
|
||||
reject(new TypeError("Network request failed"))
|
||||
}, xhr.ontimeout = function() {
|
||||
reject(new TypeError("Network request failed"))
|
||||
}, xhr.open(request.method, request.url, !0), "include" === request.credentials && (xhr.withCredentials = !0), "responseType" in xhr && support.blob && (xhr.responseType = "blob"), request.headers.forEach(function(value, name) {
|
||||
xhr.setRequestHeader(name, value)
|
||||
}), xhr.send(void 0 === request._bodyInit ? null : request._bodyInit)
|
||||
})
|
||||
}, self.fetch.polyfill = !0
|
||||
}
|
||||
}("undefined" != typeof self ? self : this);
|
||||
8745
src/bower_components/hlsjs/dist/hls.min.js
vendored
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"folders":
|
||||
[
|
||||
{
|
||||
"path": ".",
|
||||
"folder_exclude_patterns": [
|
||||
".git",
|
||||
"node_modules",
|
||||
"dist",
|
||||
"lib"
|
||||
],
|
||||
"file_exclude_patterns": [
|
||||
".gitignore",
|
||||
"hls.js.sublime-project",
|
||||
"hls.js.sublime-workspace"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
853
src/bower_components/howlerjs/dist/howler.min.js
vendored
@@ -1,853 +0,0 @@
|
||||
/*! howler.js v2.0.14 | (c) 2013-2018, James Simpson of GoldFire Studios | MIT License | howlerjs.com */ ! function() {
|
||||
"use strict";
|
||||
var e = function() {
|
||||
this.init()
|
||||
};
|
||||
e.prototype = {
|
||||
init: function() {
|
||||
var e = this || n;
|
||||
return e._counter = 1e3, e._codecs = {}, e._howls = [], e._muted = !1, e._volume = 1, e._canPlayEvent = "canplaythrough", e._navigator = "undefined" != typeof window && window.navigator ? window.navigator : null, e.masterGain = null, e.noAudio = !1, e.usingWebAudio = !0, e.autoSuspend = !0, e.ctx = null, e.mobileAutoEnable = !0, e._setup(), e
|
||||
},
|
||||
volume: function(e) {
|
||||
var o = this || n;
|
||||
if (e = parseFloat(e), o.ctx || _(), void 0 !== e && e >= 0 && e <= 1) {
|
||||
if (o._volume = e, o._muted) return o;
|
||||
o.usingWebAudio && o.masterGain.gain.setValueAtTime(e, n.ctx.currentTime);
|
||||
for (var t = 0; t < o._howls.length; t++)
|
||||
if (!o._howls[t]._webAudio)
|
||||
for (var r = o._howls[t]._getSoundIds(), a = 0; a < r.length; a++) {
|
||||
var u = o._howls[t]._soundById(r[a]);
|
||||
u && u._node && (u._node.volume = u._volume * e)
|
||||
}
|
||||
return o
|
||||
}
|
||||
return o._volume
|
||||
},
|
||||
mute: function(e) {
|
||||
var o = this || n;
|
||||
o.ctx || _(), o._muted = e, o.usingWebAudio && o.masterGain.gain.setValueAtTime(e ? 0 : o._volume, n.ctx.currentTime);
|
||||
for (var t = 0; t < o._howls.length; t++)
|
||||
if (!o._howls[t]._webAudio)
|
||||
for (var r = o._howls[t]._getSoundIds(), a = 0; a < r.length; a++) {
|
||||
var u = o._howls[t]._soundById(r[a]);
|
||||
u && u._node && (u._node.muted = !!e || u._muted)
|
||||
}
|
||||
return o
|
||||
},
|
||||
unload: function() {
|
||||
for (var e = this || n, o = e._howls.length - 1; o >= 0; o--) e._howls[o].unload();
|
||||
return e.usingWebAudio && e.ctx && void 0 !== e.ctx.close && (e.ctx.close(), e.ctx = null, _()), e
|
||||
},
|
||||
codecs: function(e) {
|
||||
return (this || n)._codecs[e.replace(/^x-/, "")]
|
||||
},
|
||||
_setup: function() {
|
||||
var e = this || n;
|
||||
if (e.state = e.ctx ? e.ctx.state || "running" : "running", e._autoSuspend(), !e.usingWebAudio)
|
||||
if ("undefined" != typeof Audio) try {
|
||||
var o = new Audio;
|
||||
void 0 === o.oncanplaythrough && (e._canPlayEvent = "canplay")
|
||||
} catch (n) {
|
||||
e.noAudio = !0
|
||||
} else e.noAudio = !0;
|
||||
try {
|
||||
var o = new Audio;
|
||||
o.muted && (e.noAudio = !0)
|
||||
} catch (e) {}
|
||||
return e.noAudio || e._setupCodecs(), e
|
||||
},
|
||||
_setupCodecs: function() {
|
||||
var e = this || n,
|
||||
o = null;
|
||||
try {
|
||||
o = "undefined" != typeof Audio ? new Audio : null
|
||||
} catch (n) {
|
||||
return e
|
||||
}
|
||||
if (!o || "function" != typeof o.canPlayType) return e;
|
||||
var t = o.canPlayType("audio/mpeg;").replace(/^no$/, ""),
|
||||
r = e._navigator && e._navigator.userAgent.match(/OPR\/([0-6].)/g),
|
||||
a = r && parseInt(r[0].split("/")[1], 10) < 33;
|
||||
return e._codecs = {
|
||||
mp3: !(a || !t && !o.canPlayType("audio/mp3;").replace(/^no$/, "")),
|
||||
mpeg: !!t,
|
||||
opus: !!o.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/, ""),
|
||||
ogg: !!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, ""),
|
||||
oga: !!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, ""),
|
||||
wav: !!o.canPlayType('audio/wav; codecs="1"').replace(/^no$/, ""),
|
||||
aac: !!o.canPlayType("audio/aac;").replace(/^no$/, ""),
|
||||
caf: !!o.canPlayType("audio/x-caf;").replace(/^no$/, ""),
|
||||
m4a: !!(o.canPlayType("audio/x-m4a;") || o.canPlayType("audio/m4a;") || o.canPlayType("audio/aac;")).replace(/^no$/, ""),
|
||||
mp4: !!(o.canPlayType("audio/x-mp4;") || o.canPlayType("audio/mp4;") || o.canPlayType("audio/aac;")).replace(/^no$/, ""),
|
||||
weba: !!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/, ""),
|
||||
webm: !!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/, ""),
|
||||
dolby: !!o.canPlayType('audio/mp4; codecs="ec-3"').replace(/^no$/, ""),
|
||||
flac: !!(o.canPlayType("audio/x-flac;") || o.canPlayType("audio/flac;")).replace(/^no$/, "")
|
||||
}, e
|
||||
},
|
||||
_enableMobileAudio: function() {
|
||||
var e = this || n,
|
||||
o = /iPhone|iPad|iPod|Android|BlackBerry|BB10|Silk|Mobi|Chrome/i.test(e._navigator && e._navigator.userAgent);
|
||||
if (!e._mobileEnabled && e.ctx && o) {
|
||||
e._mobileEnabled = !1, e.mobileAutoEnable = !1, e._mobileUnloaded || 44100 === e.ctx.sampleRate || (e._mobileUnloaded = !0, e.unload()), e._scratchBuffer = e.ctx.createBuffer(1, 1, 22050);
|
||||
var t = function(o) {
|
||||
o.preventDefault(), n._autoResume();
|
||||
var r = e.ctx.createBufferSource();
|
||||
r.buffer = e._scratchBuffer, r.connect(e.ctx.destination), void 0 === r.start ? r.noteOn(0) : r.start(0), "function" == typeof e.ctx.resume && e.ctx.resume(), r.onended = function() {
|
||||
r.disconnect(0), e._mobileEnabled = !0, document.removeEventListener("touchstart", t, !0), document.removeEventListener("touchend", t, !0), document.removeEventListener("click", t, !0);
|
||||
for (var n = 0; n < e._howls.length; n++) e._howls[n]._emit("unlock")
|
||||
}
|
||||
};
|
||||
return document.addEventListener("touchstart", t, !0), document.addEventListener("touchend", t, !0), document.addEventListener("click", t, !0), e
|
||||
}
|
||||
},
|
||||
_autoSuspend: function() {
|
||||
var e = this;
|
||||
if (e.autoSuspend && e.ctx && void 0 !== e.ctx.suspend && n.usingWebAudio) {
|
||||
for (var o = 0; o < e._howls.length; o++)
|
||||
if (e._howls[o]._webAudio)
|
||||
for (var t = 0; t < e._howls[o]._sounds.length; t++)
|
||||
if (!e._howls[o]._sounds[t]._paused) return e;
|
||||
return e._suspendTimer && clearTimeout(e._suspendTimer), e._suspendTimer = setTimeout(function() {
|
||||
e.autoSuspend && (e._suspendTimer = null, e.state = "suspending", e.ctx.suspend().then(function() {
|
||||
e.state = "suspended", e._resumeAfterSuspend && (delete e._resumeAfterSuspend, e._autoResume())
|
||||
}))
|
||||
}, 3e4), e
|
||||
}
|
||||
},
|
||||
_autoResume: function() {
|
||||
var e = this;
|
||||
if (e.ctx && void 0 !== e.ctx.resume && n.usingWebAudio) return "running" === e.state && e._suspendTimer ? (clearTimeout(e._suspendTimer), e._suspendTimer = null) : "suspended" === e.state ? (e.ctx.resume().then(function() {
|
||||
e.state = "running";
|
||||
for (var n = 0; n < e._howls.length; n++) e._howls[n]._emit("resume")
|
||||
}), e._suspendTimer && (clearTimeout(e._suspendTimer), e._suspendTimer = null)) : "suspending" === e.state && (e._resumeAfterSuspend = !0), e
|
||||
}
|
||||
};
|
||||
var n = new e,
|
||||
o = function(e) {
|
||||
var n = this;
|
||||
if (!e.src || 0 === e.src.length) return void console.error("An array of source files must be passed with any new Howl.");
|
||||
n.init(e)
|
||||
};
|
||||
o.prototype = {
|
||||
init: function(e) {
|
||||
var o = this;
|
||||
return n.ctx || _(), o._autoplay = e.autoplay || !1, o._format = "string" != typeof e.format ? e.format : [e.format], o._html5 = e.html5 || !1, o._muted = e.mute || !1, o._loop = e.loop || !1, o._pool = e.pool || 5, o._preload = "boolean" != typeof e.preload || e.preload, o._rate = e.rate || 1, o._sprite = e.sprite || {}, o._src = "string" != typeof e.src ? e.src : [e.src], o._volume = void 0 !== e.volume ? e.volume : 1, o._xhrWithCredentials = e.xhrWithCredentials || !1, o._duration = 0, o._state = "unloaded", o._sounds = [], o._endTimers = {}, o._queue = [], o._playLock = !1, o._onend = e.onend ? [{
|
||||
fn: e.onend
|
||||
}] : [], o._onfade = e.onfade ? [{
|
||||
fn: e.onfade
|
||||
}] : [], o._onload = e.onload ? [{
|
||||
fn: e.onload
|
||||
}] : [], o._onloaderror = e.onloaderror ? [{
|
||||
fn: e.onloaderror
|
||||
}] : [], o._onplayerror = e.onplayerror ? [{
|
||||
fn: e.onplayerror
|
||||
}] : [], o._onpause = e.onpause ? [{
|
||||
fn: e.onpause
|
||||
}] : [], o._onplay = e.onplay ? [{
|
||||
fn: e.onplay
|
||||
}] : [], o._onstop = e.onstop ? [{
|
||||
fn: e.onstop
|
||||
}] : [], o._onmute = e.onmute ? [{
|
||||
fn: e.onmute
|
||||
}] : [], o._onvolume = e.onvolume ? [{
|
||||
fn: e.onvolume
|
||||
}] : [], o._onrate = e.onrate ? [{
|
||||
fn: e.onrate
|
||||
}] : [], o._onseek = e.onseek ? [{
|
||||
fn: e.onseek
|
||||
}] : [], o._onunlock = e.onunlock ? [{
|
||||
fn: e.onunlock
|
||||
}] : [], o._onresume = [], o._webAudio = n.usingWebAudio && !o._html5, void 0 !== n.ctx && n.ctx && n.mobileAutoEnable && n._enableMobileAudio(), n._howls.push(o), o._autoplay && o._queue.push({
|
||||
event: "play",
|
||||
action: function() {
|
||||
o.play()
|
||||
}
|
||||
}), o._preload && o.load(), o
|
||||
},
|
||||
load: function() {
|
||||
var e = this,
|
||||
o = null;
|
||||
if (n.noAudio) return void e._emit("loaderror", null, "No audio support.");
|
||||
"string" == typeof e._src && (e._src = [e._src]);
|
||||
for (var r = 0; r < e._src.length; r++) {
|
||||
var u, i;
|
||||
if (e._format && e._format[r]) u = e._format[r];
|
||||
else {
|
||||
if ("string" != typeof(i = e._src[r])) {
|
||||
e._emit("loaderror", null, "Non-string found in selected audio sources - ignoring.");
|
||||
continue
|
||||
}
|
||||
u = /^data:audio\/([^;,]+);/i.exec(i), u || (u = /\.([^.]+)$/.exec(i.split("?", 1)[0])), u && (u = u[1].toLowerCase())
|
||||
}
|
||||
if (u || console.warn('No file extension was found. Consider using the "format" property or specify an extension.'), u && n.codecs(u)) {
|
||||
o = e._src[r];
|
||||
break
|
||||
}
|
||||
}
|
||||
return o ? (e._src = o, e._state = "loading", "https:" === window.location.protocol && "http:" === o.slice(0, 5) && (e._html5 = !0, e._webAudio = !1), new t(e), e._webAudio && a(e), e) : void e._emit("loaderror", null, "No codec support for selected audio sources.")
|
||||
},
|
||||
play: function(e, o) {
|
||||
var t = this,
|
||||
r = null;
|
||||
if ("number" == typeof e) r = e, e = null;
|
||||
else {
|
||||
if ("string" == typeof e && "loaded" === t._state && !t._sprite[e]) return null;
|
||||
if (void 0 === e) {
|
||||
e = "__default";
|
||||
for (var a = 0, u = 0; u < t._sounds.length; u++) t._sounds[u]._paused && !t._sounds[u]._ended && (a++, r = t._sounds[u]._id);
|
||||
1 === a ? e = null : r = null
|
||||
}
|
||||
}
|
||||
var i = r ? t._soundById(r) : t._inactiveSound();
|
||||
if (!i) return null;
|
||||
if (r && !e && (e = i._sprite || "__default"), "loaded" !== t._state) {
|
||||
i._sprite = e, i._ended = !1;
|
||||
var d = i._id;
|
||||
return t._queue.push({
|
||||
event: "play",
|
||||
action: function() {
|
||||
t.play(d)
|
||||
}
|
||||
}), d
|
||||
}
|
||||
if (r && !i._paused) return o || t._loadQueue("play"), i._id;
|
||||
t._webAudio && n._autoResume();
|
||||
var _ = Math.max(0, i._seek > 0 ? i._seek : t._sprite[e][0] / 1e3),
|
||||
s = Math.max(0, (t._sprite[e][0] + t._sprite[e][1]) / 1e3 - _),
|
||||
l = 1e3 * s / Math.abs(i._rate);
|
||||
if (i._paused = !1, i._ended = !1, i._sprite = e, i._seek = _, i._start = t._sprite[e][0] / 1e3, i._stop = (t._sprite[e][0] + t._sprite[e][1]) / 1e3, i._loop = !(!i._loop && !t._sprite[e][2]), i._seek >= i._stop) return void t._ended(i);
|
||||
var c = i._node;
|
||||
if (t._webAudio) {
|
||||
var f = function() {
|
||||
t._refreshBuffer(i);
|
||||
var e = i._muted || t._muted ? 0 : i._volume;
|
||||
c.gain.setValueAtTime(e, n.ctx.currentTime), i._playStart = n.ctx.currentTime, void 0 === c.bufferSource.start ? i._loop ? c.bufferSource.noteGrainOn(0, _, 86400) : c.bufferSource.noteGrainOn(0, _, s) : i._loop ? c.bufferSource.start(0, _, 86400) : c.bufferSource.start(0, _, s), l !== 1 / 0 && (t._endTimers[i._id] = setTimeout(t._ended.bind(t, i), l)), o || setTimeout(function() {
|
||||
t._emit("play", i._id)
|
||||
}, 0)
|
||||
};
|
||||
"running" === n.state ? f() : (t.once("resume", f), t._clearTimer(i._id))
|
||||
} else {
|
||||
var p = function() {
|
||||
c.currentTime = _, c.muted = i._muted || t._muted || n._muted || c.muted, c.volume = i._volume * n.volume(), c.playbackRate = i._rate;
|
||||
try {
|
||||
var r = c.play();
|
||||
if ("undefined" != typeof Promise && (r instanceof Promise || "function" == typeof r.then) ? (t._playLock = !0, r.then(function() {
|
||||
t._playLock = !1, o || t._emit("play", i._id)
|
||||
}).catch(function() {
|
||||
t._playLock = !1, t._emit("playerror", i._id, "Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.")
|
||||
})) : o || t._emit("play", i._id), c.playbackRate = i._rate, c.paused) return void t._emit("playerror", i._id, "Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.");
|
||||
"__default" !== e || i._loop ? t._endTimers[i._id] = setTimeout(t._ended.bind(t, i), l) : (t._endTimers[i._id] = function() {
|
||||
t._ended(i), c.removeEventListener("ended", t._endTimers[i._id], !1)
|
||||
}, c.addEventListener("ended", t._endTimers[i._id], !1))
|
||||
} catch (e) {
|
||||
t._emit("playerror", i._id, e)
|
||||
}
|
||||
},
|
||||
m = window && window.ejecta || !c.readyState && n._navigator.isCocoonJS;
|
||||
if (c.readyState >= 3 || m) p();
|
||||
else {
|
||||
var v = function() {
|
||||
p(), c.removeEventListener(n._canPlayEvent, v, !1)
|
||||
};
|
||||
c.addEventListener(n._canPlayEvent, v, !1), t._clearTimer(i._id)
|
||||
}
|
||||
}
|
||||
return i._id
|
||||
},
|
||||
pause: function(e) {
|
||||
var n = this;
|
||||
if ("loaded" !== n._state || n._playLock) return n._queue.push({
|
||||
event: "pause",
|
||||
action: function() {
|
||||
n.pause(e)
|
||||
}
|
||||
}), n;
|
||||
for (var o = n._getSoundIds(e), t = 0; t < o.length; t++) {
|
||||
n._clearTimer(o[t]);
|
||||
var r = n._soundById(o[t]);
|
||||
if (r && !r._paused && (r._seek = n.seek(o[t]), r._rateSeek = 0, r._paused = !0, n._stopFade(o[t]), r._node))
|
||||
if (n._webAudio) {
|
||||
if (!r._node.bufferSource) continue;
|
||||
void 0 === r._node.bufferSource.stop ? r._node.bufferSource.noteOff(0) : r._node.bufferSource.stop(0), n._cleanBuffer(r._node)
|
||||
} else isNaN(r._node.duration) && r._node.duration !== 1 / 0 || r._node.pause();
|
||||
arguments[1] || n._emit("pause", r ? r._id : null)
|
||||
}
|
||||
return n
|
||||
},
|
||||
stop: function(e, n) {
|
||||
var o = this;
|
||||
if ("loaded" !== o._state || o._playLock) return o._queue.push({
|
||||
event: "stop",
|
||||
action: function() {
|
||||
o.stop(e)
|
||||
}
|
||||
}), o;
|
||||
for (var t = o._getSoundIds(e), r = 0; r < t.length; r++) {
|
||||
o._clearTimer(t[r]);
|
||||
var a = o._soundById(t[r]);
|
||||
a && (a._seek = a._start || 0, a._rateSeek = 0, a._paused = !0, a._ended = !0, o._stopFade(t[r]), a._node && (o._webAudio ? a._node.bufferSource && (void 0 === a._node.bufferSource.stop ? a._node.bufferSource.noteOff(0) : a._node.bufferSource.stop(0), o._cleanBuffer(a._node)) : isNaN(a._node.duration) && a._node.duration !== 1 / 0 || (a._node.currentTime = a._start || 0, a._node.pause())), n || o._emit("stop", a._id))
|
||||
}
|
||||
return o
|
||||
},
|
||||
mute: function(e, o) {
|
||||
var t = this;
|
||||
if ("loaded" !== t._state || t._playLock) return t._queue.push({
|
||||
event: "mute",
|
||||
action: function() {
|
||||
t.mute(e, o)
|
||||
}
|
||||
}), t;
|
||||
if (void 0 === o) {
|
||||
if ("boolean" != typeof e) return t._muted;
|
||||
t._muted = e
|
||||
}
|
||||
for (var r = t._getSoundIds(o), a = 0; a < r.length; a++) {
|
||||
var u = t._soundById(r[a]);
|
||||
u && (u._muted = e, u._interval && t._stopFade(u._id), t._webAudio && u._node ? u._node.gain.setValueAtTime(e ? 0 : u._volume, n.ctx.currentTime) : u._node && (u._node.muted = !!n._muted || e), t._emit("mute", u._id))
|
||||
}
|
||||
return t
|
||||
},
|
||||
volume: function() {
|
||||
var e, o, t = this,
|
||||
r = arguments;
|
||||
if (0 === r.length) return t._volume;
|
||||
if (1 === r.length || 2 === r.length && void 0 === r[1]) {
|
||||
t._getSoundIds().indexOf(r[0]) >= 0 ? o = parseInt(r[0], 10) : e = parseFloat(r[0])
|
||||
} else r.length >= 2 && (e = parseFloat(r[0]), o = parseInt(r[1], 10));
|
||||
var a;
|
||||
if (!(void 0 !== e && e >= 0 && e <= 1)) return a = o ? t._soundById(o) : t._sounds[0], a ? a._volume : 0;
|
||||
if ("loaded" !== t._state || t._playLock) return t._queue.push({
|
||||
event: "volume",
|
||||
action: function() {
|
||||
t.volume.apply(t, r)
|
||||
}
|
||||
}), t;
|
||||
void 0 === o && (t._volume = e), o = t._getSoundIds(o);
|
||||
for (var u = 0; u < o.length; u++)(a = t._soundById(o[u])) && (a._volume = e, r[2] || t._stopFade(o[u]), t._webAudio && a._node && !a._muted ? a._node.gain.setValueAtTime(e, n.ctx.currentTime) : a._node && !a._muted && (a._node.volume = e * n.volume()), t._emit("volume", a._id));
|
||||
return t
|
||||
},
|
||||
fade: function(e, o, t, r) {
|
||||
var a = this;
|
||||
if ("loaded" !== a._state || a._playLock) return a._queue.push({
|
||||
event: "fade",
|
||||
action: function() {
|
||||
a.fade(e, o, t, r)
|
||||
}
|
||||
}), a;
|
||||
a.volume(e, r);
|
||||
for (var u = a._getSoundIds(r), i = 0; i < u.length; i++) {
|
||||
var d = a._soundById(u[i]);
|
||||
if (d) {
|
||||
if (r || a._stopFade(u[i]), a._webAudio && !d._muted) {
|
||||
var _ = n.ctx.currentTime,
|
||||
s = _ + t / 1e3;
|
||||
d._volume = e, d._node.gain.setValueAtTime(e, _), d._node.gain.linearRampToValueAtTime(o, s)
|
||||
}
|
||||
a._startFadeInterval(d, e, o, t, u[i], void 0 === r)
|
||||
}
|
||||
}
|
||||
return a
|
||||
},
|
||||
_startFadeInterval: function(e, n, o, t, r, a) {
|
||||
var u = this,
|
||||
i = n,
|
||||
d = o - n,
|
||||
_ = Math.abs(d / .01),
|
||||
s = Math.max(4, _ > 0 ? t / _ : t),
|
||||
l = Date.now();
|
||||
e._fadeTo = o, e._interval = setInterval(function() {
|
||||
var r = (Date.now() - l) / t;
|
||||
l = Date.now(), i += d * r, i = Math.max(0, i), i = Math.min(1, i), i = Math.round(100 * i) / 100, u._webAudio ? e._volume = i : u.volume(i, e._id, !0), a && (u._volume = i), (o < n && i <= o || o > n && i >= o) && (clearInterval(e._interval), e._interval = null, e._fadeTo = null, u.volume(o, e._id), u._emit("fade", e._id))
|
||||
}, s)
|
||||
},
|
||||
_stopFade: function(e) {
|
||||
var o = this,
|
||||
t = o._soundById(e);
|
||||
return t && t._interval && (o._webAudio && t._node.gain.cancelScheduledValues(n.ctx.currentTime), clearInterval(t._interval), t._interval = null, o.volume(t._fadeTo, e), t._fadeTo = null, o._emit("fade", e)), o
|
||||
},
|
||||
loop: function() {
|
||||
var e, n, o, t = this,
|
||||
r = arguments;
|
||||
if (0 === r.length) return t._loop;
|
||||
if (1 === r.length) {
|
||||
if ("boolean" != typeof r[0]) return !!(o = t._soundById(parseInt(r[0], 10))) && o._loop;
|
||||
e = r[0], t._loop = e
|
||||
} else 2 === r.length && (e = r[0], n = parseInt(r[1], 10));
|
||||
for (var a = t._getSoundIds(n), u = 0; u < a.length; u++)(o = t._soundById(a[u])) && (o._loop = e, t._webAudio && o._node && o._node.bufferSource && (o._node.bufferSource.loop = e, e && (o._node.bufferSource.loopStart = o._start || 0, o._node.bufferSource.loopEnd = o._stop)));
|
||||
return t
|
||||
},
|
||||
rate: function() {
|
||||
var e, o, t = this,
|
||||
r = arguments;
|
||||
if (0 === r.length) o = t._sounds[0]._id;
|
||||
else if (1 === r.length) {
|
||||
var a = t._getSoundIds(),
|
||||
u = a.indexOf(r[0]);
|
||||
u >= 0 ? o = parseInt(r[0], 10) : e = parseFloat(r[0])
|
||||
} else 2 === r.length && (e = parseFloat(r[0]), o = parseInt(r[1], 10));
|
||||
var i;
|
||||
if ("number" != typeof e) return i = t._soundById(o), i ? i._rate : t._rate;
|
||||
if ("loaded" !== t._state || t._playLock) return t._queue.push({
|
||||
event: "rate",
|
||||
action: function() {
|
||||
t.rate.apply(t, r)
|
||||
}
|
||||
}), t;
|
||||
void 0 === o && (t._rate = e), o = t._getSoundIds(o);
|
||||
for (var d = 0; d < o.length; d++)
|
||||
if (i = t._soundById(o[d])) {
|
||||
i._rateSeek = t.seek(o[d]), i._playStart = t._webAudio ? n.ctx.currentTime : i._playStart, i._rate = e, t._webAudio && i._node && i._node.bufferSource ? i._node.bufferSource.playbackRate.setValueAtTime(e, n.ctx.currentTime) : i._node && (i._node.playbackRate = e);
|
||||
var _ = t.seek(o[d]),
|
||||
s = (t._sprite[i._sprite][0] + t._sprite[i._sprite][1]) / 1e3 - _,
|
||||
l = 1e3 * s / Math.abs(i._rate);
|
||||
!t._endTimers[o[d]] && i._paused || (t._clearTimer(o[d]), t._endTimers[o[d]] = setTimeout(t._ended.bind(t, i), l)), t._emit("rate", i._id)
|
||||
} return t
|
||||
},
|
||||
seek: function() {
|
||||
var e, o, t = this,
|
||||
r = arguments;
|
||||
if (0 === r.length) o = t._sounds[0]._id;
|
||||
else if (1 === r.length) {
|
||||
var a = t._getSoundIds(),
|
||||
u = a.indexOf(r[0]);
|
||||
u >= 0 ? o = parseInt(r[0], 10) : t._sounds.length && (o = t._sounds[0]._id, e = parseFloat(r[0]))
|
||||
} else 2 === r.length && (e = parseFloat(r[0]), o = parseInt(r[1], 10));
|
||||
if (void 0 === o) return t;
|
||||
if ("loaded" !== t._state || t._playLock) return t._queue.push({
|
||||
event: "seek",
|
||||
action: function() {
|
||||
t.seek.apply(t, r)
|
||||
}
|
||||
}), t;
|
||||
var i = t._soundById(o);
|
||||
if (i) {
|
||||
if (!("number" == typeof e && e >= 0)) {
|
||||
if (t._webAudio) {
|
||||
var d = t.playing(o) ? n.ctx.currentTime - i._playStart : 0,
|
||||
_ = i._rateSeek ? i._rateSeek - i._seek : 0;
|
||||
return i._seek + (_ + d * Math.abs(i._rate))
|
||||
}
|
||||
return i._node.currentTime
|
||||
}
|
||||
var s = t.playing(o);
|
||||
s && t.pause(o, !0), i._seek = e, i._ended = !1, t._clearTimer(o), !t._webAudio && i._node && (i._node.currentTime = e);
|
||||
var l = function() {
|
||||
t._emit("seek", o), s && t.play(o, !0)
|
||||
};
|
||||
if (s && !t._webAudio) {
|
||||
var c = function() {
|
||||
t._playLock ? setTimeout(c, 0) : l()
|
||||
};
|
||||
setTimeout(c, 0)
|
||||
} else l()
|
||||
}
|
||||
return t
|
||||
},
|
||||
playing: function(e) {
|
||||
var n = this;
|
||||
if ("number" == typeof e) {
|
||||
var o = n._soundById(e);
|
||||
return !!o && !o._paused
|
||||
}
|
||||
for (var t = 0; t < n._sounds.length; t++)
|
||||
if (!n._sounds[t]._paused) return !0;
|
||||
return !1
|
||||
},
|
||||
duration: function(e) {
|
||||
var n = this,
|
||||
o = n._duration,
|
||||
t = n._soundById(e);
|
||||
return t && (o = n._sprite[t._sprite][1] / 1e3), o
|
||||
},
|
||||
state: function() {
|
||||
return this._state
|
||||
},
|
||||
unload: function() {
|
||||
for (var e = this, o = e._sounds, t = 0; t < o.length; t++) {
|
||||
if (o[t]._paused || e.stop(o[t]._id), !e._webAudio) {
|
||||
/MSIE |Trident\//.test(n._navigator && n._navigator.userAgent) || (o[t]._node.src = "data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA"), o[t]._node.removeEventListener("error", o[t]._errorFn, !1), o[t]._node.removeEventListener(n._canPlayEvent, o[t]._loadFn, !1)
|
||||
}
|
||||
delete o[t]._node, e._clearTimer(o[t]._id)
|
||||
}
|
||||
var a = n._howls.indexOf(e);
|
||||
a >= 0 && n._howls.splice(a, 1);
|
||||
var u = !0;
|
||||
for (t = 0; t < n._howls.length; t++)
|
||||
if (n._howls[t]._src === e._src) {
|
||||
u = !1;
|
||||
break
|
||||
} return r && u && delete r[e._src], n.noAudio = !1, e._state = "unloaded", e._sounds = [], e = null, null
|
||||
},
|
||||
on: function(e, n, o, t) {
|
||||
var r = this,
|
||||
a = r["_on" + e];
|
||||
return "function" == typeof n && a.push(t ? {
|
||||
id: o,
|
||||
fn: n,
|
||||
once: t
|
||||
} : {
|
||||
id: o,
|
||||
fn: n
|
||||
}), r
|
||||
},
|
||||
off: function(e, n, o) {
|
||||
var t = this,
|
||||
r = t["_on" + e],
|
||||
a = 0;
|
||||
if ("number" == typeof n && (o = n, n = null), n || o)
|
||||
for (a = 0; a < r.length; a++) {
|
||||
var u = o === r[a].id;
|
||||
if (n === r[a].fn && u || !n && u) {
|
||||
r.splice(a, 1);
|
||||
break
|
||||
}
|
||||
} else if (e) t["_on" + e] = [];
|
||||
else {
|
||||
var i = Object.keys(t);
|
||||
for (a = 0; a < i.length; a++) 0 === i[a].indexOf("_on") && Array.isArray(t[i[a]]) && (t[i[a]] = [])
|
||||
} return t
|
||||
},
|
||||
once: function(e, n, o) {
|
||||
var t = this;
|
||||
return t.on(e, n, o, 1), t
|
||||
},
|
||||
_emit: function(e, n, o) {
|
||||
for (var t = this, r = t["_on" + e], a = r.length - 1; a >= 0; a--) r[a].id && r[a].id !== n && "load" !== e || (setTimeout(function(e) {
|
||||
e.call(this, n, o)
|
||||
}.bind(t, r[a].fn), 0), r[a].once && t.off(e, r[a].fn, r[a].id));
|
||||
return t._loadQueue(e), t
|
||||
},
|
||||
_loadQueue: function(e) {
|
||||
var n = this;
|
||||
if (n._queue.length > 0) {
|
||||
var o = n._queue[0];
|
||||
o.event === e && (n._queue.shift(), n._loadQueue()), e || o.action()
|
||||
}
|
||||
return n
|
||||
},
|
||||
_ended: function(e) {
|
||||
var o = this,
|
||||
t = e._sprite;
|
||||
if (!o._webAudio && e._node && !e._node.paused && !e._node.ended && e._node.currentTime < e._stop) return setTimeout(o._ended.bind(o, e), 100), o;
|
||||
var r = !(!e._loop && !o._sprite[t][2]);
|
||||
if (o._emit("end", e._id), !o._webAudio && r && o.stop(e._id, !0).play(e._id), o._webAudio && r) {
|
||||
o._emit("play", e._id), e._seek = e._start || 0, e._rateSeek = 0, e._playStart = n.ctx.currentTime;
|
||||
var a = 1e3 * (e._stop - e._start) / Math.abs(e._rate);
|
||||
o._endTimers[e._id] = setTimeout(o._ended.bind(o, e), a)
|
||||
}
|
||||
return o._webAudio && !r && (e._paused = !0, e._ended = !0, e._seek = e._start || 0, e._rateSeek = 0, o._clearTimer(e._id), o._cleanBuffer(e._node), n._autoSuspend()), o._webAudio || r || o.stop(e._id, !0), o
|
||||
},
|
||||
_clearTimer: function(e) {
|
||||
var n = this;
|
||||
if (n._endTimers[e]) {
|
||||
if ("function" != typeof n._endTimers[e]) clearTimeout(n._endTimers[e]);
|
||||
else {
|
||||
var o = n._soundById(e);
|
||||
o && o._node && o._node.removeEventListener("ended", n._endTimers[e], !1)
|
||||
}
|
||||
delete n._endTimers[e]
|
||||
}
|
||||
return n
|
||||
},
|
||||
_soundById: function(e) {
|
||||
for (var n = this, o = 0; o < n._sounds.length; o++)
|
||||
if (e === n._sounds[o]._id) return n._sounds[o];
|
||||
return null
|
||||
},
|
||||
_inactiveSound: function() {
|
||||
var e = this;
|
||||
e._drain();
|
||||
for (var n = 0; n < e._sounds.length; n++)
|
||||
if (e._sounds[n]._ended) return e._sounds[n].reset();
|
||||
return new t(e)
|
||||
},
|
||||
_drain: function() {
|
||||
var e = this,
|
||||
n = e._pool,
|
||||
o = 0,
|
||||
t = 0;
|
||||
if (!(e._sounds.length < n)) {
|
||||
for (t = 0; t < e._sounds.length; t++) e._sounds[t]._ended && o++;
|
||||
for (t = e._sounds.length - 1; t >= 0; t--) {
|
||||
if (o <= n) return;
|
||||
e._sounds[t]._ended && (e._webAudio && e._sounds[t]._node && e._sounds[t]._node.disconnect(0), e._sounds.splice(t, 1), o--)
|
||||
}
|
||||
}
|
||||
},
|
||||
_getSoundIds: function(e) {
|
||||
var n = this;
|
||||
if (void 0 === e) {
|
||||
for (var o = [], t = 0; t < n._sounds.length; t++) o.push(n._sounds[t]._id);
|
||||
return o
|
||||
}
|
||||
return [e]
|
||||
},
|
||||
_refreshBuffer: function(e) {
|
||||
var o = this;
|
||||
return e._node.bufferSource = n.ctx.createBufferSource(), e._node.bufferSource.buffer = r[o._src], e._panner ? e._node.bufferSource.connect(e._panner) : e._node.bufferSource.connect(e._node), e._node.bufferSource.loop = e._loop, e._loop && (e._node.bufferSource.loopStart = e._start || 0, e._node.bufferSource.loopEnd = e._stop || 0), e._node.bufferSource.playbackRate.setValueAtTime(e._rate, n.ctx.currentTime), o
|
||||
},
|
||||
_cleanBuffer: function(e) {
|
||||
var o = this;
|
||||
if (n._scratchBuffer && e.bufferSource) {
|
||||
e.bufferSource.onended = null, e.bufferSource.disconnect(0);
|
||||
try {
|
||||
e.bufferSource.buffer = n._scratchBuffer
|
||||
} catch (e) {}
|
||||
}
|
||||
return e.bufferSource = null, o
|
||||
}
|
||||
};
|
||||
var t = function(e) {
|
||||
this._parent = e, this.init()
|
||||
};
|
||||
t.prototype = {
|
||||
init: function() {
|
||||
var e = this,
|
||||
o = e._parent;
|
||||
return e._muted = o._muted, e._loop = o._loop, e._volume = o._volume, e._rate = o._rate, e._seek = 0, e._paused = !0, e._ended = !0, e._sprite = "__default", e._id = ++n._counter, o._sounds.push(e), e.create(), e
|
||||
},
|
||||
create: function() {
|
||||
var e = this,
|
||||
o = e._parent,
|
||||
t = n._muted || e._muted || e._parent._muted ? 0 : e._volume;
|
||||
return o._webAudio ? (e._node = void 0 === n.ctx.createGain ? n.ctx.createGainNode() : n.ctx.createGain(), e._node.gain.setValueAtTime(t, n.ctx.currentTime), e._node.paused = !0, e._node.connect(n.masterGain)) : (e._node = new Audio, e._errorFn = e._errorListener.bind(e), e._node.addEventListener("error", e._errorFn, !1), e._loadFn = e._loadListener.bind(e), e._node.addEventListener(n._canPlayEvent, e._loadFn, !1), e._node.src = o._src, e._node.preload = "auto", e._node.volume = t * n.volume(), e._node.load()), e
|
||||
},
|
||||
reset: function() {
|
||||
var e = this,
|
||||
o = e._parent;
|
||||
return e._muted = o._muted, e._loop = o._loop, e._volume = o._volume, e._rate = o._rate, e._seek = 0, e._rateSeek = 0, e._paused = !0, e._ended = !0, e._sprite = "__default", e._id = ++n._counter, e
|
||||
},
|
||||
_errorListener: function() {
|
||||
var e = this;
|
||||
e._parent._emit("loaderror", e._id, e._node.error ? e._node.error.code : 0), e._node.removeEventListener("error", e._errorFn, !1)
|
||||
},
|
||||
_loadListener: function() {
|
||||
var e = this,
|
||||
o = e._parent;
|
||||
o._duration = Math.ceil(10 * e._node.duration) / 10, 0 === Object.keys(o._sprite).length && (o._sprite = {
|
||||
__default: [0, 1e3 * o._duration]
|
||||
}), "loaded" !== o._state && (o._state = "loaded", o._emit("load"), o._loadQueue()), e._node.removeEventListener(n._canPlayEvent, e._loadFn, !1)
|
||||
}
|
||||
};
|
||||
var r = {},
|
||||
a = function(e) {
|
||||
var n = e._src;
|
||||
if (r[n]) return e._duration = r[n].duration, void d(e);
|
||||
if (/^data:[^;]+;base64,/.test(n)) {
|
||||
for (var o = atob(n.split(",")[1]), t = new Uint8Array(o.length), a = 0; a < o.length; ++a) t[a] = o.charCodeAt(a);
|
||||
i(t.buffer, e)
|
||||
} else {
|
||||
var _ = new XMLHttpRequest;
|
||||
_.open("GET", n, !0), _.withCredentials = e._xhrWithCredentials, _.responseType = "arraybuffer", _.onload = function() {
|
||||
var n = (_.status + "")[0];
|
||||
if ("0" !== n && "2" !== n && "3" !== n) return void e._emit("loaderror", null, "Failed loading audio file with status: " + _.status + ".");
|
||||
i(_.response, e)
|
||||
}, _.onerror = function() {
|
||||
e._webAudio && (e._html5 = !0, e._webAudio = !1, e._sounds = [], delete r[n], e.load())
|
||||
}, u(_)
|
||||
}
|
||||
},
|
||||
u = function(e) {
|
||||
try {
|
||||
e.send()
|
||||
} catch (n) {
|
||||
e.onerror()
|
||||
}
|
||||
},
|
||||
i = function(e, o) {
|
||||
var t = function(e) {
|
||||
e && o._sounds.length > 0 ? (r[o._src] = e, d(o, e)) : onError()
|
||||
},
|
||||
a = function() {
|
||||
o._emit("loaderror", null, "Decoding audio data failed.")
|
||||
};
|
||||
"undefined" != typeof Promise && 1 === n.ctx.decodeAudioData.length ? n.ctx.decodeAudioData(e).then(t).catch(a) : n.ctx.decodeAudioData(e, t, a)
|
||||
},
|
||||
d = function(e, n) {
|
||||
n && !e._duration && (e._duration = n.duration), 0 === Object.keys(e._sprite).length && (e._sprite = {
|
||||
__default: [0, 1e3 * e._duration]
|
||||
}), "loaded" !== e._state && (e._state = "loaded", e._emit("load"), e._loadQueue())
|
||||
},
|
||||
_ = function() {
|
||||
try {
|
||||
"undefined" != typeof AudioContext ? n.ctx = new AudioContext : "undefined" != typeof webkitAudioContext ? n.ctx = new webkitAudioContext : n.usingWebAudio = !1
|
||||
} catch (e) {
|
||||
n.usingWebAudio = !1
|
||||
}
|
||||
var e = /iP(hone|od|ad)/.test(n._navigator && n._navigator.platform),
|
||||
o = n._navigator && n._navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/),
|
||||
t = o ? parseInt(o[1], 10) : null;
|
||||
if (e && t && t < 9) {
|
||||
var r = /safari/.test(n._navigator && n._navigator.userAgent.toLowerCase());
|
||||
(n._navigator && n._navigator.standalone && !r || n._navigator && !n._navigator.standalone && !r) && (n.usingWebAudio = !1)
|
||||
}
|
||||
n.usingWebAudio && (n.masterGain = void 0 === n.ctx.createGain ? n.ctx.createGainNode() : n.ctx.createGain(), n.masterGain.gain.setValueAtTime(n._muted ? 0 : 1, n.ctx.currentTime), n.masterGain.connect(n.ctx.destination)), n._setup()
|
||||
};
|
||||
"function" == typeof define && define.amd && define([], function() {
|
||||
return {
|
||||
Howler: n,
|
||||
Howl: o
|
||||
}
|
||||
}), "undefined" != typeof exports && (exports.Howler = n, exports.Howl = o), "undefined" != typeof window ? (window.HowlerGlobal = e, window.Howler = n, window.Howl = o, window.Sound = t) : "undefined" != typeof global && (global.HowlerGlobal = e, global.Howler = n, global.Howl = o, global.Sound = t)
|
||||
}();
|
||||
/*! Spatial Plugin */
|
||||
! function() {
|
||||
"use strict";
|
||||
HowlerGlobal.prototype._pos = [0, 0, 0], HowlerGlobal.prototype._orientation = [0, 0, -1, 0, 1, 0], HowlerGlobal.prototype.stereo = function(e) {
|
||||
var n = this;
|
||||
if (!n.ctx || !n.ctx.listener) return n;
|
||||
for (var t = n._howls.length - 1; t >= 0; t--) n._howls[t].stereo(e);
|
||||
return n
|
||||
}, HowlerGlobal.prototype.pos = function(e, n, t) {
|
||||
var r = this;
|
||||
return r.ctx && r.ctx.listener ? (n = "number" != typeof n ? r._pos[1] : n, t = "number" != typeof t ? r._pos[2] : t, "number" != typeof e ? r._pos : (r._pos = [e, n, t], void 0 !== r.ctx.listener.positionX ? (r.ctx.listener.positionX.setTargetAtTime(r._pos[0], Howler.ctx.currentTime, .1), r.ctx.listener.positionY.setTargetAtTime(r._pos[1], Howler.ctx.currentTime, .1), r.ctx.listener.positionZ.setTargetAtTime(r._pos[2], Howler.ctx.currentTime, .1)) : r.ctx.listener.setPosition(r._pos[0], r._pos[1], r._pos[2]), r)) : r
|
||||
}, HowlerGlobal.prototype.orientation = function(e, n, t, r, o, i) {
|
||||
var a = this;
|
||||
if (!a.ctx || !a.ctx.listener) return a;
|
||||
var p = a._orientation;
|
||||
return n = "number" != typeof n ? p[1] : n, t = "number" != typeof t ? p[2] : t, r = "number" != typeof r ? p[3] : r, o = "number" != typeof o ? p[4] : o, i = "number" != typeof i ? p[5] : i, "number" != typeof e ? p : (a._orientation = [e, n, t, r, o, i], void 0 !== a.ctx.listener.forwardX ? (a.ctx.listener.forwardX.setTargetAtTime(e, Howler.ctx.currentTime, .1), a.ctx.listener.forwardY.setTargetAtTime(n, Howler.ctx.currentTime, .1), a.ctx.listener.forwardZ.setTargetAtTime(t, Howler.ctx.currentTime, .1), a.ctx.listener.upX.setTargetAtTime(e, Howler.ctx.currentTime, .1), a.ctx.listener.upY.setTargetAtTime(n, Howler.ctx.currentTime, .1), a.ctx.listener.upZ.setTargetAtTime(t, Howler.ctx.currentTime, .1)) : a.ctx.listener.setOrientation(e, n, t, r, o, i), a)
|
||||
}, Howl.prototype.init = function(e) {
|
||||
return function(n) {
|
||||
var t = this;
|
||||
return t._orientation = n.orientation || [1, 0, 0], t._stereo = n.stereo || null, t._pos = n.pos || null, t._pannerAttr = {
|
||||
coneInnerAngle: void 0 !== n.coneInnerAngle ? n.coneInnerAngle : 360,
|
||||
coneOuterAngle: void 0 !== n.coneOuterAngle ? n.coneOuterAngle : 360,
|
||||
coneOuterGain: void 0 !== n.coneOuterGain ? n.coneOuterGain : 0,
|
||||
distanceModel: void 0 !== n.distanceModel ? n.distanceModel : "inverse",
|
||||
maxDistance: void 0 !== n.maxDistance ? n.maxDistance : 1e4,
|
||||
panningModel: void 0 !== n.panningModel ? n.panningModel : "HRTF",
|
||||
refDistance: void 0 !== n.refDistance ? n.refDistance : 1,
|
||||
rolloffFactor: void 0 !== n.rolloffFactor ? n.rolloffFactor : 1
|
||||
}, t._onstereo = n.onstereo ? [{
|
||||
fn: n.onstereo
|
||||
}] : [], t._onpos = n.onpos ? [{
|
||||
fn: n.onpos
|
||||
}] : [], t._onorientation = n.onorientation ? [{
|
||||
fn: n.onorientation
|
||||
}] : [], e.call(this, n)
|
||||
}
|
||||
}(Howl.prototype.init), Howl.prototype.stereo = function(n, t) {
|
||||
var r = this;
|
||||
if (!r._webAudio) return r;
|
||||
if ("loaded" !== r._state) return r._queue.push({
|
||||
event: "stereo",
|
||||
action: function() {
|
||||
r.stereo(n, t)
|
||||
}
|
||||
}), r;
|
||||
var o = void 0 === Howler.ctx.createStereoPanner ? "spatial" : "stereo";
|
||||
if (void 0 === t) {
|
||||
if ("number" != typeof n) return r._stereo;
|
||||
r._stereo = n, r._pos = [n, 0, 0]
|
||||
}
|
||||
for (var i = r._getSoundIds(t), a = 0; a < i.length; a++) {
|
||||
var p = r._soundById(i[a]);
|
||||
if (p) {
|
||||
if ("number" != typeof n) return p._stereo;
|
||||
p._stereo = n, p._pos = [n, 0, 0], p._node && (p._pannerAttr.panningModel = "equalpower", p._panner && p._panner.pan || e(p, o), "spatial" === o ? void 0 !== p._panner.positionX ? (p._panner.positionX.setValueAtTime(n, Howler.ctx.currentTime), p._panner.positionY.setValueAtTime(0, Howler.ctx.currentTime), p._panner.positionZ.setValueAtTime(0, Howler.ctx.currentTime)) : p._panner.setPosition(n, 0, 0) : p._panner.pan.setValueAtTime(n, Howler.ctx.currentTime)), r._emit("stereo", p._id)
|
||||
}
|
||||
}
|
||||
return r
|
||||
}, Howl.prototype.pos = function(n, t, r, o) {
|
||||
var i = this;
|
||||
if (!i._webAudio) return i;
|
||||
if ("loaded" !== i._state) return i._queue.push({
|
||||
event: "pos",
|
||||
action: function() {
|
||||
i.pos(n, t, r, o)
|
||||
}
|
||||
}), i;
|
||||
if (t = "number" != typeof t ? 0 : t, r = "number" != typeof r ? -.5 : r, void 0 === o) {
|
||||
if ("number" != typeof n) return i._pos;
|
||||
i._pos = [n, t, r]
|
||||
}
|
||||
for (var a = i._getSoundIds(o), p = 0; p < a.length; p++) {
|
||||
var s = i._soundById(a[p]);
|
||||
if (s) {
|
||||
if ("number" != typeof n) return s._pos;
|
||||
s._pos = [n, t, r], s._node && (s._panner && !s._panner.pan || e(s, "spatial"), void 0 !== s._panner.positionX ? (s._panner.positionX.setValueAtTime(n, Howler.ctx.currentTime), s._panner.positionY.setValueAtTime(t, Howler.ctx.currentTime), s._panner.positionZ.setValueAtTime(r, Howler.ctx.currentTime)) : s._panner.setOrientation(n, t, r)), i._emit("pos", s._id)
|
||||
}
|
||||
}
|
||||
return i
|
||||
}, Howl.prototype.orientation = function(n, t, r, o) {
|
||||
var i = this;
|
||||
if (!i._webAudio) return i;
|
||||
if ("loaded" !== i._state) return i._queue.push({
|
||||
event: "orientation",
|
||||
action: function() {
|
||||
i.orientation(n, t, r, o)
|
||||
}
|
||||
}), i;
|
||||
if (t = "number" != typeof t ? i._orientation[1] : t, r = "number" != typeof r ? i._orientation[2] : r, void 0 === o) {
|
||||
if ("number" != typeof n) return i._orientation;
|
||||
i._orientation = [n, t, r]
|
||||
}
|
||||
for (var a = i._getSoundIds(o), p = 0; p < a.length; p++) {
|
||||
var s = i._soundById(a[p]);
|
||||
if (s) {
|
||||
if ("number" != typeof n) return s._orientation;
|
||||
s._orientation = [n, t, r], s._node && (s._panner || (s._pos || (s._pos = i._pos || [0, 0, -.5]), e(s, "spatial")), void 0 !== s._panner.orientationX ? (s._panner.orientationX.setValueAtTime(n, Howler.ctx.currentTime), s._panner.orientationY.setValueAtTime(t, Howler.ctx.currentTime), s._panner.orientationZ.setValueAtTime(r, Howler.ctx.currentTime)) : s._panner.setOrientation(n, t, r)), i._emit("orientation", s._id)
|
||||
}
|
||||
}
|
||||
return i
|
||||
}, Howl.prototype.pannerAttr = function() {
|
||||
var n, t, r, o = this,
|
||||
i = arguments;
|
||||
if (!o._webAudio) return o;
|
||||
if (0 === i.length) return o._pannerAttr;
|
||||
if (1 === i.length) {
|
||||
if ("object" != typeof i[0]) return r = o._soundById(parseInt(i[0], 10)), r ? r._pannerAttr : o._pannerAttr;
|
||||
n = i[0], void 0 === t && (n.pannerAttr || (n.pannerAttr = {
|
||||
coneInnerAngle: n.coneInnerAngle,
|
||||
coneOuterAngle: n.coneOuterAngle,
|
||||
coneOuterGain: n.coneOuterGain,
|
||||
distanceModel: n.distanceModel,
|
||||
maxDistance: n.maxDistance,
|
||||
refDistance: n.refDistance,
|
||||
rolloffFactor: n.rolloffFactor,
|
||||
panningModel: n.panningModel
|
||||
}), o._pannerAttr = {
|
||||
coneInnerAngle: void 0 !== n.pannerAttr.coneInnerAngle ? n.pannerAttr.coneInnerAngle : o._coneInnerAngle,
|
||||
coneOuterAngle: void 0 !== n.pannerAttr.coneOuterAngle ? n.pannerAttr.coneOuterAngle : o._coneOuterAngle,
|
||||
coneOuterGain: void 0 !== n.pannerAttr.coneOuterGain ? n.pannerAttr.coneOuterGain : o._coneOuterGain,
|
||||
distanceModel: void 0 !== n.pannerAttr.distanceModel ? n.pannerAttr.distanceModel : o._distanceModel,
|
||||
maxDistance: void 0 !== n.pannerAttr.maxDistance ? n.pannerAttr.maxDistance : o._maxDistance,
|
||||
refDistance: void 0 !== n.pannerAttr.refDistance ? n.pannerAttr.refDistance : o._refDistance,
|
||||
rolloffFactor: void 0 !== n.pannerAttr.rolloffFactor ? n.pannerAttr.rolloffFactor : o._rolloffFactor,
|
||||
panningModel: void 0 !== n.pannerAttr.panningModel ? n.pannerAttr.panningModel : o._panningModel
|
||||
})
|
||||
} else 2 === i.length && (n = i[0], t = parseInt(i[1], 10));
|
||||
for (var a = o._getSoundIds(t), p = 0; p < a.length; p++)
|
||||
if (r = o._soundById(a[p])) {
|
||||
var s = r._pannerAttr;
|
||||
s = {
|
||||
coneInnerAngle: void 0 !== n.coneInnerAngle ? n.coneInnerAngle : s.coneInnerAngle,
|
||||
coneOuterAngle: void 0 !== n.coneOuterAngle ? n.coneOuterAngle : s.coneOuterAngle,
|
||||
coneOuterGain: void 0 !== n.coneOuterGain ? n.coneOuterGain : s.coneOuterGain,
|
||||
distanceModel: void 0 !== n.distanceModel ? n.distanceModel : s.distanceModel,
|
||||
maxDistance: void 0 !== n.maxDistance ? n.maxDistance : s.maxDistance,
|
||||
refDistance: void 0 !== n.refDistance ? n.refDistance : s.refDistance,
|
||||
rolloffFactor: void 0 !== n.rolloffFactor ? n.rolloffFactor : s.rolloffFactor,
|
||||
panningModel: void 0 !== n.panningModel ? n.panningModel : s.panningModel
|
||||
};
|
||||
var c = r._panner;
|
||||
c ? (c.coneInnerAngle = s.coneInnerAngle, c.coneOuterAngle = s.coneOuterAngle, c.coneOuterGain = s.coneOuterGain, c.distanceModel = s.distanceModel, c.maxDistance = s.maxDistance, c.refDistance = s.refDistance, c.rolloffFactor = s.rolloffFactor, c.panningModel = s.panningModel) : (r._pos || (r._pos = o._pos || [0, 0, -.5]), e(r, "spatial"))
|
||||
} return o
|
||||
}, Sound.prototype.init = function(e) {
|
||||
return function() {
|
||||
var n = this,
|
||||
t = n._parent;
|
||||
n._orientation = t._orientation, n._stereo = t._stereo, n._pos = t._pos, n._pannerAttr = t._pannerAttr, e.call(this), n._stereo ? t.stereo(n._stereo) : n._pos && t.pos(n._pos[0], n._pos[1], n._pos[2], n._id)
|
||||
}
|
||||
}(Sound.prototype.init), Sound.prototype.reset = function(e) {
|
||||
return function() {
|
||||
var n = this,
|
||||
t = n._parent;
|
||||
return n._orientation = t._orientation, n._stereo = t._stereo, n._pos = t._pos, n._pannerAttr = t._pannerAttr, n._stereo ? t.stereo(n._stereo) : n._pos ? t.pos(n._pos[0], n._pos[1], n._pos[2], n._id) : n._panner && (n._panner.disconnect(0), n._panner = void 0, t._refreshBuffer(n)), e.call(this)
|
||||
}
|
||||
}(Sound.prototype.reset);
|
||||
var e = function(e, n) {
|
||||
n = n || "spatial", "spatial" === n ? (e._panner = Howler.ctx.createPanner(), e._panner.coneInnerAngle = e._pannerAttr.coneInnerAngle, e._panner.coneOuterAngle = e._pannerAttr.coneOuterAngle, e._panner.coneOuterGain = e._pannerAttr.coneOuterGain, e._panner.distanceModel = e._pannerAttr.distanceModel, e._panner.maxDistance = e._pannerAttr.maxDistance, e._panner.refDistance = e._pannerAttr.refDistance, e._panner.rolloffFactor = e._pannerAttr.rolloffFactor, e._panner.panningModel = e._pannerAttr.panningModel, void 0 !== e._panner.positionX ? (e._panner.positionX.setValueAtTime(e._pos[0], Howler.ctx.currentTime), e._panner.positionY.setValueAtTime(e._pos[1], Howler.ctx.currentTime), e._panner.positionZ.setValueAtTime(e._pos[2], Howler.ctx.currentTime)) : e._panner.setPosition(e._pos[0], e._pos[1], e._pos[2]), void 0 !== e._panner.orientationX ? (e._panner.orientationX.setValueAtTime(e._orientation[0], Howler.ctx.currentTime), e._panner.orientationY.setValueAtTime(e._orientation[1], Howler.ctx.currentTime), e._panner.orientationZ.setValueAtTime(e._orientation[2], Howler.ctx.currentTime)) : e._panner.setOrientation(e._orientation[0], e._orientation[1], e._orientation[2])) : (e._panner = Howler.ctx.createStereoPanner(), e._panner.pan.setValueAtTime(e._stereo, Howler.ctx.currentTime)), e._panner.connect(e._node), e._paused || e._parent.pause(e._id, !0).play(e._id, !0)
|
||||
}
|
||||
}();
|
||||
2607
src/bower_components/jquery/dist/jquery.slim.min.js
vendored
91
src/bower_components/libjass/libjass.css
vendored
@@ -1,91 +0,0 @@
|
||||
.libjass-wrapper {
|
||||
position: relative;
|
||||
overflow: hidden
|
||||
}
|
||||
|
||||
.libjass-subs,
|
||||
.libjass-subs .an {
|
||||
position: absolute
|
||||
}
|
||||
|
||||
.libjass-subs {
|
||||
overflow: hidden;
|
||||
line-height: 0
|
||||
}
|
||||
|
||||
.libjass-subs,
|
||||
.libjass-subs * {
|
||||
pointer-events: none;
|
||||
-webkit-animation-fill-mode: both !important;
|
||||
animation-fill-mode: both !important
|
||||
}
|
||||
|
||||
.libjass-subs.paused * {
|
||||
-webkit-animation-play-state: paused !important;
|
||||
animation-play-state: paused !important
|
||||
}
|
||||
|
||||
.libjass-subs .an1,
|
||||
.libjass-subs .an2,
|
||||
.libjass-subs .an3 {
|
||||
bottom: 0
|
||||
}
|
||||
|
||||
.libjass-subs .an4,
|
||||
.libjass-subs .an5,
|
||||
.libjass-subs .an6 {
|
||||
display: table;
|
||||
width: 100%;
|
||||
height: 100%
|
||||
}
|
||||
|
||||
.libjass-subs .an4>*,
|
||||
.libjass-subs .an5>*,
|
||||
.libjass-subs .an6>* {
|
||||
display: table-cell;
|
||||
vertical-align: middle
|
||||
}
|
||||
|
||||
.libjass-subs .an7,
|
||||
.libjass-subs .an8,
|
||||
.libjass-subs .an9 {
|
||||
top: 0
|
||||
}
|
||||
|
||||
.libjass-subs .an1,
|
||||
.libjass-subs .an4,
|
||||
.libjass-subs .an7 {
|
||||
text-align: left
|
||||
}
|
||||
|
||||
.libjass-subs .an2,
|
||||
.libjass-subs .an5,
|
||||
.libjass-subs .an8 {
|
||||
text-align: center
|
||||
}
|
||||
|
||||
.libjass-subs .an3,
|
||||
.libjass-subs .an6,
|
||||
.libjass-subs .an9 {
|
||||
text-align: right
|
||||
}
|
||||
|
||||
.libjass-subs div[data-dialogue-id]>span {
|
||||
-webkit-perspective-origin: center;
|
||||
perspective-origin: center;
|
||||
-webkit-perspective: 400px;
|
||||
perspective: 400px
|
||||
}
|
||||
|
||||
.libjass-font-measure {
|
||||
position: absolute;
|
||||
visibility: hidden;
|
||||
border: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
line-height: normal
|
||||
}
|
||||
|
||||
.libjass-filters {
|
||||
display: block
|
||||
}
|
||||
4185
src/bower_components/libjass/libjass.min.js
vendored
607
src/bower_components/requirejs/require.js
vendored
@@ -1,607 +0,0 @@
|
||||
var requirejs, require, define;
|
||||
! function(global, setTimeout) {
|
||||
function commentReplace(match, singlePrefix) {
|
||||
return singlePrefix || ""
|
||||
}
|
||||
|
||||
function isFunction(it) {
|
||||
return "[object Function]" === ostring.call(it)
|
||||
}
|
||||
|
||||
function isArray(it) {
|
||||
return "[object Array]" === ostring.call(it)
|
||||
}
|
||||
|
||||
function each(ary, func) {
|
||||
if (ary) {
|
||||
var i;
|
||||
for (i = 0; i < ary.length && (!ary[i] || !func(ary[i], i, ary)); i += 1);
|
||||
}
|
||||
}
|
||||
|
||||
function eachReverse(ary, func) {
|
||||
if (ary) {
|
||||
var i;
|
||||
for (i = ary.length - 1; i > -1 && (!ary[i] || !func(ary[i], i, ary)); i -= 1);
|
||||
}
|
||||
}
|
||||
|
||||
function hasProp(obj, prop) {
|
||||
return hasOwn.call(obj, prop)
|
||||
}
|
||||
|
||||
function getOwn(obj, prop) {
|
||||
return hasProp(obj, prop) && obj[prop]
|
||||
}
|
||||
|
||||
function eachProp(obj, func) {
|
||||
var prop;
|
||||
for (prop in obj)
|
||||
if (hasProp(obj, prop) && func(obj[prop], prop)) break
|
||||
}
|
||||
|
||||
function mixin(target, source, force, deepStringMixin) {
|
||||
return source && eachProp(source, function(value, prop) {
|
||||
!force && hasProp(target, prop) || (!deepStringMixin || "object" != typeof value || !value || isArray(value) || isFunction(value) || value instanceof RegExp ? target[prop] = value : (target[prop] || (target[prop] = {}), mixin(target[prop], value, force, deepStringMixin)))
|
||||
}), target
|
||||
}
|
||||
|
||||
function bind(obj, fn) {
|
||||
return function() {
|
||||
return fn.apply(obj, arguments)
|
||||
}
|
||||
}
|
||||
|
||||
function scripts() {
|
||||
return document.getElementsByTagName("script")
|
||||
}
|
||||
|
||||
function defaultOnError(err) {
|
||||
throw err
|
||||
}
|
||||
|
||||
function getGlobal(value) {
|
||||
if (!value) return value;
|
||||
var g = global;
|
||||
return each(value.split("."), function(part) {
|
||||
g = g[part]
|
||||
}), g
|
||||
}
|
||||
|
||||
function makeError(id, msg, err, requireModules) {
|
||||
var e = new Error(msg + "\nhttp://requirejs.org/docs/errors.html#" + id);
|
||||
return e.requireType = id, e.requireModules = requireModules, err && (e.originalError = err), e
|
||||
}
|
||||
|
||||
function newContext(contextName) {
|
||||
function trimDots(ary) {
|
||||
var i, part;
|
||||
for (i = 0; i < ary.length; i++)
|
||||
if ("." === (part = ary[i])) ary.splice(i, 1), i -= 1;
|
||||
else if (".." === part) {
|
||||
if (0 === i || 1 === i && ".." === ary[2] || ".." === ary[i - 1]) continue;
|
||||
i > 0 && (ary.splice(i - 1, 2), i -= 2)
|
||||
}
|
||||
}
|
||||
|
||||
function normalize(name, baseName, applyMap) {
|
||||
var mapValue, nameParts, i, j, nameSegment, lastIndex, foundMap, foundI, foundStarMap, starI, normalizedBaseParts, baseParts = baseName && baseName.split("/"),
|
||||
map = config.map,
|
||||
starMap = map && map["*"];
|
||||
if (name && (name = name.split("/"), lastIndex = name.length - 1, config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex]) && (name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, "")), "." === name[0].charAt(0) && baseParts && (normalizedBaseParts = baseParts.slice(0, baseParts.length - 1), name = normalizedBaseParts.concat(name)), trimDots(name), name = name.join("/")), applyMap && map && (baseParts || starMap)) {
|
||||
nameParts = name.split("/");
|
||||
outerLoop: for (i = nameParts.length; i > 0; i -= 1) {
|
||||
if (nameSegment = nameParts.slice(0, i).join("/"), baseParts)
|
||||
for (j = baseParts.length; j > 0; j -= 1)
|
||||
if ((mapValue = getOwn(map, baseParts.slice(0, j).join("/"))) && (mapValue = getOwn(mapValue, nameSegment))) {
|
||||
foundMap = mapValue, foundI = i;
|
||||
break outerLoop
|
||||
}! foundStarMap && starMap && getOwn(starMap, nameSegment) && (foundStarMap = getOwn(starMap, nameSegment), starI = i)
|
||||
}!foundMap && foundStarMap && (foundMap = foundStarMap, foundI = starI), foundMap && (nameParts.splice(0, foundI, foundMap), name = nameParts.join("/"))
|
||||
}
|
||||
return getOwn(config.pkgs, name) || name
|
||||
}
|
||||
|
||||
function removeScript(name) {
|
||||
isBrowser && each(scripts(), function(scriptNode) {
|
||||
if (scriptNode.getAttribute("data-requiremodule") === name && scriptNode.getAttribute("data-requirecontext") === context.contextName) return scriptNode.parentNode.removeChild(scriptNode), !0
|
||||
})
|
||||
}
|
||||
|
||||
function hasPathFallback(id) {
|
||||
var pathConfig = getOwn(config.paths, id);
|
||||
if (pathConfig && isArray(pathConfig) && pathConfig.length > 1) return pathConfig.shift(), context.require.undef(id), context.makeRequire(null, {
|
||||
skipMap: !0
|
||||
})([id]), !0
|
||||
}
|
||||
|
||||
function splitPrefix(name) {
|
||||
var prefix, index = name ? name.indexOf("!") : -1;
|
||||
return index > -1 && (prefix = name.substring(0, index), name = name.substring(index + 1, name.length)), [prefix, name]
|
||||
}
|
||||
|
||||
function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) {
|
||||
var url, pluginModule, suffix, nameParts, prefix = null,
|
||||
parentName = parentModuleMap ? parentModuleMap.name : null,
|
||||
originalName = name,
|
||||
isDefine = !0,
|
||||
normalizedName = "";
|
||||
return name || (isDefine = !1, name = "_@r" + (requireCounter += 1)), nameParts = splitPrefix(name), prefix = nameParts[0], name = nameParts[1], prefix && (prefix = normalize(prefix, parentName, applyMap), pluginModule = getOwn(defined, prefix)), name && (prefix ? normalizedName = isNormalized ? name : pluginModule && pluginModule.normalize ? pluginModule.normalize(name, function(name) {
|
||||
return normalize(name, parentName, applyMap)
|
||||
}) : -1 === name.indexOf("!") ? normalize(name, parentName, applyMap) : name : (normalizedName = normalize(name, parentName, applyMap), nameParts = splitPrefix(normalizedName), prefix = nameParts[0], normalizedName = nameParts[1], isNormalized = !0, url = context.nameToUrl(normalizedName))), suffix = !prefix || pluginModule || isNormalized ? "" : "_unnormalized" + (unnormalizedCounter += 1), {
|
||||
prefix: prefix,
|
||||
name: normalizedName,
|
||||
parentMap: parentModuleMap,
|
||||
unnormalized: !!suffix,
|
||||
url: url,
|
||||
originalName: originalName,
|
||||
isDefine: isDefine,
|
||||
id: (prefix ? prefix + "!" + normalizedName : normalizedName) + suffix
|
||||
}
|
||||
}
|
||||
|
||||
function getModule(depMap) {
|
||||
var id = depMap.id,
|
||||
mod = getOwn(registry, id);
|
||||
return mod || (mod = registry[id] = new context.Module(depMap)), mod
|
||||
}
|
||||
|
||||
function on(depMap, name, fn) {
|
||||
var id = depMap.id,
|
||||
mod = getOwn(registry, id);
|
||||
!hasProp(defined, id) || mod && !mod.defineEmitComplete ? (mod = getModule(depMap), mod.error && "error" === name ? fn(mod.error) : mod.on(name, fn)) : "defined" === name && fn(defined[id])
|
||||
}
|
||||
|
||||
function onError(err, errback) {
|
||||
var ids = err.requireModules,
|
||||
notified = !1;
|
||||
errback ? errback(err) : (each(ids, function(id) {
|
||||
var mod = getOwn(registry, id);
|
||||
mod && (mod.error = err, mod.events.error && (notified = !0, mod.emit("error", err)))
|
||||
}), notified || req.onError(err))
|
||||
}
|
||||
|
||||
function takeGlobalQueue() {
|
||||
globalDefQueue.length && (each(globalDefQueue, function(queueItem) {
|
||||
var id = queueItem[0];
|
||||
"string" == typeof id && (context.defQueueMap[id] = !0), defQueue.push(queueItem)
|
||||
}), globalDefQueue = [])
|
||||
}
|
||||
|
||||
function cleanRegistry(id) {
|
||||
delete registry[id], delete enabledRegistry[id]
|
||||
}
|
||||
|
||||
function breakCycle(mod, traced, processed) {
|
||||
var id = mod.map.id;
|
||||
mod.error ? mod.emit("error", mod.error) : (traced[id] = !0, each(mod.depMaps, function(depMap, i) {
|
||||
var depId = depMap.id,
|
||||
dep = getOwn(registry, depId);
|
||||
!dep || mod.depMatched[i] || processed[depId] || (getOwn(traced, depId) ? (mod.defineDep(i, defined[depId]), mod.check()) : breakCycle(dep, traced, processed))
|
||||
}), processed[id] = !0)
|
||||
}
|
||||
|
||||
function checkLoaded() {
|
||||
var err, usingPathFallback, waitInterval = 1e3 * config.waitSeconds,
|
||||
expired = waitInterval && context.startTime + waitInterval < (new Date).getTime(),
|
||||
noLoads = [],
|
||||
reqCalls = [],
|
||||
stillLoading = !1,
|
||||
needCycleCheck = !0;
|
||||
if (!inCheckLoaded) {
|
||||
if (inCheckLoaded = !0, eachProp(enabledRegistry, function(mod) {
|
||||
var map = mod.map,
|
||||
modId = map.id;
|
||||
if (mod.enabled && (map.isDefine || reqCalls.push(mod), !mod.error))
|
||||
if (!mod.inited && expired) hasPathFallback(modId) ? (usingPathFallback = !0, stillLoading = !0) : (noLoads.push(modId), removeScript(modId));
|
||||
else if (!mod.inited && mod.fetched && map.isDefine && (stillLoading = !0, !map.prefix)) return needCycleCheck = !1
|
||||
}), expired && noLoads.length) return err = makeError("timeout", "Load timeout for modules: " + noLoads, null, noLoads), err.contextName = context.contextName, onError(err);
|
||||
needCycleCheck && each(reqCalls, function(mod) {
|
||||
breakCycle(mod, {}, {})
|
||||
}), expired && !usingPathFallback || !stillLoading || !isBrowser && !isWebWorker || checkLoadedTimeoutId || (checkLoadedTimeoutId = setTimeout(function() {
|
||||
checkLoadedTimeoutId = 0, checkLoaded()
|
||||
}, 50)), inCheckLoaded = !1
|
||||
}
|
||||
}
|
||||
|
||||
function callGetModule(args) {
|
||||
hasProp(defined, args[0]) || getModule(makeModuleMap(args[0], null, !0)).init(args[1], args[2])
|
||||
}
|
||||
|
||||
function removeListener(node, func, name, ieName) {
|
||||
node.detachEvent && !isOpera ? ieName && node.detachEvent(ieName, func) : node.removeEventListener(name, func, !1)
|
||||
}
|
||||
|
||||
function getScriptData(evt) {
|
||||
var node = evt.currentTarget || evt.srcElement;
|
||||
return removeListener(node, context.onScriptLoad, "load", "onreadystatechange"), removeListener(node, context.onScriptError, "error"), {
|
||||
node: node,
|
||||
id: node && node.getAttribute("data-requiremodule")
|
||||
}
|
||||
}
|
||||
|
||||
function intakeDefines() {
|
||||
var args;
|
||||
for (takeGlobalQueue(); defQueue.length;) {
|
||||
if (args = defQueue.shift(), null === args[0]) return onError(makeError("mismatch", "Mismatched anonymous define() module: " + args[args.length - 1]));
|
||||
callGetModule(args)
|
||||
}
|
||||
context.defQueueMap = {}
|
||||
}
|
||||
var inCheckLoaded, Module, context, handlers, checkLoadedTimeoutId, config = {
|
||||
waitSeconds: 7,
|
||||
baseUrl: "./",
|
||||
paths: {},
|
||||
bundles: {},
|
||||
pkgs: {},
|
||||
shim: {},
|
||||
config: {}
|
||||
},
|
||||
registry = {},
|
||||
enabledRegistry = {},
|
||||
undefEvents = {},
|
||||
defQueue = [],
|
||||
defined = {},
|
||||
urlFetched = {},
|
||||
bundlesMap = {},
|
||||
requireCounter = 1,
|
||||
unnormalizedCounter = 1;
|
||||
return handlers = {
|
||||
require: function(mod) {
|
||||
return mod.require ? mod.require : mod.require = context.makeRequire(mod.map)
|
||||
},
|
||||
exports: function(mod) {
|
||||
if (mod.usingExports = !0, mod.map.isDefine) return mod.exports ? defined[mod.map.id] = mod.exports : mod.exports = defined[mod.map.id] = {}
|
||||
},
|
||||
module: function(mod) {
|
||||
return mod.module ? mod.module : mod.module = {
|
||||
id: mod.map.id,
|
||||
uri: mod.map.url,
|
||||
config: function() {
|
||||
return getOwn(config.config, mod.map.id) || {}
|
||||
},
|
||||
exports: mod.exports || (mod.exports = {})
|
||||
}
|
||||
}
|
||||
}, Module = function(map) {
|
||||
this.events = getOwn(undefEvents, map.id) || {}, this.map = map, this.shim = getOwn(config.shim, map.id), this.depExports = [], this.depMaps = [], this.depMatched = [], this.pluginMaps = {}, this.depCount = 0
|
||||
}, Module.prototype = {
|
||||
init: function(depMaps, factory, errback, options) {
|
||||
options = options || {}, this.inited || (this.factory = factory, errback ? this.on("error", errback) : this.events.error && (errback = bind(this, function(err) {
|
||||
this.emit("error", err)
|
||||
})), this.depMaps = depMaps && depMaps.slice(0), this.errback = errback, this.inited = !0, this.ignore = options.ignore, options.enabled || this.enabled ? this.enable() : this.check())
|
||||
},
|
||||
defineDep: function(i, depExports) {
|
||||
this.depMatched[i] || (this.depMatched[i] = !0, this.depCount -= 1, this.depExports[i] = depExports)
|
||||
},
|
||||
fetch: function() {
|
||||
if (!this.fetched) {
|
||||
this.fetched = !0, context.startTime = (new Date).getTime();
|
||||
var map = this.map;
|
||||
if (!this.shim) return map.prefix ? this.callPlugin() : this.load();
|
||||
context.makeRequire(this.map, {
|
||||
enableBuildCallback: !0
|
||||
})(this.shim.deps || [], bind(this, function() {
|
||||
return map.prefix ? this.callPlugin() : this.load()
|
||||
}))
|
||||
}
|
||||
},
|
||||
load: function() {
|
||||
var url = this.map.url;
|
||||
urlFetched[url] || (urlFetched[url] = !0, context.load(this.map.id, url))
|
||||
},
|
||||
check: function() {
|
||||
if (this.enabled && !this.enabling) {
|
||||
var err, cjsModule, id = this.map.id,
|
||||
depExports = this.depExports,
|
||||
exports = this.exports,
|
||||
factory = this.factory;
|
||||
if (this.inited) {
|
||||
if (this.error) this.emit("error", this.error);
|
||||
else if (!this.defining) {
|
||||
if (this.defining = !0, this.depCount < 1 && !this.defined) {
|
||||
if (isFunction(factory)) {
|
||||
if (this.events.error && this.map.isDefine || req.onError !== defaultOnError) try {
|
||||
exports = context.execCb(id, factory, depExports, exports)
|
||||
} catch (e) {
|
||||
err = e
|
||||
} else exports = context.execCb(id, factory, depExports, exports);
|
||||
if (this.map.isDefine && void 0 === exports && (cjsModule = this.module, cjsModule ? exports = cjsModule.exports : this.usingExports && (exports = this.exports)), err) return err.requireMap = this.map, err.requireModules = this.map.isDefine ? [this.map.id] : null, err.requireType = this.map.isDefine ? "define" : "require", onError(this.error = err)
|
||||
} else exports = factory;
|
||||
if (this.exports = exports, this.map.isDefine && !this.ignore && (defined[id] = exports, req.onResourceLoad)) {
|
||||
var resLoadMaps = [];
|
||||
each(this.depMaps, function(depMap) {
|
||||
resLoadMaps.push(depMap.normalizedMap || depMap)
|
||||
}), req.onResourceLoad(context, this.map, resLoadMaps)
|
||||
}
|
||||
cleanRegistry(id), this.defined = !0
|
||||
}
|
||||
this.defining = !1, this.defined && !this.defineEmitted && (this.defineEmitted = !0, this.emit("defined", this.exports), this.defineEmitComplete = !0)
|
||||
}
|
||||
} else hasProp(context.defQueueMap, id) || this.fetch()
|
||||
}
|
||||
},
|
||||
callPlugin: function() {
|
||||
var map = this.map,
|
||||
id = map.id,
|
||||
pluginMap = makeModuleMap(map.prefix);
|
||||
this.depMaps.push(pluginMap), on(pluginMap, "defined", bind(this, function(plugin) {
|
||||
var load, normalizedMap, normalizedMod, bundleId = getOwn(bundlesMap, this.map.id),
|
||||
name = this.map.name,
|
||||
parentName = this.map.parentMap ? this.map.parentMap.name : null,
|
||||
localRequire = context.makeRequire(map.parentMap, {
|
||||
enableBuildCallback: !0
|
||||
});
|
||||
return this.map.unnormalized ? (plugin.normalize && (name = plugin.normalize(name, function(name) {
|
||||
return normalize(name, parentName, !0)
|
||||
}) || ""), normalizedMap = makeModuleMap(map.prefix + "!" + name, this.map.parentMap, !0), on(normalizedMap, "defined", bind(this, function(value) {
|
||||
this.map.normalizedMap = normalizedMap, this.init([], function() {
|
||||
return value
|
||||
}, null, {
|
||||
enabled: !0,
|
||||
ignore: !0
|
||||
})
|
||||
})), void((normalizedMod = getOwn(registry, normalizedMap.id)) && (this.depMaps.push(normalizedMap), this.events.error && normalizedMod.on("error", bind(this, function(err) {
|
||||
this.emit("error", err)
|
||||
})), normalizedMod.enable()))) : bundleId ? (this.map.url = context.nameToUrl(bundleId), void this.load()) : (load = bind(this, function(value) {
|
||||
this.init([], function() {
|
||||
return value
|
||||
}, null, {
|
||||
enabled: !0
|
||||
})
|
||||
}), load.error = bind(this, function(err) {
|
||||
this.inited = !0, this.error = err, err.requireModules = [id], eachProp(registry, function(mod) {
|
||||
0 === mod.map.id.indexOf(id + "_unnormalized") && cleanRegistry(mod.map.id)
|
||||
}), onError(err)
|
||||
}), load.fromText = bind(this, function(text, textAlt) {
|
||||
var moduleName = map.name,
|
||||
moduleMap = makeModuleMap(moduleName),
|
||||
hasInteractive = useInteractive;
|
||||
textAlt && (text = textAlt), hasInteractive && (useInteractive = !1), getModule(moduleMap), hasProp(config.config, id) && (config.config[moduleName] = config.config[id]);
|
||||
try {
|
||||
req.exec(text)
|
||||
} catch (e) {
|
||||
return onError(makeError("fromtexteval", "fromText eval for " + id + " failed: " + e, e, [id]))
|
||||
}
|
||||
hasInteractive && (useInteractive = !0), this.depMaps.push(moduleMap), context.completeLoad(moduleName), localRequire([moduleName], load)
|
||||
}), void plugin.load(map.name, localRequire, load, config))
|
||||
})), context.enable(pluginMap, this), this.pluginMaps[pluginMap.id] = pluginMap
|
||||
},
|
||||
enable: function() {
|
||||
enabledRegistry[this.map.id] = this, this.enabled = !0, this.enabling = !0, each(this.depMaps, bind(this, function(depMap, i) {
|
||||
var id, mod, handler;
|
||||
if ("string" == typeof depMap) {
|
||||
if (depMap = makeModuleMap(depMap, this.map.isDefine ? this.map : this.map.parentMap, !1, !this.skipMap), this.depMaps[i] = depMap, handler = getOwn(handlers, depMap.id)) return void(this.depExports[i] = handler(this));
|
||||
this.depCount += 1, on(depMap, "defined", bind(this, function(depExports) {
|
||||
this.undefed || (this.defineDep(i, depExports), this.check())
|
||||
})), this.errback ? on(depMap, "error", bind(this, this.errback)) : this.events.error && on(depMap, "error", bind(this, function(err) {
|
||||
this.emit("error", err)
|
||||
}))
|
||||
}
|
||||
id = depMap.id, mod = registry[id], hasProp(handlers, id) || !mod || mod.enabled || context.enable(depMap, this)
|
||||
})), eachProp(this.pluginMaps, bind(this, function(pluginMap) {
|
||||
var mod = getOwn(registry, pluginMap.id);
|
||||
mod && !mod.enabled && context.enable(pluginMap, this)
|
||||
})), this.enabling = !1, this.check()
|
||||
},
|
||||
on: function(name, cb) {
|
||||
var cbs = this.events[name];
|
||||
cbs || (cbs = this.events[name] = []), cbs.push(cb)
|
||||
},
|
||||
emit: function(name, evt) {
|
||||
each(this.events[name], function(cb) {
|
||||
cb(evt)
|
||||
}), "error" === name && delete this.events[name]
|
||||
}
|
||||
}, context = {
|
||||
config: config,
|
||||
contextName: contextName,
|
||||
registry: registry,
|
||||
defined: defined,
|
||||
urlFetched: urlFetched,
|
||||
defQueue: defQueue,
|
||||
defQueueMap: {},
|
||||
Module: Module,
|
||||
makeModuleMap: makeModuleMap,
|
||||
nextTick: req.nextTick,
|
||||
onError: onError,
|
||||
configure: function(cfg) {
|
||||
if (cfg.baseUrl && "/" !== cfg.baseUrl.charAt(cfg.baseUrl.length - 1) && (cfg.baseUrl += "/"), "string" == typeof cfg.urlArgs) {
|
||||
var urlArgs = cfg.urlArgs;
|
||||
cfg.urlArgs = function(id, url) {
|
||||
return (-1 === url.indexOf("?") ? "?" : "&") + urlArgs
|
||||
}
|
||||
}
|
||||
var shim = config.shim,
|
||||
objs = {
|
||||
paths: !0,
|
||||
bundles: !0,
|
||||
config: !0,
|
||||
map: !0
|
||||
};
|
||||
eachProp(cfg, function(value, prop) {
|
||||
objs[prop] ? (config[prop] || (config[prop] = {}), mixin(config[prop], value, !0, !0)) : config[prop] = value
|
||||
}), cfg.bundles && eachProp(cfg.bundles, function(value, prop) {
|
||||
each(value, function(v) {
|
||||
v !== prop && (bundlesMap[v] = prop)
|
||||
})
|
||||
}), cfg.shim && (eachProp(cfg.shim, function(value, id) {
|
||||
isArray(value) && (value = {
|
||||
deps: value
|
||||
}), !value.exports && !value.init || value.exportsFn || (value.exportsFn = context.makeShimExports(value)), shim[id] = value
|
||||
}), config.shim = shim), cfg.packages && each(cfg.packages, function(pkgObj) {
|
||||
var location, name;
|
||||
pkgObj = "string" == typeof pkgObj ? {
|
||||
name: pkgObj
|
||||
} : pkgObj, name = pkgObj.name, location = pkgObj.location, location && (config.paths[name] = pkgObj.location), config.pkgs[name] = pkgObj.name + "/" + (pkgObj.main || "main").replace(currDirRegExp, "").replace(jsSuffixRegExp, "")
|
||||
}), eachProp(registry, function(mod, id) {
|
||||
mod.inited || mod.map.unnormalized || (mod.map = makeModuleMap(id, null, !0))
|
||||
}), (cfg.deps || cfg.callback) && context.require(cfg.deps || [], cfg.callback)
|
||||
},
|
||||
makeShimExports: function(value) {
|
||||
function fn() {
|
||||
var ret;
|
||||
return value.init && (ret = value.init.apply(global, arguments)), ret || value.exports && getGlobal(value.exports)
|
||||
}
|
||||
return fn
|
||||
},
|
||||
makeRequire: function(relMap, options) {
|
||||
function localRequire(deps, callback, errback) {
|
||||
var id, map, requireMod;
|
||||
return options.enableBuildCallback && callback && isFunction(callback) && (callback.__requireJsBuild = !0), "string" == typeof deps ? isFunction(callback) ? onError(makeError("requireargs", "Invalid require call"), errback) : relMap && hasProp(handlers, deps) ? handlers[deps](registry[relMap.id]) : req.get ? req.get(context, deps, relMap, localRequire) : (map = makeModuleMap(deps, relMap, !1, !0), id = map.id, hasProp(defined, id) ? defined[id] : onError(makeError("notloaded", 'Module name "' + id + '" has not been loaded yet for context: ' + contextName + (relMap ? "" : ". Use require([])")))) : (intakeDefines(), context.nextTick(function() {
|
||||
intakeDefines(), requireMod = getModule(makeModuleMap(null, relMap)), requireMod.skipMap = options.skipMap, requireMod.init(deps, callback, errback, {
|
||||
enabled: !0
|
||||
}), checkLoaded()
|
||||
}), localRequire)
|
||||
}
|
||||
return options = options || {}, mixin(localRequire, {
|
||||
isBrowser: isBrowser,
|
||||
toUrl: function(moduleNamePlusExt) {
|
||||
var ext, index = moduleNamePlusExt.lastIndexOf("."),
|
||||
segment = moduleNamePlusExt.split("/")[0],
|
||||
isRelative = "." === segment || ".." === segment;
|
||||
return -1 !== index && (!isRelative || index > 1) && (ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length), moduleNamePlusExt = moduleNamePlusExt.substring(0, index)), context.nameToUrl(normalize(moduleNamePlusExt, relMap && relMap.id, !0), ext, !0)
|
||||
},
|
||||
defined: function(id) {
|
||||
return hasProp(defined, makeModuleMap(id, relMap, !1, !0).id)
|
||||
},
|
||||
specified: function(id) {
|
||||
return id = makeModuleMap(id, relMap, !1, !0).id, hasProp(defined, id) || hasProp(registry, id)
|
||||
}
|
||||
}), relMap || (localRequire.undef = function(id) {
|
||||
takeGlobalQueue();
|
||||
var map = makeModuleMap(id, relMap, !0),
|
||||
mod = getOwn(registry, id);
|
||||
mod.undefed = !0, removeScript(id), delete defined[id], delete urlFetched[map.url], delete undefEvents[id], eachReverse(defQueue, function(args, i) {
|
||||
args[0] === id && defQueue.splice(i, 1)
|
||||
}), delete context.defQueueMap[id], mod && (mod.events.defined && (undefEvents[id] = mod.events), cleanRegistry(id))
|
||||
}), localRequire
|
||||
},
|
||||
enable: function(depMap) {
|
||||
getOwn(registry, depMap.id) && getModule(depMap).enable()
|
||||
},
|
||||
completeLoad: function(moduleName) {
|
||||
var found, args, mod, shim = getOwn(config.shim, moduleName) || {},
|
||||
shExports = shim.exports;
|
||||
for (takeGlobalQueue(); defQueue.length;) {
|
||||
if (args = defQueue.shift(), null === args[0]) {
|
||||
if (args[0] = moduleName, found) break;
|
||||
found = !0
|
||||
} else args[0] === moduleName && (found = !0);
|
||||
callGetModule(args)
|
||||
}
|
||||
if (context.defQueueMap = {}, mod = getOwn(registry, moduleName), !found && !hasProp(defined, moduleName) && mod && !mod.inited) {
|
||||
if (!(!config.enforceDefine || shExports && getGlobal(shExports))) return hasPathFallback(moduleName) ? void 0 : onError(makeError("nodefine", "No define call for " + moduleName, null, [moduleName]));
|
||||
callGetModule([moduleName, shim.deps || [], shim.exportsFn])
|
||||
}
|
||||
checkLoaded()
|
||||
},
|
||||
nameToUrl: function(moduleName, ext, skipExt) {
|
||||
var paths, syms, i, parentModule, url, parentPath, bundleId, pkgMain = getOwn(config.pkgs, moduleName);
|
||||
if (pkgMain && (moduleName = pkgMain), bundleId = getOwn(bundlesMap, moduleName)) return context.nameToUrl(bundleId, ext, skipExt);
|
||||
if (req.jsExtRegExp.test(moduleName)) url = moduleName + (ext || "");
|
||||
else {
|
||||
for (paths = config.paths, syms = moduleName.split("/"), i = syms.length; i > 0; i -= 1)
|
||||
if (parentModule = syms.slice(0, i).join("/"), parentPath = getOwn(paths, parentModule)) {
|
||||
isArray(parentPath) && (parentPath = parentPath[0]), syms.splice(0, i, parentPath);
|
||||
break
|
||||
} url = syms.join("/"), url += ext || (/^data\:|^blob\:|\?/.test(url) || skipExt ? "" : ".js"), url = ("/" === url.charAt(0) || url.match(/^[\w\+\.\-]+:/) ? "" : config.baseUrl) + url
|
||||
}
|
||||
return config.urlArgs && !/^blob\:/.test(url) ? url + config.urlArgs(moduleName, url) : url
|
||||
},
|
||||
load: function(id, url) {
|
||||
req.load(context, id, url)
|
||||
},
|
||||
execCb: function(name, callback, args, exports) {
|
||||
return callback.apply(exports, args)
|
||||
},
|
||||
onScriptLoad: function(evt) {
|
||||
if ("load" === evt.type || readyRegExp.test((evt.currentTarget || evt.srcElement).readyState)) {
|
||||
interactiveScript = null;
|
||||
var data = getScriptData(evt);
|
||||
context.completeLoad(data.id)
|
||||
}
|
||||
},
|
||||
onScriptError: function(evt) {
|
||||
var data = getScriptData(evt);
|
||||
if (!hasPathFallback(data.id)) {
|
||||
var parents = [];
|
||||
return eachProp(registry, function(value, key) {
|
||||
0 !== key.indexOf("_@r") && each(value.depMaps, function(depMap) {
|
||||
if (depMap.id === data.id) return parents.push(key), !0
|
||||
})
|
||||
}), onError(makeError("scripterror", 'Script error for "' + data.id + (parents.length ? '", needed by: ' + parents.join(", ") : '"'), evt, [data.id]))
|
||||
}
|
||||
}
|
||||
}, context.require = context.makeRequire(), context
|
||||
}
|
||||
|
||||
function getInteractiveScript() {
|
||||
return interactiveScript && "interactive" === interactiveScript.readyState ? interactiveScript : (eachReverse(scripts(), function(script) {
|
||||
if ("interactive" === script.readyState) return interactiveScript = script
|
||||
}), interactiveScript)
|
||||
}
|
||||
var req, s, head, baseElement, dataMain, src, interactiveScript, currentlyAddingScript, mainScript, subPath, version = "2.3.5",
|
||||
commentRegExp = /\/\*[\s\S]*?\*\/|([^:"'=]|^)\/\/.*$/gm,
|
||||
cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
|
||||
jsSuffixRegExp = /\.js$/,
|
||||
currDirRegExp = /^\.\//,
|
||||
op = Object.prototype,
|
||||
ostring = op.toString,
|
||||
hasOwn = op.hasOwnProperty,
|
||||
isBrowser = !("undefined" == typeof window || "undefined" == typeof navigator || !window.document),
|
||||
isWebWorker = !isBrowser && "undefined" != typeof importScripts,
|
||||
readyRegExp = isBrowser && "PLAYSTATION 3" === navigator.platform ? /^complete$/ : /^(complete|loaded)$/,
|
||||
defContextName = "_",
|
||||
isOpera = "undefined" != typeof opera && "[object Opera]" === opera.toString(),
|
||||
contexts = {},
|
||||
cfg = {},
|
||||
globalDefQueue = [],
|
||||
useInteractive = !1;
|
||||
if (void 0 === define) {
|
||||
if (void 0 !== requirejs) {
|
||||
if (isFunction(requirejs)) return;
|
||||
cfg = requirejs, requirejs = void 0
|
||||
}
|
||||
void 0 === require || isFunction(require) || (cfg = require, require = void 0), req = requirejs = function(deps, callback, errback, optional) {
|
||||
var context, config, contextName = defContextName;
|
||||
return isArray(deps) || "string" == typeof deps || (config = deps, isArray(callback) ? (deps = callback, callback = errback, errback = optional) : deps = []), config && config.context && (contextName = config.context), context = getOwn(contexts, contextName), context || (context = contexts[contextName] = req.s.newContext(contextName)), config && context.configure(config), context.require(deps, callback, errback)
|
||||
}, req.config = function(config) {
|
||||
return req(config)
|
||||
}, req.nextTick = void 0 !== setTimeout ? function(fn) {
|
||||
setTimeout(fn, 4)
|
||||
} : function(fn) {
|
||||
fn()
|
||||
}, require || (require = req), req.version = version, req.jsExtRegExp = /^\/|:|\?|\.js$/, req.isBrowser = isBrowser, s = req.s = {
|
||||
contexts: contexts,
|
||||
newContext: newContext
|
||||
}, req({}), each(["toUrl", "undef", "defined", "specified"], function(prop) {
|
||||
req[prop] = function() {
|
||||
var ctx = contexts[defContextName];
|
||||
return ctx.require[prop].apply(ctx, arguments)
|
||||
}
|
||||
}), isBrowser && (head = s.head = document.getElementsByTagName("head")[0], (baseElement = document.getElementsByTagName("base")[0]) && (head = s.head = baseElement.parentNode)), req.onError = defaultOnError, req.createNode = function(config, moduleName, url) {
|
||||
var node = config.xhtml ? document.createElementNS("http://www.w3.org/1999/xhtml", "html:script") : document.createElement("script");
|
||||
return node.type = config.scriptType || "text/javascript", node.charset = "utf-8", node.async = !0, node
|
||||
}, req.load = function(context, moduleName, url) {
|
||||
var node, config = context && context.config || {};
|
||||
if (isBrowser) return node = req.createNode(config, moduleName, url), node.setAttribute("data-requirecontext", context.contextName), node.setAttribute("data-requiremodule", moduleName), !node.attachEvent || node.attachEvent.toString && node.attachEvent.toString().indexOf("[native code") < 0 || isOpera ? (node.addEventListener("load", context.onScriptLoad, !1), node.addEventListener("error", context.onScriptError, !1)) : (useInteractive = !0, node.attachEvent("onreadystatechange", context.onScriptLoad)), node.src = url, config.onNodeCreated && config.onNodeCreated(node, config, moduleName, url), currentlyAddingScript = node, baseElement ? head.insertBefore(node, baseElement) : head.appendChild(node), currentlyAddingScript = null, node;
|
||||
if (isWebWorker) try {
|
||||
setTimeout(function() {}, 0), importScripts(url), context.completeLoad(moduleName)
|
||||
} catch (e) {
|
||||
context.onError(makeError("importscripts", "importScripts failed for " + moduleName + " at " + url, e, [moduleName]))
|
||||
}
|
||||
}, isBrowser && !cfg.skipDataMain && eachReverse(scripts(), function(script) {
|
||||
if (head || (head = script.parentNode), dataMain = script.getAttribute("data-main")) return mainScript = dataMain, cfg.baseUrl || -1 !== mainScript.indexOf("!") || (src = mainScript.split("/"), mainScript = src.pop(), subPath = src.length ? src.join("/") + "/" : "./", cfg.baseUrl = subPath), mainScript = mainScript.replace(jsSuffixRegExp, ""), req.jsExtRegExp.test(mainScript) && (mainScript = dataMain), cfg.deps = cfg.deps ? cfg.deps.concat(mainScript) : [mainScript], !0
|
||||
}), define = function(name, deps, callback) {
|
||||
var node, context;
|
||||
"string" != typeof name && (callback = deps, deps = name, name = null), isArray(deps) || (callback = deps, deps = null), !deps && isFunction(callback) && (deps = [], callback.length && (callback.toString().replace(commentRegExp, commentReplace).replace(cjsRequireRegExp, function(match, dep) {
|
||||
deps.push(dep)
|
||||
}), deps = (1 === callback.length ? ["require"] : ["require", "exports", "module"]).concat(deps))), useInteractive && (node = currentlyAddingScript || getInteractiveScript()) && (name || (name = node.getAttribute("data-requiremodule")), context = contexts[node.getAttribute("data-requirecontext")]), context ? (context.defQueue.push([name, deps, callback]), context.defQueueMap[name] = !0) : globalDefQueue.push([name, deps, callback])
|
||||
}, define.amd = {
|
||||
jQuery: !0
|
||||
}, req.exec = function(text) {
|
||||
return eval(text)
|
||||
}, req(cfg)
|
||||
}
|
||||
}(this, "undefined" == typeof setTimeout ? void 0 : setTimeout);
|
||||