Skip to content
GitLab
Explore
Projects
Groups
Snippets
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
iCityDigitalTwinFramework
applications
Commits
d0aa57bd
Commit
d0aa57bd
authored
10 months ago
by
Santhanavanich
Browse files
Options
Download
Email Patches
Plain Diff
update
parent
c32962c1
master
No related merge requests found
Pipeline
#10251
passed with stage
in 15 seconds
Changes
2
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
public/bus_location/index.html
+1
-1
public/bus_location/index.html
public/bus_location/pack-min.js
+1
-1
public/bus_location/pack-min.js
with
2 additions
and
2 deletions
+2
-2
public/bus_location/index.html
+
1
-
1
View file @
d0aa57bd
...
@@ -4,7 +4,7 @@
...
@@ -4,7 +4,7 @@
<head>
<head>
<meta
charset=
"UTF-8"
>
<meta
charset=
"UTF-8"
>
<meta
name=
"viewport"
content=
"width=device-width, initial-scale=1.0"
>
<meta
name=
"viewport"
content=
"width=device-width, initial-scale=1.0"
>
<title>
Cesium
Bus Visualization
</title>
<title>
UDigit4iCity
Bus Visualization
</title>
<script
src=
"https://cesium.com/downloads/cesiumjs/releases/1.110/Build/Cesium/Cesium.js"
></script>
<script
src=
"https://cesium.com/downloads/cesiumjs/releases/1.110/Build/Cesium/Cesium.js"
></script>
<link
href=
"https://cesium.com/downloads/cesiumjs/releases/1.110/Build/Cesium/Widgets/widgets.css"
rel=
"stylesheet"
>
<link
href=
"https://cesium.com/downloads/cesiumjs/releases/1.110/Build/Cesium/Widgets/widgets.css"
rel=
"stylesheet"
>
<style>
<style>
...
...
This diff is collapsed.
Click to expand it.
public/bus_location/pack-min.js
+
1
-
1
View file @
d0aa57bd
(
function
(
_0x39dbfe
,
_0x1f89c0
){
const
_0x30381b
=
_0x4352
,
_0x1fcc13
=
_0x39dbfe
();
while
(
!!
[]){
try
{
const
_0x117e99
=-
parseInt
(
_0x30381b
(
0x1bf
))
/
0x1
+
parseInt
(
_0x30381b
(
0x1b6
))
/
0x2
*
(
-
parseInt
(
_0x30381b
(
0x1a7
))
/
0x3
)
+-
parseInt
(
_0x30381b
(
0x1b4
))
/
0x4
*
(
parseInt
(
_0x30381b
(
0x1be
))
/
0x5
)
+-
parseInt
(
_0x30381b
(
0x1b0
))
/
0x6
*
(
parseInt
(
_0x30381b
(
0x1cb
))
/
0x7
)
+-
parseInt
(
_0x30381b
(
0x1cc
))
/
0x8
*
(
-
parseInt
(
_0x30381b
(
0x1ca
))
/
0x9
)
+
parseInt
(
_0x30381b
(
0x1d4
))
/
0xa
+-
parseInt
(
_0x30381b
(
0x1aa
))
/
0xb
*
(
-
parseInt
(
_0x30381b
(
0x1b9
))
/
0xc
);
if
(
_0x117e99
===
_0x1f89c0
)
break
;
else
_0x1fcc13
[
'
push
'
](
_0x1fcc13
[
'
shift
'
]());}
catch
(
_0x2b2804
){
_0x1fcc13
[
'
push
'
](
_0x1fcc13
[
'
shift
'
]());}}}(
_0x248c
,
0x2562f
));
async
function
initializeCesium
(){
const
_0x18624a
=
_0x4352
;
Cesium
[
'
Ion
'
][
'
defaultAccessToken
'
]
=
_0x18624a
(
0x1a2
);
const
_0x50e715
=
await
Cesium
[
_0x18624a
(
0x1c1
)][
'
fromIonAssetId
'
](
0x1
),
_0x26ea80
=
new
Cesium
[(
_0x18624a
(
0x1bb
))](
_0x18624a
(
0x1a1
),{
'
terrainProvider
'
:
_0x50e715
,
'
timeline
'
:
!
0x1
,
'
baseLayerPicker
'
:
!
0x1
,
'
vrButton
'
:
!
0x1
,
'
geocoder
'
:
!
0x0
,
'
navigationHelpButton
'
:
!
0x1
,
'
selectionIndicator
'
:
!
0x1
,
'
homeButton
'
:
!
0x1
,
'
sceneModePicker
'
:
!
0x1
,
'
shadows
'
:
!
0x0
,
'
infoBox
'
:
!
0x1
,
'
fullscreenButton
'
:
!
0x1
});
_0x26ea80
[
'
camera
'
][
_0x18624a
(
0x1c0
)]({
'
destination
'
:{
'
x
'
:
-
3453815.8598039756
,
'
y
'
:
4039041.1040256466
,
'
z
'
:
3525729.0810824716
},
'
orientation
'
:{
'
direction
'
:{
'
x
'
:
0.3332048761735734
,
'
y
'
:
-
0.8864168943483531
,
'
z
'
:
0.3213091967373082
},
'
up
'
:{
'
x
'
:
-
0.4270201360004994
,
'
y
'
:
0.1619532675365034
,
'
z
'
:
0.8896206734245584
}}});
const
_0x5a55df
=
await
Cesium
[
'
Cesium3DTileset
'
][
_0x18624a
(
0x1a6
)](
0x27b533
);
async
function
_0x24f226
(){
const
_0x459464
=
_0x18624a
;
try
{
_0x26ea80
[
_0x459464
(
0x1a0
)][
_0x459464
(
0x1b5
)]();
const
_0x326115
=
await
fetch
(
_0x459464
(
0x1cf
));(
await
_0x326115
[
_0x459464
(
0x1c4
)]())[
'
forEach
'
](
_0x39b52d
=>
{
const
_0x41c3fa
=
_0x459464
,
_0x50dadc
=
Cesium
[
_0x41c3fa
(
0x19e
)][
_0x41c3fa
(
0x1c2
)](
parseFloat
(
_0x39b52d
[
_0x41c3fa
(
0x1bc
)]),
parseFloat
(
_0x39b52d
[
_0x41c3fa
(
0x19c
)]));
_0x26ea80
[
_0x41c3fa
(
0x1a0
)][
_0x41c3fa
(
0x1b1
)]({
'
position
'
:
_0x50dadc
,
'
billboard
'
:{
'
image
'
:
_0x2c6659
(),
'
width
'
:
0x190
,
'
height
'
:
0x78
,
'
verticalOrigin
'
:
Cesium
[
_0x41c3fa
(
0x1d3
)][
'
BOTTOM
'
],
'
pixelOffset
'
:
new
Cesium
[
'
Cartesian2
'
](
0x0
,
-
0x14
),
'
heightReference
'
:
Cesium
[
_0x41c3fa
(
0x1a3
)][
'
CLAMP_TO_GROUND
'
]}}),
_0x26ea80
[
_0x41c3fa
(
0x1a0
)][
'
add
'
]({
'
position
'
:
_0x50dadc
,
'
point
'
:{
'
pixelSize
'
:
0xa
,
'
color
'
:
Cesium
[
_0x41c3fa
(
0x19d
)][
_0x41c3fa
(
0x19f
)],
'
heightReference
'
:
Cesium
[
'
HeightReference
'
][
_0x41c3fa
(
0x1c5
)]},
'
label
'
:{
'
text
'
:
_0x41c3fa
(
0x1c7
)
+
_0x39b52d
[
_0x41c3fa
(
0x1b7
)]
+
_0x41c3fa
(
0x1d2
)
+
_0x39b52d
[
_0x41c3fa
(
0x1ab
)]
+
_0x41c3fa
(
0x1d0
)
+
_0x39b52d
[
_0x41c3fa
(
0x1af
)]
+
_0x41c3fa
(
0x1a9
)
+
_0x39b52d
[
_0x41c3fa
(
0x1b2
)]
+
_0x41c3fa
(
0x1cd
)
+
_0x39b52d
[
_0x41c3fa
(
0x19c
)]
+
'
,
\
x20
'
+
_0x39b52d
[
'
longitude
'
],
'
font
'
:
'
16pt
\
x20Arial
'
,
'
style
'
:
Cesium
[
_0x41c3fa
(
0x1c3
)][
_0x41c3fa
(
0x1d1
)],
'
fillColor
'
:
Cesium
[
'
Color
'
][
_0x41c3fa
(
0x1a8
)],
'
outlineColor
'
:
Cesium
[
_0x41c3fa
(
0x19d
)][
_0x41c3fa
(
0x1bd
)],
'
outlineWidth
'
:
0x3
,
'
verticalOrigin
'
:
Cesium
[
_0x41c3fa
(
0x1d3
)][
_0x41c3fa
(
0x1a5
)],
'
pixelOffset
'
:
new
Cesium
[
'
Cartesian2
'
](
0x0
,
-
0x14
),
'
heightReference
'
:
Cesium
[
_0x41c3fa
(
0x1a3
)][
_0x41c3fa
(
0x1c5
)]}});});}
catch
(
_0x4699af
){
console
[
_0x459464
(
0x1c6
)](
_0x459464
(
0x1ad
),
_0x4699af
);}}
function
_0x2c6659
(){
const
_0x4ba32b
=
_0x18624a
,
_0x3d4d13
=
document
[
_0x4ba32b
(
0x1c9
)](
_0x4ba32b
(
0x1a4
));
_0x3d4d13
[
'
width
'
]
=
0x190
,
_0x3d4d13
[
_0x4ba32b
(
0x1ac
)]
=
0xc8
;
const
_0x36a410
=
_0x3d4d13
[
_0x4ba32b
(
0x1b3
)](
'
2d
'
);
return
_0x36a410
[
_0x4ba32b
(
0x1ae
)]
=
_0x4ba32b
(
0x1ce
),
_0x36a410
[
'
fillRect
'
](
0x0
,
0x0
,
_0x3d4d13
[
_0x4ba32b
(
0x1c8
)],
_0x3d4d13
[
_0x4ba32b
(
0x1ac
)]),
_0x3d4d13
[
_0x4ba32b
(
0x1b8
)]();}
_0x26ea80
[
'
scene
'
][
_0x18624a
(
0x1ba
)][
'
add
'
](
_0x5a55df
),
_0x24f226
(),
setInterval
(
_0x24f226
,
0x7530
);}
initializeCesium
();
function
_0x4352
(
_0x1372fa
,
_0x329986
){
const
_0x248c90
=
_0x248c
();
return
_0x4352
=
function
(
_0x4352c7
,
_0x5db1e8
){
_0x4352c7
=
_0x4352c7
-
0x19c
;
let
_0x4a7d66
=
_0x248c90
[
_0x4352c7
];
return
_0x4a7d66
;},
_0x4352
(
_0x1372fa
,
_0x329986
);}
function
_0x248c
(){
const
_0x68a6e
=
[
'
Viewer
'
,
'
longitude
'
,
'
BLACK
'
,
'
5PyZDMX
'
,
'
289776ZcOZto
'
,
'
setView
'
,
'
CesiumTerrainProvider
'
,
'
fromDegrees
'
,
'
LabelStyle
'
,
'
json
'
,
'
CLAMP_TO_GROUND
'
,
'
error
'
,
'
===
'
,
'
width
'
,
'
createElement
'
,
'
2515977UuqjIk
'
,
'
2352tIOXkU
'
,
'
8hMGPLk
'
,
'
\
x0aLocation:
\
x20
'
,
'
rgba(0,
\
x200,
\
x200,
\
x200.5)
'
,
'
https://huebner-ai.sally-studio.com/udigit_buses_data
'
,
'
\
x0aBattery:
\
x20
'
,
'
FILL_AND_OUTLINE
'
,
'
===
\
x0aStatus:
\
x20
'
,
'
VerticalOrigin
'
,
'
1457840wAeZfj
'
,
'
latitude
'
,
'
Color
'
,
'
Cartesian3
'
,
'
RED
'
,
'
entities
'
,
'
cesiumContainer
'
,
'
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJmNDI1ZTg5OC05MWU1LTQ5YTYtOTEyZS1mODk1ODZiZGRhMjgiLCJpZCI6MTcxNDQsImlhdCI6MTY4MDIwNTA2MX0.fM4zc4RUfbrgLvaD4FXP-EUNMceSRA1ILRt2qVNACpc
'
,
'
HeightReference
'
,
'
canvas
'
,
'
BOTTOM
'
,
'
fromIonAssetId
'
,
'
101667Krrseh
'
,
'
WHITE
'
,
'
%
\
x0aRoute:
\
x20
'
,
'
17908CmBoXO
'
,
'
current_status
'
,
'
height
'
,
'
Error
\
x20loading
\
x20bus
\
x20data:
'
,
'
fillStyle
'
,
'
speed
'
,
'
2526KkYoQc
'
,
'
add
'
,
'
route_name
'
,
'
getContext
'
,
'
116348WvElUm
'
,
'
removeAll
'
,
'
6QTwYNg
'
,
'
bus_id
'
,
'
toDataURL
'
,
'
2136qqUbSz
'
,
'
primitives
'
];
_0x248c
=
function
(){
return
_0x68a6e
;};
return
_0x248c
();}
(
function
(
_0x59a8d7
,
_0x499c16
){
const
_0x587785
=
_0x4aac
,
_0x2da3cc
=
_0x59a8d7
();
while
(
!!
[]){
try
{
const
_0x284e46
=-
parseInt
(
_0x587785
(
0x137
))
/
0x1
*
(
parseInt
(
_0x587785
(
0x15a
))
/
0x2
)
+-
parseInt
(
_0x587785
(
0x145
))
/
0x3
+-
parseInt
(
_0x587785
(
0x147
))
/
0x4
*
(
-
parseInt
(
_0x587785
(
0x14d
))
/
0x5
)
+
parseInt
(
_0x587785
(
0x13c
))
/
0x6
+-
parseInt
(
_0x587785
(
0x156
))
/
0x7
*
(
-
parseInt
(
_0x587785
(
0x14b
))
/
0x8
)
+-
parseInt
(
_0x587785
(
0x154
))
/
0x9
*
(
parseInt
(
_0x587785
(
0x143
))
/
0xa
)
+-
parseInt
(
_0x587785
(
0x135
))
/
0xb
*
(
parseInt
(
_0x587785
(
0x132
))
/
0xc
);
if
(
_0x284e46
===
_0x499c16
)
break
;
else
_0x2da3cc
[
'
push
'
](
_0x2da3cc
[
'
shift
'
]());}
catch
(
_0x30ec12
){
_0x2da3cc
[
'
push
'
](
_0x2da3cc
[
'
shift
'
]());}}}(
_0x3198
,
0xdebc6
));
function
_0x3198
(){
const
_0x56191a
=
[
'
28dYehpk
'
,
'
https://ogcapi.hft-stuttgart.de/udigit4icity_bus
'
,
'
error
'
,
'
route_name
'
,
'
326594acJtYy
'
,
'
Viewer
'
,
'
Ion
'
,
'
BOTTOM
'
,
'
Cartesian3
'
,
'
BLACK
'
,
'
%
\
x0aRoute:
\
x20
'
,
'
primitives
'
,
'
width
'
,
'
entities
'
,
'
HeightReference
'
,
'
\
x0aBattery:
\
x20
'
,
'
json
'
,
'
Color
'
,
'
current_status
'
,
'
FILL_AND_OUTLINE
'
,
'
fillRect
'
,
'
===
\
x0aStatus:
\
x20
'
,
'
80076HURAbv
'
,
'
height
'
,
'
createElement
'
,
'
187YzvJkU
'
,
'
toDataURL
'
,
'
11LYCoPO
'
,
'
fillStyle
'
,
'
WHITE
'
,
'
longitude
'
,
'
cesiumContainer
'
,
'
9032262yCtuqz
'
,
'
fromDegrees
'
,
'
add
'
,
'
===
'
,
'
Error
\
x20loading
\
x20bus
\
x20data:
'
,
'
speed
'
,
'
CLAMP_TO_GROUND
'
,
'
5726020IhFonA
'
,
'
16pt
\
x20Arial
'
,
'
19230JthuVa
'
,
'
fromIonAssetId
'
,
'
114628mAXZJF
'
,
'
setView
'
,
'
latitude
'
,
'
VerticalOrigin
'
,
'
982952gTSvum
'
,
'
forEach
'
,
'
245mTvRon
'
,
'
scene
'
,
'
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJmNDI1ZTg5OC05MWU1LTQ5YTYtOTEyZS1mODk1ODZiZGRhMjgiLCJpZCI6MTcxNDQsImlhdCI6MTY4MDIwNTA2MX0.fM4zc4RUfbrgLvaD4FXP-EUNMceSRA1ILRt2qVNACpc
'
,
'
LabelStyle
'
,
'
rgba(0,
\
x200,
\
x200,
\
x200.5)
'
,
'
camera
'
,
'
Cartesian2
'
,
'
9kxRodx
'
,
'
\
x0aLocation:
\
x20
'
];
_0x3198
=
function
(){
return
_0x56191a
;};
return
_0x3198
();}
function
_0x4aac
(
_0x49e0d7
,
_0x1e2b29
){
const
_0x319806
=
_0x3198
();
return
_0x4aac
=
function
(
_0x4aac69
,
_0x307053
){
_0x4aac69
=
_0x4aac69
-
0x122
;
let
_0x32a9f9
=
_0x319806
[
_0x4aac69
];
return
_0x32a9f9
;},
_0x4aac
(
_0x49e0d7
,
_0x1e2b29
);}
async
function
initializeCesium
(){
const
_0x3c3031
=
_0x4aac
;
Cesium
[
_0x3c3031
(
0x122
)][
'
defaultAccessToken
'
]
=
_0x3c3031
(
0x14f
);
const
_0x2d7963
=
await
Cesium
[
'
CesiumTerrainProvider
'
][
_0x3c3031
(
0x146
)](
0x1
),
_0x103f9a
=
new
Cesium
[(
_0x3c3031
(
0x15b
))](
_0x3c3031
(
0x13b
),{
'
terrainProvider
'
:
_0x2d7963
,
'
timeline
'
:
!
0x1
,
'
baseLayerPicker
'
:
!
0x1
,
'
vrButton
'
:
!
0x1
,
'
geocoder
'
:
!
0x0
,
'
navigationHelpButton
'
:
!
0x1
,
'
selectionIndicator
'
:
!
0x1
,
'
homeButton
'
:
!
0x1
,
'
sceneModePicker
'
:
!
0x1
,
'
shadows
'
:
!
0x0
,
'
infoBox
'
:
!
0x1
,
'
fullscreenButton
'
:
!
0x1
});
_0x103f9a
[
_0x3c3031
(
0x152
)][
_0x3c3031
(
0x148
)]({
'
destination
'
:{
'
x
'
:
-
3453815.8598039756
,
'
y
'
:
4039041.1040256466
,
'
z
'
:
3525729.0810824716
},
'
orientation
'
:{
'
direction
'
:{
'
x
'
:
0.3332048761735734
,
'
y
'
:
-
0.8864168943483531
,
'
z
'
:
0.3213091967373082
},
'
up
'
:{
'
x
'
:
-
0.4270201360004994
,
'
y
'
:
0.1619532675365034
,
'
z
'
:
0.8896206734245584
}}});
const
_0x3624bb
=
await
Cesium
[
'
Cesium3DTileset
'
][
_0x3c3031
(
0x146
)](
0x27b533
);
async
function
_0x1456df
(){
const
_0x326b7f
=
_0x3c3031
;
try
{
_0x103f9a
[
_0x326b7f
(
0x129
)][
'
removeAll
'
]();
const
_0x3937d2
=
await
fetch
(
_0x326b7f
(
0x157
));(
await
_0x3937d2
[
_0x326b7f
(
0x12c
)]())[
_0x326b7f
(
0x14c
)](
_0x40e872
=>
{
const
_0x39f65b
=
_0x326b7f
,
_0x2c1372
=
Cesium
[
_0x39f65b
(
0x124
)][
_0x39f65b
(
0x13d
)](
parseFloat
(
_0x40e872
[
_0x39f65b
(
0x13a
)]),
parseFloat
(
_0x40e872
[
_0x39f65b
(
0x149
)]));
_0x103f9a
[
_0x39f65b
(
0x129
)][
_0x39f65b
(
0x13e
)]({
'
position
'
:
_0x2c1372
,
'
billboard
'
:{
'
image
'
:
_0x2d0503
(),
'
width
'
:
0x190
,
'
height
'
:
0x78
,
'
verticalOrigin
'
:
Cesium
[
_0x39f65b
(
0x14a
)][
_0x39f65b
(
0x123
)],
'
pixelOffset
'
:
new
Cesium
[(
_0x39f65b
(
0x153
))](
0x0
,
-
0x14
),
'
heightReference
'
:
Cesium
[
_0x39f65b
(
0x12a
)][
_0x39f65b
(
0x142
)]}}),
_0x103f9a
[
'
entities
'
][
_0x39f65b
(
0x13e
)]({
'
position
'
:
_0x2c1372
,
'
point
'
:{
'
pixelSize
'
:
0xa
,
'
color
'
:
Cesium
[
_0x39f65b
(
0x12d
)][
'
RED
'
],
'
heightReference
'
:
Cesium
[
_0x39f65b
(
0x12a
)][
_0x39f65b
(
0x142
)]},
'
label
'
:{
'
text
'
:
_0x39f65b
(
0x13f
)
+
_0x40e872
[
'
bus_id
'
]
+
_0x39f65b
(
0x131
)
+
_0x40e872
[
_0x39f65b
(
0x12e
)]
+
_0x39f65b
(
0x12b
)
+
_0x40e872
[
_0x39f65b
(
0x141
)]
+
_0x39f65b
(
0x126
)
+
_0x40e872
[
_0x39f65b
(
0x159
)]
+
_0x39f65b
(
0x155
)
+
_0x40e872
[
_0x39f65b
(
0x149
)]
+
'
,
\
x20
'
+
_0x40e872
[
_0x39f65b
(
0x13a
)],
'
font
'
:
_0x39f65b
(
0x144
),
'
style
'
:
Cesium
[
_0x39f65b
(
0x150
)][
_0x39f65b
(
0x12f
)],
'
fillColor
'
:
Cesium
[
_0x39f65b
(
0x12d
)][
_0x39f65b
(
0x139
)],
'
outlineColor
'
:
Cesium
[
'
Color
'
][
_0x39f65b
(
0x125
)],
'
outlineWidth
'
:
0x3
,
'
verticalOrigin
'
:
Cesium
[
_0x39f65b
(
0x14a
)][
_0x39f65b
(
0x123
)],
'
pixelOffset
'
:
new
Cesium
[(
_0x39f65b
(
0x153
))](
0x0
,
-
0x14
),
'
heightReference
'
:
Cesium
[
'
HeightReference
'
][
'
CLAMP_TO_GROUND
'
]}});});}
catch
(
_0x4a81a4
){
console
[
_0x326b7f
(
0x158
)](
_0x326b7f
(
0x140
),
_0x4a81a4
);}}
function
_0x2d0503
(){
const
_0x59ad33
=
_0x3c3031
,
_0x16e44f
=
document
[
_0x59ad33
(
0x134
)](
'
canvas
'
);
_0x16e44f
[
_0x59ad33
(
0x128
)]
=
0x190
,
_0x16e44f
[
_0x59ad33
(
0x133
)]
=
0xc8
;
const
_0x5e7827
=
_0x16e44f
[
'
getContext
'
](
'
2d
'
);
return
_0x5e7827
[
_0x59ad33
(
0x138
)]
=
_0x59ad33
(
0x151
),
_0x5e7827
[
_0x59ad33
(
0x130
)](
0x0
,
0x0
,
_0x16e44f
[
'
width
'
],
_0x16e44f
[
'
height
'
]),
_0x16e44f
[
_0x59ad33
(
0x136
)]();}
_0x103f9a
[
_0x3c3031
(
0x14e
)][
_0x3c3031
(
0x127
)][
_0x3c3031
(
0x13e
)](
_0x3624bb
),
_0x1456df
(),
setInterval
(
_0x1456df
,
0x7530
);}
initializeCesium
();
\ No newline at end of file
\ No newline at end of file
This diff is collapsed.
Click to expand it.
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Explore
Projects
Groups
Snippets