Coder Social home page Coder Social logo

minetest-mapserver / mapserver Goto Github PK

View Code? Open in Web Editor NEW
94.0 10.0 20.0 25.17 MB

Minetest realtime mapserver, written in go

License: Other

Go 59.76% HTML 0.40% CSS 6.71% JavaScript 32.51% Dockerfile 0.07% PLpgSQL 0.16% Mathematica 0.24% Lua 0.15%
minetest mapserver map realtime golang

mapserver's People

Contributors

ainola avatar allcontributors[bot] avatar bmarwell avatar buckaroobanzay avatar catz85 avatar crocsg avatar cure avatar dennisjenkins75 avatar dependabot-preview[bot] avatar dependabot[bot] avatar imgbotapp avatar naturefreshmilk avatar niklp09 avatar nold360 avatar peternerlich avatar pyrollo avatar renovate-bot avatar renovate[bot] avatar shrimpza avatar thomasrudin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mapserver's Issues

Mapobject psql error

mapserver_1          | panic: pq: insert or update on table "object_attributes" violates foreign key constraint "object_attributes_objectid_fkey"
mapserver_1          |
mapserver_1          | goroutine 3975526 [running]:
mapserver_1          | mapserver/mapobject.(*Listener).OnEvent.func2(0x7, 0x6, 0x9)
mapserver_1          |  /server/mapobject/listener.go:104 +0x575
mapserver_1          | mapserver/mapblockparser.IterateMapblock(0xc00e4e82d0)
mapserver_1          |  /server/mapblockparser/iterate.go:7 +0x41
mapserver_1          | mapserver/mapobject.(*Listener).OnEvent(0xc0002302e0, 0xbe6794, 0x11, 0xb45e00, 0xc03e7f5800)
mapserver_1          |  /server/mapobject/listener.go:86 +0x385
mapserver_1          | mapserver/eventbus.(*Eventbus).Emit(0xc000094c80, 0xbe6794, 0x11, 0xb45e00, 0xc03e7f5800)
mapserver_1          |  /server/eventbus/eventbus.go:35 +0xd3
mapserver_1          | mapserver/mapblockaccessor.(*MapBlockAccessor).GetMapBlock(0xc00008b8f0, 0xc023c66460, 0x0, 0x0, 0x0)
mapserver_1          |  /server/mapblockaccessor/get.go:60 +0x48f
mapserver_1          | mapserver/mapblockrenderer.(*MapBlockRenderer).Render(0xc000197880, 0xc007e51f60, 0xc007e51f80, 0x0, 0x0, 0x0)
mapserver_1          |  /server/mapblockrenderer/renderer.go:177 +0xc24
mapserver_1          | mapserver/tilerenderer.(*TileRenderer).renderImage(0xc00055a000, 0xc0178cdaa0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
mapserver_1          |  /server/tilerenderer/renderer.go:128 +0x53a
mapserver_1          | mapserver/tilerenderer.(*TileRenderer).renderImage(0xc00055a000, 0xc06d022ca0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
mapserver_1          |  /server/tilerenderer/renderer.go:169 +0xc9e
mapserver_1          | mapserver/tilerenderer.(*TileRenderer).Render(0xc00055a000, 0xc06d022ca0, 0xc00e4e9d28, 0x1, 0x1, 0x0, 0x0)
mapserver_1          |  /server/tilerenderer/renderer.go:52 +0x42
mapserver_1          | mapserver/tilerendererjob.worker(0xc0001be000, 0xc00e3ae180, 0xc0133e60e0)
mapserver_1          |  /server/tilerendererjob/worker.go:22 +0x384
mapserver_1          | created by mapserver/tilerendererjob.renderMapblocks
mapserver_1          |  /server/tilerendererjob/common.go:29 +0x102

docker build pipeline

Architecture/Platform:

  • x86/Linux
  • x86_64/Linux
  • x86/Windows
  • x86_64/Windows
  • arm32/Linux

Placing a smartshop cause mapserver crash

Traceback :

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x782af8]

goroutine 13 [running]:
mapserver/mapobjectdb/sqlite.(*Sqlite3Accessor).AddMapData(0xc000469860, 0x0, 0x3, 0xb)
	/app/mapobjectdb/sqlite/mapobjects.go:74 +0x58
mapserver/mapobject.(*Listener).OnEvent.func1(0x1, 0x3, 0xb)
	/app/mapobject/setup.go:70 +0x54a
mapserver/mapblockparser.IterateMapblock(0xc0000d16e0)
	/app/mapblockparser/iterate.go:7 +0x41
mapserver/mapobject.(*Listener).OnEvent(0xc0004699e0, 0xad8850, 0x11, 0xa4bb20, 0xc0004063c0)
	/app/mapobject/setup.go:53 +0x274
mapserver/eventbus.(*Eventbus).Emit(0xc00017ef20, 0xad8850, 0x11, 0xa4bb20, 0xc0004063c0)
	/app/eventbus/eventbus.go:35 +0xcc
mapserver/mapblockaccessor.(*MapBlockAccessor).FindMapBlocksByMtime(0xc00017ef40, 0x5c5ff0c8, 0x3e8, 0xc00014a120, 0x1, 0x1, 0x7593ca, 0xc00014e180, 0xc000054d18)
	/app/mapblockaccessor/mapblockaccessor.go:102 +0x762
mapserver/tilerendererjob.incrementalRender(0xc000149110, 0xc0000a0540)
	/app/tilerendererjob/incremental.go:28 +0x26a
mapserver/tilerendererjob.Job(0xc000149110)
	/app/tilerendererjob/job.go:35 +0x186
created by main.main
	/app/main.go:61 +0x303

v1.0.1 does not display map correctly

Hi there, I've just switched to v1.0.1 this morning and while the program feels stable and generates images, it does not display any images when navigating to the site. Just a grayish background. All the leaflet artifacts show up properly though, so I wonder if its an issue with reading the images.

I've also tried by removing the v1.0.0 generated tile folder and sqlite file... The new tile folder contained newly generated images, but still the website only displayed a grayish background with no images at any zoom level.

Smartshop not displaying

They don't get collected/parsed:

mapserver=# select * from object_attributes where value = 'smartshop';
 objectid | key | value 
----------+-----+-------
(0 rows)

ES6 Errors

Various

TypeError: L.AwesomeMarkers is undefinedPoiOverlay.js:9:5

Content-type issues

Die Ressource von "https://test.pandorabox.io/map/css/leaflet.aewsome-markers.css" wurde wegen eines MIME-Typ-Konfliktes ("text/plain") blockiert (X-Content-Type-Options: nosniff)

fancyvend mapobject

panic: runtime error: index out of range

goroutine 28 [running]:
mapserver/mapobject.(*FancyVend).onMapObject(0x12db3f8, 0xf, 0x6, 0xc, 0xc02fcf63c0, 0xc02fcf6a00)
        /app/mapobject/fancyvend.go:29 +0xfeb
mapserver/mapobject.(*Listener).OnEvent.func2(0xf, 0x6, 0xc)
        /app/mapobject/listener.go:95 +0x4cf
mapserver/mapblockparser.IterateMapblock(0xc0000cd830)
        /app/mapblockparser/iterate.go:7 +0x41
mapserver/mapobject.(*Listener).OnEvent(0xc000134680, 0xba1a0e, 0x11, 0xb05040, 0xc02fcf63c0)
        /app/mapobject/listener.go:82 +0x3a6
mapserver/eventbus.(*Eventbus).Emit(0xc00000dcc0, 0xba1a0e, 0x11, 0xb05040, 0xc02fcf63c0)
        /app/eventbus/eventbus.go:35 +0xcc
mapserver/mapblockaccessor.(*MapBlockAccessor).FindNextLegacyBlocks(0xc00000dce0, 0xc83ec0, 0xc000163130, 0xc00000e038, 0x1, 0x1, 0x2710, 0xc0073fec40, 0x0, 0x0)
        /app/mapblockaccessor/legacyblocks.go:54 +0x507
mapserver/tilerendererjob.initialRender(0xc0001be000)
        /app/tilerendererjob/initial.go:21 +0x17c
mapserver/tilerendererjob.Job(0xc0001be000)
        /app/tilerendererjob/job.go:17 +0xa7
created by main.main
        /app/main.go:68 +0x31d

Websocket crash

mapserver_1          | 2019/03/18 19:00:44 http: panic serving 172.30.0.9:39922: runtime error: invalid memory address or nil pointer dereference
mapserver_1          | goroutine 46736 [running]:
mapserver_1          | net/http.(*conn).serve.func1(0xc0117f30e0)
mapserver_1          | 	/usr/lib/go-1.12/src/net/http/server.go:1769 +0xc9
mapserver_1          | panic(0xb408e0, 0x1330f80)
mapserver_1          | 	/usr/lib/go-1.12/src/runtime/panic.go:522 +0x1b5
mapserver_1          | github.com/gorilla/websocket.(*Conn).WriteMessage(0x0, 0x1, 0xc0986384c0, 0x3e, 0x40, 0x0, 0xcef0e0)
mapserver_1          | 	/root/go/pkg/mod/github.com/gorilla/[email protected]/conn.go:742 +0x37
mapserver_1          | mapserver/web.(*WS).ServeHTTP(0xc000226d40, 0xcfa820, 0xc04df649a0, 0xc04d982b00)
mapserver_1          | 	/server/web/ws.go:72 +0x1ba
mapserver_1          | net/http.(*ServeMux).ServeHTTP(0xc0001299c0, 0xcfa820, 0xc04df649a0, 0xc04d982b00)
mapserver_1          | 	/usr/lib/go-1.12/src/net/http/server.go:2375 +0x1d6
mapserver_1          | net/http.serverHandler.ServeHTTP(0xc0001421a0, 0xcfa820, 0xc04df649a0, 0xc04d982b00)
mapserver_1          | 	/usr/lib/go-1.12/src/net/http/server.go:2774 +0xab
mapserver_1          | net/http.(*conn).serve(0xc0117f30e0, 0xcfbae0, 0xc084e98f00)
mapserver_1          | 	/usr/lib/go-1.12/src/net/http/server.go:1878 +0x84c
mapserver_1          | created by net/http.(*Server).Serve
mapserver_1          | 	/usr/lib/go-1.12/src/net/http/server.go:2884 +0x2f4

POI blocks

after placing a poi block and filling out the form, the icon did show up on the map after several minutes, digging the poi block to remove it the icon stayed, i could not see any way to remove it, after much searching for any documentation on how to use these nodes with no luck i tried placing the node again and resetting the form then removing the node and still the icon remains... however after refreshing the web page the icon did get removed, for some reason it seams the page was not updated correctly or automatically ...

Minetest 5.1.0-dev
Firefox Web Browser

also wanted to mention that when setting up the server with the mapserver in active mode, i got a curl fetch error with code 0 every few seconds, i had to add the mapserver mod to the trusted mods list and restart the server to get the mapserver mod to work correctly, nothing of this is mentioned in any of the documentation for setting the mapserver up. :)

SeLinux interrupts docker build

FYI - for those of us using CentOS, / Fedora / RedHat or other systems which have selinux, the docker build doesn't work out of the box. Selinux does its job blocking processes that it doesn't know about. Various errors appear in the audit log:

$ ausearch -m avc -i
...
type=AVC msg=audit(02/26/2019 14:54:48.647:503) : avc:  denied  { unlink } for  pid=11033 comm=go name=mapserver-linux-x86_64-go-tmp-umask dev="dm-2" ino=13634944 scontext=system_u:system_r:container_t:s0:c496,c697 tcontext=system_u:object_r:user_home_t:s0 tclass=file permissive=1

In the above case, I allowed the run by temporarily setting SeLinux to permissive mode:

sudo setenforce 0

And of course, later by setting it back to enforcing:

sudo setenforce 1

There is probably a better way to deal with this permission issue. At the moment this will do for me.

Getting a out of memory error...

I have it set up but when starting it I get this:

INFO[0000] Starting mapserver                            version=3.0.0
INFO[0000] Loading default colors                        filename=/colors.txt prefix=colormapping size=704276 useLocal=false
INFO[0000] Loaded default colors                         count=16109
INFO[0000] Migrating database                            filename=mapserver.sqlite prefix=mapobjectdb.sqlite
INFO[0000] Migration completed                           elapsed=4.229358ms prefix=mapobjectdb.sqlite
INFO[0000] Starting http server                          port=8080 webdev=false
INFO[0000] Starting initial rendering job               
fatal error: runtime: out of memory

Any ideas?

Realtime updates in the frontend

Placement

  • POI, Travelnets, Labels, etc (base-class: AbstractIconOverlay.js)
  • Trainlines, Protectors, Borders, etc (base-class: AbstractGeoJsonOverlay.js)
  • Trains
  • Players

Modification

  • POI, Travelnets, Labels, etc (base-class: AbstractIconOverlay.js)
  • Trainlines, Protectors, Borders, etc (base-class: AbstractGeoJsonOverlay.js)
  • Trains
  • Players

Removal

  • POI, Travelnets, Labels, etc (base-class: AbstractIconOverlay.js)
  • Trainlines, Protectors, Borders, etc (base-class: AbstractGeoJsonOverlay.js)
  • Trains
  • Players

Initial rendering crash (postgres conflict)

mapserver_1          | time="2019-03-22T14:13:05Z" level=error msg="AddMapData()" mbpos="&{-173 1 60}" obj="&{0xc0fabf33e0 -2758 26 960 protector 1553263984 map[owner:Peanut]}" prefix=mapobject type="protector:protect2" x=10 y=10 z=0
mapserver_1          | panic: pq: insert or update on table "object_attributes" violates foreign key constraint "object_attributes_objectid_fkey"
mapserver_1          |
mapserver_1          | goroutine 10816125 [running]:
mapserver_1          | mapserver/mapobject.(*Listener).OnEvent.func2(0xa, 0xa, 0x0)
mapserver_1          |  /server/mapobject/listener.go:127 +0x972
mapserver_1          | mapserver/mapblockparser.IterateMapblock(0xc02e4ba2d0)
mapserver_1          |  /server/mapblockparser/iterate.go:7 +0x41
mapserver_1          | mapserver/mapobject.(*Listener).OnEvent(0xc0001e74c0, 0xbe70fe, 0x11, 0xb46720, 0xc038e977c0)
mapserver_1          |  /server/mapobject/listener.go:98 +0x385
mapserver_1          | mapserver/eventbus.(*Eventbus).Emit(0xc00000f5e0, 0xbe70fe, 0x11, 0xb46720, 0xc038e977c0)
mapserver_1          |  /server/eventbus/eventbus.go:35 +0xd3
mapserver_1          | mapserver/mapblockaccessor.(*MapBlockAccessor).GetMapBlock(0xc0001d0240, 0xc0fabf33e0, 0x0, 0x0, 0x0)
mapserver_1          |  /server/mapblockaccessor/get.go:60 +0x48f
mapserver_1          | mapserver/mapblockrenderer.(*MapBlockRenderer).Render(0xc0001e70c0, 0xc0f984f040, 0xc0f984f060, 0x0, 0x0, 0x0)
mapserver_1          |  /server/mapblockrenderer/renderer.go:177 +0xc24
mapserver_1          | mapserver/tilerenderer.(*TileRenderer).renderImage(0xc00028e940, 0xc03902b840, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
mapserver_1          |  /server/tilerenderer/renderer.go:128 +0x53a
mapserver_1          | mapserver/tilerenderer.(*TileRenderer).renderImage(0xc00028e940, 0xc013bc2f60, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
mapserver_1          |  /server/tilerenderer/renderer.go:169 +0xc9e
mapserver_1          | mapserver/tilerenderer.(*TileRenderer).Render(0xc00028e940, 0xc013bc2f60, 0xc02e4bbd28, 0x1, 0x1, 0x0, 0x0)
mapserver_1          |  /server/tilerenderer/renderer.go:52 +0x42
mapserver_1          | mapserver/tilerendererjob.worker(0xc0000f6100, 0xc06906d1a0, 0xc062879180)
mapserver_1          |  /server/tilerendererjob/worker.go:22 +0x384
mapserver_1          | created by mapserver/tilerendererjob.renderMapblocks
mapserver_1          |  /server/tilerendererjob/common.go:29 +0x102
mapserver=# select * from objects where posx = -2758;
 id | x | y | z | posx | posy | posz | type | mtime 
----+---+---+---+------+------+------+------+-------
(0 rows)

mapserver=# select * from objects where x = -2758;
  id  |   x   | y  |  z  | posx | posy | posz |   type    |   mtime    
------+-------+----+-----+------+------+------+-----------+------------
 6558 | -2758 | 26 | 960 | -173 |    1 |   60 | protector | 1553263985
(1 row)

mapserver=# select * from object_attributes where objectid = 6558;
 objectid |  key  | value  
----------+-------+--------
     6558 | owner | Peanut
(1 row)

3D Streetview

Options:

  • "Webcam" mapobject with fixed location and direction
  • Free view across the map

Open questions:

  • Cache mapblocks on mapserver

Building error

find . -name '*.go' | xargs -I % sed -i -e 's,mapserver/,github.com/thomasrudin-mt/mapserver/,g' %

Crash 'out of memory'

Hi there,

I'm running release version 1.0.0 mapserver-linux-x86_64 and it crashes with "fatal error: runtime: out of memory"

  • It used up to around 1Gbs and there were still over 4Gbs free.

  • My server uses a postgresql backend.

Just to add a bit of information: The map generation appeared to be going very well and I could tell that it was more than halfway done from the site that it was generating.

Label mapobject

  • Text
  • Size
  • Orientation

Open questions:

  • Display on which zoom-levels?

Layer crash

mapserver_1          | time="2019-03-30T06:08:11Z" level=error msg="mapblock outside of layer!" pos="&{-16 317 160}" zoom=12
mapserver_1          | panic: mapblock outside of layer!
mapserver_1          | 
mapserver_1          | goroutine 71 [running]:
mapserver_1          | mapserver/tilerendererjob.renderMapblocks(0xc0001c8000, 0xc020074000, 0x12e0, 0x1400, 0x4)
mapserver_1          |  /server/tilerendererjob/common.go:49 +0xab8
mapserver_1          | mapserver/tilerendererjob.initialRender(0xc0001c8000)
mapserver_1          |  /server/tilerendererjob/initial.go:41 +0x1df
mapserver_1          | mapserver/tilerendererjob.Job(0xc0001c8000)
mapserver_1          |  /server/tilerendererjob/job.go:17 +0xa4
mapserver_1          | created by main.main
mapserver_1          |  /server/main.go:68 +0x3e7

Uable to run on Raspberry PI (ARM)

Downloaded the mapserver-linux-arm, placed it in the world folder im running (worlds\Server_417).
Ran the chmod 755 ./mapserver command in the worlds folder (worlds\Server_417)
Then i get this message, chmod: cannot access './mapserver': No such file or directory
So im not sure whats going wrong.

Displaying players on the map with mapserver mod

Getting this error back from the servermapper:

ERRO[1230] Json unmarshal error="json: cannot unmarshal number 11.0 into Go struct field Player.breath of type int" prefix=mapobjectdb

Which appears to return a 500 error back to the mod:

2019-02-25 16:46:14: ACTION[Server]: Mod performs HTTP request with URL http://127.0.0.1:8080/api/minetest
2019-02-25 16:46:14: ERROR[CurlFetch]: http://127.0.0.1:8080/api/minetest not found (HTTP response code said error) (response code 500)

Isometric view

  • 1 tile == 1 tilted mapblock at base y
  • 30° tilt
  • Leaflet custom CRS
  • rectangular tiles

How does it increment the map?

Hi, This is not a problem but a question regarding the internal functionality. I've finished with the initial rendering of my map and now its doing incremental rendering. However, its taking a long time to do the incremental and I don't really see any live changes.

NOTE: I had to stop the 'initial rendering' for a few days due to a bug which caused the mapper to crash. I'm on the latest development branch as of today and its working well right now.

This got me thinking and I started looking at the mtime column on the database. If that keeps track of the changed and updated blocks, how does it know when it last got rendered on the map? Shouldn't there be a 'dirty' field which keeps track?

UPDATE: Starting to update live now. :)

Postgres map migration crashes (collection)

mapserver_1                | panic: runtime error: slice bounds out of range
mapserver_1                |
mapserver_1                | goroutine 68 [running]:
mapserver_1                | mapserver/mapblockparser.parseMetadata(0xc02962ce80, 0xc02022180e, 0x380c, 0x380c, 0x0, 0x0, 0x0)
mapserver_1                |    /server/mapblockparser/metadata.go:98 +0x15aa
mapserver_1                | mapserver/mapblockparser.Parse(0xc020221000, 0x401a, 0x401a, 0x16916c9ed07, 0xc023a0cec0, 0x0, 0x0, 0x0)
mapserver_1                |    /server/mapblockparser/parse.go:64 +0x31f
mapserver_1                | mapserver/mapblockaccessor.(*MapBlockAccessor).FindNextLegacyBlocks(0xc00009f8e0, 0xc85600, 0xc000087280, 0xc00001e4a0, 0x2, 0x2, 0x2710, 0xc008ac6500, 0x0, 0x0)
mapserver_1                |    /server/mapblockaccessor/legacyblocks.go:49 +0x4ac
mapserver_1                | mapserver/tilerendererjob.initialRender(0xc0001bc000)
mapserver_1                |    /server/tilerendererjob/initial.go:21 +0x17c
mapserver_1                | mapserver/tilerendererjob.Job(0xc0001bc000)
mapserver_1                |    /server/tilerendererjob/job.go:17 +0xa7
mapserver_1                | created by main.main
mapserver_1                |    /server/main.go:68 +0x31d

metadata crash

mapserver_1          | time="2019-03-22T14:51:14Z" level=error msg=mapblock-pars err="metadata too short: 293664, valuelength: 1920099694" x=309 y=0 z=4
mapserver_1          | panic: metadata too short: 293664, valuelength: 1920099694
mapserver_1          |
mapserver_1          | goroutine 57 [running]:
mapserver_1          | mapserver/tilerendererjob.initialRender(0xc0001c4000)
mapserver_1          |  /server/tilerendererjob/initial.go:24 +0x63f
mapserver_1          | mapserver/tilerendererjob.Job(0xc0001c4000)
mapserver_1          |  /server/tilerendererjob/job.go:17 +0xa4
mapserver_1          | created by main.main
mapserver_1          |  /server/main.go:68 +0x3cd

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.