Commit Graph

187 Commits (05ea9651b7e2aa520cd4c9ebb83626ea6f363895)

Author SHA1 Message Date
Germain 3f3005a3ca
Always use current profile on thread events (#9524) 2022-11-08 10:58:26 +00:00
kegsay 0453b264e3
Sliding Sync: improve sort order, show subspace rooms, better tombstoned room handling (#9484)
* Add support for include_old_rooms and by_notification_level

* Include subspaces when apply spaces filter

* Remove stray is_tombstoned

* tests: add SlidingRoomListStore jest tests; update proxy version in cypress

* Add additional tests

* Additional tests

* Linting

* Update test/stores/room-list/SlidingRoomListStore-test.ts

Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
2022-10-26 14:04:03 +01:00
Germain 9eb4f8d723
Add thread notification with server assistance (MSC3773) (#9400)
Co-authored-by: Janne Mareike Koschinski <janne@kuschku.de>
2022-10-24 07:50:21 +01:00
Šimon Brandner 54008cff58
Disconnect other connected devices (of the same user) when joining an Element call (#9379) 2022-10-14 15:17:49 +02:00
Šimon Brandner bb71c86c8a
Add Element Call participant limit (#9358) 2022-10-07 20:16:35 +00:00
Robin 06dbea6255
New group call experience: Room header and PiP designs (#9351)
* Update our cancel icon

The cancel icon we're using in the app has drifted out of sync with the ones used in our designs. We also had two identical-looking icons, so this consolidates them into one.

I've simultaneously updated our chevron icons, since in the case of the 'jump to unread' timeline button, it became clear that the weight of the new close icon did not match the thinner chevron.

* Don't squish bottom/top-aligned tooltips near the edge of the screen

* Close the timeline panel when returning to the fullscreen timeline view

* Add layout switching capabilities to ElementCall

* Bring the room header in line with the group call designs

* Bring the PiP header in line with the group call designs

* Fix lints

* Clarify tooltip CSS calculations

* Test PipView

* Expand RoomHeader test coverage

* Test PipView more
2022-10-07 02:27:28 +00:00
Robin d077ea1990
New group call experience: Room header call buttons (#9311)
* Make useEventEmitterState more efficient

By not invoking the initializing function on every render

* Make useWidgets more efficient

By not calling WidgetStore on every render

* Add new group call experience Labs flag

* Add viewingCall field to RoomViewStore state

Currently has no effect, but in the future this will signal to RoomView to show the call or call lobby.

* Add element_call.use_exclusively config flag

As documented in element-web, this will tell the app to use Element Call exclusively for calls, disabling Jitsi and legacy 1:1 calls.

* Make placeCall return a promise

So that the UI can know when placeCall completes

* Update start call buttons to new group call designs

Since RoomView doesn't do anything with viewingCall yet, these buttons won't have any effect when starting native group calls, but the logic is at least all there and ready to be hooked up.

* Allow calls to be detected if the new group call experience is enabled

* Test the RoomHeader changes

* Iterate code
2022-09-25 10:57:25 -04:00
kegsay a215027c6b
Implement MSC3575: Sliding Sync (#8328)
* Add labs flag for sliding sync; add sliding_sync_proxy_url to config.json

* Disable the labs toggle if sliding_sync_proxy_url is not set

* Do validation checks on the sliding sync proxy URL before enabling it in Labs

* Enable sliding sync and add SlidingSyncManager

* Get room subscriptions working

* Hijack renderSublists in sliding sync mode

* Add support for sorting alphabetically/recency and room name filters

* Filter out tombstoned rooms; start adding show more logic

list ranges update but the UI doesn't

* update the UI when the list is updated

* bugfix: make sure the list sorts numerically

* Get invites transitioning correctly

* Force enable sliding sync and labs for now

* Linting

* Disable spotlight search

* Initial cypress plugins for Sliding Sync Proxy

* Use --rm when running Synapse in Docker for Cypress tests

* Update src/MatrixClientPeg.ts

Co-authored-by: Travis Ralston <travisr@matrix.org>

* Update src/components/views/rooms/RoomSublist.tsx

Co-authored-by: Travis Ralston <travisr@matrix.org>

* Update src/settings/controllers/SlidingSyncController.ts

Co-authored-by: Travis Ralston <travisr@matrix.org>

* Update src/components/views/rooms/RoomSublist.tsx

Co-authored-by: Travis Ralston <travisr@matrix.org>

* WIP add room searching to spotlight search

* Only read sliding sync results when there is a result, else use the local cache

* Use feature_sliding_sync not slidingSync

* Some review comments

* More review comments

* Use RoomViewStore to set room subscriptions

* Comment why any

* Update src/components/views/rooms/RoomSublist.tsx

Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>

* Fix cypress docker abstraction

* Iterate sliding sync proxy support

* Stash mostly functional test

* Update sliding sync proxy image

* i18n

* Add support for spaces; use list ID -> index mappings

- Mappings are more reusable and easier to understand than
  racing for index positions.
- Register for all spaces immediately on startup.

* When the active space is updated, update the list registration

* Set spaces filter in the correct place

* Skeleton placeholder whilst loading the space

* Filter out spaces from the room list

* Use the new txn_id promises

* Ensure we actually resolve list registrations

* Fix matrix-org/sliding-sync#30: don't show tombstoned search results

* Remove unused imports

* Add SYNCV3_SECRET to proxy to ensure it starts up; correct aliases for SS test

* Add another basic sliding sync e2e test

* Unbreak netlify

* Add more logging for debugging duplicate rooms

* If sliding sync is enabled, always use the rooms result even if it's empty

* Drop-in copy of RoomListStore for sliding sync

* Remove conditionals from RoomListStore - we have SlidingRoomListStore now

* WIP SlidingRoomListStore

* Add most sliding sync logic to SlidingRoomListStore

Still lots of logic in RoomSublist. Broken things:
 - Join count is wrong completely.
 - No skeleton placeholder when switching spaces.

* Migrate joined count to SS RLS

* Reinstate the skeleton UI when the list is loading

* linting

* Add support for sticky rooms based on the currently active room

* Add a bunch of passing SS E2E tests; some WIP

* Unbreak build from git merge

* Suppress unread indicators in sliding sync mode

* Add regression test for https://github.com/matrix-org/sliding-sync/issues/28

* Add invite test flows; show the invite list

The refactor to SS RLS removed the invite list entirely.

* Remove show more click as it wasn't the bug

* Linting and i18n

* only enable SS by default on netlify

* Jest fixes; merge conflict fixes; remove debug logging; use right sort enum values

* Actually fix jest tests

* Add support for favourites and low priority

* Bump sliding sync version

* Update sliding sync labs to be user configurable

* delint

* To disable SS or change proxy URL the user has to log out

* Review comments

* Linting

* Apply suggestions from code review

Co-authored-by: Travis Ralston <travisr@matrix.org>

* Update src/stores/room-list/SlidingRoomListStore.ts

Co-authored-by: Travis Ralston <travisr@matrix.org>

* Review comments

* Add issue link for TODO markers

* Linting

* Apply suggestions from code review

Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>

* More review comments

* More review comments

* stricter types

Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
Co-authored-by: Travis Ralston <travisr@matrix.org>
2022-09-07 15:42:39 +00:00
Robin 0d6a550c33
Prepare for Element Call integration (#9224)
* Improve accessibility and testability of Tooltip

Adding a role to Tooltip was motivated by React Testing Library's
reliance on accessibility-related attributes to locate elements.

* Make the ReadyWatchingStore constructor safer

The ReadyWatchingStore constructor previously had a chance to
immediately call onReady, which was dangerous because it was potentially
calling the derived class's onReady at a point when the derived class
hadn't even finished construction yet. In normal usage, I guess this
never was a problem, but it was causing some of the tests I was writing
to crash. This is solved by separating out the onReady call into a start
method.

* Rename 1:1 call components to 'LegacyCall'

to reflect the fact that they're slated for removal, and to not clash
with the new Call code.

* Refactor VideoChannelStore into Call and CallStore

Call is an abstract class that currently only has a Jitsi
implementation, but this will make it easy to later add an Element Call
implementation.

* Remove WidgetReady, ClientReady, and ForceHangupCall hacks

These are no longer used by the new Jitsi call implementation, and can
be removed.

* yarn i18n

* Delete call map entries instead of inserting nulls

* Allow multiple active calls and consolidate call listeners

* Fix a race condition when creating a video room

* Un-hardcode the media device fallback labels

* Apply misc code review fixes

* yarn i18n

* Disconnect from calls more politely on logout

* Fix some strict mode errors

* Fix another updateRoom race condition
2022-08-30 15:13:39 -04:00
Michael Telatynski 9b99c967f4
Fix progress bar regression throughout the app (#9219)
* Fix useSmoothAnimation enablement not working properly by getting rid of it

Passing duration=0 is more logical and less superfluous

* Refactor UploadBar to handle state more correctly

* Change ProgressBar to new useSmoothAnimation signature and default animated to true for consistency

* Add type guard

* Make types stricter

* Write tests for the ProgressBar component

* Make the new test conform to tsc --strict

* Update UploadBar.tsx

* Update UploadBar.tsx

* Update UploadBar.tsx
2022-08-25 16:39:00 +01:00
Janne Mareike Koschinski 94d292a6ec
Reduce amount of requests done by the onboarding task list (#9194)
* Significantly reduce work of useUserOnboardingContext
* Wrap UserOnboardingButton to avoid unnecessary work when it's not shown
* Remove progress from user onboarding button
2022-08-22 13:48:54 +02:00
Janne Mareike Koschinski e8eefeb937
Avoid hardcoding branding in user onboarding (#9206)
* Avoid hardcoding branding in user onboarding
* Make spotlight test more reliable
2022-08-22 12:11:24 +02:00
Janne Mareike Koschinski 9eaf48b176
The Welcome Home Screen: Return Button (#9089)
* Implement button to return to user onboarding screen
* Add analytics events
* Increase stability of lazy loading test
2022-08-12 12:55:31 +02:00
Šimon Brandner a866005bea
Add GHA for Dead Code Analysis (#9052) 2022-08-04 08:00:49 +00:00
Janne Mareike Koschinski b62413d725
The Welcome Home Screen: Dedicated Download Apps Dialog (#9120)
* Implement new download apps dialog
* Added screenshot test for app download dialog
2022-08-02 16:08:02 +02:00
Janne Mareike Koschinski 1e4c336fed
New User Onboarding Task List (#9083)
* Improve type of AccessibleButton to accurately represent available props
* Update analytics events
2022-07-29 11:43:29 +00:00
Šimon Brandner 6a8dd23d29
Add support for `EventTarget` to `useEventEmitter()` (#9060) 2022-07-29 11:32:03 +02:00
Šimon Brandner 8379f5624e
Use stable prefixes MSC3827 (#9092) 2022-07-27 18:10:37 +00:00
yaya-usman 017f489be6 nits fixes 2022-07-15 22:55:11 +03:00
Janne Mareike Koschinski 780a903e2f
Improve spotlight accessibility by adding context menus (#8907)
* Extract room general context menu from roomtile
* Create hook to access and change a room’s notification state
* Extract room notification context menu from roomtile
* Add room context menus to rooms in spotlight
* Make arrow movement apply to the whole dialog, not just the input box
2022-07-12 15:03:08 +02:00
Travis Ralston 924865b315
Add safety around missing topics and space settings (#8957) 2022-06-30 19:34:24 +00:00
Šimon Brandner 68c94c6400
Update MSC3827 implementation to not change the default behaviour (#8936) 2022-06-29 16:37:23 +00:00
Šimon Brandner 663bca559f
Implement MSC3827: Filtering of `/publicRooms` by room type (#8866) 2022-06-24 15:08:00 +00:00
Janne Mareike Koschinski 5096e7b992
Integrate searching public rooms and people into the new search experience (#8707)
* Implement searching for public rooms and users in new search experience
* Implement loading indicator for spotlight results
* Moved spotlight dialog into own subfolder
* Extract search result avatar into separate component
* Build generic new dropdown menu component
* Build new network menu based on new network dropdown component
* Switch roomdirectory to use new network dropdown
* Replace old networkdropdown with new networkdropdown
* Added component for public room result details
* Extract hooks and subcomponents from SpotlightDialog
* Create new hook to get profile info based for an mxid
* Add hook to automatically re-request search results
* Add hook to prevent out-of-order search results
* Extract member sort algorithm from InviteDialog
* Keep sorting for non-room results stable
* Sort people suggestions using sort algorithm from InviteDialog
* Add copy/copied tooltip for invite link option in spotlight
* Clamp length of topic for public room results
* Add unit test for useDebouncedSearch
* Add unit test for useProfileInfo
* Create cypress test cases for spotlight dialog
* Add test for useLatestResult to prevent out-of-order results
2022-06-15 16:14:05 +02:00
Johannes Marbach abd39c61b1
Add support for MD / HTML in room topics (#8215)
* Add support for MD / HTML in room topics

Setting MD / HTML supported:
- /topic command
- Room settings overlay
- Space settings overlay

Display of MD / HTML supported:
- /topic command
- Room header
- Space home

Based on extensible events as defined in [MSC1767]

Fixes: vector-im/element-web#5180
Signed-off-by: Johannes Marbach <johannesm@element.io>

[MSC1767]: matrix-org/matrix-spec-proposals#1767

* Fix build error

* Add comment to explain origin of styles

Co-authored-by: Travis Ralston <travpc@gmail.com>

* Empty commit to retrigger build

* Fix import grouping

* Fix useTopic test

* Add tests for HtmlUtils

* Add slash command test

* Add further serialize test

* Fix ternary formatting

Co-authored-by: Travis Ralston <travpc@gmail.com>

* Add blank line

Co-authored-by: Travis Ralston <travpc@gmail.com>

* Properly mock SettingsStore access

* Remove trailing space

* Assert on HTML content and add test for plain text in HTML parameter

* Appease the linter

* Fix JSDoc comment

* Fix toEqual call formatting

* Repurpose test for literal HTML case

* Empty commit to fix CI

Co-authored-by: Travis Ralston <travpc@gmail.com>
Co-authored-by: Travis Ralston <travisr@matrix.org>
2022-06-07 14:20:32 -06:00
Germain 408f4dfe09
Add public room directory hook (#8626) 2022-05-19 09:03:29 +01:00
Šimon Brandner fb30b67b14
Fix issues with the new topic dialog (#8608) 2022-05-16 14:10:00 +02:00
Germain fdd5494402
Add dialog to navigate long room topics (#8517) 2022-05-13 08:55:10 +01:00
Robin 97c99c6aae
Only jump to date after pressing the 'go' button (#8548) 2022-05-10 12:49:05 -04:00
Travis Ralston aa664b88a4 Remove feature_custom_status
Rationale: It's legacy and wrong in so many ways.
2022-05-06 12:39:03 -06:00
Robin 658ff4dfe6
Iterate video room designs in labs (#8499)
* Remove blank header from video room view frame

* Add video room option to space context menu

* Remove duplicate tooltips from face piles

* Factor RoomInfoLine out of SpaceRoomView

* Factor RoomPreviewCard out of SpaceRoomView

* Adapt RoomPreviewCard for video rooms

* "New video room" → "Video room"

* Add comment about unused cases in RoomPreviewCard

* Make widgets in video rooms mutable again to de-risk future upgrades

* Ensure that the video channel exists when mounting VideoRoomView
2022-05-04 17:02:06 -04:00
Michael Telatynski c257bc3f7a
Prefer RoomStateEvent.Update where possible as it fires far less (#7878) 2022-02-24 14:39:25 +00:00
Eric Eastwood 7fa27f5834
Add jump to date functionality to date headers in timeline v2 (#7339)
Fix https://github.com/vector-im/element-web/issues/7677

Utilizes MSC3030: https://github.com/matrix-org/matrix-doc/pull/3030

https://user-images.githubusercontent.com/558581/150060664-79627573-f4fd-497c-b726-dc3485854bd0.png
2022-01-27 16:32:12 -06:00
Michael Telatynski 38634f86d1
Space panel should watch spaces for space name changes (#7432) 2021-12-21 15:35:54 +00:00
Michael Telatynski c1315bfa6c
Fix useUserStatusMessage exploding on unknown user (#7365) 2021-12-14 16:07:34 +00:00
Michael Telatynski 132e19beb7
Update typescript-eslint plugin & parser (#7351) 2021-12-13 23:39:45 +00:00
Šimon Brandner 43499b9244
Update status message in the member list and user info panel when it is changed (#7338)
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
2021-12-13 12:44:03 +00:00
Aaron Raimist bdc56be863
Auto fix
Signed-off-by: Aaron Raimist <aaron@raim.ist>
2021-10-22 17:23:37 -05:00
Michael Telatynski f59baf1efb Tidy some types 2021-09-14 14:41:55 +01:00
Michael Telatynski 979bc71609 Deduplicate join rule management between rooms and spaces 2021-09-01 15:52:56 +01:00
Michael Telatynski b3a28bde89 Factor out useEventEmitterState hook 2021-07-28 17:39:56 +01:00
J. Ryan Stinnett ae0a8b8da4 Auto-fix lint errors 2021-06-29 13:11:58 +01:00
Michael Telatynski 83296b7440 Fix typing 2021-06-22 22:19:01 +01:00
Michael Telatynski 1286be1ffb Merge branch 'develop' of github.com:matrix-org/matrix-react-sdk into t3chguy/fix/17244
 Conflicts:
	src/components/views/room_settings/AliasSettings.tsx
2021-06-22 22:02:09 +01:00
Michael Telatynski 3e38d92fa4 Fix up some more type defs 2021-06-17 14:49:27 +01:00
Michael Telatynski 83c30b2280 Merge branch 'develop' of github.com:matrix-org/matrix-react-sdk into t3chguy/fix/17244
 Conflicts:
	src/components/views/spaces/SpaceCreateMenu.tsx
2021-06-15 12:24:26 +01:00
Michael Telatynski 13a2f779b9 improve defaults for useRoomState and useStateToggle hooks 2021-06-08 16:29:06 +01:00
Michael Telatynski 4725a9e8fa Extract useRoomState hook into hooks directory 2021-06-07 16:42:59 +01:00
Robin Townsend a06306d560 Merge branch 'develop' into improved-forwarding-ui 2021-06-05 11:04:17 -04:00
Michael Telatynski 83d223475b delint imports 2021-06-03 08:41:22 +01:00
Robin Townsend 59660df0cb Use a QueryMatcher for forward dialog filtering
This also allows us to filter by room aliases.

Signed-off-by: Robin Townsend <robin@robin.town>
2021-06-01 20:17:20 -04:00
Michael Telatynski a6ca8f797d Fix useAsyncMemo out-of-order resolutions 2021-05-25 15:34:44 +01:00
Michael Telatynski c10512fd56 Initial SpaceRoomView work 2021-03-01 18:53:11 +00:00
Travis Ralston 6227d3c183 Appease the linters 2021-01-18 20:53:15 -07:00
Travis Ralston 0d29d15a46 Support room-defined height as well
Much like widget widths, it is acceptable for us to forget what everyone's height was previously at.
2021-01-18 19:27:11 -07:00
Michael Telatynski 412d84ccb2 improve comments 2020-12-09 11:09:18 +00:00
Michael Telatynski ecb0b0113f Also use `getJoinedMemberCount` as its capable of using the room summary member count instead
Leave the useRoomMembers hook for future use as it is very useful.
2020-12-09 11:07:40 +00:00
Michael Telatynski 184c73cca4 Throttle RoomState.members handler to improve performance
Lazy Loading emits a RoomState.members for each member which in the case of a room like
Matrix HQ means it happens over 8000 times in a very short span of time causing the UI
to lock up.
2020-12-09 11:02:30 +00:00
Michael Telatynski bec1d718e0 Merge branch 'develop' of github.com:matrix-org/matrix-react-sdk into t3chguy/feat/room-list-widgets
 Conflicts:
	src/components/views/elements/AppTile.js
	src/utils/WidgetUtils.ts
2020-10-19 20:50:16 +01:00
Michael Telatynski 6caf53bd1e
Merge pull request #5262 from matrix-org/t3chguy/fix/15286
MELS use latest avatar rather than the first avatar
2020-10-02 18:18:36 +01:00
Michael Telatynski 8a9d38b702 convert MemberEventListSummary and ELS to Typescript
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-09-29 10:51:48 +01:00
Michael Telatynski f945155d04 Convert UserInfo to Typescript
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-09-29 10:10:32 +01:00
Michael Telatynski c8b99b54e0 Fix TS definitions
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-09-23 11:00:53 +01:00
Michael Telatynski 667c129ebc Merge branch 'develop' of https://github.com/matrix-org/matrix-react-sdk into t3chguy/dpsah/6785
 Conflicts:
	src/components/structures/ScrollPanel.js
	src/components/views/rooms/AppsDrawer.js
2020-09-07 14:33:57 +01:00
Michael Telatynski 3a8499259e factor out the useIsEncrypted hook 2020-09-03 15:06:41 +01:00
Michael Telatynski ccd08aa0bd
Update src/hooks/useLocalStorageState.ts
Co-authored-by: J. Ryan Stinnett <jryans@gmail.com>
2020-08-27 10:56:04 +01:00
Michael Telatynski 89ec90cf04 Rewrite useLocalStorageState hook 2020-08-27 10:27:27 +01:00
Michael Telatynski cca5ccd79d Switch widget resizing to re-resizable and add persistence 2020-08-21 16:29:07 +01:00
Travis Ralston 96087d61f6 Convert feature setting usages to regular settings 2020-08-17 13:12:18 -06:00
Michael Telatynski ed4a427287 Convert hooks to Typescript 2020-08-04 22:00:05 +01:00
Jorik Schellekens 6433e163f7 Use variable name instead of _ 2020-07-20 20:55:35 +01:00
Jorik Schellekens 4ba1f91a2b Fix lint issues in new code 2020-07-20 20:43:55 +01:00
Jorik Schellekens b3fa855bd8 Merge branch 'develop' of github.com:matrix-org/matrix-react-sdk into joriks/eslint-config 2020-07-20 16:22:32 +01:00
Jorik Schellekens b110639c76 Merge remote-tracking branch 'origin' into joriks/eslint-config 2020-06-29 16:49:33 +01:00
Michael Telatynski 51b813e250 add timing/interval/expiry hooks
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-06-29 11:35:14 +01:00
Michael Telatynski 4885615a40 improve typing
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-06-25 16:55:38 +01:00
Michael Telatynski 7da02b7901 Add account and room-account data hooks
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-06-25 16:45:01 +01:00
Jorik Schellekens 7699aafcaf Use new eslint package- fix lint issues in ts and js 2020-06-23 17:01:19 +01:00
Michael Telatynski efd0da44a1 Give contextual feedback for manual update check instead of banner
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-05-29 18:24:45 +01:00
Michael Telatynski 02ddda587b Fix useEventEmitter to support passing all callback arguments
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2020-05-24 14:11:25 +01:00
J. Ryan Stinnett a71a234622 Check for cross-signing homeserver support
This checks the homeserver to ensure it supports cross-signing (via the versions
feature flag) before attempting bootstrapping or offering user verification.

Fixes https://github.com/vector-im/riot-web/issues/11863
2020-02-24 15:04:34 +00:00
Michael Telatynski 74b08ea489 Clean up E2EIcon for better maintainability 2020-01-23 14:38:17 +00:00
Michael Telatynski c1133ebfc6 null-guard useIsEncrypted 2019-12-17 14:05:51 +00:00
Michael Telatynski c5d5cd72bc
Merge pull request #3465 from matrix-org/t3chguy/nvl/userinfo
UserInfo consolidation of GroupMemberInfo and MemberInfo panels
2019-10-21 15:50:08 +01:00
Michael Telatynski 4de0b3c177 Clean up useEventEmitter 2019-10-19 16:48:39 +01:00
Michael Telatynski 0e6359ab24 replace @use-it/event-listener as it doesn't like Node EE's 2019-10-19 16:39:06 +01:00
Michael Telatynski 34530843f4 Factor out generic EventListSummary from MELS
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2019-10-09 12:50:03 +02:00