What do you think of the CSSClassList class I just committed? I *think* that makes the pattern more recognizable and probably is less heavy if more than one class can be used.
Harbs > On Mar 1, 2018, at 11:56 PM, Piotr Zarzycki <[email protected]> wrote: > > Harbs, Alex, > > I just pushed implementation of computeFinalClassNames to > branch feature/type_names_class_name_issue124. You can review > implementation in this commit [1] and example of usage in Card and Button. > > I have tested with Harbs example [3] and with Card by changing orders. It's > working. > > [1] http://bit.ly/2HTHaFQ > [2] http://bit.ly/2oJgKOf > [3] http://bit.ly/2F734nx > > Waiting for your review. > > Thanks, > Piotr > > > 2018-02-28 23:31 GMT+01:00 Piotr Zarzycki <[email protected]>: > >> Let me play with implementation of that function. It seems to me that will >> be much cleaner than current solution. >> >> If user actually wanted to do anythin with className - let the overriding >> speaks. >> >> >> >> On Wed, Feb 28, 2018, 21:51 Alex Harui <[email protected]> wrote: >> >>> On 2/28/18, 12:27 PM, "Harbs" <[email protected]> wrote: >>> >>>> OK. I think that will work for DML components, but what if there’s a bead >>>> which needs to add class names? What would be the “right” way to do that? >>>> A bead cannot override the function on the strand. >>> >>> Do we have beads that manipulate className? >>> >>> IMO, the principle behind how to handle that is knowing whether you are >>> sharing something or not. There may not be one right way to handle it, >>> but if I had to handle it, I would have the bead set something in the >>> model or presentation model of the component. And the component would >>> override computeFinalClassNames to take that into account. >>> >>> >>> Although having just written that, maybe this computeFinalClassNames >>> should be in the view instead of on the base class so it is replaceable >>> instead of overridable. >>> >>> Thoughts? >>> -Alex >>>> >>>>> On Feb 28, 2018, at 10:17 PM, Alex Harui <[email protected]> >>>>> wrote: >>>>> >>>>> I think you are missing that the element.className is set to >>>>> computeFinalClassNames. So the user is welcome to manipulate the >>>>> UIBase.className however they see fit. They can assign it a whole new >>>>> space-delimited list if they want. But what gets set on >>>>> element.className >>>>> is computed from typeNames and className by default, and MDL would >>>>> override it to factor in fab, raised, colored into the computing of the >>>>> final classnames. >>>>> >>>>> I would prefer that we don't make requirements on users as to what they >>>>> can or can't do with the className property, like requiring them to use >>>>> addClassName/removeClassNames. MXML and States might set className, >>> as >>>>> could any other AS logic. I think folks may even be used to setting >>>>> className in JavaScript. So letting UIBase.className be the "variable" >>>>> part and having computeFinalClassNames be the way the "fixed" part is >>>>> handled makes sense to me. >>>>> >>>>> Of course, I could be wrong... >>>>> -Alex >>>>> >>>>> On 2/28/18, 12:03 PM, "Harbs" <[email protected]> wrote: >>>>> >>>>>> The problem which sparked this whole issue is like this: >>>>>> >>>>>> 1. We have some components (i.e. in MDL) which add “pieces” to the >>>>>> class >>>>>> names (such as “fab”, “raised”, “colored”, etc. >>>>>> 2. The client might subsequently set the className to something else. >>>>>> 3. When the component sets the “pieces” first and the client sets the >>>>>> className later, the client will overwrite these “pieces” which were >>>>>> added by the component. >>>>>> >>>>>> My suggestion to have addClassName() and removeClassName() was to have >>>>>> a >>>>>> “safe” way to add class names which would get computed together with >>>>>> the >>>>>> className when the className is replaced. >>>>>> >>>>>> The way you have it seems to just be modifying the existing className >>>>>> property. If that’s overwritten by a client, the logic falls apart. >>>>>> >>>>>> It feels like only having typeNames which are set inside the component >>>>>> and className which is set outside the component is not really enough. >>>>>> (Unless I’m missing something.) >>>>>> >>>>>> Harbs >>>>>> >>>>>>> On Feb 28, 2018, at 9:31 PM, Alex Harui <[email protected]> >>>>>>> wrote: >>>>>>> >>>>>>> On 2/28/18, 10:44 AM, "Harbs" <[email protected]> wrote: >>>>>>> >>>>>>>> If it’s not public, I don’t see how a utility method could call it >>>>>>>> though. >>>>>>> >>>>>>> I didn't think the utility methods like addClassName/removeClassName >>>>>>> would >>>>>>> need to alter computeFinalClassNames(). >>>>>>> >>>>>>> AIUI, for most UIBase subclasses, the final element.className is a >>> mix >>>>>>> of >>>>>>> the className property and the typeNames. The typenames are thought >>>>>>> to >>>>>>> be >>>>>>> "fixed" and the space-delimited list of names in className are the >>>>>>> ones >>>>>>> the user wants to manipulate in their code. So, I would expect them >>>>>>> to >>>>>>> write: >>>>>>> >>>>>>> org.apache.royale.utils.addClassName(myComponent, "pinkStyles"); >>>>>>> >>>>>>> >>>>>>> addClassName should just do something like: >>>>>>> >>>>>>> myComponent.className += value; >>>>>>> >>>>>>> That will call the className setter that will run: >>>>>>> >>>>>>> element.className = computeFinalClassNames(); >>>>>>> >>>>>>> If you call >>>>>>> >>>>>>> org.apache.royale.utils.removeClassName(myComponent, "pinkStyles"); >>>>>>> >>>>>>> removeClassName should just do something like: >>>>>>> >>>>>>> Var s:String = myComponent.className; >>>>>>> Var c:int = s.indexOf(nameToRemove + " "); >>>>>>> If (c != -1) >>>>>>> s = s.substr(0, c) + s.substr(c + nameToRemove.length + 1); >>>>>>> Else >>>>>>> { >>>>>>> c= s.indexOf(" " + nameToRemove); >>>>>>> if (c != -1) >>>>>>> s = s.substr(0, c); // remove last item >>>>>>> } >>>>>>> myComponent.className = s; >>>>>>> >>>>>>> >>>>>>> >>>>>>> It seems like it should be that simple. What am I missing? >>>>>>> >>>>>>> -Alex >>>>>>> >>>>>>> >>>>>>>> >>>>>>>>> On Feb 28, 2018, at 8:21 PM, Alex Harui <[email protected]> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On 2/28/18, 9:50 AM, "Piotr Zarzycki" <[email protected] >>>>>>>>> <mailto:[email protected]>> wrote: >>>>>>>>> >>>>>>>>>> Ok Understand, but do you agree that computeFinalClassNames - is >>>>>>>>>> something >>>>>>>>>> which is in the UIBase ? >>>>>>>>> >>>>>>>>> Yes, and probably protected instead of public. The one in UIBase >>>>>>>>> just >>>>>>>>> appends typenames to className. It gets overridden in MDL where >>>>>>>>> needed >>>>>>>>> for shadow and other attributes. >>>>>>>>> >>>>>>>>> My 2 cents, >>>>>>>>> -Alex >>>>>>>>>> >>>>>>>>>> 2018-02-28 18:47 GMT+01:00 Alex Harui <[email protected]>: >>>>>>>>>> >>>>>>>>>>> I think that in the shadow setter, it would change _shadow and >>>>>>>>>>> call >>>>>>>>>>> setClassName(computeFinalClassNames()); >>>>>>>>>>> >>>>>>>>>>> On 2/28/18, 9:33 AM, "Piotr Zarzycki" <[email protected] >>>> >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>>> Alex, >>>>>>>>>>>> >>>>>>>>>>>> So we are getting back to the idea where you proposed to have >>>>>>>>>>>> function >>>>>>>>>>>> which computes everything. >>>>>>>>>>>> >>>>>>>>>>>> override public function computeFinalClassNames():String >>>>>>>>>>>> { >>>>>>>>>>>> return super.computeFinalClassNames() + " " + _shadow; >>>>>>>>>>>> } >>>>>>>>>>>> >>>>>>>>>>>> Where does that function should be placed ? Does that function >>>>>>>>>>>> should >>>>>>>>>>> be >>>>>>>>>>>> called in addedToParent plus whenever someone change _shadow ? - >>>>>>>>>>>> >>>>>>>>>>>> Because I really don't know how to handle scenario where you >>> have >>>>>>>>>>>> some >>>>>>>>>>>> property isActive = true/false and I need to add/remove class. - >>>>>>>>>>>> In >>>>>>>>>>>> the >>>>>>>>>>>> first launch I use computeFinalClassNames, but how to handle >>>>>>>>>>>> changing >>>>>>>>>>> ? >>>>>>>>>>>> >>>>>>>>>>>> Thanks, Piotr >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> 2018-02-28 18:26 GMT+01:00 Alex Harui <[email protected] >>>> : >>>>>>>>>>>> >>>>>>>>>>>>> Hi Piotr, >>>>>>>>>>>>> >>>>>>>>>>>>> I think am I not communicating the principles effectively. >>>>>>>>>>>>> >>>>>>>>>>>>> First, IMO, addClassName and removeClassName should not be in >>>>>>>>>>>>> UIBase. >>>>>>>>>>>>> Lots of apps can be written without needing these methods. I >>>>>>>>>>>>> think >>>>>>>>>>> they >>>>>>>>>>>>> can be written as utility functions. >>>>>>>>>>>>> >>>>>>>>>>>>> Second, the computation of the final element.className should >>>>>>>>>>> represent >>>>>>>>>>>>> the state of the component, so I don't get why you need an >>>>>>>>>>>>> _internalClassName or should ever set it to "". The >>> computation >>>>>>>>>>>>> for >>>>>>>>>>> a >>>>>>>>>>>>> component with a shadow would be to check the shadow property >>>>>>>>>>>>> and >>>>>>>>>>>>> if >>>>>>>>>>> it >>>>>>>>>>>>> is >>>>>>>>>>>>> true, add a className for the shadow to the list. Then I think >>>>>>>>>>>>> you >>>>>>>>>>>>> wouldn't have the problem you showed in the animated GIF. When >>>>>>>>>>>>> the >>>>>>>>>>>>> classname property is set from the outside by >>>>>>>>>>>>> MXMLDataInterpreter >>>>>>>>>>>>> or >>>>>>>>>>>>> even >>>>>>>>>>>>> user-written code, those classNames are added to the list with >>>>>>>>>>>>> the >>>>>>>>>>>>> typeNames and the shadow className if shadow is true and then >>>>>>>>>>>>> set >>>>>>>>>>>>> on >>>>>>>>>>> the >>>>>>>>>>>>> element. >>>>>>>>>>>>> >>>>>>>>>>>>> Finally, for addClassName and removeClassName, and all other >>>>>>>>>>>>> Royale >>>>>>>>>>>>> code, >>>>>>>>>>>>> we don't want to do much if any parameter checking. That is >>>>>>>>>>>>> also >>>>>>>>>>>>> just-in-case code. The production code should not be passing >>> in >>>>>>>>>>> null or >>>>>>>>>>>>> other bad values. And once you fix that, then the checks that >>>>>>>>>>>>> you >>>>>>>>>>> have >>>>>>>>>>>>> written do not add value. I have proposed that there are >>>>>>>>>>>>> debug-only >>>>>>>>>>>>> code >>>>>>>>>>>>> that does parameter checking. There is a goog.DEBUG flag you >>>>>>>>>>>>> can >>>>>>>>>>>>> use >>>>>>>>>>>>> for >>>>>>>>>>>>> that. >>>>>>>>>>>>> >>>>>>>>>>>>> HTH, >>>>>>>>>>>>> -Alex >>>>>>>>>>>>> >>>>>>>>>>>>> On 2/28/18, 12:40 AM, "Piotr Zarzycki" >>>>>>>>>>>>> <[email protected]> >>>>>>>>>>>>> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> Hi Alex, >>>>>>>>>>>>>> >>>>>>>>>>>>>> Sorry about that. Let me show you code and I recorded GIF with >>>>>>>>>>> problem >>>>>>>>>>>>>> debugging. >>>>>>>>>>>>>> >>>>>>>>>>>>>> *Code in UIBase which I have implemented:* >>>>>>>>>>>>>> addClassName and removeClassName [1]. >>>>>>>>>>>>>> addedToParent what is happen with internal field which I have >>>>>>>>>>>>>> added >>>>>>>>>>> [2] >>>>>>>>>>>>>> >>>>>>>>>>>>>> *Code for Testing* [3] - I'm adding first className, than >>>>>>>>>>>>>> shadow. >>>>>>>>>>>>>> >>>>>>>>>>>>>> *GIF* [4] We are starting from the constructor. Pay attention >>>>>>>>>>>>>> to >>>>>>>>>>>>>> the >>>>>>>>>>>>>> moment >>>>>>>>>>>>>> where className is being wiped out, later I have to use my >>>>>>>>>>>>>> internal >>>>>>>>>>>>>> variable to get it back. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Does that more clean now ? >>>>>>>>>>>>>> >>>>>>>>>>>>>> [1] >>>>>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>> https%3A%2F%2Fpaste.apa >>>>>>>>>>>>>> che.org%2FEumG&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>>> 7Cee5c84b4e3ff4ddb578008d >>>>>>>>>>>>>> 57e87046f%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>>>>>>>>>>>> 7C636554040718214998& >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> sdata=cDT88OF63TdBMPxYY2vwMSIRxD%2FP3DvwHupj%2BQHsofw%3D& >>> reserve >>>>>>>>>>>>>> d= >>>>>>>>>>>>>> 0 >>>>>>>>>>>>>> [2] >>>>>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>> https%3A%2F%2Fpaste.apa >>>>>>>>>>>>>> che.org%2FArmU&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>>> 7Cee5c84b4e3ff4ddb578008d >>>>>>>>>>>>>> 57e87046f%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>>>>>>>>>>>> 7C636554040718214998& >>>>>>>>>>>>>> sdata=m6whImrP70u7kzRxCbErlxCHWef8TK >>> Nejwm4Sr7bw7g%3D&reserved=0 >>>>>>>>>>>>>> [3] >>>>>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>> https%3A%2F%2Fpaste.apa >>>>>>>>>>>>>> che.org%2FKrxq&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>>> 7Cee5c84b4e3ff4ddb578008d >>>>>>>>>>>>>> 57e87046f%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>>>>>>>>>>>> 7C636554040718214998& >>>>>>>>>>>>>> sdata=tpeUYSQIXGXtES8hyr7zSeet528ZTc >>> zSltcNccqRGDo%3D&reserved=0 >>>>>>>>>>>>>> [4] >>>>>>>>>>>>>> https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>> https%3A%2F%2F1drv.ms%2 >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> Fu%2Fs!ApVpLyjpHDC2hPtoCi65kIZZPwjSpQ >>> &data=02%7C01%7Caharui%40ad >>>>>>>>>>>>>> ob >>>>>>>>>>>>>> e >>>>>>>>>>> .com >>>>>>>>>>>>> %7C >>>>>>>>>>>>>> ee5c84b4e3ff4ddb578008d57e87046f% >>> 7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>> cee1%7C0%7C >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> 0%7C636554040718214998&sdata=eX%2FgZ0MA% >>> 2BdQJjcpYtMkk1pw3r0iVkdR >>>>>>>>>>>>>> a% >>>>>>>>>>>>> 2F6TWRTG >>>>>>>>>>>>>> 10OY%3D&reserved=0 >>>>>>>>>>>>>> >>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>> Piotr >>>>>>>>>>>>>> >>>>>>>>>>>>>> 2018-02-27 23:31 GMT+01:00 Alex Harui >>>>>>>>>>>>>> <[email protected]>: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Hi Piotr, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I could not understand this explanation. Might be better to >>>>>>>>>>>>>>> show >>>>>>>>>>>>> actual >>>>>>>>>>>>>>> code. For example in #3, there is a cssClass variable that I >>>>>>>>>>> don't >>>>>>>>>>>>> know >>>>>>>>>>>>>>> about. Also you mention at the bottom setting something as >>>>>>>>>>>>>>> empty, >>>>>>>>>>>>> but >>>>>>>>>>>>>>> I'm >>>>>>>>>>>>>>> not sure what that is. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> However, IMO, this code should be in utility functions, not >>> in >>>>>>>>>>>>> UIBase. >>>>>>>>>>>>>>> I >>>>>>>>>>>>>>> think plenty of useful applications can be built without >>>>>>>>>>>>>>> changing >>>>>>>>>>>>>>> classNames at runtime. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I'm off-line for the next several hours so we can pick this >>> up >>>>>>>>>>> again >>>>>>>>>>>>> in >>>>>>>>>>>>>>> your morning. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Thanks for working on it, >>>>>>>>>>>>>>> -Alex >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 2/27/18, 2:21 PM, "Piotr Zarzycki" >>>>>>>>>>>>>>> <[email protected]> >>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Here is how I'm thinking to resolve that issue. I would take >>>>>>>>>>> Harb's >>>>>>>>>>>>>>>> proposition and add to UIBase addClassName() and >>>>>>>>>>> removeClassName(). >>>>>>>>>>>>>>> Next >>>>>>>>>>>>>>>> I >>>>>>>>>>>>>>>> would add internal field _internalClassName:String. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> addClassName(value): >>>>>>>>>>>>>>>> 1) Will check if provided class name exits in _className and >>>>>>>>>>>>>>>> in >>>>>>>>>>>>>>>> _internalClassName. >>>>>>>>>>>>>>>> 2) Will add to _internalClassName += value >>>>>>>>>>>>>>>> 3) Assign to the element.className in the following way: >>>>>>>>>>>>>>> element.className >>>>>>>>>>>>>>>> = cssClass + " " + _className + " " + typeNames; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> removeClassName(value) >>>>>>>>>>>>>>>> 1) Will check if provided classs name exists in _className >>>>>>>>>>>>>>>> or >>>>>>>>>>>>>>>> in >>>>>>>>>>>>>>>> _internalClassName >>>>>>>>>>>>>>>> 2) Make a replace to empty string if css class name exists. >>>>>>>>>>>>>>>> _className.replace(value, ""); >>>>>>>>>>>>>>>> 3) Assign to the element.className: element.className = >>>>>>>>>>> _className >>>>>>>>>>>>> + " >>>>>>>>>>>>>>> " + >>>>>>>>>>>>>>>> typeNames; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> In added to parent we are computing _internalClassName with >>>>>>>>>>>>> _className >>>>>>>>>>>>>>> and >>>>>>>>>>>>>>>> typeNames. Then it's being set as empty. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> element.className = _internalClassName + " " + _className >>>>>>>>>>>>>>>> + " >>>>>>>>>>> " + >>>>>>>>>>>>>>>> typeNames; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I have implemented it and it seems to be working. Waiting >>> for >>>>>>>>>>> your >>>>>>>>>>>>>>>> thoughts >>>>>>>>>>>>>>>> on that solution. The last step where we are adding all >>> three >>>>>>>>>>>>> fields is >>>>>>>>>>>>>>>> the >>>>>>>>>>>>>>>> most important. Points 3 in addClassName and removeClassName >>>>>>>>>>>>>>>> are >>>>>>>>>>>>>>>> necessary, >>>>>>>>>>>>>>>> because user may want to more dynamically manipulate classes >>>>>>>>>>>>>>>> once >>>>>>>>>>>>>>>> component >>>>>>>>>>>>>>>> is created. Ex. "is-active" class is removed and added on >>>>>>>>>>>>>>>> demand. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Thanks, Piotr >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> 2018-02-27 13:38 GMT+01:00 Piotr Zarzycki >>>>>>>>>>>>> <[email protected]>: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I think I have analyzed everything and have some >>>>>>>>>>>>>>>>> implementation >>>>>>>>>>>>>>>>> proposition. I will try to provide it later today. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Thanks, Piotr >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> 2018-02-27 13:35 GMT+01:00 Harbs <[email protected]>: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> ExpandableSearch broke too. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On Feb 25, 2018, at 6:15 PM, Piotr Zarzycki >>>>>>>>>>>>>>>>>> <[email protected]> >>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Harbs, >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> If you are using something more than MDL Dialog in your >>>>>>>>>>>>>>> application >>>>>>>>>>>>>>>>>> it >>>>>>>>>>>>>>>>>>> would be great to get feedback whether I didn't break for >>>>>>>>>>> you >>>>>>>>>>>>>>>>>> anything. >>>>>>>>>>>>>>>>>> :) >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Piotr Zarzycki >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Patreon: >>>>>>>>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>>> https%3A%2F%2Fwww.pat >>>>>>>>>>>>>>>>> reon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com >>>>>>>>>>>>>>> %7C45a065853ba1 >>>>>>>>>>>>>>>>> 4a295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>>>> cee1%7C0%7C0%7C6365536 >>>>>>>>>>>>>>>>> 69427477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK >>>>>>>>>>>>>>> 9liXcy%2BPg%3D&rese >>>>>>>>>>>>>>>>> rved=0 >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>>> https%3A%2F%2Fwww.pat >>>>>>>>>>>>>>>>> reon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com >>>>>>>>>>>>>>> %7C45a065853ba1 >>>>>>>>>>>>>>>>> 4a295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>>>> cee1%7C0%7C0%7C6365536 >>>>>>>>>>>>>>>>> 69427477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK >>>>>>>>>>>>>>> 9liXcy%2BPg%3D&rese >>>>>>>>>>>>>>>>> rved=0>* >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Piotr Zarzycki >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Patreon: >>>>>>>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>>> https%3A%2F%2Fwww.patr >>>>>>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>>>>> 7C45a065853ba14a >>>>>>>>>>>>>>>> 295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>>>> cee1%7C0%7C0%7C6365536694 >>>>>>>>>>>>>>>> 27477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK >>>>>>>>>>>>>>> 9liXcy%2BPg%3D&reserved >>>>>>>>>>>>>>>> =0 >>>>>>>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>>>> https%3A%2F%2Fwww.patr >>>>>>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>>>>> 7C45a065853ba14a >>>>>>>>>>>>>>>> 295d9d08d57e3082b9%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>>>> cee1%7C0%7C0%7C6365536694 >>>>>>>>>>>>>>>> 27477536&sdata=tOlZF%2FWAGhqn1toqJCCqjc14NZU56MnZZK >>>>>>>>>>>>>>> 9liXcy%2BPg%3D&reserved >>>>>>>>>>>>>>>> =0>* >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> >>>>>>>>>>>>>> Piotr Zarzycki >>>>>>>>>>>>>> >>>>>>>>>>>>>> Patreon: >>>>>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>> https%3A%2F%2Fwww.patr >>>>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>>> 7Cee5c84b4e3ff4d >>>>>>>>>>>>>> db578008d57e87046f%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>> cee1%7C0%7C0%7C6365540407 >>>>>>>>>>>>>> >>>>>>>>>>>>>> 18214998&sdata=VYtgB8rsurZAHpO%2FVs% >>> 2FqOkmxROz58p7VvQ%2B0EK8VPPc >>>>>>>>>>>>>> % >>>>>>>>>>>>> 3D&reserv >>>>>>>>>>>>>> ed=0 >>>>>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>>>> https%3A%2F%2Fwww.patr >>>>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>>>> 7Cee5c84b4e3ff4d >>>>>>>>>>>>>> db578008d57e87046f%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>>>> cee1%7C0%7C0%7C6365540407 >>>>>>>>>>>>>> >>>>>>>>>>>>>> 18214998&sdata=VYtgB8rsurZAHpO%2FVs% >>> 2FqOkmxROz58p7VvQ%2B0EK8VPPc >>>>>>>>>>>>>> % >>>>>>>>>>>>> 3D&reserv >>>>>>>>>>>>>> ed=0>* >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> >>>>>>>>>>>> Piotr Zarzycki >>>>>>>>>>>> >>>>>>>>>>>> Patreon: >>>>>>>>>>>> *https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>> https%3A%2F%2Fwww.patr >>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>> 7Cda0fd75922c94d >>>>>>>>>>>> cb789208d57ed16c9f%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>> cee1%7C0%7C0%7C6365543602 >>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> 95549968&sdata=rypScmQqTsmVcrUIZRNnaoZP5VMbI0 >>> oJqA6J42ZuhcA%3D&rese >>>>>>>>>>>> rv >>>>>>>>>>>> ed >>>>>>>>>>>> =0 >>>>>>>>>>>> <https://na01.safelinks.protection.outlook.com/?url= >>>>>>>>>>> https%3A%2F%2Fwww.patr >>>>>>>>>>>> eon.com%2Fpiotrzarzycki&data=02%7C01%7Caharui%40adobe.com% >>>>>>>>>>> 7Cda0fd75922c94d >>>>>>>>>>>> cb789208d57ed16c9f%7Cfa7b1b5a7b34438794aed2c178de >>>>>>>>>>> cee1%7C0%7C0%7C6365543602 >>>>>>>>>>>> 95549968&sdata=rypScmQqTsmVcrUIZRNnaoZP5VMbI0 >>>>>>>>>>> oJqA6J42ZuhcA%3D&reserved=0>* >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> >>>>>>>>>> Piotr Zarzycki >>>>>>>>>> >>>>>>>>>> Patreon: >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> *https://na01.safelinks.protection.outlook. >>> com/?url=https%3A%2F%2Fww >>>>>>>>>> w. >>>>>>>>>> pa >>>>>>>>>> tr >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> <https://na01.safelinks.protection.outlook. >>> com/?url=https%3A%2F%2Fww >>>>>>>>>> w. >>>>>>>>>> pa >>>>>>>>>> tr> >>>>>>>>>> eon.com >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> <https://na01.safelinks.protection.outlook. >>> com/?url=http%3A%2F%2Feon >>>>>>>>>> .c >>>>>>>>>> om >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> %2F&data=02%7C01%7Caharui%40adobe.com% >>> 7C75519f53f52b4fde36b108d57edb >>>>>>>>>> 59 >>>>>>>>>> 03 >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> %7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>> 7C636554402926763835&sda >>>>>>>>>> ta >>>>>>>>>> =G >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> P3kiCe4imGL1d5mLcQcEGLxLCNgLGK2RheJkPCJgQY%3D&reserved=0>% >>> 2Fpiotrzar >>>>>>>>>> zy >>>>>>>>>> ck >>>>>>>>>> i&data=02%7C01%7Caharui%40adobe.com >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> <https://na01.safelinks.protection.outlook. >>> com/?url=http%3A%2F%2F40a >>>>>>>>>> do >>>>>>>>>> be >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> .com%2F&data=02%7C01%7Caharui%40adobe.com% >>> 7C75519f53f52b4fde36b108d5 >>>>>>>>>> 7e >>>>>>>>>> db >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> 5903%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>> 7C636554402926763835 >>>>>>>>>> &s >>>>>>>>>> da >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> ta=r5UrAyOXUfffdyTWxankNj%2F5knjssVb9oxg4tY5sThY%3D& >>> reserved=0>%7Cf2 >>>>>>>>>> 5d >>>>>>>>>> bf >>>>>>>>>> 20138f47 >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> 186d4808d57ed4a8fb%7Cfa7b1b5a7b34438794aed2c178de >>> cee1%7C0%7C0%7C6365 >>>>>>>>>> 54 >>>>>>>>>> 37 >>>>>>>>>> 41 >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> 87322476&sdata=bVfz%2BNfVCmLjO4LzijRozHXQoN1VfVRQS >>> etW7oghI4s%3D&rese >>>>>>>>>> rv >>>>>>>>>> ed >>>>>>>>>> =0 >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> <https://na01.safelinks.protection.outlook. >>> com/?url=https%3A%2F%2Fww >>>>>>>>>> w. >>>>>>>>>> pa >>>>>>>>>> tr >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> <https://na01.safelinks.protection.outlook. >>> com/?url=https%3A%2F%2Fww >>>>>>>>>> w. >>>>>>>>>> pa >>>>>>>>>> tr> >>>>>>>>>> eon.com >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> <https://na01.safelinks.protection.outlook. >>> com/?url=http%3A%2F%2Feon >>>>>>>>>> .c >>>>>>>>>> om >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> %2F&data=02%7C01%7Caharui%40adobe.com% >>> 7C75519f53f52b4fde36b108d57edb >>>>>>>>>> 59 >>>>>>>>>> 03 >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> %7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>> 7C636554402926763835&sda >>>>>>>>>> ta >>>>>>>>>> =G >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> P3kiCe4imGL1d5mLcQcEGLxLCNgLGK2RheJkPCJgQY%3D&reserved=0>% >>> 2Fpiotrzar >>>>>>>>>> zy >>>>>>>>>> ck >>>>>>>>>> i&data=02%7C01%7Caharui%40adobe.com >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> <https://na01.safelinks.protection.outlook. >>> com/?url=http%3A%2F%2F40a >>>>>>>>>> do >>>>>>>>>> be >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> .com%2F&data=02%7C01%7Caharui%40adobe.com% >>> 7C75519f53f52b4fde36b108d5 >>>>>>>>>> 7e >>>>>>>>>> db >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> 5903%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0% >>> 7C636554402926763835 >>>>>>>>>> &s >>>>>>>>>> da >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> ta=r5UrAyOXUfffdyTWxankNj%2F5knjssVb9oxg4tY5sThY%3D& >>> reserved=0>%7Cf2 >>>>>>>>>> 5d >>>>>>>>>> bf >>>>>>>>>> 20138f47 >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> 186d4808d57ed4a8fb%7Cfa7b1b5a7b34438794aed2c178de >>> cee1%7C0%7C0%7C6365 >>>>>>>>>> 54 >>>>>>>>>> 37 >>>>>>>>>> 41 >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> 87322476&sdata=bVfz%2BNfVCmLjO4LzijRozHXQoN1VfVRQS >>> etW7oghI4s%3D&rese >>>>>>>>>> rv >>>>>>>>>> ed >>>>>>>>>> =0 >>>>>>>>>>> * >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >>> > > > -- > > Piotr Zarzycki > > Patreon: *https://www.patreon.com/piotrzarzycki > <https://www.patreon.com/piotrzarzycki>*
