Hi Guys, I definitely need to a way of resolve that problem. I will review emails tomorrow.
However if you Greg would like to try something go for it. Would be great if you could use my branch where changes which removes dispatching "change" event from model are in place. Thanks, Piotr pon., 17 gru 2018 o 23:46 Alex Harui <[email protected]> napisał(a): > Hi Greg, > > I haven't looked at how pervasive this change would be. I'm mainly saying > that Flex worked with these categories of events and I think Royale can too > and would eliminate the need for DispatchChangeOnStartup and things like > that. > > You could be right that the models only need to dispatch selectionChange > and not "change", as long as the controllers are guaranteed to update the > model in a way that fires selectionChange. I have this feeling that in > Flex there were some backdoors for updating properties without dispatching > events and dispatching the event "later", but I don't think we've had to > write such code in Royale and maybe we won't have to or can't because the > browser will update right away in many cases. There were somethings you > could do in Flash knowing that all rendering was deferred to frame > updates. In Royale, with separate models, the controller code can't just > set the backing variable. > > So, if you want to give it a try having only selectionChange as the > bindable event, go for it. > > -Alex > > On 12/17/18, 12:35 PM, "Greg Dove" <[email protected]> wrote: > > Thanks Alex. > > I only looked in Basic TextInput because I was looking for a simpler > example of the general case being discussed. That code looks like it > might > need some work on the swf side in any case. > I was just looking for the 'programmaticChange' vs > 'userInitiatedChange' > differences. > > Based on a quick look at the other Basic classes, the conclusions > appear > similar. They are bindable via 'change' only. > And the models all dispatch both selectedIndexChanged and > selectedItemChanged. > > So it seems like you are proposing broad changes for everything, if > they > are to also support binding changes for programmatic changes? > > For me, the change in something (or nothing) being 'selected' logically > occurs as a result of either user change or programmatic change. On > that > basis would it be possible to have the selectionChange as the sole > Binding > event (which occurs from setter induced change and from user induced > change) and the 'change' event as user-interaction only as the class > level > event type (as it is now)? > > I have not thought about this as much as you (Alex and others) have, so > maybe that last suggestion does not make sense. But I really think > that for > whatever does make sense it would be great to settle on something and > get > it consistent for all components asap. > > > > > On Tue, Dec 18, 2018 at 8:43 AM Alex Harui <[email protected]> > wrote: > > > Hi Greg, > > > > You are correct that there is a pain point around binding overhead > and > > PAYG. I can't think of a PAYG way of adding the ability to add more > > binding events via beads that doesn't have too much overhead for > folks not > > interested in those extra events. Actually, there are some ways > that are > > JS-only like replacing prototype-methods, but I don't think we > should rely > > on mutable class definitions. In many cases we make trade-offs and > Basic > > ends up being what we think almost all folks "must have". > > > > When we first started out I was hoping to reduce binding overhead > which is > > why some of the beads look like they do, but these days I think it > is more > > important to separate interactive events from binding/setup events. > Folks > > who don't use a particular binding event can always replace the > model and > > top-level component with a version without events they are not > interested > > in, or in the JS output, run a post-process to cull out metadata. > But > > under the "almost all folks" rule, I think "almost all folks" don't > want to > > run interaction handling code at setup time. Especially if that > handling > > code runs any sort of animation or does any other heavy processing. > > > > I could be wrong, but I'm pretty sure that if you just take a > <select> > > element, you can set its initial selection value without it > dispatching an > > event called "change". Then when a user selects an item you get a > "change" > > event. IMO, this is why "change" should be an interactive event and > not a > > binding event. > > > > So these are the reasons I think we should adjust the basic beads to > > separate interactive events from setup events and why "change" is an > > interactive event. > > > > Now, we could renew the effort to make Basic the truly smallest > > implementation and move some of this logic to Express, but I keep > seeing > > code creep into Basic to handle situations that almost all folks > need. > > > > TextInput, on the other hand, has been an exception of sorts in > Flex. The > > Flash/AIR runtime dispatches "change" on certain kinds of changes. > So > > early implementations in Royale tried to mimic that behavior for > folks > > coming from Flex. But maybe we should change that and make Basic > TextInput > > more consistent with browser behavior. The emulation components can > mimic > > the old Flex behavior. So I think using TextInput as precedent is > > misleading. > > > > Thoughts? > > -Alex > > > > On 12/17/18, 10:55 AM, "Greg Dove" <[email protected]> wrote: > > > > Alex, I was giving this some more thought also. I understood > that you > > meant > > to add extra events for binding from your previous comments. > > > > But isn't the established pattern to add a bead to listen for the > > selectionChange and redispatch it as change? > > > > At least that seems to be the case elsewhere > > > > If I look at the code in Basic TextInput... > > it dispatches 'textChange' and 'change' but is only Bindable via > > 'change'. > > There is effort to keep them distinct/separate. > > (OT: It looks like the swf side needs some consistency in the > html > > setter > > same as the text setter.) > > > > So TextInput appears to have 2 distinct events but only be > Bindable > > for one > > ('change'). So I presume that to make that support programmatic > > changes it > > would be by adding a bead to listen to the 'textChange' and > redispatch > > as > > 'change' ? > > > > Adding extra Bindable events adds weight because it affects > binding > > data, > > and creates more runtime support for the same feature in use > cases > > that may > > not need it. I don't see how that can be 'PAYG-ised' because > binding > > support for different event types is either there at compile > time or > > it is > > not in the component. So if the above is true for TextInput (at > this > > stage > > it's a guess/observation, I did not try this yet), then could it > not be > > similar for selection based components? > > > > To me 'change' seems like something generic and does not sound > > specific to > > being user-initiated change. My understanding is that it just > happens > > to be > > that way by default, unless you configure it to include > programmatic > > changes via bead. > > If it is like this for Basic TextInput, why can it not be the > same for > > other components ? ( > > > > > > > > On Tue, Dec 18, 2018 at 7:32 AM Alex Harui > <[email protected]> > > wrote: > > > > > I took a quick look at ArrayListSelection. It could use some > > > improvements, such as only dispatching a single > selectionChange event > > > instead of both selectedIndexChange and selectedItemChange. > > > > > > Some controller should dispatch the "change" event, not the > model. > > > > > > I took a quick look at List.as, (a top level component). It > should > > have > > > bindable metadata that looks like this: > > > > > > [Bindable("change")] > > > [Bindable("selectionChange")] > > > public function get selectedIndex():int > > > > > > Similar for selectedItem. The [Event] metadata for List is > > correct, It > > > should only list interactive events like "change" and not > bindable > > events > > > like selectionChange. This usually improves performance by not > > having the > > > UI react to setup. > > > > > > Once all of those changes are made, we should discuss any > remaining > > issues. > > > > > > My 2 cents, > > > -Alex > > > > > > On 12/17/18, 10:14 AM, "Piotr Zarzycki" < > [email protected]> > > > wrote: > > > > > > Basic ArrayListSelection model doesn't dispatch that > event. I > > believe > > > we > > > don't have to do this or rather do this only if we really > need > > it, for > > > example if someone make programatic change of > selectedIndex. - > > This is > > > general problem how to do that ? > > > > > > If I change selectedIndex - my model dispatch > > selectedInexChanged - > > > where > > > should I catch it and dispatch "change" event ? My though > are > > nowhere, > > > unless someone wanted to do that and have a bead. > > > > > > > > > pon., 17 gru 2018 o 19:08 Alex Harui > <[email protected]> > > > napisał(a): > > > > > > > Hi Piotr, > > > > > > > > I may not be understanding your problem. Not all models > will > > > dispatch a > > > > change event, but it is hard to imagine a selection > model that > > > doesn't. > > > > > > > > -Alex > > > > > > > > On 12/17/18, 9:36 AM, "Piotr Zarzycki" < > > [email protected]> > > > wrote: > > > > > > > > I will review your email again and see what can I do > this. > > > However > > > > this one > > > > is a second problem. First one was about programmatic > > change > > > discover > > > > - If > > > > you are talking about that - Let me check your > earlier > > emails. > > > > > > > > Thanks, > > > > Piotr > > > > > > > > pon., 17 gru 2018 o 18:30 Alex Harui > > <[email protected]> > > > > napisał(a): > > > > > > > > > FWIW, I would much rather see energy spent on > trying to > > > implement the > > > > > patterns I suggested earlier, which will hopefully > > eliminate > > > the > > > > need for > > > > > DispatchChangeOnStartup. > > > > > > > > > > My 2 cents, > > > > > -Alex > > > > > > > > > > On 12/17/18, 4:34 AM, "Piotr Zarzycki" < > > > [email protected]> > > > > wrote: > > > > > > > > > > Carlos, > > > > > > > > > > I don't understand this sentence -> " If not > we can > > get > > > involved > > > > in > > > > > pursues > > > > > problems > > > > > that are not real." - What do you mean here ? > > > > > > > > > > Ok I can wait for Alex review. > > > > > > > > > > However your review and look into above problem > > doesn't > > > need > > > > Alex's > > > > > attention. This bead (DispatchChangeOnStartup) > > probably > > > won't > > > > work > > > > > doesn't > > > > > matter if we fix programmatic change or not. - > > Unless I > > > bring > > > > back > > > > > dispatching "change" event from model - which > rather > > is not > > > > > recommended in > > > > > previous discussion. > > > > > > > > > > Thanks, Piotr > > > > > > > > > > pon., 17 gru 2018 o 13:14 Carlos Rovira < > > > [email protected] > > > > > > > > > > napisał(a): > > > > > > > > > > > Hi Piotr, > > > > > > > > > > > > I think we should solve first the programatic > > change so > > > I can > > > > test > > > > > the > > > > > > branch and see regressions. If not we can get > > involved in > > > > pursues > > > > > problems > > > > > > that are not real. I think Alex missed this > > discussion. > > > I'll > > > > point > > > > > him in > > > > > > this thread to see if he can give his opinion > > about the > > > ways > > > > you > > > > > proposed > > > > > > in the initial thread email. > > > > > > > > > > > > Thanks! > > > > > > > > > > > > El lun., 17 dic. 2018 a las 10:57, Piotr > Zarzycki > > (< > > > > > > [email protected]>) escribió: > > > > > > > > > > > > > Hi Carlos, > > > > > > > > > > > > > > I just noticed that if model do not > dispatch > > change > > > event - > > > > your > > > > > bead > > > > > > > DispatchChangeOnStartup won't work because > it > > simply > > > based on > > > > > dispatching > > > > > > > "change" event trough model. > > > > > > > > > > > > > > I'm wondering whether it won't be enough > if that > > bead > > > listen > > > > for > > > > > > > "beadsAdded" (here I think it should be > > registered for > > > > > "initComplete" > > > > > > > instead) and dispatch change event once. I > made > > the > > > changes > > > > to > > > > > that bead, > > > > > > > but I don't have scenario which you are > using it. > > > > > > > > > > > > > > Will you be able to test my changes on > your > > > application end > > > > using > > > > > my > > > > > > > branch ? Above changes are not fully > related to > > what > > > we are > > > > > discussing > > > > > > > here, so programmatic change still won't > work > > yet. > > > Please > > > > review > > > > > those > > > > > > > changes as well [1] > > > > > > > > > > > > > > Those new changes are just to check > whether I > > won't > > > break > > > > any of > > > > > your > > > > > > > functionality on startup. I will move for > > creating > > > bead for > > > > > discovering > > > > > > > programmatic changes, but first would like > to > > know > > > whether > > > > till now > > > > > > > everything is working fine. > > > > > > > > > > > > > > [1] > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fapache%2Froyale-asjs%2Fcommit%2F14f6354e037e5854900ef5620581f6914bd604c4&data=02%7C01%7Caharui%40adobe.com%7C36d3d0b5a2a04dbda1fe08d6645f1dee%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636806757044098722&sdata=63TqFe1D1baSKYc3b9h2hr3ckWveZJjcOVhsynzOVXE%3D&reserved=0 > > > > > > > > > > > > > > Thanks, Piotr > > > > > > > > > > > > > > > > > > > > > pt., 14 gru 2018 o 19:55 Carlos Rovira < > > > > [email protected]> > > > > > > > napisał(a): > > > > > > > > > > > > > > > Hi Piotr, > > > > > > > > > > > > > > > > after check example code, we have: > > > > > > > > > > > > > > > > <j:ComboBox id="watchmenComboBox" > > > > > dataProvider="{listModel.watchmen}"> > > > > > > > > ... > > > > > > > > then NS: > > > > > > > > > > > > > > > > <j:NumericStepper > > > > valueChange="watchmenComboBox.selectedIndex = > > > > > > > > event.target.value" minimum="0" > maximum="5"/> > > > > > > > > > > > > > > > > and finally > > > > > > > > > > > > > > > > <j:Label id="watchmenComboBoxResult" > html= > > > > > > > > > > "{describeItem(watchmenComboBox.selectedItem)}"/> > > > > > > > > > > > > > > > > I think right now works as expected, > since the > > > change is > > > > > programatic > > > > > > (is > > > > > > > > not the user clicking in the combo list > and > > selecting > > > > other item > > > > > > > > > > > > > > > > So I think a bead should be better in > this > > case, that > > > > takes care > > > > > of > > > > > > this > > > > > > > > behavior. > > > > > > > > > > > > > > > > I'm interested in Alex response about > how to > > handle > > > it > > > > > > > > > > > > > > > > Thanks Piotr for working on this > > > > > > > > > > > > > > > > Carlos > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > El vie., 14 dic. 2018 a las 17:02, Piotr > > Zarzycki (< > > > > > > > > [email protected]>) escribió: > > > > > > > > > > > > > > > > > Hi Carlos, > > > > > > > > > > > > > > > > > > I have created issue [1] and branch > [2] for > > > problem with > > > > double > > > > > > > dispatch > > > > > > > > > "change" event. > > > > > > > > > I have pushed changes when I'm > removing from > > > > > ArrayListSelectionModel > > > > > > > > > dispatch of change event. > > > > > > > > > > > > > > > > > > Above action successfully fix however > like I > > > thought it's > > > > > introduces > > > > > > > > > another one which I would like to > discuss > > how to > > > fix. I > > > > have > > > > > deployed > > > > > > > > > temporary Tour De Jewel here [3] in > order to > > show > > > you > > > > and to > > > > > others > > > > > > > that > > > > > > > > > issue. > > > > > > > > > > > > > > > > > > *New Issue:* > > > > > > > > > When you go to ComboBox and try to > change > > > selectedIndex > > > > using > > > > > > > > > NumericStepper it will successfully > change > > > selectedItem > > > > in > > > > > ComboBox. > > > > > > > > > Unfortunately label on the right sight > of > > ComboBox > > > won't > > > > be > > > > > updated. > > > > > > > > > > > > > > > > > > *Question is:* > > > > > > > > > How should be implemented discover of > > programmatic > > > > change of > > > > > > > > selectedIndex > > > > > > > > > and selectedItem ? > > > > > > > > > > > > > > > > > > *I see following options:* > > > > > > > > > 1) We should listen on events > > > > > > selectedIndexChanged/selectedItemChanged > > > > > > > > and > > > > > > > > > dispatch "change" from components View > bead. > > In > > > this way > > > > we > > > > > have to > > > > > > > take > > > > > > > > > into account places where "we" as a > component > > > setup those > > > > > properties > > > > > > > > > internally - In that case > > "selectedIndexChanged" > > > and > > > > > > > > "selectedItemChanged" > > > > > > > > > event shouldn't be dispatch. > > > > > > > > > > > > > > > > > > 2) Create separate bead which allows > discover > > > > programmatic > > > > > change of > > > > > > > > > selectedIndex and selectedItem- cause > not > > everyone > > > > wanted to > > > > > have at > > > > > > > all > > > > > > > > > programmatic change event in the > component - > > > probably > > > > most of > > > > > the > > > > > > cases > > > > > > > > > will be opposite. > > > > > > > > > > > > > > > > > > What others think about that ? > > > > > > > > > > > > > > > > > > [1] > > > > > > > > > > > > > > > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fapache%2Froyale-asjs%2Fissues%2F353&data=02%7C01%7Caharui%40adobe.com%7C36d3d0b5a2a04dbda1fe08d6645f1dee%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636806757044098722&sdata=G8eJrIYW%2BaEIRFcu0dSFbKEcR%2Fy%2BpKlD1YzbMgM3re0%3D&reserved=0 > > > > > > > > > [2] > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fapache%2Froyale-asjs%2Ftree%2Fbugfix%2Fissue_353_double_dispatch_of_change_event_in_Jewel_List&data=02%7C01%7Caharui%40adobe.com%7C36d3d0b5a2a04dbda1fe08d6645f1dee%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636806757044098722&sdata=X65GmRCgzhAIaW7PO%2BiyQaPvFlREYeFYCcVEGvcM28s%3D&reserved=0 > > > > > > > > > [3] > > > > > > > > > > > > > > > https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Ftranspiledactionscript.com%2Fdev%2Froyale%2F%23&data=02%7C01%7Caharui%40adobe.com%7C36d3d0b5a2a04dbda1fe08d6645f1dee%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636806757044098722&sdata=LRkRN%2BGRgjtdiNTNN9oZY1hZFbOm0IIG%2BiScrnd5GK0%3D&reserved=0 > > > > > > > > > > > > > > > > > > Thanks, > > > > > > > > > -- > > > > > > > > > > > > > > > > > > Piotr Zarzycki > > > > > > > > > > > > > > > > > > Patreon: * > > > > > > > > > > > > > > > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7C36d3d0b5a2a04dbda1fe08d6645f1dee%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636806757044108732&sdata=yiyoM5h4LpKD2Tkl3P2KXnTN6CnH2eWzzPOgCdD9IB0%3D&reserved=0 > > > > > > > > > < > > > > > > > > > > > > > > > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7C36d3d0b5a2a04dbda1fe08d6645f1dee%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636806757044108732&sdata=yiyoM5h4LpKD2Tkl3P2KXnTN6CnH2eWzzPOgCdD9IB0%3D&reserved=0 > > > > > >* > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > > Carlos Rovira > > > > > > > > > > > > > > > > > > > > > > > https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7C36d3d0b5a2a04dbda1fe08d6645f1dee%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636806757044108732&sdata=2VTZlF8coTwrP1A93NJ6v0Gx5vmQJAFUsTGGvBpaeDA%3D&reserved=0 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > > > > > > > > Piotr Zarzycki > > > > > > > > > > > > > > Patreon: * > > > > > > > > > > > > > > > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7C36d3d0b5a2a04dbda1fe08d6645f1dee%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636806757044108732&sdata=yiyoM5h4LpKD2Tkl3P2KXnTN6CnH2eWzzPOgCdD9IB0%3D&reserved=0 > > > > > > > < > > > > > > > > > > > > > > > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7C36d3d0b5a2a04dbda1fe08d6645f1dee%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636806757044108732&sdata=yiyoM5h4LpKD2Tkl3P2KXnTN6CnH2eWzzPOgCdD9IB0%3D&reserved=0 > > > > > >* > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > Carlos Rovira > > > > > > > > > > > > > > > > > > > > > https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7C36d3d0b5a2a04dbda1fe08d6645f1dee%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636806757044108732&sdata=2VTZlF8coTwrP1A93NJ6v0Gx5vmQJAFUsTGGvBpaeDA%3D&reserved=0 > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > > > > Piotr Zarzycki > > > > > > > > > > Patreon: * > > > > > > > > > > > > > > > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7C36d3d0b5a2a04dbda1fe08d6645f1dee%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636806757044108732&sdata=yiyoM5h4LpKD2Tkl3P2KXnTN6CnH2eWzzPOgCdD9IB0%3D&reserved=0 > > > > > < > > > > > > > > > > > > > > > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7C36d3d0b5a2a04dbda1fe08d6645f1dee%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636806757044108732&sdata=yiyoM5h4LpKD2Tkl3P2KXnTN6CnH2eWzzPOgCdD9IB0%3D&reserved=0 > > > > > >* > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > > Piotr Zarzycki > > > > > > > > Patreon: * > > > > > > > > > > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7C36d3d0b5a2a04dbda1fe08d6645f1dee%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636806757044108732&sdata=yiyoM5h4LpKD2Tkl3P2KXnTN6CnH2eWzzPOgCdD9IB0%3D&reserved=0 > > > > < > > > > > > > > > > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7C36d3d0b5a2a04dbda1fe08d6645f1dee%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636806757044108732&sdata=yiyoM5h4LpKD2Tkl3P2KXnTN6CnH2eWzzPOgCdD9IB0%3D&reserved=0 > > > > >* > > > > > > > > > > > > > > > > > > -- > > > > > > Piotr Zarzycki > > > > > > Patreon: * > > > > > > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7C36d3d0b5a2a04dbda1fe08d6645f1dee%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636806757044108732&sdata=yiyoM5h4LpKD2Tkl3P2KXnTN6CnH2eWzzPOgCdD9IB0%3D&reserved=0 > > > < > > > > > > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.patreon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com%7C36d3d0b5a2a04dbda1fe08d6645f1dee%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636806757044118737&sdata=T9ppp9S1zyhwOul7XszcdSgixIIsAHFTdPJm%2FYvUXa4%3D&reserved=0 > > > >* > > > > > > > > > > > > > > > > > > -- Piotr Zarzycki Patreon: *https://www.patreon.com/piotrzarzycki <https://www.patreon.com/piotrzarzycki>*
