All right, so here we will talk a little bit about what has happened in the last year or so, six months to a year, with the DHS2 application platform, particularly focusing on new features since we held the last workshop, academy and workshop in August of 2020. Obviously, a lot has happened in the world in the last year, but we'll talk specifically about what has happened in the world of DHS2 web application development. A little bit of a review for those of you that aren't familiar with the application platform. What it does is it takes away all of the hard stuff that you need to do to build a DHS2 application, but that isn't specific to the app that you are building, and it gives all of that to you for free. That's the idea. So it's a shared shell that includes a lot of things like the header bar and common UI components and the ability to fetch API and soon the ability to do offline capabilities for DHS2, how to do translations, how to set up alerts, things like that. And it does all of that for you, and it's the same tool that is used by the core applications and the DHS2 core team to develop those applications. So this makes it very robust and powerful for developing applications from third parties as well. There are three main components to this application platform, and again, I'm not going to go into too much detail about any of this in this webinar. This is just an overview of what's changed and what's coming soon. If you want to learn more, there's a lot of content already on developers.dhs2.org, including all of the recordings from last year's webinar or workshop as well as webinars. And then we also have the academy coming up for developers if you want to dive into how to actually use these tools to build DHS2 applications. There are three main components to the web application platform. The first is app scripts, which basically is a tool to develop, build, and publish an application. It does a lot of things like putting your application into the shell, packaging it up, writing out a manifest file, creating a zip file, publishing that application to the app hub or deploying it to a DHS2 instance, and has a lot of other features as well under the hood. The second component is what we call the app runtime. And this is basically a library that the application can use to talk to a DHS2 instance and to do some other things like interacting with the shell, to show alerts, to figure out what version of the server it's talking to, those types of things. And then the third component, major component, there are some other small ones as well, is the UI library. So we have a fairly complete React library for building applications. This involves a number of different components. And we're constantly expanding the set of components and also building more complex advanced components like organet tree, transfer component, things like that, that I will get into a little bit in a minute. But this allows you to very easily build an application that follows the DHS2 design system, which is a set of guidelines for how to build a professional and very usable application for on the DHS2 platform. So some of the new platform features in 2020, I just listed them out here. I'm not going to go into too much detail about what each of these are. There are a couple big ones that I'll get into in a minute as well. But these are some of those that have come up in the last year. One of the big ones is server version detection. So basically this means that a DHS2 app no longer needs to be tied to a specific version of the DHS2 API. It can be able to change its behavior based on which version of DHS2 it's talking to. This is a really big benefit because it means that you don't need to build one app for DHS2 230 and another app for DHS2 235. You can build one app that is able to talk to both of those servers and change its behavior based on the functionality of the server that it's talking to. This is just the first stepping stone in a feature we call feature toggling and this basically enables the on when the application starts, it figures out what version of the server it's talking to and then it tells the application code what version is was detected so that it can change its behavior accordingly. A second bigger feature that we introduced in the end of 2020 is the alert service. This basically is a standardized way for any component in an application to show an alert in the app shell. So there's no need to build your own mechanism for creating alerts, clearing them after a certain timeout for displaying them on the screen. That's all taken care of for you. All the application has to do is tell the platform what type of alert it wants to show and it will show up. The third major platform feature here that I wanted to highlight is a deploy script. So basically previously you had scripts that were built for developing your application locally for building it for production, maybe for testing and that was about it. But now we're starting to add some more scripts that help to streamline the life cycle of an application. And this script is a deploy script which basically means with one command on the command line, you can deploy your application to a particular DHS server without ever opening a browser, creating a zip file, anything like that. You run build on your command line and then you can run deploy, pass some credentials to that server and it will install the application on that server automatically. The next step of this is going to be to publish the app hub from the command line as well. We'll get into that in a minute. We also had a number of features of the UI library that came out in 2020. I talked a little bit about version five, which came out in August of last year. I believe I talked about it. Maybe it came out a little bit before August. I talked about it on the webinar in June of last year. And we also had version six, which came out towards the end of the year and that had one major feature, which was the introduction of standard DHS two icons. So now there is a whole set of DHS two icons, which are available in multiple sizes, multiple colors that are available in the UI library. That includes a standard set of interface components as well as some that are tailored specifically for use in DHS two. And we do have the ability to expand that set of icons if those are requested. But they follow the design guidelines. They're very easy to use and you can learn more about that on the documentation for the UI library, as well as the upcoming academy. We also introduced a number of features to the application runtime. These are a little bit more technical, but lazy queries is one of those. That basically means that you can define a query that will run at some time in the future rather than immediately when it's created. We also made some significant improvements to the query playground, which is a developer tool that allows a developer to test queries against any DHS two instance. We now have the ability to save or basically automatically saves those queries to your local storage in your browser. So you don't need to worry about refreshing the page and losing any work that you have there. You also have the ability to have multiple tabs with different queries and different mutations open. And those can be a very good tool for developing your queries and your DHS two web applications. And then finally, we added some support for non JSON API endpoints. From an application developer perspective, this doesn't change anything. It just adds yeah, some backwards compatibility and some support for different endpoints in the DHS to API that were not previously supported by the JSON only app runtime. A little bit technical won't get into too much of that. Some of the app hub improvements that we had in 2020 as well, we added support for first class organizations, which means that not only does an application on the app hub have a single developer user that created it and is responsible for it, but that user can now be a part of an organization that has multiple users, multiple developers and maintains multiple applications. If you're familiar with GitHub or other platforms, this is something you may be familiar with. We've added that now to the DHS two app hub so that you can have better control over who has access to particular applications that your organization might be responsible for. We also started a weekly submission review process. So every week, a group from the core team gets together to review any new app hub submissions that have come in in the past week. Previously, it was on an ad hoc basis and it was a little bit tough to guarantee that we were providing feedback to people that are submitting to the app hub in a short amount of time. We're now working on improving that process and making sure that we get back to everybody that submits an app hub application in a short amount of time. There's still some learnings and growing pains as we adopt that process, but it's starting to become much smoother. As part of that as well, we introduced a set of submission guidelines which give very clear direction as to what we expect from applications that are submitted to the app hub. You can find that on developers.djist2.org under the guides page. The link is also here. I can share it in the community of practice if people are interested, but this is not meant to dissuade anyone from submitting to the app hub. It's more to give very clear direction to developers as to what qualifies as a quality application that should be submitted to the app hub and to give some additional assurances to people that are downloading applications from the app hub as to the fact that that application should work when it is installed and that it won't be confusing for their users, things like that. The requirements are not very strict at the moment. There are a few very hard requirements and some more suggestions, but we're looking to develop this over time as well as to figure out how best to work with the community to figure out what submission guidelines requirements make the most sense and what should be more optional enhancements to those applications. We'll talk a little bit more about the app hub in a minute. Here's a few things that are coming soon in the DHS2 web application development world. We have native plugin builds which will allow applications to create in an automated way to create both an application as well as a dashboard plugin in the same build. This will have a number of advantages for application developers. You don't need to have a separate application for your dashboard widget that can be tied together and upgraded at the same time, for instance. I'll talk a little bit more in a minute about the major feature that enables this, which is called dynamic runtime modules. I mentioned also earlier server version support, which is added to the app runtime and the app platform. This is the first step in feature toggling, so we'll be adding some additional tools to support turning on and off different parts of your application depending on the server that you are talking to. The next two are somewhat related and they're coming soon. Pretty exciting. I think a number of people have been looking at this for a long time or have maybe done it themselves in certain applications, but this is support for progressive web apps which allows you to download a DHS2 application as if it were a native app on your mobile phone as well as on desktops. Then in combination with the next bullet point, which is data caching and offline data, will allow applications, if they're developed in the right way, to support going offline, continuing to work in the application, going back online, synchronizing all of that without needing to build all of that from scratch. There's a lot of very powerful use cases for offline data entry as well as offline dashboards, for instance, to coming soon. I mentioned also earlier the new deploy command which allows a developer to deploy a new application to a DHS2 instance. We're going to follow that with a publish command which allows for publishing to the app hub directly from the command line wherever the developer is working or more appropriately probably from GitHub when an application is committed. When you add a new commit to the master branch, you can automatically publish to the app hub, for instance, so that will make it much easier to release new versions of DHS2 applications. I won't get into too many of the UI updates that are coming soon, but there are quite a few of those, including introduction of a data table and an more advanced org unit tree as well as many others. I also won't get into too much of the details, but we'll be migrating from cookie authentication to token-based authentication which opens up a number of interesting use cases for DHS2 apps, including working potentially outside of DHS2 itself. So talking just quickly about, I know I'm running a little bit short on time here, but talking just quickly about a few of the platform-romad features that are a bit bigger that are coming soon. This is, I mentioned common shell and runtime dependencies. This is what enables plug-in builds to be built with an application, but this has some major ramifications for applications in general as well. Basically, this enables us to deploy the header bar and updates to DHS2 UI to a DHS2 instance and have it automatically be shared between all of the apps on that instance. This means you won't have, once this is fully rolled out, we won't have the situation where you have 10 different applications in your DHS2 with 10 different header bars and 10 different versions of the org unit tree. The idea is that all of those applications would share access to the same header bar and org unit tree, which could be updated independently. We could then publish a new version of the header bar that could be installed into the application and all of the apps that use a header bar would automatically pick that up. This is being done in a way that is safe, so it's backwards compatible. It won't break if the header bar is released with a breaking change. The application will then fall back to the header bar that it was originally built with. You'll end up with multiple versions of the header bar, but we have to be safe about whether that application can support the new version of the header bar that was released. This will also allow us, it's also being done in a way that allows us to deploy things independently, so we can deploy different components in different mechanisms, different ways. I can get into more details about this at a later time. It probably could be a webinar all to itself or at least a blog post, and I will share more about that. This is a very big benefit not only to application developers, but also to instance administrators, because it means that you don't have multiple versions of the header bar or bugs in certain header bars in certain applications until you upgrade all of them and you wait until the developers of each of those applications is able to upgrade each of them to the latest version of the header bar, for instance. I also mentioned that we are improving the app hub and the application management app. There are some pretty significant improvements coming soon. These are some of the mockups that our designer Joe has put together. They're subject to change, so this is, it's going to be even better than what you're seeing here, but you can see already how much more visual and more information you're able to detect or able to view about each of these applications in this interface. This is the app hub, so this is showing community developed applications as well as core applications will be here as well. A lot of these same interface components will end up being used by the app management app, which will allow you to also search and install applications that have been developed by the community from within your DHS2 instance. That is long overdue for an improvement there. You'll be seeing updates to both the app hub and the app management app coming out in the next weeks to months. I just wanted to share quickly. I'm not going to go into each of these points, but there's a vision for where the platform for or the development ecosystem for DHS2 is going. There's a lot of very exciting and cool functionalities and use cases that we want to enable in the longer term. This is looking at not just in the next six months, but in the next two years to be able to really be able to take advantage of, for instance, server side extensions to be able to run customs code on the server in addition to on the client when you install a DHS2 application to significantly reduce the amount of data that needs to go over a network in order to better support low latency networks like cell phones, like cell phone connections that would basically move the application platform layer onto the other side of the network so that it lives by the server as well and can streamline the amount of data or the types of data that are transmitted over that network. Some additional features that we want to enable longer term are built-in routing and configuration as well as analytics and error reporting. I have an extra and on this slide. I apologize for that. Granular permissions for applications as well. That's something that with token authentication will be able to enable, which basically allows when you install an application, you can basically specify what that application is allowed to do. Today, if you install an application, that application can do anything that the user, the logged in user can do, but in this case, even if a user has all authority, if they go to an application that is only allowed to view analytics, that application can't secretly be doing something else behind the scenes. That's a big security enhancement that will help to reduce the surface area of a lot of these applications on the app hub and community developed apps as well. The final one that I wanted to talk about here is the second bullet point and that is metadata and app packages. This is still in the very early stages, but figuring out how to make applications work together and work together with certain packages of metadata in order to deploy more of a full solution rather than a piece of the solution. Right now, you can install DHS to metadata packages that are basically imports and exports of certain sets of metadata, but it's very difficult for an application to be tied in closely with that set of metadata. Moving to deploying those together or at least being able to define the dependencies between them is something that we want to investigate.


Good afternoon. Thank you all for coming. There are times in the life of a country when we come together in common purpose for the good of the country. This is one of those times. For months now, we've worked hard with the governments of British Columbia and Alberta to help them chart a path forward together on the Trans Mountain Pipeline Expansion Project. Our discussion today was the culmination of many meetings, many discussions, and I'm sure that we'll have many more in the days and weeks ahead. The time we have taken in this process was necessary. That's democracy. We knew from day one that the only way to get this built was by consulting and engaging and listening to folks. Canada has completed the deepest consultations with rights holders ever on a major project in this country, and working with our Indigenous partners has been paramount. To date, 43 First Nations have negotiated benefit agreements with the project, 33 of those in British Columbia. Throughout, the Government of Canada's objective has been clear to develop the vital infrastructure that is critical to our ability to get Canadian resources to global markets, and to do this while protecting our environment, which includes safeguarding our coastlines and combating climate change. The time we have taken in this process was necessary. That's what democracy demands. We knew from day one that the only way to get this built was by consulting, dialogue, and listening to folks. Canada has completed the deepest consultations with rights holders ever on a major project in this country, and working with our Indigenous partners has been paramount. To date, 43 First Nations have negotiated benefit agreements with the project, 33 of those in British Columbia. Throughout, the Government of Canada's objective has been clear to develop the essential infrastructure that is critical to our ability to get Canadian resources to global markets, and to do this while protecting our environment, which includes protecting our oceans and combating climate change. Fundamental to this strategy is the truth that protecting our environment and growing our economy are not opposing values. On the contrary, each makes the other possible. We've put in place the most rigorous set of environmental standards, ocean protection, and coastline protection in the world. And we're not done. We know we can always do better, and we will. That sense of optimism, of hope, of ambition to leave the world a better place than we found it is who we are as Canadians. But as I said, when I first described this strategy to the Calgary Petroleum Club five years ago, hope alone is not enough. A relentless work ethic is needed, pragmatism is needed, and compromise is needed. And at the end of the day, no matter the province, territory, city, or town we call home, all Canadians love this country. And we are there for each other in times of need. The Trans Mountain Pipeline expansion is a vital strategic interest to Canada. It will be built. But what does that mean to say that it's in the vital strategic interest of Canada? Well, it means that hundreds of thousands of Canadians who work long hours every day to put food on the table and to build this country depend on this project getting built. It means people in the oil patch are hurting, have been hurting for years, and we stand with them, just as we stand with forestry workers in BC, aerospace workers in Quebec, and auto workers in Ontario. It means the job of a pipe-fitter in Fort Mac matters as much as that of an aluminum worker in Alma, as a forestry worker in Prince Rupert, the auto worker in Windsor, or the fishermen in St. John's. It means every single Canadian's family and future and dreams matter. It means the billions in public funds for healthcare, for infrastructure, for the environment now being lost to the discount on Canadian heavy crude because we can't get our product to new markets is not something we can accept as a permanent anchor on our national prospects. And it means that even as we continue to work hard with Premier Znautli and Horgan to find solutions, we must recognize that they remain at an impasse which only the Government of Canada has the capacity and the authority to resolve. The efforts of the British Columbia Government to block this project have raised tensions and passions at home and across the country. But I want to remind all our leaders across the country one thing. The British Columbia and the Albertans are not opponents. They are fellow citizens, they are neighbors who want what is best for them and for each other. Every day, millions of Canadians in the two provinces work together, have fun together, build communities together, and a wonderful country. People from the British Columbia do not want to block the resources of Alberta. They want to be sure that the coast is protected. For a long time, they were not. The BC Government's efforts to block this project have obviously inflamed passions and political rhetoric in both provinces and across the country. So I want to encourage leaders of all stripes to keep one thing in mind as we go forward. BCers and Albertans are not opponents. They are neighbors. They are fellow countrymen and women who want the best for themselves and for each other. Every day, millions of Canadians in both provinces work together, play together, build communities and a great country together. BCers don't want to block Alberta's resources. They want to know what is best for them and don't want to block Alberta's resources. They want to know that the coast is protected. And for too long, it wasn't. And now, it will be. The Oceans Protection Plan makes sure of that. Albertans care as much about Canada's natural beauty as anyone. Spend some time camping or hiking around Kananaskis country and talk to people. You won't find more passionate defenders of conservation and the environment. They wouldn't dream of putting it in jeopardy. We are a vast, varied, cooperative federation built on centuries of compromise. But we are, above all, one country governed by our constitution and by the rule of law. As such, I have instructed the Minister of Finance to initiate formal financial discussions with Kinder Morgan, the result of which will be to remove the uncertainty overhanging the Trans Mountain Pipeline Expansion Project. We will not have these discussions in public, but construction will go ahead. I have also informed Premier's Knottley and Horgan today that we are actively pursuing legislative options that will assert plus reinforce the Government of Canada's jurisdiction in this matter, which we know we clearly have. Canada is a country defined by hope and hard work to make it the hope that a better community, a better future, a better country is always possible and the hard work to make that happen. So to make that dream a reality, Canadians need and expect an honest, open federal government that works with all sides to solve big problems in the national interest. This is both our constitutional right and our responsibility. We assert that right and embrace that responsibility. A little over a week ago, I got the chance to spend an hour or so in the lunchroom of the new State of the Arts Suncore Facility in Fort McMurray. The first thing that strikes you when you talk to people in Fort Mac is that they're from everywhere. Every province and territory, big cities and small towns from North Sydney to Campbell River and all parts in between. The work these Canadians do together creates jobs and feeds families everywhere. It is with them in mind that we assert the Government of Canada's constitutional authority to complete this vital project. We're going through a time of great change here in Canada and around the world. Climate change, income inequality, the rise of extreme politics of both the right and the left, these are all forces with the potential to pull us apart. We will weather these changes and we will come through them even stronger. We'll do this the way Canadians always do when we're tested by pulling together.


LibreOffice conference talk. Take number 12. Hi, this is real. Take number 12.  Well, that's all. But for pre-record talk, every time you listen to yourself after, well, this is a little terrible. I should take another attempt for this. And yes, another huge problem for pre-record talk that I'm not able to see Milano in person, not able to see you in person. My apologies about that. And yes, this is another talk about structured document text and how things are happening in writer about this. And yes, because this talk is pre-recorded, I potentially duplicate some information which was talked before. I cannot dynamically react on previous talk results and tweak some presentation, probably remove some errors. I don't know. So, it is done as is. Sorry about that. Time to introduce myself. My name is Vasily Milinchuk. Nice to see you. Sorry, not in person. Sorry about too many sorrys and apologies to this moment. I hope it is all to this moment. I mostly work with CIB software company and allotropia company. We are doing LibreOffice as well among our activities. I do LibreOffice for around seven years. Right now I looked inside a Git log for my first commit. It is marked as 2015. So, yeah, correct number will be seven years to this moment. To this moment, I'm certified LibreOffice developer. Of course, through these years, the document foundation member and so on and so on. I am reachable by my email used in my Git commits. It is still valid, still actual. It is not changed or by this complex nickname on IRC or Telegram. I'm on that channel. I'm reading the data in a very lazy way, but on a pink I will react. So, if you have any questions in general about topics or according to this presentation, well, ready to answer. And glad to see any feedback because I do not able to see this feedback in person. And let's move on to topic of our speak. Done. And move on to main topic of our speech. At first glance, SZT looks like something related to the forums. And yes, if we look back in the history, since the beginning, it is beginning or dark ages for me personally, but probably somebody else do see how these features do appear inside Microsoft Formats. I don't know. For me, these oldest things were forever. And yeah, initially we have some features for document filling forms. We are made with usage of fields. We are for making a simple input check boxes or any combo boxes or drop downs. And we are quite primitive, limited in features. And through years, these features were extended with third-party tools. I'm aware of some of them. Even at CIB, we have implemented some specific extension to these form features and were in productions even nowadays as far as I know. But, well, guys in Microsoft decide that, well, this forms filling way is a bit outdated and not flexible enough. And I'm agree with them. It is not enough. And why do we invent Activix forms? Well, what else could do guys in at Microsoft those days? Activix and all that, all that. Yeah, it brought much flexibility in creation of the forms. Right now, much more varieties, much more tweakable features of these forms. We can use even the complex custom forms for it. And of course, we brought as much problems with security and of course, much problems in LibreOffice. And since a while, again, guys at Microsoft decide to do something new again. This is what we know about called structure document text. And at first glance, as I said, it looks like another attempt to invent forms, third attempts. But looking forward, it is not only about forms. If we look inside the word, well, yes, we inside developer tab in design mode, we have classical buttons to insert some elements inside your document. And yeah, right now, we're inserting SDT elements, SDT forms. All our oldish features are hidden under special drop down list. And here we see classical form fields, Activix controls, and so on. So all the forms created nowadays with Microsoft Word are SDTs. Except special cases when somebody decide to explicitly put some legacy stuff. How things are looking inside the document on XML level? Well, initially pretty simple. Inside, for example, the paragraph, we have a new token, SDT. It has own properties. Here is the list of some properties. And SDT content. Where we have content inside? Classical run with some text and some content. Looks pretty similar, pretty easy. But even on this level, writer has some problems. In most cases, a writer don't recognize SDT at all. And if writer do recognize SDT, it does not keep all the properties correctly. And these properties looks like a nonsense, but we are quite important to Microsoft Word to understand some features of SDT. And of course, we have classical situation. We open some document in writer, save as DocX back. And we have no more SDT. Or SDT is some invalid state or lost some information, and so on and so on. Well, to solve such kind of problems inside a writer filter, we have classical solution, grabbacks. It is a special storage for keeping all the DocX nonsense we do not need inside the writer core by itself. But we need to keep this data for later saving back to DocX, because this nonsense is important for DocX and for Word. So after some refactoring of this grabbacks support for SDT, because we were really bad, I think right now it became a bit better. Not perfect. I don't like current situation. Still don't like it. But it became better, I think. And yes, this does help to resolve some problems related to SDT. And you see some five-digit numbers. Quite old bug was resolved during this process. But this is not all. What's about SDT? If we look further in situation, well, there are some levels for SDT, which can be used in document practically. These are levels defined in specification of Open Office XML. Basically, we have inline level. It is exactly what looks like we have in example before. No problems to this moment. Well, there are some nuances possible, but no complex efforts are required to fix something. Next one, block level SDTs. And well, here we have multiple problems. We had multiple problems until work done by Nicholas. Many thanks to him about this, because when I looked into the situation, I ran away and I'm scared. But he did this job and he seems things became much, much better. Specification defined next thing, cell level. It is content of some table cell. Well, according to my understanding, this looks something similar to block level, to previous one. And yes, in case of block level, we have some paragraphs inside, or even tables inside. So inside cell we have about the same situation. So, well, something similar. But what about final type of SDTs? It is row level SDT. So entire row of table can be defined as SDT element. Well, I have no idea how to do this correctly. And most important, I have no idea what we can use this SDT for. Well, there are some ideas, some scenarios, potentially useful, but I did fail to do this practically. No, it is possible to create this type of SDT practically. But I have no idea what sense for this SDT. But who knows. I am not an expert in this area, in spite of spent time in this area. So, well, classically, we see that the SDTs are used as a form. And in case of a writer, we still have some problems with these forms. And much of the problems came from that not every type of SDT is recognized as a form element. And the classical use case, like I mentioned, the bugzilla task, when we have a document, which is right protected, the user has access allowance just to edit form content. But because there are no form elements, the user cannot edit nothing. The solution was quite simple. Let's use a classical writer text input fields. Well, solution not best, practically. But on semantic level, looks okay. We have some input field in source document. We have some input fields inside writer. Well, we are a bit different, but actually doing about the same job. And yes, this did help to resolve an initial problem. Well, we have an edit field and right now form and document became editable. But, well, this brings some other new problems, problems with formatting of this field. And yes, this one is not yet fixed. Sorry about that again. But I have some ideas how this can be improved. Try to find the time to resolve this topic. This was easy case. This case became much, much more interesting. In spite of I feel myself, I even expert in SDT. Oh, what else you can do with forms? I found this one, situation. And on document level, things looks pretty familiar. And it looks very related to what I already show you about. Paragraph, SDT inside, some properties nonsense, we keep in grab back and we are back correctly in dockets. So no problems here. Content with some text inside, some content. What can went wrong? We open it to writer. We see the same some content element. So everything is fine. But let's open it inside word. What? Valid answer. Instead of some content. What is this? Where did it came from? It is not written anywhere inside our document. But what does this play? Absolutely different content practically. And to understand what actually is happening here. We need to look deeper inside this SDT properties nonsense. And where we can find interesting property data binding. With definition of some interesting properties which are responsible about fetching the data, where the content of this SDT came from. And situation with SDT became very related to situation we have with forms, with fields, with shapes. Things defined inside SDT content are actually just pre-recorded results, some calculated result, which can use any reader, which doesn't understand about SDT. But if you want to do something more complex, receive more relevant data, or update the data, this is also a topic. You should understand what is happening inside SDT properties, especially about data binding. As I already said, situation is very similar to what we have with field and field result, shape and shape result. If any reader doesn't understand how to process the shape, it can just take shape result and here it is a bitmap, just draw it and don't bother. It will be something about what is written in shape, in most cases. Not always, but well, since you don't understand shapes, your problem. And if we look into this data binding more correctly, more deeply, we have several attributes. At first, XPath. Well, no surprises, just XPath expression, which is used to calculate some external XML file. Yeah, in this case we have some custom XML folder with custom XMLs, which can contain some specific customer data. Not always this type of data binding can be referring to some internal properties of document, not always about custom XML. But again, XPath is used. Store item ID. This is what I was missing for a long time to understand how we distinguish among many XML files, which file to evaluate XPath.  We were evaluating XPaths for every XML we know about. XPath succeeded. Okay, we got a result. XPath failed. Well, we have some XMLs to check with. Well, I understand this is really stupid, but I did not know how we store item ID is working really in practice. And this property contains a global identifier of storage. And this global identifier is stored in some special another XML. You can see it has the name item properties and number dot XML, which defines the global ID for XML file item one dot XML, for example. Instead, Sterex here can be usually numbers used item properties one and matching corresponding item item one, item two and item properties two and so on. And also we have some special predefined global identifiers for core properties. It is classical document properties like title, author of document and so on and so on. And another identifier for custom properties. It is user defined properties which stored in dockx package in separate XML file. And yeah, we can query for modification and for displaying inside is a tier all this type of properties. And final element we have for data binding is prefix mappings. It is just a list of namespaces defined in this XML tool XPath related to work correctly. This is how things are designed. But practically I have questions about this design. Starting from the end prefix mappings. Why do we need this property explicitly given? Because inside this special XML about item properties, we already have information about used namespaces. Why we provide this second time inside data mappings? I have no answer. More important topic about this global identifiers instead of resource identifiers. In most cases in dockx package we use local resource IDs. We have special dot rails files, which defines list of resources. And when we inside document we just link to these resources. For example, it is an image in separate file. And we just place our ID number seven, for example. And this will be a reference to this image. Or hyperlinks are also defined as a some resource ID. And inside document we also just provide a link to this resource. But in this case, we ignore this relation files. Yes, all these XMLs are mentioned there because we include it inside package. But in Dataflow we don't use these IDs. Instead we use these global identifiers. I have only one idea why it is made so. With potential extension to support some extensions to Microsoft Word. For example, we have some extension which registers some identifier, global identifier, unique identifier. And when document try to ask for some data from special storage ID and the storage ID is matching, the job about seeking the data is extension related. But in this case, why we limited only to XPath? Because my extension can be something more specific. For example, I can fetch some data user asking from SQL by database or some other source. I don't know why XPath. Well, again, no answer. But this is how things are designed in the team. This is reality we live in. If you think these complex features are just some geeky features created only with custom XML editing, you're wrong. It easily can be done inside Word by itself. Under the same developer tab, we have a huge button called XMLNamingPain. And clicking on this button shows corresponding panel on the right side of the Word. However, you can select and drop down list all the existing attached XML files or even attach a new file included in bundle and iterate through this XML3. And for any random note, you can just insert content control and type of control you want to use. What's important about content control? Yes, I was talking to this moment about reading real value from this external XML file. But on modification, we also should update it back into this XML. And yeah, this nowadays is also done by writer as you can see. So as you probably noticed, SDT is something much more wider than just another attempt to fill the forms invented by Microsoft. As standard says, this is a final form of extra standard semantics represented by SDT. Well, what I love about specifications is that I understand all the letters, understand all the words, but all together I have no idea what it means. What is this practically? Again, based on my understanding of specification of open of XML, we have structured document text. We're also referring to specification as a content control. And it is another attempt to separate the document presentation and some data we put in document. This is one possibility provided by SDT. As shown in the previous example, we have some data kept somewhere in custom XML file within bed in our document. And practically it is just a combination of custom XML markup, which is already about feature I've talked about, and smart tag feature of Microsoft Word. It is just ability to mark some areas of document with some special, let's say bookmark for later automate the document data fetching. And yeah, it can be used to fill the forms. So what practically did happen? This work to support all the features I already mentioned about took a bunch of commits done at the end of last year. I hope these efforts did improve LibreOffice and we don't break it very heavy. And actually according to my impression, SDT became much more stable when it was before. At least in the cases I'm aware about. But it is actually not a final situation. We are missing tons of different things which are used in SDT. For example, the interesting feature about control of multi-line. For any element of SDT form, we can tweak and decide are the enterprises allowed in this text field or not. So can you have more than one line in this element or not? In writer currently we are missing this. Color of highlighting, nice and fancy feature, making your forms much nicer. Instead of just boring gray highlight, background highlight like we have in LibreOffice. Right now Microsoft Word allowed us to have some other random colors to highlight. It would be nice to have this. Placeholders and embedded text about the doc part. Well, this is another complex feature I don't want to dig into because it is related to glossary part which contains an entire new document structure, which contains some document parts which can be referred from our document in this placeholder to be embedded inside main document. It is complicated stuff and LibreOffice does absolutely nothing about this. I'm not sure how often it is used and use it all. Probably we are happier right now without this part of Open Office XML specification. I don't know. Building blocks. Another cool feature of SDTs, allowing to construct complex documents. Right now nothing here in our case. Repeating sections. Another type of SDTs and probably this case where I have this table row SDT makes sense. Image galleries. Also I can insert it in my document. What I can use it for. No ready answer. Well, probably some cases are possible. And yeah, this is not complete list of things which can be happened with SDTs. And yeah, we are missing in our writer many of them. Still. Bad news. There are tons of them. Good news. I think they are mostly business oriented features and not actually useful for many end users, let's say. Because for me as an end user, I can use writer to fill any form containing SDT and I'm happy. But if I want to create a form with SDT, well, this is absolutely another topic and we can discuss. And that's all. Thank you for listening to me about this topic. Sorry, no questions can be answered during this session. You can reach me somewhere else by email or on IRC or on Telegram. Many thanks. See you!


I have found 10 new skincare items that I think you are going to absolutely love. I am shocked at how good these are and I can't wait to share them with you. Let's get into it. Hey there, girlfriends. Okay, let's talk about what I have on for a top. We always talk about that because you guys always ask. I just found this top on Amazon. I thought it was so adorable. I love red, I love plaid. I love the color blocking on it. It is lightweight and it feels so comfortable and that's what I'm always after is comfy clothes that are cute. So this one fit the bill on that and then I also paired it with just some really plain earrings. I wanted to try and put them with my silver hoops but I couldn't find them. So this is what we got. These are just some pretty dangled, kind of a brushed silver look on there. And yeah, I just really like those as well. All of my makeup, everything will be down below listed. It's also linked and it's also numbered. So as I talk about a product, it'll come up a number and you can shop that way down in the description box and it's much easier for everybody. All right, let's talk about some skincare. I'm so excited. So fairly recently I did a video all about essences and the benefits of them, the Korean beauty, the Japanese beauty, how fabulous it is for our mature skin or anybody that has dry skin or really any skin concerns at all. But I have been finding more and I am so excited. Not only did I find these on my own but you guys, a lot of you told me about them. I wanna start off with this humongous bottle. This is from Naturee and it says, I can't even pronounce what it says, Hatomugi, I think that's how you say it, skin conditioner. Now it's this huge bottle of 500 mils. It looks to me to be about 16 ounces. What I love about this is it's big enough and inexpensive enough that I've been using it all over my body. I feel like I have really neglected like my legs or my arms right here that have all that alligator kind of creepy yucky skin and I've been using this as a first treatment after I get out of the shower. So you've got all that moisture on your body and it wicks away really quickly. But you put something like this on and then you can put your lotion on and it holds it and your skin gets really treated and it gets super hydrated at the same time. I'm loving this.  I don't even know what you call it, elephant skin all over. This is great. So that one is an essence. You can also use that one on your face if you want to. And then I got scent from Refer. Love their brushes and now they've gotten into skincare and I am over the moon in love with their skincare. This one is called their Rebalancing Essence. It's this 3% glycerin, niacinamide, metophoam, seed oil, ethanol and bititine and allotoin. I don't even know what those two are. But this comes out looking fairly milky but it doesn't have any silicones or anything in it. It's just a lovely, lovely essence that sinks in so quickly into your skin. And I am super duper impressed with this. I feel like it's very hydrating and it just feels like something that you want to put on your skin because it's giving you all that hyper moisturizer. I layer a ton of these during the day and really like them. Now, before we move on to another essence or another toner that I have, I just want to tell you that this is their Refers Hydrating Cream for Daytime. This is also really nice. I use this constantly and it is one that sinks into the skin, locks in all of these type of products but it doesn't leave your skin feeling so moisturized that it would feel greasy or tacky. It just feels silky smooth. My skin feels like that. So I'm loving this as well and really have been enjoying both of their creams, their nighttime one and their daytime one. Now I will say the nighttime one does feel a bit more greasy than this one but this is like, works so well under sunscreens. It works over top of all the products. It's just really good. Another essence that I found that is in a spray bottle and I'm so excited about this. This is from M-A-N-Y-O. So I'm gonna say may, no. So it says, we begin with our aim to better your life. This is a Bifida Ampule Mist, Barrier Intensive Skin Mist. And they talk about how important this is to help your skin's barrier, help any skin that's super irritated. If you have sensitive skin, this might be wonderful for you. This is a fermentation process and the mist on it is super nice. And again, it is so, so hydrating. I absolutely love this. And what I also like about the mistr is that my, I can't reach my back when I'm doing some skincare and I still wanna do it like I do everything else. And so I'll just spray that a little bit and it gives a lot of hydration too. But it has Bifida in it. And if you have tried Lancome Genifique or if you've tried Estee Lauder Night Repair, both of those main ingredients in there are boasting about Bifida. Bifida is that fermentation process that helps with brightness and it's an antioxidant and it's a hypermoisturizer. It also helps with wrinkles and it's just an all-around, amazing, tremendous product. And I love it so much. And I really liked that this was a bigger bottle. And I do know that this only has about 30% Bifida in it. And there are other things that I've recommended that have like 60 to 70 or even 90%. So keep that in mind. And one of them that does have 90% of a fermentation process, although this is galactomyces, is from Misha. And this is the Time Revolution and one of you told me about this one too. This is the first treatment essence, Rx. And this has 90%, like I said, it doesn't contain any silicones. As a matter of fact, all of these products that I'm gonna talk about today, I looked over their ingredients and I hope I'm not mistaken, but none of them had any silicones in it. And the one product that I'm gonna talk about here in a second, it boasts not having them. And you're gonna really appreciate that product. Anyway, galactomyces is also one of those fermentation processes that does this kind of the same thing that Bifida does. It gives you all of those antioxidant benefits like vitamin C will, the hypermoisturizing, people that found fermentation processes were people that were working with like beer and different kinds of spirits. And they all of a sudden noticed that their hands were becoming super just bright and smooth and their age spots are going away and different things like that. So that's really how this came about that they decided to bottle it. And this one's a huge bottle. If you use the SK11 or SK2 that you get at Sephora, it's really expensive, it's really expensive. And this one from Misha is not at all and you get as much and you get all the benefits but you don't have that high price tag. So I do love that. What I did want to say is that I have talked about the Benton fermentation essence over and over and over again. And why I love this one is because it does contain Bifida and galactomyces, it also has ceramides in it and it has adenosine in it. Adenosine is something that doctors will give people this orally to get their heart in a regular rhythm. What they found is that it makes the blood flow more even and the way that it treats skin is the kind of the same thing. It'll bring the blood there. It really works on the cellular level. It's just a really great product. So this is a powerhouse full of all these other essences that I'm talking about but it's a little bit smaller. Obviously this is the Misha one. So you're gonna use something like this and then use it over top. You've got a one, two punch. So this is really great. Now, I did also find from another YouTuber this balm, Cleansing Balm. It's called All Clean Balm. It's from the company Hamish H-E-I-M-I-S-H and it says Clean and Comfortable Beauty Intensive Cleansing Balm. This is so good. Okay, it's got a great way that it has all of this sitting here. It has a little spatula that you can use but it's right there and it's got a lot of product in there. I was really surprised. Love the way that this delivery system is because it just seems to keep it really nice. You don't have to fiddle with a cap or anything. You just get right in there and scoop some out. So this works really quickly to take off your makeup and it's one of those ones that just really wipes away everything and gets you super clean and it's pretty big. So I've been really enjoying that and I should have told you that nothing I smelled so far has any fragrance in it. This one doesn't have a fragrance in it either. It's very light if it does and it might smell kind of like, kind of like a plant. But it doesn't really have any fragrance added to it. The next one that I wanted to show you is something that I discovered because of Penn Smith Skincare Penny. And she talked about this Isntree Green Toner and the Green Toner has like green tea in it and it's supposed to boost the efficiency of using any red light therapy like 25%. Really good toner to put on and then do your red light therapy afterwards and you're gonna get way more benefits of the repair that red light therapy does. And this toner, it's really easy on the skin. Green tea has got a lot of caffeine in it so it will help with a little bit of tightness. It also is an antioxidant so you're getting all kinds of benefits with that. Again, just really thin product that sinks in so like you can layer, like I've got 10 things here, you can layer them all on top of each other and not have too much on your skin. I love that about it. One of the other things is from COSRX. This is a Propolis Synergy Toner and I had just barely gotten this the last time I talked about essences. And so this has Propolis Extract, Honey Extract and those are the two main things that it works with. Now Honey is very soothing and very healing and Propolis is one that is very plumping or hydrating. This is just your basic really great hydrator maybe after you've used too much of your Tretinoin or your Retin-A product and your skin's really irritated and really sensitive. Maybe you got a sunburn, something like that. This is gonna be very calming and it's gonna be very soothing. This is a little bit thicker than everything else that I've shown. But again, this didn't have any sort of silicones in it when I looked it up that I could see. So I just really love this one as well. And then the last one that I wanna talk about is my new love for an SPF. Okay, I have really dry skin, so you have to know that. This was very hydrating, but this went on so well after the moisturizer that I put on. And then after that, my primer went on over top of it like a dream. And this is the Cetaphil Shear Mineral Face Sunscreen, Liquid Sunscreen SPF of 50 and it's mineral so it's all natural. So you're getting all of the good stuff without none of the yucky stuff and you're getting all the protection that you need. I love this. It's just such a good sunscreen. It also says that it's formulated for sensitive skin and it contains vitamin E. So it says ideal for use under makeup and I can attest to that. It really is really nice under makeup and doesn't disrupt your makeup or anything. So those are my brand new 10 different products with one thrown in of a product that I have shown you before, my holy grail. So definitely love that. I still love the Cranacell Bifida Serum but I like this one because it has other things in it as well. So I hope that you did enjoy seeing the new skincare that I have found that I am like, oh, so excited about. I'm just really super, duper excited about all of this new skincare. And I keep trying things out so I can keep bringing you the very best of the best. I hope that you did enjoy this today. If you did, please give it a thumbs up on your way out of here and if you haven't subscribed, please consider that too. And make sure that if you have any new skincare that you're loving that you leave that down below so that I can see that as well. I always love your suggestions. And I will be seeing you in my very next video. Let's go out of here while we look at another video. Click on that one and you can go to another video on skincare and I will send you to that one about essences that explains it. So let's put that one right up here on the screen so that you can go there, take care of yourselves. I love you very much and I'll see you soon. Bye-bye friends.


Hello, my name is Micah Silverman. I am a senior security hacksawer for Opta. I work on our developer advocacy team and Today I want to talk to you about a particular OAuth attack called the authorization code injection attack Now I'm not going to go into a lot of detail about OAuth and the various flows I will make sure to have a bunch of links down in the comments to get the introductory stuff if you're new to OAuth There's been a lot of conversation in the OAuth working group about mandating the pixie extension even for Confidential clients and so that's why I thought it would be interesting to put together a practical example of this exploit and how pixie defeats it The authorization code flow for confidential clients has long been considered the most secure Flow that there is and that is still true, but pixie adds an extra degree of protection as we'll see if you're familiar with OAuth and the Authorization code flow, you know that for confidential clients There's a client secret and that protects the confidential client against most types of attacks So what is pixie going to give us that isn't already there to see that? Let's take a look at this attack to better understand it Now first of all you see my terrific diagramming skills here This may look a little complex at first, but let's just take a look at the overview of this attack and then we'll see it in action So we have a target user on the upper left and an attacker on the lower right The target user has been tricked into installing a malicious browser extension The target user is going to begin the login with Google as normal So down on the lower left. We have a legitimate Website that allows you to log in with Google and on the upper right We have Google's authorization server and then finally in the middle there. We have a centralized attack server That's part of this exploit So the target user kicks off login with Google as normal the browser extension intercepts and Publishes the authorization code that gets sent back as part of the redirect Now on the attacker side the attacker also begins a login flow with Google as normal This is important and we're going to discuss why and Now the browser extension on the attackers Machine intercepts the redirect and pauses The extension then retrieves the target user's authorization code that was published to the attack server And then the browser extension makes the the browser follow the redirect URL with its original state But the injected authorization code from the target user Since the code is valid and the state is valid the legitimate website exchanges the code for the tokens and now The attacker is logged in as the target user Let's take a look at this in action on the top here I have Google Chrome running and the console on the top right is The console for the browser extension not the regular browser console Now I'm showing here Paper call if you're not familiar with it. It allows you to create a speaker profile It's for people that give conference talks and I want to take a moment just to say that paper call isn't doing anything wrong here But paper call uses the authorization code flow and paper call has a confidential OAuth client So I wanted to demonstrate this in in a real-world sort of way So on paper call I've created two speakers one is called hacks or dude With Neo as the profile picture and the other is called Rube dude and that is a picture from Spongebob. I'm not using any of these pictures with permission Now neither one of these has established a session with anything There's no authenticated state for any of them and these paper call URLs are publicly accessible without any kind of authorization Now we're going to start off with our Rube here our target user going to interact with paper call as they normally might oh And one thing I want to show you here the they both have these browser extensions installed The target user has this one called pretty cats that just shows Random pictures of cat gifts, but unbeknownst to them there this browser extension is is up to no good All right, so I'm gonna go ahead and choose to log in with Google and I'm gonna start logging in as normal So I have this real Google account called Rube and let me go fetch Rube's Password here So I'm logging in as Rube Now the malicious browser extension has intercepted the authorization code and we can't Let the browser use that authorization code because it's a one-time use code So what the browser extension does is dump the user back to the front door of where they started in this case paper call Now the user might be confused because they're not Logged in here, but the beauty of this attack is that if they go and choose Google again they actually already have established a session with Google Google sees that they're authenticated and Creates a new authorization code and lets them authenticate So as an end user you might just think oh there was a glitch in the matrix There was some sort of network hiccup, but now I'm authenticated all is right with the world in the meantime My attack server now has this intercepted authorization code and I can verify that over here by just doing a simple HTTP interaction with it and it just shows me the list of codes that it currently has waiting in a queue So up here on the hackers Browser and in the Chrome browser, I'm gonna log in with Google and This is an important part of the step Important part of the process because it's important that I establish a session with Google so that I can get a valid state so I'm actually logging in with a real account and Let me look that one up. There we go and Now you can see that where I've ended up is in a logged in state as our room And if we look in the browser history here We can see that it intercepted the original code and it's now Replacing that original code with the code that it retrieved from the attack server So now we've effectively tricked the user with this browser extension The the legitimate target user and now our hacker has been able to log in as this legitimate user Okay, next thing that I want to do here is I want to log out from everything and start over and I want to demonstrate How pixie saves the client from this particular type of attack? Now I'll fast forward through this so you don't have to watch me logging out Okay to continue on here. I'm gonna use a client an OAuth client that my colleague Aaron Perrecchi put together for demonstration purposes and We're basically gonna repeat this Demonstration but we're gonna do it with this test client so that we can see how it works both with the regular authorization code flow and with the Authorization code flow plus pixie So we're gonna start out over here at this site called avocato.lal and We'll start at Google, which is the regular authorization code flow now just like I did before I'm gonna log in with Google. This brings me over here and I'm gonna log in as my Roob dude Snag the Roob's password All right, and just like before the authorization code was intercepted and the user was Unceremoniously dumped back to the front door in this case Avocado.lal if I go back to Google and I log in with Google we can see that I'm logged in as our Roob dude now also just like before let's jump up here and Let's go back to Avocado.lal Google and now I'm gonna log in as our Haxor Alright, and now you can see just like before I ended up in an authenticated state as the Roob dude because I was able to replace the code With the one that was picked up. So this is exactly what we did before with paper call But now in this kind of test environment now. I'm gonna log out Once more I'll fast forward through it and now we're gonna try and do the same exact thing with pixie and see what happens Okay, one more time. We're going to start over only this time. We're gonna do the pixie version of this confidential client So now I'm logging in with pixie.php And I'm gonna do the same thing down here oops Because we're gonna start off with our Roob just like before let me clear out our Extension consoles. Alright, here we go. So I'm gonna log in as Roob All right, just like before I am dumped back into the front door and if I go back to Google So if I go back to log in with Google now I'm logged in with Roob dude just like before so Intercepted code published to the attack server now. Let's go back to our attackers console and I'm gonna log in as the attacker just like I did before All right now this time we intercept the code we replace it, but this time it fails It says invalid code verifier So pixie has foiled this particular attack because When you're using just the regular old authorization code flow while you have to have established a session and The state value is checked against that session the state and the code the authorization code are not tied together in any way With pixie however the code challenge and the code are tied together and There's no way for me to know The code verifier that generated that code challenge And so when I come back here even though I've injected the authorization code the code challenge and the code verifier that the code challenge was derived from are completely different and The authorization server can can recognize that and it fails because we have an invalid code verifier So this is why pixie is very important even when you're dealing with a confidential client and Why in my personal opinion for OAuth 2.1? We should have a must buy pixie when it comes to even confidential clients to Avoid this sort of or to mitigate this this authorization code injection attack Now if you're not familiar with with this make sure that you check out the links in The comments so that you can get familiar with OAuth in general and the pixie extension specifically I hope this has been informative go ahead and Give us a shout-out on at octadev on Twitter and like this video and subscribe to our channel If you found it useful have a good one


What's going on everybody welcome back to some breaking news and the world number three Simone Halop is out of the Miami Open. She is withdrawn through injury of both the singles and the doubles She picked up the injury in the singles match in her second round and it continued on into the doubles and she's withdrawn from both Let's go to a statement. So here is Simone Halop's statement to the Miami open I'm very sorry I have to pull out of singles and doubles at the Miami open but my injury doesn't let me play here as I expected I'm sad that I can't continue I wanted to come here to give my best and play many matches Unfortunately, I can't hopefully next year. I will be back healthy and better. So there you have it Simone Halop out through injury. She's put out of the singles and the doubles She's actually playing doubles with Angelique Kerber They actually took out the number one seed Sabalenka and Mertens in their first match So it was a good win, but she pulls out of her third round match against Sevastova So the injury actually is a right shoulder injury that she picked up in her second round match And she ended up winning that match in three tight sets against Garcia But it just continued on she played the doubles later in that day and it just hasn't gotten any better So she can't play in the Miami open. She's out and Sevastova goes into the fourth round But she'll be back on the clay courts in a couple of weeks. Hopefully she can get better. Let me know down the comments below Who's gonna win the event now? We've got one of the biggest names out We've still got Osaka in and Barty's still in but let me know down the comments below Who is gonna win the Miami open now that Halop is out? So the number three seed Halop She's out of the Miami open due to a right shoulder injury


Now I work on the counter portion of all this stuff. So let's go. I'm actually gonna put this right under the new there Hold down a left-click and drag downwards to organize them nicely together All right, and I want to get the Cabinet area before we did the polybevel actually before we so right here. Yeah, so I'm gonna do another null node here And this guy is going to be the cab UV prims And I'm gonna use that in an object merge node up here So I'm gonna say get cab prims cool And then let's just drag and drop this guy over here turn off our transform information So this time around rather than grouping or using the group node I'm gonna pull this primitive off here using a wrangle node So we're gonna use Vax for this one. You could use a group node if you want I'm just gonna kind of switch it up call this get top prim and The way that we're gonna do this is I'm gonna get the normal from all the primitives So I'm gonna call this prim nirm and we're gonna get the prim normal so we use that Vex function and For this to work we need to provide the geometry which is going to be zero in our case. So this first input and then In prim number, that's just gonna be the current prim number and then point five and point five for where we want to sample the normal Which would be the center of all the primitives? So I'm gonna do zero and then we want to get or we want to give it the prim num and Then zero point five and zero point five for the sample position Cool, so then we can just do a check in here. We could say if that prim if the dot product of the prim norm is Less than zero point nine, right? So we're not pointing upwards Then I'm gonna do a remove primitive here. It was a remove prim and we'll say at prim num And we want to remove all the associated points with it as well. Oh, we need to put in the up vector So zero one zero There we go. So now we're left with just the top prim, which is a perfect starting point for the counter All right, so with that done, I am going to then use a poly extrude node to give it some height We should set up our parameters for this guy Before we go too far. So let's go and edit the parameter interface create a new folder Set it to simple. I'm gonna call this the counter Folder just give it a label of counter All right, so we're gonna need two floats for this. So if we look at our reference again So this has an offset as well. This little guy right here. All right, so that's what I want to Basically allow the user to do. So I'm gonna call this the Then you see oh you for counter just for my prefix. I want to try to give all these names a unique name and We're gonna call this the front peak just like we did for the other one And we'll do front peak And then our range is going to be point zero one to like point one Yeah point one that'll be fine. I think we'll set this to like 0.05 to start with these things are pretty subtle and then for the height So this one's gonna be the height. So co you height I'll just give it a label of height. We're gonna do a range again a point zero one to something like point one These things aren't very Thick in terms of you know how high they are so I'll set it this to like point 0.05 as well. Let's see what happens Cool. So let's hit accept Now let's take the heights and copy this parameter And we'll paste that into the distance here for the poly extrude node Yeah, looks good and then for the front peak. So now what we need to do Oh, we need to include the output back here So now what we need to do is let's let's actually create a group using a wrangle node So we'll call this the front group so front Group So rather than using group nodes, I'm just doing this all with becks now. So All we need to do really is Compare the normal, right? So if if our normal is facing forward Then we're gonna set a group, right? So Let's get that prim norm again, and let's just go and copy this up here So I'll have to type it all again. So I just want to get the prim normal Like so and then you do a control enter to commit that. So now this time I'm going to do if dot Prim norm so the dot product of the prim norm and 001 for the z direction if that is greater than 0.9 That means we're facing forward. So I'm gonna set a prim group So we'll do set a prim group On the geometry the first input geometry there. So zero the name of the group is going to be front All right, and we want to do at prim num Cuz you got to give it the ID so the prim number so this that at prim num is Gonna be five in this case There we go. So there we go, and then I'm gonna give it a value of one and tell it to set it Like so and I forgot a T there we go, and this is complaining about something Because that is not the way you spell prim num. There we go Cool. So now if you open up your groups and attributes and go over to the primitives You'll see that we are not selecting The front just odd is it selecting anything nothing. Oh, it's because I need to set this to primitives There you go. Cool. So there we go So we've got the front primitive selected, which means now we can just throw down a transform node like so And move that front using this front peak value that we set up in our controls There we go. So now we got controller that Perfect. So now let's UV this I'm gonna go and grab this version of the box UV maps mapping node And just make sure we check it. So hit five And that one do not like that one at all. Let's check our seams here. Well, it just didn't even transfer I think and so basically what happened was I had an incoming so I checked this guy Yeah, this one already had seams The scene group on it, but it was empty and so I just needed to set the group transfer to overwrite So now we're looking good. Yeah, there we go Perfect. And then finally, I'm just gonna polybevel. So I'll just copy this guy because it's already got the relative expression hooked up there And bevel it and then we'll just drop down an all node here We'll call this out counter and then we need to assign it to our Assembly here. So add another slot There we go Perfect. We have a nice start on our prop here So let's go back to our node here and do a shift O put a box around this I'll call this counter. Cool. So let's check all of our parameters again That looks like it's working Check our UVs. We need to do some work to lay these guys out later on But that's all working as well. That looks good With the wood thickness still working Yep, cool. Yeah, it's coming along. All right, so now we need to start working on the the actual front of the cabinets all the drawers and the doors and what we're going to be doing is setting up a System to allow the user to basically on a per primitive base is set Whether or not they want drawers or doors or some sort of just decorative element to it that way they have, you know Complete control over the look of their particular prop and you then have the ability to create Lots of variations of the particular prop as well. So let's do that in the next video I actually it's going to take a few videos to get through it all because we're gonna have to go over multi-parms and Get everything set up appropriately. So It'll probably be a few bits Thanks much