Skeleton Loading in Service Portal: Part 3 (Live)
[Music] welcome to code creative um travis Tolson alright so today we're kicking off part three of our skeleton load flipping over to the screen so basically for those joining for the first time we are attempting to do some skeleton loading and service portal particularly for our secondary data Dave Spangler welcome so you know we're just pretty much picking up where we left off last time we were in a bit of a mess with some of the CSS that I was trying to do but I actually have to give a shout out here to David de Lajos aka the wizard Haws he has apparently been working on something similar on one of his projects and although I can't show it NBA's you know the deal basically it works something kind of like this skeleton loading here where you can see it's fading in and out and when I looked at the example that he shared with me of how he was going about it I realized that it would actually be a lot easier for me and I actually know the CSS required to set something like that up as opposed to the previous attempt over here that I was using with this little shine effect where I was copying somebody else's code and that was an absolute mess for me now eventually I may go back and try and tackle this shine effect again but for now I'm going to temporarily throw in the towel step getting my face beat in and we will try a slightly different approach on this one to see if we can get more of a fade in/fade out type of fact so the first thing that I'm gonna do is strip out all of this older animation wait let me keep the panel default orders so I don't have to look that up again all right so we'll get rid of all that and we're gonna go back to what I had before with the skeleton text and I think I had title and the width on this one was 33.33% and I need my background color and I think this will give us what we had before so what you've been up to today Dave waiting on previews again over here someday maybe but apparently not today did I lose it it's to a quick inspect element and for whatever reason there we go ooh si our training I don't know I actually think the security stuff is very interesting probably a little over my head how's the training been going for you and clear out the console there all right I think we're back to good all right so next up I want to try and give that fade in/fade out effect it's just not nice sexy CSS builds well you know CSS builds might be good for the customer experience but we definitely have to have the security put in place or we're all in trouble so belt wrapped up and looking to schedule in the next couple weeks good to hear good to hear all right so let's see to get this fade in fade out effect going let's try opacity to start with I might actually have to switch to an RGBA let's see note that's a that actually might work well and I need that key frame animation I can't remember the syntax offhand so we'll jump in here and there we go add keyframes and we'll do a fade and we'll go to path city 100% and then we need to do want to say there was a shorthand somewhere in here that we were using on the other one you know you can see here that keyframes allows you to set up at different positions in the timings 0% 25 50 I really like some of the things that you can do with these CSS animations I want to say that there was a an animation shorthand though animation duration name animation iteration count alright let's go with this I thought there was a shorthand we'll just kind of go with this to start with and see how it goes now we need to add this to the class not to our animation down here and let's just see what this looks like we'll go 0.5 seconds animation name is going to be fade which is coming from our key frames set up and our iteration count is gonna be infinite let's see what this gives us that's a little too fast but we're getting closer so let's go back to our three second okay all right so that's getting us a little bit closer but I actually wanted to pulse back and forth so let's start with a from go with a 50% and then a two and we'll keep the overall acceleration through it fairly even so we'll start at 0% at 50% we'll go to a hundred percent and then we'll at two will go back to zero and we'll save that wait for the preview to come back up and I see we've got a couple other folks watching I don't know if there's a way I can see who but feel free to uh feel free to work with me here well we got crash crash that was um always watching welcome welcome hey you got David over here thanks for ruff for some of your tips last time David diets really helped get us get us a bit closer okay so now our fade in fade out is looking a little bit better I think that's a little slower than I want let's try two seconds mmm 2.5 might be the sweet spot alright so given this is just going to blip let's actually start the other way let's actually invert this and go from 100 to 0 to 100 and the reason for this is because in a lot of these cases these skeletons may only be up for fractions of a second and if it takes too long for the animation to pass through we may not see anything at all so I'm gonna flip okay so that's not bad that's not that I feel like with a little more time we could probably clean up this animation and make it really really sharp but let's see how it plays actually in real time so I'm gonna flip my little toggle here so that the skeleton only displays when the data is loading okay so you saw it pop briefly and wonder if I can now the wizard house was also saying that I could potentially throw in a timeout to simulate a slower connection one of the things I want to try though here we go so you know first of all I have flipped back to Google Chrome I was using Microsoft edge for a little while and I really liked it I actually really liked the new browser it's I mean of course it's based on the same chromium engine under the hood as Chrome and a bunch of other browsers but I really did like the new edge it was really solid I got really into using it and then today all of a sudden my cursor stopped behaving properly on hover with links it stops behaving properly when you know hovering over text you expect that text cursor it started requiring double clicks at weird points and honestly over the years I've just developed a very very low patience for Microsoft's browsers sorry guys so I quickly switch back to Chrome as soon as an issue came up but with any of your chromium browsers you can find and I think the other ones have it as well I don't use Firefox or opera as much but you can simulate slower network connections so for example I can switch to a fast 3G and if i refresh and I'm back on my macbook again and I have no clue how to do this without function keys hooray for the touch bar whatever happened to the good old days of it just works anybody know a quick way I can refresh with out closing out oh well we're just gonna close out and well now because if I close out I might lose my network here Oh surely somebody has a way I can do this let's try right-click oh thank god that'll work that'll work all right so with the fast 3G in place and we'll switch to slow 3G and we'll reload and so you see it takes a little bit longer when you're simulating the Oh Dave Spangler command R is Reif refresh on Mac yes he clearly I've been off of Mac for a little while ah you're right thank you Dave I had to switch back from my my surface book which I was really reluctant to do because I loved the surface book to being able to draw on my screen without having to switch devices all of it I absolutely loved the device but there was some problems with the graphics drivers and it was creating issues with my adobe suite and it just got to the point where it was a little too much of a pain in the rear end for me so I ended up switching back to the Mac and I'm getting back to being used to it again and so if I load up the preview you can see that I get a little more I can see a little bit more of that skeleton load and I'm actually really liking the way that looks like go back to full speed there we go I can actually just toggle the preview and that's actually not too bad that's that's not too bad both in terms of the slow loading and in the fast loading I'm pretty happy with that animation overall so next up I'm gonna start adding some instance options to this and I'm gonna start playing around with a few things let's see first things up let's add a title option schema or actually first of all the first thing I ought to do is go back here it's closed out some of these browsers I'm a bit of a tab minimalist so I hate having a bunch of tabs up let me go to the widget now I actually need to close this because if I open up the widget form internally and have it open here it can create conflicts where changes in the one will get reset because of the presence feature so I'm actually gonna close that one and it was at simplest skeleton load so one of the things I want to do before I go adding instance options is you can come in here and you can specify different fields that should be considered instance options so for example title is one that already exists I don't have to create that one as a separate one so we'll give title and don't care about those so much CSS is an option that we can add not opposed to that but not going to include at this time display name glyph actually pretty happy so far with just the title um yeah I think I'm pretty happy with that overall we'll just enable the title one for now the rest of them will create using the option schema so we'll update that one jump back to studio and kick open our widget again alright so at this point I kind of need to create a demo page so let's do a few things here first of all no yeah that never works let's do this we'll just create a new one code creative widgets demo portal give it the CC demo get the landing page log in KB and basically I'm just building out this base portal template catalog homepage is gonna be SC home SC home main menu I can't remember what the main menu is SP header menu and we'll stick with the la jolla theme for now and I will leave everything else fairly default at least for now we can always play with it more later and then we'll create a page and I'm just gonna call this one my test page CC test and we'll submit that one leave that one alone alright dev and we'll go to our CC demo and let's go back and on our portal record lets make [Music] see see test our home spare me having drove remember a larger URL or book market all right here we go all right so now I can go to my page and where are you see see test I need to get something on this page so I can use all the fancy hotkeys open and designer every time I do this stuff all I can think is I know that there are people out there watching at now or in the future that are sitting there thinking to themselves doesn't he know he could just do this doesn't he know he could just do that and the answer is even if I knew I probably still wouldn't do it I always take the slow hard route it's just who I am oh let's see it's not just me we all do it thank goodness that's good to hear ah that's actually terrible that's not I want to do that's not what I want to do at all you know let's just get rid of this whole row because I want to do a few of these I don't just want to do what I want to do a few of these let's go 3-bike now let's not go three across or a four across let's go three across I like my magic number three simplest skeleton load will add a couple of these so we can configure each one a little bit differently there we go we'll go six of them that feels good all right so now I can come back over here all right now I've got my test page set up and now I can do my control right click and get around at least a little bit click with a little bit quicker all right hey we're actually making a halfway decent time today past couple times I've done this I've been at the 50 minute mark and crying because I only managed to make it but a couple steps now I've actually got a simple list welcome back in-house designer hi she was off helping child number one with eating a science fair project they're saying hi are you still helping with the science project okay okay so you're gonna follow along and crucify me in check God exactly awesome options or is it seed out options gets seed out options um I don't know what see what happens maybe it breaks maybe it doesn't die by chat oh yeah absolutely it's good to know that I've always got support at home that is true love simplest let's see okay yeah so that's actually working fairly well so seed options title or simple lists actually I don't like that so one of the things that's a pet peeve for me is I try to avoid putting logic in my HTML templates at all I like to be able to read the client script and have a full understanding of what's going on so we're going to come in here and I'm gonna create an admit function and with a lot of this you know you'll notice that if you ever look at my actual production code for most of the stuff that goes into customer instances it's nowhere near as refined during the process as some of the stuff that I'm doing here I have more time here so I can try to enforce all of my good coding practices in the heat of the moment in customer instances and probably shouldn't be admitting this but I it's nowhere near as good during the process and I always try to go back and clean it up and make it a little bit better it doesn't always work out that way trying to build better habits but you know we get what we get sometimes so let's go see dots title is equal to C dot options dot title or and we'll just do simple lists for now so there's our default value and then I should be able to change this to just see that title save it perfect so now I got simple list over here let's see next up let's add some options to our function over here I feel like I'm missing something here it does the simple list widget actually point to a different instance option table I think it does ah it does okay so you can see here that the one that I have developed initially the data table is on the SP instance table whereas simplest is on SP instance V list now fortunately I can change this after the fact and that's why I was missing some of the fields I was expecting if I go to SP instance V list now I've got title and I should have a few others of interest okay here we go so I can do display field I can do filter we can add let's say maximum entries order or not put order by where to go order Direction protection policy roles don't care about those so much it's not now anyway table let's see and yeah we'll add fields all right so now let's order these will put title first we'll put filter second we'll put go printer go that's fine I don't care that's the beauty of these live streams is I don't care as much it's just me doing my thing trying to to build well-sculpted videos and doing the video editing and editing the audio and being room where the audio is actually decent which by the way is the bottom of my closet is the best place in the house for perfect audio all of that is really really challenging and frankly really frustrating sometimes so you know the whole thing with code creativeLIVE was that there's all these times that I'm sitting here doing stuff at the computer and nobody gets to see any of it because it's a frankly it's a hot mess so you know by sharing the live stream I don't have to worry about the terrible audio I don't have to worry about you know the frustrating pieces and I can basically just wing it share some information share what I'm learning as I go and then later on I can go record in the bottom of my closet and get the audio just right and prepare a perfect video showing in you know two and a half minutes this is how you set up skeleton loading in service portal and meanwhile you guys get to see all of the work and figuring out and my thought process which is a terrible place to be but you know here you guys are in the closet radio yeah yeah crash that is that is kind of how some of my yeah yeah that that's how the edited videos are in the closet radio and I guess this that makes this out of the closet radio maximum entries fields all right so we'll go display fields display field fields no wait order by and yes I really am this picky about where each of these fields go and the sequence and the order so here's the line of thinking start with a title then we have our query components table for the query the filter for the query what we're ordering by and the order Direction you know so this is basically how I would set up my glide record then our set limit followed by the actual fields that we're using so these would be within the while loop so I'm actually setting up my options and roughly the same order as the query which also is somewhat intuitive from a from an admins perspective okay now the problem here is that now that I've switched my data table jace welcome glad to have you man I got lost oh right so the data table because I've switched it from the base espy instance to the SP instance V list all of these have to get trashed well take me too long no Apple I do not want to look it up in the thesaurus but thank you for helping where I actually want to go is to the page designer and we're going to scrap all of these instances yes I do and that one and that one and that one I am 100% positive please stop asking me all right and we'll add our skeleton loaders back again all right so this is recreating those instances but instead putting them on the appropriate child table on the was a SP instance V List yeah Jase I did get to see the the empty state and loading stuff that you link to so I it really uh I really felt like a lot of it was pretty much in line with what we were doing I did we did end up changing up and let me go ahead and toggle this real quick one thing we ended up changing up was we ditched the shine animation that we were doing yeah that that that one was the old one I want to say that the last time I was talking to Nathan he was saying that there was a newer version that of it that's gonna be coming out that coincides with the the workspaces and the new UX framework so I think there's a new one out but I don't know if it's public or not still trying to get some information on that one but one of the things that we did do here was we changed from the shine going across which was some really complex CSS and we switched it up to a much more simplistic animation using an opacity fade and that was one that I actually knew how to do offhand but that idea came courtesy of David David hos aka wizard Hawes so that's that's what we ended up changing since the last time you were with us Jace and now I'm going through and adding a bunch of instance options and making this thing configurable so now I can come in here and week options and actually wait a second wizard has let's see do I want to do this in line no I kind of don't normalize options alright so what I'm gonna do here is create this normalize options function and basically I'm gonna use this as a way of setting up our default options and stuff like that so for example table is going to be options dot table or incidence and I know that you know if I go to my options schema I know that you can set up default values in your option schema and there's a number of things you can do around that I have not had good luck with that and I don't know if it's just some of the versions I've worked in if it wasn't quite optimal in certain versions or if it's still an issue I'm not really sure because I completely abandoned using the the default value for instance options I always set it up in script now just because it makes me feel a whole lot more confident in what the result is going to be so table query is gonna be options dot filled filter or active equal to true I think uh active equal to true is what we're using right now then let's go with what was the other one and as I said before I may get into a little bit of trouble with opening this one up in two places at once if I'm not careful yeah exactly JC I know what it's going to do when I when I control it um right now I'm looking for the disability what is it display value or display value field or something along those lines limit is one of them there's a couple fields down here that I had set what were they uh heartbreak what happened to all my work no ah alright so we might have to do some of this again so that is the exact thing that I was trying to avoid and the last time that I went in and edited this widget here I forgot to close this right here so I'm gonna save what I've got real quick and I'm going to close this editor that's okay chase cuz I actually have to go back induce a couple of these steps all over again because I had the widget form open here and I had it open in the widget editor and when you have them open in both some of the autosave presence type stuff kicks in and it ends up overwriting so this is now the wrong instance option I need to set it back to SP instance V list and then we need to add title and/or some of these other ones it was table and then filter and then it's an opportunity to share yes save early and save often or in this case if you have the same file open in two places hey don't and be if you do close one of them before you save only save from one of them right MHz prayer you're absolutely right when the widget oh when the widget editor is open it has all the dependencies so you can edit the angular providers you can edit templates you can edit all sorts of different things that are connected not just the widget record itself so when you save it in that editor it saves all of them and if you're not careful what happens is if I open up this form while the AH Matt H from SN devs that's that's who MHz is how's it going Matt welcome says oh saying what happens you know to piggyback on what Matt was saying in chat what happens is when you have the editor open the the other UI the it ends up connecting via presence to the back end and so anything that you save in that editor if you're not careful first of all it does overwrite this form when it's closed but even if this form is open if you're not paying attention you'll get the little presence icons that pop up and sand it'll overwrite and I've had this happen to me quite a few times where I was not being careful I was not paying attention and I had both of them open you know I wish that some of these options were a little more accessible from the other editor so that I didn't run into these issues but such is life Matt if you're aware of anything that I may be missing where maybe it is available there you know or anybody else in the chat by all means share again I have a tendency to take the stubborn approach a lot of the time so filter I want maximum entries I want the order by order direction and order by order Direction maximum and trees and then we want to what were the other ones display field this is one of the ones I was looking for display field and then we want fields display name glyph I think that's what we went with before okay so now I'm gonna update chase saying tags could be interesting what are you thinking on that one Jase what are you thinking for the use on tags um got some lag here on my side I think Oh could not save record because of a compile error missing out cuz my stuff is broken over here alright there we go instance of simplest okay there we go a micro button thing mm I think I might need a picture Jase okay I think we're set on that now but if I go back to widget instances simple list skeleton load oh good they did end up creating on the right table they did end up creating on the instance of simple list so that's positive I don't have to go back and redo those that's good one second getting pinged by a to mate yeah 4 p.m. will work gonna have to re-watch to understand the recreating instances yeah so basically all it comes down to is there's different instance classes you've got the instance of simple list you've got let's just go ahead and group by and get rid of that okay let's try that again so we've got these different instance types you've got the plain old instance instance of carousel instance with instance with menu and this is all just a way of basically providing some default instance options is really what it comes down to it's standardized it standardizes it for that particular type of widget and also for carousel and stuff like that it has associated related lists with it and basically once you have through the drag-and-drop editor added a widget to know this one's actually not a new instance type Jase I'm actually using an existing one but I originally created it on the I originally created this simplest as a base instance and I went back and changed it to an instance of a simple list after I had already done drag-and-drop to add some of those add that widget add a few instances of that widget so I had to make sure that they were created on the correct table alright so now I should be able to at this point go back to opening this up okay you over a bit okay so now let's see alright so it was table query I'm going to call this one heights hole and yeah I think we're going to end up moving a lot of this over or I think I'm going to end up moving this over to server side so options dot title or that simple list and so that should get rid of the need for that think we'll double-check a few things before I'm gonna forward with that because we need to make sure that that is actually set for okay so table query title let's move title up to the top so it's a little less confusing table query item title yeah it's camel case that and [Music] options dot that was display field I think for number I think as well yeah numbers what we went with and item description and she lets head field to this so it's a little more clear item description field is going to be for starters we'll just say short description and and eventually we'll go back and we'll add an instance option for that one hey how's it going and room we had Andrew jump in says he can't hang but thought he'd say hi let's see where we at query item field description field will go meta fields is going to be options dot I think that one was called fields or we've currently got assigned to and I think that's going to be a comma-separated one and we're gonna go with order by option options dot order by or sis updated on I think is the name of that field order by direction options dot order by direction I think is the name of that one or I don't know how that one's actually stored we'll have to figure that one out all right and limit I think was called maximum items or something like that options don't so clearly there's a couple of these I'm gonna have to go back and look up exactly what it is and we'll set the limit initially to five okay I think that covers all the major ones so so data is loading and I'm just gonna say I'm gonna keep this real simple for now and say normalize options and and I'll add an OPS variable to the get list items and we'll pass that here and you might be wondering you know why not just use a why not just scope a variable up top here why not just put my put a var opps up here and this goes back to one of the reasons why I really like having a solid you know parsing my inputs build up the functions and then my data outputs down at the bottom as it helps to encourage a behavior of injecting my dependencies as opposed to relying on you know what amounts to a roughly a global variable basically this function is now slightly closer to actually it may actually be a pure function at this point I can essentially copy this function out move it to a script include and not worry about the context that the function is in as long as I pass my options in I'm good to go so minimizing those dependencies helps make some of these functions a little bit more mobile and because code refactoring is something that happens all the time I do try to prepare prepare for that event so at this point I should now be able to go ops table and ops top maximum play domes and op query and then we query and then we're going to do a get value on opt dot item title field and we'll do the same for this one and then our short description should be the item description field and in order to keep our naming convention consistent I'm gonna change my short description back to description which means I have to change it over here as well now I'm running a little bit over today but I really really really want to finish this last bit before unbent but we will be signing off here shortly copy/paste that to there what are we missing we're missing the order bye and let's switch up my ordering here to try and keep this stuff consistent and ER Don order bye okay so we actually have to do an if statement here because there's two separate functions so if options dot order BLAP BLAP blop blop what are you doing blow up yo my youngest nine months old is in his Walker right now I figured somebody was holding him no he has come running down the hallway to come visit dad at work what's up little buddy [Laughter] yeah Jase I've heard I've heard your little ones in the background - ain't it great once once upon a time once upon a time my oldest who's no longer behind me so he can't get too embarrassed about this one other than the fact that it's now gonna be on the internet but when he was younger during a client call we had video on and he at toddler I want to say he was like two or three at the time we ran butt-naked behind me in the video in the middle of the client meeting I quickly cited technical difficulties and shut the video stream down nobody acknowledged that it happened but I'm not convinced that it did happen Mark Scott gives his daughter a camera you can view them side all that's awesome that's awesome I don't even I don't have a camera setup for the record yet oh yeah we could get the baby a camera will set him off Jay says I'm sure they noticed they were smiling on the inside yeah clearly the oldest won't be joining me on this stream now all right let's see so order by and that's gonna be up dot order by and she r dot order by descending is gonna be ops don't order by and what I'm missing is if direction is equal to and I want to say it's gonna be all I want to say it's gonna be all capitals but I can't remember so let's let's go with this and there's definitely a zero percent chance that they didn't notice thanks Dave I don't know if that's good hey it's still functional minus the title let's see here so what we need is C dot ops dot title save it and oh it's under C dot data ops there we go okay so now at this point and you may notice I've completely neglected meta at this point and I'm perfectly happy to do so right now mostly because I don't feel like dealing with arrays right now but to go ahead and finish this one up let's do a reload and we'll add actually wait a second I wanted to do one more thing one more thing one more thing before I close this up it'll have to be a quick dinner tonight something that cooks quickly you don't even eat the dinner I cook well blah blah blah back at you - I love you umm let's see where was it where was it where was it oh right I wanted to do a and C dot data dot popped dot show skeleton actually that might not work yeah that might not work we'll revisit that one again all right let's do this let's poops too much here's what we're gonna do I am going to do ace I'm gonna duplicate the entire panel and what we're gonna end up doing is instead of duplicating the UL and instead of duplicating that one alright let's move the ng-if down to the panel level if see that data is loading and see dot data ops dot J says I was messing around with OBS last night to get my stuff set up because I wanted to be like the cool people if you want I can share my OBS settings it has chat and cam boxes oh cool yeah that would be helpful Jace I have just recently switched from having it set up on my Mac my macbook screen to my external monitor that I set up and I flipped my screen so that I could go with the 16:9 aspect ratio to clean up some of the image issues I had with the last couple ones show skeleton okay and if C dot data is loading so we need to get rid of this one and if not loading needs to go up to the panel level all right so what I'm doing here is I'm separating the panel for the final data and the panel with the skeleton data so that I can enable showing the skeleton as an option so what we're gonna do here is show skeleton is going to be options dot show skeleton or well this probably won't work because of undefined and magical stuff like that so I don't know we'll see well now because if it's false then it would become true so we actually have to leave that one alone okay edit option schema shows skeleton is a boolean default value will it work I don't know and we'll put this one under presentation hey it did work okay so the default option this time around did appear to work so what this isn't going to enable us to do is to choose whether or not we want to show the skeleton so we don't actually have to use a different widget we can just use the exact same widget regardless and I'm gonna add one more disable a sync options dot disable a sync and my add a new one to disable a sync and that's gonna be a boolean and the default value is gonna be false and we'll put this one under behavior yeah we'll stick that one under behavior all right now the reason I set this up is so that I can turn around if inputs or ops dot disable async and then if C dot theta dot op dot disable oh yeah in house designer can totally make it look better we're gonna bring her we're gonna bring her in in a future episode we'll even like her and we'll get her to make this look real sharp I mean I'll try but you know amateurs we do our part you know so if not disable async all right so what the net result of what I just did should be is I've added a flag that will allow us to disable the async in other words it'll load it the first time through as opposed to loading it the second time as opposed to loading it asynchronously and doing episodes setting up OBS did not work as intended if input and options don't or options not disable async let's see seat updated on table stuff disable a sync not loading if is loading hmm why does what what is what disappear why doesn't skeleton disappear oh because it's it's an animation server javascript error Ott's is not defined why is ops not Devon defined because you didn't define it oh good call line number 64 ah de da da da you were right I didn't define it disabled async let's rename that okay so now let's go play with some options and kind of see what worked first let's reload just to make sure alright so instance options I'm gonna disable async that is the best kind of answer instance options and will disable async now let's not show skeleton on those disabled a sinks now didn't seem to work still showing the skeleton so we'll have to explore that one next time let's test some of the other instance options actually let's go with requests just so we're changing it to something else requested items filter will keep active is true on display field well no that would be a terrible one to use let's go with that one and let's go with item I wait no that's the wrong one presentation title maximum entries 5 Wow I didn't add that field did I let's go back and add that field real quick and that one was we didn't add that one at all yet okay so description feel I know I'm hurry you know I'm getting yelled at by the youngest Wow go with data on that one I think that's data related default value short description and then I need to update this two options dot description field or okay load ya Jace the youngest does know that without without reminders I might be on all night darn kids alright so description field will change to item all right now of course right now we don't have any length behavior so we'll have to change that eventually instance options title is requested items maximum entries is 5 there we go requested items we're showing requested items all right so this widgets well on its way to actually being something actually being a thing at this point I'm gonna go ahead and wrap it up for tonight and go try to find a quick way to whip up some dinner before the hungry natives sacrifice me to their gods so yeah thanks a lot everybody for joining I hope you enjoyed it and look forward to seeing you guys next time have a good one
https://www.youtube.com/watch?v=vzxaxW8cEag