WEBVTT

00:00.000 --> 00:21.860
Alright, so we now have Ruben who's going to tell us his war stories about rewriting

00:21.860 --> 00:26.860
and things in rust and take it away.

00:26.860 --> 00:28.860
Thank you.

00:28.860 --> 00:31.860
Could we have some quiet?

00:31.860 --> 00:36.860
Okay, thank you.

00:36.860 --> 00:39.860
Alright, let's get started.

00:39.860 --> 00:46.860
So I'm going to talk about rewriting system software in rust.

00:46.860 --> 00:51.860
And to this point, some of you, I'm just going to talk about none.

00:51.860 --> 00:59.860
And then finally around 2017, I had my first commercial project, which was a map server binding

00:59.860 --> 01:06.860
to rust and map server is this mapping software where you can sort of make your own Google maps.

01:06.860 --> 01:09.860
So that's pretty cool.

01:09.860 --> 01:13.860
And then from that point on, it sort of became bigger and bigger and bigger.

01:13.860 --> 01:29.860
So then finally, in January of 2022, we got our first open source project that we could actually do for rust.

01:29.860 --> 01:36.860
Our company already worked with all of this open source software, but that was the first time that we actually made something new.

01:36.860 --> 01:40.860
And it was sort of because COVID and work was a little bit slow.

01:41.860 --> 01:43.860
Well, let's do some open source development.

01:43.860 --> 01:56.860
So we got this grant from the AnilNet Foundation, where we were out to make a PTP prototype, precision time protocol, which is a time synchronization protocol.

01:56.860 --> 02:08.860
And then around April of that year, we got into contact with Prostimo from the Internet Security Research Group, the Let's Encrypt People, to implement NTP in rust,

02:08.860 --> 02:13.860
is the other time synchronization protocol, isn't that a coincidence.

02:13.860 --> 02:19.860
And then finally, in December of that same year, I started to reach out again.

02:19.860 --> 02:27.860
And we were allowed to make a sudo implementation in rust together with the folks from Fair Systems in Berlin.

02:27.860 --> 02:31.860
And that was a real fun project to do as well.

02:31.860 --> 02:34.860
So we had some work for a couple of months.

02:34.860 --> 02:45.860
And then finally, in August of 2023, we got a massive grant from the sovereign tech friends, which is a German government-ish-based organization.

02:45.860 --> 02:48.860
These days they're called the sovereign tech agency.

02:48.860 --> 02:54.860
For our NTP and PTP work together in a project that we called pendulum.

02:54.860 --> 02:59.860
And then finally, in April of 2024, we were like, well, this is getting quite a lot.

02:59.860 --> 03:02.860
Let's make it into a non-profit foundation.

03:02.860 --> 03:05.860
And that is what my shirt is all about.

03:05.860 --> 03:07.860
It's the Fairfax tech foundation.

03:07.860 --> 03:13.860
So all of our open source work is now in a non-profits organization.

03:13.860 --> 03:16.860
So what then does Fairfax accurately do?

03:16.860 --> 03:20.860
So we have sort of four main things that we do.

03:20.860 --> 03:26.860
First, we have time synchronizations or the pendulum project, the PTP and NTP work.

03:26.860 --> 03:29.860
Then we have the privilege boundary, which is sue.

03:29.860 --> 03:33.860
Then we have data compression, which is ZLIP and BZIP.

03:33.860 --> 03:44.860
And we have a smart grid protocol, which is open leader, which is automatic demand response protocol for the power grid.

03:44.860 --> 03:55.860
And then we have sort of two sort of secondary things, which is TTRS, which is our education project, where you have an open source university education course.

03:55.860 --> 03:57.860
Which you can try out.

03:57.860 --> 04:05.860
And then finally, we have this sort of site project born out of ZLIP, mostly, where we want to make Rust faster than C.

04:05.860 --> 04:15.860
Because sometimes there are these edge cases, especially with ZLIP, where Rust's code gen isn't quite the same as we can do with C.

04:15.860 --> 04:19.860
So there are still something to be gained there.

04:19.860 --> 04:27.860
And our tech line is sort of then open infrastructure software for the public interest.

04:27.860 --> 04:40.860
So what is system software? And I looked up on Wikipedia and Wikipedia system software is software designed to provide a platform for other software, which is a little bit vague.

04:40.860 --> 04:47.860
And I don't really have a good definition of what system software is, so it's going to stay a little bit vague.

04:47.860 --> 04:54.860
But I say generally, system software is a little bit low level software, it's not like a web page or something.

04:54.860 --> 05:01.860
And generally, it's relatively low overhead and generally relatively high performance.

05:01.860 --> 05:15.860
And then most of the time, you're sort of implementing protocols, algorithms and formats, like NTP, PTP, ZLIP is a format and then sudo, it doesn't really fit into any of these.

05:15.860 --> 05:19.860
So apparently it's not just this, it's more than that.

05:19.860 --> 05:27.860
So it's got something to do with a little bit more foundational software for your system.

05:27.860 --> 05:34.860
So why did we pick all of these projects that I just showed you on the previous slides?

05:34.860 --> 05:37.860
And basically the main thing here is it's got to be interesting.

05:37.860 --> 05:44.860
It's got to be something that's going to be fun to do for a long time because this is something that we want to keep on doing for a longer time.

05:44.860 --> 05:54.860
So not just something where it's like just earn some money and then just put it out there and then not maintain it anymore.

05:54.860 --> 06:01.860
This is got to be something that's going to stay up for a longer time and it's got to be relevant for a longer time.

06:01.860 --> 06:06.860
So what if you were to do this for your own?

06:07.860 --> 06:14.860
I'd say like we'll just start with the projects with the most buffer overflow issues, right?

06:14.860 --> 06:25.860
And I mean sure you can do that but it's also quite limiting because it's not just buffer overflows where the rest is better than the rest.

06:25.860 --> 06:28.860
It's a little bit more than that.

06:28.860 --> 06:34.860
And also if you try and do this too much then you might turn into the rest evangelism strike force.

06:34.860 --> 06:40.860
And that's something where you can get some irritation by some people if you do that too much.

06:40.860 --> 06:52.860
So like don't turn into this crow that's that's someone saying something and then have you tried rosts.

06:52.860 --> 06:54.860
It's memory safety you know.

06:54.860 --> 06:56.860
So do a little bit better than that.

06:56.860 --> 07:04.860
So just rewriting and rost is not enough is my sort of statement here because she got to be careful about those negatives.

07:04.860 --> 07:10.860
Because every time you just say I'm just going to rewrite it in rust and then everyone's going to have to deal with that.

07:10.860 --> 07:15.860
You're splitting communities because maybe not everyone likes that you're writing it in rust.

07:15.860 --> 07:19.860
And maybe not everyone wants you to write it in rust.

07:19.860 --> 07:22.860
And then also users won't see those changes.

07:22.860 --> 07:27.860
If you're just rewriting in rust and then they'll think oh this part is just two kinds of things.

07:27.860 --> 07:35.860
So for example entropy if we are at the IATF and to be working group the average age is about 60 or something.

07:35.860 --> 07:43.860
And then we're trying to bring that age a little bit down because this is important so far that everyone is relying on everyone wants their computers to have the current time.

07:43.860 --> 07:54.860
But then if all the people that are working on this are slowly aging to the end of their working life then yeah you're sort of starting to get a bit of a trouble there.

07:54.860 --> 08:03.860
And there's also other pieces such as the sudo software is developed by one single person and one single person only and everyone's relying on this tool.

08:03.860 --> 08:08.860
But there's only basically one person who knows how this software works.

08:08.860 --> 08:15.860
So again something where I would say that's not a good situation to be in.

08:15.860 --> 08:21.860
Other things to look at is does that project have a history of security issues.

08:21.860 --> 08:28.860
I'm not just memory safety issues but security issues in general because security issues don't just have to be memory issues.

08:28.860 --> 08:32.860
There can be lots of security issues.

08:32.860 --> 08:42.860
So if a project has security issues quite often then probably there's something fundamental going on and maybe the rest types system are the rest.

08:42.860 --> 08:47.860
Like way of thinking about things can actually help in that specific domain.

08:47.860 --> 09:02.860
The other thing to also note there is is if you have unstructured code bases where things are just randomly going through and maybe again the rest type system is something that can help or the rest way of doing things.

09:02.860 --> 09:11.860
And the final thing I'd note here is that all of these projects are not specifically related to rest because all of these things are about system utilities.

09:11.860 --> 09:26.860
That are meant for like the whole computer as the whole computer and operating system as a whole and not specifically something that's related to rest.

09:26.860 --> 09:33.860
So let's say we found that magical project that could use some rest.

09:33.860 --> 09:43.860
The first thing I'd say is do you already know like the entire problem space are you aware of all the intricacies in that specific problem space.

09:43.860 --> 10:00.860
Because if you're not then just start a hobby like start to enjoy this stuff because otherwise you're going to burn out at some points and then like you created some code and then this is just going to live on get up and then no one's going to look at it and that's not great.

10:00.860 --> 10:15.860
I mean it helps you learn stuff but if your goal is that you want to evolve the ecosystem and then just making some code on get up is not enough I will say at least.

10:15.860 --> 10:23.860
And the other thing I'd say is even if you think well breasts fine just let it exist and I don't really care about it.

10:23.860 --> 10:38.860
I'd still say encourage people to try do something with rest because encouraging those people might also encourage those people to enjoy to join your ecosystem of your specific protocol or algorithm or whatever.

10:38.860 --> 10:43.860
So it's sort of widening your user base.

10:43.860 --> 11:08.860
And make sure when when you're looking at this to look at competing implementations as well look at every implementation that's there be where do if you're working on something with like GPL and you're thinking oh I'm going to write this in MIT and then you might run into some licensing issues as well so like there's caveats.

11:08.860 --> 11:20.860
So this is sort of my business side here is saying well we have to think about something other than just memory safety type safety.

11:20.860 --> 11:28.860
We have to think about this unique selling point for our new implementation for this protocol idea or whatever.

11:28.860 --> 11:35.860
So we have to find some unique selling points and this is very business speak but sure.

11:35.860 --> 11:47.860
Because we we respore on us we we really enjoy our type safety and our memory safety but that's not something users looked at all the features that were in sudo which is quite a lot.

11:47.860 --> 12:00.860
It might be surprising because I did notice I just thought it's a way to get to root but it does like a thousand things it has a thousand features and then maybe some of those features were not necessary for almost everyone.

12:00.860 --> 12:12.860
And we kind of chose to limit the number of features that that were in our implementation but still made it usable for almost everyone that uses sudo in a daily basis.

12:12.860 --> 12:25.860
And then for anspdrs for example we focus on network time security that which is a secured variant of network the network time protocol which is completely unscured and uninterrupted and whatever.

12:25.860 --> 12:32.860
So there's again a focus on something specific other than the rest programming language.

12:32.860 --> 12:37.860
Or maybe you could focus on performance because that's something that rs can do.

12:37.860 --> 12:42.860
But maybe then add a little bit of fun safe even though that was the thing that you shouldn't do.

12:42.860 --> 12:51.860
Maybe that little bit of unsafe can actually make your program faster and if you can explain your little bit of unsafe away then sure maybe that's fine.

12:51.860 --> 12:58.860
So for example in Z Flip we use a lot of simply instructions which are unsafe.

12:58.860 --> 13:03.860
But we can explain why we need those specific instructions to make it fast.

13:03.860 --> 13:08.860
So we can sort of explain why this is okay to do.

13:08.860 --> 13:18.860
And of course if you're thinking about performance then make sure that you actually verify those things and you create some benchmarks and of course there is always problems with benchmarks.

13:18.860 --> 13:25.860
But like have some proof that you're actually fast.

13:25.860 --> 13:29.860
Another thing we could do is focus on stability and stability.

13:29.860 --> 13:31.860
I can sort of see that in two ways.

13:31.860 --> 13:35.860
Maybe think about memory leaks because for us doesn't protect against memory leaks.

13:35.860 --> 13:40.860
If you can just leak a box and then it's gone and doesn't get cleaned up.

13:40.860 --> 13:45.860
And there are lots of other ways in which you could leak memory because that's not a memory safety issue.

13:45.860 --> 13:59.860
But it is a stability issue because if you keep on leaking memory for our process that's supposed to long for run for a long time then well you run into problems and users get irritated that your software isn't great.

13:59.860 --> 14:05.860
So maybe that's something you can focus on and show that actually this thing can run stable for a long time.

14:05.860 --> 14:09.860
Which could look at this in another way in stable APIs.

14:09.860 --> 14:17.860
You can have APIs that maybe don't change for a long time and you know that this API is going to be there always and you can trust on it.

14:17.860 --> 14:30.860
Which is for example the way we did it in Z Flip where our C interface or the C interface that already existed for is that the poor a very long time is the primary interface but which you use at the press.

14:30.860 --> 14:37.860
So that sort of guarantees that we have a stable interface and that won't change for a long time.

14:37.860 --> 14:52.860
And for NSPDRS we very quickly started working toward a one point over release where we had stability guarantees about which parameters and which functions were stable in the whole project.

14:53.860 --> 15:05.860
So focus on your strength and use that strength to help others even if that other project is not written in Rust because that sort of makes the whole ecosystem better and not just your project.

15:05.860 --> 15:18.860
That's what I think this is all about like Rust is all about making things better and the only way to make things better sometimes is to even look at those other implementation even if they're in C and make sure that they also get better.

15:18.860 --> 15:30.860
So for example with NSPD we want to make sure that C implementation support the same protocols as we do so everyone can use that network time secured.

15:30.860 --> 15:43.860
And basically be to change you want to you want to see make sure that that you show the way to make things better and then other people can adopt your way of changing things.

15:43.860 --> 15:50.860
So help those other implementation and document what works in your implementation what doesn't work in your implementation.

15:50.860 --> 16:02.860
Another way to look at focuses for example are NSPD and PCP implementations both have different algorithm for basically determining the time offset.

16:02.860 --> 16:13.860
And that offset is that that algorithm is something new compared to the rest of the ecosystem because it's sort of self-learning a little bit it's not AI.

16:13.860 --> 16:15.860
I'd say it's not AI.

16:15.860 --> 16:23.860
But it's self-learning it's tuning automatically based on the environment and that's something that our NTP and PTP implementations don't have.

16:23.860 --> 16:30.860
So that's something where we can say we understand this problem domain and we thought aware of like algorithm choices and such.

16:30.860 --> 16:36.860
We were just implementing the protocol itself and just doing whatever was needed to get to get this started.

16:36.860 --> 16:47.860
And then after a while we learned sort of ways in which we could improve the situation and that's where our own algorithm came into play.

16:47.860 --> 16:51.860
And that sort of changed a little bit our unique selling point.

16:51.860 --> 16:53.860
So take some time.

16:53.860 --> 16:54.860
So no rush.

16:54.860 --> 16:59.860
Don't worry about all this publishing on Chris so that I know and making sure that's releases.

16:59.860 --> 17:11.860
Just focus on like sort of going through all this code and going through all these algorithms and let this flow a little bit and take some time and no rush.

17:11.860 --> 17:15.860
I mean get a person going anywhere crazy so they're always not going anywhere.

17:15.860 --> 17:17.860
Don't worry.

17:18.860 --> 17:32.860
So while you're working on your projects I do have a couple of ways in which I want to take some points of attention here specifically documentation dependencies and distribution.

17:32.860 --> 17:34.860
So first documentation.

17:34.860 --> 17:39.860
Okay there's a little bit of first code here.

17:39.860 --> 17:49.860
So obviously you have this for bit missing docs and for bits and documents that say unsafe block so all your code is perfectly documented so you have your documentation in place right.

17:49.860 --> 17:53.860
You don't need anymore documentation.

17:53.860 --> 18:01.860
And you have I don't know you maybe have duct tests and written in every case so you can even see examples of how to use this code but.

18:01.860 --> 18:10.860
I would say that's fine that's that's great that's reference guide that's that's the rest of you for you.

18:10.860 --> 18:27.860
But that's not what users use because users use like a book like the programming language which is like the thing that you used to get started with rest before you look at the reference documentation before you look at which methods are available at a vector.

18:27.860 --> 18:34.860
You need to understand what this language is all about and that's the same for your project as well because users.

18:34.860 --> 18:49.860
Sort of understand the global principle of your your piece of software but they don't understand the specific implementation details and the documentation that rest of the rights is all about implementation details I'd say.

18:49.860 --> 18:56.860
So you need other stuff you need examples you need tutorials you need a high level guide you need sort of reference guides for.

18:56.860 --> 19:04.860
The actual like usage of your program and that's other documentation than just rest dogs.

19:04.860 --> 19:18.860
So that's something where I think you need to take care of that stuff to make your project like the best project it can be and also to show other people like what your project is actually doing.

19:18.860 --> 19:27.860
And then dependencies that's that's not a thing that we sort of had to find out because dependencies solve problems that.

19:27.860 --> 19:35.860
So so we don't have to do it ourselves so we can just take in a dependency and that will solve a certain problem and then we just use some code from them.

19:35.860 --> 19:47.860
And the rest ecosystem does offer a lot of libraries that we can use but they're all of varying quality and varying ways in which you like sort of know what the dependency is all about.

19:47.860 --> 19:58.860
But if you're a new project I'd say just use everything you can because you need to focus on getting your problem solved first before you're focusing on these kind of things.

19:58.860 --> 20:06.860
But then after a while you're a nice stack of boxes turns into this like horrible or library or whatever.

20:07.860 --> 20:16.860
And that also means that you have to trust all of those people and if you look at just a small project you probably have hundreds of people were sort of secrets.

20:16.860 --> 20:27.860
Collaborators with your project and yeah that there's a certain risk there.

20:27.860 --> 20:39.860
Something that you need to be aware of like can I trust these people and is this something that I want to have in my own program.

20:39.860 --> 20:43.860
So you have to take all of that into consideration.

20:43.860 --> 20:54.860
For example in in suitu we had this this password prompt library but that password prompt library was never used in a context where suitu is used where suitu runs as a set UID binary.

20:54.860 --> 21:03.860
Which is a binary that you can call and then it runs as roots or as the user that the the binary zone by even though you yourself are not root.

21:03.860 --> 21:23.860
So that's sort of a scary context to run in so you need to be aware that all those libraries that you're using are actually aware that they're running in that context and generally library authors are not aware of that because like who who's going to think that they're going to run as a set UID library no one's going to think that.

21:23.860 --> 21:38.860
That's why for at least two or us we basically removed almost every dependency that we had and we now only have four which are like log and something like lipstick or something so like very basic dependencies only because.

21:38.860 --> 21:48.860
All of these dependency authors and we can't like I don't blame them because I can't expect everyone to run in a set UID context.

21:48.860 --> 21:57.860
So that's something where our use case differ from all of those library use cases and we had to reevaluate all the dependencies that we had included initially.

22:01.860 --> 22:08.860
So dependencies trusting is nice but verifying is better.

22:08.860 --> 22:23.860
You can use tooling like cargo vet to make sure that all of those dependencies are actually audited that someone has actually looked at the changes since the last time and you can do that yourself you basically have to do that yourself.

22:23.860 --> 22:52.860
We can also sort of share the load with other people so especially the people from Mozilla do this a lot day they basically every dependency that they have they they audited and then they sort of added to their list of what it dependencies and then you can sort of say well I trust Mozilla to do the right thing and I'll pull in everything that they verified and then I can add my own verification on top of that and then I can sort of build this web of trust of dependencies.

22:53.860 --> 23:03.860
And there's another thing about dependencies and that's about the distribution story and this is where I'm sort of going off a little bit.

23:03.860 --> 23:11.860
And if you're working with Linux and one of the targets for your Linux based program is going to be deviant.

23:11.860 --> 23:29.860
And deviant chooses to package each individual dependency just one version as a source package on deviant which means that all of the libraries all of the programs that that are posted on deviant all of to share the same version.

23:29.860 --> 23:36.860
Of that specific library which means that you're sharing the same version with all of the other tools that deviant wants to grab and pull in to there.

23:36.860 --> 23:52.860
So that's something that you need to be aware of and it's not specifically to call a deviant that there are way of packaging things is weird or something because that's just the way that deviant works that's just the way that you have to do with stuff.

23:52.860 --> 24:07.860
But I'd say that's fine because like I see the distributions that eventually take apart software as sort of our contributors as well because they eventually are ending up putting their software into their distribution.

24:07.860 --> 24:15.860
It's not my distribution, it's their distribution and they have their ways of working there and we sort of have to accept that that's just the way that they work.

24:15.860 --> 24:23.860
If I want to get my user-based as large as possible, that's just what I have to deal with as a software package maintainer.

24:23.860 --> 24:35.860
And like I might think that maybe the rest way of doing things is better and maybe I do think that, but I still have to deal with this.

24:35.860 --> 24:49.860
So again that's something where you just need to be aware and just need to know that these kinds of things happen all of these distributions have their own sort of ways in which they want to do stuff and I need to accept that.

24:49.860 --> 24:51.860
This is the way that they actually do stuff.

24:51.860 --> 24:56.860
We made by just supporting the widest ecosystems so I need to support all of these different distribution.

24:56.860 --> 25:06.860
I need to support all of them because then I have the widest install base and I can get the widest usage of my package.

25:06.860 --> 25:14.860
But still you probably want to push to create so they are because lots of the things still still want to use great so they are as their source.

25:14.860 --> 25:33.860
But then whoops, my crate is not available because someone decided that NTPDRS is perfectly a great name and then we'll just register NTPDRS and then you look at the source of the package and there's just like 10 lines of code in there because someone decided, well it was just a great idea and then they dropped it.

25:33.860 --> 25:45.860
And that's sort of maybe a little bit irritating because then you're like, but I actually made it instead of you just pushing 10 lines of code but I'm just giving a lot of our name I'd say.

25:45.860 --> 25:56.860
And that can be harder than you might think because NTPDRS is a pretty generic name, it's just NTPDRS.

25:56.860 --> 26:13.860
But we tried to change the name, we tried to think of new names but that's sort of fails because we were getting into this phase where we're thinking names up by committee sort of everyone voted for their favorite name and then eventually like no one could agree on what what was then the perfect name for this thing.

26:13.860 --> 26:19.860
So we just contacted the person who owned the package name and they said sure I'll transfer it to you and the program was gonna wait.

26:19.860 --> 26:34.860
So but it helps if you have something to show because we only did this once we had like a working thing we actually could show that we had NTP so far.

26:34.860 --> 26:37.860
So in the end after all this you need to build a trust.

26:37.860 --> 26:43.860
You need to build a trust with users, with contributors, with dependency maintainers, but also with downstream maintainers.

26:43.860 --> 27:00.860
All of these people, all of these different people with all of these different goals and ideas, you all need to show to all of those people that you're reliable partner that you have the knowledge to like sort of get this working.

27:00.860 --> 27:09.860
And then like this this is something that takes time because there's no way around this you need to show that that you can do this for a longer time.

27:09.860 --> 27:20.860
And the one thing I would specifically add here is that you need to have a way to handle security issues.

27:20.860 --> 27:28.860
You need even if you just set up a simple email address that's fine or if you set up like get up advisories or something at that time.

27:28.860 --> 27:38.860
But you need to have a way to let users know there is security issue and you need to have a way to contact you about security issues without creating a public issue.

27:38.860 --> 27:42.860
So you can actually fix the thing before everyone knows about it.

27:42.860 --> 27:48.860
So that's the one thing I would really advise you to do something.

27:48.860 --> 27:55.860
So we picked that project that needed rust, rewrite it in rust treatment.

27:55.860 --> 27:58.860
We found something to focus on that uniquely identified our project.

27:58.860 --> 28:01.860
We iterated and created the best software package ever.

28:01.860 --> 28:04.860
We made the best documentation ever surely.

28:04.860 --> 28:08.860
We limited trusted and verified all of our dependencies.

28:08.860 --> 28:11.860
We distributed the software to the wideest audience possible.

28:11.860 --> 28:16.860
We've communicated to everyone so everyone's now really trust us.

28:17.860 --> 28:20.860
So what are you waiting for?

28:22.860 --> 28:25.860
Any questions?

28:34.860 --> 28:42.860
I just remind people to remind people to not get up and make loads of noise leaving until the questions are over thanks.

28:46.860 --> 28:53.860
Hello, thank you.

28:53.860 --> 28:58.860
How can the rust community avoid to run into the maintenance problems?

28:58.860 --> 29:01.860
Let's say after the height.

29:01.860 --> 29:05.860
I mean the question of course is if rust is really high for not.

29:05.860 --> 29:07.860
I'd say it's not.

29:07.860 --> 29:11.860
It's actually something that really shows that it works.

29:11.860 --> 29:15.860
But other than that this is I'd say it's mostly a funding problem.

29:15.860 --> 29:19.860
Like we're doing this as a company and as a foundation.

29:19.860 --> 29:23.860
Like we're not running this as individual users.

29:23.860 --> 29:29.860
But we're running this as like a company with more people than just one.

29:29.860 --> 29:31.860
And that's sort of our way in trying this with eventually.

29:31.860 --> 29:35.860
This is just a funding problem and I don't have the answer to a funding problem.

29:35.860 --> 29:37.860
There is a funding difference tomorrow.

29:37.860 --> 29:41.860
So maybe they have more answers to that.

29:45.860 --> 29:54.860
Everybody knows the story.

29:54.860 --> 29:57.860
Everyone should trust that it will do the right thing.

29:57.860 --> 30:00.860
But then it turned out that it didn't do the right thing.

30:00.860 --> 30:05.860
Because no one looked at it.

30:05.860 --> 30:08.860
Okay, if there's no more questions, thank you Rubin.

30:08.860 --> 30:18.860
Thank you.

