Second iteration of unofficial wykop.pl client for Android, written in Kotlin.
Entries/Links | Details | Profile |
---|---|---|
![]() |
![]() |
![]() |
Light | Dark | Amoled |
---|---|---|
![]() |
![]() |
![]() |
Customize Behavior | Customize Appearance |
---|---|
![]() |
![]() |
See Contributing guidelines
This project forked from feelfreelinux/wykopmobilny
Unofficial wykop.pl client for Android [Revived]
License: MIT License
Second iteration of unofficial wykop.pl client for Android, written in Kotlin.
Entries/Links | Details | Profile |
---|---|---|
![]() |
![]() |
![]() |
Light | Dark | Amoled |
---|---|---|
![]() |
![]() |
![]() |
Customize Behavior | Customize Appearance |
---|---|
![]() |
![]() |
See Contributing guidelines
Android 13
Pixel 6 Pro
Wykop Mobilny v1.2.26
App cannot be granted any permissions = unable to download images/videos + unable to attach images/videos
Fatal Exception: java.lang.IllegalStateException: Can't access the Fragment View's LifecycleOwner when getView() is null i.e., before onCreateView() or after onDestroyView()
at androidx.fragment.app.Fragment.getViewLifecycleOwner(Fragment.java:361)
at io.github.wykopmobilny.utils.FragmentViewBindingDelegate.getValue(FragmentViewBindingDelegate.java:51)
at io.github.wykopmobilny.base.BaseLinksFragment.getBinding(BaseLinksFragment.java:27)
at io.github.wykopmobilny.base.BaseLinksFragment.addItems(BaseLinksFragment.java:90)
at io.github.wykopmobilny.ui.modules.profile.links.added.ProfileLinksPresenter.loadAdded$lambda-0(ProfileLinksPresenter.java:30)
at io.github.wykopmobilny.ui.modules.profile.links.added.ProfileLinksPresenter.$r8$lambda$a6f8o_-dz9eLyiB4ry27npLNTmU(ProfileLinksPresenter.java)
at io.github.wykopmobilny.ui.modules.profile.links.added.ProfileLinksPresenter$$InternalSyntheticLambda$15$6ea1c0e473f6133682114ec56dbddd0ac4a61c201aea626265edea53fa0d2a6d$0.accept(ProfileLinksPresenter.java:6)
at io.reactivex.internal.observers.ConsumerSingleObserver.onSuccess(ConsumerSingleObserver.java:62)
at io.reactivex.internal.operators.single.SingleObserveOn$ObserveOnSingleObserver.run(SingleObserveOn.java:81)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:124)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:8107)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.
These updates have all been created already. Click a checkbox below to force a retry/rebase of any.
com.google.dagger:dagger-android-processor
, com.google.dagger:dagger-compiler
, com.google.dagger:dagger-android-support
, com.google.dagger:dagger
)These are blocked by an existing closed PR and will not be recreated unless you click a checkbox below.
.github/workflows/default.yml
actions/checkout v3
actions/setup-java v3
gradle/wrapper-validation-action v1
gradle/gradle-build-action v2
codecov/codecov-action v3
actions/upload-artifact v3
actions/upload-artifact v3
actions/cache v3
actions/checkout v3
actions/setup-java v3
gradle/gradle-build-action v2
reactivecircus/android-emulator-runner v2
actions/upload-artifact v3
actions/upload-artifact v3
actions/checkout v3
actions/setup-java v3
actions/setup-python v4
gradle/gradle-build-action v2
reactivecircus/android-emulator-runner v2
actions/upload-artifact v3
.github/workflows/dependencies.yml
actions/checkout v3
actions/setup-java v3
gradle/gradle-build-action v2
usefulness/dependency-tree-diff-action v1
peter-evans/find-comment v2
peter-evans/create-or-update-comment v3
.github/workflows/publish_release.yml
actions/checkout v3
actions/setup-java v3
gradle/gradle-build-action v2
actions/upload-artifact v3
softprops/action-gh-release v0.1.15
.github/workflows/run_diffuse.yml
actions/checkout v3
actions/setup-java v3
gradle/gradle-build-action v2
actions/cache v3
peter-evans/find-comment v2
peter-evans/create-or-update-comment v3
actions/upload-artifact v3
gradle.properties
settings.gradle
org.gradle.toolchains.foojay-resolver-convention 0.6.0
com.gradle.enterprise 3.13.4
com.pablisco.gradle.auto.include 1.3
build.gradle
app/build.gradle
com.google.firebase:firebase-bom 32.1.1
com.android.tools:desugar_jdk_libs 2.0.3
org.ocpsoft.prettytime:prettytime 4.0.6.Final
io.reactivex.rxjava2:rxandroid 2.1.1
io.reactivex.rxjava2:rxjava 2.2.21
com.jakewharton.threetenabp:threetenabp 1.4.6
common/kotlin-helpers/build.gradle
common/screenshot-test-helpers/build.gradle
com.thedeanda:lorem 2.1
junit:junit 4.13.2
data/cache/api/build.gradle
data/cache/sqldelight/build.gradle
data/framework/android/build.gradle
data/framework/api/build.gradle
data/github/api/build.gradle
data/github/remote/build.gradle
data/scraper/api/build.gradle
data/scraper/remote/build.gradle
data/storage/android/build.gradle
data/storage/api/build.gradle
data/work/android/build.gradle
data/work/api/build.gradle
data/wykop/api/build.gradle
data/wykop/remote/build.gradle
domain/build.gradle
gradle/libs.versions.toml
androidx.appcompat:appcompat 1.6.1
androidx.constraintlayout:constraintlayout 2.1.4
com.google.android.material:material 1.9.0
androidx.swiperefreshlayout:swiperefreshlayout 1.1.0
androidx.recyclerview:recyclerview 1.3.0
androidx.preference:preference-ktx 1.2.0
androidx.work:work-runtime-ktx 2.8.1
androidx.work:work-testing 2.8.1
com.squareup.okhttp3:okhttp 4.11.0
com.squareup.okhttp3:mockwebserver 4.11.0
androidx.browser:browser 1.5.0
com.facebook.shimmer:shimmer 0.5.0
androidx.viewpager2:viewpager2 1.0.0
androidx.core:core-ktx 1.10.1
androidx.activity:activity-ktx 1.7.2
androidx.fragment:fragment-ktx 1.6.0
androidx.fragment:fragment-testing 1.6.0
androidx.cardview:cardview 1.0.0
androidx.annotation:annotation 1.6.0
androidx.exifinterface:exifinterface 1.3.6
androidx.startup:startup-runtime 1.1.1
com.dropbox.mobile.store:store4 4.0.5
androidx.datastore:datastore-preferences 1.0.0
org.jsoup:jsoup 1.16.1
com.github.usefulness:slidr 3.0.0
com.github.chrisbanes:PhotoView 2.3.0
com.davemorrissey.labs:subsampling-scale-image-view-androidx 3.10.0
com.squareup.leakcanary:leakcanary-android 2.12
org.jetbrains:markdown 0.4.1
io.github.aakira:napier 2.6.1
com.google.android.exoplayer:exoplayer 2.19.0
com.google.android.exoplayer:extension-okhttp 2.19.0
androidx.lifecycle:lifecycle-livedata-ktx 2.6.1
androidx.lifecycle:lifecycle-viewmodel-ktx 2.6.1
androidx.lifecycle:lifecycle-common-java8 2.6.1
androidx.paging:paging-common-ktx 3.1.1
androidx.paging:paging-runtime 3.1.1
com.google.dagger:dagger 2.46.1
com.google.dagger:dagger-android-support 2.46.1
com.google.dagger:dagger-compiler 2.46.1
com.google.dagger:dagger-android-processor 2.46.1
com.squareup.moshi:moshi 1.15.0
com.squareup.moshi:moshi-kotlin-codegen 1.15.0
com.squareup.sqldelight:android-driver 1.5.5
com.squareup.sqldelight:coroutines-extensions-jvm 1.5.5
com.squareup.retrofit2:retrofit 2.9.0
com.squareup.retrofit2:converter-moshi 2.9.0
pl.droidsonroids.retrofit2:converter-jspoon 1.3.2
com.github.bumptech.glide:glide 4.15.1
com.github.bumptech.glide:okhttp3-integration 4.15.1
com.github.bumptech.glide:compiler 4.15.1
org.jetbrains.kotlinx:kotlinx-coroutines-core 1.7.2
org.jetbrains.kotlinx:kotlinx-coroutines-android 1.7.2
org.jetbrains.kotlinx:kotlinx-coroutines-rx2 1.7.2
org.jetbrains.kotlinx:kotlinx-datetime 0.4.0
io.github.usefulness:screenshot-testing-core 0.16.12
io.github.usefulness:screenshot-testing-plugin 0.16.12
com.android.tools:common 31.0.2
com.android.tools.build:gradle 8.0.2
androidx.test:core-ktx 1.5.0
androidx.test:runner 1.5.2
androidx.test:rules 1.5.0
androidx.test.ext:junit-ktx 1.1.5
androidx.arch.core:core-testing 2.2.0
androidx.test.espresso:espresso-core 3.5.1
androidx.test.espresso:espresso-contrib 3.5.1
androidx.test.espresso:espresso-intents 3.5.1
androidx.test.espresso:espresso-accessibility 3.5.1
androidx.test.espresso:espresso-idling-resource 3.5.1
org.junit.jupiter:junit-jupiter-api 5.9.3
org.junit.jupiter:junit-jupiter-engine 5.9.3
com.osacky.doctor 0.8.1
com.starter.easylauncher 6.2.0
org.jetbrains.kotlin.jvm 1.9.0
com.starter.config 0.62.0
com.starter.versioning 0.62.0
com.starter.library.android 0.62.0
com.starter.library.kotlin 0.62.0
com.google.gms.google-services 4.3.15
com.google.firebase.crashlytics 2.9.6
com.slack.keeper 0.14.0
pl.droidsonroids.animation-disabler 1.0.9
com.squareup.sqldelight 1.5.5
com.google.devtools.ksp 1.9.0-1.0.11
gradle/plugins/settings.gradle
org.gradle.toolchains.foojay-resolver-convention 0.6.0
gradle/plugins/build.gradle
ui/base/android/build.gradle
ui/base/api/build.gradle
ui/blacklist/android/build.gradle
ui/blacklist/api/build.gradle
ui/components/entries/android/build.gradle
ui/components/entries/api/build.gradle
ui/components/widgets/android/build.gradle
ui/components/widgets/api/build.gradle
ui/link-details/android/build.gradle
ui/link-details/api/build.gradle
ui/login/android/build.gradle
ui/login/api/build.gradle
ui/notifications/android/build.gradle
ui/notifications/api/build.gradle
ui/profile/android/build.gradle
ui/profile/api/build.gradle
ui/promoted/android/build.gradle
ui/promoted/api/build.gradle
ui/search/android/build.gradle
ui/search/api/build.gradle
ui/settings/android/build.gradle
ui/settings/api/build.gradle
ui/styles/android/build.gradle
ui/styles/api/build.gradle
ui/two-factor/android/build.gradle
ui/two-factor/api/build.gradle
gradle/wrapper/gradle-wrapper.properties
gradle 8.2.1
.python-version
python 3.11.4
Fatal Exception: java.util.NoSuchElementException: Key interface wb.b (Kotlin reflection is not available) is missing in the map.
at kotlin.collections.MapsKt__MapWithDefaultKt.getOrImplicitDefaultNullable(MapsKt__MapWithDefaultKt.java:24)
at kotlin.collections.MapsKt__MapsKt.getValue(MapsKt__MapsKt.java:344)
at kotlin.collections.MapsKt.getValue(MapsKt.java)
at io.github.wykopmobilny.WykopApp.launchScoped(WykopApp.java:204)
at io.github.wykopmobilny.ui.base.AppScopes$DefaultImpls.launchScoped$default(AppScopes.java:14)
at io.github.wykopmobilny.domain.search.GetSearchDetailsQuery$searchResultsFlow$2$1$1.invoke(GetSearchDetailsQuery.java:70)
at io.github.wykopmobilny.domain.search.GetSearchDetailsQuery$searchResultsFlow$2$1$1.invoke(GetSearchDetailsQuery.java:60)
at io.github.wykopmobilny.ui.modules.search.SearchFragment$onCreateOptionsMenu$1$1$1.invokeSuspend(SearchFragment.java:74)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(BaseContinuationImpl.java:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.java:104)
at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoopImplBase.java:274)
at kotlinx.coroutines.BlockingCoroutine.joinBlocking(BlockingCoroutine.java:85)
at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(BuildersKt__BuildersKt.java:59)
at kotlinx.coroutines.BuildersKt.runBlocking(BuildersKt.java:1)
at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(BuildersKt__BuildersKt.java:38)
at kotlinx.coroutines.BuildersKt.runBlocking$default(BuildersKt.java:1)
at io.github.wykopmobilny.ui.modules.search.SearchFragment.onCreateOptionsMenu$lambda-2$lambda-1(SearchFragment.java:74)
at io.github.wykopmobilny.ui.modules.search.SearchFragment.$r8$lambda$H50KXyIFr6ge8ij_8xEWO8A8O3E(SearchFragment.java)
at io.github.wykopmobilny.ui.modules.search.SearchFragment$$InternalSyntheticLambda$0$5eb42e0b76a94504c3e17f9c51866683b3932e1c0b06e3182e6ab6bcbebf00a3$0.onItemClick(SearchFragment.java:8)
at android.widget.AutoCompleteTextView.performCompletion(AutoCompleteTextView.java:1071)
at android.widget.AutoCompleteTextView.access$600(AutoCompleteTextView.java:101)
at android.widget.AutoCompleteTextView$DropDownItemClickListener.onItemClick(AutoCompleteTextView.java:1414)
at android.widget.AdapterView.performItemClick(AdapterView.java:330)
at android.widget.AbsListView.performItemClick(AbsListView.java:1187)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3179)
at android.widget.AbsListView$3.run(AbsListView.java:4097)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7664)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
```
Hej.
Proponuję dodać dodatkowe godziny w gorących dyskusjach. Coś podobnego jak w poniższym skrypcie.
Strona "Gorące dyskusje" często nie ładuje wpisów z ostatnich 6 i więcej godzin, szczególnie gdy mamy zablokoway tag np. #mecz.
W przeglądarce ze skryptem wystarczy kliknąć wpisy z ostatnich 3 lub 1 godziny i pojawiają się wpisy.
Proponuję dodać godziny 1, 2, 3.
https://greasyfork.org/en/scripts/376239-wykop-dodatkowe-godziny
I should see the image attached
Nothin happens
Happens on Android 11 and up
https://www.wykop.pl/wpis/60855797/owm-otwartywykopmobilny-mireczki-tez-macie-problem/
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
at android.widget.Toast.makeText(Toast.java:307)
at io.github.wykopmobilny.ui.modules.notificationslist.BaseNotificationsListFragment.showReadToast(BaseNotificationsListFragment.java:66)
at io.github.wykopmobilny.ui.modules.notificationslist.hashtags.HashTagsNotificationsListPresenter.readNotifications$lambda-2(HashTagsNotificationsListPresenter.java:40)
at io.github.wykopmobilny.ui.modules.notificationslist.hashtags.HashTagsNotificationsListPresenter.$r8$lambda$2n4QFXZKOm5HPg8upw211qzi6G0(HashTagsNotificationsListPresenter.java)
at io.github.wykopmobilny.ui.modules.notificationslist.hashtags.HashTagsNotificationsListPresenter$$InternalSyntheticLambda$12$2943d38850feb971ac288e4d496a1ba9b0958362bd5d1124c2b576f559182be0$0.accept(HashTagsNotificationsListPresenter.java:4)
at io.reactivex.internal.observers.ConsumerSingleObserver.onSuccess(ConsumerSingleObserver.java:62)
at io.reactivex.internal.operators.single.SingleObserveOn$ObserveOnSingleObserver.run(SingleObserveOn.java:81)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:124)
at android.os.Handler.handleCallback(Handler.java:907)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7625)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
... to a separate compilation unit
Please add support for Bitwarden 2FA when app Bitwarden is installed alongside wykop-mobilny
Bitwarden should be recognised by wykop-mobilny app.
Does not work.
... to a separate compilation unit
Create a memory leak
As a developer I get notified about memory leaks
There are no notifications
The app should report memory leaks
Have all Microblog entries on the first page blacklisted
Pagination works
App show endless progress
Pictures/wykopmobilny/udostepnione
folder on the deviceIt should not exist
It exists
https://www.wykop.pl/wpis/60879873/jak-wylaczyc-automatyczne-zapisywanie-udostepniany/
I don't want to recompile login related code on each app run
Open https://www.wykop.pl/wpis/59389933/byl-bombelek-nie-ma-bombelka-dzieci-madka-wypadek/
App should not crash
App crashes with
Fatal Exception: java.lang.IllegalStateException: cannot make a new request because the previous response is still open: please call response.close()
at okhttp3.internal.connection.RealCall.enterNetworkInterceptorExchange(RealCall.java:229)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:66)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:109)
at io.github.wykopmobilny.api.ApiSignInterceptor.intercept(ApiSignInterceptor.java:71)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:109)
at io.github.wykopmobilny.wykop.remote.AppKeyReplacingInterceptor.intercept(AppKeyReplacingInterceptor.java:26)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:109)
at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.java:201)
at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.java:517)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
🤷
Try to update app via Google Play Store or F-Droid
App should be in one of these stores.
It isn't.
Because app was removed from Google Play Store I think it's good idea to publish app in F-Droid (preferred F-Droid or IzzyOnDroid Repo, if rules are too restrictive to own repo).
Fatal Exception: java.lang.IllegalStateException: Drag shadow dimensions must be positive
at android.view.View.startDragAndDrop(View.java:26357)
at android.widget.Editor.startDragAndDrop(Editor.java:1332)
at android.widget.Editor.performLongClick(Editor.java:1367)
at android.widget.TextView.performLongClick(TextView.java:12484)
at android.view.View.performLongClick(View.java:7504)
at android.view.View$CheckForLongPress.run(View.java:28263)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at androidx.test.espresso.base.Interrogator.loopAndInterrogate(Interrogator.java:10)
at androidx.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:7)
at androidx.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:1)
at androidx.test.espresso.base.UiControllerImpl.loopMainThreadForAtLeast(UiControllerImpl.java:8)
at androidx.test.espresso.action.Tap$2.sendTap(Tap.java:6)
at androidx.test.espresso.action.GeneralClickAction.perform(GeneralClickAction.java:4)
at androidx.test.espresso.ViewInteraction$SingleExecutionViewAction.perform(ViewInteraction.java:2)
at androidx.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:21)
at androidx.test.espresso.ViewInteraction.-$$Nest$mdoPerform(ViewInteraction.java)
at androidx.test.espresso.ViewInteraction$1.call(ViewInteraction.java:2)
at androidx.test.espresso.ViewInteraction$1.call(ViewInteraction.java:1)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7660)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
for all 3 themes
Log in to an 2FA-enabled account
Logging in works with username/e-mail, password and the TOTP code (one time).
The app should just ask for username/e-mail + password, and send them in the POST request, as the docs say here (they list all possible fields, not all required): https://www.wykop.pl/dla-programistow/apiv2docs/package/Login/#pLogin_Index
App asks for the 2FA code twice.
The app opens the Wykop Connect webview, which asks for the username/e-mail, password and 2FA, but because it uses the special appkey, it ends up requiring TOTP code twice.
The Kiner appkey, which is used by this app, is a special key - while Wykop Connect seems to works on it, this is one of at least 4 keys (Android, iOS, Mikroblog+ Android, Mikroblog+ iOS) that are not being used with Wykop Connect, and the apps which are supposed to be working with these keys show a native dialog for user credentials.
Alternatives to consider:
Just start app to see 503 error, this is caused by recent wikop 2.0 change
Uses material you colors
... to a separate compilation unit + possibly remove the library avilable on jcenter only
Proszę dodać możliwość pobrania pliku apk.
There is an error with this repository's Renovate configuration that needs to be fixed. As a precaution, Renovate will stop PRs until it is resolved.
Location: renovate.json
Error type: The renovate configuration file contains some invalid settings
Message: Invalid configuration option: includeForks
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.