 Welcome to Selenium Conference today. I have Goni Garcia with me for this wonderful session, a Swiss Army Life for Selenium Web Driver. Goni, without any delay, stage is yours. Thanks a lot for the interaction. Thanks everybody for joining me. This is going to be a talk about a tool of the Selenium Web Driver ecosystem, which is called Web Driver Manager. Maybe you have heard about this tool. Otherwise, I'm happy to explain it. I think, well, we can't wait for a minute until everyone is joining us. I want to introduce the talk, as you may know, Web Driver Manager is a tool, it's a Java tool, which helps to manage the drivers required with Selenium Web Driver. But, as of version five, it's more because of the title, Web Driver Manager now. It's a helper library, which provides different features for Selenium. So, as I said, Selenium Web Driver Manager is a tool which allows automated driver management and other features. And well, it's an open source project. You can, it's in GitHub, the dot is in here, okay. And I want to explain first why I created this tool. I want to explain why the motivation to create a tool like Web Driver Manager. So, of course, this tool starts in the context of Selenium, okay. As you may know, Selenium, Selenium to change this. Yeah. Selenium started into Selenium 4 when Jason Jarrins and Paul Hammond created what we call today Selenium 1, which was a JavaScript library called Selenium Core and it promotes control and plain server projects. It was a very popular project because well, it provides browser automation. And in parallel, in 2007, Siemens still are created with Driver, which is a different project at the beginning, okay. Was for the same feature, let's say it's for browser automation, but with a different approach. So, they decided not to compete but to merge these tools in what we call today Selenium with Driver or Selenium 2 at that time. They merged these two projects in a single one and well, it's getting changed here in the automation, in the automation space for browsers, okay. So, my history start at that time in 2007. I started my PhD focus on this automation and server quality. And I was a user of Selenium remote control at that time. So, during my PhD, I use Selenium remote control for assessing web application, okay, as part of my PhD dissertation. Of course, Selenium continue evolving. We have to wait until 2015 for Selenium 3. And by my side, and in 2013, I joined another university as a postdoc researcher and I started to use Selenium with Driver for assessing in this case, WebRTC application which is a real-time communication application. In 2004 was an important year for me because I had my first contract as a professor at a private university then. And for this history, it's important that I gave a course about web programming. So, in the second semester of the course, I was designing the content of that course about web programming. And I felt Selenium not something that was mine somehow because I had experience with Selenium remote control. I was a user at the time of Selenium with Driver. So, I wanted to teach Selenium to my students, okay? But when you want to start with Selenium with Driver, the first thing you need to do is to download a Driver and get available for your script. That's something that for me was inconvenient, okay? I wanted my student to focus in the test and not in the setup because I was very, well, I was afraid that student get lots in this setup process. So, for that, for my students, I decided to create the first version of WebDriver Manager, that's my motivation. I wanted to create a tool that make that process automatically for them, okay? That was my very intention, make my students at the time easier when onboarding to Selenium with Driver. So, well, the course was okay. The student did that part, no problem at all. And well, it was an open-source project, it was public, so I started to use it. I started to use WebDriver Manager in my projects. And also very important for this story, I did something interesting, I think, which is answer a couple of questions in Stackoverflow about this project, WebDriver Manager. I recommend people to use this because there was questions about WebDriver, about driver management for Selenium. So I recommend to use WebDriver Manager and something happened that people start using it, okay? So I keep maintaining the project because I felt that was useful for some people. And I invest my time in maintaining this project. And well, the project starts evolving. Version two, version three, and version four during the next years was focused on driver management, okay? This current driver theme, the driver binaries was managed by WebDriver Manager. During each year, I continue working at university. In 2017, I wrote a book about taking its time, which I talked later about different projects I created. I was, I switched my university as a professor first at Reconcolos University in Spain, and then at the University of Madrid, which is my current position. So Selenium continued evolving with the standard recommendation of the WebDriver Protocol. Also, the bike died recently, that's the first draft. And we reached another important milestone in this story last year, okay? In 2021, last year, well, as you might know, the Selenium project was creating Selenium 4, okay? I was particularly interested in this version because I was writing a book for Riley and a book about Selenium 4 in Java. And for that, I create a new, my version of WebDriver Manager, which is WebDriver Manager 5, which was no longer about automated driver management, but also I provide different features and I'm going to explain to them. So that's the story of WebDriver Manager. By the way, this year, I had the great pleasure to join SOSLA as a staff software engineer in the open source program office, and I have started to contribute actively in the Selenium project. So it is going to be great for me and I hope for the Selenium project because we are going to do great things together, I hope. So regarding WebDriver Manager, well, as I said, the original motivation was to implement the automated driver management. As you may know, when using Selenium with Driver, the test using Selenium with WAPI does not communicate directly with the browser, but with an intermediate piece called Driver, okay? Driver, for example, for Chrome, we need Chrome Driver. It's a binary file, which translates the WebDriver commands, which is a protocol, a standard protocol in here, to something that the browser understand, a native communication between the browser, okay? So this driver, it's a requirement to implement Selenium with Driver script, okay? So I call this process, Driver Management, to the process of resolving a given driver for a given browser, okay? So if I want to control Chrome with Selenium with Driver, I need Chrome Driver. And this process, I call Driver Management because it has different steps, okay? First, you need to download the driver. Imagine you are in a Linux machine, so you need Chrome Driver for Linux for your architecture, okay? And you need to go to the repository and download the specific version you need, okay? Because a given Chrome Driver version, only it's valid for a range of Chrome browsers, okay? So you need to select the proper version of Chrome Driver and download to your machine. And once you have downloaded this Chrome Driver, you need to set up, okay? You need to make something with it. This setup in Java, it's something like this, okay? You need to export a given property with the path of the driver, okay? And you need to include this in your test. The other option is to put your Chrome Driver, in this case, in your path in the environment by Apple, okay? That's something in my opinion inconvenient because if you do this, this property, you are going to link your test to your machine, okay? You are using a path in your machine, your test is not, cannot be running in any other machine, and that's very inconvenient, okay? But even worst, in my opinion, because well, you can live with this because if you export to your path in your machine, even in your continuous integration server and so on, as I said, even worst is the maintenance, okay? The third step in this process is the maintenance, okay? Because well, in the long run, the driver is going to be incompatible with your browser and that happens a lot. Imagine in this case that you have Chrome 98. So at that moment to download Chrome Driver 98. whatever, is this Chrome Driver, which is the driver you required for controlling Chrome. But Rosers, modern Rosers like Chrome are evergreen. We call this evergreen at the future because they automatically and silently upgrade to the next stable version. You don't notice, but your Rosy is constantly aggregating itself, but that happened also for Firefox and Edge. So in this example, Chrome 99 is still compatible with Chrome Driver 98, so your test continue working, but at some point, and this example is when Chrome reached 100, version 100, Chrome 100 is no longer compatible with Chrome Driver 98 and your test is going to fail with this message. This version of Chrome Driver only supports Chrome version, in this case N is 98. So your test that originally it was working is going to fail if you manage your driver manually, okay? And that's something very inconvenient. So in my opinion, the solution for this problem is to make this process automatically. And that's what weather manager does. By the way, this chart, it's a proof. I found that, well, this is a real problem. I mean, this chart, it's, well, the Google trends about this sentence, this version of Chrome Driver only supports Chrome version, okay, in Google. This is this line, okay, this blue line. And in the other x, we find the versions of Chrome, the major version of Chrome. And you can find something interesting in my opinion is that for some given version of Chrome, for example, this one, there is a peak of this search in Google, which means that people search a lot at that time because this is time. At that time, there is a peak of this search because I suppose that, well, test fail because of this and people search for Google a solution for that thing because they result manually the Chrome driver and eventually the test fail, okay. Happens here, happens here, also here. Well, there are like peaks, there are like Chrome version and then make a, well, there's a link to make that. And as I said, this, the solution for this is to use a tool like weather manager which make this process in runtime, okay. Weather manager, basically you need to include the dependency in your project. Typically it may be not ready, okay. And that's it, you didn't have a simple API composed by, sorry, this, Chrome driver, Firefox driver, X driver, static methods. That results the drivers for different browser Chrome, H, Opera, Chromium, Explorer, and so on. With the setup method, okay. This automatic, this weather manager, it's automatic for you. But this is the skeleton for the test I proposed in the documentation of weather manager, okay. This is a JUnit type test which in the, before all, before all the test you incorporate this line, okay, called to weather manager to set up the driver. This happened each time you run the test. So weather manager, it's going to match the driver version with the browser version each time. And your test is going to be properly executed every time, okay. If you use SMG, also the same, changing the annotation but well, this is a skeleton it proposed to create an inventory test. Of course, you need to focus on here in your test log. You need to open a URL and so on and so forth. So in between the development of weather manager I created a different project that I'm going to mention quickly. It's Selenium Jupyter. When I created this book in 2017, it's about game five. So I realized that the Jupyter model which is the JUnit5 programming model it's very convenient for Selenium WebDriver if you are able to implement the driver management in an automated fashion. So as you can see here at this Selenium WebDriver test using Selenium Jupyter reduce the boilerplate because only you need to as a test parameter select the type of your WebDriver object the current driver in this case and that's it. Internally Selenium Jupyter invokes WebDriver manager to resolve the driver, instantiates the current driver and after the test it is disposed the driver object. So if you are a JUnit5 user maybe you are interested in taking a look at this project which is basically a wrapper of WebDriver manager but focusing again on WebDriver manager as I said, it was first released in 2015. The first version was like a weekend project. In fact, I create the first version in a weekend. The logic bar was very straightforward. The most difficult part for me was well, uploading the artifact to maybe Centra because basically that was configuration but the logic was very simple. Okay, I did it in a couple of days. And basically that version, the original version basically check the latest version in the driver repository online, for example, a Chrome driver repository. I, with the WebDriver manager, calculates that version, has a cache. If not, it's in the cache idle of the driver and I export the driver path to as a Java property. That's it. Original algorithm works nicely but as I said, I continue maintaining the project and I realized that this algorithm which I call now a resolution algorithm, it's not that simple as that because this latest version, check driver latest version is not always true. I mean, the latest version is not always the proper version for your browser thing. Mostly it happens, but not always it's the latest version. So the resolution algorithm has been above quite a lot in during this year, okay. In here you can see, well, like the complete resolution algorithm, I am not going to split the detail. You have a paper if you want and I can show you the details in the, well, you can check the documentation too. But now the algorithm is much richer, okay. I have what I know what driver has to knowledge databases, commands database to check the browser version and a version database to match the browser with the driver version, okay. So somehow it's smart to detect your browser and to detect the driver proper for your browser, okay. Also it has a cache mechanism rich because it has a TTL, TTL is time to live. So whatever you get in your cache is not fresh forever, okay. This is inspired in DNS. It has a time to live, TTL means time to live. So it's fresh, it's considered fresh. These assets in the cache doing some change, okay. Not always. So I can, I think that with the remanager, this feature is quite stable today. It's solid, people use it and works very nicely. But yeah, to conclude this, well, not only the setup method is provided for this feature, it has a rich API for configuring a lot of things, okay. For the browser version, for forcing an architecture, okay. Okay, proxy, many, many different features. I recommend you to take a look to the documentation because there are a lot of API methods to configure with the remanager and also very important, in my opinion, for testing, it can be configurable from the outside, okay. Not only from Java, but also with Java properties, okay. This, if you, for example, want to configure something when you run with Maven, right there. And also for environment variables, if you don't have access to these properties, if you only can change environment variables, you are able to do that also for the remanager. So, well, this is all about Automotive WebDriverManager, which is WebDriverManager 1-4, okay. And today I want to explain the evolution, okay. Why WebDriverManager 5? It's, well, I stepped forward on this feature again. I created WebDriverManager 5 a year ago. In fact, I have a vacation during that year, during July, I was mostly coding with WebDriverManager 5 because as I said, I was working this book and I wanted to explain this in a feature to the book. And yes, well, I was working this in August, so I will be great if you speak louder. Okay, I'm going to try. Maybe it's a problem of my speakers. Have anyone has a problem, hear me? Yes, Bhuni, able to hear you. But it would be great if it is a little louder. That is what I just mentioned, yeah. I'm going to try to speak louder. Before continuing, I'm going to share a link with you. Let me copy this link. This link, it's a sorry I am doing because, well, I work as a professor and still I am a researcher and I'm really interested in understanding Selenium. So that is a sorry I'm doing with another professor about the challenge of Selenium with Driver. So if you have some time to feel that survey would be great and, well, as a gratitude for that, I am going to give free eBooks to the participants. I will make a raffle randomly I select some free participants and really send you free copies of my book. So, well, that's something that I want to share here. It's the first time I'm starting the survey and so it would be great if you can contribute to that. So, regarding the talk, weather memorandum 5 provides different features, okay? So I'm going to explain these features with code, okay? Which is, I think it's funny that it's only speaking. So let me show you these examples in Eclipse, okay? This is Eclipse and you can see that this is a test. By the way, all the tests I'm going to show here if are in the documentation, okay? Here in the doc, this is a menu that you cannot, yeah. In here, you have a lot of examples and all the examples are used in the doc and that example, that's in the weapon, okay? This is in the weather manager, right? You clone, you have the code. So having said that, the example, it's about finding the browser, okay? Weather memorandum 5 provides this method, get browser path to get to find the browser if it's not in the computer. So, I am now in Windows. If I run this test, I'm going to use like this, okay? This test is going to be a skip, okay? Because I am using this optional path in an attribute change, okay? This is a j, I am looking for a browser path. If not, it's present, the test is going to be a skip, not fail, okay? Because otherwise, I am not running this. This is not a Mac machine and it's going to fail because Safari is not present in the machine. So this is the first feature. The ability to find if a browser is installed or not in your computer. Next, the builder, okay? In the builder, it's like as in fact, sugar that, well, not only the setup method, directly you create the method with this, the web-diver object with this. As you can see, well, the test, it's reduced a bit because you only need to specify create method directly from this static method. That's it, you can directly create a test in this case using render from driver. You can change to another browser simply by changing the manager in the static method you use, okay? That's a method with file, okay? That's all the as in fact, sugar, okay? We've reduced the boiler plate of test, but in my opinion, this create method, it's important because it's open the games to the next relevant feature which is browser in Docker, which is maybe my favorite feature of web development five. Let me show you this example, okay? This method, this test, use this method, browser in Docker, okay? So I am going to use a Chrome driver which is no longer local. It's a browser in a Docker container. Of course, the requirement to run this test is to have Docker installed in a computer. This is a window machine, even though I have Docker also. So if I run this test, okay? Now it's time internally with the remainder it's going to connect to Docker Hub and pull the latest version of Chrome, in this case, Chrome 103, and use that container to support the test, okay? I didn't see anything because everything happens in the Docker container, but the test is green because I have this and it's quite fast because I already pulled this version, okay? So basically I only have to change this to use a local browser or a browser in Docker, okay? This is a local, and with that it's the same test, but using top game. And again, whether I want to connect at that time to get the latest version of Chrome in Docker. So you are sure that you are going to use always the same, the latest version. You can change to another Docker in browser, simply changing the method that would be the MMR, yes. Yes, yeah, I'm pulling this. At this version has changed, what? Okay, no problem. I'm going to go to the next slide because it's going to pull the FIFO's label for me. So this feature is interesting in my opinion because it's not only about having the browser in Docker, but also different features. For example, well, if you want to debug your browser, you can access to the desktop using BNC, BNC. Why do we use the create method? Okay, because you need the instance, okay? In here, you say that you are going to use FIFO's in Docker and then you create to get the instance, okay? The driver instance is required to get the browser, okay? This basically, it's the model of the browser in your Java code, okay? Okay. So the next feature, it's about, well, debugging using BNC. Let me show you this another test, this one. This is basically the same test with an active way here to see what's happening. I use browser in Docker and I enable BNC and I'm going to do something else. I'm going to enable recording. So I involve these two methods in my web browser manager instance, which I use later to create my web driver object, okay? And if I run this, I am going to see here a new URL to connect through no BNC. Let me show you this in action, I think it's better. I'm also going to record this session, by the way. I'm going to do both. This is a starting, okay? I am pulling, and here is the URL. This URL, if I copy and paste this URL to my local browser, this is my remote session, okay? I don't know, I can draw in here. This is an example of my book. And I'm interacting with the browser while this is being recorded, okay? Because well, basically, of course, this could be an automated test. I am doing this manually for you to check that, well, this is being recorded. There is, here, a manual wait of one minute just to interact with that. Of course, this is supposed to be an automated test and everything would happen automatically. And at some point, it will end. And this is going to be in this, okay, I think it's that. Let me show when this happened, okay, stopping. You need to wait until the test stop because the containers are wasted and disposed. And I have here my recording, okay? This is what I did, okay? This is what I did. Well, at the beginning, I was talking, but at some point, I started interacting with those and this is the picture I did and this is what I did, okay? So basically changing to methods, okay? You only, well, three, three methods. So Chrome driver manager, Rosalind Dockhill, enable PNC to go inside the container. And also recording, the recording is very useful for your continuous integration server because, well, everything happens in the server but you don't know what happened. If you enable a recording, you can get the file and let's check later what happened. And that happens only in your site changing methods. Okay, so that's my opinion is, well, wait. So, but this doesn't stop here because another very important feature is the version, okay? Because so far, if you don't see anything about the version, we're gonna use the latest version in this case for Chrome 100.3. But what is, I want to use another version. Those are version, I don't know, 100. It's not the latest, okay? I'm going to make this model and I'm going to enable, well, yeah, that's it. I'm going to delete this recording in the confusion with the other and I'm going to run this. I'm going to use Chrome version 100, not the latest but a given version 100. Okay, I have my URL teaching here. Well, I'm going to check in here. This is one Chrome 100, okay? So I can continue to interact with my browser and at some point I'm going to get the recording, okay? So even better than that, you can use wait cards, okay? You can use, for example, latest minus one. It calculates the latest version at the point and means one means the previous version and that nowadays would be 102. But even better in my opinion, you have to wait card which is beta 100, much more funny. You can use the beta version of Chrome and Firefox only, okay? It is only supported in Chrome and Firefox because these docker containers are maintained by Trilio and they maintain only Chrome and Firefox. So let's see this, from beta. I want this, I am recording by the way but I have not to record it. And I'm going to show you that this is actually from beta. It's not other version but it's supposed to be 104, okay? Well, that's it. Even funnier with the development version, 105, okay? So changing only a method, you can change the version you want, not even for Chrome, by the way, but also for Firefox, Firefox, driver and other docker containers. By the way, I didn't mention that this is supported by for Chrome, Firefox H Opera. This one, it's the logo of WebKit, which is the engine of Safari. Safari is a commercial product. You cannot run it in docker but you can run WebKit, which is the engine, which is supposed to be identical from a functional point of view. So you can use Safari driver to run WebKit. And also a Chrome mobile. Chrome mobile in Android. That's the one that's tricky because you need hardware visualization support but eventually you can manage to do that. So this is the docker and browser feature, very fast. I recommend that if this is interesting for you, you take the documentation because I'm going to be going a bit fast. And the last feature of Wetterer-Malagia I'm going to mention here is monitoring. And that's the latest feature I have implemented this year. This is Wetterer-Malagia 5.2. This version provides same disintegration with another of my open source projects, which is browser watcher. Browser watcher is a browser extension which allows to implement different features for testing. In my experience, I detected some problems that cannot be solved using Selenium WebDriver only and you need something else. And I, well, I created this extension as a toolbox for different features for monitoring. This is a separate project. You have the documentation on the source here. It's a web extension but the thing is that WebDriver-Malagia 5.2 install this extension in your browser automatically for you and provides extra features. For example, for monitoring the browser console, and let me show you this design action. This is a test in which we invoke the method watch. When I invoke the method watch, what Wetterer-Malagia does is install this browser extension in your browser automatically for you. And thanks to that, I am able to get the logs using a single line. This so far was not possible in Firefox. If you have experience with this, this was possible in Chrome, but not with Firefox until the byte has emerged. This is a solution based on JavaScript that works nicely. And well, I can show you this example you want. This web page is a test website I created for my book in which I intentionally, I create five traits. So basically invoking watch, and at some point invoking get logs, I am going to be able to get the logs of a type of browser in a single test. If I run this, here I have the logs, okay? Recover with browser, browser, and easily from my Java test, okay? So well, of course you can change your rows in here. Yes, that wasn't the intention because the feature was not available. And well, with this now it's possible. Maybe you want to check visually your logs. Maybe not, but well, I have here another example. Let me show you this. It's a feature just in case you want to upset your logs directly. Using the watch on display is exactly the same whether Maria collects the logs through browser watcher. But at the same time, it creates some pop-ups in the page to see the logs in the user interface. So if I run this, it's the same page, but with a wage, I see these logs for a bit, okay? Well, it's this useful, well, can be useful if you want to check manually, check your test. And also because browser watcher also allows to record. I have shown you how to record through Docker, but if you don't have Docker in your property for some reason, you can even can create record. What is it? Yes, in here, then record each test. This is another example I want to show you with the code. Okay. Again, you need to invoke watch in order to use browser watcher. And at some point to use a start recording and a stop recording, okay? So internally, browser watcher use a tab capture API, which is JavaScript to record the viewport of your browser. And this is going to be downloaded in here in other load-dose file folder, so. So if I run this, this is basically a test with text like five seconds in vain. Executiveness is a slow calculator. What's happened? It's the viewport, and yeah, I know this problem. It's because I changed, that was, it's the problem of, I think with this, hopefully this will be solved. This is recording, this is being recorded, okay? Because I changed the resolution to my screen. And I have my recording here. It's only the viewport, okay? But it's a recording of that test, okay? Has been created by now. Okay, if you are interested, as I said, let's take a look to the documentation. And I want to conclude, well, very fast because I'm running out of time, I think. With some feature beyond Java, when I create a new version of WebDriver Manager, I also create the FATYAR, that is the jar with all the dependencies. At that jar, that's five minutes, okay? With that jar, you can create different features. For example, resolving feature, resolving drivers locally with that. We have two questions, right? I have this here. If I run this command, I use WebDriverManager locally, okay? I have to go to WebDriverManager to resolve driver manager, okay? That's a feature that you might be interested in. For example, it's useful for selecting great. Another feature I like is this one. You're using directly running Docker with the FATYAR to explore the testing, okay? I mean, I'm going to run, I'm running Docker, okay? And I can connect with that together and interact with a browser I have just created. This is a working browser, okay? So, this is about the CLI. This is another use. And also another use you can use with the WebDriverManager is as a server, okay? Again, using the CLI, for example, like this, server. WebDriverManager starts working as a server. It means it has a feature to resolve drivers using a REST like API. You can request to resolve driver to that browser. Yes, I will. I will share my slides on my slideshow channel. I will post in Twitter, okay? The link. As you can see, I have resolved this and I have the driver as attachment. And also it behaves as a Selenium server. I mean, I can use, for example, let me show you this on this screen with the last picture I showed you. This test is no longer Java. It's JavaScript. And I'm going to ask for this URL, which is my Selenium server. I might get there by my server, sorry. So if I go to this, I can run this test against my WebDriverManager. No, okay. And WebDriverManager behaves as a server using Docker to resolve their browser. Yeah, I'm going to finish now. Well, WebDriverManager is not perfect. It's mainly focused on Java and it has different technical details. For example, Chrome in Android, Docker in MacOS, I am in architecture. Monetary features have different limitations but I keep maintaining WebDriverManager and it's an open source project. So I'm happy to get contribution if you want. To conclude, WebDriverManager is, I think it's a helpful tool. This is the evolution of the downloads. In the last year, it has raised a million of downloads which is incredible, 1,100,000 downloads in the last July to now 1.8 million per month. And the same for the IPs, okay? The IPs has more than double. Well, this is my last slide. Now thanks that I have joined SourceLab as an open source contributor. I am working closely with the Selenium project and I am working in the proposal of something similar to WebDriverManager but official to Selenium. My proposal is to call it SeleniumManager. It's also called the concept of batteries included. And my vision is that in the long term, Selenium will do this job automatically for you. This driver management will be transparent using a tool it's maybe called SeleniumManager, okay? So we are working on that and hopefully this would be a reality in the short term. So that's it. Sorry for taking the time for questions. I'd be happy to answer it if you want. Yes, Buni. Thank you so much for the very insightful session. And we have two questions in our Q&A panel. The one is can we set the browser log path for browser running in Docker? Yes, I think so. Yeah, I have a test, I think, actually about that. And yes, that's a feature. The only requirement is that you have a user interface, okay? Yes. But if you have a user interface in Docker, it's not possible. Okay, so the next question is, is there any plan to release WebDriverManager for C-Sharp? Not for C-Sharp, unfortunately. In fact, there is a port of WebDriverManager called WebDriverManager.net, okay? You can look for it. But I don't plan to port to C-Sharp, but as I said at the end, I plan to do something even better, which is the SeleniumManager is going to be a binary, which is going to be used by the whole language bindings. So hopefully in the future, the SeleniumManager will be the official manager and will be available not for Java, but JavaScript, C-Sharp, Python, and the whole official language bindings. So thanks, team, for joining with us. Thank you so much, Boney, for this session. Thanks a lot.