{"id":105240,"date":"2021-05-24T07:00:00","date_gmt":"2021-05-24T14:00:00","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/oldnewthing\/?p=105240"},"modified":"2021-05-24T06:30:05","modified_gmt":"2021-05-24T13:30:05","slug":"20210524-00","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210524-00\/?p=105240","title":{"rendered":"On static methods in the Windows Runtime and C++\/WinRT"},"content":{"rendered":"<p>The Windows Runtime supports static members, which are members that apply to a class as a whole, rather than to particular instances of a class. The expectation is that these members are exposed via the language projection as static members of some language-specific representation of the class.<\/p>\n<p>Under the covers, though, there are no static members. That&#8217;s because static members have to belong to a class, but the Windows Runtime uses COM as its low-level interface, and all COM members belong to COM interfaces, and COM interfaces are implemented by <i>objects<\/i>.<\/p>\n<p>For illustration purposes, say we have this Windows Runtime class:<\/p>\n<pre>runtimeclass Widget\r\n{\r\n    Widget(); \/\/ default constructor\r\n    Widget(String name); \/\/ nondefault constructor\r\n\r\n    void InstanceMethod();\r\n\r\n    static void StaticMethod();\r\n}\r\n<\/pre>\n<p>Accessing the <code>Instance\u00adMethod()<\/code> from a <code>Widget<\/code> object is easy: The object implements <code>IWidget<\/code>, and you call the <code>IWidget::<wbr \/>Instance\u00adMethod()<\/code> method on it.<\/p>\n<p>But it&#8217;s less obvious how you get to the constructors and static methods. Because those start from nothing; there is no object in your hand from which to call the methods.<\/p>\n<p>The solution is to fabricate another object, known as the <i>activation factory<\/i>. This object contains all the operations that are not dependent upon an existing instance. You can think of this object as representing <i>the class itself<\/i>.<\/p>\n<table class=\"cp3\" style=\"border-collapse: collapse; text-align: left;\" border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n<tbody>\n<tr>\n<td style=\"text-align: center; border: solid 1px transparent;\">from nothing<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center;\">\u2193<span style=\"position: relative;\"><span style=\"position: absolute;\">RoGetActivationFactory(&#8220;Widget&#8221;)<\/span><\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px black; text-align: center;\">Widget factory<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px black; border-bottom: none;\"><code>IActivationFactory<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px black; border-style: none solid; padding-left: 1em;\"><code>ActivateInstance()<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px black; border-bottom: none;\"><code>IWidgetFactory<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px black; border-style: none solid; padding-left: 1em;\"><code>CreateInstance(name)<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px black; border-bottom: none;\"><code>IWidgetStatics<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px black; border-top: none; padding-left: 1em;\"><code>StaticMethod()<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Every activation factory implements <code>IActivation\u00adFactory<\/code> at a minimum. This interface provides the default constructor, known as <code>IActivation\u00adFactory::<wbr \/>Activate\u00adInstance()<\/code>. Even if an object doesn&#8217;t have a default constructor, the <code>IActivation\u00adFactory<\/code> interface will still be there; its <code>Activate\u00adInstance<\/code> method will just return <code>E_<wbr \/>NOTIMPL<\/code>.<\/p>\n<p>If a class has nondefault constructors, they exist on a separate <code>IWidgetFactory<\/code> method. By convention, these nondefault constructor methods are named <code>Create\u00adInstance<\/code> or some variation thereof.<\/p>\n<p>And if a class has static members, then they exist on an <code>IWidgetStatics<\/code> method.<\/p>\n<p>For example, under the covers, calling a static method works like this:<\/p>\n<pre>IWidgetStatics* statics;\r\nRoGetActivationFactory(L\"Widget\", IID_PPV_ARGS(&amp;statics));\r\nstatics-&gt;StaticMethod();\r\n<\/pre>\n<p>Okay, so how does C++\/WinRT represent static members?<\/p>\n<p>At the projection level, they look like static class members.<\/p>\n<pre>winrt::Widget::StaticMethod();\r\n<\/pre>\n<p>C++\/WinRT does the under-the-covers thing we described above, though with the bonus feature of caching the activation factory object for better performance.<\/p>\n<p>At the implementation level, what happens depends on what version of C++\/WinRT you&#8217;re using.<\/p>\n<p>In C++\/WinRT version 1 (or C++\/WinRT without the <code>\/optimize<\/code> option), the implementation mirrors the under-the-covers behavior:<\/p>\n<pre>namespace winrt::factory_implementation::Widget\r\n{\r\n    struct Widget : WidgetT&lt;Widget&gt;\r\n    {\r\n        \/\/ instance method on factory object\r\n        void SomeMethod() { ... }\r\n    }\r\n}\r\n<\/pre>\n<p>C++\/WinRT autogenerates the <code>IActivation\u00adFactory<\/code> and <code>IWidget\u00adFactory<\/code> by having the corresponding methods construct an instance via a corresponding public constructor of the <code>implementation::<wbr \/>Widget<\/code> type. But the static members are up to you to implement, and they are members of the factory object.<\/p>\n<p>When the Widget object is consumed by the projection, it goes through the factory:<\/p>\n<table class=\"cp3\" style=\"border-collapse: collapse;\" title=\"Projected Widget static method call uses RoGetActivationFactory to get Widget factory object, then calls StaticMethod from factory object\" border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n<tbody>\n<tr>\n<td style=\"border: dotted 1px black;\"><code>winrt::Widget::StaticMethod<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center;\">\u2193<span style=\"position: relative;\"><span style=\"position: absolute;\">RoGetActivationFactory(&#8220;Widget&#8221;)<\/span><\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px black; text-align: center;\">Widget factory<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px black; border-bottom: none;\"><code>IActivationFactory<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px black; border-style: none solid; padding-left: 1em;\"><code>ActivateInstance()<\/code><br \/>\n<span style=\"font-size: 80%;\">(autogenerated)<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px black; border-bottom: none;\"><code>IWidgetFactory<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px black; border-style: none solid; padding-left: 1em;\"><code>CreateInstance(name)<\/code><br \/>\n<span style=\"font-size: 80%;\">(autogenerated)<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px black; border-bottom: none;\"><code>IWidgetStatics<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px black; border-top: none; background: #e0e0ff; padding-left: 1em;\"><code>StaticMethod()<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>(I put the static method call in a dotted box to emphasize that there is no object involved here. It&#8217;s a free function.)<\/p>\n<p>In the case where your static methods are stateless, this creates an inefficiency in the projection when used from within the same module: They still go through the formality of obtaining a factory and calling the nominally static method as a member method of the <code>IWidget\u00adStatics<\/code> interface. But if the static method is stateless, then it has no use for the factory object. We went through the effort of locating it, and then making a virtual method call on it, when we could have just gone straight to the implementation.<\/p>\n<p>C++\/WinRT version 2 with the <code>\/optimize<\/code> option fixes this. Calls to static methods are forwarded to the corresponding static method on the <i>implementation<\/i> class, rather than to the instance method on the factory implementation class.<\/p>\n<pre>namespace winrt::implementation::Widget\r\n{\r\n    struct Widget : WidgetT&lt;Widget&gt;\r\n    {\r\n        \/\/ static method on instance object\r\n        static void SomeMethod() { ... }\r\n    }\r\n}\r\n<\/pre>\n<p>Furthermore, the factory implementation also forwards its instance members (corresponding to Windows Runtime static members) to the static members of the implementation type.<\/p>\n<table class=\"cp3\" style=\"border-collapse: collapse;\" title=\"Projected Widget static method call goes directly to static method on instance implementation. External consumer goes through Widget factory.\" border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n<tbody>\n<tr>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px black;\"><code>winrt::Widget::StaticMethod<\/code><\/td>\n<\/tr>\n<tr>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td style=\"font-size: 200%;\">\u21d8<\/td>\n<\/tr>\n<tr>\n<td style=\"border: dotted 1px black; text-align: center;\">External consumer<\/td>\n<td>\u2192<\/td>\n<td style=\"border: solid 1px black; text-align: center;\">Widget factory<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: dotted 1px black; text-align: center;\">Widget instance static members<\/td>\n<\/tr>\n<tr>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px black; border-bottom: none;\"><code>IActivationFactory<\/code><\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: dotted 1px black; border-bottom: none;\" rowspan=\"5\">\u00a0<\/td>\n<\/tr>\n<tr>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: 1px black; border-style: none solid; padding-left: 1em;\"><code>ActivateInstance()<\/code><br \/>\n<span style=\"font-size: 80%;\">(autogenerated)<\/span><\/td>\n<\/tr>\n<tr>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px black; border-bottom: none;\"><code>IWidgetFactory<\/code><\/td>\n<\/tr>\n<tr>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: 1px black; border-style: none solid; padding-left: 1em;\"><code>CreateInstance(name)<\/code><br \/>\n<span style=\"font-size: 80%;\">(autogenerated)<\/span><\/td>\n<\/tr>\n<tr>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px black; border-bottom: none;\"><code>IWidgetStatics<\/code><\/td>\n<td style=\"font-size: 200%;\" rowspan=\"2\" valign=\"bottom\">\u21d2<\/td>\n<\/tr>\n<tr>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px black; border-top: none; padding-left: 1em;\"><code>StaticMethod()<\/code><\/td>\n<td style=\"border: dotted 1px black; border-top: none; padding-left: 1em;\"><code>StaticMethod()<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Sending the projection&#8217;s static method straight to the instance static method avoids the hassle of obtaining the widget factory object, which we never use anyway. It avoids the virtual call through the factory&#8217;s COM interfaces, and thereby opens inlining opportunities for very simple static methods.<\/p>\n<p>But what if your static methods are stateful? Well, you could just keep that state in global variables, but that&#8217;s a problem if some of the state involves COM objects, because you now have a COM object in a global variable: The global variable will destruct when the DLL unloads, which is likely to be <i>after<\/i> COM has shut down.<\/p>\n<p>This is where the <a title=\"The COM static store, part 1: Introduction\" href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210208-00\/?p=104812\"> COM static store<\/a> comes to the rescue. You can ask C++\/WinRT to put the class factory in the COM static store by adding <code>static_lifetime<\/code> to the template parameter list:<\/p>\n<pre>namespace winrt::factory_implementation::Widget\r\n{\r\n    struct Widget : WidgetT&lt;Widget, <span style=\"color: blue;\">static_lifetime<\/span>&gt;\r\n    {\r\n        ...\r\n    }\r\n}\r\n<\/pre>\n<p>Now you can put your state in the factory object, and it will be destructed when COM tears down.<\/p>\n<p>But how do you access the factory object from the static method in the instance object? You&#8217;ll just have to get it manually.<\/p>\n<pre>namespace winrt::implementation::Widget\r\n{\r\n    struct Widget : WidgetT&lt;Widget&gt;\r\n    {\r\n        \/\/ static method on instance object\r\n        \/\/ forward to factory object\r\n        static void SomeMethod() {\r\n            get_activation_factory&lt;winrt::Widget, IWidgetStatics&gt;()\r\n                -&gt;StaticMethod();\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>At this point, you start to get a little dizzy because there&#8217;s this game of &#8220;Where&#8217;s the static method?&#8221; being played. The instance implementation is forwarding to the factory implementation, but the factory implementation is forwarding to the instance implementation:<\/p>\n<p><a href=\"https:\/\/knowyourmeme.com\/memes\/spider-man-pointing-at-spider-man\"> <img decoding=\"async\" title=\"Meme image of Spider-Man pointing at Spider-Man, one labeled 'Instance implementation' the other labeled 'Factory implementation'\" src=\"data:image\/jpg;base64,\n\/9j\/4AAQSkZJRgABAQAAAQABAAD\/2wCEAAQEBAQEBAQEBAQGBgUGBggHBwcHCAwJCQkJCQwTDA4M\nDA4MExEUEA8QFBEeFxUVFx4iHRsdIiolJSo0MjRERFwBBAQEBAQEBAQEBAYGBQYGCAcHBwcIDAkJ\nCQkJDBMMDgwMDgwTERQQDxAUER4XFRUXHiIdGx0iKiUlKjQyNEREXP\/CABEIANUBVAMBIgACEQED\nEQH\/xAAdAAAABwEBAQAAAAAAAAAAAAAAAQIDBQYHBAgJ\/9oACAEBAAAAAMSIKBgzMGowkgais9sY\n4O4GRJBKNQUswvU\/DhGpYBgzUYPp1riycHbbg1GyIUGyAWpSVOLB6\/43I1ABQUoO6Vtd5zPq8nkd\nutpRncFhASanjI3FqTrlzW4b6DV0dSqXjmv+Scr6fdPjkKt9tKJkAYQAa1rBrM07DbpgLeWsGG8X\ng5XxQl73v41At9vKJkSASzEzLq1qNUrN0vWtRm0Z7nnpHwptuq2Hu+fRekPBxu+7vIjZ264CKkEg\n0UVc3OLUuYsEbN0K+bRS8M9U+f8A1P5Y9M+Z3\/UfgaG9efPJy9+1\/E\/IdvtyY3vAJGcd81PmHrMx\ncebPb5sjXhj1Lr8s2flXvoFPf9D9WscMl4JrxXK2JjJEANVyAlLY+H7GLhHUDQ9Vm63ZVJcHP4tC\nEcnpzQZvu8IZyLjbGuDvBiNrpvJl5x+ectXPneh98ZzIQw2prJljmRIQWt+jfNOLi5Wtjm6VGzUZ\nXn5zOzSk4LryZzpeO5SYNQI7RK9PBBXD0TiW+ZR54K6Wqr0mYsvPz9rXB0uRtmnpty7Rufafl2Jg\nKMEJC19kNYJeEj\/VNF8uFdLVz50tuRmX+FLSuXrus87Ndmdavk2JgcrLnQ\/L2VVfvHu00MYR5Cbu\nlq51LY5upcZFLEf16ncLDyxOc65j2Jpgm3wJa4Ti+Ps9+AkZf4YZvNl51KBg0VVCeO13yS66Zwcu\ny5XiUVzPWOE1N3R6rdeLhseoxNMgPPyLxZuV0y49MnqRyWPjmIS2VhzPIGd2zKsTrz8l7s89Wq68\nETG33q4GIvzQSRdrJzdoRG7rsODZXqkzqOJ2GJgM9bmNkxjIqqu\/+y8Qw2Xslhje2La0CNMyRAdX\nM+RcwXzjgk2rTZZ6v5uJjXfLc3mNoum2ZlAxVlvHAKnN9zcvFMy1Od6bI7DSULEzcEzPdU11uN1+\nGGuYBNZrrtkvWb3+isW+WgbrmHDcu9\/LPXfjBdxt9\/yXsh4PWIOhetMGqPdM6XTbjg1zyAIeqFmg\n+qxORdpXDQNgklIjLZRujuTKwjHRxdPdDWnl41dUsuHhdVyMlhShnttmlKCstvsmaCSEKJJDOpG6\nlVoS8yK3gTiNYxVCgpUbV7+FmQoEZcLG2CSgwlDlKYub8RX5qxqdecCNWxhINbNFlraZgzVG8syh\nKCaAIl1yHtMkzT5C1LcdcWNWxYJU4XL2KBqMwkiQhJNgES4as3R7irffZXHVLW5reLpQ6szUAYUZ\nJSENoCDIkqr1evwr1dsFkcWtYe1\/HwDWozQkgZkEEltJIIFEVB7qt7hsI61KcWbmvZIASwa0hKgR\nAkBCGkGaUqWTZKM0mpxa3Nd\/\/8QAGwEAAQUBAQAAAAAAAAAAAAAAAQACBAUGAwf\/2gAIAQIQAAAA\n0IQBTeXWJUJocg0Nfo2tDSkydDpUwOaxJj7gBc4j7+PLiUYAr5j+FLX2+w6cG9q2Dp+VhEpAFSTp\nlbmFfbFJnbTedmVoI9GA3b1meq8urb0V4Fth+3aDpOdHCsfQtV55285y7bX0noG306qyQsVRpO22\nm8886hOm+kd5EJnQ1He0h0aUqZIps5U9ZfpZ6x76jl8+PeLADp2s5YPFgO9fg03Hu5kSz5yZtJ3l\nwJkGDzgVnrbllNFIGQ1T2hLN6LK3sxjeVmhSXRLWloQwe4z0+1SjWKBSRXIBVmY21VMloxbBItSc\nuQSQRADov\/\/EABwBAAEFAQEBAAAAAAAAAAAAAAIAAQQFBgMHCP\/aAAgBAxAAAAAHdOkwna7gOyFj\nJKs84ckkgUi43rdHF+7uNR5SSMdL2zod7jfD0VtXA9bFrcKQvI9CmeW8ptzvg7Dp62rCkeHhWMtE\n3rOKxcO73rdOuCvdFGoig5E+ir\/oHMUQ4u83k6D5fivYqvbU6hY8gKvua+Mpd\/u0L+f5j0CfF7w8\niNdJBhlor7dny835QZ1xcqDj3p51fbRi7DaaCKFLlT1Wg69OeI6drHhD63+acA7jGlxZcpT7PEJ\/\nRMNDL1DzjgCd\/TvM\/UsFUu5R0WxxrLoQg6P2rxzd0OaBdORJnZknZHoPRvHdLV1YCYumJxTJ0aSZ\nOIr\/xABNEAAABQICBAgJCAgFBAMAAAABAgMEBQARBhIQExQhFSIxMjNBUVUHFiAjNFJxcnMkMDVC\nU1RhgRclNkBDYmN0JzdEZIJFZXWRg6HB\/9oACAEBAAESAfGPEPf0jXjHiLv6RrxkxF39I14x4h7+\nka8Y8Q9\/SNeMeIe\/ZGvGPEPf0jXjHiHv6RrxjxD39I14x4h7+ka8Y8Q9\/SNeMeIe\/pGvGLEHfshX\njFiDv2QrxixD37IV4xYh79kK8YsQ9+yNeMeIe\/ZGvGPEPfsjXjHiDv2QrxixB37IVFzs4rtOsmXx\nrCW1DMy\/eryuGpjvZ5TebmjFOIy70fOGrhqY72eVw1Md7PK4amO9nlcMzPezyuGpjvZ5XDUz3s8r\nhqZ72eVw1M97PK4ame9nlcNTHezyuGpjvZ5XDMx3s8rhmY71eVwzMd6vK4Zl+9XlcMy\/eryuGJfv\nV5UHIP1WqhlXzg460Qv5NvmkUFnBsiCR1DdkfgmUd2O6s2TrE+H0IQGQoHOfWZgMOmI5Hfvlq+hr\n0Z\/iH+btVvItogPQ1fjD83bQUhjCBSlERHqYYSmXtjbPqSetHYCYoWO\/VMub1Vn+H8Pp5TKoIW+o\nXwhM3L9qzatTCmoqBBUx8lePaKeovQ6YnmOvfLVqtTXoh983z9qtVqgPQ1fjDXAcP3cjXAkR3cjX\nAsT3ehQQ0N9wb1wTE\/cG9cDww\/6FtXA0L9xbVwPC\/cm1FjokvNaNqBlHhyNm9CyYH5WyA1JYRiH5\nDatEG63UeGjF4TE7dq7KAgcpwTPibEfi8gioDbWnVEQLUljSdkLl2nUp+oY5jiJjGETDy01Pq3CC\nwfUOU1YuLtOHdeHUKSlDQaIjmuffLpa9D\/yN+45iesFQAl2NTeHTDTdkmvrjrCcTa0wVwe37DVwc\n0+zrg5nfoArg9n9gFbAz+7lrYGX3clcHsvuxK4PZfdiUMex+7FoY9j93AKlMShDvFGsennAu44I4\noK\/dMyyTcpF01yikp4R080YzU9VejDegEOSuTcH5UsbbcGCp6zEB8iI5rr3y6WnQF9pvKUUIkFzm\ntQP0770zhRTlOUDkNcB8oApJospyJ7u0saTlVOI\/gkVPVhxA66w+ZHY1bCTpzUyERBwI\/ajozkAw\nFE4Zh5Anpt3C6hYscZdpfzyiE7wvi2OLHPTmZ7MJzkCp8518UyySkwdmmkUTEHwfyr+SjXAPTmU1\nKmUiktNx8GkirIKZSqHyhTV02fIEctFiqpG5DDyDTvML0wmUKQ5nB7jlIm4BE6hCmIN82N0tfhfW\n+oKR6Gubbt6h5eUagR2nBhCf7ZQlW3BpiOa6+IXS19HT\/PylNcZwOdLeYmYtXT5CBcR30zG4nC1g\nGxreQzQBwZXMIgBRCjHYsQuocha4SdOAuxaDk5Na02kNeV0oBzBYQoheKH51h4hQZKcUN65qY\/6k\nP5wGsTYjPh1JutsRliHNYTTGJGEiLGei3IpPWY+cbxr1vLx6DtKxklibwfMW+FsVsJRBICMnd0j0\nFuUOSmMOwmcY4i29sCyaVsoNmjVkiCDRAiSReQrtJLF2LRbKcaNjiDrK8Hx9XIT7FscTMklPNUY5\nEy5lDAUocoy5klpN+dv0ZlTaoSoGXUBBIDZjHAhQlUjL4RdJm55Wthrrv\/8AYFMc3FDePUwwtOSV\ntmYnAnrYfhV4mF4NcHKY\/HGlC5FFCeqcwaYjmOPfDQPXTb0dH2eUJTnUE2bzogNhKYBy6sOsBple\nxs1r2DyAqL5zr\/jUa2QEhnB0wMfWHARPYggP1DbhAoZTuQvyZaS5haw7m2E+7+MamXSL+6kNTEWj\nLx7hisG5Qu4YfDzR69eQL84t35DDqVMGQErAEdt3q5DoCbzZXcezkEypvUCqkKYDAAFAoAABYACw\nURBEhjqESKU5+cZQgKJnTG9jAIUfAM01XdFiZvVNXI+cpJy2we14KiwKu6E3nlnslKO7neLiqXsO\nlmMTlMPOztzqt3ILpGVzoqAYtRWIkXbdxFyZQTMrmKCjPwcwiNjOTquBppCRTD0WPRJ+K8yRJxsi\nbVQyt7WbqSCiwa9ummjbfUknq5F+n6rg9DoiOY5+IGgeQfZTX0dH2eUs2OUxlUwDlzUnchTAI2tY\naTPqlOIUwjy0Q5VAzF0BojOe6D3KixEEDEHrVUtW4fNjRCiB3QD1ZbUl0ZKw8PyAfimpqoRNQ+Y4\nBdJIa2tsH8YtA3hAfmk8ie1mAAzg+ah\/FrhBr641wg37TVwgh2KVwgl9mrSr8gJnEqS18o2pQwrc\ncecJhNWsKPEPuHs1GQPMnsHZmOQfOJ3EevOcT6wETZbWGofFseDJsi\/OomsUuUaLiCFU5sijSbhm\nvx0Fkjj21ipHUT0iUOQxwPQ6IfmOfiBoPzTewabdAj7PJXVBEA6zDyAoJlAHXqDbsIfi5SEHdWZS\n\/MChFUBzkNb8EnAjbP19YBojemdewlRpczU9uUFj2oLqFAxecFAOYzs34BSXRErDxR4PDf8AxDV4\n4wiZClEihzlCw0bHMYHMYHGhx+2DmRg1+kFLuuh8IY\/UjAr9Ia\/dpK\/SI86o9Kv0iO+70qHwhvvu\nCNAdZ2dZdM2q1ipjCU4KiJC5ynvegExPqGJRl0zj0xT2AaMVqAJ3NuNvMLZmu+MvsaKhxLbcsVVN\nRRNRMxDE3CXDECWYTXVF0qiKZigUYmHPFAoBn6zjPWOksk7n6jtyDpiOY5+IGg\/Rn9g0h0KXu+Qc\n5Uyic42AKMcVFDLGDl3EBNEA4x95qV5TWGiBmAb9VHLYAEu6k9+cn502PnSC\/KG4aCo30hz7pKih\nEpT35pljhQBqz36jVlsZ8IUn0JfdrD5f1cXd9Yaxg3I3mVdWXKChCnt5YVHm55Pzo5Q15PYNBRWz\ncgH80FjDmNSLghFTAJQAhx4tR8ivGyKbpAgGAo2EG+KYBwChnjciC1uPXjjJNVVBa6siGYTESw1i\nBadTcCsiVMyYhXhAJ8sjle1ExaHREdG4+JoctnBjKKEccWwjlBVY4AGuOAW5GTkUDGBTNkGhfEvY\niJxHloJAxuRsNGFRwcBMW3YUiIFsJt5qVdJp7r3N2Dc4XpPrJ18tHDiDRDCRUOvi0zOGZQn\/ACDR\nFj8qX9wtRQZ03CQ\/bqCUUx1hBIfnBuNQZsr3NygAhRPRw9ysPZ+DwvbnjasdD+tyfAL8ygrqlSD2\n7qKOdQx+oC2Cgp6cQIBA+vWGGiL6SFisHEWQULTzC001VH5KqoUDblOBZoyShQYuTBe9DBywm3R7\njf1YWhlohortHSLiU4l8ISfmoxX+c5aHREdEv8XQpzFPdGjs1iqcREwkMUBChRcXuKKoF4t6Awjr\nbL8am4JgAifebqoDl3ETKIm7NQofpT2DsVTKkrxQsAl0AA76Et+Wi71jD2FtRT6pQh+wd+iMD5Sr\n7gU2zNSKAokoBtcc5R21uChVdYAX4pwzFMk9MUQEBz7+Rv8A\/HWHbcHBvDnVjr6XT+AHkCsQK1\/V\nmLQK\/iUaA4Du5NDVPOfP6vNoDCHOJWuJ6h6eCYxyGELFtYKwea0+y\/HMGkaEKx6lmikFPs3BaHRE\ndCv8XQr0SnujSfMJ7oVejEIfnEKNbK2+wLRSETCxCgXQ4JcubrLQDoEd1FE1txQC\/Gvzht+FMGAK\nt0THdAS5abQ4EOKiUimJhC1uDX31ATUo7NcoeeZmo+pTQXKXKTiG3EEurT3hzQqCBPYz2y9KNY6+\nl0\/gFoavSimt6+JQE+sbk7N\/VYoVvH64DQHMQcpwohuTs6hZB5rN2iI6N1LpAqQQ\/wDVYZNkno2\/\n21h8gaxejrcPvh9TKejaIgPk6vxR0K9Ep7o0Xml9geWoXIqYhQv11ZTrylrf9oSrGEpRzGEQHLlT\njnaK6SaqJT5iifIEooiFlo1YhQ3USXjVOcplGnxsjIyzdQxebYxllRvmcKWowoH6RUDV8hJ9ZKsP\nqNNiUyGJbXDWOPpYnwQoacmHciXlNy0BAuAdQVy7\/wD0DaJfPCGVQaHVKXlMdLKIlMWxgGsNYdZT\nsdixy9VXKeNZEWQBbDCZfB21xU3WWF1rFNoIrhhqhjJthdB24K0VIU4nmCYeSjZlWOduG0kxfGZg\n0aRmEXGGnWJNbPahssRBRPDcHEv44H0u8kUtpmBYNC4aw+k\/xU6jV3blLYyPMqhZGXaQ0pNu5Fyd\n3Gy4MToHQVSnWEC5lZDb3LUVzOmDpWSVn1JCTdJFiGhdcSPxxHobeKh36yIrALYJfHO3tHDJCPyE\nVJkEwjQVE+jq\/FNoV6M\/soOaX2BpcGEiCxi8oEMIViKGg4OIaH18qpIPmKqjao\/Cca8hWCikg9CW\nfRaj5EmH49tKR8xMySi+wxrXXCniCFj2LfDM40Ue8FyeqOujMYewhH4fazaZ5Y+3E+SFjcNwycNh\n6Sm9qVWmXqTNIkVgpqbE83BO3jkWzVFFZE0q0bjBReKIJ8\/Mm8Ms2KmSJanm2xCyr0IdWB4WE7BP\nMwQM7IBxVJnpyABDlAP5akvQnPu0zjGizRBUydziW40SNYcoNwrD7RsRkoBUSgGuGscj+tiB\/RDQ\nI5jHP20HM9tNEDOnqLYv1hAtNEE2jdJukFikLasZMU0XSDtMLa64GrAX0L4Rf\/Fp1hp6iTCWDId8\nimpHS7l+zchilOSV8IKSUMYCSOqRMgeaK2xNhyXnnEem0nIl0CDs7Af8LcSW5eFkrVGRrpbC+BTA\ns2SEs6V8pTEDx\/hDxYKIBmJFunBKxQ5bvfBxw03IQisku3dO6xwwkJXH0Qyi3gtnKkYAkWwJrY1P\nwkbUUjpVul5yjuSyDhy8Rat0CKGKOpyKeoash\/VGgKb1RqLAQRVuFvOm0K8w1cgBW7Q69FcfDNXh\nBepoQEI0GMaODrxqxiroxirScw1kcNiotIhRoKMAiDbCnhLYh\/pQfIU9h5NjC4Zfu5Y67V2kQzdr\niD9g8De8jSvGwv4LRLv\/AF5GhUcID4QsSW6o5pSqppXDOEJ2xGyZnaiAx4GtgNYmrLrSuDRILWDV\nmSHktupzuiSh7tSnoLn3ajB+SNwHlyUfiDnD86gRuzOP9Uax19LkD+gWkEdepktu66MFjGDsvQc0\nntrDeUJtrm7d1BWNjF1DIv1s5hplLykYnIto90CSUgiCLgGruSVZMY8Xwg3j1jLNQcSEw7k05Q8g\nYZMDE1Sz53iSUanYu3zcrZRTWrESbSycW6hCygFjnCxVlUnCcq4ZxjJWVzJR2UzQBlp48m6k1ZLK\n+VaizVFoo+UYDh870RjSKguCCUriBEqRCSoCKSOoTXjnEpDKLKREiKGuImVWjqPHTpw9kHW0OFcg\nCawdlZS+qFZS+qFI79eP9Y2hXoz1rC8m+s4dhqzfympTziaieU4ZiiF5B1IypGqcjIioDVIySFOp\nycUlWksMtnkG5BIkdlLTUe7ev2sjlXenE7qpCTkpdZJeTda0UiiVEi8lJrMY+OeP9YyZW1CUViSd\njW+yMHhSNgOZRNJpMTrCQcSLSTNtjywOFWyMg1TjYLhAVI5mIuk0hRkDNzNCSQ7CZ0DvUD5xETBu\nEAGnP0WHsLUr6C49lMy3aNrcoEC1AbMH\/wCQBA2NTl6YanJk8y82rVAnxAJljWwoo6xXpDU+T1Tt\nYn8w2rDkA9xM+NGsVUU1CIHXE2FcJzc4grMRq7QmyOTI5I5eZlYBfEbVuzK0STVPlOwe4uaO58r1\niyjma2z3RwNNLT4wOvZAtsG3FVwxESE48PHMzIEV1Ci4i1i3A4hbQ7SRjHjhcvFVNCTZJ8mHB2Pa\nzNtqBQzCVLPFw58l20VsmdVg\/JOR0Ak\/iV3boy5DA4jZFc0+oJW5DQpAB2WCw09kGgTDSah9WRDO\nuWKYSEw5lkWbuMFJgKQHcoMnys09gVXkY3eNzEIAOYaTby7CC2+IUfOTnIKTRnJPZI8KgikZ6RZd\nM4ySLiOihmknDV+wzHTBZzDTTScj4BUGm0vAzpKJJAJT5ygB9acDhqEuwabMFZB+xjWgJAq5OcAN\nFwUzKSMzGoqMiHjVCJqGh8Pzk0aUBE7NLYHqrJSoGPksQg8M3VZoFaJJHVMeElyyENHkVYKBKAqd\nq6RZSK8yECQW4O9qWQE8rBvI6Wj408jHOHb5yDfK\/wAIzTCWhYg6zM6snrtUeVgpOJmGEGso2Ou8\n1GrUxHh9zhkhFnMjHrL5gJqHOFpltPMMPnUaa52kZVNaEwrIzBHBm8lF68iiqRkGjKTfYjVjmbuM\nWMgw1x1lUpJlO8AOnEYgc7XayK4hQk8NNFHLp1FmOIFs2lI6ZaO2eHjptlnbsgC3qew9ItoiUdpu\n2b0jQ2rdkLDy8e3wxmFsckyCINzOW7ho8etnGrFZsrqj1AGAWZ\/ijSMe2QHMBMxu29TzcQEjoofg\navBH+1Lv\/wAUtWDX60Zg507SWMmBcVNwUFNmvBkn8NFeaxs0ww7Wy4WTZL+DTE6Ui5M2bGkeOrhS\naYTGNy8GJrA0Z4b2MhvBffxkPxf+luqwwDAmM4IsQZ2ZhrFBIZyZ6ePdYpLJn25FVaGucR\/SsiP+\n5CmuwB4S43g8zs15CSF3UmmyewGNMTsc5Ak2xEVEcLAIQHhG5PoqkE1RwFildo3Ooss+aJlLiJAE\nvCAyPb0h5FOKEA\/Srf8A39YT\/b\/EIh\/3Ki\/5PyH96FLpsZfFLOwnI9gfPDROc4\/uXGjDH7WYf+I5\npm6XZOfC68aqZF0U9YmeHTPH4iboovBMhLEkZdQng9ImoyxcmqqKSZmKJTKQ0nHOZ3AEVFbQo2jU\nXZNojj\/4n6v\/ALi+EamCRZcfxwxp3RlzTSW2hPncuHGKJPbxTVw7tQtQxXc2NcJibeIljb14UCRP\nC6p26joZWyQLkXSZSOKGA5zkeQyJlrYBKUMUzYgHKi5rCaG0QeNFWjY5luBNnKXFbbIhhddduJVV\nYZEgl8IoJDKOs5QzBCly1K\/5i4W\/s3FJfQfhZ\/u39NEWUnHYCil1DpuUWjOVQPNmDxkxAXr2u9QJ\nCg0V3cqwjpOUqhRIcLlHlDDrnxUmDyjVltRFGiiApEeyDXC0lhzg0wmdPweA4Wxo7XlMRyB4ZT9Z\nx2wkTjpR+hhSWwwEQcwvXRVgcYUmT4Yfg\/2PajGbLNzJw88hC4kPKRWHTJN1WB22zN3xI+ei5iLg\nTIINdYJ2xn8maOcxwMQyrTQylzTbs2KCYo4L5F82zGmU08Qx8+xw0ZFVJw4XclSmJBnAz0OaP1hJ\nBQ6xTxc2tFRuIWRGQuAlmezgoynJZrhkISPQO2WOuZYXsnOvZOVhpc0TkUY6jWF4ad+M\/jRwYHpW\ns2aOmH8dNr4hRaEE6yzoVG0k82jDpsNRMcdoy1h1zCTFb9PE62JCRPFVag1O2SE4lMZQmUx1FFBL\nTJ+rFSsZKotto2Y6gimE09L45\/qkP18kJAqPxNIs5KHfqRGsBjDFjhJAy7yBbTDfg4F+EGpErxr1\naFeREkVrtAs8+dI+KG44mjcSM8OalVIXJ3RX842kpqPlGGG9mdN36bxyaRm5F7445YwCBObJlqUm\n3cnMxcxwWCWwg081iueaYiIsoTDezSNygLomOHQYpHEJYjzarErIzeCm3UFJuZPgzX7SmqUU4Obk\n4OHlo1ux+UvBuR1MTUnNx0I0XYjtTEA1jnEUw7n3Dp1wWCGZgDYpZDE7x\/NMJ9Fkm2WYJ5SIv8Q7\nVHzEfGxAshlVRVerJ4ifJO8JvCRpQ4FZ7KYjl0Ei\/kJJdEETOV84JwAI7Gpa3TDpt5BhsUw9gDQa\ns2S9hyFE1M0NWXWG55\/IvoOQEzrEzjYit6ZnAzZKw9XzV9AhcBDtouZPOOrvvpqYxHAHEmUp9w6X\nqYa0p82UDBvoSpfbDTZXXIlPf8B0hRiEUDKoUBCgboB\/DCtSh9mWsqYfULUFbZFOKHTD5btUqaIg\nI7zbgpqnrViZkw3mz+WumsVdc4JbxNuoiiiJxMiewhzqbPwWECqFyH+ZGr1elkxzuCgcQG4jQJgZ\nMpriJrXpM+dMh+0NDwLpAYQ5pgGlNTb6uYN4UyOGdQoDygBtID5MF6Ip8YatVtFtBzAmUxzcgUqZ\nVdS5gJvDdTAvnlDgSwAGUfmFWqC3SE39pWDYhynAg5g5PmL+Q7KYFgMS3HLSQq5DBYvFEQGmu5ul\nfs0HLnIYnaFq4mTKfLcLlGmOTWcS3R6L6AGr6YL0RT4w+UIX3W3VsyH2JaAoFCxS2D91eh5sh\/VP\nWtyivchgpMLEIH8oaFHCKI8c+\/sUVbHVUsIWMF6YAWxsvYUNN9N6CoL0RT4w+QH7xe3LT1wUUlCJ\ncY2646wTAoYxBsIl36HbVRQc6I7x3GAhDpqjnSsIhbJH7tYW1uTygoKgfQ1PjDWWsoVlDsq34aLa\nLVb9ydguJfM\/mBg7T7w6ipcYDAkocBrKpcxCIKWEKIAgUubltv0qIkVCxw\/NJBNG+S+\/ywqB9DU+\nMNXq41cfnLVb5zl+eCoH0RT4w1\/\/xAA8EAABAwIDBAkBBgUEAwAAAAABAAIRAxITITEQQVGBBBQg\nIjAyYXHRQiNAUmKCoTNyg4SRBVCFwXOxw\/\/aAAgBAQATPwHrVT5XWqnyutVPldaqfK61U+V1qp8r\nrVT5XWqnyutVPldaqfK61U+V1qp8rrVT5XWqnyutVPldaqfK61U+V1qp8rrVT5XWqnyutVPlO6RU\nO73WO\/5WO\/5XWH\/Kx3\/Kx3\/Kx3\/Kx3\/Kx3\/Kx3\/Kx3\/Kx3\/Kx3\/Kx3\/Kx3\/Kx3\/Kx3\/Kx3\/Kx3\/K\nx3\/Kx3\/KdVccoH3BolO83+E7iOxy+68h4oVXJDusTM3fsn5a+i9x2OX3XkFarVarVaFAUBQFaFa1\nWhU\/hbnKYAhUskTK9j2eW3n9xlT6BXFXFXFSVn2c0JTzLQ\/0VP13H3XuOx7djlt59rej4ByQyC5r\nkNs5lNObB7IaT67LjEgeVO3hDNN2O0gmM1dIyzyjs+3Y5befau3LgR2hvlauVTIIaZhc1yC9wpgN\nT8rmei1z3goaMc7YeKaIC3Fy3aoocCg2M16s2BP7o\/dN\/MvY7eW3n2uEblwJQ4dnknZ79nLZ\/he7\nVwduK3OjcU3PmncRsAzPuh6p3m5p2l6GQbyTeHBHch5e\/wAVNrf2VslRCul0rnt5eDoh6ri09rmv\nRekbT7KdkK0q0qwqwqxesoo5hMU8E5uWSlNIJ2fzDby8EZBaKUN\/Z57OW2xQApCuCLleriririhm\nB7JzeCbmEMs\/VTqgc7fQJwTNCqm5e2W3l4HouHgesr1X6do4nxCgNETF07lUYDPNWd2EzTNc9vLb\nK1WiuC3D32Ds++3ns9hs5DxfRcDuKomZCNNWr8OWi5doeoQ4BEbkOC+U357XodnNRIgo5Iey5L9I\n8L1TVCPFcuz\/ADZeARsHa47CwohNKtuUW7lKy4DscdhUL48P2PjHYBkroMDiU3MJ4hMci8pz5Urk\nNvptAy5LeFScAC4tqHvSPyIkYdmK+iC0RrMJ0OqgBjnkNMRnC6RWbUNcNcGGoBAIOf7K6hil7i0Z\nDT6+KY5mhb3L8jnrKolofidHrtpAmQdxXdFF+FSZflE5ulUX020WO7xDG0XNMt7h1zXQrG3VaVWu\nyoYeDrhZBdJFM1bMMTcafd80p7pP7eDyTHsczFaweeY7suTXizIN\/LuvC6O4MfWdhmo4TuAGivD6\n9NrgHwx38qvYXXvpl7bwd2Wa6O8MZRxptd66Zqm8Nc4VPx5ahdLsvYQH5iwfiYi9t+To1jSHBPAJ\nF2cFc9k67OQ7Pvs9Qv0V0+Z71SpZaQRHeRdaGltN5MzO5UT9nXtcGun\/AKnNf1KCrVQy8Yr8mcTa\ndE4ZS\/Af\/wC0yY6xApVNf5IQqPp22uqk5sVQl7K7qTukXTdqHwuiCKVOGBuQ9YlR4PJV2XPoYbKe\ndLgTKdUisfLmxsZjuZr0p0Sz\/pOqVCKIdSkQHEjIZL+2evYP2dHYGdEaZrNxGN1DlHf6tV6QAWTw\ntyjZz7HIdvkixrrmgOG\/TzIMbLKjnXzO\/MpjGsss9AIjPPiqFBtLGqTN1S0ZlCk2S5pafMc\/pWCw\nWvZoTxWDTzpOgxERu1VjNSZ111VTo9N\/SGUz9LahE\/5TmMql2GXEEl8598qxrMmCBk3twoUKOKwW\nttDrZ0GfkWDTAax0g5RGco0mGnVkzm2I37k1gZTpg62gcVhtEWtLBmMzkVVpNqYTnalk6J9Njy\/\/\nACMoWGwG4lx80T9Sw2ecOv8ANE6heq59jkEM9FwC91WmIa5rfpB\/Eqrn3OexofuB\/EqlR97sFsu0\nbHsulPeI7rXSYafxoVHOpPo3hgLSGyqxdbDHNZuB\/Euj1y+jT7tRxa4geb7NXvw8LMfhmZCvdhRg\nGvwncqPSHOwDQZecUWyJRc7v3Pe0WZfkkSndIM0GkXfawO5Hqsdxo1MWYscB6KvXLcZ1TQUspJTO\nkOL6VlI1Ze22QCBkrzhNbQda55MTGfBdGLhbVYNHh246Sg9+Fa1j3OnuzIs\/dNOVzXQY\/wAKVVLr\nRYwv3eycXw4vu8uX5U8vzqUtYgaKu5wHfu0gaC1Uqrn0HMpMvO6US7D+yYXzpO5UahOA4ua37Qag\nd5NL7W4DbnXZJl1jcWph96QqdU43eBN1p3ZIX4cMDiRpM5I1HYjMKoWSQBvhU6rn0outtkDzKrVc\n2mWl1gaJHmJTKrsV1xtuDSNFSe4NyJm+4ZAASujl19B2+Z1hAuim6paQH5fmVObXd0HKfdcgnbf6\n1JDfSJohw5hDJuJXrVXzHENyTGYjm92j9KrCHPw6zM\/3X9ekulsY1+JgV7os+nRfX3v9SDgZ9GZL\n\/j3KuxgYK2C\/+GRmRqntAcyp0J76RJgnVD\/w1VTaXEilhP3e5X68L\/5r\/jF\/dMX62pzRbVp9NovZ\nDc90Zr+odn9u9cHtZVIOaDbRNXADBvmM80BJY0itJVanh4hf0c6Dkv7dyrNbhtqY1OMMgSg3Mdb\/\nANPY1sHdDzK\/ukWt6uKOG7MGJulWi2pT6a11OJme7Yv7pMZLn1XNq5ADXcnth7HUHMMEHQ\/aI8cV\n+i\/S9f0UGgtPVGsaWfqvX6GrkNpWLh23Pa6Zg\/hTauTMmZRH5Vifwu5E6Z5ovtDP4eVsfkQqWZve\nx06H8C645\/fdUDzUufMaaJ3Tn1b3PY9kgvm2LljaCP4WnEarHzjqxoeePVdfe9tZ1amWZA5N825C\nt\/BNTzCIz0WLbhmx7ZiM\/MqdeDBdOkcMljzjYVUP\/DlvWN9PVOr+eOac\/Wl0h98B0eYQNy6RWFSp\nUecw3LINBXWNQM7pjcQpmL3E\/wDey+yQ+m5msHisf+Dk9vDPzLrEXvBBNTy5TGiFazDLbxwM+dX2\nTdSLNYPFdak13VmWA6ZWrrN2NY4GNMtFjzg4AtdOWdyx5xMCriHOMl1q7us+mIAXWPzXh91qxrbL\n6uJrBlMr24U0wzSNWlOr3Y3dgyI+oiVjX94Oc6dBxVWtdi3yHDQRk5Va+Jm4Q4MHrC6wPtw6mKZ+\nnLisS6BaBrlwU+g8D3XAcO1O4+MCp37fVXb169g7YUeg8AcG9uJyTtPF91O8eLyHbJ8oQ0PgBE+I\neIR7B4oeByHgD7r6KOwUPA5D77uCGY28UeHp4PIfexqoKhRv7G9HwOQ\/2vkF\/8QAKBABAAICAQMD\nBQADAQAAAAAAAQARITFBEFFhcYGRIKGx0fDB4fEw\/9oACAEBAAE\/EP8Ay53zfPHzhg0aM6o4fs6+\n7dt+jmTJqye1qfrFvhfWZLlNlBa0HrDFx0XDnpOXPScOJeOh5cdF0o+i0SZMiYgcEyI0svSoECVc\nsSmVXSpVdKldBrRy3KKNy7ToJnl+bB1qYpG2iZnzfzfXUqBA6FQOgRgxFD6O5KJjuTHj5mnZ8z3P\nkhUx3JR3IAy4W4lTA2YG1lLBc2aviclLiVWYwAvisohPRLBhZGKMofa6DfQjCEORPlfn6VKidK6E\nJQdEgQOgx6BDyvERBlea\/TCOPjRq0kjYlEeBnEUL0jmieksf4KatsQ6L8weLIF3GEjLV3rAXmXIn\n3hp2WZX2tk+7cVghjN4mWW72Vm3VToh3Mw92hh1ZnqdDXQxLlszD\/Volh4pwK4BAAYAh3b1\/dCy7\ne\/7YXnbv\/rDd87+0OHP6\/uD7u9X9x5\/vfuHH9z9xW\/l\/aUvug\/DHvGGPzViSNcs4vihQDMgdNOKe\nfMTjdc9yYQHDbtXeXtl9ylhGZztdMv7MulfRhecAWvQItlXnCmu9QNRsJBxCD0qKyisPSoQVMwhG\n05Oyj9UB1ue5Cx9wlxA7beKDsS\/fSQAuF6rxmC48Pe3rwA7yre+6cigS61vWuxCKHbLGEO9TUbAM\nHYbanECI2gHFVVr8SmybKUVK3ruEEFs2wcsVeAcQd9TvW8PgEqowyNRwQ5u7+bokCJGJhkFtKv2n\nJjIHL5DFwWB6sMCVCEPDFDei40cnC2VHYm4P7blG5qGgQ0PKvujmZi4hYe58RlhbzQBQxt5DnsZT\nkhfRYipQPBCuBLVInIzJ12zR0q9GO8HLIl81s2W5GBJVdAECJSk02Zo7Rjo2KVKs\/JKqJpP9GDxX\nUdwsKXJ+\/cPVu5yAOp\/3IUjvoOntPRMA8vy+hjga3mo3eZHJlkBot+MCkYErwwdiH0HXr\/dO9oqo\nGFXANDGLQumOzalPS02\/X8sH93iHZ94wgynxWYUGeQtuFLZt2bG5PaFmtTCvCAcBKu0UZT3G46gW\nqpKViXjkTYR2pGllUYwwfHHsNkUg4OsghohARk8+YqATepxTiazS0j4YPLsrA4PLHRsTgK6rxE21\nKZHCYJqjXqn6WH3yKi8\/y\/S7im4I24dx8MuRsSt5V5ZYJp29RCK2P26gm+7fhHFxEACdj94X+6Bd\nw6mSHn8s\/iOCclTStVnKmDyWWKgdpsj8v1KirvT9My4X0lRz+kBZyqxTLsJds3Rd53MFL3lKVB0X\nzdUEAGqHI+RmEgK4DcG8aiqNGyVhld6T+kYzmW1CMUJ9OoEA7iqdh\/XfUjMMa8ydD5\/ZxuBl53FG\nX2ZqEWZeBDSStD\/noBqank+0\/aQidBFceTYwwjn97zH0H8yzck\/ETDjdmJxmLtMam\/Is4cz9pagI\n1a+VGyLI2rXvRAe8jGt7RDnydzsqMZ8p\/bYBaBy1zthfBSg1XZq44GSxqmmzccODUEYdrQdhcLU0\nAWK9pYf7qqJmG4ZhMy\/8Woa9JLh0IjtLE2BRuz\/aEhcmdeiNSAYVldqjIKXmEa9q15jJ5HrHRmHe\nRKsW8GALng+IRzAH7pW7yjPbfjItghhXe6Ww+h6M9\/YwLm75sJB+1NC7Y7ONuBw1C2x001F\/\/EAs\nNBMsoYsAaF1iAXltKqeZWDnva\/QT7fDuOKtYKUBqN4agLgEuZHa5YnM0MxkS0bF+kTHAc9+SE1Vc\n8E\/NxRCPKXGGM8HNy0Vq8TyW3PLdecwZc+QvvND7\/mOJXCri8nMq74Xe0uYfy1C8ye0IAjWvpGX0\nDMBdoU1+2RvLl6XzpVL4ZYaKiNZMsPRlrsrioYUg1gaDyetwGO0ExJfEqlulLS0Br59pv0wfuvxG\nYf14YiW1ReYDyWFGOS42xLJjGke9uMm0YohlMZrxBBEGhgfJ0c2MbEe8rg1rVwlgYvcztB+NMCUP\n3+MilsgMwgZsBZ+hzWpTOiEsagafXD5d5wrHYSwGO7v3xErQHtliOvsI5YV2YS8rlluymHt8\/o9D\n5PM5DH8c3BG3mB6TVv8AgDqq\/EvxFi\/m4irx\/jinmX3tIxutsI0OeHSrHc9mEkHoAZBa3YWqlVPl\nD6JF3x4xPchKZ40ozNCD3r\/MfYPLQQ7fN5iu8zqvlHaFsE4eqAoekdIIHaAQwDUWCxAAsK7MEAAu\nrsfdzMoW3\/ylS0rJiEPXe12SJrGvvD1ZpOQqztn1jCv5b49AY\/34jDrUQ7RH+1V7DE\/yk1LX0YZx\nOaxYwv3kJItVGxCCVgTcTnZqpksWXKqXP7ZD071+0sWjAHhEI3g6ueK9+mVd7ztDNEyXhW7xK71G\ngQi+0IlIS2saBv2FLEpS\/bgkiwBLP43raZDhFIw+x9SEld3RaEoFrxM7GxuQxJNGk4DzAyPbnqum\nfNxAUG02hedIbjfSFDhA+StBBdklspMhshQM\/Li0tHBFOVqeDzUWQXDUZZ9\/h\/i4ldFup47ImIMU\nJF0aKg4XtGBXNWAWNYKSM9No7QChVrKiNbtV0ZtI2ys75oKUACJMsKly3Lq8sty5wI5SV2My9WLg\ncLlsZd3eUcw426X3JSz3LAXQ1AHoAB2JNJ5fmVAGuwhIeZGLnCzV4hNaFYnK2D0MTB1t1OK2\/BBp\njDXKcw89IQ3zypdGoKQ9ZWXy0I+llrGTAjcSUm6pP5ow8gSMNiFgUGvojVdvwyXXmsYWoJiTu6hW\n8g2gYUjPszmjKVSdhkJ5Ojgd7aCsacjyz\/sIhv42XD8EuIWpOn28AB4OhCH+fnBzayyw256Xnxyz\nGqukbj3DsOmrH3n7Z9pGfvMdIoM9YgVmOkwru66aLCarvso5bMw4X5d9pBnrqLrzr8zh4H3JoN3r\n\/khjIjLV9pBgyUX0E4qsPhn22J87J6qm08Tr6EKkIajFJXB6htHX3evdLsxJRLkihhKiAiBphT\/4\n1RMSyCxFk1WCoUyYnBJNOAwL15haqX4UnkDUM70DXaGNRS1cQnikXX2K3ZYnvv2JqVlY8ypMaMFA\nBCeF8RTfwShs+KMXe+3UWfZH5mI2mNulXtnI6BsagqA57u75VlTcxLlycVJUaJShlTLQys0YWKjW\n2py6FrbLxhYP1RlEWRwlqlUbaq1AcsBSpmmKMAABLONJc8sBZbMpbxkDTgwBkqDwDUvnKdEZ\/wA9\nxlY2SWjVJh7GDzC1q+8rrxUjI8TtR9giIlZPIh532HHpZu5US0gI6q1JQjSGpZYC\/YSLjLqFKmJS\nglDtvz2aAVh8+PWGC5azRO\/S82tCQXTECqnL4FFyVROWs3vqmo778isApQIS++uLaFcxLVMMfAC\/\nvKXxAbi1Pvjb9jWLBCfl887ikguOZv7n2iUGr4H0m2ACysUrBpsNWIhQS5q6wxZPsfhK\/wBrNumT\nTTFC5PVQX7OBv3Vc4y3Wa\/lGt6IeNcL+vdmwU1uu6mrksd7lPTfRD22M5VkKeilkQmMAnBcMREQG\n+4ZnYx6ZBOdnYwxP3c6AdiJJW5bMoOxTJlS+pOtkHcWGGjbiOVJBk5Q\/tElsSgc4M6gpRGXx1wc1\nkakGL38CEpovQoumDfxBRrMnHaWZjVoizSOIUxEapk1BprllmGEA\/atMVqd8hhms77Xc3IOJ3nnd\nzyRY8HSFdQ3NsfeeI9pLRIYHvUDAi0EVkc0xWCOeAY0dDz3glgeuaV8J83nFqSh1lHxmqu8t40b5\nZg94U+iGp3mrUF0hX2r74jPWvuTpk1RCpcuDCoo2sZn1BaS+QFqtgeeTBV3OnSKmcqkwkA1UUpsv\nzm6xUHR6kwb7xWdRLQ5u1l4Xl9RIUykpvtq7q4RbHhxTF8ENruta3thWYcMUr3YpQRROdyKZZ\/y1\nu+E7FR2auzrZirH\/AJfyEGA3h6XkbE+m68jJpwVs95sIEkqAsbivaXBMMK0lDEgzR3Mo7xxKsHHb\nfXZahOpYiAWWUjOrAsG2bQhiIR1ScbCElePgtXnDtQgnL1jLbHxmaYBPGsb3q31E2cmyOGuKWkO7\nT4tcytcGC4CwbhW1ub85QdgA3LAswnA0huxKCTQVwce275MWIbF0qxQjDFncvYkOpSc9iF+N71I9\n\/CVw8OGt4uouFhWW\/FvEZvlmiy7mTgGIwIi3RTAEauWibdSDblQXHD8Rgk5dovtNXB71AdNjxEw2\nCQhGD8TEFKCDDS4pzgDEfJvOMj+RgDKSCq1jZbcxUelICq1WrYSHBDEph4SlUXlx0Ny2Vk3z\/UIT\nqZzAwMiohiPnGkSBrhWsnZlvfCHWaC1xmanTeYd0dwYMtHSvYI7zCg5uLY2gafXIuXLm0cnhlahA\nOEEw2iPhJcGXHoyyXF6rY4JLaoCF7DWSD+BzFWSbhBAuZXkTAGlMdgglWc+khqDE0TxIoTVe9co1\n8UdT4k15+F9FuVghCQj53vuYOREq+IGb6B1JeAXmwrnEoXQQsvEsimixGbI9Liy5cuIhlLTGBoGq\nFmJSHCHhB+2Ky8QbgPbXEKQ1U0YSUXOAOFgy+kMGOon0dgq5SVNNCr7R3SYFnh9WOiC0VpvHQPor\no7YewWNMLas+i4suX0Kwc9PyeTHDLmB4lxjP+TLgJaf5QrWFAppEq0ARPVBzC0NdAylzZCzZj0Mv\nQDYPIYCrk9IWMHAqVAqV0r6E6PRqIRhKiQC+iUhUnHdhgAXyb0Unh\/8ABLlKq7BbF158fOmEWlEg\nYQwl3BrpVyvTZ6npVypUr6K+lj9N9UC0B3YNXEHW3lgXIa3RDitUSsxuYA7ET4zqjmFWngqIbhCH\nRIUq+sUUGrPF0AIorRPZAOxER7JUqael9U6pmJHHRInQK3ovVcalqrbIvhGCBYbb0JqiD2N8YhBX\npJ6joELKa0GhFHl2XbOYQh0IIINfsR70atwZcFupbL6J0C4kAepUeiXEI\/QkSmAK0H2ixWJKh0T6\nCEog6Nv\/xAA5EQABAwIEAwYEBAQHAAAAAAABAAIDBBEFEiExEBNBBhQiUXGRMlJhgSMzQqEHFSBT\nFmNygrHB0f\/aAAgBAgEBPwDlx\/22+yyR\/I32XLZ8jfZcuP5W+y5bPkb7Llx\/I32WSP5G+yyRj9LU\nDCXZQ1uqyR\/I1VjWNhJDfJXPmrkIvI6oPJ3KzHzWYrOUXm9wUXH5lnd5lAuXeQD8CNSOgXeR8pXe\n2+RXex5JtWCbOCknN2hmt1ynv1e9FgifH9TwrPyT6hFFO3QtfVEhXur8NUTZAhFanQJ2ZmjkQQ3N\ndWO42VTK+JgyfETZUEsry3mixBsrlVOgYfJyBaQq0\/gH1Cvqiblb8KmtdFJkEeyieJIw8DfhPOyC\nMyP2ClxOd4vCzK3zKM8ry8Pkc7xDromNGRvidsEDrrsnWAFk45gL6p79AAmnmGKCPWR7msYPMkrH\nqOuw2RkNZTuZm1D92myw2oiYcrn+LMCjUtGyle94aDYDfdM1YCPlVf8AkH1CFl11RtwrY3Zy49dl\nQytdEGdR04YnrSP+ymcc5F9AUw3ufRMd4G+gWRx1AWSTyXKf8iMLj+n91BhGIYhNEMOLWzw2lZc2\n+Eqv7SUkLm4T2uwlj5MoOaIh416rGYcIkxEfyCCUQFos0gk5uqFRUsGWaFwI0tsbhMkc4BzhZQHN\nCz0VdbkG606rS9ginF\/hZG28j9GDqSVQ9gGyQR1OMTPc\/wCLks0A+ii\/wpT4kcMbhMgqieXd8mgc\nfuqyOSixGroJdTEdD5tOoWI60kn2U+jnWTCCD\/tQdoFHctBK3Q4YJViixGCVxswnIfKzl29rIazt\nFUOgcHMY1rMw1BIXZGWahnOJuNwPDbe7eqxqslqMVq5qeEGF77iw3+qgfO534jDY+YVGSYm\/dV\/5\nH3C0OhTjO2UhouFhNHU4rV90bJFC7ITd9+io6XAOzDRLWStqq\/fQXLfTyVHVtxmi558MUoc3INx0\n3VZ2Dq6nF3V1M9kUHOzZHkuIDT\/2u0uAMbRxYtDHkmiAjnaDcZdv2WI27nL56KUEuc4KPW\/qE0nK\nNOiitkAVjsrWOqsLrs9RQ1lcWTxB8QjcSDsbqq\/hx2enkdIwzxX6NfosYwCHBIomUYPdyywJNzmH\nByoT4CPqq\/SA+oVlZNJY7Mx1inPLjmcbldlMcho2y0lZKI4dZA95sAU7tl2fYS3vpP1DHEJ\/a0xU\nWL0c0TpTUyyckuNmhrlNVVEgIey7D5aoMicL2cNVy2gEBr0wHI3wu2Ch+AXQUMHOvfZVrDE0gHUE\nKgqamKWXlVJjvE\/W5HRDEq0sjBr6jR9j4zoCnYhNKyvikqZZYyz8PO4m1nhak66KGESyZTso4WRC\nzAsQ\/Jt9UESgdVlHkqGkiqaiKCRzQHuDdQSTdOD4aFj45XAPnewjpZgH\/qrsskcssjGucGE6jqAs\nYMTWUzYYw3P4tBbRQ\/mMH+YpZJOY8Bx3PVMdJkbr0Cpoi4AHopCI85OgCp66njYWuf18iqmop5Xu\nDjcBCfAqSibG6AGt5Wtwf1hNOHWsP9XsqKbBWSgVEYdGd730VVJhD55TAG8sm40PVCaga\/O3R3oU\n6rpwQC\/cX281UCOuYIoZNRrsnYXy2l75dBvou7UFtZXrutADrK+4VJTYYKmM1M7+V8ZFjqAFBV9l\nY5mzRNaJGtuDldplQq+zcsIiewMhzueGZXE3G5uu1DmVVUBg7A2n5eUja5+6mw\/E5smdtw0WGo2U\nWGVgkuYvhfc6hVVHURZpJGWbe17+aZfI30CAAGgVdA50bzGLnTRGnmDjeN3sqkiAZ5vCHPsLqKSo\nrA6ckvzNy5miwIaLBMppxnvGfhPRPppy0nlv0b1VBeWAQx+J4tmt0shBOQByjpERsn005cPw3atb\n+wVDDLFKS9jgMqqWl0EjW6ko0839s+y7pI\/muLDcAZfqu51kY5r6SZrOSWXGgJI\/4TKeYHWM7Hon\n4fXPpoXCmmyta43IuLHyUtLI54dy3Xba3sp6KpLJSyNxLnNPsQnVEMRkEjspHQ7rEpYp6bJG7Mbj\nZMikyN0dsOiHA2WOsbVVNFRtNnF3TpdQQMp4Y4YxZrW24WuoJ3YbX1T5IHiJ797KCeKoZnidcI6h\nbbrZdL8KvtbiccrqCYs5LJQ34fFlQcHta4LHsRxGmnjjjrZhC5mjGusAsPqDVUkEx3I19QuqdDDJ\nq+Jp9QChBC34Ymj7BFrLnwL0Wtk6+w3VPhUra3vs9RndrpayPF7GPBa9twehTIo4xaNjWj6aLXZH\nhZFY\/TlteHht+aAfuNFC3LFG3yaAu0UUU1MHB\/4kZvYb2KwZpbh8APW5\/oO547n+q4sje91fVH6c\nK3EDSODe7vffqBoqt9bX1MUhpH2bt4el0z4W3VfhMVYHvZ4ZT7FUMD6aligkILm+XAcDuV1RXTh1\nPBu3Eo8BwCtwPALojuV\/\/8QAOhEAAQMDAgMFBQYGAgMAAAAAAQACAwQFERIhBhMxECJBYXEUMkJR\nkgczNVJTkSAjcoGhsRUkQ0Th\/9oACAEDAQE\/ANwhlbhb\/wAB+a5jSQAeyzMY+viD26m7+8jTU36E\nf0hR0tMY25gj+kIUtN+hH9IRpKb9CP6QvZab9CP6QvZKc\/8Agj+kIUdN+hH9IXsdN+hH9IXsdN4w\nR\/SF7JTD\/wBeP6QpKeDW\/wDlM6n4Que0\/A5c4flchMD8C5wHwlCUH4FzW+Kc85AZ4rluO73oNDZG\nY7LH+IRDyd2RActvogj2tGUQM4XdXdzupNHMf3viKcTlDWT1RyDglFpAzld7GVwxbqavqZ312TBB\nHzCB4riagt1FVUzrc4GKRmvAzgdj8ZaeyyfiEXo5Y2Uf3TPQIDst9tirafnibY5AwPEf7U8Jp5nw\nuOdJ64xlAkJ8jY2a3KSteThgwua9zu8cp5k1u9Su7r3T8AbFE50nxROT5JkUkzZOUxxEbHSP22ax\noySVwBQUdWyWvpK9s0mBG+Bow5nqCuNrNcqgRVdPSF0EOoHRuQnSNHmi8uPTCGOqsO9wj9HI7BR\/\nds9Am+aKtEsbY2RxbYHfAHTCu1O+KqLzux3Q9RsgN1Wj+R\/cI7HKZglOzqK5b3HJYuS89WH90IH\/\nAJP8oQP\/AC\/5Vhvdr4eNab1TPko6uE079ABIDlaeDrhUMfxBwBfZoodbmhszSwgj4SRkFcP13ELL\nOW8T1tOZ2SEEhzA3T0BJAIKreF7JUVEjqe5AF2X4BBGD8vJXK30lDLLDHW817DjTox\/lM3aCrD+I\nM9HI7NTNmNHkEFDG179UrtMLAXyP8GtAyrj9p5pqmWl4epo44vc9olGonzVRDx3W2MXyXiCF9vDO\neAyLDnMHlhUhgrrNab3S7MqWFsjPBkjThyrvuP7hdXYQ2OydnUfVR5LGE\/LtzurpTuqqGaJjXF\/V\noG5JHgAvsmoJ7fwZRtqY3xyTySS6XjBAcV9qU9JNHHY4IxHobzXlgxhx6BWm02KpsNuFZcwysZFg\nnmjI8dJBXEMFjiogaQwuqRpAdG4EkDxOFH7oKsP4hH6OR2Gf\/qiZSyQRmRwa8\/vlXusobJRCufHP\nPHr0kRlpxlV1w4k4sJp7bBJSWzPicB39R+JV1G+w3HkEh80RY\/WfdJxnorb9qlDRcOttVbHLUVQp\nwzmRgNZ3\/wDWlcI8Uyy1VTw9PPzKaQunpXuAB19f8hVm8H7IjJQ6p3vFRfcs9EThaig\/dXWtno6Z\nk1NKY5ua3Q4HBBByqL7YuMKSFkMrqafTtqfHh3+EOI6viOarqri5vtROTpGBp8OwEqE5Z6Kwb3Bn\n9DkehQ6JzGPaWvY0tPzTGNa3TGA1o8GrjLhypuMkFZb4Xyz7RvjaMlwKb9nvFr2hwtenyMrGn\/aq\nOFKSmruH6+OpEBpIIzNG3DpHPZvhTyzyF+mQhhd02ICHPByXgj0TCQO8nka3epUWOVH\/AEonJVdX\neyBgaMuPzVNOKiFkoGMqqYyRjA+PXh7dl7JB3nezxZPTuptOyN1O9kbGuz39IAyC0rS35LQ09QgA\nBgLh\/wDEB\/Q5O90oNOFMCIpSPylOq6trWnnyjUTvrO+FW3ivjdLUQ1EoIG2lxAARqZZql3Me5xDA\n7JcSe8qeefXFHz3hucdTsCrXzi+cySE6e7uSV1aU3BYCU\/Gp3qteiMA9UDkK5Uc1RI10Qzt88Khh\ndBTxsf16n+6MddPVucH4pde2D+VfzsYVTHVOjPIcWvHTzVO2qbCxs33gGHLEhGEGuVqrRbqkzyRl\nwwRsncUxkENpj+6PE1f8MUadxLXvaWmOLB8iqq4SmneyGhi5mCGnPu5UkN3ewsdu0u33HijDc2SF\nzTqfpA1ZCsnKgp83E5n15HU4UVbQRZ0HGo5Ox6o3KkwBzPe8ioaynnIjjfk4+Sf7zvVEk9Ux2+Cs\ntPiqC3TXEVIpmF744w4MG5d3gFX0jaGoNP7M+nwGnlyHLgSMn9yi4HG6hcOdFv8AG1cSUk8Nxqqm\nSAsilkzGT0cCOoWQPHxWpvzT3AjZNwCFqb81rGwXPikcI2ysLtYOPIIubjqhUQNmeDKzJIGB1ymv\nw0j5qCVgdEHHZrXD9wm0s7wwsjJBVtglhqQ+RhAweqe9up3qunZk9FwbK620F3u0jA5jGANBGxI3\nVbWS1tTNVTu1PkcST2DyVZRsvtjtkdPVxGqgiBLC7JOQqqjqKObk1MRY\/rg\/LsI7N+hWAFbvs+s1\nZb47lTMm9plpOY3MncD1JG6N7mO2LXaVwPaLPcLXVST2+lfUxzbve0FxBV8oRbbrWUjDlrH7HyKJ\nPgmSyt2bI4ehK5khO8jj\/crJ\/MVnsbgFpd7qrOJaaWz\/APEUVBymHGpxcCcBHr2xyyQuD4pHNcPE\nHBUlRNO\/XPI57vmSSV13RQ6rIzkIb7rgavD7Ly3yuBpzIzy0kalUu11M7z8Ujj+5XAFTPS3F8Rj\/\nAOvUMI1vB06mri1\/Nv1aRjbSNumzR2Hqgs9g0ry7Nitx\/ADjtAwrTZG3ONz\/AG+CEt+B57ytMNos\ntDVU7bxDrewiQ6wcuLcbJ+z3jzVj4mqbU+COUa6Zhzj4h6K8VsVfcKiqgYWseQQD17Cih2BHtKK8\nG9oQ7MkdD\/AOxyPZ\/9k=\" width=\"400\" height=\"250\" \/><\/a><\/p>\n<p>You break the infinite loop by implementing the method in the factory implementation, just like you did back in C++\/WinRT version 1:<\/p>\n<pre>namespace winrt::factory_implementation::Widget\r\n{\r\n    struct Widget : WidgetT&lt;Widget&gt;\r\n    {\r\n        \/\/ instance method on factory object\r\n        void SomeMethod() { ... }\r\n    }\r\n\r\n    \/\/ state variables go here\r\n    int32_t m_state;\r\n}\r\n<\/pre>\n<p>An explicit implementation in the factory implementation object overrides the default implementation, thereby breaking the cycle.<\/p>\n<table class=\"cp3\" style=\"border-collapse: collapse;\" title=\"Projected Widget static method call goes directly to static method on instance implementation, which forwards to Widget factory. External consumer goes to Widget factory directly.\" border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n<tbody>\n<tr>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px black;\"><code>winrt::Widget::StaticMethod<\/code><\/td>\n<\/tr>\n<tr>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td style=\"font-size: 200%;\">\u21d8<\/td>\n<\/tr>\n<tr>\n<td style=\"border: dotted 1px black; text-align: center;\">External consumer<\/td>\n<td>\u2192<\/td>\n<td style=\"border: solid 1px black; text-align: center;\">Widget factory<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: dotted 1px black; text-align: center;\">Widget instance static members<\/td>\n<\/tr>\n<tr>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px black; border-bottom: none;\"><code>IActivationFactory<\/code><\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: dotted 1px black; border-bottom: none;\" rowspan=\"5\">\u00a0<\/td>\n<\/tr>\n<tr>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: 1px black; border-style: none solid; padding-left: 1em;\"><code>ActivateInstance()<\/code><br \/>\n<span style=\"font-size: 80%;\">(autogenerated)<\/span><\/td>\n<\/tr>\n<tr>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px black; border-bottom: none;\"><code>IWidgetFactory<\/code><\/td>\n<\/tr>\n<tr>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: 1px black; border-style: none solid; padding-left: 1em;\"><code>CreateInstance(name)<\/code><br \/>\n<span style=\"font-size: 80%;\">(autogenerated)<\/span><\/td>\n<\/tr>\n<tr>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px black; border-bottom: none;\"><code>IWidgetStatics<\/code><\/td>\n<td style=\"font-size: 200%;\" rowspan=\"2\" valign=\"bottom\">\u21d0<\/td>\n<\/tr>\n<tr>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px black; border-top: none; padding-left: 1em;\"><code>StaticMethod()<\/code><\/td>\n<td style=\"border: dotted 1px black; border-top: none; padding-left: 1em;\"><code>StaticMethod()<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><b>Bonus chatter<\/b>: Even if you never call the static method yourself, you still have to include a declaration for it, so that the projection short-circuit (the diagonal arrow) can call it. You don&#8217;t have to implement it, though.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Transforming the ABI into a projection.<\/p>\n","protected":false},"author":1069,"featured_media":111744,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[25],"class_list":["post-105240","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oldnewthing","tag-code"],"acf":[],"blog_post_summary":"<p>Transforming the ABI into a projection.<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/105240","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/users\/1069"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/comments?post=105240"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/105240\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/media\/111744"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/media?parent=105240"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/categories?post=105240"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/tags?post=105240"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}