I want to welcome everyone to APM Conf. This is the third edition of the APM Conf. This year we are doing it virtually, but I hope everyone has the same rich experience of APM Conf like they've always had before. We have a fantastic program. Some really compelling talks. I've got people emailing and complaining that there are like three talks that are all I want to attend. How do I choose between one? That's a good problem to have. And so, yeah, I'm hoping everyone will have a great experience. I want to kickstart the conference by introducing the lead of the APM project, Jonathan, who has been the center of the gravity at least for this project. And doing some really cool work, especially with the 2.0 that's coming up. And I'm sure in his talk, he's going to give a glimpse of what is coming and get into some interesting peaks inside what's happening, which is this whole keynote about. So over to you, Jonathan. Thanks again for being the person driving this whole thing. Thank you so much. Absolutely in a rush. Thank you for that warm introduction and thank you on behalf of myself and everyone here for being the kind of leader of the organization of this event. I was really happy that you approached us to do this and so let's let's kick it off. I'll go ahead and share my screen. So, yeah, welcome to APM comp 2021. This is the third official APM conference that we've had. The first was in London, and the second in Bangalore, and now everywhere, I suppose, still sort of an Indian time zone, but people from all over the world. Zooming in from wherever we happen to be I'm in Vancouver, Canada right now. This, this talk is supposed to be a kind of what's going on with the project State of the Union type talk. It's going to be largely about APM 2.0 because that is our main focus as a as a project right now, and you've heard me talking about it for a long time, and we are very close to releasing it. And, and burst the bubble of anticipation. I'm not going to say that it's released as of this keynote that was kind of my original hope. But like all deadlines. This one just came up a little too quickly. So anyway, in case this is the first time that we're meeting one another. I wear a couple different hats. Figuratively, I only wear one hat, literally it's the one that I'm wearing right now and also in this picture. I just get stuck on my head, I guess. So I am one of the maintainers of the APM project. There's lots of other maintainers will not a lot. There's a few other maintainers. We all do, you know, put a lot of effort and work into this project and are super grateful for the contribution of everyone who contributes. I work for a company called headspin. That spins a, you know, device cloud that is built around apium and gives you lots of other stuff to go along with your apium tests at headspin.  So that's something you could check out. And I also maintain a blog and newsletter called apium pro with lots of apium tips and tutorials and things like that. And increasingly some more application based stuff as well, which we'll see a little bit about later. So on to the apium 2.0 report. The first thing that we want to remind ourselves of is apium's overall vision, right? Hopefully apium 2.0 is a step forward in apium's overall vision. That's kind of what our intent is for it. It's not just, oh, well, we decided that it's time to go from one to two. I mean, why would we? We've been at one for like seven or eight years. So we obviously weren't in any hurry to get to two. But again, just a reminder, the vision of the apium project is if we could say it in just, I don't know how many words these are, five words, that we want apium to be a web driver compatible automation tool for everything, for every platform, right? We believe in the possibility and the vision of web driver as an automation technology and what it did for web browser automation. And we think that can be expanded and applied to everything. Obviously not always straightforwardly, but in some way or another. And I won't go into all the kind of reasons for this vision and the benefits of it because I've talked a lot about that in previous keynotes like this at the last apium conference, which you can look up on YouTube if you want. So if we want to talk about what apium 2.0 is in a little bit more detail from a perspective of sort of what some of the problems were with apium 1 and what some of the solutions are that apium 2.0 can bring, we hope. We could say that one of the first problems that we encounter with apium 1.x is that the drivers that we were using to support automation on different platforms kept sort of diverging not necessarily in terms of their features, but in terms of their development cycles, right? So we have these different drivers for apium that you've used. If you've used apium, the XC UI test driver, which lets you automate iOS applications. The UI Automator 2 driver or the Espresso driver, which allow you to automate Android applications. There's a host of other drivers that exist that you might have used.  Each of these drivers are sort of developed kind of in their own line of development. It just makes sense because, you know, iOS has its own thing. It's different from Android. It's not like Apple and Google get together and decide, okay, on this day, we're going to release the same feature to both of our platforms. So these drivers deal with different technologies and develop at different paces. With apium 1, that was a problem because all of the drivers were combined essentially into one project and it made it hard to parse out and distinguish types of changes from driver to driver. So with apium 2.0, we've taken the step to kind of enforce that each driver is its own independent entity with its own, you know, GitHub repo or, you know, package or whatever it is. But apium is going to help you manage those different independent entities. They won't all be kind of conglomerated into apium anymore, but apium will make it easy for you to manage them. And that's part of what apium 2.0 hopes to do. Another problem with the way things were before is that we kept finding more and more platforms that we wanted apium to support. And there's way more platforms that we wanted to support than people we had to support it. We have a pretty small core team. You know, a lot of folks that use apium aren't necessarily, you know, that excited about contributing to apium itself, or maybe the skills involved are just a bit different than what they use day to day. So apium is written in JavaScript and if you're a, I don't know, a Java based S debt or something, it might be a little formidable to think about hacking on the apium code base itself. So one things we wanted to do in apium 2.0 is to make it easy for us as the core team or for you or for anyone to write and share apium drivers because we know that we can't support all the platforms that are out there. But together the whole world we can write. We just need a few people who know about these other platforms to write drivers for them and apium 2.0 is going to make it easy for you to share those drivers and for others to consume them. That's what we call the driver ecosystem. We're also developing something called the plugin ecosystem. And the idea behind plugins is basically that we kept on seeing that people were coming up with these really interesting ideas for features to add to apium ways to integrate apium with other technologies or ways to extend apium for kind of, you know, niche use cases, maybe not use cases that everyone would need or not in all cases, still, you know, very useful and valid, but we kept on feeling a tension of whether or not we wanted to put these features into apium, because then we'd have to maintain them. And they might be useful, but they might not be globally useful. So we had this problem. And so we decided to create a plugin system for apium that makes it easy for anyone to write and share plugins that can extend apium as behavior or modify the way apium responds to commands or integrate with other technologies. The sky is really the limit when it comes to creating plugins. And of course this whole plugin ecosystem is going to be managed the same way as the driver ecosystem and apium 2.0. So I have some examples of plugins and drivers down the road here.  Another big problem with apium as it stood was that the documentation was quite frankly bad at one point it was quite good but you know documentation often drifts from reality. And our information architecture was problematic partially because of the whole divergent driver development problem we've already talked about. So with apium 2.0 we're also exploring ways to better delineate documentation responsibilities with drivers becoming their own sort of entities that makes it a lot easier for a specific drivers to host their own documentation. So we know that the main apium documentation isn't cluttered with information that's only relevant to one particular driver it might be confusing to people who are coming, you know wanting to automate another platform. That's just one sort of example of ways that we're trying to improve the documentation. And this is, in fact, a lot of the work that that remains before we release apium 2.0. So kind of from a development perspective, there's a lot of stuff that's accrued over the years inside of apium. And there are some things that we didn't really want to get rid of because we didn't want to make breaking changes. But at the time has come to get rid of some of those things and make some breaking changes. So we'll be removing support for older incompatible drivers, some old methods and some old capabilities and things like that. So in terms of new features for apium 2.0 it's basically what we talked about in the previous slide, there's going to be this driver ecosystem where you know drivers can now follow their own independent development have their own independent versioning systems. And you can, you know, upgrade a driver that you use without necessarily having to upgrade the apium server at the same time, giving you a lot more flexibility, you could, you know, have a certain version of the XEI test server and choose to keep that version pinned while still incrementing and upgrading versions of your UI Automator 2 driver, if that's the way you want to do it just like we're used to with dependency management in general. So it's just going to be a lot more of a sane situation. So in terms of the ecosystem, we're releasing code libraries that make it very easy for third parties, by which I mean, you know, you to create and distribute drivers that that you want to experiment with. So last, well night for me morning for those of you in India. We have a workshop where we built a driver and some plugins in real time over the course of the workshop. And so we're starting to develop, you know, the appropriate way to document and train people on how to build their own drivers which I'm super super excited about, and we got great feedback from the workshop. And I'm sure we'll be running more workshops like that in the future because I really want everybody who has an interest and the, you know, the development capacity to be creating drivers. And the same is true of the plugin ecosystem right this is the other aspect of Appium 2.0 that's kind of a big new feature, the ability to write your own code and plug it into Appium and have it modify the way that the Appium server works or the way that certain commands are handled. And it's basically up to you what you want to do it's extremely powerful. And if you know the whole thing about great power and great responsibility definitely applies here so very excited about that, just like with the driver ecosystem, we're distributing code libraries that will make it easy for you to write, you know, the minimal amount of code that you need to do to describe changes in the way Appium works and that can get plugged right into Appium without you having to write a whole ton of boilerplate code. And of course, you don't just have to use one plugin at a time. You know, there's, I don't know how many plugins right now that you can choose from, maybe about 10 or so. And I'm hoping that as the years go by that number will increase to you know the hundreds, as people come up with new and interesting use cases. So you'll be able to kind of search from this library of plugins and pull in the plugins that you might find useful for your particular automation needs. So, that's kind of an overview of Appium 2.0. You might be wondering, okay, sounds great. How do I use it. I've only been using, you know, Appium 1.21 or whatever. I just have one slide here on this because it's obviously a little too much to go into in this kind of, you know, keynote style talk. That would be more like a workshop thing. But it's very easy to install Appium 2.0. You just npm install Appium. You just want it right now you want to use the next tag, because it's not the official release yet. So I'm going to give you the latest version of Appium 2.0, which I think is beta 17 or 18 at this point. Then you can use the driver management tools that come with Appium to install some drivers. So if you want to install the standard drivers that you might use for iOS and Android, you can run these commands that you see here Appium driver to install and then the name of a supported driver. And this command line interface is pretty complicated and has lots of options. So you can always check out the guide that I wrote on Appium Pro to the driver command line interface to figure out what all those other options are. One of the other important things you'll need to do when creating sessions with Appium 2.0 is to make sure that your Appium client is sending capabilities that are W3C compatible, meaning they have to have the Appium vendor prefix in front of them if they're not a W3C standard capability. Now, you might be in a position of using one of the updated Appium clients already, like the most recent Python client or something like that. And in that case, you don't even have to worry about this because the Appium client will automatically add these prefixes for you. But this is going to be a breaking change in the Appium server. We're not going to accept non-standard capabilities moving forward. So you either need to standardize them yourself or rely on the client to do that for you. And if you want to do some, let's say, some image element finding or image comparison, you might want to install the images plugin. That functionality has now been moved to a plugin. Or if you want Appium to turn into a device farm for you and manage, you know, a fleet of emulators or real devices or simulators, you can install this plugin that Cy and Srinni wrote, which basically adds a special web server to your Appium server that lets you, you know, connect and manage devices and run multiple tests at a time on different devices and things like that. Really, really cool project. But for more details, I definitely recommend reading this migration guide that we're working on. It's a kind of work in progress. So keep an eye on this. You might want to watch it on GitHub, because this is going to contain the list of all the breaking changes and things that you might need to do to update your tests or your CI workflow to make sure that Appium 2.0 continues to work for you. Okay. Of course, in addition to, you know, getting your server set up and making sure your test code is up to date for Appium 2.0, you might also want to continue using Appium desktop. And in the past, Appium desktop was a single application that you could download, and it would have a server like you see on the left that you could start, and it would have an inspector, which allowed you to inspect your applications. Both of these still exist, but we recently decided to split them into two separate applications. There are a number of reasons that we did this, which I'm not going to go into here. But basically all you need to know is that if you want to use these apps, you just have to go to the right place to download them. If you want the Appium desktop server, you go to the same place you always have on GitHub. And if you want to use the inspector, now you need to go to a different GitHub repo. It's called Appium-Inspector in the Appium organization. And that's where development on the inspector is happening moving forward. I also recently gave a webinar, which I think you can find online, which announced that the inspector is actually now also available as a web application. So an example of how it's hosted is up at the Appium Pro website. So if you go to inspector.appiumpro.com, you don't need to download anything. You've just got a full-blown inspector. And to use this, you need to start your Appium server with a special flag, which is documented in the readme, but otherwise it works exactly the same as the inspector that you would download. And it doesn't cost you hundreds of megabytes of bandwidth or take 10 to 20 seconds to load. It's just here. It's just a webpage. You can even have multiple tabs open with multiple inspector sessions at the same time, which I think is pretty awesome. So definitely give that a look. And now let's explore some of the examples of Appium 2.0 drivers and plugins right now that are in different states of development. And so I'm listing them out just to kind of give you a flavor of what's coming or what could be coming. And I'm not listing these because they are official in any way. Some of them aren't. Some of them are just things that I've been working on or that others have been working on out of interest. It's designed to kind of inspire you to think of, oh, well, what could I create? Or what might my company need or how might my company be able to use this Appium 2.0 architecture profitably for us and for our customers? I know there's even one or two talks at this conference which go into how folks are creating Appium 2.0 drivers or plugins and the process that they went through and the benefits that they're experiencing. So I'm really looking forward to those talks particularly because this whole idea was basically designed to create a platform for others to be creative with. And so I'm excited to see what that creativity comes up with. All right, so let's look at some of the new drivers that I'm aware of. They're probably more that I'm not aware of or some that I've forgotten. One of them is a driver that I've been working on at Headspin, which we recently open sourced. It's a driver for the Roku TV platform. You can test your Roku developer channels using this Appium driver. I would say that the status is pretty early. So it's, you know, it's not full featured yet. But there's another another guy who's helping contribute on this project and we're going to hopefully get a new version of it released on NPM here pretty soon. So that one's in beta. At Headspin, I've also been working on a driver for another TV platform called Tizen, which is more than a TV platform. It's kind of Samsung's operating system. But this driver is specifically for web application that run on Samsung TVs. And I just need to put a few more touches on the Readme before I open source it and make it available, but it's going to be public pretty soon at this URL. So keep an eye on that. I've also been doing some work on trying to create a driver for Chrome OS or Chromebooks. So the Chromebook device and the Chrome operating system that runs on it. I think we have a path forward here for automating applications, especially the web based applications that run on Chrome OS. And finally, I've also been doing some R&D on creating a driver for the KaiOS feature phone platform. So KaiOS is a kind of lightweight operating system that runs on on feature phones that are a little bit more affordable than the smart phones that we're trying to develop right now. So it's a pretty growing market in a lot of the world. And there's a lot of apps that are being developed for this. So at Headspin, we're pretty interested in allowing KaiOS developers to test their apps using Appium. So there's not really anything to open source for this stuff yet, but the intent is to open source all the work that's happening on these platforms.  And we can talk about that when we're ready to move out of the R&D phase into actual development. All right, now let's talk about some plugins that you can go check out. One of the plugins already mentioned is the images plugin. This is actually a set of features that used to be an Appium 1.x as part of the core server. But because they have some pretty gnarly dependencies, we decided to move them into their own plugin. So the repo is there at that link. And you can use the Appium plugin command line interface to install this plugin. It works pretty well. There's also this device farm plugin, not to be confused with the device farm product. It's just the generic name referring to, you know, a set of devices that you have available. This is developed by Cyan Srinni and you can find more details at this URL. They've got some pretty fun screenshots there, so I definitely recommend checking that out. Another one that they've been working on is a gestures plugin that takes some of the common gestures that you might need in an Appium mobile test like swipe and pinch and zoom and stuff like that. And it takes away the hard work of having to build W3C action commands to implement those plugins and instead just gives you a nice server endpoint to call. Sorry not to implement those plugins to implement those actions.  There's another plugin I wrote that basically tries to unify the document type definitions for both iOS and Android page source. This is kind of an experimental thing. I'm not sure if it's ever going to be particularly useful, but I think it's a good example of a plugin that's pretty simple that you could read the code and probably understand what's going on. And just kind of takes what's happening in the iOS world and the Android world and makes them a little bit more similar, which might make it easy if you're doing cross platform testing. It's also another very simple plugin, which basically takes Appium's requirement for W3C standard capabilities and undoes that requirement. So I don't recommend using this plugin, but if you for whatever reason aren't in a position to update all of your test capabilities with appropriate W3C style capabilities, you could just install this plugin to the Appium server and it will relax that rule for you. And there's another one I'm going to talk about a little later, but I won't talk about it now. Alright, so another thing that's important to talk about is what's happening with Appium 1.x now that 2.0 has been in beta for a long time and is around the corner in terms of its release. So we have published a plan for what's going to happen with Appium 1.x. I recommend reading this guide to it. It's full. Some very important information in there, but I can summarize it here for you. Basically, we're no longer working on the Appium 1.x server and here I'm distinguishing the Appium server from Appium drivers. So when I say server, I mean stuff that's like not the XC UI test driver, not the UI Automator 2 driver, but kind of Appium's internal mechanisms and things like that. We'll still be making updates for a while to the drivers like the XC UI test driver and UI Automator 2 driver to make sure that if iOS releases a new platform, we're going to try and support it and so on. But in terms of features for the Appium 1.x server, we're done with that for good now. If you find any significant bugs in the 1.x server that need to be patched, we'll also work on patching those for basically the next six months. And like I said, we'll continue making platform related updates or bug fixes and so on to the 1.x drivers for the next six months. But basically all of the development work that we care about is happening on Appium 2.x. And that doesn't mean that, like I said, the drivers are going to be abandoned for Appium 1 immediately. They'll continue to work for a while. They might even continue to work after this six month period, but after that we're not guaranteeing that they're going to continue to work with Appium 1.x. And this feels pretty good to me, especially given that Appium 2 has actually been out in beta for well over a year and we've been trying to get people using it for that whole time. So hopefully a lot of you are already using it and if you're not, now is definitely time to get going with it. You know, check out the migration guide. Hopefully you'll see that there's not actually a whole lot of work that you need to do to get it working real. So in terms of a final release date for Appium 2.0, unfortunately I can't give you a firm one at the moment because there are some significant pieces of work that remain. The most significant in terms of the time and effort involved is going to be the documentation project. We want things to actually make sense for folks that are coming new to the project and for people who are trying to get information about certain drivers and things like that. There's a fair bit to do there. And we need to make sure that Appium desktop is compatible with Appium 2.0, which means adding the ability to manage these drivers and plugins from Appium desktop. And that's a bit of work. We have some ideas how to do it, but we haven't done it yet. So then there are a few other things which are important, but may not block a 2.0 release, like some of that removing of old cruft and whatnot. We could potentially do that incrementally as time goes on. We're obviously hoping for more testing and adoption of Appium 2.0 in the community, IEU, and especially with cloud vendors. We're hoping that in addition to HeadSpin and I think one or two others that already support Appium 2.0, or at least have beta support for it, that all the cloud vendors will get on board and have a plan for supporting Appium 2.0 here quite soon. And then obviously because we're putting a lot of weight on this whole driver and plugin ecosystem, we want people to be writing drivers and plugins so that we can really figure out if we've built the right kind of interface for them, because those are the types of changes we don't want to be making too much in the future, because anytime we change the driver or plugin interface, you know, that creates compatibility issues or potential compatibility issues. So we want to make sure we get that right. So now is definitely the time to start hacking on your own driver and plugin and giving us and specifically me feedback on that. Okay, that's basically the state of the union, but as always I wanted to do something that was a little fun for this talk and something that I've been wanting to experiment with for a long time is building a game, right? So everybody likes video games. I always have ideas for games that I think would be fun to build. Actually didn't get so far as trying to implement any of my ideas, building a game, but I did get so far as to download this game development environment called Unity and open up one of their tutorial applications and kind of see how it's put together and start to figure some of that out. So this is a screenshot of that tutorial game that I did not create from scratch. It sort of came with the environment, but I got to play around with it and build a version of the game for Mac and for Android and that was super fun. And I started to think about, you know, what it would take to automate this type of thing, you know, and people have been thinking about this for a long time. And they've always asked me, well, how can Appium automate a game, you know, like this, this is a basically a platformer style game where you have a little character that moves and jumps and stuff like that. So people have asked me like, how can we use Appium to automate this type of thing. And the kind of honest answer that I've always had to give as well, probably don't want to use Appium to do that. It's not probably the best tool for that job. There are a number of reasons. One is that games typically don't have UI objects in the traditional sense they don't typically have, you know, form fields and buttons and lists and stuff like that I mean they might have them as part of their menus, or what they're going to be more focused around, you know, things like sprites or, you know, 3D objects and cameras and, you know, light sources and stuff like that and it's just a whole different world from, you know, the world of a web page or an iOS SDK based application. So the tools that Appium is built on for iOS and Android are all designed around these standard UI objects, which typically don't exist in games. So, you know, when you open up a game in Appium and you try and get the page source hoping to maybe see something like a player element in it or, you know, a ball element or a token element. Instead, you just get one kind of black box and you have no insight as to what's going on inside that from the Appium perspective. So, there are some things you can do to work around this and I've tried to, you know, help move the state of what's possible forward with Appium. So, for example, adding image based automation to Appium where you can say, you know, like I did a while back with the demo of Angry Birds, you can give Appium a picture of a game object and say, well, you know, find where that object is on the screen, and then you can sort of, you know, run some Appium touch commands to tap that object or swipe it around. But you're still kind of working blind because even if you can use image based automation to automate actions, you don't really know what's going on inside the game as a result. All you can do is look for certain things that are on the screen. And games are so dynamic that you're often not in a position to be able to guarantee that the game state is always going to be represented by the same image as it was last time you were in that exact same state. Another problem with image based automation is that, you know, the libraries that exist that Appium can use are just kind of too slow.  So, you know, I'm not maybe super proud of this, but I think it's great that other projects have come in to fill that gap, you know, Appium basically had no answer for this question. So some other folks came in and made some other own answers. So I'm thinking of projects like Alt Unity tester from Altum and AirTest from NetEase. Alt Unity tester I think was actually demoed, I don't know if it was for the first time, but fairly early on in the project I think at the first Appium conference. So this is something that people have been working on for a while and they've come up with some pretty good solutions for. But it's still not Appium, you know, and I obviously want these things to work in Appium as well. And even tools that, you know, say they integrate with Appium like Alt Unity tester is sort of destroy one of the basic premises of using Appium, which is that you want to use this single web driver based API for everything. And instead they force you to kind of use two APIs, which are distinct in a side by side fashion. And that's, that's fine. That's possible. But to me it wasn't ideal. So, you know, I took this, took this sample game that I was able to build from the tutorial code. And, you know, I started thinking about, okay, well, what if what would I want out of an Appium, you know, game automation thing, how would I even try and, you know, turn this type of behavior that we're seeing right here into a test, right. So the type of behavior we're seeing, we could have one test case that says like, well, let me just show you some code, you know, this is kind of what I was dreaming up. I was thinking about this problem like what would I want this test case to look like. So here's a test case where we're trying to say that this game should allow the player to run and catch some tokens. So these little diamond like things here, while avoiding enemies, right. So while jumping. So, imagine that we have basically a page object called game that, you know, encapsulates all of the whatever the details are here, and just exposes some high level game specific functions that we can use in our test suite. And the same principles that we would use for developing, you know, a mobile app test suite or a web app test suite. Well, we say, oh, let's let's make the player run for 1000 milliseconds or one second. And then let's make an assertion on the state of the game. And so this is something that is really important to be able to do that's hard to do with Appium, you know, you could use Appium's action API to, you know, hold down an arrow key or something like that. So how would you make a character run with Appium with Appium how would you determine that there was a token nearby the player. How would you make an assertion on that. You really couldn't without relying on, you know, somewhat flaky image based automation. Same goes for figuring out if there's an enemy near the player that might need to be jumped over. Or how would you run and jump at the same time and how would you make that expressible in your test code. And then how would you make an assertion that after you've made this jump, the number of tokens that is quite close to the player like within a couple blocks of the player is actually decreased right because we've we've changed the state of the game we've taken the number of tokens from whatever it was before down one because we've consumed one of these tokens. We could, you know, find another test case here and the little example I showed of if we run into an enemy, and we don't jump on its head but we just run into this red blog here. We want to assert that the player has died. You know, so this is a pretty short test case basically we're just saying that we're asserting that the player has already done something in the game so it's not starting at the initial spot. Then we're having it run in this direction towards an enemy. And then we're checking that the player died. Right. So this is this is something that I think would be pretty cool to have. And I guess what I want to say now is actually these videos are an example of Appium running those tests so that code I showed you wasn't just. Oh, I this is what I hope will happen. That's actually code that I wrote that uses this Appium plugin that I developed to integrate with the Alt Unity Tester server. And actually can figure out the state of the game and can run and jump into all these things in basically real time without a lot of lag. And actually use it to, you know, automate these types of applications. So I chose Alt Unity Tester as a kind of basis for this plugin because it seemed like an amazing technology for Unity app specifically and that's one that a lot of people already used. And again, I just had this limitation of not being kind of directly integrated with Appium, which is fine, you know, there's no reason that it has to be, but I would like it to be so I created this plugin, which basically embeds an Alt Unity client. But then it allows you to basically use whatever driver you want right so you could use the Appium UI Automator to driver to launch your Unity game or you could use the Mac driver to launch your Unity game which is what I did for this example. And then you can just switch into the Unity context and use the commands that are available within that context to actually, you know, work inside of your game versus from the outside, which is where you would normally be with Appium. One of the nice things about this is you don't need to learn the Alt Unity API because everything gets mapped to the standard Appium commands that you already know. You just have access to this API kind of under the hood, just like you would with all the other Appium drivers. So I will say that this project is still in very, very early R&D mode. I didn't get a lot of sleep last night and I was working on it all today still. So it's not like ready for you to use, but I am developing it in the open and hope that it can become something that we all use here pretty soon. I decided to write it in TypeScript kind of as a fun experiment to show that Appium drivers and plugins can be in TypeScript as well, not just JavaScript. So please come help make it awesome. It's up at the Headspin organization here at this URL. So come and check it out. Again, it's not in a place where it's ready for general use, but hopefully over the coming weeks it will get there and become something useful. So that's basically it for me. I had to end with a cheesy graphic with Appium 2.0. You know, the power is yours, but also the automation is everyone's that's kind of the goal here. And I do hope that we can learn something from Captain Planet and that somebody in the audience can figure out how to use Appium 2.0 to solve some of the world's actual problems. And you know, app testing is certainly a worthy problem for us to solve, but there are also some bigger ones, including climate change here. So if anyone could think of how to use Appium to help help rectify that situation. I would love to support that. Okay. That's it for me. I'm not sure we're at time wise to rush, but I would love to take any questions. If we still have some time. Absolutely. I think we can take seven minutes more. I think we could take seven to eight minutes easily. So, okay, great. Go ahead and stop sharing and I'll just have my face up here. That way I can also read some zoom questions at the same time. Wow. Lots of questions. Okay. Yeah. So there's, there's some questions about Appium 2.0 as it relates to specific platforms. So, you know, someone's asking about iOS execution. So this is an important point. Appium 2.0 has nothing to do with iOS or Android. It has nothing to do with what's going on in those drivers. So that's a question for the maintainers of the XC UI test driver. So we don't ask like, is Appium 2.0 going to have this or is Appium 2.1 going to have this for iOS? Appium is no longer related to iOS specifically in any way. The question to ask is, will the next version of the XC UI test driver have this or that? And to do that, you have to go to that repository on GitHub and interact with the maintainers there to figure that out. I do just happen to know because I watched that repo as well that the, I guess the final release of the most recent version of iOS had a significant time regression. There's just an Apple bug that we can't fix or work around. So hopefully they will fix it and release the patch and the next version of Xcode. Okay, let's see what else looks interesting here. Will Appium 1 test run on Appium 2? I think I covered that in the talk. More or less, yes, but just read the migration guide. Again, there's not changes on like the iOS and Android specific sides of it. It's just some kind of architectural structural changes including requiring W3C capabilities and things like that. So let's see. WinApp driver, the Windows technology that the Appium Windows driver uses, someone saying they don't have a lot of momentum and there's no other best alternatives for Windows app automation. That's a sad fact. And Microsoft indicated that they wanted to do more to help that, but they haven't followed through. So I'm not sure what's going to happen with that. I did talk to some other people in that thread about potentially creating a new Windows driver, but I am like very, very far from a Windows developer, so I'm not a good person to actually drive that forward and hopefully somebody with some knowledge of Windows automation will want to, you know, pick up that torch and run with it. I was asked, would some of the of the plugins that I mentioned be moved under the Appium plugins repo, for example the gestures plugin or the device farm plugin, maybe, but maybe not. I mean that's the nice thing about plugins they don't need to be in any one repo for them to be useful. They can be anywhere on GitHub anywhere on npm and you can find and install them, just the same with your Appium server. So, kind of doesn't matter, but maybe. Great question from Garov, how could some experienced users contribute to documentation. I'm hoping to make a call for people to contribute to docs pretty soon. The big problem right now is we don't have a good structure in place. And so getting a lot of people working on a bad structure is just going to make it more work in the long run. So we need to get a good structure in place and create, you know, to do and places where documentation needs to be forwarded or moved or updated. And then I think we can have a board that tracks that effort and maybe have a team of, or we can call it a swarm of open source contributors coming and, you know, tackling some of those talks issues would love for your help to organize that for sure. Someone says hi hello. Hello to you as well. Specific, specific bug questions. I'm not going to answer right now. Will Appium 2.0 be released for Raspberry Pi? I don't know. You could probably run Appium on a Raspberry Pi. I don't see why you couldn't. It's just a Node.js library. So I'm going to go ahead and say yes. I ran it on a Raspberry Pi at the last Appium conference and I don't think we've done anything that would make it not work. So yes, I think. Is this anything related to Appium? I'm not sure what this is, but I'm going to go ahead and say yes because everything that we're talking about is related to Appium. I'm going to try to get started with plugin creation. Well, coming to the workshop yesterday would have been a great first step, but we'll create some resources and some guides. But right now the best thing to do is to go to the Appium plugins repo where the kind of official Appium plugins live. And there you can read the code of the existing plugins. Some of them are very simple. There's something called base plugin there. And the read me for base plugin actually has a lot of information about what you would need to do to write your own plugin. So I would start with that. That's probably enough to get you going. But like I said, we'll also hopefully be releasing a sort of general guide to driver and plugin creation or maybe I'll do a set of videos on that or something. So keep an eye on anything like that. We'll all announce on my Twitter, which I think was on the slides. It's just jlipset on Twitter. What are the reasons to split Appium desktop and Appium inspector? The two big reasons for me were that Appium desktop was a massive application when you unpacked it. It was like a gigabyte in size. It was ridiculous. And most people need the inspector, but most people don't need the server. And the server was the thing that took up all the size. So I use the inspector, but I don't use the graphical version of the server because I just run the server from the command line and so do a lot of other people. So I wanted to be able to download and launch the inspector in less than like 15 minutes or whatever it normally takes because Appium desktop was such a beast. So that was one reason it just seemed like they're different enough applications and it would be nice to have the one that people use most be much more lightweight and easy to use. The other reason is that the Appium desktop server cannot be a web application because it is its own server and it has to run Appium and Appium can't run in a browser. But the inspector is just an Appium client and that can run in a browser. So I wanted it to be its own project so that we could do things like run the inspector on Appium Pro as a regular old website. And I think that that's a huge win for people so that they don't even need to download anything to use the inspector. That's the other main reason. Let's see. Someone's asking if Appium 2 is compatible with the Apple M1 chips. I don't know. I think so. I don't have an M1 laptop yet. Hopefully soonish but we haven't done anything between Appium 1 and Appium 2 that's fundamentally changed the way that the technologies work. So it should work. The only question is is there some dependency that Appium has that for whatever reason doesn't work. But it wouldn't be because of anything that is Appium specific. It would be like, oh, does the Android emulator work? You know, do all of the Node.js native bindings and the dependencies we use work and things like that. So I don't know until I try it. I think some people have tried it on M1 machines and found it to work but I haven't myself. Let's see. Is the Appium web inspector the browser version? Is that only for hybrid apps? Or is it also for native applications? It's for everything. It's the exact same inspector that you would use as an application on your computer. It's just hosted in a website. It is literally the exact same thing. In fact, when the inspector is running as an app on your machine, it's also still a website. It's just running in a container so it looks like an application. So there's no difference between the versions of the inspector that you download versus the one that you run on the website. Yes, G2 mentions that to make the Alt Unity plugin work, we need to add the Alt Unity tester asset within the game and you have to build it into the game. And yes, that's true. Otherwise, there's no way of doing this with Unity. The only way to get access to game state and game objects is to actually build things into your game because Unity doesn't expose those in some kind of you know, officially supported way. Like Apple officially supports X UI test and exposes automation capabilities. Unity doesn't have anything like that, which makes sense because Unity just compiles applications into you know, kind of opaque binaries and runs them on a huge number of platforms. So in this case, yep, you were not, you know, testing the binary that we're shipping, we have to build in the Unity server, the Alt Unity server to make it work. But because that's the only option we have, I'm cool with it. But yeah, you have to follow the directions that Alt Unity provides for embedding the asset in your game for that to work. Um, let's see. Will there be scenarios? This is a question from Vinod. Will there be scenarios where multiple plugins are triggered at the same time? Yes. This is fully supported. Plugins can choose whether or not they allow other behaviors to also run. So plugins aren't guaranteed to work with one another. And this kind of has to be the case because the plugin has to have the prerogative to choose to fully overwrite an apium command or to, you know, allow the original behavior to run and then to do some modification on the result of the original behavior. So internally apium kind of stacks the plugins in the order in which they're included and it will run each of them within the other. But at any point plugins can decide not to continue down that chain and just do something on their own. So you could run into a situation where two plugins don't play nice together. But that's kind of the reality of the world if two plugins are trying to modify the same behavior and conflicting ways, you just don't want to use them at the same time. But if two plugins don't conflict, then you can absolutely use them at the same time. I think I was just about to interrupt and say, I think we are at a good point. I see there are a lot of questions. There are people who are curious to learn more. So it's always great to see that. I think there are 44 questions and I also see a lot of people asking questions in the chat itself. So lots going on. I believe Jonathan will be available in the head spin virtual booth and you can meet face to face with him and ask him more questions. I know it's pretty late for him but he's going to hang around for some time at least. And I'm going to take this opportunity now to quickly jump in and walk through some of the important things people need to know to get the best out of this conference. So I'm going to quickly share my screen, maybe take 15 minutes to run everyone through some important updates, important information they need to know. But before I jump in, I do want to thank Jonathan for the wonderful session. I think people are still asking questions. So that's in my view a way to measure how good a session was. So fantastic job again Jonathan, thank you.


Welcome to another Tickwell Jata with me Patrick Manley, I want to draw your attention again to the sterling yen we talked earlier in the week about the weekly breakout which we should be getting confirmation of come Friday. In the interim a couple of opportunities developing on the intraday hourly time frame, the closing breach of this trend line and through the pivot here at 154.27 opportunity on the short side to look for a test of this primary ascending trend line support coming in at 153.15, watching the bullish reversal patterns there to set long positions to try and start accumulating on the long side to play for the bigger move but certainly we can start to think about a test at 155 on the upside. As always trade the plan that's importantly manage your risk. Until next time, thanks very much.


Ukrainian Army breach Russian first defense lines. Ukraine said its troops had broken through Russia's first line of defenses in several places, though they then encountered even more heavily fortified Russian positions. Deputy Defense Minister Hannah Malier said Kiev's troops, in a much-vaunted counter-offensive against Russian forces, were advancing in the Zaparizhe region. There is an offensive in several directions and in certain areas. And in some places, in certain areas, this first line was broken through, Malier told. Malier said, however, that Kiev's troops who have been battling to advance through heavily mined areas for almost three months had now run into major defensive Russian fortifications. Our armed forces have to overcome a lot of obstacles in order to move forward, she said. Heavy fighting swept the villages around Bakhmut in eastern Ukraine, captured in May by Russian forces after months of battles, Malier said, but added it was difficult to determine whether any advances had been made. In the course of a single day, positions between the two sides can change several times. Over the past 72 hours, Washington has noted the noticeable progress made by the Ukrainian armed forces on the southern offensive line, including in the Zaparizhe region, as well as some success achieved in relation to the second line of Russian defenses, White House National Security Council coordinator John Kirby said. This does not mean, Kirby added, that Ukraine's forces do not realize that they have a tough fight ahead when they try to advance further south, or that Russia may launch countermeasures.


Good afternoon, ma'am. Hi. How are you doing? Good, how are you? I see your passport. I'm fine. Thank you. Hey ma'am, do you have anything to declare today? Yes, officer. I have a thousand dollars in cash in my purse here. Guess I'm supposed to tell you that. Yes, ma'am. Let me take a look. Okay, anything else to declare today? How about in your backpack? No. It's just clothes and stuff. I don't have anything else. Well, ma'am, you've got more than a thousand dollars here. Quite a bit more than a thousand dollars. Are you sure? I could have sworn there was only one thousand dollars there. No, ma'am, you've got more than two thousand dollars in cash here. And I'm really going to need to take a look in your backpack. I think you must be mistaken, officer. I mean, I see only one thousand there. And I can assure you that there's nothing in my backpack that would be of interest to you, if you know what I mean. Well, ma'am, if you don't have anything more to declare, then you won't mind me looking in your backpack. I think you might want to count that cash again, officer. There's only one thousand dollars there, okay? It is likely that as U.S. customs employees, you will be subjected to offers of bribery or illegal gratuity sometime during your career. It is therefore important for you to understand exactly what bribery is and what to do about it. Section 201, Title 18 of the U.S. Code states that it is unlawful to directly or indirectly, corruptly give, offer, or promise anything of value to any public official to influence any official act performed or to be performed by that official. Put simply, bribery is a felony, and anyone who makes or accepts an offer of a bribe is breaking the law. Now, bribe offers come from many different sources, from informants, prisoners, friends, family members, and unfortunately, even from fellow customs workers. They come at any time, on duty, off duty, even on holidays or leave time. They can be spontaneous or they can be methodically planned and presented to you by someone you trust. In short, there is no pattern to the offer of a bribe, so you must be prepared at all times to react responsibly and sensibly to protect yourself and the interest of the customs service. In this program, you will be presented with a number of different situations in which a bribe offer is presented to a customs official. You will see the offer and the response. Then you will be given an opportunity to discuss what you have just seen. In this way, you can better learn how to deal with a similar but real situation when you are confronted with it. Let's move on then to our first scenario. Better not be work. Malone's got you covering everybody's shift down there. Hello? Hey Brian, it's Lester Stiles. Uh, yeah, Lester. Buddy, how's it going? Oh, okay. As well as to be expected, I guess. Oh, yeah, look. I'm sorry about the suspension. It must be tough, huh? Yeah, it is. So, the investigation ought to be over in another week or so and you'll be right back at work, right? Yeah, I know. That's what I keep telling myself. You're a good friend, Brian. I appreciate the support. Listen, you think you can meet me down at Murphy's for a drink? I got something I really, really want to talk to you about. Uh, I don't know about that, Lester. Look, this is my first night off in a week and Jess and I just kind of settled in. How about lunch tomorrow? Oh, no can do, Brian. I really need to talk to you tonight, man. Come on. Jess'll understand. Come on. Don't do this to me, man. I'm not so sure about that. Look, work schedule's really been a nightmare since you've been gone. Listen, Brian, I wouldn't ask you if it wasn't important. Can't you spare an hour for an old friend? Hey, don't do this to me, man. It was so important that it can't wait till tomorrow. It's about money, Brian. Lots of it. I want to do it by myself. I can't do it by myself. Not without your help. I really need your help on this one, buddy. I can both make a bundle. Lester, does this have anything to do with the job? Tell me. Listen, Brian, if I was on the line, I'd do it myself. I really need you, man.  In front of my wife asking me to do some low-life stunt like this. Look, we get paid to bust people for doing what you're about to ask me to do. Okay, Brian, forget it, man. I just thought- I didn't think, Lester. Look, you're already on suspension, so maybe your job doesn't mean anything to you, man. But I'm lucky to have the job I've got, and I'm proud of what I do. Listen, Brian, this is just between you and me, right? I mean, you don't have to tell anybody, do you?  I promise. All right, Lester, this conversation never happened. We're clear. All right, well, look, I want to get back to Jess, okay? Okay, I'll see you around. Yeah, buddy. I'll see you. An old friend in trouble calls you up and asks for a favor. Problem is, during the favor means breaking the law. Problem is, just by asking for this kind of favor, your friend has already broken the law. That's about where our friend Brian found himself in the last scenario. So what does he do? Just about what any friend would do, I expect. But as customs officials, that's not good enough for us. So let's turn back the hands of time and see if Brian has another solution to his problem. Man, don't do this to me, Lester. It's about money, Brian. Lots of it. I can't do it by myself. Not without your help, I really need your help. A lot of money? Huh? It doesn't cost me anything? Hell yeah, I'm interested, man. But look, I can't leave Jess tonight. So what have you got, man? Work. What do you mean it's about work? Listen, Brian, I'm innocent of those charges. Everybody's been talking about man. Now I've got a family to take care of.  So I figured out a way to make enough money to make it right for me and them, and you. I don't know, Lester. I guess it has a lot to do with how I feel about how right you're going to make it for me. And they'll be fair, more than fair. Well, what do you mean, more than fair, Lester?  So I need to know up front, okay? Well, I can probably find that out. I'm going to see them tomorrow, but that's why we have to meet tonight, Brian. We need to set this up. What? It's going to make Jess too suspicious. Hey, she hears nothing about this, right? Right, right. I'm not going to say nothing. So tomorrow, late lunch, 2 o'clock, Stacey's diner, right? Okay. 2 o'clock at Stacey's, right. Thanks, Brian. Hey, don't thank me. You just know what the payoff is tomorrow. The deal's off. You got that? Yeah, I got it. See you at Stacey's. Yeah. Hey, Brian, you about done in there? I'll be there in a minute, honey. Yeah, Sector. Look, this is Inspector Brian Ballard. Advise internal affairs duty agent to give me a call right away, okay? Yeah. Tonight will be fine. Our friend Brian really feels bad for what he's about to do. An old friend, a fellow customs official. What he needs to remember now is that old friend offered him a bribe. And by doing so, not only broke the law, but diminished a friendship. Inspector Ballard is duty bound to report this incident to internal affairs. But he can console himself with the knowledge that a true friend would never have placed him in the position to do so. He is therefore reporting the crime, and he is identifying the criminal, not a friend. Let's move now to our next situation. Out to a customs entry point where there is always some excitement. Good evening. How you doing, sir? Nice car. Thanks. I like it. Wish I could afford one like it, but hey, I know what this thing set you back. You can't afford it, Inspector. You just have to want it bad enough. Yeah, we're blowing off a house payment once a month. I wasn't talking about your budget, Inspector. I'm talking about opportunity. About playing your cards right. Here's your opportunity. If you play this card just right, it can open a lot of doors for you. No, thanks. I don't play those kind of cards, sir. Okay. No harm done. Look, I think you better head on down the road and don't come back here through my lane anymore. You get my meaning? Loud and clear, Inspector. Good day. Good day. Bad move. Looks like our Inspector is afraid to get himself involved in anything, including an investigation. When confronted with a situation like this, he should have played it smart. Kept his foot in the door and then contacted internal affairs. The fact is, this may not have been a bribe offer. It truly could have been a legitimate proposal. But our Inspector failed to clarify if this was a bribe offer. The only way to find out is to carry it through. Let's go back again to see if he could have worked this any other way. Here's your opportunity. You play this card just right, and it can open a lot of doors for you. A card just like this one, huh? Anything you want, boss? Okay, Mr. Smith, what do you have in mind? You call me at that number. In a position like yours, you could make ten times your salary in just one day. Really? Well, I'll give it some thought.  Okay. You call me now. I'll do it. Hello, Internal Affairs. This is Inspector Gallant. Listen, something happened out on the line today that I think you might want to know about. Much better. This time our Inspector kept the lines of communication open. He was able to obtain identifying data with the business card and the vehicle license. He established the groundwork for future contact, clarified the bribe, and, according to policy, contacted Internal Affairs right away. If this is a legitimate offer from Mr. Smith, the investigation team will find out soon enough. And if it is not, then, with a little quick thinking, our Inspector has established the foundation for uncovering illegal activities. Now, let's move on to our next scenario. I've got to get going or I'm going to be late. Oh, come on. Not so fast. Let's play a little hooky today. Little champagne. Maybe go for a swim, get some sun. That sounds delicious, but I have appointments all afternoon, lover. I've got to get to work. Besides, don't you have a three o'clock shift yourself? Yeah, but I've got a lot of sick days coming in. I feel a little chest cold coming in. Well, I don't. I'm not going to let you bamboozle me into missing another day of work.  No. Do we have to talk about him now? Come on. We can talk about him. Come on, buddy. Quit fooling around. I told you about this weeks ago and you keep avoiding me. We got to talk about it now. Uncle Roberto wants to make the trip next Thursday and that's less than two weeks from now. Thursday? Damn. Look, I thought you were kidding. Don't pull that on me, buddy. You know I wasn't kidding. Leslie, don't you get it? This is my life we're talking about. This is my career.  You've got to be kidding me. How many times did you let me across without paying duty? Did you get caught then? Look, that was totally different and you know it. I know you. I don't know this guy. And you brought tequila and trinkets and... Look, this guy, I don't know what he's bringing. What is he bringing over the border? I don't know. He said it's better that way. Yeah, right. I don't know what he's bringing over the border. I don't know. He said it's better that way. Yeah, right. I don't know. Look, it just isn't right. You don't know what you're asking. Yes, I do, buddy. But I know you're smart and you're not going to get caught. I also know it's worth a lot to my uncle. He'll pay, buddy. He'll pay big. This is for you, right now. It's only a down payment. There's a lot more once he gets here. Come on, buddy. You know what this money could mean for us? Times we could have, the places we could go. We could go anywhere we want. What does this always have to be about money? I thought we had something between us. I should have known you were just making me for a payoff. I can't believe you would sell yourself this cheap. Look, I don't care what you're selling, I'm not buying.  Our inspector has missed a great opportunity here. Allowing friends to escape customs duty taxes obviously against the law. So he definitely has some explaining to do. But he shouldn't compound his mistake by letting a bribery and smuggling attempt go unpunished. Let's go back then and see if by keeping a cool head our inspector can find an appropriate way to enforce the law. I don't know, Leslie. Look, it just isn't right. You don't know what you're asking. Yes, I do, buddy. I know you're smart. You're not gonna get caught. I also know how much it's worth to my uncle. He'll pay, buddy. He'll pay big. This is for you, right now. It's just a down payment. There's a lot more once he gets here. Come on, buddy. You know what this money would mean for us? The times we could have, the places we could go. We could go anywhere we want. All right, now you're making some sense. Let me get this straight. Your uncle wants to sneak something across the border and he's gonna use that as a down payment. And he needs me to help him do it. Is that all there is? Well, I guess you could put it that way. And that's just a down payment.  Right. You get the rest as soon as he's safely here. How much? I got to know. Twenty thousand. As soon as he clears customs. Okay. I need to know exactly what he's carrying. I told you. He didn't tell me. I don't know.  I need to know exactly what he's carrying. Or I'm not gonna do it. You'll find yourself another sap. Cocaine. Okay? It's cocaine. But I don't know how much. I swear to you. All right. All right. I need time to think about this. I'll tell you what.  Buddy, I gotta know now. Look, I can't tell you now. Just give me a little time to think about it. Just go on home. I could come over tonight and we could... No. Go home. I'll call you first thing in the morning. I promise. Okay. First thing tomorrow morning. First thing. Hello. Internal affairs? Yes. This is Inspector Buddy Copeland. Yes. I have a bribe to report. Right. Before I do that, there's something else I need to report. Yeah. About two years ago... Inspector Buddy Copeland has a couple of rough days in front of him. There are going to be some tough questions about his previous conduct out on the line regarding his lady friend. But in all likelihood, he has salvaged his career and his integrity. Now, let's see if our next customs official is thinking as clearly. Yeah. That was some great work, Donny. Thanks for the tip. Yeah. Let me tell you, those guys are going down for a long time. We couldn't have done it without you. You know, agents like Mike and me would be lost without sources like you. Hey, there's no problem.  Yeah, me too. Larry was right. I know this is our first time together, but I hope it's not our last. Now, Mike, that's a nice thing to say. I appreciate it. Thank you, bro. Hey, it's going to be a nice payday for you, too, Donny. Nice payday. Check that out. $100,000. You know this is my favorite part. Hmm. Feeling? Loving air, boys.  Yeah, and a ritching at that. Don't spend it all in one place, okay? Larry, we better get back to the office. We've got a ton of paperwork to do before the day's through. Yeah, I'll be down there in a minute. So, listen, that really was a good one this time. Hey, you did good. Thanks, Larry. Listen, I gotta go, but let me know if anything happens with that business in Miami. Hey, listen, Larry, let me run something by it. You got a minute? Hey, listen, Mike can wait. It's going to take a few seconds. All right, all right. What's he got? Well, I'll tell you what. I got something that this $100,000 looked like pocket change. But first, let me just say this, Larry. I wouldn't be telling you this if I didn't know we could trust each other.  And most of all, that you'd be okay with this. I know where you're coming from. I know where you're coming from, Donny. What's up? Okay, listen, here's the deal. You know that shipyard, man?  Yeah, every day, so what? So, every couple of weeks or so, one of those shipments is going to have something a little extra inside, if you know what I mean. Your job is to check, see if the company is on lookout, or if that particular shipment has been scheduled for examination, so to speak. Hey, if that's the case, you let me know. I let my people know everybody walks away, nobody gets hurt. And what if the shipment's clear?  I'll give you 10 grand, simple, right? Hey, that's all you need to do, man. All we need is the intelligence. The only person you have to talk to is me. This is going to happen every couple of weeks? Well, you have a take. I'm going to make 20 grand every couple of weeks? Is that what you're saying? Hey, Larry, only if the shipment goes through. But you know that's going to happen almost every time. Yeah, I know. Okay, so what do you think? Well, it sounds too simple. I mean, 20,000 bucks a month sounds too simple. I mean, what if something goes wrong? What if I don't get the intelligence straight? What if they change the schedule on me at the last minute? A lot could go wrong here. I'm telling you, it sounds too risky, Donny. Hey, listen, with anybody else, I'd say, yeah, a lot could go wrong. Not you, Larry. I know you, man. You're good. You're real good. You're not going to let anything go wrong. I know that. I told my people that. And anyway, your payday's going to be so high. I don't know what you're talking about. Look, it's five grand. Okay? Let's just call it a good faith offering. Go on and take it.  And we nail maybe what, one in every 10,000?    There's something wrong with this picture, Larry. Look at it. Wrong guys are getting rich. You know you're right. Maybe it is time to balance this thing out for once. Okay. I'll tell you what, I'll set it up a couple of days. I'll be back in touch with you. Okay? Listen, I gotta go. Guess what?  Are you kidding me? I thought he's going straight. So did I. Damn it. Well, there goes our backstage pass. No more busts for Donnie Stringer. Yeah, except for his own. What's the angle? Hey, let's head on over to IA. I'll tell you about it on the way. All right. We've got a couple of problems here. First, whenever a bribe offer is made, it should never be shared with anyone other than internal affairs. The reasons for this are obvious. Secondly, even though our investigator was well-intentioned, he should have never accepted that money from his informant. There is a much better way to handle the situation in which he has found himself. One that will not leave him vulnerable to his informant or place his integrity into question. Let's check it out. You're right about that, Donnie. And the money does sound good, but I don't need to take your money just yet. Let me think it over and I'll call you tomorrow. Yeah, man. Take it anyway. Even if you decide against it, but I know you want.  Plus, it's safe. No, man. You keep your money. Listen, this is a big step for me. Let me think it over, huh?  Okay, man. You suit yourself. But, Larry, next time we meet on this thing, I'll be checking you for wires. It's just the caution. I mean, I know we've known each other a long time, but you are still carrying that badge, old buddy. Fair enough. Listen, I gotta go. I'll call you tomorrow. Sure thing. Out of here. Hey, let's get out of here, huh? Everything okay? Yeah, yeah, I'm just a little tired. Hey, what do you say when we get back to the office, you will start that paperwork without me? I gotta do something. Sure, Larry. Anything I can help you with? No, no, I gotta do this alone. This time, Larry played it smart. By keeping his head when the bribe offer was presented, he was not only able to ensure that his integrity remained intact, but was also able to set the stage for uncovering an illegal smuggling operation. In addition, Larry demonstrated both self-restraint and a thorough knowledge of customs procedures by not telling his partner about the offer and immediately contacting internal affairs. Overall, Larry gets high marks on how he handled this situation. Now, let's move on to another scenario to see if our next customs official scores as well. Man, look at this neighborhood. Look at these houses. I guess we know how the other half lives. Never my best dream ever did I live in digs like these. Yeah, they're nice, all right. Nice? I bet this guy's lawn boy makes more than me and you. Yeah, I think this is him coming. Yeah? There it's our man, all right. And right on time. Thank goodness for small favors. Nice touch. Give me a break.  All the time, me and you are bopping around in a soccer mom's dream van watching him do it. Just saying fair. Whoever said life is fair, Sam. Come on, we're doing all right. I like my job. I know you like it too. I got a wife who loves me. I got two great kids.  Didn't you ever want to do more for them? I mean, I know I want to do more for mine. You know what I mean? Yeah, I know. That's why we're here, Sam. We just gotta plug away and do the best we can. Yeah, yeah. Chances are when we nail them it'll be out on the street in 48 hours.  I'm sick to death of it. I'm gonna do something about it too. What are you gonna do about it? Well, I was thinking we might get a little gravy while the train's still in. And I want us to do it together.  Look, the only thing this war on drugs is doing is making the wrong people rich. I thought it was time to turn the tables a little. I found a way where we could make a fortune without any risk. Really? How are you gonna do that? First, let me know if you're interested. Yeah, I'd be interested. All right.  Yeah. What about it? Well, it's our informant who's supposed to tell us where the car is the day after tomorrow. Same as usual, right? Yeah, so? So in the beginning, it goes according to plan. Cisco calls to say where the car is parked so our guy can go pick it up. So I know somebody who'll pay us $100,000 to tell him where that car is before our informant gets there. So what are you saying? We give this new guy the information so he can steal the car and the money before our informant gets there. Exactly. In the meantime, no one can figure it out. The car and the money's just gone. And we both split $100,000. 50-50? You really think we'd get away with it? They'd never catch us in a million years. You know how the operation works. There's no risk. I don't know. This is heavy stuff, Sam. Let me think about it, okay? All right. All right. You go ahead and think about it. But I'll tell you what, I don't want to do it without you. So you go ahead and decide, and that's what we'll do. But I'm just asking your partner. Do this one for me. You're right. I'll, uh... Let me just think about it overnight, okay? I'll let you know tomorrow. Good enough. So how long are we gonna sit here and watch this scumbag? About an hour. I'm sorry, darling. I didn't mean to wake you. No, I was waiting out for you anyway. How was work? Paul, is everything okay? Sam offered me a bribe tonight. Your partner, Sam? Yeah. I still can't believe it. I just feel so lost. We've been partners for six years, Dee. I thought I knew him. God, Paul, what are you gonna do? I can't turn him in, Dee. He's my partner. So? What are you gonna do? I'm gonna tell him no, of course. Maybe that'll end it. He said he won't go through with it without me. I hope that's true. Me too, Paul. I hope you're doing the right thing. I'm not doing the right thing, Dee. I feel sick about it. Loyalty is a good thing, most of the time. But if misplaced, it can do more harm than good. Paul knows exactly what he's supposed to do, but his loyalty to his partner is jeopardizing his career and his integrity. He has also compounded his error by informing his wife of the bribe offer. Maybe he should think about it again and see if he can see his way through to taking the only option that this predicament offers. Paul. Hey. I'm sorry, darling. I didn't mean to wake you. No, I was waiting out for you anyway. That was work. Paul, is everything okay? No, but it will be. I've got a problem at work, but I'm gonna take care of it.  I shouldn't be long. I've got to go out to the living room and make a phone call. I'll be right back, I promise. Doing the right thing isn't always the easy thing and doesn't always make you feel better, but it will keep you out of trouble and in the end is always the only thing to do. The import specialist in the next scenario is going to find herself in a similar situation. Let's see if she draws the same conclusion. Jason, how are you? Come on in. For my favorite girl. Oh, Jason, you didn't have to. Well, yes I did. I'm really sorry I couldn't make it Friday night, Leigh Ann. I was working on a proposal for a contract with a big-time computer manufacturer and I was really behind the eight-ball. But I'm going to make it up to you this weekend at the lake, provided we're still on, aren't we? Just try to get out of it. Thank you for the flowers. Sure. And listen, what about dinner tonight? My penance for missing your dinner party. You sure you have the time with the contract and everything? Sure, sure. It only needs another three hours to work max. I'll be done by the night easy. I'm headed over to finish it up now. So how about if I pick you up at eight? That'll be nice. You know, Leigh Ann, you are as pretty as that rose. Go on. Get out of here. Leigh Ann, I forgot. I wanted to ask a favor of you. What's that? Well, this contract that I'm working on, I'm real close to landing it, but of course price is a major issue and the company is concerned about the duty that they're going to have to pay on one of the items that they want shipped and duty depends upon its classification. What item are you talking about, Jason? Well, CPUs. What's the problem? Well, I don't have to tell you about the motherboards and CPU classification. You mean whether or not the CPUs are attached to the motherboard? Well, yeah. And I was also telling my customer that I might be able to get assurances that any shipments of that item would be classified as unattached CPUs. I know that by doing that it would save them hundreds of thousands of dollars. And then you could land the contract. Yeah. And the favor for me starts with the fact that those CPUs aren't unattached. Are they? Well, I don't know that, Leigh Ann. I'm just passing along information that my customer told me. Jason, now to know about this, classifying your merchandise so you can get a better rate. I mean, I could get into a lot of trouble. If you get caught, Leigh Ann, there's so much stuff that goes in and out of here. They're not going to see one little mistake, even if they do. You can always say that it was just a little mistake. But this really means a lot to me, Leigh Ann. A lot to us. If I get this contract, we could always take that trip to Hawaii that we've been talking about. And then I will shower you with roses. No, it's too risky, Jason. I could lose my job. I could go to prison. It's not worth a trip to Hawaii. You're not going to get caught, Leigh Ann. This means a ton of money to me, to us. We can go wherever you want for as long as you want. Don't pull that on me, Jason. Don't make this come between us. I'm not going to change my mind. I can't just give you a classification without inspecting the merchandise. And if the CPUs are attached, then they're attached and they'll be applied the proper duty. Look, Leigh Ann, I'm sorry. I can see that this put you in a very bad situation. I guess I was just being stupid, I don't know. I really don't want to get you in trouble. I hope this doesn't ruin it for us. No. So we're still on for this weekend? And tonight. Don't forget about tonight. I'm headed over to finish up this proposal because I am going to win this contract. Good. See you. Wanda, this is Leigh Ann Spencer. Can you get me in this afternoon? I've got a date tonight and my hair's a mess. That'd be great. Thanks. Bye-bye. Wrong number, Leigh Ann. This man is a customs house broker and one should be on guard of socializing with a member of the importing community in order to prevent a possible conflict of interest. You should have notified your supervisor of your relationship with Jason and recluse yourself from any professional involvement. Aside from that, he just asked you to use your position to cheat the government out of hundreds of thousands of dollars. He asked you to break the law, risk imprisonment, compromise your integrity, and in the same breath, ask you to go to Hawaii with him. Are you sure you want to go anywhere with this guy? Don't you think you have another phone call to make? Let's go back and see if you've got that number handy. This means a lot to me, Leigh Ann, to us. If I get this contract, you can always take that trip to Hawaii that we've been talking about. Then I will shower you with roses. It's risky, Jason. I could lose my job. I could go to prison. Are you sure it's worth a trip to Hawaii? You're not going to get caught, Leigh Ann. This means a ton of money to me, to us. We can go wherever you want for as long as you want. Let me think about it, okay? This is a big step for me. That's fair. I know you'll do right by me. I can hear those ocean waves now.  I'll pick you up at eight. Hello, internal affairs. This is import specialist Leigh Ann Spencer. I have a bribe offer to report, but I've got to tell you something else first. Leigh Ann Spencer has some explaining to do. By failing to notify her supervisor of her relationship with a customs house broker and reclusing herself from any professional involvement, she has fostered a conflict of interest that could have been harmful to the U.S. government. But by keeping her head when the bribe was offered and having the courage to come forward, she has saved her career and her integrity. And that's what this program has been all about. The scenarios we have seen here today are fiction, but they're all based on U.S. customs case files. And although they are all different, in a way they are all very similar. They all testify to the importance of recognizing a bribe and playing it smart when it has been offered. They all affirm the necessity of integrity and having the courage to do the right thing. Statistics show that bribery or attempted bribery from the outside or from within will somehow affect every U.S. customs officer. I think we can therefore all see the importance of being prepared both mentally and morally when that offer is placed in front of you. President Theodore Roosevelt once said, There can be no crime more serious than bribery. Other offenses violate one law while corruption strikes at the foundation of the law. The givers and takers of bribes stand on an evil preeminence of infamy. The exposure and punishment of public corruption is an honor to the nation, not a disgrace. Taking these words to heart, it is important for all of you, when and if a bribe is offered, to be prepared to play it smart and make the right decision.