{"categorySlug":"projects","articles":{"projects\/emoji-rating":{"key":"projects\/emoji-rating","type":"article","published":true,"meta":{"createdAt":"2025-12-26T10:36:35+00:00","publishedAt":"2025-12-26T10:36:35+00:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/emoji-rating.avris.it\/","displayUrl":null}],"category":"projects","subcategory":null,"slug":"emoji-rating"},"content":{"en":{"slug":"emoji-rating","title":"Emoji Rating","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/emoji-rating_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022240\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACZ0lEQVRIidWVT08TQRjGf7Oz227bpRQpheBBjSQcREOjJQUNwRCNEJUYNEFjCDEajRoPctMYP4VfwHjTm2e4mBgTBRNPEi9qjCZCbWkpxXZ3xwO6pZWu0Qvy3OaZ98+zM+8zK3bvSyv+I2hbLaAe20tQOGQyONCHYegASCk50p+iyYp4MdEmi8PpQ0gpATAMg8GBPkIhs6ZWeyLOwd79aEL8u6B0KsmNK5NEwmEAAgGDqQvjjBwb8mJOnhhmcuKMJ9qKhLl1bYpU8kBNrXNjo5wfP4Um\/S9F+A21FQmjaRr5worH\/Tqdwkpx07UQAisSwVUuxeJqw7xG0BttNDs2xvIyAPGNG7kcibZWnKgFKITQWMp8I1gTU14vLgSJXS2EgjolWyEMB71oIQ1J9nMBx3Z\/6+t7QluB7eWyrYCvoETAZrq3QH9ryeO6Olymz5bp7nQ8LtXlcHu8TEesOhPHkzY3T5exgtWJmBiocOloBT+jNRxqgKs9KwyNNDG8kGP0SQiAy2OCZM939rYLrj+wALhzsUR8p6I55HL\/kYlpKO5N2MiYSz6r8fCZTndccTcqkVF4217h+Rfj7wXNfgiwZz7H\/Ptq2OO5TnT5iVdvKh4381InvbrGzNy619YqgtnXLp1tZV68CwDwMQ9P4wVc22YhH2vY09dlZjBIrDnKaqlU8xa1xVtZXMp4ayklLbEoS5lsNdcMEjJNsrllj4vvaEHqkq+LGZTavK2vICEEQgg0IbAdp4avL6hpGq5bnSEpJa7r1sSJn7+NRmLgD1emlEIpRf3ztVnBjWIAnA0f4JdXj+1l+63ADyRdxudTc6hJAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/emoji-rating_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022240\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/emoji-rating_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022480\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACZ0lEQVRIidWVT08TQRjGf7Oz227bpRQpheBBjSQcREOjJQUNwRCNEJUYNEFjCDEajRoPctMYP4VfwHjTm2e4mBgTBRNPEi9qjCZCbWkpxXZ3xwO6pZWu0Qvy3OaZ98+zM+8zK3bvSyv+I2hbLaAe20tQOGQyONCHYegASCk50p+iyYp4MdEmi8PpQ0gpATAMg8GBPkIhs6ZWeyLOwd79aEL8u6B0KsmNK5NEwmEAAgGDqQvjjBwb8mJOnhhmcuKMJ9qKhLl1bYpU8kBNrXNjo5wfP4Um\/S9F+A21FQmjaRr5worH\/Tqdwkpx07UQAisSwVUuxeJqw7xG0BttNDs2xvIyAPGNG7kcibZWnKgFKITQWMp8I1gTU14vLgSJXS2EgjolWyEMB71oIQ1J9nMBx3Z\/6+t7QluB7eWyrYCvoETAZrq3QH9ryeO6Olymz5bp7nQ8LtXlcHu8TEesOhPHkzY3T5exgtWJmBiocOloBT+jNRxqgKs9KwyNNDG8kGP0SQiAy2OCZM939rYLrj+wALhzsUR8p6I55HL\/kYlpKO5N2MiYSz6r8fCZTndccTcqkVF4217h+Rfj7wXNfgiwZz7H\/Ptq2OO5TnT5iVdvKh4381InvbrGzNy619YqgtnXLp1tZV68CwDwMQ9P4wVc22YhH2vY09dlZjBIrDnKaqlU8xa1xVtZXMp4ayklLbEoS5lsNdcMEjJNsrllj4vvaEHqkq+LGZTavK2vICEEQgg0IbAdp4avL6hpGq5bnSEpJa7r1sSJn7+NRmLgD1emlEIpRf3ztVnBjWIAnA0f4JdXj+1l+63ADyRdxudTc6hJAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/emoji-rating_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022480\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Elet\u0027s make rating systems meaningful again!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["stars","five star review","review","rating","scale","system"],"hasMore":true,"image":"https:\/\/avris.it\/image\/emoji-rating_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/emoji-rating_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/emoji-rating_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022120\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/emoji-rating_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/emoji-rating_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022120\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Elet\u0027s make rating systems meaningful again!\u003C\/p\u003E","words":6,"readTime":null,"lang":"en"}}},"projects\/ulid-page":{"key":"projects\/ulid-page","type":"article","published":true,"meta":{"createdAt":"2023-08-04T17:23:50+02:00","publishedAt":"2023-08-04T17:23:50+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/ulid.page","displayUrl":null}],"category":"projects","subcategory":null,"slug":"ulid-page"},"content":{"en":{"slug":"ulid-page","title":"ulid.page","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/ulid_page_small.png\u0022 alt=\u0022Screenshot of the website ulid.page\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022296.67469879518\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAWCAYAAACosj4+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADWklEQVRIidWWuY5cRRSGv9ru2tPdM0ziBXsMFktAAjlCSOyCRyAi4Fl4AJ6FEEgQFgFISCSDmAA83vBsvd3aDsEdmhG422OZxfxRXdW993x16py\/Ss1nWXiCZFdNiAhffPk109mM4caA7e0tbt68zd27v+IKxysvv8TO1ct\/O5BalaGcM\/v7d8g545zDOcvh4THee2JKXL50AUEwxgBQOEddV\/8c0FmJCKBQqgfVWiMiKKWW87+PH1crtyxnIaaMZIE\/xdLL57NrWb+u2\/dm3Pj2FjFmPnjzWarSPBqQCBwcHBBDOM0QGGPwIXDxwsW1wR+kw6MF3\/9wj+OJ5+3Xdh4dKMbIz7\/cRmuNMYaidGwMNmgHDUcn0+V7u3tHfPXNHd56dcxkckJRloxGI0ARfMBYg1KKuhI+\/vBFPvn0u79k\/FxAzlleeP76Q1d+5dIIZx07VzeXmVwlAd5\/4xnqcmXY8xX1v6mVqN4Hdn\/co2lqjNaknJmcTBlstNRVRYwR5yxF4RiPR+zfusN8NmfrqU0OD46w1tI0NccnU0SEsnCklNje3lprDyuBrDWMx0MkC1orss80TU1dVVRVCZQoBdb2vxgNN0BgNpv3\/aZgvljgXIW1mkFb0rbNQzOkV05oTVkUhBiJMWGsoapL5osF9+8f9JAidJ0nxghATBHfecqiQJ1Wbl0Z2qZAKcVkMsX7sBZodXXRt7mzlrqpsMaSc2Y0HJJzQilNzhGFwlpLzoIIlGWDNoYYA4jgQyCmRNs2iAg557VGuhYo50zXeVB9TRXOAeBDWGavbWpSSstvfBQsQkwKazQiCUSwxpDP4eZrgQCyZHLqzzOlFCklnLV03jMabjAYtBhj6DqPUiBpgWRLUznKsgDAuT\/GjwWkjcaeHp6IMBoP+8BaIdIfrCEEQoxoregWnrZtSCkxmczoOk\/Kmc3xiK47xlrDYNCuBfr\/+NB5tPvTIZ99vkeIGa3628C7r1\/j+rXxfwPU+4sjpb7DCqexdqWTnEvqnfc+eqK2TJniuQcCFYXjytOX8CHQNDWTyRSjNc45smS00szmc7TSWGs4mUyJIZJyXnZjWRQsug5jDHLa+iFGZrP5owMppSgKB9K3vlJ6eWPsTU1x9lKmlCKESM75sTL0G3Jvlo2RDxkHAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/ulid_page_small.png\u0022 alt=\u0022Screenshot of the website ulid.page\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022296.67469879518\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/ulid_page_big.png\u0022 alt=\u0022Screenshot of the website ulid.page\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022593.34939759036\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAWCAYAAACosj4+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADWklEQVRIidWWuY5cRRSGv9ru2tPdM0ziBXsMFktAAjlCSOyCRyAi4Fl4AJ6FEEgQFgFISCSDmAA83vBsvd3aDsEdmhG422OZxfxRXdW993x16py\/Ss1nWXiCZFdNiAhffPk109mM4caA7e0tbt68zd27v+IKxysvv8TO1ct\/O5BalaGcM\/v7d8g545zDOcvh4THee2JKXL50AUEwxgBQOEddV\/8c0FmJCKBQqgfVWiMiKKWW87+PH1crtyxnIaaMZIE\/xdLL57NrWb+u2\/dm3Pj2FjFmPnjzWarSPBqQCBwcHBBDOM0QGGPwIXDxwsW1wR+kw6MF3\/9wj+OJ5+3Xdh4dKMbIz7\/cRmuNMYaidGwMNmgHDUcn0+V7u3tHfPXNHd56dcxkckJRloxGI0ARfMBYg1KKuhI+\/vBFPvn0u79k\/FxAzlleeP76Q1d+5dIIZx07VzeXmVwlAd5\/4xnqcmXY8xX1v6mVqN4Hdn\/co2lqjNaknJmcTBlstNRVRYwR5yxF4RiPR+zfusN8NmfrqU0OD46w1tI0NccnU0SEsnCklNje3lprDyuBrDWMx0MkC1orss80TU1dVVRVCZQoBdb2vxgNN0BgNpv3\/aZgvljgXIW1mkFb0rbNQzOkV05oTVkUhBiJMWGsoapL5osF9+8f9JAidJ0nxghATBHfecqiQJ1Wbl0Z2qZAKcVkMsX7sBZodXXRt7mzlrqpsMaSc2Y0HJJzQilNzhGFwlpLzoIIlGWDNoYYA4jgQyCmRNs2iAg557VGuhYo50zXeVB9TRXOAeBDWGavbWpSSstvfBQsQkwKazQiCUSwxpDP4eZrgQCyZHLqzzOlFCklnLV03jMabjAYtBhj6DqPUiBpgWRLUznKsgDAuT\/GjwWkjcaeHp6IMBoP+8BaIdIfrCEEQoxoregWnrZtSCkxmczoOk\/Kmc3xiK47xlrDYNCuBfr\/+NB5tPvTIZ99vkeIGa3628C7r1\/j+rXxfwPU+4sjpb7DCqexdqWTnEvqnfc+eqK2TJniuQcCFYXjytOX8CHQNDWTyRSjNc45smS00szmc7TSWGs4mUyJIZJyXnZjWRQsug5jDHLa+iFGZrP5owMppSgKB9K3vlJ6eWPsTU1x9lKmlCKESM75sTL0G3Jvlo2RDxkHAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/ulid_page_big.png\u0022 alt=\u0022Screenshot of the website ulid.page\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022593.34939759036\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EULIDs are my favourite identifiers to use in projects, they\u0027re soooo cool!\nThere used to be a website that would generate, validate and decode ULIDs right in the browser,\nbut the domain expired and whoever was running it abandoned the project.\nSo I decided to recreate it and keep it alive!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["ulid","vue","nuxt","identifier"],"hasMore":true,"image":"https:\/\/avris.it\/image\/ulid_page_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/ulid_page_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/ulid_page_mini.png\u0022 alt=\u0022Screenshot of the website ulid.page\u0022 width=\u0022240\u0022 height=\u0022148.33734939759\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/ulid_page_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/ulid_page_mini.png\u0022 alt=\u0022Screenshot of the website ulid.page\u0022 width=\u0022240\u0022 height=\u0022148.33734939759\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EULIDs are my favourite identifiers to use in projects, they\u0027re soooo cool!\nThere used to be a website that would generate, validate and decode ULIDs right in the browser,\nbut the domain expired and whoever was running it abandoned the project.\nSo I decided to recreate it and keep it alive!\u003C\/p\u003E","words":51,"readTime":null,"lang":"en"}}},"projects\/ipvx":{"key":"projects\/ipvx","type":"article","published":true,"meta":{"createdAt":"2023-06-06T21:37:00+02:00","publishedAt":"2023-06-06T21:37:00+02:00","group":null,"links":[{"icon":"brands gitlab","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/ipvx","displayUrl":null}],"category":"projects","subcategory":null,"slug":"ipvx"},"content":{"en":{"slug":"ipvx","title":"ipvx","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/ipvx_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022251.05035971223\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGw0lEQVRIiTWUOY9kZxWGn2+5e1V1LdNT3T0LM2N78BgQWGIJCJCMBQEpCf4J\/AckhERKSkREgJwQIgKEZIFAljHGgO2R7dnce1d1LffWrbt9C0E3v+A85znve8Qvf\/UzH6cxUbrlR2\/8lMF4wt\/f+zMff\/Q76kaTJgHbdcDlpWdbtjgXIndeI371LbyQeA+indEzT9j1T4gDz38ev4uUlrar6EzLcDJhZyh5dviM1bLipS+\/xvt\/+4DtukFKwf7BDe49GuMl6LQXEoYpo\/5D\/vHPvyBkw+NP3yWJ9yiLQyZjx3aTUHeWnWGPrnbI2IBs8TpBK0EWlBx\/8A70JG9+702c2PLRJx\/SGUu+2RAkmk0FSXqTOBZs8oqvff018nVJnGQYWi4XBcW6RXfyY6o8ZTDoWM4KwjADoZgvzxkOE+oyI9YJsb5gU2pca+n1OgIKXJAhJfRHt9l\/9CYv37vFp1+8w9PnL7DOolSIx7Au5midMXt2xKA3YGfYY1bVjHennD4\/I0ksn39+xmQyRG\/XIc56Tk4+Q\/qMzz5\/ynQ6pt4M6CUKFTcoOm5M9lit5iSTl0lGt7GDBBls8N6zaWKCnS9xtAlRbZ+79x5Rbs\/p2hwnSs5OFwyHiijIWK3XrNYFoVKUxYbNpsK4IUJKTk7P0VGQEKSKbeE4\/OKY2XnFzs6IGzcVP\/n+j6l6Gf2wB17gHAihUCoEKVjWDa4uCeM+phUIX5O+\/l2caXHO4jF47\/EevPcYa\/jt27\/hw8fv4RGs1znj0YC6aohijXcKjZe8eHHGg\/v38MJxenbK\/E\/nPHp0h1+f\/R5rLYN+j6ZtMJ3DOU9d1wRBgHGGXq\/Htupw1hFoycXsHGuuQJy3gEAIgXcO6xydzrm5P6JalSATGgNegm3gxnQP8fYff+HzVYmSIWGoyZcVebnh\/Xc\/4ujJhsPDI9I0xnuLB6RQVFWFtRYEBIHCGkPbery3WOvwgHMWAITEe4dAYKzl7ku73H94i7KuSbKUg7u3SeKUo6dn1K5EYhz7twekvYDLWYHWAXu7E77y6iOEkIRhiFSS7tpOZ1qMNWitkUIhUMRxQhAoAq0RQuCcw3twzmM6gzOeruvAgzGe5eWGOO0xHOzg2xaPIQoDRCnQm7agXYa4LqBrDHvTjE\/++5z5LEcISb\/fJ4oi8AVaS5RWhMEWa6HrOnZ3b9CZlul0SllukTJguVrhnGM+n+OdwwFCCACiMODBndt4YDMvmL4Sc3R4TFW3RIMI3W4lyUixuz\/EO8eTJ8fUbc3FbH6t3ROEkiyLKIotkRBIoeisYbFYsq0KlNRoffUkq7qjbVu89wgpkVLi8eABD5GK0UIRhDGz2YLDkzmPHz\/HOkcWZ2hFQFVbmrbm\/is3Obg7Zn5acnme84d\/\/5U0CYmjAAQYYymugsGmrK8y4gXWOLzzIATWWKz1CAE4j\/PXJNeWyqri+fEJHsuyyDlfCeIkpqlbFssl+osXF+ztT1h0NeW6JskiBuOIINYYY6hrTxhKlJQgPIHSIDxRqKjqjqbuCK+Br5rlUVLinLvK0jWMd\/+3JGhqQ2NahJAsTpdILdiZ9BlOBmicxjUKoyxt4\/n4XycMJzvcurtLr58ihcJcbyyFxDqHlIIgUEgpkepquJRXJ9NS0piOa0JA4K4bKRBUVY0owNYdQkM2TAFoG4uqBToRsF7kLOeO0c4IFYbks4p1sUEJiRAerSTOe7rOIqRAOEnTOPCeQIAQEgRXp\/MepRRd1+G9x9qrygN47zBNxyAZU3Q5OgqoyhqPIl9v8M6hp9MHnF6cUW0K5rOnV41wDWkW8oMffovhOEOHmmrrMA0MxgldW3ExK+jajvG4T5SE5KuSpjHkRUVVVmiVkOc5q3xJXXXk6w3WOqqqo9k6+tmQdV7Qbh3WG\/r9hDJv0Wa1YCC2jHcDFrlABiG9wR5ZGvHqw\/tkWcb5xZIw6tO0G8I4wrmWg4MN29KQZgmD0Q7PnpyTpZrLxZrjo3Om0xt07U3y9YLlqqBpOs7OlpRlzWy25Dvf\/gZxtKJqS3QkOD48x1tQb7zx+s9bIVlXLb3BiNY6jJV4EZJvSiwhveEI4yocnrSXUdcBbWvYmQxJexFi8E0EmnTyVfLlBaH2lNuSpqnZ29snjiKEtHRdS5pGbKuKk+MLjLXcvnWHJOxz6+AO8\/kMrXoJgVBYYRlPd6lPTwiCgNHuGNyITdGw3a4Io5imUyxmW+L+PskgwyGJUk0bPSSMV6h4ys29A87aJUnWw3SS+WWOUorxZBcpA+rtlkALqqpjNJ7w\/MULbOeQUnPv3n3+By6i09LJlrZPAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/ipvx_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022251.05035971223\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Eminimalistic IP country lookup\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/ipvx_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022502.10071942446\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGw0lEQVRIiTWUOY9kZxWGn2+5e1V1LdNT3T0LM2N78BgQWGIJCJCMBQEpCf4J\/AckhERKSkREgJwQIgKEZIFAljHGgO2R7dnce1d1LffWrbt9C0E3v+A85znve8Qvf\/UzH6cxUbrlR2\/8lMF4wt\/f+zMff\/Q76kaTJgHbdcDlpWdbtjgXIndeI371LbyQeA+indEzT9j1T4gDz38ev4uUlrar6EzLcDJhZyh5dviM1bLipS+\/xvt\/+4DtukFKwf7BDe49GuMl6LQXEoYpo\/5D\/vHPvyBkw+NP3yWJ9yiLQyZjx3aTUHeWnWGPrnbI2IBs8TpBK0EWlBx\/8A70JG9+702c2PLRJx\/SGUu+2RAkmk0FSXqTOBZs8oqvff018nVJnGQYWi4XBcW6RXfyY6o8ZTDoWM4KwjADoZgvzxkOE+oyI9YJsb5gU2pca+n1OgIKXJAhJfRHt9l\/9CYv37vFp1+8w9PnL7DOolSIx7Au5midMXt2xKA3YGfYY1bVjHennD4\/I0ksn39+xmQyRG\/XIc56Tk4+Q\/qMzz5\/ynQ6pt4M6CUKFTcoOm5M9lit5iSTl0lGt7GDBBls8N6zaWKCnS9xtAlRbZ+79x5Rbs\/p2hwnSs5OFwyHiijIWK3XrNYFoVKUxYbNpsK4IUJKTk7P0VGQEKSKbeE4\/OKY2XnFzs6IGzcVP\/n+j6l6Gf2wB17gHAihUCoEKVjWDa4uCeM+phUIX5O+\/l2caXHO4jF47\/EevPcYa\/jt27\/hw8fv4RGs1znj0YC6aohijXcKjZe8eHHGg\/v38MJxenbK\/E\/nPHp0h1+f\/R5rLYN+j6ZtMJ3DOU9d1wRBgHGGXq\/Htupw1hFoycXsHGuuQJy3gEAIgXcO6xydzrm5P6JalSATGgNegm3gxnQP8fYff+HzVYmSIWGoyZcVebnh\/Xc\/4ujJhsPDI9I0xnuLB6RQVFWFtRYEBIHCGkPbery3WOvwgHMWAITEe4dAYKzl7ku73H94i7KuSbKUg7u3SeKUo6dn1K5EYhz7twekvYDLWYHWAXu7E77y6iOEkIRhiFSS7tpOZ1qMNWitkUIhUMRxQhAoAq0RQuCcw3twzmM6gzOeruvAgzGe5eWGOO0xHOzg2xaPIQoDRCnQm7agXYa4LqBrDHvTjE\/++5z5LEcISb\/fJ4oi8AVaS5RWhMEWa6HrOnZ3b9CZlul0SllukTJguVrhnGM+n+OdwwFCCACiMODBndt4YDMvmL4Sc3R4TFW3RIMI3W4lyUixuz\/EO8eTJ8fUbc3FbH6t3ROEkiyLKIotkRBIoeisYbFYsq0KlNRoffUkq7qjbVu89wgpkVLi8eABD5GK0UIRhDGz2YLDkzmPHz\/HOkcWZ2hFQFVbmrbm\/is3Obg7Zn5acnme84d\/\/5U0CYmjAAQYYymugsGmrK8y4gXWOLzzIATWWKz1CAE4j\/PXJNeWyqri+fEJHsuyyDlfCeIkpqlbFssl+osXF+ztT1h0NeW6JskiBuOIINYYY6hrTxhKlJQgPIHSIDxRqKjqjqbuCK+Br5rlUVLinLvK0jWMd\/+3JGhqQ2NahJAsTpdILdiZ9BlOBmicxjUKoyxt4\/n4XycMJzvcurtLr58ihcJcbyyFxDqHlIIgUEgpkepquJRXJ9NS0piOa0JA4K4bKRBUVY0owNYdQkM2TAFoG4uqBToRsF7kLOeO0c4IFYbks4p1sUEJiRAerSTOe7rOIqRAOEnTOPCeQIAQEgRXp\/MepRRd1+G9x9qrygN47zBNxyAZU3Q5OgqoyhqPIl9v8M6hp9MHnF6cUW0K5rOnV41wDWkW8oMffovhOEOHmmrrMA0MxgldW3ExK+jajvG4T5SE5KuSpjHkRUVVVmiVkOc5q3xJXXXk6w3WOqqqo9k6+tmQdV7Qbh3WG\/r9hDJv0Wa1YCC2jHcDFrlABiG9wR5ZGvHqw\/tkWcb5xZIw6tO0G8I4wrmWg4MN29KQZgmD0Q7PnpyTpZrLxZrjo3Om0xt07U3y9YLlqqBpOs7OlpRlzWy25Dvf\/gZxtKJqS3QkOD48x1tQb7zx+s9bIVlXLb3BiNY6jJV4EZJvSiwhveEI4yocnrSXUdcBbWvYmQxJexFi8E0EmnTyVfLlBaH2lNuSpqnZ29snjiKEtHRdS5pGbKuKk+MLjLXcvnWHJOxz6+AO8\/kMrXoJgVBYYRlPd6lPTwiCgNHuGNyITdGw3a4Io5imUyxmW+L+PskgwyGJUk0bPSSMV6h4ys29A87aJUnWw3SS+WWOUorxZBcpA+rtlkALqqpjNJ7w\/MULbOeQUnPv3n3+By6i09LJlrZPAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/ipvx_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022502.10071942446\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Eminimalistic IP country lookup\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["go","golang","ip","ipv4","ipv6","lookup","country","country code","lookup","programming"],"hasMore":false,"image":"https:\/\/avris.it\/image\/ipvx_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/ipvx_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/ipvx_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022125.52517985612\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Eminimalistic IP country lookup\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/ipvx_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/ipvx_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022125.52517985612\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Eminimalistic IP country lookup\u003C\/p\u003E","words":4,"readTime":null,"lang":"en"}}},"projects\/corevalues":{"key":"projects\/corevalues","type":"article","published":true,"meta":{"createdAt":"2023-05-23T17:52:17+02:00","publishedAt":"2023-05-23T17:52:17+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/corevalues.avris.it\/","displayUrl":null}],"category":"projects","subcategory":null,"slug":"corevalues"},"content":{"en":{"slug":"corevalues","title":"corevalues","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/corevalues_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022252\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB7UlEQVRIie2Uy08bMRCHPz92m+x6H0Cg2U1EBRJFffH\/\/xH0AifUU2lzTIO6iCjrrN1DlSikSdpUjeDQn2T5MdbMZ49mxOnZG88zknxqgGX9B\/qdnh2QXmd4\/+4tk8mEJE1RSiGlZDgc0m61OD9\/zdXVNf1+j+\/VPZeXH3cPVFX3TKdTwvAFAN9GI+7uRpyenHBz84kwDLn98hXv\/22RinVlr5TCe49zjiAIsNY+sjVNg5QS5xwAJo6Z1PWje3+jjSlrnMM5h3ee2tYkxlBVFSZJEMDDwxgEKCmp65rptOHz7e1ugISUOGvxHoQURFGEc45Wu02gNVVVEYYhWmustWRZRm0tFxcfwHustcRxjLVTrq6v\/zi1a1P2VFr7Q7uSUoo8z8nzjMQY2lGbMAgQQuJcsxugNE3plQW9XklZFpRFSVl0KYounU6HIAiQUiKlRAiBEAIA7\/32QFJKsixjf3+PzsEBh4cdXh4dURRdyqKg3++T5xlaa4IgQGuFUnrey2bBZ\/OivPfoV8fHxCYmMQZjYqIowhhDYgxJYkiShDRNybKUvXxvHkwpNR+L++VXbyMBiMFg4GffN3O2vF6cF4Nteu22mlWhGI\/Hfp3DVeebgm8P5lnuBnqTE+\/9L0FWnS3a5nA\/CVddYlOf+QFNZKG7tQOrTAAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/corevalues_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022252\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ewhat are the core values in your life?\nhere\u0027s an exercise that can help you discover them!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/corevalues_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022504\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB7UlEQVRIie2Uy08bMRCHPz92m+x6H0Cg2U1EBRJFffH\/\/xH0AifUU2lzTIO6iCjrrN1DlSikSdpUjeDQn2T5MdbMZ49mxOnZG88zknxqgGX9B\/qdnh2QXmd4\/+4tk8mEJE1RSiGlZDgc0m61OD9\/zdXVNf1+j+\/VPZeXH3cPVFX3TKdTwvAFAN9GI+7uRpyenHBz84kwDLn98hXv\/22RinVlr5TCe49zjiAIsNY+sjVNg5QS5xwAJo6Z1PWje3+jjSlrnMM5h3ee2tYkxlBVFSZJEMDDwxgEKCmp65rptOHz7e1ugISUOGvxHoQURFGEc45Wu02gNVVVEYYhWmustWRZRm0tFxcfwHustcRxjLVTrq6v\/zi1a1P2VFr7Q7uSUoo8z8nzjMQY2lGbMAgQQuJcsxugNE3plQW9XklZFpRFSVl0KYounU6HIAiQUiKlRAiBEAIA7\/32QFJKsixjf3+PzsEBh4cdXh4dURRdyqKg3++T5xlaa4IgQGuFUnrey2bBZ\/OivPfoV8fHxCYmMQZjYqIowhhDYgxJYkiShDRNybKUvXxvHkwpNR+L++VXbyMBiMFg4GffN3O2vF6cF4Nteu22mlWhGI\/Hfp3DVeebgm8P5lnuBnqTE+\/9L0FWnS3a5nA\/CVddYlOf+QFNZKG7tQOrTAAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/corevalues_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022504\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ewhat are the core values in your life?\nhere\u0027s an exercise that can help you discover them!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["core values","values","growth","introspection","vue","nuxt"],"hasMore":false,"image":"https:\/\/avris.it\/image\/corevalues_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/corevalues_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/corevalues_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022126\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ewhat are the core values in your life?\nhere\u0027s an exercise that can help you discover them!\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/corevalues_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/corevalues_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022126\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ewhat are the core values in your life?\nhere\u0027s an exercise that can help you discover them!\u003C\/p\u003E","words":17,"readTime":null,"lang":"en"}}},"projects\/tinyfingerprint":{"key":"projects\/tinyfingerprint","type":"article","published":true,"meta":{"createdAt":"2023-05-17T17:52:37+02:00","publishedAt":"2023-05-17T17:52:37+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/tinyfingerprint.avris.it\/","displayUrl":null}],"category":"projects","subcategory":null,"slug":"tinyfingerprint"},"content":{"en":{"slug":"tinyfingerprint","title":"tinyfingerprint","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/tinyfingerprint_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022252.51048532055\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACBklEQVRIia1Wy27jMAwcUi87SFMgQY655P+\/aU89FdtukMJwHElkD10T6WLbqEEIGLAkShqNZmiTqiquxPn4Cy9DQikCZgYzQ1WxXC6xWq2uTW8OEQE3ZXKPvuvgnIOqYhiGj25um\/6ToBaGDuMEzhNEBEQEIkKtFc45y6m1GnMPDw+fxlpDRNoA5SoI7v5s\/A+Qb0n88\/Ib4zhCVe0hImNkPhMzo5SCGKOxKfKhu91uByK6ulcTIGaG994AzBsBsHcigqoixmigACDnDO89xnHEYrG4DyARMQClFHjvUUqBcw61Vhub2wCsX1UNcEs0AVJVTNOEEAJyziilGCO1VnsvpWC73RqTImLO7Pv+foCYGSEEc45zDo+Pj3Z9s45mvcxtZjb25ty7AWJms7yI4PX1Fc45Y+FSRwCsLDjnEEKwvLsA6vseMcZPevDem7YumZidRkQ31aMmQMfjEcMwYL\/f\/2hxAMZYq6jbKvXhgNPpZMKNMZqYa61m95TSl2vEGK\/avrkwqiqen5\/tikII6PseXdehlIJpmjCOI7qu+zjlX61dnnW5XN6vDnnvsdlskFK66RtFRFYor+U1Aco5g4hwPp\/hvW9a\/DJSSt9e502A3t7eEELAer1uov7faJAqAMCLCHLOZtuvAOWcoao4HA54enpCSumT\/ReLxbf\/R9dET0QIIeAdmqdWoOSD4fwAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/tinyfingerprint_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022252.51048532055\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ea minimalistic, privacy-friendly library for browser fingerprinting in nodejs\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/tinyfingerprint_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022505.0209706411\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACBklEQVRIia1Wy27jMAwcUi87SFMgQY655P+\/aU89FdtukMJwHElkD10T6WLbqEEIGLAkShqNZmiTqiquxPn4Cy9DQikCZgYzQ1WxXC6xWq2uTW8OEQE3ZXKPvuvgnIOqYhiGj25um\/6ToBaGDuMEzhNEBEQEIkKtFc45y6m1GnMPDw+fxlpDRNoA5SoI7v5s\/A+Qb0n88\/Ib4zhCVe0hImNkPhMzo5SCGKOxKfKhu91uByK6ulcTIGaG994AzBsBsHcigqoixmigACDnDO89xnHEYrG4DyARMQClFHjvUUqBcw61Vhub2wCsX1UNcEs0AVJVTNOEEAJyziilGCO1VnsvpWC73RqTImLO7Pv+foCYGSEEc45zDo+Pj3Z9s45mvcxtZjb25ty7AWJms7yI4PX1Fc45Y+FSRwCsLDjnEEKwvLsA6vseMcZPevDem7YumZidRkQ31aMmQMfjEcMwYL\/f\/2hxAMZYq6jbKvXhgNPpZMKNMZqYa61m95TSl2vEGK\/avrkwqiqen5\/tikII6PseXdehlIJpmjCOI7qu+zjlX61dnnW5XN6vDnnvsdlskFK66RtFRFYor+U1Aco5g4hwPp\/hvW9a\/DJSSt9e502A3t7eEELAer1uov7faJAqAMCLCHLOZtuvAOWcoao4HA54enpCSumT\/ReLxbf\/R9dET0QIIeAdmqdWoOSD4fwAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/tinyfingerprint_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022505.0209706411\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ea minimalistic, privacy-friendly library for browser fingerprinting in nodejs\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["fingerprint","server-side","javascript","nodejs","library","minimalistic"],"hasMore":false,"image":"https:\/\/avris.it\/image\/tinyfingerprint_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/tinyfingerprint_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/tinyfingerprint_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022126.25524266028\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ea minimalistic, privacy-friendly library for browser fingerprinting in nodejs\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/tinyfingerprint_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/tinyfingerprint_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022126.25524266028\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ea minimalistic, privacy-friendly library for browser fingerprinting in nodejs\u003C\/p\u003E","words":9,"readTime":null,"lang":"en"}}},"projects\/tinytranslator":{"key":"projects\/tinytranslator","type":"article","published":true,"meta":{"createdAt":"2023-05-16T17:52:22+02:00","publishedAt":"2023-05-16T17:52:22+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/tinytranslator.avris.it\/","displayUrl":null}],"category":"projects","subcategory":null,"slug":"tinytranslator"},"content":{"en":{"slug":"tinytranslator","title":"tinytranslator","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/tinytranslator_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022252.38895558223\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABiklEQVRIicWVwY7iMBBEX9uJnUTsICRu\/P9ncdrlhIRAgV0mibv3FLSH2aFBjKbObbu6ulwtZmbcweHnL\/4ITKVQ1zWqipmx2WwIIdw7\/hAqT9GP5ZIK43K5ICJM04SIvJwMgHgUOv5+J0zvmBlzedM0NE3zPYRGVeovUOMjuF457Pdst9uv5gI4FTqdTkzTRCmFGCOqSlVVpJRIKbkeCiEQY7xb5zK1mbHb7RARcs6sVitEhHEcGcfRRSilRNd1d+tcI0spsV6vSSnRNA1V5erjKbidOncoIjim\/DTcrZZSaNsWVWUYhhs5L7y1bkI5Z97e3h4i8QwhXzAej+z3e8yMnDOLxcL1Y\/7Fy00dQsDMGIYBVX2IzCNwj6zrOoZhAOB6vQIQY\/ye5SoitG1L13U3debl6iXkHbE7GM0MVUVEUFVCCNR17U7ql5r6cDjQ9z2llFsozsdijJgZKSVyzv+9w2vqSlUZx\/HTsCulcLlc6Pue5XLJ+Xy+7bM5wc3s5q2PMKv6GVJK\/AW+Ibv2Kw7IKwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/tinytranslator_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022252.38895558223\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ea minimalistic translator library\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/tinytranslator_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022504.77791116447\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABiklEQVRIicWVwY7iMBBEX9uJnUTsICRu\/P9ncdrlhIRAgV0mibv3FLSH2aFBjKbObbu6ulwtZmbcweHnL\/4ITKVQ1zWqipmx2WwIIdw7\/hAqT9GP5ZIK43K5ICJM04SIvJwMgHgUOv5+J0zvmBlzedM0NE3zPYRGVeovUOMjuF457Pdst9uv5gI4FTqdTkzTRCmFGCOqSlVVpJRIKbkeCiEQY7xb5zK1mbHb7RARcs6sVitEhHEcGcfRRSilRNd1d+tcI0spsV6vSSnRNA1V5erjKbidOncoIjim\/DTcrZZSaNsWVWUYhhs5L7y1bkI5Z97e3h4i8QwhXzAej+z3e8yMnDOLxcL1Y\/7Fy00dQsDMGIYBVX2IzCNwj6zrOoZhAOB6vQIQY\/ye5SoitG1L13U3debl6iXkHbE7GM0MVUVEUFVCCNR17U7ql5r6cDjQ9z2llFsozsdijJgZKSVyzv+9w2vqSlUZx\/HTsCulcLlc6Pue5XLJ+Xy+7bM5wc3s5q2PMKv6GVJK\/AW+Ibv2Kw7IKwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/tinytranslator_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022504.77791116447\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ea minimalistic translator library\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["translator","javascript","library","minimalistic"],"hasMore":false,"image":"https:\/\/avris.it\/image\/tinytranslator_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/tinytranslator_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/tinytranslator_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022126.19447779112\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ea minimalistic translator library\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/tinytranslator_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/tinytranslator_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022126.19447779112\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ea minimalistic translator library\u003C\/p\u003E","words":4,"readTime":null,"lang":"en"}}},"projects\/tinymarkdown":{"key":"projects\/tinymarkdown","type":"article","published":true,"meta":{"createdAt":"2023-05-16T16:52:28+02:00","publishedAt":"2023-05-16T16:52:28+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/tinymarkdown.avris.it\/","displayUrl":null}],"category":"projects","subcategory":null,"slug":"tinymarkdown"},"content":{"en":{"slug":"tinymarkdown","title":"tinymarkdown","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/tinymarkdown_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022251.53846153846\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB2UlEQVRIia2VXW+bMBSGH3+AATWNIrW9aO\/y\/3\/XtGiL0iwdxGDO2UUHWqZucVReCSEdsP34PcfHRlWVK\/ry7ZWh+4GKoKqICCEEHh4eqKrq2vCb5LP+UmF9f0\/XdQCICNZanHOLwgCYHIde24gZzqgqxhiMMagqqoq19n2iokEUjAHtf6KqlGVJ0zTLAw2iFNZcxCa4v\/WveK6yUvZ995W2bfHeIyIAjONIURSoKiEEhmHAe09KaXbOWov8rruXl5esFGc51LbtvHMRmd93d3efcuMjZTm03+\/puo7tdnsRH8cxeyFjzHIO7XY7TqcTfd9T1zXOOYqimNNU1\/VVp3ILPMuhpmlIKbFarS5c8f59+J\/twDk3n8AJchxHNptNzlJ5QDFGzuczxhhijDjnEBG893NxT6B1Xc+wU0Fba7PTmwUUQmC9XmdN+NHYqqrmfrUI0OFwoO97np+fb250tyoLuyxLvPfEGAHmGpmeJZV1yt7e3kgpAVAUBSklUkpzAdd1vdglm5Wy4\/FI13WICE9PT4QQKMsS5xxlWS4CchNQ0zTz7T51aWvt4unKBkopISKM44i1lpTSRSMMISwHpKoMw\/Df3cYYiTFireXx8fHD75+VMQbvPb8AVxwPhTUnZx0AAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/tinymarkdown_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022251.53846153846\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ea minimalistic library for inline markdown: 9 features \u2013 10 lines of code \u2013 0 dependencies\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/tinymarkdown_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022503.07692307692\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB2UlEQVRIia2VXW+bMBSGH3+AATWNIrW9aO\/y\/3\/XtGiL0iwdxGDO2UUHWqZucVReCSEdsP34PcfHRlWVK\/ry7ZWh+4GKoKqICCEEHh4eqKrq2vCb5LP+UmF9f0\/XdQCICNZanHOLwgCYHIde24gZzqgqxhiMMagqqoq19n2iokEUjAHtf6KqlGVJ0zTLAw2iFNZcxCa4v\/WveK6yUvZ995W2bfHeIyIAjONIURSoKiEEhmHAe09KaXbOWov8rruXl5esFGc51LbtvHMRmd93d3efcuMjZTm03+\/puo7tdnsRH8cxeyFjzHIO7XY7TqcTfd9T1zXOOYqimNNU1\/VVp3ILPMuhpmlIKbFarS5c8f59+J\/twDk3n8AJchxHNptNzlJ5QDFGzuczxhhijDjnEBG893NxT6B1Xc+wU0Fba7PTmwUUQmC9XmdN+NHYqqrmfrUI0OFwoO97np+fb250tyoLuyxLvPfEGAHmGpmeJZV1yt7e3kgpAVAUBSklUkpzAdd1vdglm5Wy4\/FI13WICE9PT4QQKMsS5xxlWS4CchNQ0zTz7T51aWvt4unKBkopISKM44i1lpTSRSMMISwHpKoMw\/Df3cYYiTFireXx8fHD75+VMQbvPb8AVxwPhTUnZx0AAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/tinymarkdown_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022503.07692307692\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ea minimalistic library for inline markdown: 9 features \u2013 10 lines of code \u2013 0 dependencies\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["markdown","inline","javascript","library","minimalistic"],"hasMore":false,"image":"https:\/\/avris.it\/image\/tinymarkdown_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/tinymarkdown_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/tinymarkdown_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022125.76923076923\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ea minimalistic library for inline markdown: 9 features \u2013 10 lines of code \u2013 0 dependencies\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/tinymarkdown_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/tinymarkdown_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022125.76923076923\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ea minimalistic library for inline markdown: 9 features \u2013 10 lines of code \u2013 0 dependencies\u003C\/p\u003E","words":11,"readTime":null,"lang":"en"}}},"projects\/callmebymygender":{"key":"projects\/callmebymygender","type":"article","published":true,"meta":{"createdAt":"2023-05-07T17:52:06+02:00","publishedAt":"2023-05-07T17:52:06+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/callmebymygender.top\/","displayUrl":null}],"category":"projects","subcategory":null,"slug":"callmebymygender"},"content":{"en":{"slug":"callmebymygender","title":"callmebymygender","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/callmebymygender_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022251.30590339893\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACdElEQVRIia2WS24TQRCGv37N2A4kgQgTCYQUpEgEdlFOwXHYcRROwAXYcgM2KMoSYbEgCZaJPU6M59FdLKwZ2XFm7Dx+ybI01V3z1aOrR3nvhRoppepMjTYAkVq3tbbBYIBucpokydKzoigqp+PxeME2nU4X\/u8i1ZShXq\/H8fExBwcHDIdDRqMRSZJwdHTE2dkZnasxyfk54\/GYRxsbXAwv6Ha7bLze593hYe1L6zKUZVkzkIgQQkBrXW2w1mKMIU1T4jgmz3OMMSilyPOcEAJZlrG1tXVrIFiRodFohPce5xwhhMqRMYYQAkVR0NYD4lYb23lV+5J1YVYCwax5RaRq4tKhiMwyJwFQsKLJHwyoCfS2WgUDYOejv64sy0jTFBFZKF2n00FrjTHmQWFEBLtqkfcerTVxHKO1RkQoigJjzNpA68CUUkVRCNxcgrJxRYQ4jqlb9xAw5bqVGYqiCBEhz3OstVX5AJxzs9mhFM65W0PcpAropl7q9\/vVLIqiiMlkQlEUbG5uYq1lOp3ivafb7d4LYn5vVbLqwR1Oz310PZClkjWduiaFENZap5RammmNQPNQk8mEk5MT2u02Ozs71SnTWqO1xlrL9vb2UuMDeJ\/z5\/cPursvyb3F2tlvZvO1wLVNLSK0Wi329vZqG1YpxXA4xDm3MAJCCFydf+X0+2fs+A3P3n5c2NdUhbXmUHl9wOzzwzlXRVnOo\/ICDiEw+vkJX0zZfTrExLskf3u0H79YCKxONoRQ3dJl1PMwZTnmo0rTFKUUkUow0XPSNK2GpYign7zn3+kXLvuXZNk3ostfuP0PeO+rwVoGUAaqtcY5x3+mZpWfWwDgJAAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/callmebymygender_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022251.30590339893\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ei\u0027m not \u201ca female\u201d \/ \u201ca male\u201d \/ \u201ca they\/them\u201d\u003C\/p\u003E\n\u003Cp\u003Eplease, just call me by my gender! \ud83d\ude44\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/callmebymygender_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022502.61180679785\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACdElEQVRIia2WS24TQRCGv37N2A4kgQgTCYQUpEgEdlFOwXHYcRROwAXYcgM2KMoSYbEgCZaJPU6M59FdLKwZ2XFm7Dx+ybI01V3z1aOrR3nvhRoppepMjTYAkVq3tbbBYIBucpokydKzoigqp+PxeME2nU4X\/u8i1ZShXq\/H8fExBwcHDIdDRqMRSZJwdHTE2dkZnasxyfk54\/GYRxsbXAwv6Ha7bLze593hYe1L6zKUZVkzkIgQQkBrXW2w1mKMIU1T4jgmz3OMMSilyPOcEAJZlrG1tXVrIFiRodFohPce5xwhhMqRMYYQAkVR0NYD4lYb23lV+5J1YVYCwax5RaRq4tKhiMwyJwFQsKLJHwyoCfS2WgUDYOejv64sy0jTFBFZKF2n00FrjTHmQWFEBLtqkfcerTVxHKO1RkQoigJjzNpA68CUUkVRCNxcgrJxRYQ4jqlb9xAw5bqVGYqiCBEhz3OstVX5AJxzs9mhFM65W0PcpAropl7q9\/vVLIqiiMlkQlEUbG5uYq1lOp3ivafb7d4LYn5vVbLqwR1Oz310PZClkjWduiaFENZap5RammmNQPNQk8mEk5MT2u02Ozs71SnTWqO1xlrL9vb2UuMDeJ\/z5\/cPursvyb3F2tlvZvO1wLVNLSK0Wi329vZqG1YpxXA4xDm3MAJCCFydf+X0+2fs+A3P3n5c2NdUhbXmUHl9wOzzwzlXRVnOo\/ICDiEw+vkJX0zZfTrExLskf3u0H79YCKxONoRQ3dJl1PMwZTnmo0rTFKUUkUow0XPSNK2GpYign7zn3+kXLvuXZNk3ostfuP0PeO+rwVoGUAaqtcY5x3+mZpWfWwDgJAAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/callmebymygender_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022502.61180679785\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ei\u0027m not \u201ca female\u201d \/ \u201ca male\u201d \/ \u201ca they\/them\u201d\u003C\/p\u003E\n\u003Cp\u003Eplease, just call me by my gender! \ud83d\ude44\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["gender","language","vue"],"hasMore":false,"image":"https:\/\/avris.it\/image\/callmebymygender_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/callmebymygender_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/callmebymygender_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022125.65295169946\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ei\u0027m not \u201ca female\u201d \/ \u201ca male\u201d \/ \u201ca they\/them\u201d\u003C\/p\u003E\n\u003Cp\u003Eplease, just call me by my gender! \ud83d\ude44\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/callmebymygender_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/callmebymygender_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022125.65295169946\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003Ei\u0027m not \u201ca female\u201d \/ \u201ca male\u201d \/ \u201ca they\/them\u201d\u003C\/p\u003E\n\u003Cp\u003Eplease, just call me by my gender! \ud83d\ude44\u003C\/p\u003E","words":16,"readTime":null,"lang":"en"}}},"projects\/isjp":{"key":"projects\/isjp","type":"article","published":true,"meta":{"createdAt":"2022-12-24T17:52:12+02:00","publishedAt":"2022-12-24T17:52:12+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/isjp.pl","displayUrl":null}],"category":"projects","subcategory":null,"slug":"isjp"},"content":{"pl":{"slug":"isjp","title":"Inkluzywny S\u0142ownik J\u0119zyka Polskiego","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/isjp_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022240\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADoklEQVRIiaWWwU4cRxCGv6qeZYAFbCwFyOSAiZGl+OJIPmD5HksxygM5ueQlckki+eKQB4iUF8gFBzmXyIoMIhJG2FJgD2zWuztMd1cOOzOZXYMScEulmenumf76r6qukdnZWXPOoao4VVQVdQ4VwQDMAAghYGYjK\/tDjMQYiSEQYiSEUM+7akucczhVnHMjkAZYtXD1+QoIkdE1BERk7INmRgjh6kDagKngqr4xiPKeEijGCICUFgADnCpmVo9fGsiVLnJNoAZY0wVmhogQzah0UZHRHEDNMFX0fYCabqpcV8eUc4gqsXJB6R4pXaUx4ktgNUNViapIjEjl1ssCtZKkjp2mUp\/cucOtj2+xs\/Mr\/X6fjfv3OTk+4flvz0fxFSPe+5EaqmiMqMiYhasAiQiJcyQVmAifPXzI4y+\/QkTodrv0+31WVlYA+P67b\/nh6VMCoKrMz8zgvef09BQRqY1GsIsI7XabXq83tvjc3Nw7fQlQZ5FTpdVq8Whzs86ehYUFFhYW6hcePdrkx60tbt68SZZlZFlG7+1b9nZ3aU1Nkec57Xab4XCI9579\/X3u3btHmqa8efOGxcVFjo+PybKMNE158uTJmGsTRGgmrpnROelcKGmn00FE+Ov4mDzPOTo6IsRInud470nTlBcvXnDt2jXMjH6\/z\/b2NgDT09McHBzQ6\/XodDqj2CsTp1YzyzJrJQlJkpC0WrSShNvpDI\/nP0DOAfrm7xOeDXosLS0hqpzlOXmes7q6yu7eHt1ul42NDXZ2dlhfXyfGyOvXr+l2u7TbbQaDAYeHhxdu2M3PzX2tE6l+ipGocjuZGpu8XQz5qX+K956l5WU+vXsXVWV5eZm5+Xk+yjIOXr1iOByytrbGjRs3uH79OmbG2toaDx48IE1TXr58eSGQfLiyYkmlUGmtVot0aoovpuf5PJlBgF+KAVuDLmfB472nKApCjAz6fVSVwWCADwHvfW2TJ\/Z5QTzZkmhGbTHWAeZD4Gc\/4PdYkPjAH2eDuiyEcl4sz6P87Ozf98ux886g\/4IZATUKpDmHmeG9R0QovOdPKwghUBQFwFgRDTFiUGeklRu7COj\/tBrInCOGgC+rvDqHFQVWjocQagVroBCIjf6q2cTzpYGsXFAYnUkC+KJAyhP5HVc1VZoAizES3+f3I5b1aLQ1w5mN\/oXKQlrJH2McAZULxgmg0FDxqoUVIAne1w9NmVW1ruyUUFXlr4EmlKqUe5\/2Dy7pszqmLJjRAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/isjp_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022240\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EEksperymentalny inkluzywny s\u0142ownik sprawdzania pisowni j\u0119zyka polskiego\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/isjp_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022480\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADoklEQVRIiaWWwU4cRxCGv6qeZYAFbCwFyOSAiZGl+OJIPmD5HksxygM5ueQlckki+eKQB4iUF8gFBzmXyIoMIhJG2FJgD2zWuztMd1cOOzOZXYMScEulmenumf76r6qukdnZWXPOoao4VVQVdQ4VwQDMAAghYGYjK\/tDjMQYiSEQYiSEUM+7akucczhVnHMjkAZYtXD1+QoIkdE1BERk7INmRgjh6kDagKngqr4xiPKeEijGCICUFgADnCpmVo9fGsiVLnJNoAZY0wVmhogQzah0UZHRHEDNMFX0fYCabqpcV8eUc4gqsXJB6R4pXaUx4ktgNUNViapIjEjl1ssCtZKkjp2mUp\/cucOtj2+xs\/Mr\/X6fjfv3OTk+4flvz0fxFSPe+5EaqmiMqMiYhasAiQiJcyQVmAifPXzI4y+\/QkTodrv0+31WVlYA+P67b\/nh6VMCoKrMz8zgvef09BQRqY1GsIsI7XabXq83tvjc3Nw7fQlQZ5FTpdVq8Whzs86ehYUFFhYW6hcePdrkx60tbt68SZZlZFlG7+1b9nZ3aU1Nkec57Xab4XCI9579\/X3u3btHmqa8efOGxcVFjo+PybKMNE158uTJmGsTRGgmrpnROelcKGmn00FE+Ov4mDzPOTo6IsRInud470nTlBcvXnDt2jXMjH6\/z\/b2NgDT09McHBzQ6\/XodDqj2CsTp1YzyzJrJQlJkpC0WrSShNvpDI\/nP0DOAfrm7xOeDXosLS0hqpzlOXmes7q6yu7eHt1ul42NDXZ2dlhfXyfGyOvXr+l2u7TbbQaDAYeHhxdu2M3PzX2tE6l+ipGocjuZGpu8XQz5qX+K956l5WU+vXsXVWV5eZm5+Xk+yjIOXr1iOByytrbGjRs3uH79OmbG2toaDx48IE1TXr58eSGQfLiyYkmlUGmtVot0aoovpuf5PJlBgF+KAVuDLmfB472nKApCjAz6fVSVwWCADwHvfW2TJ\/Z5QTzZkmhGbTHWAeZD4Gc\/4PdYkPjAH2eDuiyEcl4sz6P87Ozf98ux886g\/4IZATUKpDmHmeG9R0QovOdPKwghUBQFwFgRDTFiUGeklRu7COj\/tBrInCOGgC+rvDqHFQVWjocQagVroBCIjf6q2cTzpYGsXFAYnUkC+KJAyhP5HVc1VZoAizES3+f3I5b1aLQ1w5mN\/oXKQlrJH2McAZULxgmg0FDxqoUVIAne1w9NmVW1ruyUUFXlr4EmlKqUe5\/2Dy7pszqmLJjRAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/isjp_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022480\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EEksperymentalny inkluzywny s\u0142ownik sprawdzania pisowni j\u0119zyka polskiego\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["j\u0119zyk","polski","inkluzywny","sprawdzanie pisowni","autokorekta","python"],"hasMore":false,"image":"https:\/\/avris.it\/image\/isjp_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/isjp_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/isjp_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022120\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EEksperymentalny inkluzywny s\u0142ownik sprawdzania pisowni j\u0119zyka polskiego\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/isjp_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/isjp_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022120\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EEksperymentalny inkluzywny s\u0142ownik sprawdzania pisowni j\u0119zyka polskiego\u003C\/p\u003E","words":9,"readTime":null,"lang":"pl"},"en":{"slug":"isjp-en","title":"Inclusive Dictionary of the Polish Language","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/isjp_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022240\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADoklEQVRIiaWWwU4cRxCGv6qeZYAFbCwFyOSAiZGl+OJIPmD5HksxygM5ueQlckki+eKQB4iUF8gFBzmXyIoMIhJG2FJgD2zWuztMd1cOOzOZXYMScEulmenumf76r6qukdnZWXPOoao4VVQVdQ4VwQDMAAghYGYjK\/tDjMQYiSEQYiSEUM+7akucczhVnHMjkAZYtXD1+QoIkdE1BERk7INmRgjh6kDagKngqr4xiPKeEijGCICUFgADnCpmVo9fGsiVLnJNoAZY0wVmhogQzah0UZHRHEDNMFX0fYCabqpcV8eUc4gqsXJB6R4pXaUx4ktgNUNViapIjEjl1ssCtZKkjp2mUp\/cucOtj2+xs\/Mr\/X6fjfv3OTk+4flvz0fxFSPe+5EaqmiMqMiYhasAiQiJcyQVmAifPXzI4y+\/QkTodrv0+31WVlYA+P67b\/nh6VMCoKrMz8zgvef09BQRqY1GsIsI7XabXq83tvjc3Nw7fQlQZ5FTpdVq8Whzs86ehYUFFhYW6hcePdrkx60tbt68SZZlZFlG7+1b9nZ3aU1Nkec57Xab4XCI9579\/X3u3btHmqa8efOGxcVFjo+PybKMNE158uTJmGsTRGgmrpnROelcKGmn00FE+Ov4mDzPOTo6IsRInud470nTlBcvXnDt2jXMjH6\/z\/b2NgDT09McHBzQ6\/XodDqj2CsTp1YzyzJrJQlJkpC0WrSShNvpDI\/nP0DOAfrm7xOeDXosLS0hqpzlOXmes7q6yu7eHt1ul42NDXZ2dlhfXyfGyOvXr+l2u7TbbQaDAYeHhxdu2M3PzX2tE6l+ipGocjuZGpu8XQz5qX+K956l5WU+vXsXVWV5eZm5+Xk+yjIOXr1iOByytrbGjRs3uH79OmbG2toaDx48IE1TXr58eSGQfLiyYkmlUGmtVot0aoovpuf5PJlBgF+KAVuDLmfB472nKApCjAz6fVSVwWCADwHvfW2TJ\/Z5QTzZkmhGbTHWAeZD4Gc\/4PdYkPjAH2eDuiyEcl4sz6P87Ozf98ux886g\/4IZATUKpDmHmeG9R0QovOdPKwghUBQFwFgRDTFiUGeklRu7COj\/tBrInCOGgC+rvDqHFQVWjocQagVroBCIjf6q2cTzpYGsXFAYnUkC+KJAyhP5HVc1VZoAizES3+f3I5b1aLQ1w5mN\/oXKQlrJH2McAZULxgmg0FDxqoUVIAne1w9NmVW1ruyUUFXlr4EmlKqUe5\/2Dy7pszqmLJjRAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/isjp_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022240\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EAn experimental, inclusive spellchecker dictionary for Polish.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/isjp_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022480\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADoklEQVRIiaWWwU4cRxCGv6qeZYAFbCwFyOSAiZGl+OJIPmD5HksxygM5ueQlckki+eKQB4iUF8gFBzmXyIoMIhJG2FJgD2zWuztMd1cOOzOZXYMScEulmenumf76r6qukdnZWXPOoao4VVQVdQ4VwQDMAAghYGYjK\/tDjMQYiSEQYiSEUM+7akucczhVnHMjkAZYtXD1+QoIkdE1BERk7INmRgjh6kDagKngqr4xiPKeEijGCICUFgADnCpmVo9fGsiVLnJNoAZY0wVmhogQzah0UZHRHEDNMFX0fYCabqpcV8eUc4gqsXJB6R4pXaUx4ktgNUNViapIjEjl1ssCtZKkjp2mUp\/cucOtj2+xs\/Mr\/X6fjfv3OTk+4flvz0fxFSPe+5EaqmiMqMiYhasAiQiJcyQVmAifPXzI4y+\/QkTodrv0+31WVlYA+P67b\/nh6VMCoKrMz8zgvef09BQRqY1GsIsI7XabXq83tvjc3Nw7fQlQZ5FTpdVq8Whzs86ehYUFFhYW6hcePdrkx60tbt68SZZlZFlG7+1b9nZ3aU1Nkec57Xab4XCI9579\/X3u3btHmqa8efOGxcVFjo+PybKMNE158uTJmGsTRGgmrpnROelcKGmn00FE+Ov4mDzPOTo6IsRInud470nTlBcvXnDt2jXMjH6\/z\/b2NgDT09McHBzQ6\/XodDqj2CsTp1YzyzJrJQlJkpC0WrSShNvpDI\/nP0DOAfrm7xOeDXosLS0hqpzlOXmes7q6yu7eHt1ul42NDXZ2dlhfXyfGyOvXr+l2u7TbbQaDAYeHhxdu2M3PzX2tE6l+ipGocjuZGpu8XQz5qX+K956l5WU+vXsXVWV5eZm5+Xk+yjIOXr1iOByytrbGjRs3uH79OmbG2toaDx48IE1TXr58eSGQfLiyYkmlUGmtVot0aoovpuf5PJlBgF+KAVuDLmfB472nKApCjAz6fVSVwWCADwHvfW2TJ\/Z5QTzZkmhGbTHWAeZD4Gc\/4PdYkPjAH2eDuiyEcl4sz6P87Ozf98ux886g\/4IZATUKpDmHmeG9R0QovOdPKwghUBQFwFgRDTFiUGeklRu7COj\/tBrInCOGgC+rvDqHFQVWjocQagVroBCIjf6q2cTzpYGsXFAYnUkC+KJAyhP5HVc1VZoAizES3+f3I5b1aLQ1w5mN\/oXKQlrJH2McAZULxgmg0FDxqoUVIAne1w9NmVW1ruyUUFXlr4EmlKqUe5\/2Dy7pszqmLJjRAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/isjp_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022480\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EAn experimental, inclusive spellchecker dictionary for Polish.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["langauge","polish","pronouns","inclusive","python","spellcheck"],"hasMore":false,"image":"https:\/\/avris.it\/image\/isjp_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/isjp_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/isjp_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022120\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EAn experimental, inclusive spellchecker dictionary for Polish.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/isjp_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/isjp_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022120\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EAn experimental, inclusive spellchecker dictionary for Polish.\u003C\/p\u003E","words":7,"readTime":null,"lang":"en"}}},"projects\/code-doodle-gradient-progress-bar":{"key":"projects\/code-doodle-gradient-progress-bar","type":"article","published":true,"meta":{"createdAt":"2022-01-02T15:32:29+01:00","publishedAt":"2022-01-02T15:32:29+01:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/progressbar.avris.it","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/ProgressBar","displayUrl":null}],"category":"projects","subcategory":null,"slug":"code-doodle-gradient-progress-bar"},"content":{"en":{"slug":"code-doodle-gradient-progress-bar","title":"Code Doodle: a gradient progress bar","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-progress-bar_small.png\u0022 alt=\u0022Screenshot of the visual effect: a number of progress bar with increasing values, and their colour gradually changes from red to yellow to green\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022240\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADJklEQVRIibWWT0\/jVhTFf++P7SR2SJygiSGtVFBQqDKbqhJSRSWWVN1WfEU+Aiu6oGqrqk0W1QCaVIzIVChlqoY2JE3s2Im7YPCQIZPJMNOzee8+nWefe8+7zxbh6ZM4On\/GojC\/+BLpFhfmvyt091kTfv4OQ4jFNtQeI90icRwjXu6J4xhgKhZCPIij09UqflpjabWQIJl3k4ffjre4Gz+Uo4cvzvn76Q\/4WpGz3i5Kbz5G5goLiX8IdLr8MfA5AMKQKDnfOmFn72X9QQWNgg793jkAQykoOBo57zxN\/MTzg4MDtNaMRiOKxSKNRoONjQ22trbY39\/HdV0ymQwrKysANBoNrq6u2N3dJQgCarUarutOCzJzeexyOVmItCQ9zzrTBG58V+qGd3p6yng8xvM8Dg8PqVQqaK1RSnF8fEyr1aJQKNButymVShwdHbG2tkatVps67HEcI3ovfoz\/vXoy9c6sbWAacqYeVfgKjEdvFgxEUUS\/3yefzwMQhiGGYczdcwstLYV0psm+FFhZg5nOKZlkc3JyQq\/XI5vN0ul0CIKAbreLaZqkUikuLi5YX1\/n7OyMvb09crnc29s+Nk3ijD2dIdCLJZm0vp+BkAhuSuw4Do7jMBgM8H2farVKt9slDEOKxSKe51EqlVhdXQVe3UF356+viT+vv487vV9nli\/nmpjWtHVL4msM4QHQ7\/cJggApJVEUEUURmUwG3\/exLIswDAEYDAY4jsNwOMS27aRSMyskjTyG\/dFMQcORAGu6SjFWchDr9TqXl5dorbFtm1arhed5jMdjBoMBUkrK5TKpVIput0u9XmdnZ4ft7e1EwN0RQPz2z7fx79f1mYIAzLTCcc0k3pDf4IgbC9rtNsvLy0nrN5tNNjc3kVIymUySzJVSRFHEeDzGsqykO2dB\/DFsxn8Fz99IADBSCvWy68riM1IszeW\/D3Q7OOfp9U9zSaIvsJctpBIUVIW0yP1\/gh5Z60yy97vpdchQYGiFRRbg3oX2oea6HTzn5PqXhdRbSwZerkImfmXZrK\/3+8y1q0p8Yn+6kCDGYEQWwlg843f9H\/oPQE+Gnfb7BO8AAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-progress-bar_small.png\u0022 alt=\u0022Screenshot of the visual effect: a number of progress bar with increasing values, and their colour gradually changes from red to yellow to green\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022240\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA simple doodling project \u2013 probably not that useful, but I enjoyed creating it \ud83e\udd37\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-progress-bar_big.png\u0022 alt=\u0022Screenshot of the visual effect: a number of progress bar with increasing values, and their colour gradually changes from red to yellow to green\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022480\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADJklEQVRIibWWT0\/jVhTFf++P7SR2SJygiSGtVFBQqDKbqhJSRSWWVN1WfEU+Aiu6oGqrqk0W1QCaVIzIVChlqoY2JE3s2Im7YPCQIZPJMNOzee8+nWefe8+7zxbh6ZM4On\/GojC\/+BLpFhfmvyt091kTfv4OQ4jFNtQeI90icRwjXu6J4xhgKhZCPIij09UqflpjabWQIJl3k4ffjre4Gz+Uo4cvzvn76Q\/4WpGz3i5Kbz5G5goLiX8IdLr8MfA5AMKQKDnfOmFn72X9QQWNgg793jkAQykoOBo57zxN\/MTzg4MDtNaMRiOKxSKNRoONjQ22trbY39\/HdV0ymQwrKysANBoNrq6u2N3dJQgCarUarutOCzJzeexyOVmItCQ9zzrTBG58V+qGd3p6yng8xvM8Dg8PqVQqaK1RSnF8fEyr1aJQKNButymVShwdHbG2tkatVps67HEcI3ovfoz\/vXoy9c6sbWAacqYeVfgKjEdvFgxEUUS\/3yefzwMQhiGGYczdcwstLYV0psm+FFhZg5nOKZlkc3JyQq\/XI5vN0ul0CIKAbreLaZqkUikuLi5YX1\/n7OyMvb09crnc29s+Nk3ijD2dIdCLJZm0vp+BkAhuSuw4Do7jMBgM8H2farVKt9slDEOKxSKe51EqlVhdXQVe3UF356+viT+vv487vV9nli\/nmpjWtHVL4msM4QHQ7\/cJggApJVEUEUURmUwG3\/exLIswDAEYDAY4jsNwOMS27aRSMyskjTyG\/dFMQcORAGu6SjFWchDr9TqXl5dorbFtm1arhed5jMdjBoMBUkrK5TKpVIput0u9XmdnZ4ft7e1EwN0RQPz2z7fx79f1mYIAzLTCcc0k3pDf4IgbC9rtNsvLy0nrN5tNNjc3kVIymUySzJVSRFHEeDzGsqykO2dB\/DFsxn8Fz99IADBSCvWy68riM1IszeW\/D3Q7OOfp9U9zSaIvsJctpBIUVIW0yP1\/gh5Z60yy97vpdchQYGiFRRbg3oX2oea6HTzn5PqXhdRbSwZerkImfmXZrK\/3+8y1q0p8Yn+6kCDGYEQWwlg843f9H\/oPQE+Gnfb7BO8AAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-progress-bar_big.png\u0022 alt=\u0022Screenshot of the visual effect: a number of progress bar with increasing values, and their colour gradually changes from red to yellow to green\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022480\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA simple doodling project \u2013 probably not that useful, but I enjoyed creating it \ud83e\udd37\u003C\/p\u003E\n\u003Cp\u003EI liked the way Wendover Productions displayed the HDI score in their video\n\u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=W3qZIPiWKc4\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E \u201eThe News You Missed in 2021\u201d\u003C\/a\u003E,\nso of course I decided to create a widget like this for VueJS \ud83d\ude05\u003C\/p\u003E\n\u003Cp\u003EHere\u0027s a demo:\u003C\/p\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/progressbar.avris.it\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022 class=\u0022btn btn-primary btn-lg d-block\u0022\u003E\nDemo\n\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003EAnd here\u0027s how I made it:\u003C\/p\u003E\n\u003Cp\u003ETo minimise the initial bootsrapping, I picked a framework I already know and absolutely love:\n\u003Ca href=\u0022https:\/\/v3.nuxtjs.org\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Nuxt\u003C\/a\u003E.\nIts upcoming version, v3, cuts all the bootstrapping crap to the minimum, while remaining highly flexible.\nAll I had to do to start working were those commands:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs bash border\u0022\u003Enpx nuxi init ProgressBar\n\u003Cspan class=\u0022hljs-built_in\u0022\u003Ecd\u003C\/span\u003E ProgressBar\nyarn\nyarn dev -o\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EWhat they do is fetch a project template, install dependencies, start a development server\nand open \u003Ccode\u003Ehttp:\/\/localhost:3000\/\u003C\/code\u003E in the browser.\u003C\/p\u003E\n\u003Cdiv class=\u0022alert alert-warning\u0022\u003E\n Watch out: it\u0027s not the best idea to use v3 yet, this version is not stable!\n I did, because I like experimenting and I want to see where the project is going,\n but I had to pay the price (in this case: inability to generate a static website on production,\n and a weird issue with including stylesheets that I made \u003Ca href=\u0022https:\/\/gitlab.com\/Avris\/ProgressBar\/-\/blob\/main\/app.vue#L117\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E an ugly workaround for\u003C\/a\u003E).\n\u003C\/div\u003E\n\u003Cp\u003EBootrapping done; now I can focus on work. It\u0027s a simple project, so only two files will be relevant:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003Eapp.vue\u003C\/code\u003E is the main entrypoint, the homepage.\nIt contains what you see in the demo: just some introduction and lots of \u003Ccode\u003E\u0026lt;AvrisProgressBar\/\u0026gt;\u003C\/code\u003E components\nembedded to showcase their usage.\nI won\u0027t focus here on the \u003Ccode\u003Eapp.vue\u003C\/code\u003E code, because it\u0027s really straightforward \u2013\nyou can check it out \u003Ca href=\u0022https:\/\/gitlab.com\/Avris\/ProgressBar\/-\/blob\/main\/app.vue\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E here\u003C\/a\u003E.\nSidenote: if I ever need to add multiple pages, I\u0027ll just create a \u003Ccode\u003Eroutes\u003C\/code\u003E directory\nand move \u003Ccode\u003Eapp.vue\u003C\/code\u003E to the appropriate structure inside of that folder, it\u0027s as simple as that! \u2013\nand for the simplest case it\u0027s all already preconfigured and working!\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003Ecomponents\/AvrisProgressBar.vue\u003C\/code\u003E is the actual component I\u0027ll be working on.\nNuxt automatically configures everything so that throughout the application\nyou can simply use the \u003Ccode\u003E\u0026lt;AvrisProgressBar\/\u0026gt;\u003C\/code\u003E tag.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EThe template is really simple:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs xml border\u0022\u003E\u003Cspan class=\u0022hljs-tag\u0022\u003E\u0026lt;\u003Cspan class=\u0022hljs-name\u0022\u003Etemplate\u003C\/span\u003E\u0026gt;\u003C\/span\u003E\n \u003Cspan class=\u0022hljs-tag\u0022\u003E\u0026lt;\u003Cspan class=\u0022hljs-name\u0022\u003Ediv\u003C\/span\u003E \u003Cspan class=\u0022hljs-attr\u0022\u003Eclass\u003C\/span\u003E=\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022outer\u0022\u003C\/span\u003E \u003Cspan class=\u0022hljs-attr\u0022\u003E:style\u003C\/span\u003E=\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022`background-color: ${colourOuter}`\u0022\u003C\/span\u003E\u0026gt;\u003C\/span\u003E\n \u003Cspan class=\u0022hljs-tag\u0022\u003E\u0026lt;\u003Cspan class=\u0022hljs-name\u0022\u003Ediv\u003C\/span\u003E \u003Cspan class=\u0022hljs-attr\u0022\u003Eclass\u003C\/span\u003E=\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022inner\u0022\u003C\/span\u003E \u003Cspan class=\u0022hljs-attr\u0022\u003E:style\u003C\/span\u003E=\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022`width: ${percent}%; background-color: ${colourInner}`\u0022\u003C\/span\u003E\n \u003Cspan class=\u0022hljs-attr\u0022\u003Erole\u003C\/span\u003E=\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022progressbar\u0022\u003C\/span\u003E \u003Cspan class=\u0022hljs-attr\u0022\u003E:aria-valuenow\u003C\/span\u003E=\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022percent\u0022\u003C\/span\u003E \u003Cspan class=\u0022hljs-attr\u0022\u003Earia-valuemin\u003C\/span\u003E=\u003Cspan class=\u0022hljs-string\u0022\u003E\u00220\u0022\u003C\/span\u003E \u003Cspan class=\u0022hljs-attr\u0022\u003Earia-valuemax\u003C\/span\u003E=\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022100\u0022\u003C\/span\u003E\u0026gt;\u003C\/span\u003E\u003Cspan class=\u0022hljs-tag\u0022\u003E\u0026lt;\/\u003Cspan class=\u0022hljs-name\u0022\u003Ediv\u003C\/span\u003E\u0026gt;\u003C\/span\u003E\n \u003Cspan class=\u0022hljs-tag\u0022\u003E\u0026lt;\/\u003Cspan class=\u0022hljs-name\u0022\u003Ediv\u003C\/span\u003E\u0026gt;\u003C\/span\u003E\n\u003Cspan class=\u0022hljs-tag\u0022\u003E\u0026lt;\/\u003Cspan class=\u0022hljs-name\u0022\u003Etemplate\u003C\/span\u003E\u0026gt;\u003C\/span\u003E\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAll we need is two divs:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003Ethe outer one, taking a full width of the container\nand coloured with the \u201emain\u201d colour depending on the value of the progress bar,\u003C\/li\u003E\n\u003Cli\u003Ethe inner one, taking a fraction of the outer div\u0027s width proportional to the progress bar\u0027s value\nand coloured with a shade slightly darker than the \u201emain\u201d colour.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EAnd here\u0027s how I styled them:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs css border\u0022\u003E\u0026lt;\u003Cspan class=\u0022hljs-selector-tag\u0022\u003Estyle\u003C\/span\u003E \u003Cspan class=\u0022hljs-selector-tag\u0022\u003Escoped\u003C\/span\u003E\u0026gt;\n\u003Cspan class=\u0022hljs-selector-class\u0022\u003E.outer\u003C\/span\u003E {\n \u003Cspan class=\u0022hljs-attribute\u0022\u003E--apb-height\u003C\/span\u003E: \u003Cspan class=\u0022hljs-number\u0022\u003E16px\u003C\/span\u003E;\n \u003Cspan class=\u0022hljs-attribute\u0022\u003E--apb-border-width\u003C\/span\u003E: \u003Cspan class=\u0022hljs-number\u0022\u003E0px\u003C\/span\u003E;\n \u003Cspan class=\u0022hljs-attribute\u0022\u003E--apb-border-color\u003C\/span\u003E: \u003Cspan class=\u0022hljs-number\u0022\u003E#aaa\u003C\/span\u003E;\n}\n\n\u003Cspan class=\u0022hljs-selector-class\u0022\u003E.outer\u003C\/span\u003E {\n \u003Cspan class=\u0022hljs-attribute\u0022\u003Ewidth\u003C\/span\u003E: \u003Cspan class=\u0022hljs-number\u0022\u003E100%\u003C\/span\u003E;\n \u003Cspan class=\u0022hljs-attribute\u0022\u003Eborder-radius\u003C\/span\u003E: \u003Cspan class=\u0022hljs-built_in\u0022\u003Ecalc\u003C\/span\u003E(var(--apb-height) \/ \u003Cspan class=\u0022hljs-number\u0022\u003E2\u003C\/span\u003E);\n \u003Cspan class=\u0022hljs-attribute\u0022\u003Eheight\u003C\/span\u003E: \u003Cspan class=\u0022hljs-built_in\u0022\u003Evar\u003C\/span\u003E(--apb-height);\n \u003Cspan class=\u0022hljs-attribute\u0022\u003Emargin\u003C\/span\u003E: \u003Cspan class=\u0022hljs-number\u0022\u003E4px\u003C\/span\u003E;\n \u003Cspan class=\u0022hljs-attribute\u0022\u003Epadding\u003C\/span\u003E: \u003Cspan class=\u0022hljs-built_in\u0022\u003Ecalc\u003C\/span\u003E(var(--apb-height) \/ \u003Cspan class=\u0022hljs-number\u0022\u003E4\u003C\/span\u003E - \u003Cspan class=\u0022hljs-built_in\u0022\u003Evar\u003C\/span\u003E(--apb-border-width));\n \u003Cspan class=\u0022hljs-attribute\u0022\u003Edisplay\u003C\/span\u003E: inline-block;\n \u003Cspan class=\u0022hljs-attribute\u0022\u003Eborder\u003C\/span\u003E: \u003Cspan class=\u0022hljs-built_in\u0022\u003Evar\u003C\/span\u003E(--apb-border-width) solid \u003Cspan class=\u0022hljs-built_in\u0022\u003Evar\u003C\/span\u003E(--apb-border-color);\n}\n\u003Cspan class=\u0022hljs-selector-class\u0022\u003E.outer\u003C\/span\u003E \u003Cspan class=\u0022hljs-selector-class\u0022\u003E.inner\u003C\/span\u003E {\n \u003Cspan class=\u0022hljs-attribute\u0022\u003Eheight\u003C\/span\u003E: \u003Cspan class=\u0022hljs-built_in\u0022\u003Ecalc\u003C\/span\u003E(var(--apb-height) \/ \u003Cspan class=\u0022hljs-number\u0022\u003E2\u003C\/span\u003E);\n \u003Cspan class=\u0022hljs-attribute\u0022\u003Eborder-radius\u003C\/span\u003E: \u003Cspan class=\u0022hljs-built_in\u0022\u003Ecalc\u003C\/span\u003E(var(--apb-height) \/ \u003Cspan class=\u0022hljs-number\u0022\u003E2\u003C\/span\u003E);\n}\n\u0026lt;\/\u003Cspan class=\u0022hljs-selector-tag\u0022\u003Estyle\u003C\/span\u003E\u0026gt;\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EI used CSS variables so that each usage of this widget can override the default height and border.\u003C\/p\u003E\n\u003Cp\u003ENow all we need to do is calculate \u003Ccode\u003Epercent\u003C\/code\u003E, \u003Ccode\u003EcolourOuter\u003C\/code\u003E and \u003Ccode\u003EcolourInner\u003C\/code\u003E. Easy!\u003C\/p\u003E\n\u003Cp\u003ELet\u0027s start with declaring \u003Ccode\u003Eprops\u003C\/code\u003E of our component:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs xml border\u0022\u003E\u003Cspan class=\u0022hljs-tag\u0022\u003E\u0026lt;\u003Cspan class=\u0022hljs-name\u0022\u003Escript\u003C\/span\u003E\u0026gt;\u003C\/span\u003E\u003Cspan class=\u0022javascript\u0022\u003E\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Eexport\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Edefault\u003C\/span\u003E {\n \u003Cspan class=\u0022hljs-attr\u0022\u003Eprops\u003C\/span\u003E: {\n \u003Cspan class=\u0022hljs-attr\u0022\u003Evalue\u003C\/span\u003E: { \u003Cspan class=\u0022hljs-attr\u0022\u003Erequired\u003C\/span\u003E: \u003Cspan class=\u0022hljs-literal\u0022\u003Etrue\u003C\/span\u003E },\n \u003Cspan class=\u0022hljs-attr\u0022\u003Emin\u003C\/span\u003E: { \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027default\u0027\u003C\/span\u003E: \u003Cspan class=\u0022hljs-number\u0022\u003E0\u003C\/span\u003E },\n \u003Cspan class=\u0022hljs-attr\u0022\u003Emax\u003C\/span\u003E: { \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027default\u0027\u003C\/span\u003E: \u003Cspan class=\u0022hljs-number\u0022\u003E1000\u003C\/span\u003E },\n \u003Cspan class=\u0022hljs-attr\u0022\u003Ecolours\u003C\/span\u003E: { \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027default\u0027\u003C\/span\u003E: \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E =\u0026gt;\u003C\/span\u003E {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027#ff0000\u0027\u003C\/span\u003E,\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027#ffff00\u0027\u003C\/span\u003E,\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027#00ff00\u0027\u003C\/span\u003E,\n ];\n }}\n },\n};\n\u003C\/span\u003E\u003Cspan class=\u0022hljs-tag\u0022\u003E\u0026lt;\/\u003Cspan class=\u0022hljs-name\u0022\u003Escript\u003C\/span\u003E\u0026gt;\u003C\/span\u003E\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EWe expect the user of our widget to provide a value (eg. \u003Ccode\u003E\u0026lt;AvrisProgressBar :value=\u0022123\u0022\/\u0026gt;\u003C\/code\u003E)\nand we allow them to overwrite the default values of \u003Ccode\u003Emin\u003C\/code\u003E (0), \u003Ccode\u003Emax\u003C\/code\u003E (1000) and \u003Ccode\u003Ecolours\u003C\/code\u003E (red, yellow, green)\nwith their own (eg. \u003Ccode\u003E\u0026lt;AvrisProgressBar :value=\u002269\u0022 :min=\u002224\u0022 :max=\u0022169\u0022\/\u0026gt;\u003C\/code\u003E).\u003C\/p\u003E\n\u003Cp\u003ENow let\u0027s calculate the \u003Ccode\u003Epercent\u003C\/code\u003E.\nIt\u0027s pretty simple: we divide the current progress by the full range, and multiply by 100%.\nIf \u003Ccode\u003Emin == 0\u003C\/code\u003E, the formula is trivial: \u003Ccode\u003E100% * value \/ max\u003C\/code\u003E.\nBut in any other case we should add the \u003Ccode\u003Emin\u003C\/code\u003E to the formula:\n\u003Ccode\u003E100% * (value - min) \/ (max - min)\u003C\/code\u003E.\nPlus let\u0027s cut it at no less than 0 and no more than 100, just in case the user provides some weird input.\nHere\u0027s a Vue code that implements that:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs javascript border\u0022\u003Ecomputed: {\n percent() {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Elet\u003C\/span\u003E percent = \u003Cspan class=\u0022hljs-number\u0022\u003E100\u003C\/span\u003E * (\u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.value - \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.min) \/ (\u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.range);\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E (percent \u0026lt; \u003Cspan class=\u0022hljs-number\u0022\u003E0\u003C\/span\u003E) { \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-number\u0022\u003E0\u003C\/span\u003E; }\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E (percent \u0026gt; \u003Cspan class=\u0022hljs-number\u0022\u003E100\u003C\/span\u003E) { \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-number\u0022\u003E100\u003C\/span\u003E; }\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E percent;\n },\n range() {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.max - \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.min;\n },\n},\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAnd for the remaining two properties that we need, let\u0027s first mock their values to simply be green and black respectively,\njust so that we can validate that \u003Ccode\u003Epercent\u003C\/code\u003E works well without worrying about the colours.\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs javascript border\u0022\u003Ecomputed: {\n colourOuter() {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027#00ff00\u0027\u003C\/span\u003E;\n },\n colourInner() {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027#000000\u0027\u003C\/span\u003E;\n },\n},\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EOf course, in a full-blown, production-ready library, we should cover a lot more ground than in my simple doodle:\nsupporting multiple colour models, implementing colour mixing algorythms that adjust for human perception, etc.\nBut here I wanted to keep it simple:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003Ewe only support RGB,\u003C\/li\u003E\n\u003Cli\u003Ewe only support the HTML colour syntax with six digits (eg. \u003Ccode\u003E#C71585\u003C\/code\u003E),\u003C\/li\u003E\n\u003Cli\u003Ewe darken the colour by simply decreesing all of its RGB components by the same percent,\u003C\/li\u003E\n\u003Cli\u003Ewe mix the colours to create the gradient by simply calculating a weighted average for each RGB component.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EActually, that\u0027s my main purpose for creating this widget \u2013\nI\u0027m curious whether such a simple setup would give a visually pleasant effect.\nSpoiler alert: it\u0027s not perfect, but it works well enough indeed!\u003C\/p\u003E\n\u003Cp\u003ESo now, let\u0027s compute two more values that will help us in further calculations.\n\u003Ccode\u003EcoloursHighpoints\u003C\/code\u003E will be a map between the primary colours and the values where they should appear.\nIn the default case, we have \u003Ccode\u003En = 3\u003C\/code\u003E colours (red, yellow, green) and a range from 0 to 1000,\nso to spread them out evenly we\u0027d need red to be at 0, yellow at 500 and green at 1000.\nThe code below splits the available range into \u003Ccode\u003En - 1\u003C\/code\u003E sections (so in this case sections have a width of 500)\nand then produces points at: \u003Ccode\u003Emin\u003C\/code\u003E, \u003Ccode\u003Emin + range\u003C\/code\u003E, \u003Ccode\u003Emin + 2*range\u003C\/code\u003E, \u2026\nSo in our case the methods retuns a map like this: \u003Ccode\u003E{0: \u0022#ff0000\u0022, 500: \u0022#ffff00\u0022, 1000: \u0022#00ff00\u0022}\u003C\/code\u003E:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs javascript border\u0022\u003EcoloursHighpoints() {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Econst\u003C\/span\u003E highpoints = {};\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Econst\u003C\/span\u003E sectionRange = \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.range \/ (\u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.colours.length - \u003Cspan class=\u0022hljs-number\u0022\u003E1\u003C\/span\u003E);\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Efor\u003C\/span\u003E (\u003Cspan class=\u0022hljs-keyword\u0022\u003Elet\u003C\/span\u003E i \u003Cspan class=\u0022hljs-keyword\u0022\u003Ein\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.colours) {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Econst\u003C\/span\u003E point = \u003Cspan class=\u0022hljs-built_in\u0022\u003EparseInt\u003C\/span\u003E(\u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.min + i * sectionRange, \u003Cspan class=\u0022hljs-number\u0022\u003E10\u003C\/span\u003E);\n highpoints[point] = \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.colours[i];\n }\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E highpoints;\n},\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EThe next step would be to figure out which colours to mix for a given value.\nLet\u0027s say our \u003Ccode\u003Evalue = 400\u003C\/code\u003E. We know it\u0027s between 0 \/ red and 500 \/ yellow,\nso we expect it be an orange-ish yellow.\nBut how do we put that into code?\u003C\/p\u003E\n\u003Cp\u003EWe need a method that will return an object telling us what\u0027s the closest highpoint\nbefore our value, and what\u0027s the closest one after our value.\nLet\u0027s iterate over the highpoints and keep assigning their values to the variable \u003Ccode\u003Eleft\u003C\/code\u003E as long as it\u0027s smaller than \u003Ccode\u003Ethis.value\u003C\/code\u003E.\nAs soon as a highpoint appears that\u0027s higher than \u003Ccode\u003Ethis.value\u003C\/code\u003E, we assign it to the \u003Ccode\u003Eright\u003C\/code\u003E variable.\nAnd then let\u0027s handle the edge case of \u003Ccode\u003Evalue \u0026gt;= max\u003C\/code\u003E.\nHere\u0027s the code for that, and it produces the following output for our parameters: \u003Ccode\u003E{left: 0, right: 500}\u003C\/code\u003E.\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs javascript border\u0022\u003EcoloursBetween() {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Elet\u003C\/span\u003E left = \u003Cspan class=\u0022hljs-literal\u0022\u003Enull\u003C\/span\u003E;\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Elet\u003C\/span\u003E right = \u003Cspan class=\u0022hljs-literal\u0022\u003Enull\u003C\/span\u003E;\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Efor\u003C\/span\u003E (\u003Cspan class=\u0022hljs-keyword\u0022\u003Elet\u003C\/span\u003E val \u003Cspan class=\u0022hljs-keyword\u0022\u003Eof\u003C\/span\u003E \u003Cspan class=\u0022hljs-built_in\u0022\u003EObject\u003C\/span\u003E.keys(\u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.coloursHighpoints)) {\n val = \u003Cspan class=\u0022hljs-built_in\u0022\u003EparseInt\u003C\/span\u003E(val);\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E (val \u0026lt;= \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.value) {\n left = val;\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Econtinue\u003C\/span\u003E;\n }\n right = val;\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ebreak\u003C\/span\u003E;\n }\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E (!right) {\n right = left;\n }\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E {left, right};\n},\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EBefore we actually calculate our colours, let\u0027s prepare some helpers that we\u0027ll need:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003EhexToDec\u003C\/code\u003E and \u003Ccode\u003EdecToHex\u003C\/code\u003E \u2013 simply converting the number base and adding some hex-colour specific padding,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EsplitColour\u003C\/code\u003E: turns \u003Ccode\u003E#C71585\u003C\/code\u003E into \u003Ccode\u003E[199, 21, 133]\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EmergeColour\u003C\/code\u003E: turns \u003Ccode\u003E[199, 21, 133]\u003C\/code\u003E into \u003Ccode\u003E#C71585\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EadjustValue\u003C\/code\u003E: takes an RGB component and increases it by a given \u003Ccode\u003Epercent\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EshadeColour\u003C\/code\u003E: splits a colour into components, adjusts their value and merges them back into a colour,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EmixColours\u003C\/code\u003E: takes two colours and a ratio in which they should be mixed, splits them into components,\nfor each of them calculates a weighted average, and then merges them back into a colour.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs javascript border\u0022\u003Emethods: {\n hexToDec(hex) {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-built_in\u0022\u003EparseInt\u003C\/span\u003E(hex, \u003Cspan class=\u0022hljs-number\u0022\u003E16\u003C\/span\u003E);\n },\n decToHex(dec) {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-built_in\u0022\u003EparseInt\u003C\/span\u003E(dec, \u003Cspan class=\u0022hljs-number\u0022\u003E10\u003C\/span\u003E).toString(\u003Cspan class=\u0022hljs-number\u0022\u003E16\u003C\/span\u003E).padStart(\u003Cspan class=\u0022hljs-number\u0022\u003E2\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u00270\u0027\u003C\/span\u003E);\n },\n splitColour(colour) {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E [\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.hexToDec(colour.substring(\u003Cspan class=\u0022hljs-number\u0022\u003E1\u003C\/span\u003E, \u003Cspan class=\u0022hljs-number\u0022\u003E3\u003C\/span\u003E)),\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.hexToDec(colour.substring(\u003Cspan class=\u0022hljs-number\u0022\u003E3\u003C\/span\u003E, \u003Cspan class=\u0022hljs-number\u0022\u003E5\u003C\/span\u003E)),\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.hexToDec(colour.substring(\u003Cspan class=\u0022hljs-number\u0022\u003E5\u003C\/span\u003E, \u003Cspan class=\u0022hljs-number\u0022\u003E7\u003C\/span\u003E)),\n ];\n },\n mergeColour(r, g, b) {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E`#\u003Cspan class=\u0022hljs-subst\u0022\u003E${\u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.decToHex(r)}\u003C\/span\u003E\u003Cspan class=\u0022hljs-subst\u0022\u003E${\u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.decToHex(g)}\u003C\/span\u003E\u003Cspan class=\u0022hljs-subst\u0022\u003E${\u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.decToHex(b)}\u003C\/span\u003E`\u003C\/span\u003E;\n },\n adjustValue(val, percent) {\n val = \u003Cspan class=\u0022hljs-built_in\u0022\u003EparseInt\u003C\/span\u003E(val * (\u003Cspan class=\u0022hljs-number\u0022\u003E100\u003C\/span\u003E + percent) \/ \u003Cspan class=\u0022hljs-number\u0022\u003E100\u003C\/span\u003E);\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E (val \u0026gt; \u003Cspan class=\u0022hljs-number\u0022\u003E255\u003C\/span\u003E) { val = \u003Cspan class=\u0022hljs-number\u0022\u003E255\u003C\/span\u003E; }\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E (val \u0026lt; \u003Cspan class=\u0022hljs-number\u0022\u003E0\u003C\/span\u003E) { val = \u003Cspan class=\u0022hljs-number\u0022\u003E0\u003C\/span\u003E; }\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E val;\n },\n shadeColour(colour, percent) {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Econst\u003C\/span\u003E [r, g, b] = \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.splitColour(colour);\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.mergeColour(\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.adjustValue(r, percent),\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.adjustValue(g, percent),\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.adjustValue(b, percent),\n );\n },\n mixColours(colour1, colour2, ratio) {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Econst\u003C\/span\u003E [r1, g1, b1] = \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.splitColour(colour1);\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Econst\u003C\/span\u003E [r2, g2, b2] = \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.splitColour(colour2);\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.mergeColour(\n r1 * ratio + r2 * (\u003Cspan class=\u0022hljs-number\u0022\u003E1\u003C\/span\u003E - ratio),\n g1 * ratio + g2 * (\u003Cspan class=\u0022hljs-number\u0022\u003E1\u003C\/span\u003E - ratio),\n b1 * ratio + b2 * (\u003Cspan class=\u0022hljs-number\u0022\u003E1\u003C\/span\u003E - ratio),\n );\n },\n},\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAnd now it\u0027s finally time to put it all together.\u003C\/p\u003E\n\u003Cp\u003ETo calculate \u003Ccode\u003EcolourOuter\u003C\/code\u003E we take the \u003Ccode\u003EcoloursBetween\u003C\/code\u003E and we calculate\nhow far away from \u003Ccode\u003Eleft\u003C\/code\u003E is our value.\nIn our case that\u0027s \u003Ccode\u003E(value - left) \/ (right - left) = (400 - 0) \/ (500 - 0) = 400 \/ 500 = 0.8\u003C\/code\u003E.\nWe will use that value as our weight when calculating the weighted average\nbetween the colour in the \u003Ccode\u003Eleft\u003C\/code\u003E highpoint and the colour in the \u003Ccode\u003Eright\u003C\/code\u003E highpoint.\u003C\/p\u003E\n\u003Cp\u003EAnd \u003Ccode\u003EcolourInner\u003C\/code\u003E will just be just \u003Ccode\u003EcolourOuter\u003C\/code\u003E darkened by 30%.\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs javascript border\u0022\u003EcolourOuter() {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Econst\u003C\/span\u003E {left, right} = \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.coloursBetween;\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Econst\u003C\/span\u003E ratio = (\u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.value - left) \/ ((right - left) || \u003Cspan class=\u0022hljs-number\u0022\u003E1\u003C\/span\u003E);\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.mixColours(\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.coloursHighpoints[left],\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.coloursHighpoints[right],\n \u003Cspan class=\u0022hljs-number\u0022\u003E1\u003C\/span\u003E - ratio,\n );\n},\ncolourInner() {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.shadeColour(\u003Cspan class=\u0022hljs-keyword\u0022\u003Ethis\u003C\/span\u003E.colourOuter, \u003Cspan class=\u0022hljs-number\u0022\u003E-30\u003C\/span\u003E);\n},\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAnd that\u0027s it, we\u0027re done!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["vue","nuxt","javascript","widget","progress bar","colours","gradient"],"hasMore":true,"image":"https:\/\/avris.it\/image\/avris-progress-bar_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-progress-bar_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-progress-bar_mini.png\u0022 alt=\u0022Screenshot of the visual effect: a number of progress bar with increasing values, and their colour gradually changes from red to yellow to green\u0022 width=\u0022240\u0022 height=\u0022120\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA simple doodling project \u2013 probably not that useful, but I enjoyed creating it \ud83e\udd37\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-progress-bar_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-progress-bar_mini.png\u0022 alt=\u0022Screenshot of the visual effect: a number of progress bar with increasing values, and their colour gradually changes from red to yellow to green\u0022 width=\u0022240\u0022 height=\u0022120\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA simple doodling project \u2013 probably not that useful, but I enjoyed creating it \ud83e\udd37\u003C\/p\u003E\n\u003Cp\u003EI liked the way Wendover Productions displayed the HDI score in their video\n\u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=W3qZIPiWKc4\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E \u201eThe News You Missed in 2021\u201d\u003C\/a\u003E,\nso of course I decided to create a widget like this for VueJS \ud83d\ude05\u003C\/p\u003E\n\u003Cp\u003EHere\u0027s a demo:\u003C\/p\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/progressbar.avris.it\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022 class=\u0022btn btn-primary btn-lg d-block\u0022\u003E\nDemo\n\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003EAnd here\u0027s how I made it:\u003C\/p\u003E\n\u003Cp\u003ETo minimise the initial bootsrapping, I picked a framework I already know and absolutely love:\n\u003Ca href=\u0022https:\/\/v3.nuxtjs.org\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Nuxt\u003C\/a\u003E.\nIts upcoming version, v3, cuts all the bootstrapping crap to the minimum, while remaining highly flexible.\nAll I had to do to start working were those commands:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-bash\u0022\u003Enpx nuxi init ProgressBar\ncd ProgressBar\nyarn\nyarn dev -o\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EWhat they do is fetch a project template, install dependencies, start a development server\nand open \u003Ccode\u003Ehttp:\/\/localhost:3000\/\u003C\/code\u003E in the browser.\u003C\/p\u003E\n\u003Cdiv class=\u0022alert alert-warning\u0022\u003E\n Watch out: it\u0027s not the best idea to use v3 yet, this version is not stable!\n I did, because I like experimenting and I want to see where the project is going,\n but I had to pay the price (in this case: inability to generate a static website on production,\n and a weird issue with including stylesheets that I made \u003Ca href=\u0022https:\/\/gitlab.com\/Avris\/ProgressBar\/-\/blob\/main\/app.vue#L117\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E an ugly workaround for\u003C\/a\u003E).\n\u003C\/div\u003E\n\u003Cp\u003EBootrapping done; now I can focus on work. It\u0027s a simple project, so only two files will be relevant:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003Eapp.vue\u003C\/code\u003E is the main entrypoint, the homepage.\nIt contains what you see in the demo: just some introduction and lots of \u003Ccode\u003E\u0026lt;AvrisProgressBar\/\u0026gt;\u003C\/code\u003E components\nembedded to showcase their usage.\nI won\u0027t focus here on the \u003Ccode\u003Eapp.vue\u003C\/code\u003E code, because it\u0027s really straightforward \u2013\nyou can check it out \u003Ca href=\u0022https:\/\/gitlab.com\/Avris\/ProgressBar\/-\/blob\/main\/app.vue\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E here\u003C\/a\u003E.\nSidenote: if I ever need to add multiple pages, I\u0027ll just create a \u003Ccode\u003Eroutes\u003C\/code\u003E directory\nand move \u003Ccode\u003Eapp.vue\u003C\/code\u003E to the appropriate structure inside of that folder, it\u0027s as simple as that! \u2013\nand for the simplest case it\u0027s all already preconfigured and working!\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003Ecomponents\/AvrisProgressBar.vue\u003C\/code\u003E is the actual component I\u0027ll be working on.\nNuxt automatically configures everything so that throughout the application\nyou can simply use the \u003Ccode\u003E\u0026lt;AvrisProgressBar\/\u0026gt;\u003C\/code\u003E tag.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EThe template is really simple:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-html\u0022\u003E\u0026lt;template\u0026gt;\n \u0026lt;div class=\u0022outer\u0022 :style=\u0022`background-color: ${colourOuter}`\u0022\u0026gt;\n \u0026lt;div class=\u0022inner\u0022 :style=\u0022`width: ${percent}%; background-color: ${colourInner}`\u0022\n role=\u0022progressbar\u0022 :aria-valuenow=\u0022percent\u0022 aria-valuemin=\u00220\u0022 aria-valuemax=\u0022100\u0022\u0026gt;\u0026lt;\/div\u0026gt;\n \u0026lt;\/div\u0026gt;\n\u0026lt;\/template\u0026gt;\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAll we need is two divs:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003Ethe outer one, taking a full width of the container\nand coloured with the \u201emain\u201d colour depending on the value of the progress bar,\u003C\/li\u003E\n\u003Cli\u003Ethe inner one, taking a fraction of the outer div\u0027s width proportional to the progress bar\u0027s value\nand coloured with a shade slightly darker than the \u201emain\u201d colour.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EAnd here\u0027s how I styled them:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-css\u0022\u003E\u0026lt;style scoped\u0026gt;\n.outer {\n --apb-height: 16px;\n --apb-border-width: 0px;\n --apb-border-color: #aaa;\n}\n\n.outer {\n width: 100%;\n border-radius: calc(var(--apb-height) \/ 2);\n height: var(--apb-height);\n margin: 4px;\n padding: calc(var(--apb-height) \/ 4 - var(--apb-border-width));\n display: inline-block;\n border: var(--apb-border-width) solid var(--apb-border-color);\n}\n.outer .inner {\n height: calc(var(--apb-height) \/ 2);\n border-radius: calc(var(--apb-height) \/ 2);\n}\n\u0026lt;\/style\u0026gt;\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EI used CSS variables so that each usage of this widget can override the default height and border.\u003C\/p\u003E\n\u003Cp\u003ENow all we need to do is calculate \u003Ccode\u003Epercent\u003C\/code\u003E, \u003Ccode\u003EcolourOuter\u003C\/code\u003E and \u003Ccode\u003EcolourInner\u003C\/code\u003E. Easy!\u003C\/p\u003E\n\u003Cp\u003ELet\u0027s start with declaring \u003Ccode\u003Eprops\u003C\/code\u003E of our component:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode\u003E\u0026lt;script\u0026gt;\nexport default {\n props: {\n value: { required: true },\n min: { \u0027default\u0027: 0 },\n max: { \u0027default\u0027: 1000 },\n colours: { \u0027default\u0027: () =\u0026gt; {\n return [\n \u0027#ff0000\u0027,\n \u0027#ffff00\u0027,\n \u0027#00ff00\u0027,\n ];\n }}\n },\n};\n\u0026lt;\/script\u0026gt;\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EWe expect the user of our widget to provide a value (eg. \u003Ccode\u003E\u0026lt;AvrisProgressBar :value=\u0022123\u0022\/\u0026gt;\u003C\/code\u003E)\nand we allow them to overwrite the default values of \u003Ccode\u003Emin\u003C\/code\u003E (0), \u003Ccode\u003Emax\u003C\/code\u003E (1000) and \u003Ccode\u003Ecolours\u003C\/code\u003E (red, yellow, green)\nwith their own (eg. \u003Ccode\u003E\u0026lt;AvrisProgressBar :value=\u002269\u0022 :min=\u002224\u0022 :max=\u0022169\u0022\/\u0026gt;\u003C\/code\u003E).\u003C\/p\u003E\n\u003Cp\u003ENow let\u0027s calculate the \u003Ccode\u003Epercent\u003C\/code\u003E.\nIt\u0027s pretty simple: we divide the current progress by the full range, and multiply by 100%.\nIf \u003Ccode\u003Emin == 0\u003C\/code\u003E, the formula is trivial: \u003Ccode\u003E100% * value \/ max\u003C\/code\u003E.\nBut in any other case we should add the \u003Ccode\u003Emin\u003C\/code\u003E to the formula:\n\u003Ccode\u003E100% * (value - min) \/ (max - min)\u003C\/code\u003E.\nPlus let\u0027s cut it at no less than 0 and no more than 100, just in case the user provides some weird input.\nHere\u0027s a Vue code that implements that:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-js\u0022\u003Ecomputed: {\n percent() {\n let percent = 100 * (this.value - this.min) \/ (this.range);\n if (percent \u0026lt; 0) { return 0; }\n if (percent \u0026gt; 100) { return 100; }\n return percent;\n },\n range() {\n return this.max - this.min;\n },\n},\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAnd for the remaining two properties that we need, let\u0027s first mock their values to simply be green and black respectively,\njust so that we can validate that \u003Ccode\u003Epercent\u003C\/code\u003E works well without worrying about the colours.\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-js\u0022\u003Ecomputed: {\n colourOuter() {\n return \u0027#00ff00\u0027;\n },\n colourInner() {\n return \u0027#000000\u0027;\n },\n},\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EOf course, in a full-blown, production-ready library, we should cover a lot more ground than in my simple doodle:\nsupporting multiple colour models, implementing colour mixing algorythms that adjust for human perception, etc.\nBut here I wanted to keep it simple:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003Ewe only support RGB,\u003C\/li\u003E\n\u003Cli\u003Ewe only support the HTML colour syntax with six digits (eg. \u003Ccode\u003E#C71585\u003C\/code\u003E),\u003C\/li\u003E\n\u003Cli\u003Ewe darken the colour by simply decreesing all of its RGB components by the same percent,\u003C\/li\u003E\n\u003Cli\u003Ewe mix the colours to create the gradient by simply calculating a weighted average for each RGB component.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EActually, that\u0027s my main purpose for creating this widget \u2013\nI\u0027m curious whether such a simple setup would give a visually pleasant effect.\nSpoiler alert: it\u0027s not perfect, but it works well enough indeed!\u003C\/p\u003E\n\u003Cp\u003ESo now, let\u0027s compute two more values that will help us in further calculations.\n\u003Ccode\u003EcoloursHighpoints\u003C\/code\u003E will be a map between the primary colours and the values where they should appear.\nIn the default case, we have \u003Ccode\u003En = 3\u003C\/code\u003E colours (red, yellow, green) and a range from 0 to 1000,\nso to spread them out evenly we\u0027d need red to be at 0, yellow at 500 and green at 1000.\nThe code below splits the available range into \u003Ccode\u003En - 1\u003C\/code\u003E sections (so in this case sections have a width of 500)\nand then produces points at: \u003Ccode\u003Emin\u003C\/code\u003E, \u003Ccode\u003Emin + range\u003C\/code\u003E, \u003Ccode\u003Emin + 2*range\u003C\/code\u003E, \u2026\nSo in our case the methods retuns a map like this: \u003Ccode\u003E{0: \u0022#ff0000\u0022, 500: \u0022#ffff00\u0022, 1000: \u0022#00ff00\u0022}\u003C\/code\u003E:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-js\u0022\u003EcoloursHighpoints() {\n const highpoints = {};\n const sectionRange = this.range \/ (this.colours.length - 1);\n for (let i in this.colours) {\n const point = parseInt(this.min + i * sectionRange, 10);\n highpoints[point] = this.colours[i];\n }\n return highpoints;\n},\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EThe next step would be to figure out which colours to mix for a given value.\nLet\u0027s say our \u003Ccode\u003Evalue = 400\u003C\/code\u003E. We know it\u0027s between 0 \/ red and 500 \/ yellow,\nso we expect it be an orange-ish yellow.\nBut how do we put that into code?\u003C\/p\u003E\n\u003Cp\u003EWe need a method that will return an object telling us what\u0027s the closest highpoint\nbefore our value, and what\u0027s the closest one after our value.\nLet\u0027s iterate over the highpoints and keep assigning their values to the variable \u003Ccode\u003Eleft\u003C\/code\u003E as long as it\u0027s smaller than \u003Ccode\u003Ethis.value\u003C\/code\u003E.\nAs soon as a highpoint appears that\u0027s higher than \u003Ccode\u003Ethis.value\u003C\/code\u003E, we assign it to the \u003Ccode\u003Eright\u003C\/code\u003E variable.\nAnd then let\u0027s handle the edge case of \u003Ccode\u003Evalue \u0026gt;= max\u003C\/code\u003E.\nHere\u0027s the code for that, and it produces the following output for our parameters: \u003Ccode\u003E{left: 0, right: 500}\u003C\/code\u003E.\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-js\u0022\u003EcoloursBetween() {\n let left = null;\n let right = null;\n for (let val of Object.keys(this.coloursHighpoints)) {\n val = parseInt(val);\n if (val \u0026lt;= this.value) {\n left = val;\n continue;\n }\n right = val;\n break;\n }\n if (!right) {\n right = left;\n }\n return {left, right};\n},\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EBefore we actually calculate our colours, let\u0027s prepare some helpers that we\u0027ll need:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003EhexToDec\u003C\/code\u003E and \u003Ccode\u003EdecToHex\u003C\/code\u003E \u2013 simply converting the number base and adding some hex-colour specific padding,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EsplitColour\u003C\/code\u003E: turns \u003Ccode\u003E#C71585\u003C\/code\u003E into \u003Ccode\u003E[199, 21, 133]\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EmergeColour\u003C\/code\u003E: turns \u003Ccode\u003E[199, 21, 133]\u003C\/code\u003E into \u003Ccode\u003E#C71585\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EadjustValue\u003C\/code\u003E: takes an RGB component and increases it by a given \u003Ccode\u003Epercent\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EshadeColour\u003C\/code\u003E: splits a colour into components, adjusts their value and merges them back into a colour,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EmixColours\u003C\/code\u003E: takes two colours and a ratio in which they should be mixed, splits them into components,\nfor each of them calculates a weighted average, and then merges them back into a colour.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-js\u0022\u003Emethods: {\n hexToDec(hex) {\n return parseInt(hex, 16);\n },\n decToHex(dec) {\n return parseInt(dec, 10).toString(16).padStart(2, \u00270\u0027);\n },\n splitColour(colour) {\n return [\n this.hexToDec(colour.substring(1, 3)),\n this.hexToDec(colour.substring(3, 5)),\n this.hexToDec(colour.substring(5, 7)),\n ];\n },\n mergeColour(r, g, b) {\n return `#${this.decToHex(r)}${this.decToHex(g)}${this.decToHex(b)}`;\n },\n adjustValue(val, percent) {\n val = parseInt(val * (100 + percent) \/ 100);\n if (val \u0026gt; 255) { val = 255; }\n if (val \u0026lt; 0) { val = 0; }\n return val;\n },\n shadeColour(colour, percent) {\n const [r, g, b] = this.splitColour(colour);\n\n return this.mergeColour(\n this.adjustValue(r, percent),\n this.adjustValue(g, percent),\n this.adjustValue(b, percent),\n );\n },\n mixColours(colour1, colour2, ratio) {\n const [r1, g1, b1] = this.splitColour(colour1);\n const [r2, g2, b2] = this.splitColour(colour2);\n\n return this.mergeColour(\n r1 * ratio + r2 * (1 - ratio),\n g1 * ratio + g2 * (1 - ratio),\n b1 * ratio + b2 * (1 - ratio),\n );\n },\n},\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAnd now it\u0027s finally time to put it all together.\u003C\/p\u003E\n\u003Cp\u003ETo calculate \u003Ccode\u003EcolourOuter\u003C\/code\u003E we take the \u003Ccode\u003EcoloursBetween\u003C\/code\u003E and we calculate\nhow far away from \u003Ccode\u003Eleft\u003C\/code\u003E is our value.\nIn our case that\u0027s \u003Ccode\u003E(value - left) \/ (right - left) = (400 - 0) \/ (500 - 0) = 400 \/ 500 = 0.8\u003C\/code\u003E.\nWe will use that value as our weight when calculating the weighted average\nbetween the colour in the \u003Ccode\u003Eleft\u003C\/code\u003E highpoint and the colour in the \u003Ccode\u003Eright\u003C\/code\u003E highpoint.\u003C\/p\u003E\n\u003Cp\u003EAnd \u003Ccode\u003EcolourInner\u003C\/code\u003E will just be just \u003Ccode\u003EcolourOuter\u003C\/code\u003E darkened by 30%.\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-js\u0022\u003EcolourOuter() {\n const {left, right} = this.coloursBetween;\n const ratio = (this.value - left) \/ ((right - left) || 1);\n\n return this.mixColours(\n this.coloursHighpoints[left],\n this.coloursHighpoints[right],\n 1 - ratio,\n );\n},\ncolourInner() {\n return this.shadeColour(this.colourOuter, -30);\n},\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAnd that\u0027s it, we\u0027re done!\u003C\/p\u003E","words":1514,"readTime":7,"lang":"en"}}},"projects\/compass":{"key":"projects\/compass","type":"article","published":true,"meta":{"createdAt":"2021-09-21T18:39:26+02:00","publishedAt":"2021-09-21T18:39:26+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/compass.avris.it","displayUrl":null}],"category":"projects","subcategory":null,"slug":"compass"},"content":{"en":{"slug":"compass","title":"Compass","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/compass_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022240\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABjklEQVRIie2VsW7bMBRFD+lHUYo9xC4stHO3jjbQfwn6J\/mH\/EqQJb\/Q0VvXLu7mwraMwhQrhexgWHAMW2niFG6B3kWXlPh48Q5EqtFoFDmTlFLEGB95UUqdK08TZNdroEn5XL\/7fC0v+8VfGuol\/pD+bmSHWpkoRSoXoHSz8KzIPr1\/Q\/fjNfdfbgnLKc45QghovQnovWe5XLbWeFVkdxc\/ubq84a1NqPOcJEnI85zVakWv12M6nTKZTFprtGkfmRqPxzHG2Lz4HS8i1HXdzO2fJaf4J5ENh0OstWitKcsSEWm+ERG891hrERHW6zUigjGGoiiYz+ettQ\/5J5GFEDDGkKYpxpimOyEE6romTVOSJEFrTb\/fR0RwzjEYDMiyjKqqmM1mrXvsSrbpjmEyxmzYKkUIAWstMUayLMM5R7fbpSzLTTH9wId337n\/7DZjEUIIjzpwMrLFYkFRFHQ6Haqqajq0u9n2r1NK8e3rih+uc7QDJyPz3h8c789vtUY45az9f5f923fZc\/2fQPYLjswi+C4BgWwAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/compass_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022240\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EAnswer a bunch of very random questions, see where that puts you on the political compass, and share the results with friends \ud83d\ude09\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/compass_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022480\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABjklEQVRIie2VsW7bMBRFD+lHUYo9xC4stHO3jjbQfwn6J\/mH\/EqQJb\/Q0VvXLu7mwraMwhQrhexgWHAMW2niFG6B3kWXlPh48Q5EqtFoFDmTlFLEGB95UUqdK08TZNdroEn5XL\/7fC0v+8VfGuol\/pD+bmSHWpkoRSoXoHSz8KzIPr1\/Q\/fjNfdfbgnLKc45QghovQnovWe5XLbWeFVkdxc\/ubq84a1NqPOcJEnI85zVakWv12M6nTKZTFprtGkfmRqPxzHG2Lz4HS8i1HXdzO2fJaf4J5ENh0OstWitKcsSEWm+ERG891hrERHW6zUigjGGoiiYz+ettQ\/5J5GFEDDGkKYpxpimOyEE6romTVOSJEFrTb\/fR0RwzjEYDMiyjKqqmM1mrXvsSrbpjmEyxmzYKkUIAWstMUayLMM5R7fbpSzLTTH9wId337n\/7DZjEUIIjzpwMrLFYkFRFHQ6Haqqajq0u9n2r1NK8e3rih+uc7QDJyPz3h8c789vtUY45az9f5f923fZc\/2fQPYLjswi+C4BgWwAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/compass_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022480\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EAnswer a bunch of very random questions, see where that puts you on the political compass, and share the results with friends \ud83d\ude09\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["compass","political","politics","left","right","axis","js","vuejs"],"hasMore":false,"image":"https:\/\/avris.it\/image\/compass_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/compass_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/compass_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022120\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EAnswer a bunch of very random questions, see where that puts you on the political compass, and share the results with friends \ud83d\ude09\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/compass_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/compass_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022120\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EAnswer a bunch of very random questions, see where that puts you on the political compass, and share the results with friends \ud83d\ude09\u003C\/p\u003E","words":22,"readTime":null,"lang":"en"}}},"projects\/opinionated-queer-license":{"key":"projects\/opinionated-queer-license","type":"article","published":true,"meta":{"createdAt":"2021-09-13T18:39:26+02:00","publishedAt":"2021-09-13T18:39:26+02:00","group":null,"links":[{"icon":"gavel","colour":"primary","url":"https:\/\/oql.avris.it","displayUrl":null}],"category":"projects","subcategory":null,"slug":"opinionated-queer-license"},"content":{"en":{"slug":"opinionated-queer-license","title":"Opinionated Queer License","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/oql_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022230.35072711719\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB4ElEQVRIie2UTU\/jMBCGn7Ed3I\/QRlT94MKJf8P\/v64EUi6ASKtNG6VxxntYJUvZlgUk0K6078WJZzzz+I1jUdUoIsQY6cZOz9\/f+gwc1Ho+91pOF3ccUdxXtOs77soE7z0igrWWGCPeezabDcYYJpMJTdMgIqgqzjlCCCwWi2Nl36SjQN9b+BYydJ2T5zlpmqKqhBDw3nN+fs7T0xOqyng8JssyHh8fsdayXq+5ubnBWvshIPknPtlL5XmOc47lcvlbrKoqiqKgrmvm8zlpmh5dH2Mky7Kj8Tc59Nypz5CIvM+hEAL39\/fEGKnrmsvLS0ajUV9sv99TFAW73Y6zszNCCL0L0+kUEeHh4YGqqlBVVqtVv9Z7f3LDJ4E6EBFhsVhQ13UP1MWbpkFV2W63P4s5R5IkBzllWeK95\/b2Fu89xhiurq5OOncSqLN0PB4zGo1wzh3sKkkSkiShaRpWqxXGmP7AdprP5\/0V8PJQvxsoxkiMkaIocM4xm80O4k3T0LYtIkKe54gIbdtireX6+vrVph8CEhGccwwGA8qyZDKZ4NyvdGstaZqy2+3w3mOtRVW5uLj4MAy88pepKmVZ9hY75xgOhz3sl99Dxhim0+nRxp8p8+kd3qn\/QH\/SXwf0AzQ9RJWdIgbzAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/oql_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022230.35072711719\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI create lots of things, mostly software, and I put them on the Internet for free.\nAs an author I have the right to decide under which conditions do I waive my copyrights.\nCommon practice is to just pick one of the permissive licenses,\nmany of which aim to maximise the user\u0027s freedom\u2026\u003C\/p\u003E\n\u003Cp\u003EBut I don\u0027t care.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/oql_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022460.70145423439\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB4ElEQVRIie2UTU\/jMBCGn7Ed3I\/QRlT94MKJf8P\/v64EUi6ASKtNG6VxxntYJUvZlgUk0K6078WJZzzz+I1jUdUoIsQY6cZOz9\/f+gwc1Ho+91pOF3ccUdxXtOs77soE7z0igrWWGCPeezabDcYYJpMJTdMgIqgqzjlCCCwWi2Nl36SjQN9b+BYydJ2T5zlpmqKqhBDw3nN+fs7T0xOqyng8JssyHh8fsdayXq+5ubnBWvshIPknPtlL5XmOc47lcvlbrKoqiqKgrmvm8zlpmh5dH2Mky7Kj8Tc59Nypz5CIvM+hEAL39\/fEGKnrmsvLS0ajUV9sv99TFAW73Y6zszNCCL0L0+kUEeHh4YGqqlBVVqtVv9Z7f3LDJ4E6EBFhsVhQ13UP1MWbpkFV2W63P4s5R5IkBzllWeK95\/b2Fu89xhiurq5OOncSqLN0PB4zGo1wzh3sKkkSkiShaRpWqxXGmP7AdprP5\/0V8PJQvxsoxkiMkaIocM4xm80O4k3T0LYtIkKe54gIbdtireX6+vrVph8CEhGccwwGA8qyZDKZ4NyvdGstaZqy2+3w3mOtRVW5uLj4MAy88pepKmVZ9hY75xgOhz3sl99Dxhim0+nRxp8p8+kd3qn\/QH\/SXwf0AzQ9RJWdIgbzAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/oql_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022460.70145423439\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI create lots of things, mostly software, and I put them on the Internet for free.\nAs an author I have the right to decide under which conditions do I waive my copyrights.\nCommon practice is to just pick one of the permissive licenses,\nmany of which aim to maximise the user\u0027s freedom\u2026\u003C\/p\u003E\n\u003Cp\u003EBut I don\u0027t care.\u003C\/p\u003E\n\u003Cp\u003EThe whole point of me giving away stuff for free is to make the world a slightly better place \u2013\nso if someone wants to use them for evil, then screw their freedom.\nI\u0027m queer, I\u0027m a member of minoritised communities \u2013 and I can\u0027t just blindly worship \u201cfreedom\u201d\nin a world where so many use their freedom to actively hurt the most vulnerable.\u003C\/p\u003E\n\u003Cp\u003EI don\u0027t want my work to be \u003Cem\u003Efreely\u003C\/em\u003E used \u2013 I want it used \u003Cem\u003Efor good\u003C\/em\u003E.\u003C\/p\u003E\n\u003Cp\u003ESo, my license prohibits any use by big corporations, cops, military, or use in a bigoted or violent way.\u003C\/p\u003E\n\u003Cp\u003EYou\u0027re free to use it too, just keep in mind that I am not a lawyer.\nThis license is inspired by and based on\n\u003Ca href=\u0022https:\/\/leftcopy.org\/\u0022\u003ELeftcopy\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/thesocialdomain.org\/\u0022\u003EThe Social Domain\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/firstdonoharm.dev\/\u0022\u003EThe Hippocratic License\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/github.com\/jgrey4296\/acab\/blob\/main\/LICENSE\u0022\u003EACAB License\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/paste.sr.ht\/~boringcactus\/ed023ccf9d7a5559612d6e60f0474d6c3375349d\u0022\u003Ethe fuck around and find out license\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/anticapitalist.software\/\u0022\u003EThe Anti-Capitalist Software License\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/creativecommons.org\/licenses\/by-nc-sa\/4.0\/deed.en\u0022\u003ECC-BY-NC-SA\u003C\/a\u003E,\nand \u003Ca href=\u0022https:\/\/github.com\/jamiebuilds\/license\u0022\u003EJamie Kyle\u0027s MIT License\u003C\/a\u003E.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["license","queer","human rights","bigotry","copyright","anticapitalism","acab"],"hasMore":true,"image":"https:\/\/avris.it\/image\/oql_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/oql_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/oql_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022115.1753635586\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI create lots of things, mostly software, and I put them on the Internet for free.\nAs an author I have the right to decide under which conditions do I waive my copyrights.\nCommon practice is to just pick one of the permissive licenses,\nmany of which aim to maximise the user\u0027s freedom\u2026\u003C\/p\u003E\n\u003Cp\u003EBut I don\u0027t care.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/oql_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/oql_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022115.1753635586\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI create lots of things, mostly software, and I put them on the Internet for free.\nAs an author I have the right to decide under which conditions do I waive my copyrights.\nCommon practice is to just pick one of the permissive licenses,\nmany of which aim to maximise the user\u0027s freedom\u2026\u003C\/p\u003E\n\u003Cp\u003EBut I don\u0027t care.\u003C\/p\u003E\n\u003Cp\u003EThe whole point of me giving away stuff for free is to make the world a slightly better place \u2013\nso if someone wants to use them for evil, then screw their freedom.\nI\u0027m queer, I\u0027m a member of minoritised communities \u2013 and I can\u0027t just blindly worship \u201cfreedom\u201d\nin a world where so many use their freedom to actively hurt the most vulnerable.\u003C\/p\u003E\n\u003Cp\u003EI don\u0027t want my work to be \u003Cem\u003Efreely\u003C\/em\u003E used \u2013 I want it used \u003Cem\u003Efor good\u003C\/em\u003E.\u003C\/p\u003E\n\u003Cp\u003ESo, my license prohibits any use by big corporations, cops, military, or use in a bigoted or violent way.\u003C\/p\u003E\n\u003Cp\u003EYou\u0027re free to use it too, just keep in mind that I am not a lawyer.\nThis license is inspired by and based on\n\u003Ca href=\u0022https:\/\/leftcopy.org\/\u0022\u003ELeftcopy\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/thesocialdomain.org\/\u0022\u003EThe Social Domain\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/firstdonoharm.dev\/\u0022\u003EThe Hippocratic License\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/github.com\/jgrey4296\/acab\/blob\/main\/LICENSE\u0022\u003EACAB License\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/paste.sr.ht\/~boringcactus\/ed023ccf9d7a5559612d6e60f0474d6c3375349d\u0022\u003Ethe fuck around and find out license\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/anticapitalist.software\/\u0022\u003EThe Anti-Capitalist Software License\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/creativecommons.org\/licenses\/by-nc-sa\/4.0\/deed.en\u0022\u003ECC-BY-NC-SA\u003C\/a\u003E,\nand \u003Ca href=\u0022https:\/\/github.com\/jamiebuilds\/license\u0022\u003EJamie Kyle\u0027s MIT License\u003C\/a\u003E.\u003C\/p\u003E","words":203,"readTime":null,"lang":"en"}}},"projects\/plss":{"key":"projects\/plss","type":"article","published":true,"meta":{"createdAt":"2021-06-24T17:51:50+02:00","publishedAt":"2021-06-24T17:51:50+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/plss.avris.it\/","displayUrl":null}],"category":"projects","subcategory":null,"slug":"plss"},"content":{"en":{"slug":"plss","title":"PLSS","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/plss_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022362\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAbCAYAAAAULC3gAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEnElEQVRIic2XzY8URRjGf1XV3dPztTu7yy47CDKgEhPjGYMcjBcJf4HeuPpnaLiqRxI8m+hNwk2vGEOCgWgCYVeEXRWW3ZnZmdmZ6c+q8jBMsz2zwC4xynOrrn7fevqp5616W1hrLa8QnN2D9a0+v92+y9tHa7iuSxzHlMtl6vX6f0ZI7FYoSRL6\/T5CCAB2iyelxFqLMSabk1ICoJQiTdPsXcdx0FpjrUUIgRACay3WWmYA6fvIUmlPQjmFlDFUAazBGgvWEiiFAIpak0pJ8ITseCEArXU21lpjjEFrjed52ZyUEmMMPWOoOA7efhSKgy6d5u+IJwuOVdBagwApFcZolFIUCj5+ofDiPXgBlL+McJ6qlVOIaJ1o7TJCgNYgJUxZfiQKAwv+6IuwAiIhsBaEgKKv9k1o5s1P8WrvPk3\/SlfZYDCg1WqxuLhIsVg8UKJms0m\/30dKmRVAmqY0Go3Ma\/tB3kNxjDGGwjO8sb29zezsbFZdkx\/jOE4Wq\/XIa+O8w+GQWq02TWCCbC6zlJJ+v08YhlOB42rZC+O5nZ0d4jgGyMiM8yZJQqvVmoqddIwzOamUwvf97FnSbGLDEK9ez8o3gzHobpek3ebxpUsMbt1kY2JBp1YbnUFxjAkCHk3MH\/\/sc2bOnt2bkJQyRwYgWLlL2moxt\/jR1FZZYwgf3Kd\/8xaNixdHz9IUm6Y4c3NTauwHOQ9FUUQURVSr1QMnCoIA13VxXfeliIwxpZCUMvOBlBLHcfYMnMTmxkPu3buHtnp0YFqI4phiscDiwhKDIKDTaZNogxICKQVxnHL69HvMzS\/sTchaSxiGmSGFEPR+ukbabDF37hyB1pR23UHR+jqdH39g8eNPuHH9Z65cvcKjzb+plKt4jsNmq0kYRZz\/4AzgcO2XmwzCmCgMqZR8lCrw5RdfPZuQUopyuZyNtdbIxgnc+hEirZFS5irQVKv4Z94nlZLBsM\/CQo2i7zIMAtqdDnO1eY4de53zH57nu6vfc2RxGW0tnW6X5cNLdHeGhFH87C0zxmSlOTawXyrhz89jRxLmgoXv4zUaaMB1PEquy1+9Lkq5eK6H0Sn9\/g6\/rj2kVJ5DdIf8cX8FiaA36BGECUrlPTdlkEqlMtV2aK0nX8tBSslS\/TXKa2vEqyvMVH2ccolOr8edlRXSRDNTmWVzaxNjIE01vq9IkhQzkTtHKL5zm+blr6cWVJUyQimE65Jud7ATSUqnTnHbhNy4cZ1abQHPcegPexQ8n3feOszxxhu021ukScSJY0cYBiFJkuIohaPyR0mOUOF4g+ULF7A6xRqLLBSQE+fSXlDlMsNvvyFINOl2C2NHKlSrZTYeP0a6HjNFS6gT\/ny4iecpDs0fYnOrixV5Qv\/abR\/Hca6jnOw6xw3a2AKO4+B5023aq9d+rK6u\/t8cchAnT57MFNp9mx9UuHEPJMaxT1rggyJn6tnZWQ4vLUEc02q16AUB8a6\/iefhaL1OuVQCpUBr4iDAVYoHGxuEUfRyhIIgoLu9DUlCdzgkecH5sxtb7Ta9wSB3Zkkp8QoFvEJhRDKOCZPkuXlyW\/Yq4B\/hzVgT67VgxgAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/plss_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022362\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/plss_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022724\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAbCAYAAAAULC3gAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEnElEQVRIic2XzY8URRjGf1XV3dPztTu7yy47CDKgEhPjGYMcjBcJf4HeuPpnaLiqRxI8m+hNwk2vGEOCgWgCYVeEXRWW3ZnZmdmZ6c+q8jBMsz2zwC4xynOrrn7fevqp5616W1hrLa8QnN2D9a0+v92+y9tHa7iuSxzHlMtl6vX6f0ZI7FYoSRL6\/T5CCAB2iyelxFqLMSabk1ICoJQiTdPsXcdx0FpjrUUIgRACay3WWmYA6fvIUmlPQjmFlDFUAazBGgvWEiiFAIpak0pJ8ITseCEArXU21lpjjEFrjed52ZyUEmMMPWOoOA7efhSKgy6d5u+IJwuOVdBagwApFcZolFIUCj5+ofDiPXgBlL+McJ6qlVOIaJ1o7TJCgNYgJUxZfiQKAwv+6IuwAiIhsBaEgKKv9k1o5s1P8WrvPk3\/SlfZYDCg1WqxuLhIsVg8UKJms0m\/30dKmRVAmqY0Go3Ma\/tB3kNxjDGGwjO8sb29zezsbFZdkx\/jOE4Wq\/XIa+O8w+GQWq02TWCCbC6zlJJ+v08YhlOB42rZC+O5nZ0d4jgGyMiM8yZJQqvVmoqddIwzOamUwvf97FnSbGLDEK9ez8o3gzHobpek3ebxpUsMbt1kY2JBp1YbnUFxjAkCHk3MH\/\/sc2bOnt2bkJQyRwYgWLlL2moxt\/jR1FZZYwgf3Kd\/8xaNixdHz9IUm6Y4c3NTauwHOQ9FUUQURVSr1QMnCoIA13VxXfeliIwxpZCUMvOBlBLHcfYMnMTmxkPu3buHtnp0YFqI4phiscDiwhKDIKDTaZNogxICKQVxnHL69HvMzS\/sTchaSxiGmSGFEPR+ukbabDF37hyB1pR23UHR+jqdH39g8eNPuHH9Z65cvcKjzb+plKt4jsNmq0kYRZz\/4AzgcO2XmwzCmCgMqZR8lCrw5RdfPZuQUopyuZyNtdbIxgnc+hEirZFS5irQVKv4Z94nlZLBsM\/CQo2i7zIMAtqdDnO1eY4de53zH57nu6vfc2RxGW0tnW6X5cNLdHeGhFH87C0zxmSlOTawXyrhz89jRxLmgoXv4zUaaMB1PEquy1+9Lkq5eK6H0Sn9\/g6\/rj2kVJ5DdIf8cX8FiaA36BGECUrlPTdlkEqlMtV2aK0nX8tBSslS\/TXKa2vEqyvMVH2ccolOr8edlRXSRDNTmWVzaxNjIE01vq9IkhQzkTtHKL5zm+blr6cWVJUyQimE65Jud7ATSUqnTnHbhNy4cZ1abQHPcegPexQ8n3feOszxxhu021ukScSJY0cYBiFJkuIohaPyR0mOUOF4g+ULF7A6xRqLLBSQE+fSXlDlMsNvvyFINOl2C2NHKlSrZTYeP0a6HjNFS6gT\/ny4iecpDs0fYnOrixV5Qv\/abR\/Hca6jnOw6xw3a2AKO4+B5023aq9d+rK6u\/t8cchAnT57MFNp9mx9UuHEPJMaxT1rggyJn6tnZWQ4vLUEc02q16AUB8a6\/iefhaL1OuVQCpUBr4iDAVYoHGxuEUfRyhIIgoLu9DUlCdzgkecH5sxtb7Ta9wSB3Zkkp8QoFvEJhRDKOCZPkuXlyW\/Yq4B\/hzVgT67VgxgAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/plss_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022724\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EThe Public Land Survey System (PLSS) is the surveying method developed and used in the United States to plat, or divide, real property for sale and settling. [wikipedia]\u003C\/p\u003E\n\u003Cp\u003EBureau of Land Management provides an interface to convert between PLSS and the universal system of latitude \u0026amp; longitude, but it\u0027s hard to call it a user friendly tool.\u003C\/p\u003E\n\u003Cp\u003EThis website is a wrapper on their API that makes it way easier to use.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["plss","latitude","longitude","coordinates","location","nuxt","vue","api"],"hasMore":true,"image":"https:\/\/avris.it\/image\/plss_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/plss_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/plss_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022181\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/plss_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/plss_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022181\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EThe Public Land Survey System (PLSS) is the surveying method developed and used in the United States to plat, or divide, real property for sale and settling. [wikipedia]\u003C\/p\u003E\n\u003Cp\u003EBureau of Land Management provides an interface to convert between PLSS and the universal system of latitude \u0026amp; longitude, but it\u0027s hard to call it a user friendly tool.\u003C\/p\u003E\n\u003Cp\u003EThis website is a wrapper on their API that makes it way easier to use.\u003C\/p\u003E","words":72,"readTime":null,"lang":"en"}}},"projects\/simon-reacts":{"key":"projects\/simon-reacts","type":"article","published":true,"meta":{"createdAt":"2020-12-13T23:43:54+01:00","publishedAt":"2020-12-13T23:43:54+01:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/simonreacts.avris.it\/","displayUrl":"Website"},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Simon","displayUrl":null}],"category":"projects","subcategory":null,"slug":"simon-reacts"},"content":{"en":{"slug":"simon-reacts","title":"Simon Reacts","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/simonreacts_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022240\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACcElEQVRIie2UQU9TQRSFvzcdp23a2lAtVNJCWWpMbI0maNiQEBdsXLnCBNm78ie4k\/gDjLELTTDElIYEysKNxD2JiZCWQKkJESSU0rSPlmJfnwu1aQsUgSiaeDZz3sy9992ZM2e0arVq8hdBapp21j00QACY5vdDMk3zQF4f0xzfKu8kXPsv2RH4tyRLJpMAOBwOAoHAobtKJBJsbW3R19e3b61UKmG32w\/NbUZLySKRCAMDA5RKJSYnJ7FarfT09JBKpejo6GBjY4Ph4WEmJibY3Nwkn8+TyWQIBoPs7u6yurpKKpUiFArhcrkYHBw8sqEGyZp5f38\/8Xic+fl5uru7UUoRjUZRSjE2Nobf72d9fR232004HGZ2dpa5uTmmp6cZHx9H13V8Ph9SSmKx2D6ZFpOLzMTjFAqF2nxLyXK5HEIIlFIIIWoFs9ksHo8HIQQWi4W9vT2EEGiaRjabRUqJzWZD13Xcbnfth16vt1Y7k8nw+NFD2hV8+LTGnXtDPBgZaS1ZW1vbgfOdnZ0N3\/V3xOfz1bjT6dy3\/hOyXGTo9jW2Czpet5PR0SdIKZG1o\/rR2HF4\/Qj8Mi+Xy7yMPCeTXkLXdTAqSGEhmVxENlv4uPwkeUoprl+9wlpVp6vdQ6FYwu6wc6v3xtk9jBahoRkGlapBeu0LOb1E6GZva5f9zodRUzaKX\/f4uJQmv1PE4w8S6OpCnKboaTZzwX8ZoyoJXvJx8byLfHqb6LPXaGZ99B+AUanw6ukLpt7EuH83jFWZzLxfIJ9TnFOq0WWHuaI+pjn+uC5bSSzzbuotFk2ysPyZpZU8O0UDu83EqFT4Bkt1IroF1hTSAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/simonreacts_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022240\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EThis little app is a tribute to Simon Anthony,\nformer UK team member in World Sudoku and World Puzzle Championships\nand co-host of a YouTube channel \u003Ca href=\u0022https:\/\/www.youtube.com\/c\/CrackingTheCryptic\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Cracking The Cryptic\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EHis catchphrases and reactions are getting iconic among the viewers, so I thought: why not create a reaction board out of them?\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/simonreacts_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022480\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACcElEQVRIie2UQU9TQRSFvzcdp23a2lAtVNJCWWpMbI0maNiQEBdsXLnCBNm78ie4k\/gDjLELTTDElIYEysKNxD2JiZCWQKkJESSU0rSPlmJfnwu1aQsUgSiaeDZz3sy9992ZM2e0arVq8hdBapp21j00QACY5vdDMk3zQF4f0xzfKu8kXPsv2RH4tyRLJpMAOBwOAoHAobtKJBJsbW3R19e3b61UKmG32w\/NbUZLySKRCAMDA5RKJSYnJ7FarfT09JBKpejo6GBjY4Ph4WEmJibY3Nwkn8+TyWQIBoPs7u6yurpKKpUiFArhcrkYHBw8sqEGyZp5f38\/8Xic+fl5uru7UUoRjUZRSjE2Nobf72d9fR232004HGZ2dpa5uTmmp6cZHx9H13V8Ph9SSmKx2D6ZFpOLzMTjFAqF2nxLyXK5HEIIlFIIIWoFs9ksHo8HIQQWi4W9vT2EEGiaRjabRUqJzWZD13Xcbnfth16vt1Y7k8nw+NFD2hV8+LTGnXtDPBgZaS1ZW1vbgfOdnZ0N3\/V3xOfz1bjT6dy3\/hOyXGTo9jW2Czpet5PR0SdIKZG1o\/rR2HF4\/Qj8Mi+Xy7yMPCeTXkLXdTAqSGEhmVxENlv4uPwkeUoprl+9wlpVp6vdQ6FYwu6wc6v3xtk9jBahoRkGlapBeu0LOb1E6GZva5f9zodRUzaKX\/f4uJQmv1PE4w8S6OpCnKboaTZzwX8ZoyoJXvJx8byLfHqb6LPXaGZ99B+AUanw6ukLpt7EuH83jFWZzLxfIJ9TnFOq0WWHuaI+pjn+uC5bSSzzbuotFk2ysPyZpZU8O0UDu83EqFT4Bkt1IroF1hTSAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/simonreacts_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022480\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EThis little app is a tribute to Simon Anthony,\nformer UK team member in World Sudoku and World Puzzle Championships\nand co-host of a YouTube channel \u003Ca href=\u0022https:\/\/www.youtube.com\/c\/CrackingTheCryptic\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Cracking The Cryptic\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EHis catchphrases and reactions are getting iconic among the viewers, so I thought: why not create a reaction board out of them?\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["sudoku","cracking the cryptic","youtube","tribute","reactions","reaction board","nuxtjs","sounds"],"hasMore":false,"image":"https:\/\/avris.it\/image\/simonreacts_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/simonreacts_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/simonreacts_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022120\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EThis little app is a tribute to Simon Anthony,\nformer UK team member in World Sudoku and World Puzzle Championships\nand co-host of a YouTube channel \u003Ca href=\u0022https:\/\/www.youtube.com\/c\/CrackingTheCryptic\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Cracking The Cryptic\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EHis catchphrases and reactions are getting iconic among the viewers, so I thought: why not create a reaction board out of them?\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/simonreacts_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/simonreacts_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022120\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EThis little app is a tribute to Simon Anthony,\nformer UK team member in World Sudoku and World Puzzle Championships\nand co-host of a YouTube channel \u003Ca href=\u0022https:\/\/www.youtube.com\/c\/CrackingTheCryptic\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Cracking The Cryptic\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EHis catchphrases and reactions are getting iconic among the viewers, so I thought: why not create a reaction board out of them?\u003C\/p\u003E","words":51,"readTime":null,"lang":"en"}}},"projects\/avris-counter":{"key":"projects\/avris-counter","type":"article","published":true,"meta":{"createdAt":"2020-10-04T20:50:17+02:00","publishedAt":"2020-10-04T20:50:17+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/counter.avris.it\/","displayUrl":"Website"},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Counter","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-counter"},"content":{"en":{"slug":"avris-counter","title":"Avris Counter","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-counter_small.png\u0022 alt=\u0022Avris Counter screenshot\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022279.58165728077\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACwklEQVRIia2WwW7bRhCGv+UuuSQtwXZsA\/att16bUx6gfYM+RZ6wb9B7kwAFesrFrePGkpWEokXuzvQgS5Elam24\/gGCAGcx83Hm54BGRJSEuq6jKIrUkReVM8bsDYoIf7x7z9npKc18Tuk9fd+jKE0z5\/Xrn3DWviiQ2e6QMQZVXQPdzmagijHmPgard4gi5M4hIvQh4L0nxohEwVpLiAGbZRiTMR6PsPfwmzW262arQqtrFVwXxyCirLhFZR3PjOHj7x8JbcBZR+h7RIQsM4DirEMVVAURGayx80yXWhNu3mOM3EwmFHlOCHH9hs45xuPRg\/OrhCsN5dw8s69DOyPbVIzC1fVnokRiFNz9GHKXo6oURYFz7nFjsBxzXXrK0ifPJU0NShRZeiKz9GHpiUXXkTtH13XM2xZrLSJCkecUeQHLiX2\/A8YajHnYxUHwlKkB+hCTCZ4sVUxmcNYmTT3Yoc05\/315SV1XLLoOFaWqKs7OTv833766SVOLKN+aBlQRVfLcoaKUZflsEOeWH8azTK2qdH1IFmhuvjG9nAJw\/uMFzu83uQGKIk8Dp0y26lQSaNLw6a8rQhc5+eGUvEwUfEK+pKlVIcQXMvW9cpc2tdHtyIb6vufT9TVFXqAor46P18txO9l0OuXw8JAsy5JAj3XIwfBWNcZgrePmz8\/MrmbJJG9+fUNZVnz58pXRaLQ27rY2LfAsU4cYmd3eogonJ6\/2AhljaNuWu7sFdV3h\/fA2foonk6a2WUbta1SU9mu795w\/8KgutzrAYtGR525wfI8C7WsdLH8\/5os5dV1TVVUy0YffPjD5Z0Jz26BR8b7YASrHJT+\/\/eX5mzrLMg4ORnhf7CTYlh979F84ujiiKofhi6p48KsxVHdnU8N3w4UQmEyna7iu67g4Px9M1LZ3zNsWY+D46Ggv+CbINpyq8h88n7nO5mY7EAAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-counter_small.png\u0022 alt=\u0022Avris Counter screenshot\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022279.58165728077\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIt\u0027s the simplest way to show a counter of visitors on your website \u2013 just copy-paste this simple HTML code!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-counter_big.png\u0022 alt=\u0022Avris Counter screenshot\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022559.16331456154\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACwklEQVRIia2WwW7bRhCGv+UuuSQtwXZsA\/att16bUx6gfYM+RZ6wb9B7kwAFesrFrePGkpWEokXuzvQgS5Elam24\/gGCAGcx83Hm54BGRJSEuq6jKIrUkReVM8bsDYoIf7x7z9npKc18Tuk9fd+jKE0z5\/Xrn3DWviiQ2e6QMQZVXQPdzmagijHmPgard4gi5M4hIvQh4L0nxohEwVpLiAGbZRiTMR6PsPfwmzW262arQqtrFVwXxyCirLhFZR3PjOHj7x8JbcBZR+h7RIQsM4DirEMVVAURGayx80yXWhNu3mOM3EwmFHlOCHH9hs45xuPRg\/OrhCsN5dw8s69DOyPbVIzC1fVnokRiFNz9GHKXo6oURYFz7nFjsBxzXXrK0ifPJU0NShRZeiKz9GHpiUXXkTtH13XM2xZrLSJCkecUeQHLiX2\/A8YajHnYxUHwlKkB+hCTCZ4sVUxmcNYmTT3Yoc05\/315SV1XLLoOFaWqKs7OTv833766SVOLKN+aBlQRVfLcoaKUZflsEOeWH8azTK2qdH1IFmhuvjG9nAJw\/uMFzu83uQGKIk8Dp0y26lQSaNLw6a8rQhc5+eGUvEwUfEK+pKlVIcQXMvW9cpc2tdHtyIb6vufT9TVFXqAor46P18txO9l0OuXw8JAsy5JAj3XIwfBWNcZgrePmz8\/MrmbJJG9+fUNZVnz58pXRaLQ27rY2LfAsU4cYmd3eogonJ6\/2AhljaNuWu7sFdV3h\/fA2foonk6a2WUbta1SU9mu795w\/8KgutzrAYtGR525wfI8C7WsdLH8\/5os5dV1TVVUy0YffPjD5Z0Jz26BR8b7YASrHJT+\/\/eX5mzrLMg4ORnhf7CTYlh979F84ujiiKofhi6p48KsxVHdnU8N3w4UQmEyna7iu67g4Px9M1LZ3zNsWY+D46Ggv+CbINpyq8h88n7nO5mY7EAAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-counter_big.png\u0022 alt=\u0022Avris Counter screenshot\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022559.16331456154\u0022\u003E\u003C\/span\u003E\n \u003Cfigcaption\u003E\n \u003Ca href=\u0022https:\/\/counter.avris.it\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\n \u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E\n counter.avris.it\n \u003C\/a\u003E\n \u003C\/figcaption\u003E\n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIt\u0027s the simplest way to show a counter of visitors on your website \u2013 just copy-paste this simple HTML code!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["counter","visits","visitors","stats","image","html","nuxt","vue","javascript"],"hasMore":false,"image":"https:\/\/avris.it\/image\/avris-counter_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-counter_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-counter_mini.png\u0022 alt=\u0022Avris Counter screenshot\u0022 width=\u0022240\u0022 height=\u0022139.79082864039\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIt\u0027s the simplest way to show a counter of visitors on your website \u2013 just copy-paste this simple HTML code!\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-counter_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-counter_mini.png\u0022 alt=\u0022Avris Counter screenshot\u0022 width=\u0022240\u0022 height=\u0022139.79082864039\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003Cfigcaption\u003E\n \u003Ca href=\u0022https:\/\/counter.avris.it\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csmall\u003Ecounter.avris.it\u003C\/small\u003E\u003C\/a\u003E\n \u003C\/figcaption\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIt\u0027s the simplest way to show a counter of visitors on your website \u2013 just copy-paste this simple HTML code!\u003C\/p\u003E","words":22,"readTime":null,"lang":"en"}}},"projects\/zaimki":{"key":"projects\/zaimki","type":"article","published":true,"meta":{"createdAt":"2020-07-25T12:32:20+02:00","publishedAt":"2020-07-25T12:32:20+02:00","group":"nonbinary","links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/zaimki.pl\/","displayUrl":null},{"icon":"globe-europe","colour":"primary","url":"https:\/\/pronouns.page\/","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Zaimki","displayUrl":null}],"category":"projects","subcategory":null,"slug":"zaimki"},"content":{"pl":{"slug":"zaimki","title":"Zaimki.pl","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/zaimki_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022362.08219178082\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAbCAYAAAAULC3gAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEZ0lEQVRIiZ2Xy3bbRgyGP8yFFCnZObFPe3rd9P0fprsu2nVzYiVpLFKiKM4MuqAoUyRlp8VqNMJgfgA\/MKAcDo0yEWMNMt0ERAQRA+h5vaQFMUYAQggw0rHG3DwziJv+v\/9ri1153MqToiKmVxBrcLkje7+GM9wlUCmly54xZtGptm2JMZFjMblD7IuemRrMHtfYMkOcRQTcJkeMoF3EeDe7QFWv1imlF+MTQIOutRaYJaY\/M93IHtaY3OEfSlY\/vsNtcj6HivKX97hNDsDT0xOqiqpS13WfGqBtW9r2dLH18ePTZb0\/HGiaBlXFOYdC77i9hmDGHg5etNuKeOwA+PLlH6qqZrv9hKoSY+R5t6Pe7wE4HA6EEFBVnp62bLdboOfPbrejbVsAqt2O3a5CVanqmg9\/f6BpmlmE5Ng0V5C6fw5o6nf8uwLj7SIXLgbOPEopMXUOek6lpCP9IWXDbzPmPQ4RGBn61O4oVitOXYevOsqy4Ni2aFK8dzjnuLu7m4FS1QuZx7zsAacr\/dccdFOvNus13ntAqPc1eZ6B9q3AGHMp6WkUbslSmY\/Bz\/SPx6OOQXWfX\/IqgBmF95ZoSlf9Zun\/sdvjduHucuzqpXpnddx9al7QK1w65MI6hsCfv\/9BXq447huss7z\/\/pHvfv7hzbPDWoxcA1oiol6tblttmyM\/\/fYrMUT0UclWOZoS4dRhvfs2RBNxAyEH8Y8r4LoDC8tcyB5XLzZFXstaX2lj50UwItjSXwOaHvwcKsqywFpLSglrLdbal7yfW793nqJYj+zLm+\/bNBt2gZ+zlDnv8D7j6\/NXsiwjNA3eObouUBQFRgQUAh2wuoCBN6pnkolbMovQu\/t76romxUToAnVdU5YlIUYy78l8zvp+g55byfT6W6C+tfzNvImZCy1iOodZAJTC52zuNmBHRt4YJ65tX+suRewqZSKCMYI1BkWJXWSz2aCqWGN5PlSoQFkUiLf\/vemN0jY8zuNzqooTzoU48sBaS+Y9yWr\/9jiHMYbS5ZTrcvZCvwZqCmB4iAcxk6HNITIraxFBjEFImHN5GhGOsWPVhn5suBGd4bIhGkvTxC3wcE7ZNL8xpouysZYQI4SIc47t7gt2bzl1HQ\/lPfl9uXjxrQd0Wm2zcz1vrg+L6UvbGNP3IARrLVVVEUKkbU9k3mOMuTl23Crxt2ZqadtWx+Htuo663rPf7\/HekZISY0AVnLPEmHDO9p0ZOQ\/ycJeXlPebywx+K0rDkHcVlRGP3LSDxpRQTZxOJ4qioKp2FEXB8djiJefh4e7NoW18+TQiAz2mabt8GCyFNsZIlmcc2yPG2svEV7cHvlbPhLq9TJX\/R17rR0sxJSXldOqHdUGoqqrnSkrU9Z66OZAWBrW5qbd5NHDYGINzbv50pJTw3uOdI4RACIEuBKzryZ15j4pSHw5Yayj9CpPPP4\/GoKYP71LaBplZyrK+xzjv+vcsBB4eLOZsYDzGWmsRN6nQyaW3JoBb5f8voc2F\/xkJVV0AAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/zaimki_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022362.08219178082\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EPolska gramatyka jest skomplikowana i silnie zgenderyzowana. Nie oznacza to jednak, \u017ce niemo\u017cliwe jest u\u017cywanie innych form ni\u017c \u201eon\u201d i \u201eona\u201d.\u003C\/p\u003E\n\u003Cp\u003ETo narz\u0119dzie udost\u0119pnia linki do przyk\u0142ad\u00f3w u\u017cycia (w prostych zdaniach oraz w literaturze, prasie, filmach i serialach) zaimk\u00f3w i innych form p\u0142ciowych \u2013 nie tylko normatywnych \u201eon\u201d i \u201eona\u201d, lecz tak\u017ce form niebinarnych.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/zaimki_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022724.16438356164\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAbCAYAAAAULC3gAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEZ0lEQVRIiZ2Xy3bbRgyGP8yFFCnZObFPe3rd9P0fprsu2nVzYiVpLFKiKM4MuqAoUyRlp8VqNMJgfgA\/MKAcDo0yEWMNMt0ERAQRA+h5vaQFMUYAQggw0rHG3DwziJv+v\/9ri1153MqToiKmVxBrcLkje7+GM9wlUCmly54xZtGptm2JMZFjMblD7IuemRrMHtfYMkOcRQTcJkeMoF3EeDe7QFWv1imlF+MTQIOutRaYJaY\/M93IHtaY3OEfSlY\/vsNtcj6HivKX97hNDsDT0xOqiqpS13WfGqBtW9r2dLH18ePTZb0\/HGiaBlXFOYdC77i9hmDGHg5etNuKeOwA+PLlH6qqZrv9hKoSY+R5t6Pe7wE4HA6EEFBVnp62bLdboOfPbrejbVsAqt2O3a5CVanqmg9\/f6BpmlmE5Ng0V5C6fw5o6nf8uwLj7SIXLgbOPEopMXUOek6lpCP9IWXDbzPmPQ4RGBn61O4oVitOXYevOsqy4Ni2aFK8dzjnuLu7m4FS1QuZx7zsAacr\/dccdFOvNus13ntAqPc1eZ6B9q3AGHMp6WkUbslSmY\/Bz\/SPx6OOQXWfX\/IqgBmF95ZoSlf9Zun\/sdvjduHucuzqpXpnddx9al7QK1w65MI6hsCfv\/9BXq447huss7z\/\/pHvfv7hzbPDWoxcA1oiol6tblttmyM\/\/fYrMUT0UclWOZoS4dRhvfs2RBNxAyEH8Y8r4LoDC8tcyB5XLzZFXstaX2lj50UwItjSXwOaHvwcKsqywFpLSglrLdbal7yfW793nqJYj+zLm+\/bNBt2gZ+zlDnv8D7j6\/NXsiwjNA3eObouUBQFRgQUAh2wuoCBN6pnkolbMovQu\/t76romxUToAnVdU5YlIUYy78l8zvp+g55byfT6W6C+tfzNvImZCy1iOodZAJTC52zuNmBHRt4YJ65tX+suRewqZSKCMYI1BkWJXWSz2aCqWGN5PlSoQFkUiLf\/vemN0jY8zuNzqooTzoU48sBaS+Y9yWr\/9jiHMYbS5ZTrcvZCvwZqCmB4iAcxk6HNITIraxFBjEFImHN5GhGOsWPVhn5suBGd4bIhGkvTxC3wcE7ZNL8xpouysZYQI4SIc47t7gt2bzl1HQ\/lPfl9uXjxrQd0Wm2zcz1vrg+L6UvbGNP3IARrLVVVEUKkbU9k3mOMuTl23Crxt2ZqadtWx+Htuo663rPf7\/HekZISY0AVnLPEmHDO9p0ZOQ\/ycJeXlPebywx+K0rDkHcVlRGP3LSDxpRQTZxOJ4qioKp2FEXB8djiJefh4e7NoW18+TQiAz2mabt8GCyFNsZIlmcc2yPG2svEV7cHvlbPhLq9TJX\/R17rR0sxJSXldOqHdUGoqqrnSkrU9Z66OZAWBrW5qbd5NHDYGINzbv50pJTw3uOdI4RACIEuBKzryZ15j4pSHw5Yayj9CpPPP4\/GoKYP71LaBplZyrK+xzjv+vcsBB4eLOZsYDzGWmsRN6nQyaW3JoBb5f8voc2F\/xkJVV0AAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/zaimki_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022724.16438356164\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EPolska gramatyka jest skomplikowana i silnie zgenderyzowana. Nie oznacza to jednak, \u017ce niemo\u017cliwe jest u\u017cywanie innych form ni\u017c \u201eon\u201d i \u201eona\u201d.\u003C\/p\u003E\n\u003Cp\u003ETo narz\u0119dzie udost\u0119pnia linki do przyk\u0142ad\u00f3w u\u017cycia (w prostych zdaniach oraz w literaturze, prasie, filmach i serialach) zaimk\u00f3w i innych form p\u0142ciowych \u2013 nie tylko normatywnych \u201eon\u201d i \u201eona\u201d, lecz tak\u017ce form niebinarnych.\u003C\/p\u003E\n\u003Cp\u003EDlaczego nale\u017cy je respektowa\u0107? Bo zwracanie si\u0119 do kogo\u015b tak, jak sobie \u017cyczy, jest podstaw\u0105 relacji spo\u0142ecznych. Nie powiesz do Ani \u201cFranku\u201d, nie powiesz \u201cna ty\u201d do osoby, z kt\u00f3r\u0105 jeste\u015b \u201cna pan\u201d, itp. A s\u0105 osoby, kt\u00f3re nie chc\u0105, by im m\u00f3wi\u0107 \u201con\u201d ani \u201cona\u201d. Czy to uszanujesz, \u015bwiadczy wy\u0142\u0105cznie o Tobie.\u003C\/p\u003E\n\u003Cp\u003EWarto wrzuci\u0107 link do swoich zaimk\u00f3w na swoje profile na portalach spo\u0142eczno\u015bciowych \u2013 nawet je\u015bli jeste\u015b cis i u\u017cywasz \u201eon\u201d lub \u201eona\u201d \u2013 poniewa\u017c dzi\u0119ki temu pokazujesz wsparcie dla spo\u0142eczno\u015bci trans i normalizujesz podawanie zaimk\u00f3w przez osoby, kt\u00f3rych zaimki nie s\u0105 oczywiste \u003Ca href=\u0022\/blog\/why-everyone-should-have-pronouns-in-their-bio\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-people-carry\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E (wi\u0119cej powod\u00f3w tutaj)\u003C\/a\u003E.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["zaimki","pronouns","gender","p\u0142e\u0107","javascript","nuxt","vue"],"hasMore":true,"image":"https:\/\/avris.it\/image\/zaimki_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/zaimki_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/zaimki_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022181.04109589041\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EPolska gramatyka jest skomplikowana i silnie zgenderyzowana. Nie oznacza to jednak, \u017ce niemo\u017cliwe jest u\u017cywanie innych form ni\u017c \u201eon\u201d i \u201eona\u201d.\u003C\/p\u003E\n\u003Cp\u003ETo narz\u0119dzie udost\u0119pnia linki do przyk\u0142ad\u00f3w u\u017cycia (w prostych zdaniach oraz w literaturze, prasie, filmach i serialach) zaimk\u00f3w i innych form p\u0142ciowych \u2013 nie tylko normatywnych \u201eon\u201d i \u201eona\u201d, lecz tak\u017ce form niebinarnych.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/zaimki_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/zaimki_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022181.04109589041\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EPolska gramatyka jest skomplikowana i silnie zgenderyzowana. Nie oznacza to jednak, \u017ce niemo\u017cliwe jest u\u017cywanie innych form ni\u017c \u201eon\u201d i \u201eona\u201d.\u003C\/p\u003E\n\u003Cp\u003ETo narz\u0119dzie udost\u0119pnia linki do przyk\u0142ad\u00f3w u\u017cycia (w prostych zdaniach oraz w literaturze, prasie, filmach i serialach) zaimk\u00f3w i innych form p\u0142ciowych \u2013 nie tylko normatywnych \u201eon\u201d i \u201eona\u201d, lecz tak\u017ce form niebinarnych.\u003C\/p\u003E\n\u003Cp\u003EDlaczego nale\u017cy je respektowa\u0107? Bo zwracanie si\u0119 do kogo\u015b tak, jak sobie \u017cyczy, jest podstaw\u0105 relacji spo\u0142ecznych. Nie powiesz do Ani \u201cFranku\u201d, nie powiesz \u201cna ty\u201d do osoby, z kt\u00f3r\u0105 jeste\u015b \u201cna pan\u201d, itp. A s\u0105 osoby, kt\u00f3re nie chc\u0105, by im m\u00f3wi\u0107 \u201con\u201d ani \u201cona\u201d. Czy to uszanujesz, \u015bwiadczy wy\u0142\u0105cznie o Tobie.\u003C\/p\u003E\n\u003Cp\u003EWarto wrzuci\u0107 link do swoich zaimk\u00f3w na swoje profile na portalach spo\u0142eczno\u015bciowych \u2013 nawet je\u015bli jeste\u015b cis i u\u017cywasz \u201eon\u201d lub \u201eona\u201d \u2013 poniewa\u017c dzi\u0119ki temu pokazujesz wsparcie dla spo\u0142eczno\u015bci trans i normalizujesz podawanie zaimk\u00f3w przez osoby, kt\u00f3rych zaimki nie s\u0105 oczywiste \u003Ca href=\u0022\/blog\/why-everyone-should-have-pronouns-in-their-bio.lite\u0022\u003E (wi\u0119cej powod\u00f3w tutaj)\u003C\/a\u003E.\u003C\/p\u003E","words":177,"readTime":null,"lang":"pl"},"en":{"slug":"pronouns","title":"Pronouns.page","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/pronouns_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022360.10899182561\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAbCAYAAAAULC3gAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEuUlEQVRIiY2XyXLjRhKGv8wqrJLIVtty2OOJ6YMPfv93mNPc5iUc0SORrYUEiKWq5gCgBJAQ5YxgBIDKyvxzT0pd10FECCEAICKoKmukqohI5DsnEcF7v\/jN+Ywxq3LnZIEIpt0daXdH0i8lofeoVcQqYhTfOGyREnpHcB4xSvnbl4WwEALe+whuDTTAjx\/P5ElKqhZTpkujAaZr6X2JvclINjn5rxvEKppYggsktxnu1IIIru4wZRoNmQOae+ucJrBJmpBkKWIvI6EAUYwKxe9bwigre7gj+VLQFVDRUv5+T\/7LHbd\/PPB0eF4A2e9\/RIV1XeOci6CedrsF4OA9NrFoatcBLaz0gXZ\/pHup47eqrnl9e4vvLy+vVHVFXQ88zjnqulqcd12PiNC2LcfjkaZpAGiahu\/\/e+RwOFyAAZC6roOMXgqdo3s9DQcIqoK9L1GznuSMPAHwzq1y9P3yuxpFYziH+3Maknp8qbuGo68AIc8znHPoa4+oIECaptSnE1mastlsBpFjZc0rc54\/53l2rYrhLGRFUZBmGdvthqqq8N5jjCKjYOccRnVRvt77q8l8\/n4O8JykruvI4RuHe2tmwubuXacQwnuZcskbQiAEv\/imoiAgRkl\/KhdndhITAH\/q6ffNewyngw+e\/\/vv\/5BkGTebW54f9yDwzz++8dOvv3x6F0CsXABaeKh\/aWi\/VzC5VeTT59f9M653ZEVGVuQYa\/\/2XbXK7Z8\/XwKKHmoc7tAiyML7k4vnNITieiOcMePPckdVESOkX1dCNlEnjld\/JE1TRMB5T1EUuL4DBGMNXdsBA5jtdrsYER9Vz1QQF4BWjFh26hAoioKmaajqGu88p\/rE29TEek+eZ1iboMZcHR1zWlP8Ee9iluV5TpZleO9xveNpt6PtWlSUqqrouo6mafDekWmCXhmgn4G6CigWgAhqBuUAN2UJAbquw3vHqWt4fHzi7fUN8QwJeqbkQ0Ur4VzjjVxTLkwd2SZ2tCpgrcUYgxrDdrul6Tr+2n9n97TD1d0qgM9oWlW89zjn6Pueruvey\/6jJPvIqmu8c29MXpsS+7yzny9tdhIuIpxOJ56fXzgcDyQ24du3fy2YnXNXK+kcwFrSfzY6IiAAay0IPDw8sLm74+lph6pyf\/+Fx8cnQgjYxNI2LWqUPMu5uSmjot1+j4xWex8QEb5+vY\/Kdrs9Tduw3WzI8zyCnHvbzvtIYGiCiU3ijFLVcdkaLqgoaZaOOaU49z6nEpvgvSdNM7x3gCw8kqQJCDjnCRCH9gWgiBSw1pCmSZzs1prY1MqyjAm+RqpKmiYURbG6Uxs1OHX0fReH9sV6UlVVuBbX+eI+V\/x3CuCjUj\/v2nMD7RzMoXP8dagXF6a\/SGH+HMK7hRAbZD\/em95FJBZCP3pcVKOR27LgH0USFzwRWc6yABxPJ9q2o24a7m5KnPf0vYuxttbQ9w4BfAjDChsGsM57GMEnxoAMO7rzfkx0jzUGRLgtC8K4PQ5yBygXa39iLSEMbrzzFtMH0BRUwXsIwqHwbDcbRiTEXj+P\/PnKsbocrWyYx+MxnnY+UE1Vs8gduVg\/5FzY2OVFJD6vKZzIeY8Cd8mQP8YYRIT\/A4gozUxo6rCGAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/pronouns_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022360.10899182561\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWe all have pronouns. They\u0027re those words that we use instead of calling someone by their name every time we mention them. Most people use \u201che\/him\u201d and \u201cshe\/her\u201d, so we automatically assume which one to call them based on someone\u0027s looks. But it\u0027s actually not that simple\u2026\u003C\/p\u003E\n\u003Cp\u003EGender is complicated. Some people \u201cdon\u0027t look like\u201d their gender. Some prefer being called in a different way from what you\u0027d assume. Some people don\u0027t fit into the boxes of \u201cmale\u201d or \u201cfemale\u201d and prefer more neutral language.\u003C\/p\u003E\n\u003Cp\u003EThis tool lets you share a link to your pronouns, with example sentences, so that you can show people how you like to be called.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/pronouns_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022720.21798365123\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAbCAYAAAAULC3gAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEuUlEQVRIiY2XyXLjRhKGv8wqrJLIVtty2OOJ6YMPfv93mNPc5iUc0SORrYUEiKWq5gCgBJAQ5YxgBIDKyvxzT0pd10FECCEAICKoKmukqohI5DsnEcF7v\/jN+Ywxq3LnZIEIpt0daXdH0i8lofeoVcQqYhTfOGyREnpHcB4xSvnbl4WwEALe+whuDTTAjx\/P5ElKqhZTpkujAaZr6X2JvclINjn5rxvEKppYggsktxnu1IIIru4wZRoNmQOae+ucJrBJmpBkKWIvI6EAUYwKxe9bwigre7gj+VLQFVDRUv5+T\/7LHbd\/PPB0eF4A2e9\/RIV1XeOci6CedrsF4OA9NrFoatcBLaz0gXZ\/pHup47eqrnl9e4vvLy+vVHVFXQ88zjnqulqcd12PiNC2LcfjkaZpAGiahu\/\/e+RwOFyAAZC6roOMXgqdo3s9DQcIqoK9L1GznuSMPAHwzq1y9P3yuxpFYziH+3Maknp8qbuGo68AIc8znHPoa4+oIECaptSnE1mastlsBpFjZc0rc54\/53l2rYrhLGRFUZBmGdvthqqq8N5jjCKjYOccRnVRvt77q8l8\/n4O8JykruvI4RuHe2tmwubuXacQwnuZcskbQiAEv\/imoiAgRkl\/KhdndhITAH\/q6ffNewyngw+e\/\/vv\/5BkGTebW54f9yDwzz++8dOvv3x6F0CsXABaeKh\/aWi\/VzC5VeTT59f9M653ZEVGVuQYa\/\/2XbXK7Z8\/XwKKHmoc7tAiyML7k4vnNITieiOcMePPckdVESOkX1dCNlEnjld\/JE1TRMB5T1EUuL4DBGMNXdsBA5jtdrsYER9Vz1QQF4BWjFh26hAoioKmaajqGu88p\/rE29TEek+eZ1iboMZcHR1zWlP8Ee9iluV5TpZleO9xveNpt6PtWlSUqqrouo6mafDekWmCXhmgn4G6CigWgAhqBuUAN2UJAbquw3vHqWt4fHzi7fUN8QwJeqbkQ0Ur4VzjjVxTLkwd2SZ2tCpgrcUYgxrDdrul6Tr+2n9n97TD1d0qgM9oWlW89zjn6Pueruvey\/6jJPvIqmu8c29MXpsS+7yzny9tdhIuIpxOJ56fXzgcDyQ24du3fy2YnXNXK+kcwFrSfzY6IiAAay0IPDw8sLm74+lph6pyf\/+Fx8cnQgjYxNI2LWqUPMu5uSmjot1+j4xWex8QEb5+vY\/Kdrs9Tduw3WzI8zyCnHvbzvtIYGiCiU3ijFLVcdkaLqgoaZaOOaU49z6nEpvgvSdNM7x3gCw8kqQJCDjnCRCH9gWgiBSw1pCmSZzs1prY1MqyjAm+RqpKmiYURbG6Uxs1OHX0fReH9sV6UlVVuBbX+eI+V\/x3CuCjUj\/v2nMD7RzMoXP8dagXF6a\/SGH+HMK7hRAbZD\/em95FJBZCP3pcVKOR27LgH0USFzwRWc6yABxPJ9q2o24a7m5KnPf0vYuxttbQ9w4BfAjDChsGsM57GMEnxoAMO7rzfkx0jzUGRLgtC8K4PQ5yBygXa39iLSEMbrzzFtMH0BRUwXsIwqHwbDcbRiTEXj+P\/PnKsbocrWyYx+MxnnY+UE1Vs8gduVg\/5FzY2OVFJD6vKZzIeY8Cd8mQP8YYRIT\/A4gozUxo6rCGAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/pronouns_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022720.21798365123\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWe all have pronouns. They\u0027re those words that we use instead of calling someone by their name every time we mention them. Most people use \u201che\/him\u201d and \u201cshe\/her\u201d, so we automatically assume which one to call them based on someone\u0027s looks. But it\u0027s actually not that simple\u2026\u003C\/p\u003E\n\u003Cp\u003EGender is complicated. Some people \u201cdon\u0027t look like\u201d their gender. Some prefer being called in a different way from what you\u0027d assume. Some people don\u0027t fit into the boxes of \u201cmale\u201d or \u201cfemale\u201d and prefer more neutral language.\u003C\/p\u003E\n\u003Cp\u003EThis tool lets you share a link to your pronouns, with example sentences, so that you can show people how you like to be called.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["pronouns","gender","javascript","nuxt","vue"],"hasMore":false,"image":"https:\/\/avris.it\/image\/pronouns_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/pronouns_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/pronouns_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022180.05449591281\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWe all have pronouns. They\u0027re those words that we use instead of calling someone by their name every time we mention them. Most people use \u201che\/him\u201d and \u201cshe\/her\u201d, so we automatically assume which one to call them based on someone\u0027s looks. But it\u0027s actually not that simple\u2026\u003C\/p\u003E\n\u003Cp\u003EGender is complicated. Some people \u201cdon\u0027t look like\u201d their gender. Some prefer being called in a different way from what you\u0027d assume. Some people don\u0027t fit into the boxes of \u201cmale\u201d or \u201cfemale\u201d and prefer more neutral language.\u003C\/p\u003E\n\u003Cp\u003EThis tool lets you share a link to your pronouns, with example sentences, so that you can show people how you like to be called.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/pronouns_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/pronouns_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022180.05449591281\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWe all have pronouns. They\u0027re those words that we use instead of calling someone by their name every time we mention them. Most people use \u201che\/him\u201d and \u201cshe\/her\u201d, so we automatically assume which one to call them based on someone\u0027s looks. But it\u0027s actually not that simple\u2026\u003C\/p\u003E\n\u003Cp\u003EGender is complicated. Some people \u201cdon\u0027t look like\u201d their gender. Some prefer being called in a different way from what you\u0027d assume. Some people don\u0027t fit into the boxes of \u201cmale\u201d or \u201cfemale\u201d and prefer more neutral language.\u003C\/p\u003E\n\u003Cp\u003EThis tool lets you share a link to your pronouns, with example sentences, so that you can show people how you like to be called.\u003C\/p\u003E","words":112,"readTime":null,"lang":"en"}}},"projects\/avris-astro":{"key":"projects\/avris-astro","type":"article","published":true,"meta":{"createdAt":"2020-07-04T18:45:19+02:00","publishedAt":"2020-07-04T18:45:19+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/astro.avris.it\/","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-astro"},"content":{"en":{"slug":"avris-astro","title":"Avris Astro","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-astro_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022214.10698096102\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAQCAYAAAB+690jAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACFElEQVRIic2UzW7bMBCEP4qkKMuW7bZxG\/TQQ97\/hXoI0AQBmhQKUjeSTEv86cGwAFeOFbRG0LmQ0C61szNLiuvr6xhjRAjBqRU4GdvHgUHO\/ttrchQvoKoqHh4eWC6XeO+ZTqdYaxFCIIQghECapjjnaJqGoiiIMWKtxRjTF4gxYozBOUdZllxdXfUEjuFFQkoplFJkWcbt7S3OOTabDQDz+ZynpyeklCilsNbSdR3ee7Iso65rQgjUdU2apuR53pMegzhlWQiB9XqNUgpjDCEEuq7rCXddh5QSIUS\/d86htSaEgPcepXY9O+dYLBZ\/bxns\/DbG4L3HWtsrsi++n4sQAlprpJQ9EQCtNUIIkiQ5adNBzbIs43ja20HEHUZv2Tlu0GtyTloG8HjfUG0EZpZyuZKD+P1NhTZQLA1ppg9iN1\/X6GXBZhuZTgSXq+TfFfIuIpV4sTPXBaQSR7t3XUDp5LwKff\/2TPZ+RufgcpXw52z+uKuRRY6Ugot3YnBWLWb9mU8XZ1Bo23i0SUikOJpT\/WzJ5xohht3bxqF00it4FoXarefxV8THhC+fhzPUbj1t2ZLlmnxmDmKuDTTVFu88ZqIolpNRhUYJ2cZx8TEnRgghHli2m7HAcpURjzweJpdYGyg+5OjRSjuMmpoXmo2NVHUYzA+AmUg2dUtru+HPE0GaSZ7rQOdeR+i\/e4fGx\/6N8Ruwf8seAIis\/gAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-astro_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022214.10698096102\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EThe most accurate horoscope ever!\u003C\/p\u003E\n\u003Cp\u003ESeriously, you won\u0027t get a more accurate reading anywhere else online \ud83d\ude09\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-astro_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022428.21396192203\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAQCAYAAAB+690jAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACFElEQVRIic2UzW7bMBCEP4qkKMuW7bZxG\/TQQ97\/hXoI0AQBmhQKUjeSTEv86cGwAFeOFbRG0LmQ0C61szNLiuvr6xhjRAjBqRU4GdvHgUHO\/ttrchQvoKoqHh4eWC6XeO+ZTqdYaxFCIIQghECapjjnaJqGoiiIMWKtxRjTF4gxYozBOUdZllxdXfUEjuFFQkoplFJkWcbt7S3OOTabDQDz+ZynpyeklCilsNbSdR3ee7Iso65rQgjUdU2apuR53pMegzhlWQiB9XqNUgpjDCEEuq7rCXddh5QSIUS\/d86htSaEgPcepXY9O+dYLBZ\/bxns\/DbG4L3HWtsrsi++n4sQAlprpJQ9EQCtNUIIkiQ5adNBzbIs43ja20HEHUZv2Tlu0GtyTloG8HjfUG0EZpZyuZKD+P1NhTZQLA1ppg9iN1\/X6GXBZhuZTgSXq+TfFfIuIpV4sTPXBaQSR7t3XUDp5LwKff\/2TPZ+RufgcpXw52z+uKuRRY6Ugot3YnBWLWb9mU8XZ1Bo23i0SUikOJpT\/WzJ5xohht3bxqF00it4FoXarefxV8THhC+fhzPUbj1t2ZLlmnxmDmKuDTTVFu88ZqIolpNRhUYJ2cZx8TEnRgghHli2m7HAcpURjzweJpdYGyg+5OjRSjuMmpoXmo2NVHUYzA+AmUg2dUtru+HPE0GaSZ7rQOdeR+i\/e4fGx\/6N8Ruwf8seAIis\/gAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-astro_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022428.21396192203\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EThe most accurate horoscope ever!\u003C\/p\u003E\n\u003Cp\u003ESeriously, you won\u0027t get a more accurate reading anywhere else online \ud83d\ude09\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["astrology","horoscope","zodiac","bullshit","joke"],"hasMore":false,"image":"https:\/\/avris.it\/image\/avris-astro_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-astro_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-astro_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022107.05349048051\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EThe most accurate horoscope ever!\u003C\/p\u003E\n\u003Cp\u003ESeriously, you won\u0027t get a more accurate reading anywhere else online \ud83d\ude09\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-astro_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-astro_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022107.05349048051\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EThe most accurate horoscope ever!\u003C\/p\u003E\n\u003Cp\u003ESeriously, you won\u0027t get a more accurate reading anywhere else online \ud83d\ude09\u003C\/p\u003E","words":16,"readTime":null,"lang":"en"}}},"projects\/sumup":{"key":"projects\/sumup","type":"article","published":true,"meta":{"createdAt":"2020-06-16T14:48:41+02:00","publishedAt":"2020-06-16T14:48:41+02:00","links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/sumup.avris.it","displayUrl":null}],"category":"projects","subcategory":null,"slug":"sumup"},"content":{"en":{"slug":"sumup","title":"SumUp","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/sumup_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022330.36077705828\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADgElEQVRIicWWzW4cRRDHf9UfM7O7idf22gE7ENsCiQtcIiEU5Rl4Aq48CScehMfgyAkJjpEiIQUJE8XGMpbxfk13V3OY3bWd7K690SL+0kgzrerpX3dVdZXkRogIb+vi9Rm+9HR6XW7aLHsHEJHZ+M2x+9i4dygmCqOaH779Hld6nn\/3DXVdoznjrKUOgaOjQx7t7i6a\/t5aCORKzxdfP6fqtDg4eIKqUlUtxuMx\/UGfrc3NtcMAyCKXqSonJyeIMRTek1Sp6xrnHCJCDBERwRgBEVJKWGshg2ZFk1IUBSKQUiLn5p\/OOYqiYHOzO9dlZhFpVmV00SePI+ev\/0JDoixKqrJEk1JVJWVZIGJw1iKAEYP3jqyZVqsCAURQzRgjbHa7dGxBt7ux+gnlnAnjcG1oBOPsezhhvqwxqwV1zpmgifF4TAgR5yzGGGKMgGCMQTVRFAVlWZFSZDAYYK0lhNC4byJjDIgggPce5xy2LOauuxDoprx3qOokFprjh2Z3zTO1bHbrnJttyhqD5owBQozkzC3YlYCstXQ3rv191b+i3x\/iHLTbLVpVC2iCGKCsSgrv8ROgq36fB53ObH6IgfE4kFQXrrk0y676Ay4vL\/HiMEExzqJJySlhvEOTYr2l1X2A8Q5yBpoTu44PgMzsGCfxUpXFajEEUBQFOzs7pBDRkEAgJ0VsExNoBgExC5N1ZS0FqvtDXv74CyJgnKW99ZB\/Tv9m4+ARnY96XLw4pvfJY7YeP1ob0FKX1TFClqkl5NvuIEOejCP89y4bD0dAxntPHQLWNNkRU7wV7OvUUqBpCRAxkDOqTdpnvU756S5jjJydnTEcjdjf25uUjcXVfmUgYwzHP72gu9\/jydPPFrYcsx85x+nPv9E73KM8LO9ceGUgaNye0+I746ZSSmw\/PcI6x\/Hxn4gI+\/t76wXKOXP+xykPP9hm6+PlmWSt5fzXV2hMIIKvCq5evsFXnqNnn68HaKp53eTbSimx++Wn1HVNu91mNBrRarXo9bbvDXMnkLEW65tW5C5Za2m9+p0Pn301tz29rxbeQwAaJ8V0cjP\/rz01gFiDuWe6rktL+6G6rhERbKhRbxBpepg8yT4jgvHuHdjpd4qxqX3GoDFgvZ9e1Dg\/f+mlQIPhEEFoS6ZfK5WHqAnNmcI6YlKqJV2kqqKT3lvTiBR0VjrsRmfunH8Bdwwal0oloW0AAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/sumup_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022330.36077705828\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ESumUp is a simple tool that shows all possible combinations of numbers that add up to a given sum.\nIt\u0027s useful for certain types of puzzles, like for example\n\u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=hOAB65KFl6I\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E this killer sudoku\u003C\/a\u003E.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/sumup_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022660.72155411656\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADgElEQVRIicWWzW4cRRDHf9UfM7O7idf22gE7ENsCiQtcIiEU5Rl4Aq48CScehMfgyAkJjpEiIQUJE8XGMpbxfk13V3OY3bWd7K690SL+0kgzrerpX3dVdZXkRogIb+vi9Rm+9HR6XW7aLHsHEJHZ+M2x+9i4dygmCqOaH779Hld6nn\/3DXVdoznjrKUOgaOjQx7t7i6a\/t5aCORKzxdfP6fqtDg4eIKqUlUtxuMx\/UGfrc3NtcMAyCKXqSonJyeIMRTek1Sp6xrnHCJCDBERwRgBEVJKWGshg2ZFk1IUBSKQUiLn5p\/OOYqiYHOzO9dlZhFpVmV00SePI+ev\/0JDoixKqrJEk1JVJWVZIGJw1iKAEYP3jqyZVqsCAURQzRgjbHa7dGxBt7ux+gnlnAnjcG1oBOPsezhhvqwxqwV1zpmgifF4TAgR5yzGGGKMgGCMQTVRFAVlWZFSZDAYYK0lhNC4byJjDIgggPce5xy2LOauuxDoprx3qOokFprjh2Z3zTO1bHbrnJttyhqD5owBQozkzC3YlYCstXQ3rv191b+i3x\/iHLTbLVpVC2iCGKCsSgrv8ROgq36fB53ObH6IgfE4kFQXrrk0y676Ay4vL\/HiMEExzqJJySlhvEOTYr2l1X2A8Q5yBpoTu44PgMzsGCfxUpXFajEEUBQFOzs7pBDRkEAgJ0VsExNoBgExC5N1ZS0FqvtDXv74CyJgnKW99ZB\/Tv9m4+ARnY96XLw4pvfJY7YeP1ob0FKX1TFClqkl5NvuIEOejCP89y4bD0dAxntPHQLWNNkRU7wV7OvUUqBpCRAxkDOqTdpnvU756S5jjJydnTEcjdjf25uUjcXVfmUgYwzHP72gu9\/jydPPFrYcsx85x+nPv9E73KM8LO9ceGUgaNye0+I746ZSSmw\/PcI6x\/Hxn4gI+\/t76wXKOXP+xykPP9hm6+PlmWSt5fzXV2hMIIKvCq5evsFXnqNnn68HaKp53eTbSimx++Wn1HVNu91mNBrRarXo9bbvDXMnkLEW65tW5C5Za2m9+p0Pn301tz29rxbeQwAaJ8V0cjP\/rz01gFiDuWe6rktL+6G6rhERbKhRbxBpepg8yT4jgvHuHdjpd4qxqX3GoDFgvZ9e1Dg\/f+mlQIPhEEFoS6ZfK5WHqAnNmcI6YlKqJV2kqqKT3lvTiBR0VjrsRmfunH8Bdwwal0oloW0AAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/sumup_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022660.72155411656\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ESumUp is a simple tool that shows all possible combinations of numbers that add up to a given sum.\nIt\u0027s useful for certain types of puzzles, like for example\n\u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=hOAB65KFl6I\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E this killer sudoku\u003C\/a\u003E.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["sudoku","numbers","puzzle","logic","svelte","javascript","js","nodejs"],"hasMore":false,"image":"https:\/\/avris.it\/image\/sumup_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/sumup_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/sumup_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022165.18038852914\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ESumUp is a simple tool that shows all possible combinations of numbers that add up to a given sum.\nIt\u0027s useful for certain types of puzzles, like for example\n\u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=hOAB65KFl6I\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E this killer sudoku\u003C\/a\u003E.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/sumup_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/sumup_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022165.18038852914\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ESumUp is a simple tool that shows all possible combinations of numbers that add up to a given sum.\nIt\u0027s useful for certain types of puzzles, like for example\n\u003Ca href=\u0022https:\/\/www.youtube.com\/watch?v=hOAB65KFl6I\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E this killer sudoku\u003C\/a\u003E.\u003C\/p\u003E","words":32,"readTime":null,"lang":"en"}}},"projects\/avris-booster-quick-start-of-new-projects":{"key":"projects\/avris-booster-quick-start-of-new-projects","type":"article","published":true,"meta":{"createdAt":"2020-04-13T11:56:14+02:00","publishedAt":"2020-04-13T11:56:14+02:00","group":null,"links":[{"icon":"brands gitlab","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/Booster","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-booster-quick-start-of-new-projects"},"content":{"en":{"slug":"avris-booster-quick-start-of-new-projects","title":"Avris Booster: Quick start of new projects","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/booster_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022329.18322295806\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADQUlEQVRIib2WS3IjVRBFT75PValUalltdxA0joABMzbQO2MXLIGFsA5mDBgYogMCW2pZn\/pmMijZVskf2jbqO3tV73Pz3nyZT84+\/GjscDYbM52MABCBi49z8lFKVTUoRlU1mAmvgQicpo7SR9LoWa5Kmlbv\/v\/08y\/2xPpX4f1XM9IkPjmnrGo+\/r24I6Sqt4QuLi6o6hrvPJvtFucEJ47z828Yj8fPJlTVLWkS+PW3j\/zw\/dd0qvz+xyXfvn\/Ln38t+O78lHo35wZhf4M8z4lJQvCe0ShDzXh39o4Yw73DPgcicLlYcTIZcblYY2ZkaaBuWoJ3\/HO1YjrJhmvM7Fah9WpF23VMp9MXETiEasenT0tEBBFH13WIgHMOU6OYTHoXnLtdMwg9zTKsalksN2AK9FydGKqKSUQwTBtEBCSCtYiAqhJjpKkbvPcYRpam1G3H7GT2gHwQgkdVh5\/3c6jrOjbbhs56Am+nY8x66W9wOO6\/WU\/wAOuypaxaVA3DwNjNM5pOSHzHmyIj2UuJgWVlWXK1LNmWNUn0JF5Isgwzw4lgXcVs9kC0j0BV2Yv3vkK+V2hg2R4fAJLgaWNABNq2YnttZGmkGCVk+RsO5z8FEcH7x+vWjbL7ew5yyHtPEhpUHeI8qp7MC1WjbKs+b\/JR8tmEXoJ7ls3nc5qmoSgK\/E5Skf4mqGpv305iMzBTnI90JjgUrLuLNgSKongWoYFlznmyLCeElqrzBBzgOTt5flG8wXMshgPLzBQ1o25aRnkkTZIHb88xEfYPNDNMW9qm5HpRIidTkpggcty82ce9OtS2HWZ9sUrT9MsrtD9YLq9Zr1eI8wgwnU7J8\/yoBA7jHViWJJG6yTBTzOB6tcKHgHPHU8mJGzTvwS0zoOtafAhkSSTEBCfutt\/ckD9sFcIrCAuPF0ZVpW1a6rphs17vlBImxRhxDhGH7DZQVUKIjEYZzvmXEzpAOExaw26T2oknphFxDuc8zjnG49ED27zm0SkDtQeWCeyqshBCwtnZ6X07\/u8H71OWhRDJ8xwRoSgmRzn\/vzDoZavVirZt6bq+f81mJ1+GxGOWmRlX8zkC5OMx680GVDHxOOeP1un3OfwL1QqaGbIjT+wAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/booster_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022329.18322295806\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI got super annoyed having to set up all the dependencies for each project every time I started one,\nand especially implementing user management... Log in, register, confirm email, forgot password,\nMFA, change email, impersonate, manage avatars, over and over again, booooooring!\u003C\/p\u003E\n\u003Cp\u003ESo here it is: a template for quickstarting new projects,\nwith all of the above (and more!) included out of the box!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/booster_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022658.36644591611\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADQUlEQVRIib2WS3IjVRBFT75PValUalltdxA0joABMzbQO2MXLIGFsA5mDBgYogMCW2pZn\/pmMijZVskf2jbqO3tV73Pz3nyZT84+\/GjscDYbM52MABCBi49z8lFKVTUoRlU1mAmvgQicpo7SR9LoWa5Kmlbv\/v\/08y\/2xPpX4f1XM9IkPjmnrGo+\/r24I6Sqt4QuLi6o6hrvPJvtFucEJ47z828Yj8fPJlTVLWkS+PW3j\/zw\/dd0qvz+xyXfvn\/Ln38t+O78lHo35wZhf4M8z4lJQvCe0ShDzXh39o4Yw73DPgcicLlYcTIZcblYY2ZkaaBuWoJ3\/HO1YjrJhmvM7Fah9WpF23VMp9MXETiEasenT0tEBBFH13WIgHMOU6OYTHoXnLtdMwg9zTKsalksN2AK9FydGKqKSUQwTBtEBCSCtYiAqhJjpKkbvPcYRpam1G3H7GT2gHwQgkdVh5\/3c6jrOjbbhs56Am+nY8x66W9wOO6\/WU\/wAOuypaxaVA3DwNjNM5pOSHzHmyIj2UuJgWVlWXK1LNmWNUn0JF5Isgwzw4lgXcVs9kC0j0BV2Yv3vkK+V2hg2R4fAJLgaWNABNq2YnttZGmkGCVk+RsO5z8FEcH7x+vWjbL7ew5yyHtPEhpUHeI8qp7MC1WjbKs+b\/JR8tmEXoJ7ls3nc5qmoSgK\/E5Skf4mqGpv305iMzBTnI90JjgUrLuLNgSKongWoYFlznmyLCeElqrzBBzgOTt5flG8wXMshgPLzBQ1o25aRnkkTZIHb88xEfYPNDNMW9qm5HpRIidTkpggcty82ce9OtS2HWZ9sUrT9MsrtD9YLq9Zr1eI8wgwnU7J8\/yoBA7jHViWJJG6yTBTzOB6tcKHgHPHU8mJGzTvwS0zoOtafAhkSSTEBCfutt\/ckD9sFcIrCAuPF0ZVpW1a6rphs17vlBImxRhxDhGH7DZQVUKIjEYZzvmXEzpAOExaw26T2oknphFxDuc8zjnG49ED27zm0SkDtQeWCeyqshBCwtnZ6X07\/u8H71OWhRDJ8xwRoSgmRzn\/vzDoZavVirZt6bq+f81mJ1+GxGOWmRlX8zkC5OMx680GVDHxOOeP1un3OfwL1QqaGbIjT+wAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/booster_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022658.36644591611\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI got super annoyed having to set up all the dependencies for each project every time I started one,\nand especially implementing user management... Log in, register, confirm email, forgot password,\nMFA, change email, impersonate, manage avatars, over and over again, booooooring!\u003C\/p\u003E\n\u003Cp\u003ESo here it is: a template for quickstarting new projects,\nwith all of the above (and more!) included out of the box!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["booster","quickstart","symfony","php","webpack","bootstrap","javascript","css","user management","template"],"hasMore":false,"image":"https:\/\/avris.it\/image\/booster_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/booster_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/booster_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022164.59161147903\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI got super annoyed having to set up all the dependencies for each project every time I started one,\nand especially implementing user management... Log in, register, confirm email, forgot password,\nMFA, change email, impersonate, manage avatars, over and over again, booooooring!\u003C\/p\u003E\n\u003Cp\u003ESo here it is: a template for quickstarting new projects,\nwith all of the above (and more!) included out of the box!\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/booster_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/booster_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022164.59161147903\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI got super annoyed having to set up all the dependencies for each project every time I started one,\nand especially implementing user management... Log in, register, confirm email, forgot password,\nMFA, change email, impersonate, manage avatars, over and over again, booooooring!\u003C\/p\u003E\n\u003Cp\u003ESo here it is: a template for quickstarting new projects,\nwith all of the above (and more!) included out of the box!\u003C\/p\u003E","words":64,"readTime":null,"lang":"en"}}},"projects\/avris-twemoji-backend-generated-twitter-emoji":{"key":"projects\/avris-twemoji-backend-generated-twitter-emoji","type":"article","published":true,"meta":{"createdAt":"2020-02-08T22:49:48+01:00","publishedAt":"2020-02-08T22:49:48+01:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/packagist.org\/packages\/avris\/twemoji","displayUrl":"avris\/twemoji"},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Twemoji","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-twemoji-backend-generated-twitter-emoji"},"content":{"en":{"slug":"avris-twemoji-backend-generated-twitter-emoji","title":"Avris Twemoji \u2013 Backend-generated Twitter Emoji","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/twemoji_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHlUlEQVRIiX2Xya8dRxXGf2eo6r73vfsmPz87ozMRCAEsAhEREUqIlEkooIAYAlIEC1iAWPAnsGfHAoFYwwqxCUECgUgiJRIEBCETEQlxJsfYsd9w33S7qw6LvnYQIEpd3S11DV99X506X8vV19wcUSpCELVCVMydWgpBoCK4GqZKcmc2O6TWChEQgQAigjAUEUFEgOBiiYh5rZeeREUEVARzx0RomhEeIUQEpRYkQIBSCsIwsKoOQEWhVpIq\/XwCRObtuNReBEBQlXcnl4vvQtSCqBHxbj9DSGpoLfjFDoISVCJAQxAdJiMEVQeEvlQMQRFCFFOdszEsBBm+za\/5zXA3ZrMOEYgYFiii6LyvqeJmJFU8RKGWOcEDI0QgIagaboqJYKK4KRKVWiu1lmEA92H1taJql6RSEaJWgmB5ZYXN8xeACiGIQ9SCqkCAmZLMSH4RkAAqUOdsCYjoXAZDUcyMbIlx00D07O3v07jTJCd7otZKKT19KSAM+6VWAC47tsHhzhSoA2kRqOY5KMV0kDib4qKJiA4JA6nopU0qqNlArSVUFBVDxVloFlgdLXNhuoWGEiVoPKGeIQohQt93A0MCJ66+mrdffQ2RQAJMBSGAhEjMJVOSKa4p0wfziLGLsQKqAztqmBrZnWwJxRBJNDlx7dFFdvemHHYdx45vMNvfY7q9g4mQXalRuf2eO3j5+RdZyg1BDJEFqA6iqIIIJFOyGx6akDSXC6EGmCiqhori5rga2TMuQjInSSJpw9raMp\/96udZW13hdz\/7Ja+feh1rFkk+RNNkeZHb77qD5x57kpV2BBQiYgCjggqYCaYDa+6Ckxukd2qNub4Aiqih5ogYbo5qws3mNXHn\/Z\/goW99kZeefoFHvv9TEoUbL7ucqJWd3Smeja989zs8\/fNHuXJpiVnpqNETUQbpdB5dadhDOSmm4NIuULuC1DqcQwGIIeKoJZI5qkYyp02ZsTtf++bnuPfBO5le2OHRHz5C1hGr45brb7ic3a1zbO0dcNe3v0xSoZ56g\/ddtsF0f4+DfkapPaV2oJXkhpngriQXUjJcxkvIrIdSCRj2CIpIQsUQT2R12pQYp8RDD9\/NvQ\/eCcAzTzxLomGyOGFx3LBzfp8TH\/0Q9zxwO942PPW9H7OxvoxGx9Z20PeJEgOgkIpqkLLjLqSkeBZcRhPIPRSQUAhFUBAHTZg6yZycEidPXsunv\/DJSylh+8yUI8eOcsWJDU7cfBVX3XIdC+tLRASv\/+pxFkaZUhdpm57cVJBKjY6+nxG1Qw1UA3MjN44nwZksQ1+IkAFMDNFlOK4JxZH5AfjwN+6\/dDID3Pf1u\/nPEhG8+fgfmZ09x9FrjnC4lel2N1nSDrGKWFBrR+0PEXrUBHMl5Yw3Da6TCakw5BkUDyVhZHFyGFmNjHLLyau54oq1\/wLw76WWwsu\/\/gM7L71Mu6C0y2OO3nQl\/dYC26cFlRlCB5KJkhCpQ4Qlx3LGmhE+WZlQCjBnyBA8nFaMFqXFaKpw28du+L9gpme3eP4XTzJ75yyjBlDo9vfYe6fDZcZ4uaF2ZTh7DFQSMpdL3bHcos0IP742ou+DWqCGoqEoRgohYbShNEW48br1\/wlkf3uPvz3xLG\/+6UWydIzaOqSOCtFBPTRolDxSIikmMZcpoaZYymhukNRAHuEf2GjYO+iYHRZmfaWUSqkVCUGiYkUwEdZXx5dA7E73OfXSm7z6l1d487l\/0ETH2AuRCk4layU0wAJmQ66UFCQP3AQzQVNCcgvJIGfIDXiLP7D6FrsHlem0Y3u3Mu2DnUPYm8FBB7NeKD386Ac\/YX93n81z2+ye3yaXQqKQqLRaGVnPQgqW2spsXGESpBBaG2yGlA71wLJhNeg6w5jQHRraJrYujOlokTtvXo+lNnFwMFglt0yIU3FCEgWnaqavEKKgzvHjl1H7ws729jzHGdmERmEhw7HVMesLsJK32Vg3FhaE105vMt3fp+SOlcuv4LHf\/J5XTx+y1FY2NiYcdsFTz+8iiytroSkjalhKeNMianhu8JSx1KBq5KbFPJE88\/FbP0LX9WTg2PoRullhbXmZ82fOsTYZIwf7NKWjbJ3jyKKyugBJe5L1rCz03HhyzObpKWdPbzMZgUvP0dvuZu+vv8Vv+syXaBaX6Cu0CxM8Nag6Yk7yhIghDHlHQpBSKUtjPODK9WX+eXaTYh0aLfvtKiwvMzma2Dpzjpi17CYlJ6NNlWqVg6bS2Qpr74XN6SukkdB4T39hj8X334sXjOnePlhitrODyC6ggxeKwYAPXgikVCiVc6cr9eCAZ2ohmyElkAisFl7AcCqtJSbJmbiz3CTGSXAtjDNMDzpu\/eASb1xQ6vmepRFMNt\/iPfd9GL9w6u\/Mug71TC0Vb0bw7j8EAnhKqCoSQdRAYwCgtSJ9f8ng1+4QF2PzzGu0ucVFWF5c4sjSCh6Vvb1tVpcm\/PlF5+1TI85sHfDqOweMctDojE\/1byDr198UtRT62YzaHZIWJkgIZXaApmZIB7XHcwsweG5Aa6AIEhc99ODFNQKhYiK4Ci6gVLIZqkHfdwiFjYmz3Brn9web2zjcdgL+Bf4aPDyLSPA9AAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/twemoji_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/github.com\/twitter\/twemoji\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Twemoji\u003C\/a\u003E is a great way to make emoji\u0027s on your website independent of system and browser.\nBut alas, it requires JavaScript...\u003C\/p\u003E\n\u003Cp\u003EUnless you just use this library to replace emojis with \u003Ccode\u003E\u0026lt;img\u0026gt;\u003C\/code\u003E tags in your backend.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/twemoji_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHlUlEQVRIiX2Xya8dRxXGf2eo6r73vfsmPz87ozMRCAEsAhEREUqIlEkooIAYAlIEC1iAWPAnsGfHAoFYwwqxCUECgUgiJRIEBCETEQlxJsfYsd9w33S7qw6LvnYQIEpd3S11DV99X506X8vV19wcUSpCELVCVMydWgpBoCK4GqZKcmc2O6TWChEQgQAigjAUEUFEgOBiiYh5rZeeREUEVARzx0RomhEeIUQEpRYkQIBSCsIwsKoOQEWhVpIq\/XwCRObtuNReBEBQlXcnl4vvQtSCqBHxbj9DSGpoLfjFDoISVCJAQxAdJiMEVQeEvlQMQRFCFFOdszEsBBm+za\/5zXA3ZrMOEYgYFiii6LyvqeJmJFU8RKGWOcEDI0QgIagaboqJYKK4KRKVWiu1lmEA92H1taJql6RSEaJWgmB5ZYXN8xeACiGIQ9SCqkCAmZLMSH4RkAAqUOdsCYjoXAZDUcyMbIlx00D07O3v07jTJCd7otZKKT19KSAM+6VWAC47tsHhzhSoA2kRqOY5KMV0kDib4qKJiA4JA6nopU0qqNlArSVUFBVDxVloFlgdLXNhuoWGEiVoPKGeIQohQt93A0MCJ66+mrdffQ2RQAJMBSGAhEjMJVOSKa4p0wfziLGLsQKqAztqmBrZnWwJxRBJNDlx7dFFdvemHHYdx45vMNvfY7q9g4mQXalRuf2eO3j5+RdZyg1BDJEFqA6iqIIIJFOyGx6akDSXC6EGmCiqhori5rga2TMuQjInSSJpw9raMp\/96udZW13hdz\/7Ja+feh1rFkk+RNNkeZHb77qD5x57kpV2BBQiYgCjggqYCaYDa+6Ckxukd2qNub4Aiqih5ogYbo5qws3mNXHn\/Z\/goW99kZeefoFHvv9TEoUbL7ucqJWd3Smeja989zs8\/fNHuXJpiVnpqNETUQbpdB5dadhDOSmm4NIuULuC1DqcQwGIIeKoJZI5qkYyp02ZsTtf++bnuPfBO5le2OHRHz5C1hGr45brb7ic3a1zbO0dcNe3v0xSoZ56g\/ddtsF0f4+DfkapPaV2oJXkhpngriQXUjJcxkvIrIdSCRj2CIpIQsUQT2R12pQYp8RDD9\/NvQ\/eCcAzTzxLomGyOGFx3LBzfp8TH\/0Q9zxwO942PPW9H7OxvoxGx9Z20PeJEgOgkIpqkLLjLqSkeBZcRhPIPRSQUAhFUBAHTZg6yZycEidPXsunv\/DJSylh+8yUI8eOcsWJDU7cfBVX3XIdC+tLRASv\/+pxFkaZUhdpm57cVJBKjY6+nxG1Qw1UA3MjN44nwZksQ1+IkAFMDNFlOK4JxZH5AfjwN+6\/dDID3Pf1u\/nPEhG8+fgfmZ09x9FrjnC4lel2N1nSDrGKWFBrR+0PEXrUBHMl5Yw3Da6TCakw5BkUDyVhZHFyGFmNjHLLyau54oq1\/wLw76WWwsu\/\/gM7L71Mu6C0y2OO3nQl\/dYC26cFlRlCB5KJkhCpQ4Qlx3LGmhE+WZlQCjBnyBA8nFaMFqXFaKpw28du+L9gpme3eP4XTzJ75yyjBlDo9vfYe6fDZcZ4uaF2ZTh7DFQSMpdL3bHcos0IP742ou+DWqCGoqEoRgohYbShNEW48br1\/wlkf3uPvz3xLG\/+6UWydIzaOqSOCtFBPTRolDxSIikmMZcpoaZYymhukNRAHuEf2GjYO+iYHRZmfaWUSqkVCUGiYkUwEdZXx5dA7E73OfXSm7z6l1d487l\/0ETH2AuRCk4layU0wAJmQ66UFCQP3AQzQVNCcgvJIGfIDXiLP7D6FrsHlem0Y3u3Mu2DnUPYm8FBB7NeKD386Ac\/YX93n81z2+ye3yaXQqKQqLRaGVnPQgqW2spsXGESpBBaG2yGlA71wLJhNeg6w5jQHRraJrYujOlokTtvXo+lNnFwMFglt0yIU3FCEgWnaqavEKKgzvHjl1H7ws729jzHGdmERmEhw7HVMesLsJK32Vg3FhaE105vMt3fp+SOlcuv4LHf\/J5XTx+y1FY2NiYcdsFTz+8iiytroSkjalhKeNMianhu8JSx1KBq5KbFPJE88\/FbP0LX9WTg2PoRullhbXmZ82fOsTYZIwf7NKWjbJ3jyKKyugBJe5L1rCz03HhyzObpKWdPbzMZgUvP0dvuZu+vv8Vv+syXaBaX6Cu0CxM8Nag6Yk7yhIghDHlHQpBSKUtjPODK9WX+eXaTYh0aLfvtKiwvMzma2Dpzjpi17CYlJ6NNlWqVg6bS2Qpr74XN6SukkdB4T39hj8X334sXjOnePlhitrODyC6ggxeKwYAPXgikVCiVc6cr9eCAZ2ohmyElkAisFl7AcCqtJSbJmbiz3CTGSXAtjDNMDzpu\/eASb1xQ6vmepRFMNt\/iPfd9GL9w6u\/Mug71TC0Vb0bw7j8EAnhKqCoSQdRAYwCgtSJ9f8ng1+4QF2PzzGu0ucVFWF5c4sjSCh6Vvb1tVpcm\/PlF5+1TI85sHfDqOweMctDojE\/1byDr198UtRT62YzaHZIWJkgIZXaApmZIB7XHcwsweG5Aa6AIEhc99ODFNQKhYiK4Ci6gVLIZqkHfdwiFjYmz3Brn9web2zjcdgL+Bf4aPDyLSPA9AAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/twemoji_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/github.com\/twitter\/twemoji\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Twemoji\u003C\/a\u003E is a great way to make emoji\u0027s on your website independent of system and browser.\nBut alas, it requires JavaScript...\u003C\/p\u003E\n\u003Cp\u003EUnless you just use this library to replace emojis with \u003Ccode\u003E\u0026lt;img\u0026gt;\u003C\/code\u003E tags in your backend.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["php","javascript","twitter","emoji","twemoji","backend","symfony","twig"],"hasMore":false,"image":"https:\/\/avris.it\/image\/twemoji_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/twemoji_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/twemoji_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/github.com\/twitter\/twemoji\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Twemoji\u003C\/a\u003E is a great way to make emoji\u0027s on your website independent of system and browser.\nBut alas, it requires JavaScript...\u003C\/p\u003E\n\u003Cp\u003EUnless you just use this library to replace emojis with \u003Ccode\u003E\u0026lt;img\u0026gt;\u003C\/code\u003E tags in your backend.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/twemoji_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/twemoji_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/github.com\/twitter\/twemoji\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Twemoji\u003C\/a\u003E is a great way to make emoji\u0027s on your website independent of system and browser.\nBut alas, it requires JavaScript...\u003C\/p\u003E\n\u003Cp\u003EUnless you just use this library to replace emojis with \u003Ccode\u003E\u0026lt;img\u0026gt;\u003C\/code\u003E tags in your backend.\u003C\/p\u003E","words":38,"readTime":null,"lang":"en"}}},"projects\/sexuality-spectrum":{"key":"projects\/sexuality-spectrum","type":"article","published":true,"meta":{"createdAt":"2020-01-16T23:48:41+01:00","publishedAt":"2020-01-16T23:48:41+01:00","group":"gender-apps","links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/spectrum.avris.it","displayUrl":null}],"category":"projects","subcategory":null,"slug":"sexuality-spectrum"},"content":{"en":{"slug":"sexuality-spectrum","title":"Sexuality Spectrum","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/spectrum_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022234.07874015748\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACVElEQVRIic2VTW8TQQyGH8\/MfiQhacKBGxKovfD\/fwdXoAcE3FAhqZRkk+5mPOaQhOZjU22BA+\/JI2vmtf3aHqm+zGzqlyQzvPcMBgP6vT7PQUzGerUkz3I8kWgOLLGJCScB8YaEnNQ84H3As6FJDu8csVpDkSEiOOeQ+XxuKaVnBXAKe1AwAxGk9H\/8joggZmZdLyRVPt3eMhqNiDES44Zer89qtSLPc2LcEGMCjLIsqeua6+sbvHfsaUTkSVtSSp0Cmk6nADjnmEwmFzPsSvzXATWf7\/Eqrb7FZg0Cw9A785kZ6qG4aU\/iFEGkneQMrweEomh1lesS7wMhz858KSViXdOVJ5hZp5LOv\/2EZFgyRlcjNIMeOQDbMCOJ2EpSeMHKbpIFgMO+vmQXg5IUE71eScgyotaY22ZdVUtSSgyHo+PqqLKsKnwWGNJe3VN0nrLZbIaqYmaMJxPy7Fyef4FwybGXco\/yTgnmcM7B\/fJIHNWEaiTPtxLep4or18exva\/OyHdN\/e+mrGnIsqy1Oc0MTYngH5fiIZlqxPvQKaDOU7b48J34sGEyHhPCuVwO2O\/7yjf0U47sUpXMIW+GR8Fesi9Kdori+iVXZYn351\/DYrGg3+\/\/9hWbDRICIkJVLQHjxUELHFZlf74o2WEZDzGdTrHdB\/xfbOrq4x1Ohfxk+akqdV1TluW24Xls6qZusJSQ3DN496oLTfexV1UQwe9I9zAzVBXv\/VnD79eEiLRK3YbOm\/rH+69Yo9tLIWMyGR+Ttzy+8DVDLbDMYW9HT76\/t38BvPqThYnDi\/QAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/spectrum_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022234.07874015748\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWhere are you on the Sexuality Spectrum?\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/spectrum_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022468.15748031496\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACVElEQVRIic2VTW8TQQyGH8\/MfiQhacKBGxKovfD\/fwdXoAcE3FAhqZRkk+5mPOaQhOZjU22BA+\/JI2vmtf3aHqm+zGzqlyQzvPcMBgP6vT7PQUzGerUkz3I8kWgOLLGJCScB8YaEnNQ84H3As6FJDu8csVpDkSEiOOeQ+XxuKaVnBXAKe1AwAxGk9H\/8joggZmZdLyRVPt3eMhqNiDES44Zer89qtSLPc2LcEGMCjLIsqeua6+sbvHfsaUTkSVtSSp0Cmk6nADjnmEwmFzPsSvzXATWf7\/Eqrb7FZg0Cw9A785kZ6qG4aU\/iFEGkneQMrweEomh1lesS7wMhz858KSViXdOVJ5hZp5LOv\/2EZFgyRlcjNIMeOQDbMCOJ2EpSeMHKbpIFgMO+vmQXg5IUE71eScgyotaY22ZdVUtSSgyHo+PqqLKsKnwWGNJe3VN0nrLZbIaqYmaMJxPy7Fyef4FwybGXco\/yTgnmcM7B\/fJIHNWEaiTPtxLep4or18exva\/OyHdN\/e+mrGnIsqy1Oc0MTYngH5fiIZlqxPvQKaDOU7b48J34sGEyHhPCuVwO2O\/7yjf0U47sUpXMIW+GR8Fesi9Kdori+iVXZYn351\/DYrGg3+\/\/9hWbDRICIkJVLQHjxUELHFZlf74o2WEZDzGdTrHdB\/xfbOrq4x1Ohfxk+akqdV1TluW24Xls6qZusJSQ3DN496oLTfexV1UQwe9I9zAzVBXv\/VnD79eEiLRK3YbOm\/rH+69Yo9tLIWMyGR+Ttzy+8DVDLbDMYW9HT76\/t38BvPqThYnDi\/QAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/spectrum_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022468.15748031496\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWhere are you on the Sexuality Spectrum?\u003C\/p\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/spectrum.avris.it\/mz0v\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E (mine here)\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EDisclaimer:\u003C\/strong\u003E\u003C\/p\u003E\n\u003Cp\u003EI\u0027m not the author of the original concept of those axes.\nThey were circulating online in form of a picture without a watermark\n\u2013 making it practically impossible to find the author.\nI just made an interactive version of it, with a few adjustments.\u003C\/p\u003E\n\u003Cp\u003EI\u0027m aware that this representation of gender \u0026amp; sexuality is not perfect \u2013 but none is!\nHumans are more complex than just a few axes!\u003C\/p\u003E\n\u003Cp\u003EYes, us nonbinary folx aren\u0027t necessarily in between \u201cmale\u201d and \u201cfemale\u201d,\nyes, lumping bisexuality and pansexuality together is not ideal, etc. etc. etc.\nBut it\u0027s an approximation. If you come up with a better one, I\u0027d gladly make an app for it \ud83d\ude09\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["gender","identity","expression","sexual","orientation","drive","romantic","desire","relationship","male","nonbinary","female","masculine","feminine","straight","bi","pan","gay","asexual","ace","aromantic","romantic","monogamy","polyamory","vanilla","bdsm","svelte","javascript","js","nodejs"],"hasMore":true,"image":"https:\/\/avris.it\/image\/spectrum_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/spectrum_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/spectrum_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022117.03937007874\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWhere are you on the Sexuality Spectrum?\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/spectrum_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/spectrum_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022117.03937007874\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWhere are you on the Sexuality Spectrum?\u003C\/p\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/spectrum.avris.it\/mz0v\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E (mine here)\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EDisclaimer:\u003C\/strong\u003E\u003C\/p\u003E\n\u003Cp\u003EI\u0027m not the author of the original concept of those axes.\nThey were circulating online in form of a picture without a watermark\n\u2013 making it practically impossible to find the author.\nI just made an interactive version of it, with a few adjustments.\u003C\/p\u003E\n\u003Cp\u003EI\u0027m aware that this representation of gender \u0026amp; sexuality is not perfect \u2013 but none is!\nHumans are more complex than just a few axes!\u003C\/p\u003E\n\u003Cp\u003EYes, us nonbinary folx aren\u0027t necessarily in between \u201cmale\u201d and \u201cfemale\u201d,\nyes, lumping bisexuality and pansexuality together is not ideal, etc. etc. etc.\nBut it\u0027s an approximation. If you come up with a better one, I\u0027d gladly make an app for it \ud83d\ude09\u003C\/p\u003E","words":119,"readTime":null,"lang":"en"}}},"projects\/avris-fontawesomeoptimiser":{"key":"projects\/avris-fontawesomeoptimiser","type":"article","published":true,"meta":{"createdAt":"2020-01-09T23:04:10+01:00","publishedAt":"2020-01-09T23:04:10+01:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/packagist.org\/packages\/avris\/fontawesome-optimiser","displayUrl":"avris\/fontawesome-optimiser"},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/FontAwesomeOptimiser","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-fontawesomeoptimiser"},"content":{"en":{"slug":"avris-fontawesomeoptimiser","title":"Avris FontAwesomeOptimiser","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/fontawesomeoptimiser_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHvElEQVRIiX2X249lx1XGf+tStfc53eecnpnunhmPPZM4IRDZxEqUCEsWionkXARGuSiJAlKAB3gIykP+BN554wGBeIaniJdcpKBEJJESCQIi4DjOKA4ztmdsy\/b07fTpPnvvqsXDPjNGEKW0b9Ku2vXV99Va69ty\/R2PRZSKEEStEBVzp5ZCEKgIroapktzpujW1VoiACAQQEYSxiQgiAgT3W0RszvrgTlREQEUwd0yEppngEUJEUGpBAgQopSCMH1bVEago1EpSZdhMgMimHw\/6iwAIqvL25HL\/WYhaEDUi3h5nCEkNrQW\/P0BQgkoEaAii42SEoOqAMJSKIShCiGKqGzbGhSDju82xuRjuRtf1iEDEuEARRTdjTRU3I6niIQq1bAgeGSECCUHVcFNMBBPFTZGo1FqptYwfcB9XXyuq9kAqFSFqJQgWOzsc3jsAKoQgDlELqgIBZkoyI\/l9QAKoQN2wJSCiGxkMRTEzsiWmTQMxsDo7o3GnSU72RK2VUgaGUkAY90utAFy9vM\/6ZAnUkbQIVPMGlGI6SpxNcdFERI+EgVT0wSYV1Gyk1hIqioqh4mw1W1yYLDhYHqGhRAkaT6hniEKIMAz9yJDAjevXee3WS4gEEmAqCAEkRGIjmZJMcU2ZIdhEjN2PFVAd2VHD1MjuZEsohkiiyYl37m1zulqy7nsuX9mnO1uxPD7BRMiu1Kg89dEP8+LzLzDPDUGMkQWojqKogggkU7IbHpqQtJELoQaYKKqGiuLmuBrZMy5CMidJImnDxYsLPv3Hn+XihR3++avf5OXbL2PNNsnHaJottnnqIx\/mJ9\/9ATvtBChExAhGBRUwE0xH1twFJzfI4NQaG30BFFFDzREx3BzVhJttzsTTn\/htvvDnn+fmj37K1\/7qH0gU3nP1IaJWTk6XeDb+8C++wo\/+8Rs8PJ\/TlZ4aAxFllE430ZXGPZSTYgou7Ra1L0itYx4KQAwRRy2RzFE1kjltykzd+ZMvfYaPfepplgcnfONvvkbWCRemLe9690OcHr3J0eqcj3z5D0gq1Nuv8BtX91merTgfOkodKLUHrSQ3zAR3JbmQkuEynSPdAKUSMO4RFJGEiiGeyOq0KTFNiS988Rk+9qmnAfjP7z9HomG2PWN72nBy74wbH3wfH332Kbxt+OFf\/h37uws0eo6Og2FIlBgBhVRUg5QddyElxbPgMplBHqCAhEIogoI4aMLUSebklHjiiXfy+5\/7nQcl4fj1JZcu73Htxj43HnuERz7wKFu7cyKCl7\/1PbYmmVK3aZuB3FSQSo2eYeiI2qMGqoG5kRvHk+DMFjAUImQEE2N0GY5rQnFkkwC\/+GefeJCZAT7+p8\/wf1tEcOd7\/0b3xpvsveMS66NMf3rIXHvEKmJBrT11WCMMqAnmSsoZbxpcZzNSYawzKB5Kwsji5DCyGhnlA09c59q1i\/8PwP9utRRe\/Kd\/5eTmi7RbSruYsvfehxmOtjh+VVDpEHqQTJSESB0jLDmWM9ZM8NnOjFKADUOG4OG0YrQoLUZThSd\/692\/EszyjSOe\/\/oP6N56g0kDKPRnK1Zv9bh0TBcNtS9j7jFQSchGLnXHcos2E\/zKxQnDENQCNRQNRTFSCAmjDaUpwnse3f2lQM6OV\/zs+89x599fIEvPpK1j6agQPdS1QaPkiRJJMYmNTAk1xVJGc4OkBvIEf3y\/YXXe060L3VAppVJqRUKQqFgRTITdC9MHIE6XZ9y+eYdbP\/4Fd37y3zTRM\/VCpIJTyVoJDbCAbqyVkoLkgZtgJmhKSG4hGeQMuQFv8Wcv3OX0vLJc9hyfVpZDcLKGVQfnPXSDUAb427\/+e85Ozzh885jTe8fkUkgUEpVWKxMb2ErBvK100wqzIIXQ2mgzpPSoB5YNq0HfG8aMfm1omzg6mNLTIk8\/thvzNnF+Plql3Uv71FAOjleEJPCWviqeW87WHagjoriOWXuscUY2oVHYynB1d5tJOeHqhcKV\/cSF3Sk3f36HLoJOV8z2r\/Ddb\/8Lt15dM28r+\/sz1n3ww+dPke2di6EpI2pYSnzy2d\/j3r0DtGnZ2p6xf+kSP\/vFLd73+OPcvfMKbs6VvV3WXeVkeU6TWy4t5rSeSVJZbE1YvnbA9Ucu0h2+xbVrl2i1RxkwGdhuKw8\/Ehy+2XF6tMQOb+IysPfkM6z+6zvIh\/7oS9FszxkqtFszbly9wlBhb2fB6XrgoYs7rLseN6OUSpSKRXB0suLKYpvV8ozSD0xTgmGgW51zeb7F3nxKPVkyb53FvKWeHrI1nzC1jkd\/fY\/EAS\/99FUmwwGND0wuXybPF3jBWK7OwBLdyQnPLU8B5aYZEsJz7hsvBFIqlIrUSj0\/58e1kM2QEkgEVguJ0Rtv54YtN2buLJrENAmuhWmGN+7e5UO\/OefWS4fUKMwnMDu8y699\/P34we2f0\/U96plaKt5M4O1\/CATwlFBVJIKogcYIQGtFhuGBwa\/9Ghfj8PWXaHOLi7DYnnNpvoNHZbU65sJ8xn+84Lx2e8LrR+fceuucSQ4a7fjd4RVk913vjVoKQ9dR+zVpa4aEULpzNDVjOagDnluA0XMDWgNFkLjvoUcvrhEIFRPBVXABpZLNUA2GoUco7M+cRWvcOxttbuPw5A34HwP7VySOoz7KAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/fontawesomeoptimiser_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EFontAwesome provides thousands of icons, but you probably only use a few dozen on your website. Instead of loading all of them as a webfont, you could use SVG sprites.\u003C\/p\u003E\n\u003Cp\u003EThis library is a simple helper that:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003Eregisters the icons you use in the place you use it,\u003C\/li\u003E\n\u003Cli\u003Edumps a refined set of SVG symbols at the end of your page.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EYou can check out \u003Ca href=\u0022\/blog\/reducing-website-size-by-a-half-by-optimising-bootstrap-and-fontawesome\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-computer-speaker\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E a blog post\u003C\/a\u003E about possible gains.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/fontawesomeoptimiser_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHvElEQVRIiX2X249lx1XGf+tStfc53eecnpnunhmPPZM4IRDZxEqUCEsWionkXARGuSiJAlKAB3gIykP+BN554wGBeIaniJdcpKBEJJESCQIi4DjOKA4ztmdsy\/b07fTpPnvvqsXDPjNGEKW0b9Ku2vXV99Va69ty\/R2PRZSKEEStEBVzp5ZCEKgIroapktzpujW1VoiACAQQEYSxiQgiAgT3W0RszvrgTlREQEUwd0yEppngEUJEUGpBAgQopSCMH1bVEago1EpSZdhMgMimHw\/6iwAIqvL25HL\/WYhaEDUi3h5nCEkNrQW\/P0BQgkoEaAii42SEoOqAMJSKIShCiGKqGzbGhSDju82xuRjuRtf1iEDEuEARRTdjTRU3I6niIQq1bAgeGSECCUHVcFNMBBPFTZGo1FqptYwfcB9XXyuq9kAqFSFqJQgWOzsc3jsAKoQgDlELqgIBZkoyI\/l9QAKoQN2wJSCiGxkMRTEzsiWmTQMxsDo7o3GnSU72RK2VUgaGUkAY90utAFy9vM\/6ZAnUkbQIVPMGlGI6SpxNcdFERI+EgVT0wSYV1Gyk1hIqioqh4mw1W1yYLDhYHqGhRAkaT6hniEKIMAz9yJDAjevXee3WS4gEEmAqCAEkRGIjmZJMcU2ZIdhEjN2PFVAd2VHD1MjuZEsohkiiyYl37m1zulqy7nsuX9mnO1uxPD7BRMiu1Kg89dEP8+LzLzDPDUGMkQWojqKogggkU7IbHpqQtJELoQaYKKqGiuLmuBrZMy5CMidJImnDxYsLPv3Hn+XihR3++avf5OXbL2PNNsnHaJottnnqIx\/mJ9\/9ATvtBChExAhGBRUwE0xH1twFJzfI4NQaG30BFFFDzREx3BzVhJttzsTTn\/htvvDnn+fmj37K1\/7qH0gU3nP1IaJWTk6XeDb+8C++wo\/+8Rs8PJ\/TlZ4aAxFllE430ZXGPZSTYgou7Ra1L0itYx4KQAwRRy2RzFE1kjltykzd+ZMvfYaPfepplgcnfONvvkbWCRemLe9690OcHr3J0eqcj3z5D0gq1Nuv8BtX91merTgfOkodKLUHrSQ3zAR3JbmQkuEynSPdAKUSMO4RFJGEiiGeyOq0KTFNiS988Rk+9qmnAfjP7z9HomG2PWN72nBy74wbH3wfH332Kbxt+OFf\/h37uws0eo6Og2FIlBgBhVRUg5QddyElxbPgMplBHqCAhEIogoI4aMLUSebklHjiiXfy+5\/7nQcl4fj1JZcu73Htxj43HnuERz7wKFu7cyKCl7\/1PbYmmVK3aZuB3FSQSo2eYeiI2qMGqoG5kRvHk+DMFjAUImQEE2N0GY5rQnFkkwC\/+GefeJCZAT7+p8\/wf1tEcOd7\/0b3xpvsveMS66NMf3rIXHvEKmJBrT11WCMMqAnmSsoZbxpcZzNSYawzKB5Kwsji5DCyGhnlA09c59q1i\/8PwP9utRRe\/Kd\/5eTmi7RbSruYsvfehxmOtjh+VVDpEHqQTJSESB0jLDmWM9ZM8NnOjFKADUOG4OG0YrQoLUZThSd\/692\/EszyjSOe\/\/oP6N56g0kDKPRnK1Zv9bh0TBcNtS9j7jFQSchGLnXHcos2E\/zKxQnDENQCNRQNRTFSCAmjDaUpwnse3f2lQM6OV\/zs+89x599fIEvPpK1j6agQPdS1QaPkiRJJMYmNTAk1xVJGc4OkBvIEf3y\/YXXe060L3VAppVJqRUKQqFgRTITdC9MHIE6XZ9y+eYdbP\/4Fd37y3zTRM\/VCpIJTyVoJDbCAbqyVkoLkgZtgJmhKSG4hGeQMuQFv8Wcv3OX0vLJc9hyfVpZDcLKGVQfnPXSDUAb427\/+e85Ozzh885jTe8fkUkgUEpVWKxMb2ErBvK100wqzIIXQ2mgzpPSoB5YNq0HfG8aMfm1omzg6mNLTIk8\/thvzNnF+Plql3Uv71FAOjleEJPCWviqeW87WHagjoriOWXuscUY2oVHYynB1d5tJOeHqhcKV\/cSF3Sk3f36HLoJOV8z2r\/Ddb\/8Lt15dM28r+\/sz1n3ww+dPke2di6EpI2pYSnzy2d\/j3r0DtGnZ2p6xf+kSP\/vFLd73+OPcvfMKbs6VvV3WXeVkeU6TWy4t5rSeSVJZbE1YvnbA9Ucu0h2+xbVrl2i1RxkwGdhuKw8\/Ehy+2XF6tMQOb+IysPfkM6z+6zvIh\/7oS9FszxkqtFszbly9wlBhb2fB6XrgoYs7rLseN6OUSpSKRXB0suLKYpvV8ozSD0xTgmGgW51zeb7F3nxKPVkyb53FvKWeHrI1nzC1jkd\/fY\/EAS\/99FUmwwGND0wuXybPF3jBWK7OwBLdyQnPLU8B5aYZEsJz7hsvBFIqlIrUSj0\/58e1kM2QEkgEVguJ0Rtv54YtN2buLJrENAmuhWmGN+7e5UO\/OefWS4fUKMwnMDu8y699\/P34we2f0\/U96plaKt5M4O1\/CATwlFBVJIKogcYIQGtFhuGBwa\/9Ghfj8PWXaHOLi7DYnnNpvoNHZbU65sJ8xn+84Lx2e8LrR+fceuucSQ4a7fjd4RVk913vjVoKQ9dR+zVpa4aEULpzNDVjOagDnluA0XMDWgNFkLjvoUcvrhEIFRPBVXABpZLNUA2GoUco7M+cRWvcOxttbuPw5A34HwP7VySOoz7KAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/fontawesomeoptimiser_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EFontAwesome provides thousands of icons, but you probably only use a few dozen on your website. Instead of loading all of them as a webfont, you could use SVG sprites.\u003C\/p\u003E\n\u003Cp\u003EThis library is a simple helper that:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003Eregisters the icons you use in the place you use it,\u003C\/li\u003E\n\u003Cli\u003Edumps a refined set of SVG symbols at the end of your page.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EYou can check out \u003Ca href=\u0022\/blog\/reducing-website-size-by-a-half-by-optimising-bootstrap-and-fontawesome\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-computer-speaker\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E a blog post\u003C\/a\u003E about possible gains.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["fontawesome","optimise","font","webfont","icons","symfony","twig","php","js"],"hasMore":false,"image":"https:\/\/avris.it\/image\/fontawesomeoptimiser_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/fontawesomeoptimiser_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/fontawesomeoptimiser_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EFontAwesome provides thousands of icons, but you probably only use a few dozen on your website. Instead of loading all of them as a webfont, you could use SVG sprites.\u003C\/p\u003E\n\u003Cp\u003EThis library is a simple helper that:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003Eregisters the icons you use in the place you use it,\u003C\/li\u003E\n\u003Cli\u003Edumps a refined set of SVG symbols at the end of your page.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EYou can check out \u003Ca href=\u0022\/blog\/reducing-website-size-by-a-half-by-optimising-bootstrap-and-fontawesome.lite\u0022\u003E a blog post\u003C\/a\u003E about possible gains.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/fontawesomeoptimiser_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/fontawesomeoptimiser_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EFontAwesome provides thousands of icons, but you probably only use a few dozen on your website. Instead of loading all of them as a webfont, you could use SVG sprites.\u003C\/p\u003E\n\u003Cp\u003EThis library is a simple helper that:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003Eregisters the icons you use in the place you use it,\u003C\/li\u003E\n\u003Cli\u003Edumps a refined set of SVG symbols at the end of your page.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EYou can check out \u003Ca href=\u0022\/blog\/reducing-website-size-by-a-half-by-optimising-bootstrap-and-fontawesome.lite\u0022\u003E a blog post\u003C\/a\u003E about possible gains.\u003C\/p\u003E","words":71,"readTime":null,"lang":"en"}}},"projects\/attraction-layer-cake":{"key":"projects\/attraction-layer-cake","type":"article","published":true,"meta":{"createdAt":"2019-12-18T23:47:24+01:00","publishedAt":"2019-12-18T23:44:00+01:00","group":"gender-apps","links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/cake.avris.it\/","displayUrl":null}],"category":"projects","subcategory":null,"slug":"attraction-layer-cake"},"content":{"en":{"slug":"attraction-layer-cake","title":"Attraction Layer Cake","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/attraction-layer-cake_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022232.5\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAD90lEQVRIia2Wu44cVRCGv6rTp29z21lLszaYBAkhJGTxFEiWeAOQSEA8AQkigQSJgAQJCQIQCZEDPwgJAiQSEvBezLLX6bn19DlF0DPjHbzGFvAnXa1TqvPXX5duCSEaT4UBcuV5jYcZsnV0nd\/T4yQhNBweHaHqwIwkSWhCg6oiCLdu3aSqKsbVFFUhxkhZlvR7va1AJycnLJsGEERAEPb2RltkDo8eoqIYgEX6gwFlUWzFkRgfKTSfz5ke\/0lYLOjffp4szwFomobDh3+QOMWsVaMoCsqiPc\/znOl0xunZ2co\/0O12KIocFaEoCsyMy\/GYqpqs6BnOOQa9PqqKqpKmngQghMDZg33mX3\/H7MtvsUXN4p03Kd97m\/zWTdIsI\/Ue5xwqgpnR7\/dInNtSwK0I+1RpmgbvPan3WwqoKmbWKhUNBFQF75NWoRCCzecLfn\/\/Q6ZffEOKIOtK97rEd9\/ilU8\/5vziEjPDrQIiEKPR7XTIsrRVdzYjRmtJr0sgUBYlWZYymUy4GFekPiGaMdzZwakCgqogIiQiQpI4Rh99wK93XuX486\/o\/\/wLM+DhoGDvhedomsB8viDxCU3T0ITIjd0hslJruWyIZiwWNTFGet0uPm2VKVZlNzPMHr1LjIzHFZhRliXOKWmatj0UQuD4+JiD\/QPG5xfMvv+Bk4N9br9xlxdffonRzT0ODo9WGSvee5LEgYGo0O91wYxqMiHGtnSqSgwRdUpZlqTec3k5ZjqbbaZsZ2ewIbiZMgDnHKPRiE6nw9nZGac3hvSnU0ajEVme4VQZDgYsQ4PQqjIctnKvB3i+WCAiOCfkeY5TJb9ymZmhri23954YIz5J+DvEzLb2UIyRqqqo65rBYID3nuVy2Y6sKiJCCIGiLElUcYmj1+0ynU65uBwTY8QAp0qWpiCQZRllUVBNJiyXS9pBiqgqeZ7h1KFOSb0nCSEwn89paRkigqqjKApiNMyMB\/fu89u9+4hzECOhrqlPTjdJDF+7w53PPqHX7WIYqfdtP1zZlGaGxchiUa9Kv0qsyFGnqGhbMuccnU7nMemuYrZ\/wPmPP2ExQjTEJ1iIgBHrJZp6mqbh9Pwci7HdU2VBtiIlovS6nVWyupk+n3hS36ooq82drNmvs7nOvnn3derdYbvFm6YNLMLOYIDFQLq7i08Sdoc7sFG6LcfmdkDV0e\/3Nj6IsFzWgOASh3O6vamfhBAC5xeXqCohBGTVF+vGFbn+u\/Rv8FhTX4dncHmM1NNUf5KdPMtlz4J1nP+qloQQ\/h9G\/xOScTXB5gvUOapZTd7JyMSw0DoIDUlv58r\/jvyDve5fw0yeaBNrmmmNOUGi4RyEIGjq+QvpnP3+sslU1gAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/attraction-layer-cake_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022232.5\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EOur sexuality is more complex than just straight\/bi\/gay. Here you can describe it on three axes: attraction type, relationship type and orientation type.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/attraction-layer-cake_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022465\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAD90lEQVRIia2Wu44cVRCGv6rTp29z21lLszaYBAkhJGTxFEiWeAOQSEA8AQkigQSJgAQJCQIQCZEDPwgJAiQSEvBezLLX6bn19DlF0DPjHbzGFvAnXa1TqvPXX5duCSEaT4UBcuV5jYcZsnV0nd\/T4yQhNBweHaHqwIwkSWhCg6oiCLdu3aSqKsbVFFUhxkhZlvR7va1AJycnLJsGEERAEPb2RltkDo8eoqIYgEX6gwFlUWzFkRgfKTSfz5ke\/0lYLOjffp4szwFomobDh3+QOMWsVaMoCsqiPc\/znOl0xunZ2co\/0O12KIocFaEoCsyMy\/GYqpqs6BnOOQa9PqqKqpKmngQghMDZg33mX3\/H7MtvsUXN4p03Kd97m\/zWTdIsI\/Ue5xwqgpnR7\/dInNtSwK0I+1RpmgbvPan3WwqoKmbWKhUNBFQF75NWoRCCzecLfn\/\/Q6ZffEOKIOtK97rEd9\/ilU8\/5vziEjPDrQIiEKPR7XTIsrRVdzYjRmtJr0sgUBYlWZYymUy4GFekPiGaMdzZwakCgqogIiQiQpI4Rh99wK93XuX486\/o\/\/wLM+DhoGDvhedomsB8viDxCU3T0ITIjd0hslJruWyIZiwWNTFGet0uPm2VKVZlNzPMHr1LjIzHFZhRliXOKWmatj0UQuD4+JiD\/QPG5xfMvv+Bk4N9br9xlxdffonRzT0ODo9WGSvee5LEgYGo0O91wYxqMiHGtnSqSgwRdUpZlqTec3k5ZjqbbaZsZ2ewIbiZMgDnHKPRiE6nw9nZGac3hvSnU0ajEVme4VQZDgYsQ4PQqjIctnKvB3i+WCAiOCfkeY5TJb9ymZmhri23954YIz5J+DvEzLb2UIyRqqqo65rBYID3nuVy2Y6sKiJCCIGiLElUcYmj1+0ynU65uBwTY8QAp0qWpiCQZRllUVBNJiyXS9pBiqgqeZ7h1KFOSb0nCSEwn89paRkigqqjKApiNMyMB\/fu89u9+4hzECOhrqlPTjdJDF+7w53PPqHX7WIYqfdtP1zZlGaGxchiUa9Kv0qsyFGnqGhbMuccnU7nMemuYrZ\/wPmPP2ExQjTEJ1iIgBHrJZp6mqbh9Pwci7HdU2VBtiIlovS6nVWyupk+n3hS36ooq82drNmvs7nOvnn3derdYbvFm6YNLMLOYIDFQLq7i08Sdoc7sFG6LcfmdkDV0e\/3Nj6IsFzWgOASh3O6vamfhBAC5xeXqCohBGTVF+vGFbn+u\/Rv8FhTX4dncHmM1NNUf5KdPMtlz4J1nP+qloQQ\/h9G\/xOScTXB5gvUOapZTd7JyMSw0DoIDUlv58r\/jvyDve5fw0yeaBNrmmmNOUGi4RyEIGjq+QvpnP3+sslU1gAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/attraction-layer-cake_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022465\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EOur sexuality is more complex than just straight\/bi\/gay. Here you can describe it on three axes: attraction type, relationship type and orientation type.\u003C\/p\u003E\n\u003Cp\u003E(mine is \u003Ca href=\u0022https:\/\/cake.avris.it\/rE4\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E rE4\u003C\/a\u003E)\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["asexual","attraction","homosexuality","kinsey scale","monogamy","non-monogamy","polyamory","relationship","scale","sexual orientation"],"hasMore":true,"image":"https:\/\/avris.it\/image\/attraction-layer-cake_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/attraction-layer-cake_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/attraction-layer-cake_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022116.25\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EOur sexuality is more complex than just straight\/bi\/gay. Here you can describe it on three axes: attraction type, relationship type and orientation type.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/attraction-layer-cake_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/attraction-layer-cake_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022116.25\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EOur sexuality is more complex than just straight\/bi\/gay. Here you can describe it on three axes: attraction type, relationship type and orientation type.\u003C\/p\u003E\n\u003Cp\u003E(mine is \u003Ca href=\u0022https:\/\/cake.avris.it\/rE4\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E rE4\u003C\/a\u003E)\u003C\/p\u003E","words":28,"readTime":null,"lang":"en"}}},"projects\/avris-sorter":{"key":"projects\/avris-sorter","type":"article","published":true,"meta":{"createdAt":"2019-10-13T14:09:02+02:00","publishedAt":"2019-10-13T14:06:00+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/sorter.avris.it\/","displayUrl":"Demo"},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Sorter","displayUrl":null},{"icon":"globe-europe","colour":"secondary","url":"https:\/\/www.npmjs.com\/package\/avris-sorter","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-sorter"},"content":{"en":{"slug":"avris-sorter","title":"Avris Sorter","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-sorter_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHkElEQVRIiX2XyY8kRxXGf2+JyKyqrl5m6cEe8HgBgzEwwjLCkoU8WDK2hQwCxC4hOMABxIE\/gTs3DgjEGU6ICxgJBMK2ZEtsYjHGWNh4xstgxp7ppbq7qjIjHoesGSNAhDIyU8pYvvi+ePG+lBtuvD2iVIQgaoWomDu1FIJARXA1TJXkznK5oNYKERCBACKCMBQRQUSA4GqJiFWt155ERQRUBHPHRGiaER4hRASlFiRAgFIKwjCwqg5ARaFWkir9agJEVu241l4EQFCV1yeXq+9C1IKoEfF6P0NIamgt+NUOghJUIkBDEB0mIwRVB4S+VAxBEUIUU12xMSwEGb6trtXNcDeWyw4RiBgWKKLoqq+p4mYkVTxEoZYVwQMjRCAhqBpuiolgorgpEpVaK7WWYQD3YfW1omrXpFIRolaCYGNzk53LV4AKIYhD1IKqQICZksxIfhWQACpQV2wJiOhKBkNRzIxsiXHTQPQcHh3RuNMkJ3ui1kopPX0pIAz7pVYArju1zWJ\/BtSBtAhU8wqUYjpInE1x0UREh4SBVPTaJhXUbKDWEiqKiqHiTJoJW6MNrsx20VCiBI0n1DNEIUTo+25gSODMDTfwj+cvIBJIgKkgBJAQiZVkSjLFNWX6YBUxdjVWQHVgRw1TI7uTLaEYIokmJ246ucbB4YxF13HqDdssjw6Z7e1jImRXalTu\/sA9PPvU06znhiCGyAJUB1FUQQSSKdkND01IWsmFUANMFFVDRXFzXI3sGRchmZMkkbTh2LENPvr5j3Nsa5Nf\/uAnvHD+BaxZI\/kQTdONNe6+9x7+\/MjjbLYjoBARAxgVVMBMMB1Ycxec3CC9U2us9AVQRA01R8Rwc1QTbraqiXMPvo9Pf+WTPPObv\/Cjb36fROHW664namX\/YIZn47Nf\/xq\/+eHDvHF9nWXpqNETUQbpdBVdadhDOSmm4NJOqF1Bah3OoQDEEHHUEskcVSOZ06bM2J0vfPlj3P+Rc8yu7PPwt39E1hFb45Zb3nw9B7uvsns4596vfoakQj3\/Im+7bpvZ0SHzfkmpPaV2oJXkhpngriQXUjJcxuvIsodSCRj2CIpIQsUQT2R12pQYp8SnP3cf93\/kHAB\/fOxJEg3TtSlr44b9y0ecufNdfOChu\/G24YlvfJftExtodOzuBX2fKDEACqmoBik77kJKimfBZTSF3EMBCYVQBAVx0ISpk8zJKXH27E186BPvv5YS9l6ZcfzUSU6f2ebM7W\/iTXfczOTEOhHBCz99lMkoU+oabdOTmwpSqdHR90uidqiBamBu5MbxJDjTDegLETKAiSG6DMc1oTiyOgA\/96UHr53MAA988T7+s0QELz36W5aXXuXkjcdZ7Ga6gx3WtUOsIhbU2lH7BUKPmmCupJzxpsF1OiUVhjyD4qEkjCxODiOrkVHuOHsDp08f+y8A\/15qKTz7s1+z\/8yztBOl3Rhz8rY30u9O2LsoqCwROpBMlIRIHSIsOZYz1ozw6eaUUoAVQ4bg4bRitCgtRlOFu9775v8LZnZpl6d+\/DjL1y4xagCF7uiQw9c6XJaMNxpqV4azx0AlISu51B3LLdqM8DccG9H3QS1QQ9FQFCOFkDDaUJoi3Hrzif8J5GjvkL8+9iQv\/e5psnSM2jqkjgrRQV0YNEoeKZEUk1jJlFBTLGU0N0hqII\/wd2w3HM47lovCsq+UUim1IiFIVKwIJsKJrfE1EAezI84\/8xLP\/+E5Xvrz32miY+yFSAWnkrUSGmAByyFXSgqSB26CmaApIbmFZJAz5Aa8xR\/aepmDeWU269g7qMz6YH8Bh0uYd7DshdLDd771PY4Ojth5dY+Dy3vkUkgUEpVWKyPrmaRgva0sxxWmQQqhtcFmSOlQDywbVoOuM4wp3cLQNrF7ZUxHi5y7\/USst4n5fLBKbpkQp+KEJApO1UxfIURBHRFlMh4zalqW8znZjFEynMokwzTDyUlw3VZh+4QxmQgXLu4wOzqi5I7N60\/zyM9\/xfMXF6y3le3tKYsueOKpA2Rt81hoyogalhLetIganhs8ZSw1qBq5aTFPJM+4Jd575x2kCEZNw2LecfrUNrJcYLXw2vmXyf2czRaOrylbE0jak6xnc9Jz69kxOxdnXLq4x3QELj0n77qPwz\/9Ar\/tw5+iWVunr9BOpnhqUHXEnOQJEUMY8o6EIKVCKSzWxmxtrNGocPDqDldKJlmi1p7dvMX6SFm4cJCUnIw2VapV5k2ls02OvRV2Zs+RRkLjPf2VQ9befj9eMGaHR2CJ5f4+IgeADl4oBgM+eCFWYCpSK\/+8MOcvtZDNkBJIBFYLicEbj1NmmpypOxtNYpwE18I4w2ze8Z53rvPiFaVe7lkfwXTnZd7ywLvxK+f\/xrLrUM\/UUvFmBK\/\/QyCAp4SqIhFEDTQGAFor0vfXDH7tFrgYO69coM0tLsLG2jrH1zfxqBwe7rG1PuX3Tzv\/OD\/ild05z782Z5SDRpd8sH8ROXHLbVFLoV8uqd2CNJkiIZTlHE3NkA5qj+cWYPDcgNZAESSueujBi2sEQsVEcBVcQKlkM1SDvu8QCttTZ6M1Lh8NNrdxuOsM\/AtA9jdb2ZxdiwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-sorter_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ELightweight sorting of tables.\u003C\/p\u003E\n\u003Cp\u003EJust add \u003Ccode\u003E[data-sort]\u003C\/code\u003E attributes to the \u003Ccode\u003Eth\u003C\/code\u003E elements in columns you\u2019d like to sort a table by, include ~1kB of JS \u0026amp; CSS, and initialise with \u003Ccode\u003Esorter()\u003C\/code\u003E \u2013 and that\u2019s it!\u003C\/p\u003E\n\u003Cp\u003EFor installation instructions and more customisation options, you can check out the \u003Ca href=\u0022https:\/\/gitlab.com\/Avris\/Sorter\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E readme file\u003C\/a\u003E.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-sorter_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHkElEQVRIiX2XyY8kRxXGf2+JyKyqrl5m6cEe8HgBgzEwwjLCkoU8WDK2hQwCxC4hOMABxIE\/gTs3DgjEGU6ICxgJBMK2ZEtsYjHGWNh4xstgxp7ppbq7qjIjHoesGSNAhDIyU8pYvvi+ePG+lBtuvD2iVIQgaoWomDu1FIJARXA1TJXkznK5oNYKERCBACKCMBQRQUSA4GqJiFWt155ERQRUBHPHRGiaER4hRASlFiRAgFIKwjCwqg5ARaFWkir9agJEVu241l4EQFCV1yeXq+9C1IKoEfF6P0NIamgt+NUOghJUIkBDEB0mIwRVB4S+VAxBEUIUU12xMSwEGb6trtXNcDeWyw4RiBgWKKLoqq+p4mYkVTxEoZYVwQMjRCAhqBpuiolgorgpEpVaK7WWYQD3YfW1omrXpFIRolaCYGNzk53LV4AKIYhD1IKqQICZksxIfhWQACpQV2wJiOhKBkNRzIxsiXHTQPQcHh3RuNMkJ3ui1kopPX0pIAz7pVYArju1zWJ\/BtSBtAhU8wqUYjpInE1x0UREh4SBVPTaJhXUbKDWEiqKiqHiTJoJW6MNrsx20VCiBI0n1DNEIUTo+25gSODMDTfwj+cvIBJIgKkgBJAQiZVkSjLFNWX6YBUxdjVWQHVgRw1TI7uTLaEYIokmJ246ucbB4YxF13HqDdssjw6Z7e1jImRXalTu\/sA9PPvU06znhiCGyAJUB1FUQQSSKdkND01IWsmFUANMFFVDRXFzXI3sGRchmZMkkbTh2LENPvr5j3Nsa5Nf\/uAnvHD+BaxZI\/kQTdONNe6+9x7+\/MjjbLYjoBARAxgVVMBMMB1Ycxec3CC9U2us9AVQRA01R8Rwc1QTbraqiXMPvo9Pf+WTPPObv\/Cjb36fROHW664namX\/YIZn47Nf\/xq\/+eHDvHF9nWXpqNETUQbpdBVdadhDOSmm4NJOqF1Bah3OoQDEEHHUEskcVSOZ06bM2J0vfPlj3P+Rc8yu7PPwt39E1hFb45Zb3nw9B7uvsns4596vfoakQj3\/Im+7bpvZ0SHzfkmpPaV2oJXkhpngriQXUjJcxuvIsodSCRj2CIpIQsUQT2R12pQYp8SnP3cf93\/kHAB\/fOxJEg3TtSlr44b9y0ecufNdfOChu\/G24YlvfJftExtodOzuBX2fKDEACqmoBik77kJKimfBZTSF3EMBCYVQBAVx0ISpk8zJKXH27E186BPvv5YS9l6ZcfzUSU6f2ebM7W\/iTXfczOTEOhHBCz99lMkoU+oabdOTmwpSqdHR90uidqiBamBu5MbxJDjTDegLETKAiSG6DMc1oTiyOgA\/96UHr53MAA988T7+s0QELz36W5aXXuXkjcdZ7Ga6gx3WtUOsIhbU2lH7BUKPmmCupJzxpsF1OiUVhjyD4qEkjCxODiOrkVHuOHsDp08f+y8A\/15qKTz7s1+z\/8yztBOl3Rhz8rY30u9O2LsoqCwROpBMlIRIHSIsOZYz1ozw6eaUUoAVQ4bg4bRitCgtRlOFu9775v8LZnZpl6d+\/DjL1y4xagCF7uiQw9c6XJaMNxpqV4azx0AlISu51B3LLdqM8DccG9H3QS1QQ9FQFCOFkDDaUJoi3Hrzif8J5GjvkL8+9iQv\/e5psnSM2jqkjgrRQV0YNEoeKZEUk1jJlFBTLGU0N0hqII\/wd2w3HM47lovCsq+UUim1IiFIVKwIJsKJrfE1EAezI84\/8xLP\/+E5Xvrz32miY+yFSAWnkrUSGmAByyFXSgqSB26CmaApIbmFZJAz5Aa8xR\/aepmDeWU269g7qMz6YH8Bh0uYd7DshdLDd771PY4Ojth5dY+Dy3vkUkgUEpVWKyPrmaRgva0sxxWmQQqhtcFmSOlQDywbVoOuM4wp3cLQNrF7ZUxHi5y7\/USst4n5fLBKbpkQp+KEJApO1UxfIURBHRFlMh4zalqW8znZjFEynMokwzTDyUlw3VZh+4QxmQgXLu4wOzqi5I7N60\/zyM9\/xfMXF6y3le3tKYsueOKpA2Rt81hoyogalhLetIganhs8ZSw1qBq5aTFPJM+4Jd575x2kCEZNw2LecfrUNrJcYLXw2vmXyf2czRaOrylbE0jak6xnc9Jz69kxOxdnXLq4x3QELj0n77qPwz\/9Ar\/tw5+iWVunr9BOpnhqUHXEnOQJEUMY8o6EIKVCKSzWxmxtrNGocPDqDldKJlmi1p7dvMX6SFm4cJCUnIw2VapV5k2ls02OvRV2Zs+RRkLjPf2VQ9befj9eMGaHR2CJ5f4+IgeADl4oBgM+eCFWYCpSK\/+8MOcvtZDNkBJIBFYLicEbj1NmmpypOxtNYpwE18I4w2ze8Z53rvPiFaVe7lkfwXTnZd7ywLvxK+f\/xrLrUM\/UUvFmBK\/\/QyCAp4SqIhFEDTQGAFor0vfXDH7tFrgYO69coM0tLsLG2jrH1zfxqBwe7rG1PuX3Tzv\/OD\/ild05z782Z5SDRpd8sH8ROXHLbVFLoV8uqd2CNJkiIZTlHE3NkA5qj+cWYPDcgNZAESSueujBi2sEQsVEcBVcQKlkM1SDvu8QCttTZ6M1Lh8NNrdxuOsM\/AtA9jdb2ZxdiwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-sorter_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ELightweight sorting of tables.\u003C\/p\u003E\n\u003Cp\u003EJust add \u003Ccode\u003E[data-sort]\u003C\/code\u003E attributes to the \u003Ccode\u003Eth\u003C\/code\u003E elements in columns you\u2019d like to sort a table by, include ~1kB of JS \u0026amp; CSS, and initialise with \u003Ccode\u003Esorter()\u003C\/code\u003E \u2013 and that\u2019s it!\u003C\/p\u003E\n\u003Cp\u003EFor installation instructions and more customisation options, you can check out the \u003Ca href=\u0022https:\/\/gitlab.com\/Avris\/Sorter\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E readme file\u003C\/a\u003E.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["html","javascript","js","library","lightweight","sort","sorting","table"],"hasMore":false,"image":"https:\/\/avris.it\/image\/avris-sorter_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-sorter_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-sorter_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ELightweight sorting of tables.\u003C\/p\u003E\n\u003Cp\u003EJust add \u003Ccode\u003E[data-sort]\u003C\/code\u003E attributes to the \u003Ccode\u003Eth\u003C\/code\u003E elements in columns you\u2019d like to sort a table by, include ~1kB of JS \u0026amp; CSS, and initialise with \u003Ccode\u003Esorter()\u003C\/code\u003E \u2013 and that\u2019s it!\u003C\/p\u003E\n\u003Cp\u003EFor installation instructions and more customisation options, you can check out the \u003Ca href=\u0022https:\/\/gitlab.com\/Avris\/Sorter\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E readme file\u003C\/a\u003E.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-sorter_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-sorter_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ELightweight sorting of tables.\u003C\/p\u003E\n\u003Cp\u003EJust add \u003Ccode\u003E[data-sort]\u003C\/code\u003E attributes to the \u003Ccode\u003Eth\u003C\/code\u003E elements in columns you\u2019d like to sort a table by, include ~1kB of JS \u0026amp; CSS, and initialise with \u003Ccode\u003Esorter()\u003C\/code\u003E \u2013 and that\u2019s it!\u003C\/p\u003E\n\u003Cp\u003EFor installation instructions and more customisation options, you can check out the \u003Ca href=\u0022https:\/\/gitlab.com\/Avris\/Sorter\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E readme file\u003C\/a\u003E.\u003C\/p\u003E","words":50,"readTime":null,"lang":"en"}}},"projects\/avris-deployer":{"key":"projects\/avris-deployer","type":"article","published":true,"meta":{"createdAt":"2019-09-26T20:23:40+02:00","publishedAt":"2019-09-26T20:21:00+02:00","group":null,"links":[{"icon":"brands gitlab","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/Deployer","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-deployer"},"content":{"en":{"slug":"avris-deployer","title":"Avris Deployer","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-deployer_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHoUlEQVRIiX2X248lVRXGf+uyd9Xp0+d09zDTMAzMiBcUEQlEIwkxIAmCMWrUeE+IPuiDxgf\/BN9988FofNYn4wtqotF4SSRRNF4AcSI6wwADMpe+nD59+lTtvXyoM4NR407tqkpqX779fXvt9ZWcft2dEaUiBFErRMXcqaUQBCqCq2GqJHeWyyNqrRABEQggIghDERFEBAiulYhY1Xr9SVREQEUwd0yEphnhEUJEUGpBAgQopSAMA6vqAFQUaiWp0q8mQGTVjuvtRQAEVXltcrn2LkQtiBoRr\/UzhKSG1oJf6yAoQSUCNATRYTJCUHVA6EvFEBQhRDHVFRvDQpDh2+pa3Qx3Y7nsEIGIYYEiiq76mipuRlLFQxRqWRE8MEIEEoKq4aaYCCaKmyJRqbVSaxkGcB9WXyuqdl0qFSFqJQg2NjfZuXIVqBCCOEQtqAoEmCnJjOTXAAmgAnXFloCIrmQwFMXMyJZYaxqInvnhIY07TXKyJ2qtlNLTlwLCsF9qBeDkjdsc7c+AOpAWgWpegVJMB4mzKS6aiOiQMJCKXt+kgpoN1FpCRVExVJxxM2ZrtMHV2S4aSpSg8YR6hiiECH3fDQwJnDl9mpfPPY9IIAGmghBAQiRWkinJFNeU6YNVxNi1WAHVgR01TI3sTraEYogkmpy47cQ6B\/MZR13HjTdtszycM9vbx0TIrtSo3P\/eB3jumWeZ5oYghsgCVAdRVEEEkinZDQ9NSFrJhVADTBRVQ0Vxc1yN7BkXIZmTJJG04dixDT7y2Y9xbGuTn3\/vR1w4fwFr1kk+RNNkY537H3qAp3\/xazbbEVCIiAGMCipgJpgOrLkLTm6Q3qk1VvoCKKKGmiNiuDmqCTdb1cSD73s3n\/rSJzj75F94\/OvfJVG4\/eTNRK3sH8zwbHzmq1\/hye\/\/kFumU5alo0ZPRBmk01V0pWEP5aSYgks7pnYFqXU4hwIQQ8RRSyRzVI1kTpsya+587osf5ZEPP8js6j4\/\/ObjZB2xtdbyhjfezMHuJXbnCx768qdJKtTzL\/CWk9vMDucs+iWl9pTagVaSG2aCu5JcSMlwWZsiyx5KJWDYIygiCRVDPJHVaVNiLSU+9djDPPLhBwH406+eItEwWZ+wvtawf+WQM+94O+\/9wP142\/DE177N9vENNDp294K+T5QYAIVUVIOUHXchJcWz4DKaQO6hgIRCKIKCOGjC1Enm5JS4++7b+ODH33M9Jey9MuOGG09w6sw2Z+68lVvvfT3j41Miggs\/\/iXjUabUddqmJzcVpFKjo++XRO1QA9XA3MiN40lwJhvQFyJkABNDdBmOa0JxZHUAPvaF910\/mQEe\/fzD\/GeJCF785e9YvnqJE6+7gaPdTHeww1Q7xCpiQa0dtT9C6FETzJWUM940uE4mpMKQZ1A8lISRxclhZDUyyr13n+bUqWP\/BeDfSy2F537yW\/bPPkc7VtqNNU7ccQv97pi9i4LKEqEDyURJiNQhwpJjOWPNCJ9sTigFWDFkCB5OK0aL0mI0VbjvXW\/8v2Bmr+7yzA9+zfLyq4waQKE7nDO\/3OGyZG2joXZlOHsMVBKykkvdsdyizQi\/6diIvg9qgRqKhqIYKYSE0YbSFOH21x\/\/n0AO9+b89VdP8eLvnyVLx6itQ+qoEB3UI4NGySMlkmISK5kSaoqljOYGSQ3kEf627Yb5omN5VFj2lVIqpVYkBImKFcFEOL61dh3EweyQ82df5Nwf\/86LT\/+DJjrWvBCp4FSyVkIDLGA55EpJQfLATTATNCUkt5AMcobcgLf4B7Ze4mBRmc069g4qsz7YP4L5EhYdLHuh9PCtb3yHw4NDdi7tcXBlj1wKiUKi0mplZD3jFEzbynKtwiRIIbQ22AwpHeqBZcNq0HWGMaE7MrRN7F5do6NFHrzzeEzbxGIxWCW3TIhTcUISBadqpq8Qq0S7vX0Tly9dwm3Icce3NlkczGgUxhkmGU6Mg5Nbhe3jxngsPH9xh9nhISV3bN58il\/89Decu3jEtK1sb0846oInnjlA1jePhaaMqGEp4U2LqOG5wVPGUoOqkZsW88SxzS3ece89bLaJg\/05KTdkzyznS6ZtYrG\/zx1vOs3sn5eYX7zADWNhawxJe5L1bI57br97jZ2LM169uMdkBC49J+57mPmff4bf8aFP0qxP6Su04wmeGlQdMSd5QsQQhrwjITQqbNyyzcF8wX6dc9dtJ3np5ctoC9JkxtMTXNhZImVMtKc4SEpORpsq1SqLptLZJsfeDDuzv5NGQuM9\/dU56299BC8Ys\/khWGK5v4\/IAaCDF4rBgA9eCKRUKJWXnj9HXSygFs4++zTRVyQCj8BD0FpYS5lJcibubDSJtSS4FtYyzBYd77xrygtXlXqlZzqCyc5LvOnRe\/Cr5\/\/GsutQz9RS8WYEr\/1DIICnhKoiEUQNNAKJQGtF+v66wa\/dES7GzivP0+YWF2FjfcoN0008KvP5HlvTCX941nn5\/IhXdhecu7xglINGl7y\/fwE5\/oY7opZCv1xSuyPSeIKEUJYLNDVDOqg9nluAwXMDWgNFkLjmoQcvrhEIFRPBVXABpZLNUA36vkMobE+cjda4cjjY3MbhvjPwL+zZPiPSuvOOAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-deployer_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI got tired of creating deployment scripts for my project, so I finally put together a simple, language-agnostic deployment script based on Makefile and symlinks.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-deployer_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHoUlEQVRIiX2X248lVRXGf+uyd9Xp0+d09zDTMAzMiBcUEQlEIwkxIAmCMWrUeE+IPuiDxgf\/BN9988FofNYn4wtqotF4SSRRNF4AcSI6wwADMpe+nD59+lTtvXyoM4NR407tqkpqX779fXvt9ZWcft2dEaUiBFErRMXcqaUQBCqCq2GqJHeWyyNqrRABEQggIghDERFEBAiulYhY1Xr9SVREQEUwd0yEphnhEUJEUGpBAgQopSAMA6vqAFQUaiWp0q8mQGTVjuvtRQAEVXltcrn2LkQtiBoRr\/UzhKSG1oJf6yAoQSUCNATRYTJCUHVA6EvFEBQhRDHVFRvDQpDh2+pa3Qx3Y7nsEIGIYYEiiq76mipuRlLFQxRqWRE8MEIEEoKq4aaYCCaKmyJRqbVSaxkGcB9WXyuqdl0qFSFqJQg2NjfZuXIVqBCCOEQtqAoEmCnJjOTXAAmgAnXFloCIrmQwFMXMyJZYaxqInvnhIY07TXKyJ2qtlNLTlwLCsF9qBeDkjdsc7c+AOpAWgWpegVJMB4mzKS6aiOiQMJCKXt+kgpoN1FpCRVExVJxxM2ZrtMHV2S4aSpSg8YR6hiiECH3fDQwJnDl9mpfPPY9IIAGmghBAQiRWkinJFNeU6YNVxNi1WAHVgR01TI3sTraEYogkmpy47cQ6B\/MZR13HjTdtszycM9vbx0TIrtSo3P\/eB3jumWeZ5oYghsgCVAdRVEEEkinZDQ9NSFrJhVADTBRVQ0Vxc1yN7BkXIZmTJJG04dixDT7y2Y9xbGuTn3\/vR1w4fwFr1kk+RNNkY537H3qAp3\/xazbbEVCIiAGMCipgJpgOrLkLTm6Q3qk1VvoCKKKGmiNiuDmqCTdb1cSD73s3n\/rSJzj75F94\/OvfJVG4\/eTNRK3sH8zwbHzmq1\/hye\/\/kFumU5alo0ZPRBmk01V0pWEP5aSYgks7pnYFqXU4hwIQQ8RRSyRzVI1kTpsya+587osf5ZEPP8js6j4\/\/ObjZB2xtdbyhjfezMHuJXbnCx768qdJKtTzL\/CWk9vMDucs+iWl9pTagVaSG2aCu5JcSMlwWZsiyx5KJWDYIygiCRVDPJHVaVNiLSU+9djDPPLhBwH406+eItEwWZ+wvtawf+WQM+94O+\/9wP142\/DE177N9vENNDp294K+T5QYAIVUVIOUHXchJcWz4DKaQO6hgIRCKIKCOGjC1Enm5JS4++7b+ODH33M9Jey9MuOGG09w6sw2Z+68lVvvfT3j41Miggs\/\/iXjUabUddqmJzcVpFKjo++XRO1QA9XA3MiN40lwJhvQFyJkABNDdBmOa0JxZHUAPvaF910\/mQEe\/fzD\/GeJCF785e9YvnqJE6+7gaPdTHeww1Q7xCpiQa0dtT9C6FETzJWUM940uE4mpMKQZ1A8lISRxclhZDUyyr13n+bUqWP\/BeDfSy2F537yW\/bPPkc7VtqNNU7ccQv97pi9i4LKEqEDyURJiNQhwpJjOWPNCJ9sTigFWDFkCB5OK0aL0mI0VbjvXW\/8v2Bmr+7yzA9+zfLyq4waQKE7nDO\/3OGyZG2joXZlOHsMVBKykkvdsdyizQi\/6diIvg9qgRqKhqIYKYSE0YbSFOH21x\/\/n0AO9+b89VdP8eLvnyVLx6itQ+qoEB3UI4NGySMlkmISK5kSaoqljOYGSQ3kEf627Yb5omN5VFj2lVIqpVYkBImKFcFEOL61dh3EweyQ82df5Nwf\/86LT\/+DJjrWvBCp4FSyVkIDLGA55EpJQfLATTATNCUkt5AMcobcgLf4B7Ze4mBRmc069g4qsz7YP4L5EhYdLHuh9PCtb3yHw4NDdi7tcXBlj1wKiUKi0mplZD3jFEzbynKtwiRIIbQ22AwpHeqBZcNq0HWGMaE7MrRN7F5do6NFHrzzeEzbxGIxWCW3TIhTcUISBadqpq8Qq0S7vX0Tly9dwm3Icce3NlkczGgUxhkmGU6Mg5Nbhe3jxngsPH9xh9nhISV3bN58il\/89Decu3jEtK1sb0846oInnjlA1jePhaaMqGEp4U2LqOG5wVPGUoOqkZsW88SxzS3ece89bLaJg\/05KTdkzyznS6ZtYrG\/zx1vOs3sn5eYX7zADWNhawxJe5L1bI57br97jZ2LM169uMdkBC49J+57mPmff4bf8aFP0qxP6Su04wmeGlQdMSd5QsQQhrwjITQqbNyyzcF8wX6dc9dtJ3np5ctoC9JkxtMTXNhZImVMtKc4SEpORpsq1SqLptLZJsfeDDuzv5NGQuM9\/dU56299BC8Ys\/khWGK5v4\/IAaCDF4rBgA9eCKRUKJWXnj9HXSygFs4++zTRVyQCj8BD0FpYS5lJcibubDSJtSS4FtYyzBYd77xrygtXlXqlZzqCyc5LvOnRe\/Cr5\/\/GsutQz9RS8WYEr\/1DIICnhKoiEUQNNAKJQGtF+v66wa\/dES7GzivP0+YWF2FjfcoN0008KvP5HlvTCX941nn5\/IhXdhecu7xglINGl7y\/fwE5\/oY7opZCv1xSuyPSeIKEUJYLNDVDOqg9nluAwXMDWgNFkLjmoQcvrhEIFRPBVXABpZLNUA36vkMobE+cjda4cjjY3MbhvjPwL+zZPiPSuvOOAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-deployer_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI got tired of creating deployment scripts for my project, so I finally put together a simple, language-agnostic deployment script based on Makefile and symlinks.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["deploy","deployment","make","makefile","php","symlink"],"hasMore":false,"image":"https:\/\/avris.it\/image\/avris-deployer_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-deployer_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-deployer_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI got tired of creating deployment scripts for my project, so I finally put together a simple, language-agnostic deployment script based on Makefile and symlinks.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-deployer_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-deployer_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI got tired of creating deployment scripts for my project, so I finally put together a simple, language-agnostic deployment script based on Makefile and symlinks.\u003C\/p\u003E","words":25,"readTime":null,"lang":"en"}}},"projects\/columnist":{"key":"projects\/columnist","type":"article","published":true,"meta":{"createdAt":"2019-08-26T15:07:32+02:00","publishedAt":"2019-08-26T17:48:00+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/columnist.avris.it\/","displayUrl":"Demo"},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Columnist","displayUrl":null},{"icon":"globe-europe","colour":"secondary","url":"https:\/\/www.npmjs.com\/package\/avris-columnist","displayUrl":null}],"category":"projects","subcategory":null,"slug":"columnist"},"content":{"en":{"slug":"columnist","title":"Columnist \u2013 Simple and lightweight multi-column design","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/columnist_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022244.29473684211\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACMklEQVRIicWVQXPTMBCFv5WtNMRNmik\/iekU\/iX3\/hdOHGE40XOZkDSurF0OshzHiZ0OdIZ3sawn62mfdteiqkYPIoLZ0dSr599iTTkk+otjVB4ffxKaSOGEEBqiKqvVkpn3IML729uTzf8FMnSoj5fwQhMiaooTAQQA7z3en8TyJg6JnWNbbLdb6n1NVMV7T9SICGDJSTNwTpjNrri+ri5G\/xqUE+cBIDQNaoqaUlUVmLURCiLZsfJs1H+DSYf+B04ToYfPX+DhaxrfLiAq7AKECJ6aj80DALOZxzlHjJEQGgB+fP9GXe8pipLFYs5m8xuAT\/d33N996DTMrHMaBg4NyUvzfR7o1uT1\/e9eu6Y8J5jfVXU0N8aqJXOqOso550aDm8yh0DTkrrDdbqmqipTOqboy97zbIa5gPr+CHpfWGk9Pv1iv1x3ny\/FMmexDUZUx2okQNZ7nnEvukjvXMVcWxelBxjp1H6nXJOuf93vezecHThzJ26Gktd+mhtVmzpTMEcqpZG2VAdCo3ThDRLI+na5JulI5fxARGS0QEbncGE0Sv1gsunFWz\/Ef6UrmDggh4L1vN2SyiV50KMVrdP+M3gmS9nDeeodJv5fd7pmbmzLPTLaQySqLMRJHkrpwMso5EZp4vuyLYrrKJq9MzbC2WjabDavlsqscFdclfF3XFKWnLFJ\/MXHdhWYvDirj\/asNprV\/5IkIiLBcrtLuR8kqmAll6TEdFrkcHu0eTGjl8R8MrVmKlGbrrwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/columnist_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022244.29473684211\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI like multi-column design. Unfortunately, it\u2019s really annoying to work with. If your tiles don\u2019t all have the same height, it looks awful.\u003C\/p\u003E\n\u003Cp\u003EThat\u2019s why we have \u003Ca href=\u0022https:\/\/masonry.desandro.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Masonry\u003C\/a\u003E (and \u003Ca href=\u0022https:\/\/alternativeto.net\/software\/masonry\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E alternatives\u003C\/a\u003E) \u2013 but they all use absolute positioning, which can be problematic for lazy loading of images, dynamically adding more elements, etc. We can \u003Ca href=\u0022https:\/\/tobiasahlin.com\/blog\/masonry-with-css\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E try doing it with plain CSS\u003C\/a\u003E \u2013 alas, it either breaks the order of tiles or requires knowing the height of the container in advance.\u003C\/p\u003E\n\u003Cp\u003EBut I think I might have a solution to that: \u003Ca href=\u0022https:\/\/columnist.avris.it\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E DEMO\u003C\/a\u003E\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/columnist_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022488.58947368421\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACMklEQVRIicWVQXPTMBCFv5WtNMRNmik\/iekU\/iX3\/hdOHGE40XOZkDSurF0OshzHiZ0OdIZ3sawn62mfdteiqkYPIoLZ0dSr599iTTkk+otjVB4ffxKaSOGEEBqiKqvVkpn3IML729uTzf8FMnSoj5fwQhMiaooTAQQA7z3en8TyJg6JnWNbbLdb6n1NVMV7T9SICGDJSTNwTpjNrri+ri5G\/xqUE+cBIDQNaoqaUlUVmLURCiLZsfJs1H+DSYf+B04ToYfPX+DhaxrfLiAq7AKECJ6aj80DALOZxzlHjJEQGgB+fP9GXe8pipLFYs5m8xuAT\/d33N996DTMrHMaBg4NyUvzfR7o1uT1\/e9eu6Y8J5jfVXU0N8aqJXOqOso550aDm8yh0DTkrrDdbqmqipTOqboy97zbIa5gPr+CHpfWGk9Pv1iv1x3ny\/FMmexDUZUx2okQNZ7nnEvukjvXMVcWxelBxjp1H6nXJOuf93vezecHThzJ26Gktd+mhtVmzpTMEcqpZG2VAdCo3ThDRLI+na5JulI5fxARGS0QEbncGE0Sv1gsunFWz\/Ef6UrmDggh4L1vN2SyiV50KMVrdP+M3gmS9nDeeodJv5fd7pmbmzLPTLaQySqLMRJHkrpwMso5EZp4vuyLYrrKJq9MzbC2WjabDavlsqscFdclfF3XFKWnLFJ\/MXHdhWYvDirj\/asNprV\/5IkIiLBcrtLuR8kqmAll6TEdFrkcHu0eTGjl8R8MrVmKlGbrrwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/columnist_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022488.58947368421\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI like multi-column design. Unfortunately, it\u2019s really annoying to work with. If your tiles don\u2019t all have the same height, it looks awful.\u003C\/p\u003E\n\u003Cp\u003EThat\u2019s why we have \u003Ca href=\u0022https:\/\/masonry.desandro.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Masonry\u003C\/a\u003E (and \u003Ca href=\u0022https:\/\/alternativeto.net\/software\/masonry\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E alternatives\u003C\/a\u003E) \u2013 but they all use absolute positioning, which can be problematic for lazy loading of images, dynamically adding more elements, etc. We can \u003Ca href=\u0022https:\/\/tobiasahlin.com\/blog\/masonry-with-css\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E try doing it with plain CSS\u003C\/a\u003E \u2013 alas, it either breaks the order of tiles or requires knowing the height of the container in advance.\u003C\/p\u003E\n\u003Cp\u003EBut I think I might have a solution to that: \u003Ca href=\u0022https:\/\/columnist.avris.it\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E DEMO\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003ETake a look at this graphic:\u003C\/p\u003E\n\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/columnist-how_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022475.49103330487\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACAElEQVRIiZVV207jMBA9M3ZWon0Csd\/B\/\/8E8MAPIMGudgtFglawJJ7ZB8d3h4ZRk9rj4zP2GTtDIqLT5ADCSSMQmAlO5DQYABNDoVDVVXhrDBgAnAhEtHh2u6fG50Qgqo3\/4\/0Du6d941cVSIf74eFX4\/N4hQ2rq3ex2WwbHxF1seM4YrvZdJTo47fbHnaeISI6ThMoz9nLi\/8\/P2\/4iQiTc4D6cIqUbU0wKAGWOSq6hCFNvh+D9QoNNgrl7XgAXl+Bn5fNDpyIZ4JGojqcYo6W2RImsXizIQ2FnZ0B+z3QG0PuDhoVo42vpenNmxfUzeXFBXA8Agt5Vsw6R72z\/IVAlCUz9yNvt\/x9heJGlsYo\/Pw5CPQd+GAt6hiqWvjyfl+hFDbeBiJK7RPfFapavRi1L\/S\/VggodhLbRPF65ZkhoLx21fw8+PcUensDDodFheI7HoXqUitiunP+guNbCj0+Avf3wNVVoxATwTKVMiRE0WPmRqGwqKXMkIjov8+xpFL1D3NDxobhJtclq80YA1GByrpaNgwWKSKFXRNAhNu7u9SfH+1hQXjeP+P3n78lnvJvTYm\/vrn1IxUPkCm0xogIxjCmlQpZk0rHGoulIwRbtSgAvBLrb+PyeelZUcT8Sfd3eRYw1ppQfJkZxpjm9qT55eY+RYpDnDC+vpGW1ew\/BCdqPrjZC2cAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/columnist-how_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022475.49103330487\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EOur main job is to make the empty space marked with the red arrow disappear. If we can calculate its height, we can give the tile right below it a negative \u003Ccode\u003Emargin-top\u003C\/code\u003E to compensate for the height of the empty space.\u003C\/p\u003E\n\u003Cp\u003EAnd we can! All we need is to make sure that the column only has one child element. The difference between the height of the column and of that child is what we need to compensate for.\u003C\/p\u003E\n\u003Cp\u003EWe can find the tile right below from it (\u003Ccode\u003Ei + numberOfColumns\u003C\/code\u003E), give it \u003Ccode\u003Emargin-top: -${diff}px\u003C\/code\u003E et voil\u00e0!\u003C\/p\u003E\n\u003Ch3\u003ELimitations\u003C\/h3\u003E\n\u003Cp\u003EMy script does not do any maths fancier than this. If your first column contains a very tall tile A and a small tile B, and your second column only contains a small tile C, it would look nicer, if B were moved to the second column. My script doesn\u2019t do that. That\u2019s the price of simplicity.\u003C\/p\u003E\n\u003Ch3\u003EFuture work\u003C\/h3\u003E\n\u003Cp\u003ECurrent implementation relies a \u003Ccode\u003EsetInterval\u003C\/code\u003E that reapplies the layout every 300 ms. Firstly, because a couple of iterations are needed to get the final layout, and secondly, because the DOM and window can change.\u003C\/p\u003E\n\u003Cp\u003EObviously, I can get rid of both those problems. Applying the layout in a loop or in some smarter way, adding event listeners, etc.\u003C\/p\u003E\n\u003Cp\u003EBut that\u2019s a job for the next free evening \/ weekend.\u003C\/p\u003E\n\u003Cp\u003EAnyways, check out the links below and enjoy \ud83d\ude09\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["column","design","javascript","layout","library","masonry","multi-column","npm"],"hasMore":true,"image":"https:\/\/avris.it\/image\/columnist_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/columnist_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/columnist_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022122.14736842105\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI like multi-column design. Unfortunately, it\u2019s really annoying to work with. If your tiles don\u2019t all have the same height, it looks awful.\u003C\/p\u003E\n\u003Cp\u003EThat\u2019s why we have \u003Ca href=\u0022https:\/\/masonry.desandro.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Masonry\u003C\/a\u003E (and \u003Ca href=\u0022https:\/\/alternativeto.net\/software\/masonry\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E alternatives\u003C\/a\u003E) \u2013 but they all use absolute positioning, which can be problematic for lazy loading of images, dynamically adding more elements, etc. We can \u003Ca href=\u0022https:\/\/tobiasahlin.com\/blog\/masonry-with-css\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E try doing it with plain CSS\u003C\/a\u003E \u2013 alas, it either breaks the order of tiles or requires knowing the height of the container in advance.\u003C\/p\u003E\n\u003Cp\u003EBut I think I might have a solution to that: \u003Ca href=\u0022https:\/\/columnist.avris.it\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E DEMO\u003C\/a\u003E\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/columnist_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/columnist_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022122.14736842105\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI like multi-column design. Unfortunately, it\u2019s really annoying to work with. If your tiles don\u2019t all have the same height, it looks awful.\u003C\/p\u003E\n\u003Cp\u003EThat\u2019s why we have \u003Ca href=\u0022https:\/\/masonry.desandro.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Masonry\u003C\/a\u003E (and \u003Ca href=\u0022https:\/\/alternativeto.net\/software\/masonry\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E alternatives\u003C\/a\u003E) \u2013 but they all use absolute positioning, which can be problematic for lazy loading of images, dynamically adding more elements, etc. We can \u003Ca href=\u0022https:\/\/tobiasahlin.com\/blog\/masonry-with-css\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E try doing it with plain CSS\u003C\/a\u003E \u2013 alas, it either breaks the order of tiles or requires knowing the height of the container in advance.\u003C\/p\u003E\n\u003Cp\u003EBut I think I might have a solution to that: \u003Ca href=\u0022https:\/\/columnist.avris.it\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E DEMO\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003ETake a look at this graphic:\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/columnist-how_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/columnist-how_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022118.87275832622\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EOur main job is to make the empty space marked with the red arrow disappear. If we can calculate its height, we can give the tile right below it a negative \u003Ccode\u003Emargin-top\u003C\/code\u003E to compensate for the height of the empty space.\u003C\/p\u003E\n\u003Cp\u003EAnd we can! All we need is to make sure that the column only has one child element. The difference between the height of the column and of that child is what we need to compensate for.\u003C\/p\u003E\n\u003Cp\u003EWe can find the tile right below from it (\u003Ccode\u003Ei + numberOfColumns\u003C\/code\u003E), give it \u003Ccode\u003Emargin-top: -${diff}px\u003C\/code\u003E et voil\u00e0!\u003C\/p\u003E\n\u003Ch3\u003ELimitations\u003C\/h3\u003E\n\u003Cp\u003EMy script does not do any maths fancier than this. If your first column contains a very tall tile A and a small tile B, and your second column only contains a small tile C, it would look nicer, if B were moved to the second column. My script doesn\u2019t do that. That\u2019s the price of simplicity.\u003C\/p\u003E\n\u003Ch3\u003EFuture work\u003C\/h3\u003E\n\u003Cp\u003ECurrent implementation relies a \u003Ccode\u003EsetInterval\u003C\/code\u003E that reapplies the layout every 300 ms. Firstly, because a couple of iterations are needed to get the final layout, and secondly, because the DOM and window can change.\u003C\/p\u003E\n\u003Cp\u003EObviously, I can get rid of both those problems. Applying the layout in a loop or in some smarter way, adding event listeners, etc.\u003C\/p\u003E\n\u003Cp\u003EBut that\u2019s a job for the next free evening \/ weekend.\u003C\/p\u003E\n\u003Cp\u003EAnyways, check out the links below and enjoy \ud83d\ude09\u003C\/p\u003E","words":331,"readTime":2,"lang":"en"}}},"projects\/bearlines":{"key":"projects\/bearlines","type":"article","published":true,"meta":{"createdAt":"2019-07-25T11:12:15+02:00","publishedAt":"2019-07-25T11:09:00+02:00","group":null,"category":"projects","subcategory":null,"slug":"bearlines"},"content":{"en":{"slug":"bearlines","title":"Logo design idea: \ud83d\udc3eBearlines","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/bearlines_small.png\u0022 alt=\u0022? Bearlines\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEDElEQVRIie2VX0ybVRjGf+ejLQXKgILOAhthoIxqNxWyDUgW5WKORRaCu9BtUfFm2UJELxojMTFzibqEXRmmGBIkqWR\/XNzF6CBTspHJdGOV4NzY3DpFoIyWthRaaCk9XmiJqBBQUUx8ki958n7JyZv395z3iEgkIllmCSGQUi7KCxmtrBAp0X6klKwEr0RNVFJKwuEwf1T\/s34p+h2ykZER2tvbSU9Pp6SkBK1WC8DNq+cJjLnJ37INbbxuwUOnxxyE\/W5kOEhcxgZEjGrRDamklLOBmpqa4ujRo5w8eZLMzEyMRiNmsxmDwcA5yxE2PbUba+MhyvcdpO\/K52TlFyJlhO+vXyGv8Elcg3YmPC70ig8l6CbkGUCdnEnQdQcZDqF7cCtB521Coz+QuL6Uie8uotKloTXkz\/YwB1lbWxsdHR2UlpaiVqvx+\/0cO3YMgHAoyI3L54hflULL4QM47NdpevN5Jv0+rn1xljMfvkVr4yECE140v0zVb7\/E1HAfzgsf4L7cgu\/bNvot+xi7ZmXY+jaDn76OnAnNmZAihCD6ORwOjEYjFouF1tZWuru7yc7ORghBbFwCu145wq2rFxhzOdClpFFc\/iJtTe9gKtnBxJgLJUbN46XPoCgqkBL1KgMAcRkm4rMKCDrvgFCIz9xI8mMVpO88iKP1EEKIn\/MjxFxk+\/fvp7KyEq\/Xi6Io2O12bDYbFRUVGLds4zPLESpfPowQCpfOfMTDxWVsLtuD\/ZsvySt4ghiVBikl2gfWEwkFSDLtQKNfAwIUlRaVLhWh0jDpuEGS6WncV46j37SHX\/cgfrsYu7q6sFqtVFVVkZOTs+gwLqT\/F+OyL8a\/2y9FCyKLhu2f1LzIfD4fPT09DAwM0NnZOVsPT4fo7\/sa93D\/ohBMOm4gIzOEPAN\/DVlvby89PT3s3buXmpoa2tvbAfA6BzldX8vxuhru9d8iGJjANWif\/ecdGQQkXucQrkE7w23vMhPw4LGdYibgIeTuJxIcn3dCqvmQ2Gw2mpubKSoqYmhoiLq6OgoKCgDw+9woigJA4xu7ycg1kWrIQhufyPlP3udZ83s01j7Hrlfr0AHT4yNM3L5IaPQuqsT78d+9TO6B0wBzIiGEmB9ZU1MT5eXl1NfXY7Va0ev1xMbGApD7aAnbq2rpPNWAzzVMbJyOpFQDX539mNVrH8Jz70fWmTbzSHEZALH35SCEAhLSil9CUcctHVlLSwsNDQ0ABINBTpw4QW9vLxptAgGfh5vdHWx\/4TU2bN2Jb3SYtfkFrM7KQ5echkqtISu\/EADduiLC404SsjcTt2YjQq0lIXvTvMjmvWXT09OYzWYAqqurSUlJQa\/XL\/utE5FIRC5ltS+3\/28txn9DK+4t+wl0sWYKOBC5gAAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/bearlines_small.png\u0022 alt=\u0022? Bearlines\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIf you\u2019re planning to open an airline that will hire bear guys as flight attendants, or to open a gay bar for bears in Berlin, here\u2019s a name \u0026amp; logo for you \ud83d\ude04\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/bearlines_big.png\u0022 alt=\u0022? Bearlines\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022640\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEDElEQVRIie2VX0ybVRjGf+ejLQXKgILOAhthoIxqNxWyDUgW5WKORRaCu9BtUfFm2UJELxojMTFzibqEXRmmGBIkqWR\/XNzF6CBTspHJdGOV4NzY3DpFoIyWthRaaCk9XmiJqBBQUUx8ki958n7JyZv395z3iEgkIllmCSGQUi7KCxmtrBAp0X6klKwEr0RNVFJKwuEwf1T\/s34p+h2ykZER2tvbSU9Pp6SkBK1WC8DNq+cJjLnJ37INbbxuwUOnxxyE\/W5kOEhcxgZEjGrRDamklLOBmpqa4ujRo5w8eZLMzEyMRiNmsxmDwcA5yxE2PbUba+MhyvcdpO\/K52TlFyJlhO+vXyGv8Elcg3YmPC70ig8l6CbkGUCdnEnQdQcZDqF7cCtB521Coz+QuL6Uie8uotKloTXkz\/YwB1lbWxsdHR2UlpaiVqvx+\/0cO3YMgHAoyI3L54hflULL4QM47NdpevN5Jv0+rn1xljMfvkVr4yECE140v0zVb7\/E1HAfzgsf4L7cgu\/bNvot+xi7ZmXY+jaDn76OnAnNmZAihCD6ORwOjEYjFouF1tZWuru7yc7ORghBbFwCu145wq2rFxhzOdClpFFc\/iJtTe9gKtnBxJgLJUbN46XPoCgqkBL1KgMAcRkm4rMKCDrvgFCIz9xI8mMVpO88iKP1EEKIn\/MjxFxk+\/fvp7KyEq\/Xi6Io2O12bDYbFRUVGLds4zPLESpfPowQCpfOfMTDxWVsLtuD\/ZsvySt4ghiVBikl2gfWEwkFSDLtQKNfAwIUlRaVLhWh0jDpuEGS6WncV46j37SHX\/cgfrsYu7q6sFqtVFVVkZOTs+gwLqT\/F+OyL8a\/2y9FCyKLhu2f1LzIfD4fPT09DAwM0NnZOVsPT4fo7\/sa93D\/ohBMOm4gIzOEPAN\/DVlvby89PT3s3buXmpoa2tvbAfA6BzldX8vxuhru9d8iGJjANWif\/ecdGQQkXucQrkE7w23vMhPw4LGdYibgIeTuJxIcn3dCqvmQ2Gw2mpubKSoqYmhoiLq6OgoKCgDw+9woigJA4xu7ycg1kWrIQhufyPlP3udZ83s01j7Hrlfr0AHT4yNM3L5IaPQuqsT78d+9TO6B0wBzIiGEmB9ZU1MT5eXl1NfXY7Va0ev1xMbGApD7aAnbq2rpPNWAzzVMbJyOpFQDX539mNVrH8Jz70fWmTbzSHEZALH35SCEAhLSil9CUcctHVlLSwsNDQ0ABINBTpw4QW9vLxptAgGfh5vdHWx\/4TU2bN2Jb3SYtfkFrM7KQ5echkqtISu\/EADduiLC404SsjcTt2YjQq0lIXvTvMjmvWXT09OYzWYAqqurSUlJQa\/XL\/utE5FIRC5ltS+3\/28txn9DK+4t+wl0sWYKOBC5gAAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/bearlines_big.png\u0022 alt=\u0022? Bearlines\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022640\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIf you\u2019re planning to open an airline that will hire bear guys as flight attendants, or to open a gay bar for bears in Berlin, here\u2019s a name \u0026amp; logo for you \ud83d\ude04\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["bear","berlin","concept","design","idea","logo","name"],"hasMore":false,"image":"https:\/\/avris.it\/image\/bearlines_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/bearlines_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/bearlines_mini.png\u0022 alt=\u0022? Bearlines\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIf you\u2019re planning to open an airline that will hire bear guys as flight attendants, or to open a gay bar for bears in Berlin, here\u2019s a name \u0026amp; logo for you \ud83d\ude04\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/bearlines_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/bearlines_mini.png\u0022 alt=\u0022? Bearlines\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIf you\u2019re planning to open an airline that will hire bear guys as flight attendants, or to open a gay bar for bears in Berlin, here\u2019s a name \u0026amp; logo for you \ud83d\ude04\u003C\/p\u003E","words":34,"readTime":null,"lang":"en"}}},"projects\/mulmi":{"key":"projects\/mulmi","type":"article","published":true,"meta":{"createdAt":"2019-07-20T14:41:02+02:00","publishedAt":"2019-07-20T14:39:00+02:00","group":null,"category":"projects","subcategory":null,"slug":"mulmi"},"content":{"en":{"slug":"mulmi","title":"mulmi \u2022 one subscription to rule them all! [concept]","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi1_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/mulmi1_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022232.25\u0022\u003E\u003C\/a\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi1_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFFklEQVRIiS2UTY8dSREAI7OyqvvNmxkbG7TaAwiJf82\/4sIdJFgh2F3bM6+76yMzOXgPcQ\/FIaT\/7a9JGhkCC3I4MYO5hMt3Dv\/A6c+cvnPmxiWNrpVeCrMos8LchLkJ3pJS4V6T15LcJbmp05g0FiaTkhPNjuREc0FMxB1JRzywPAGSyGSNxTUWx0jOWbg86OFcMelR6BR+fv\/KEKM+f2RZYZkxhtK7MBtoS66aTE2GOqcsbkw2GVS+U6RTcv4mNdEMxAONxM5rsXBmwDWCswfHEK6pdC\/MFEbCTBgElytvs3M+fiL3G\/LyynElRwl6FWRTnqrwyuK1wsfduKuz49xksTFpMrDs32GhEZQIJBP75XRClOXCNeC4lLMr5zRmGisVR1gCLsm23dG7sVfhqMq7KVcVHiYcJmDCUlBtFHE0nMiCYyCQCQJIJoWESEoERlIjsG8XJLAcriEcl\/DoxrUqPQxHSRGkCKUoqrDjVFWqJdYcZOEksu0MhaXJuziSybou+lrI\/YkSgoZSs1FjQ\/Oi5mCLwZaDLRb2diaZwQrlmsJjKO+jcCylO6QkqsK\/\/\/F3Xm7P\/PlPf6GG0kgqYJp8\/e+\/uL9s3F9+x0OTS5yLJBDO4ytXd572nRKKhXLLikXlFjv3mOwxaDmwHNjbFSSKR3CtwjHh4fCYyeUBElQZfPzwI8+1onNhRbEltJq0WPzhFpx2kAmWv5VBGGnILoRWLl9sbmRUtijcA14iubtTcyE5QAb2fjpIEKl0Fy5XugeXB+dckEoU4a6NTSpcgyJCLY7aIuvgjx+co12851dKBEWEJpVOw9rOZju5BuZwd+NlKc9hPLnQIiEdtEG5sOO8SFESY2YyAsaCuWDOJCMRSQoDI3i+bxScpgOzTqkn7+sLt+1ie4FNkh1jz40HT8yxQb+xtU+8uPAyCzcvbF4oYQAgioiAJfZ4\/IxoBa0sKj0ryyu+KrEKvgylcB1fWAqf9SPglDLZ60VtD749foL94vNLZROlacW4oXnn62z0x8baG4fAO7AlKIGLs2NUE6QKVMXOxz9RrUhpuDYmlZkN90a44ctYaRQmRSr9+oILUAKtkywnH8yRfVJXp5igaqRcLAZHaeTzK+\/2K4c7\/9HFq04+xsanrHxI474ME4VM7HH+QrOGlIqXjUGjZ6PnRo8Nj0bGxk0qIsrwpA9lmuK1sG0799sLuiVBp+cE6YQupizWpzuHV9x\/RTLIdIY6D3VyNa4w9ijUS0kHe\/TJ9ERLkAWmJp2kJ\/QQVgrTlcdxsOxGu79w08LTFG6jEhd8XQ9sFj5aQy2QskAXKc7brxc+D54+O+BUnJs6e3F222lRaWGYKzkTe5fFjlASImBlMDKYJCthRCIprNUpGLcxMYQqRi2C1cIqO6KDcjlWhKKdohNw\/nd1HsfJ6w+FkIkx2WVy88kWT7TYqVmprkRJ7HiG0KAKJMkiWASeAR6oJg7QhMHkzTvSEzJIKYx0tq1QyhPnl8FzFjY3yq0z4uDHrXDfnf72C+0+UBtULpqcbPFMixs1d4oaKmDX74OUJEQQSQIFCpaN4hMbi+gLtp3SFV\/JkQ2ZG5NKT+UH29CsMDvrfdDcqKvyaTee2smbdR7FmXF9P39xLBeVjvGEcENohCpmnxZoEJKYBE1BU7BolLUhc6BjoddCL6dcG2UkxRMIjlX5dipPm7LvRvUkhmAqNBEUpVBoDDrJKkmWjqpSFmgk4o5nJdT4P47hZMPWlragAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/mulmi1_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022232.25\u0022\u003E\u003C\/a\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi1_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/mulmi1_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E\u003C\/a\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi1_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFFklEQVRIiS2UTY8dSREAI7OyqvvNmxkbG7TaAwiJf82\/4sIdJFgh2F3bM6+76yMzOXgPcQ\/FIaT\/7a9JGhkCC3I4MYO5hMt3Dv\/A6c+cvnPmxiWNrpVeCrMos8LchLkJ3pJS4V6T15LcJbmp05g0FiaTkhPNjuREc0FMxB1JRzywPAGSyGSNxTUWx0jOWbg86OFcMelR6BR+fv\/KEKM+f2RZYZkxhtK7MBtoS66aTE2GOqcsbkw2GVS+U6RTcv4mNdEMxAONxM5rsXBmwDWCswfHEK6pdC\/MFEbCTBgElytvs3M+fiL3G\/LyynElRwl6FWRTnqrwyuK1wsfduKuz49xksTFpMrDs32GhEZQIJBP75XRClOXCNeC4lLMr5zRmGisVR1gCLsm23dG7sVfhqMq7KVcVHiYcJmDCUlBtFHE0nMiCYyCQCQJIJoWESEoERlIjsG8XJLAcriEcl\/DoxrUqPQxHSRGkCKUoqrDjVFWqJdYcZOEksu0MhaXJuziSybou+lrI\/YkSgoZSs1FjQ\/Oi5mCLwZaDLRb2diaZwQrlmsJjKO+jcCylO6QkqsK\/\/\/F3Xm7P\/PlPf6GG0kgqYJp8\/e+\/uL9s3F9+x0OTS5yLJBDO4ytXd572nRKKhXLLikXlFjv3mOwxaDmwHNjbFSSKR3CtwjHh4fCYyeUBElQZfPzwI8+1onNhRbEltJq0WPzhFpx2kAmWv5VBGGnILoRWLl9sbmRUtijcA14iubtTcyE5QAb2fjpIEKl0Fy5XugeXB+dckEoU4a6NTSpcgyJCLY7aIuvgjx+co12851dKBEWEJpVOw9rOZju5BuZwd+NlKc9hPLnQIiEdtEG5sOO8SFESY2YyAsaCuWDOJCMRSQoDI3i+bxScpgOzTqkn7+sLt+1ie4FNkh1jz40HT8yxQb+xtU+8uPAyCzcvbF4oYQAgioiAJfZ4\/IxoBa0sKj0ryyu+KrEKvgylcB1fWAqf9SPglDLZ60VtD749foL94vNLZROlacW4oXnn62z0x8baG4fAO7AlKIGLs2NUE6QKVMXOxz9RrUhpuDYmlZkN90a44ctYaRQmRSr9+oILUAKtkywnH8yRfVJXp5igaqRcLAZHaeTzK+\/2K4c7\/9HFq04+xsanrHxI474ME4VM7HH+QrOGlIqXjUGjZ6PnRo8Nj0bGxk0qIsrwpA9lmuK1sG0799sLuiVBp+cE6YQupizWpzuHV9x\/RTLIdIY6D3VyNa4w9ijUS0kHe\/TJ9ERLkAWmJp2kJ\/QQVgrTlcdxsOxGu79w08LTFG6jEhd8XQ9sFj5aQy2QskAXKc7brxc+D54+O+BUnJs6e3F222lRaWGYKzkTe5fFjlASImBlMDKYJCthRCIprNUpGLcxMYQqRi2C1cIqO6KDcjlWhKKdohNw\/nd1HsfJ6w+FkIkx2WVy88kWT7TYqVmprkRJ7HiG0KAKJMkiWASeAR6oJg7QhMHkzTvSEzJIKYx0tq1QyhPnl8FzFjY3yq0z4uDHrXDfnf72C+0+UBtULpqcbPFMixs1d4oaKmDX74OUJEQQSQIFCpaN4hMbi+gLtp3SFV\/JkQ2ZG5NKT+UH29CsMDvrfdDcqKvyaTee2smbdR7FmXF9P39xLBeVjvGEcENohCpmnxZoEJKYBE1BU7BolLUhc6BjoddCL6dcG2UkxRMIjlX5dipPm7LvRvUkhmAqNBEUpVBoDDrJKkmWjqpSFmgk4o5nJdT4P47hZMPWlragAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/mulmi1_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E\u003C\/a\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi2_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/mulmi2_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022488.5\u0022\u003E\u003C\/a\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi2_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAz0lEQVRIie2UTQ+DIBBE3xJi0P7\/P6peTIHpoak11mq19uPgO03CAhN2WJMkBkjCzB70Kzzbu0a78aFDA2vMbKmf4sHQr7Gcs5bLvoff45n3xI8y\/XP+LkN+brHrOtq2xXuPJFJKlGVJVVVP97z77U1XZotubZ3SkqibBmdGCIGiKN4y1GdomKU1OqVEPJ+RIISw+Zze1HhS70HT1MSYwcCAGCOYYUB1OlGGcDcw1bK9DQHknHHO9ZfBvc2zGToG4wLHYFzi71rmYPsM+oS+ACUN5dX33rIsAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/mulmi2_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022488.5\u0022\u003E\u003C\/a\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi3_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/mulmi3_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022689.5\u0022\u003E\u003C\/a\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi3_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAZCAYAAABZ5IzrAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAD2UlEQVRIicWWX3IbNwzGfwDJ3ZUix7GddNpT9wA9Ra\/QC\/StF+hLX9JYsnYlLUmgD\/oT2ZFXSSfTYoazJMjF9xEAQcqvv\/zsjlJd2NXAkCPrHOnHxLa0IC2NNsxCwyJG3jRC1ylxBjI3alfYtpl1M7IOhSetrIAnlOqJzhpuLXFrDXc18d4afqqRB1PemTOvRrCCSAbZEdebAqIYylhhZ8pYjF01tjnjLrhCVMeiQYUAJM3EmCHuaNKWxrYkySSMJEJHy9ZbhBnRZ2gxugq3NXJThIUFuhoI5iAVlwhJicOmBwIukUJkZ06uRilOKZVxO5BdKQibskVv5si2oLnAuCHmDU3ZYGnDTDPSKVYE1xnuc4q9weqCcdNQ6g3tmx+JVZEquCugIIIkIBmxX\/+FaEK1oUhi9ES2BqsRKwHxSEAJCItWSP7EAuPGC\/O4I6UeTUvqfGDXFvogLDSxlMwjlcEUtxZZzBhG5c+xZ6ByL4W3JOZE2hDQ6HgQ5I\/ff3NQRBQ\/hK76vpkLboIcCCWEVpU2OClCjIamgqYMsWDBqAoZYRRlJJI9YZ7AG7CE1kC0QPJA60qLEEURFRBHzMz5jiIiALj7v+rHo+KSuH8913EcqdVo2xZ3px8GUow0TUMISt\/3NE1DjHHSjro7r7VvkVIKf3\/6BDjVjGEYWK5WVDMAHpdL7NCfEvEJ5Jwzy+UKUcHMCCHAgayIIKLUWnl4uAfAzFBVxlxO4KpKk+JpDqbDGqc84e48Pj6iQQ9E4P7+jhACOWdC0D3J4+4OxvdkAY7fo05O3n+N1GRAQwi8f\/9AKQURYbG4oWnS5AY+gwI47p\/Bzjf\/Wv9qUjt7tyPCMPQMw5lxEQR4d3fHJSv+wtZRpjCvhqzkTNfNmM9npxx4ba28mNcz4PN\/pzD1GNtLTUVwh812w9PT+lUjR5Cn1eo0rrUyjuN+Duj7\/pTok5iTKMfkdOdiTM53pkrXdc\/GIcQjW1JKX3jmUh5Nhux4VM0Md2e9Xp+Idm37RZF7eeLOT1hMiXAI21RyTya1iOAHYiVn2qYhxAjuF\/Np0taFdd9ch46GQohUq8xms8m1XytTHtLnxex5gz3r29u3\/PDhwyRI3w+s1\/0J4OPHj9Ragf09t1qtvkjqi\/3vcdubQymV7Vjp2oSZMWy2qAbaJqEqbHeZedcQgqATB0R8L1efB9cImXEqlm6GHTylIvu3ju89oOqn+nQJa\/Jy\/T\/kalL\/1zJZGHMe6fv+ua4+XzOWfXup25Xnd1m1vb5eeRJdzSE\/1Jyj3twRPteS81x5eduLcBrDnuD5v5dw\/wF\/IK1NNUdZEgAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/mulmi3_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022689.5\u0022\u003E\u003C\/a\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EImagine, if such a service existed... No more separate subscriptions to Netflix, Spotify, cable, each of your favourite digital newspapers and magazines, etc... Just one monthly fee could give you access to most of humanity\u2019s culture and news!\u003C\/p\u003E\n\u003Cp\u003EWhy isn\u2019t it a thing yet?\u003C\/p\u003E\n\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi4_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/mulmi4_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E\u003C\/a\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi4_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEiElEQVRIib2VTWgdVRiGnzPnzMydm\/uT24S0SVraQtraH0IblSqUVm0VcSNIF1ZFRKG0Km4EN7pwpdKNrtwEQUVRhGJBxI22ClallvgTK4n2x7Zpkubem9\/JzJ25c+a4uO0U0SCt1HczLw\/nmzPf+82ZEfWf6mayETEezuOt6WUxZxCOoT9tIrRGSgVCkPdyGAPKVthKcTOUJAlqtBYyqSNmTJN08hKyqOjqKFCqVHCVQghxUzZfSmpiwWdWN9CFHI2mIPUbuMIgOzu5\/PU31L4\/iXQcNj57EIBmHFOv17Adh46OTgB+\/uELZmamqHSton\/LDgAGBwcJ\/Vm2Dmxj5649GGN459CrKAS37t7Nptu3E0ch7709yPTMAgcP7MctVFDVxRhfwCKa+SYkrmFWp+gUqidOMv3LMM3pWW555gBCCKqnz3BxdJS50Oe+Rx4D4OLQMc7\/cYq+gbvp37IDYwyHP\/0EowM2b+wGQGvNZx9\/iOM6tPV0tR4ojjjy0ftUp6Z54vGHcQsVLCkSmvhEXpO5XEJVJoyLJimGVCfUqjXm6\/Us0kJvDxfP\/Y7XsyJjk3MJl6sRQ79OZqyRhNTjAOLo2jgWp0mTGlprjDEIYRElKUHcxA\/C1ppC2gSVUFQhjq2ZJWJeKlJhQEpk2rpmsiz679lDZWVvhqoTM4yMTrGu1MhYOjlOx+IUl+tBxtxE4AQWFSERQiAti3JbHlNpR2IBIA4PHjWiFJG2x8zmQ2qqSVUIXh7YSxw0mBn3kZZg9fpW9AvzPs0kwRKC9koZgDAM0VqjlCKXywEw+tsl4jihs7NM94p2AIIgwBiD67rYtk2apoRhiDEmq1P2whhGT1N2A0quT0Fq2kQOiebE8VOcPHQYt9Tk+SNvIITg3OkxKsvKXLowwR07BwA4szBO13dDjG\/fwNZcP8YYHt3\/Jr7XxkM71vPKi3sByOfzWVqtkYm\/MK01lvAnKSXzlKLLLEvG6BEX6JbnESLFGzlHKoaYaB\/JikaGh3lq3z6+\/fJYxqZ1F741m8UO0Lumm1SkWI7XGoUQ2SdkKQ+gmmmOjt4+CuUGsjhPaI2CGcPCIJb1UCJiKnKzAm\/kR6Ynx2kbPpGxdYvnOTtTY8NCAstbbFE7lPJlHM\/jeqTGZkKcH8+yoium2FnHrizQWbKxgOV39tHnvk5ffiIr2H7\/XTy3qoddK5dnzC520P\/g0yjbybp+8oEtLAYRmzetzEZ0VUt5APHC\/pdMt+eydplkVVdMud3HLoX03vsa0i5cV3f\/VUmSoDrzPjo1VH2HQl6Sy3koaSHM9f8yrr6oN+qVUqg1CvxYkMY2c3M2npQIbTDm73H+H1Irt2wj0DkSqw2lJJbTxOQaaGNh0vSGbioAc4NeHZ+a4Kujn\/PWux+QJBrbVqSpYdYPKBdVa\/W\/yBhDHMcEQUCxWARASsXV02wMS3qtNY04ZT6y6W43qNVr1rJ14DYcx8HzJLbtIIQBRKuYaz6KGsxFOeLknzJxARd\/7hoteYZC7krvBnSSIKVESnklE4FSkoKyaPNap\/NPJSccpgAwFg4AAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/mulmi4_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E\u003C\/a\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi5_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/mulmi5_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022473\u0022\u003E\u003C\/a\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi5_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACmklEQVRIibWVTW4jRwyFP5LVf7JlZBkkmAMMgtw3QJAEyEGCAHMabwzMGLLVP0VmUd0tybJkLSZclapLfI98j1Xy+PgYVVUBkHNG1VAV2rbFI3AP7jYd\/2dM08Q4jrRti+x2u0gpXTxsZkzTRES8+SJAUNc1InITcM4Zdz\/bf\/wK2zaodEKenp7eIq0REXRdR86ZiDghZaZMUyalhKri7ogI2R0VQUTW8yJC0zTsdjtyzldJp\/PKz0mN43hIJIIAfe+YGcPQQ0hp2FEshJb8KVVrvkshIlzW6ihU9QREVYkI3J1U1RDBIqGIUNc1KSXcfe1eVSX2+4+x0jX91+rMcDUgViIissrVdd1Z5SKykjn26Ed++1AyAJ9bf3pWcHdyzpgZKaXSKN7PtxD5LpL1fT8TckQNokizTMw4jgUwApm7EuEgiqnSNA1dd9vVcZNkqsI45gPoTGaRRFVLp+bfpVpd\/\/\/6+rqa+kPJbmFd1w1VVR9NDogWcu7OZnOH6kESmcd+8VpEYGaM4\/Ah1k0eGoYBd8fdMUtFOhHcy83+\/PwNzxnklBSwEru\/367fLoWI3CaZmRERs3FLtQA6T56702026\/4xABSbt03DOA7fR7LlUqyqavWMiM4dWkwc9H2\/jvsylQVfqa48TyeEbpFss9msAG3bcu3tk3dke7u+9t9kNid\/r5NRDuWcydkRFRo13K8VERfXoopdKwYh\/fXn73z59x9+++NvpmkqV34EKsLD9gEE1GCeWqZ3HseIYBgGXl5e2G6Lec3S4vEylVKmdVkv+9kz+8F53lf8+EOQfvr5E59\/+ZWUEm3bzuNd3qYIEA7rvt\/zrW8ZpvPaoAEadl8Puw9dcNfG2qw8TZjZbP6SN5lx3yl3bVHjPzUBlCQLWi68AAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/mulmi5_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022473\u0022\u003E\u003C\/a\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi6_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/mulmi6_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E\u003C\/a\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi6_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF6UlEQVRIibWWS4xcRxWGv6p7b913P2banrFnPJk4A7ZQGDlooixtssgKIfEQSEgoSiQjZ8GSiCgSyiIIIQErFHlDCKAs2SCBIqSERSweQQQn4BjD2BnPs8fu6Zl+3O77rGLRjR8S25xVqero1Ffn\/FV1xMEHB6adZuyO+\/jLCySeQSjDqi5QUuL5PgDGGKSUuErxSZp9ozOmXWUcmgLd3sGKbY7PRtSaTVzbBgRCfKIMDwPtDYYcVSlV5JEWgrTTQ6GRsy1+fvl1Opv7hCKiITyWbIkrE3bLEd0q5ZuvvIyjFD\/5\/o\/Qw5JQRDSFy7IDRgzZKcbkoc03XnqRPMv54Ss\/IMAnFCGzQrGsDLkZsl2O8ReP88VLFxGX3\/zQDIUmcR36LpSuphkqXlw7zZfPf5X\/\/PkGDWrMyZgzTsCyKtjI26yXO7zZWSeMI1YXniTfT2kSMy9rfMb1mbfH3Mj26M2W\/GrrGsPBkDPNVerENEXESVnjcdenIQdcy3apPbnEj999C9sSJcYuyHzoKcFIasZCoAFYwpAxMGPmFweM5jyu3LSoZS1CCu5XcgVt+vRlwuJjKd1QsP6xS8McIyCf+ggQZ6k0jJwB\/hnN7WrI9a2QmjmOR2NSskgXOFaJb2uUU3FERt+y0WikOYsbrlBlm9zc67J55w6RVpyoakijMVMkac7hRj5ldpuPNroo2aFuPKhCYpNOgSykeQoV1UmzDf727y4uXWbwEdpj1kyB3DTBczKCKsOTKZ5dYGmB4ClyxhwmQwK5DKJFmkdYpAzIKb37ty01CUlS4lsrFLpLlsc45PTFmMKppl6GkekjEg\/fOUtetMl1DY+SI5nQs+0JkNPfAX1IaPdp+CMiqyIUHpKKn77+dUZJwbA\/otIlyrEo8pR67CNtjR\/6CCH49e8vUuQVvaMhQmiUsimzlHotwPEEQgiC0OPtv34bU2kGgzHGTOKZqqBRD3BDZwLEcI\/YTQmrLqLs4rkFtuUihWam5VJvOjhOHcu2SJIBd\/Y7ZMUYU2nE9D0YpfuUODhehesK0ixBeJp+PkYxyaQQYKsRlm0TNXxC1yKvIAgClCUYlWYCVGiPmZMrxI0Mpz5kaD4Cs41E8847bzMYJPhBTDrucev2Ot39Q\/ygRufuFq9d\/hlBEPD886+xf1RidUtK9T790T7ajJg\/cZLVU4v89sq7jMZjvvvS9yjHAyJf8aVnnubj9XXOr36WUf+ADX+BSy88h719OEZdvcX88Zy4dYDTHNCqOUgDUlp0uvssuIpZOWY32ePY3BLnnjiH713AntZ9bv48BwdXcGVAN\/UIowW8IOU7X\/sK7135x1RChqVTJyCvsXnrJvXkLi3P4uoH15jVPaxPz04ytD0eUOFSSotTMqauBWHhIowEBFlRgrAQ9XlOn\/s8rh\/R3t1mc3OTCxeeBqC7+UuqYps72SFGKhyrQRQf443fvE99+tUYY7AtAbZNVin+fn2L97aaPHbSsLj2OG\/95U9c5AXsVjCk0oa7Q0UUWHiej21JMIJ2e48yK9lv7zOKI5aWHqGsShYXHkWpEGOmh7d28EWH1kKDw0Gf2ozDqeVFLBkRxbP3MtTrtFHeHO3xBX73zw02DxX\/ujvPorzB4eHBJEPLNgxzgc4dej0H37IQlQEDa2tr9Pt9hJBIaVGv10iSBNdVzM3P4TiTm\/Hsty6RJCOqIicvK2wpsByFlIIgCABQrsvqE59DqjkeOTOD0SsIqWjZFY8em+OEJSfi\/+MbvzCjyqOUAbZtE6qCmpey8swXkI7CaE1ZVRhjsKSF1hVCynv6edCKosBogxACIcX\/9THGUBQFGBBCYDCoBzoI+w+bt7l+9UOEFLz86qs0mk2MMXR7Q8AQx\/FDgaU1GVeVfmijsiwBGAwGxHEMlUEI\/b9q3esYjAFrGsMYKIucTq9AI6m5JfbplU+hy4LZeo0oiib9z1QcrushhHkoaJqmdEbePf3ct8kmkddAyMlipR+AnvoXeYHnudMJgVIKpQzGCIRw+C9Y06Ovi0Gq4wAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/mulmi6_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E\u003C\/a\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["books","concept","magazines","movies","multimedia","music","netflix","newspapers","podcasts","series","spotify","streaming","tv","video"],"hasMore":true,"image":null,"introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi1_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/mulmi1_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022116.125\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi1_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/mulmi1_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022116.125\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi2_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/mulmi2_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022122.125\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi3_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/mulmi3_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022172.375\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EImagine, if such a service existed... No more separate subscriptions to Netflix, Spotify, cable, each of your favourite digital newspapers and magazines, etc... Just one monthly fee could give you access to most of humanity\u2019s culture and news!\u003C\/p\u003E\n\u003Cp\u003EWhy isn\u2019t it a thing yet?\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi4_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/mulmi4_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022116.125\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi5_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/mulmi5_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022118.25\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/mulmi6_full.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/mulmi6_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022116.125\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E","words":46,"readTime":null,"lang":"en"}}},"projects\/showr":{"key":"projects\/showr","type":"article","published":true,"meta":{"createdAt":"2019-04-30T19:58:22+02:00","publishedAt":"2019-04-30T19:56:00+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/showr.link","displayUrl":null}],"category":"projects","subcategory":null,"slug":"showr"},"content":{"en":{"slug":"showr","title":"showr","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/showr_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022474\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAjCAYAAAD8BaggAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADqElEQVRYhdWYzW7jNhDHf0NSlu04yXqB7qEP0D5Ae+leupee9r37Du0DFEgLpHb8JVEkpwfZihJLsrMrFO0fEDASRzNDcjgflB8\/flIUEM7Q\/qwKIsP0GHDQbQzANM+ZzWbc3t7ivefh4aFmb\/GPaQyA04HBoiwpypK\/V6txtQ4ZNDQ4n8+ZTaeklHDWUnrPZJKx3x+w1jKdTlFNqIKqslqtUAXrLO\/u70kp1u\/WoqqURcF2vx80yKDQ\/ygiBuscYgx5nhNjqoWX\/rhfgio451i+f89icYOq4pzDGIexFjnu6+zmBiMyoO\/CCqWUSCmSjgpSjIjUhu33ezQpKSUQIcQIqmy3W6y1hBCIMVKWJQAigqpijCGl2KtTfvjp05AbPTNKfaK+dPxaOOHV8W7R+WxK5lyj0BhDqALb3f6c\/5Ux0vr0FtqdJHdOThVnDYigSVmvn57\/vgD9QrrxIelgKsqy8YGe2PkCY4Qk8d737nyMEWvtCGquh8uyDFVtjmab3mw2rJ825JOM2WwGwHK57BXWJ+cttGiNTqYYIzGlxrHHwpBBrs3wmg4hIMY0sWbIR3a7HcaYZiW70KzCQAIcnHqIiT8f\/kIQFos5RoT5bIZzDmtNSxGIGHwVMNYjCIoiCAhkWYY5Bk9BMMb06hTV\/nAWQmC73XJ3dzc4qxcCjxG5i66Nv8KH+oQfysi2iEydMmkFCEVBT0pOAUHJJpM6V30F3IA9WGvIMoMKJIFpdlngkLxrICmlETLQeOj3rg6s10\/dKWZE\/L9X6GvQjj9DtDsdza6j+Nsfyq+\/t4uEc2QWJhnEBDFCFbsKmef\/P34H33\/bb\/hZpG5j4uB+DkN53BjFmpojpvoZwuRCFhqMQ2\/FGMl1VB+6NpoP4V9z6msx6paNAfn5l8\/\/KYPcbrfrH3SOxWKBL0uMNWTOEWKkLH1ditzMOewPdQOZEpoSVQh1QScQQmSSZSh1v3bNXrhLuaDa7UnWQFJKX9c61hpUoSgKkLoZsMbU9Y4IVagoCw9AcSjeskDDlw0pJQ4kNNRcqtrMsjZKm+zenr1I3d+nlM7+u2jQ0GCe5yyX71AFY4TD4QAIm80G5xz393cYY\/De432FMYaqqvDe8+HDN1RVwDnXfBMR1qsVQ9nzYvVelr5ph06lZ57nRyP88WYDMucoygLVujk4HApEhBgjIQRCqAghvvSQjtbVnXryrhux\/f5wXJVunsdHf\/b9hMfHx+a93fe\/uOw6t4d\/AEsqQIGxhlTjAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/showr_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022474\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Ch3\u003EEasily share content...\u003C\/h3\u003E\n\u003Cp\u003ENeed to send someone a nicely formatted text accessible via a simple link? Look no further. Simply add text, headers, images, tables, videos, quotes, code, etc. \u2013 and publish it with one click.\u003C\/p\u003E\n\u003Ch3\u003EAnonymously...\u003C\/h3\u003E\n\u003Cp\u003ENo need to run a blog or have a social media account \u2013 using showr you can put content on the Internet without registering, and just post the link wherever and however you want.\u003C\/p\u003E\n\u003Ch3\u003EWith a self-destruct...\u003C\/h3\u003E\n\u003Cp\u003ESometimes you want things to be more volatile. Showr lets you set a time limit and limit of unique visitors \u2013 after either of them is reached, your content will just self-destruct.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/showr_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022948\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAjCAYAAAD8BaggAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADqElEQVRYhdWYzW7jNhDHf0NSlu04yXqB7qEP0D5Ae+leupee9r37Du0DFEgLpHb8JVEkpwfZihJLsrMrFO0fEDASRzNDcjgflB8\/flIUEM7Q\/qwKIsP0GHDQbQzANM+ZzWbc3t7ivefh4aFmb\/GPaQyA04HBoiwpypK\/V6txtQ4ZNDQ4n8+ZTaeklHDWUnrPZJKx3x+w1jKdTlFNqIKqslqtUAXrLO\/u70kp1u\/WoqqURcF2vx80yKDQ\/ygiBuscYgx5nhNjqoWX\/rhfgio451i+f89icYOq4pzDGIexFjnu6+zmBiMyoO\/CCqWUSCmSjgpSjIjUhu33ezQpKSUQIcQIqmy3W6y1hBCIMVKWJQAigqpijCGl2KtTfvjp05AbPTNKfaK+dPxaOOHV8W7R+WxK5lyj0BhDqALb3f6c\/5Ux0vr0FtqdJHdOThVnDYigSVmvn57\/vgD9QrrxIelgKsqy8YGe2PkCY4Qk8d737nyMEWvtCGquh8uyDFVtjmab3mw2rJ825JOM2WwGwHK57BXWJ+cttGiNTqYYIzGlxrHHwpBBrs3wmg4hIMY0sWbIR3a7HcaYZiW70KzCQAIcnHqIiT8f\/kIQFos5RoT5bIZzDmtNSxGIGHwVMNYjCIoiCAhkWYY5Bk9BMMb06hTV\/nAWQmC73XJ3dzc4qxcCjxG5i66Nv8KH+oQfysi2iEydMmkFCEVBT0pOAUHJJpM6V30F3IA9WGvIMoMKJIFpdlngkLxrICmlETLQeOj3rg6s10\/dKWZE\/L9X6GvQjj9DtDsdza6j+Nsfyq+\/t4uEc2QWJhnEBDFCFbsKmef\/P34H33\/bb\/hZpG5j4uB+DkN53BjFmpojpvoZwuRCFhqMQ2\/FGMl1VB+6NpoP4V9z6msx6paNAfn5l8\/\/KYPcbrfrH3SOxWKBL0uMNWTOEWKkLH1ditzMOewPdQOZEpoSVQh1QScQQmSSZSh1v3bNXrhLuaDa7UnWQFJKX9c61hpUoSgKkLoZsMbU9Y4IVagoCw9AcSjeskDDlw0pJQ4kNNRcqtrMsjZKm+zenr1I3d+nlM7+u2jQ0GCe5yyX71AFY4TD4QAIm80G5xz393cYY\/De432FMYaqqvDe8+HDN1RVwDnXfBMR1qsVQ9nzYvVelr5ph06lZ57nRyP88WYDMucoygLVujk4HApEhBgjIQRCqAghvvSQjtbVnXryrhux\/f5wXJVunsdHf\/b9hMfHx+a93fe\/uOw6t4d\/AEsqQIGxhlTjAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/showr_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022948\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Ch3\u003EEasily share content...\u003C\/h3\u003E\n\u003Cp\u003ENeed to send someone a nicely formatted text accessible via a simple link? Look no further. Simply add text, headers, images, tables, videos, quotes, code, etc. \u2013 and publish it with one click.\u003C\/p\u003E\n\u003Ch3\u003EAnonymously...\u003C\/h3\u003E\n\u003Cp\u003ENo need to run a blog or have a social media account \u2013 using showr you can put content on the Internet without registering, and just post the link wherever and however you want.\u003C\/p\u003E\n\u003Ch3\u003EWith a self-destruct...\u003C\/h3\u003E\n\u003Cp\u003ESometimes you want things to be more volatile. Showr lets you set a time limit and limit of unique visitors \u2013 after either of them is reached, your content will just self-destruct.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["clean code","content","formatted","images","link","php","self-destruct","share","symfony","text","volatile"],"hasMore":false,"image":"https:\/\/avris.it\/image\/showr_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/showr_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/showr_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022237\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Ch3\u003EEasily share content...\u003C\/h3\u003E\n\u003Cp\u003ENeed to send someone a nicely formatted text accessible via a simple link? Look no further. Simply add text, headers, images, tables, videos, quotes, code, etc. \u2013 and publish it with one click.\u003C\/p\u003E\n\u003Ch3\u003EAnonymously...\u003C\/h3\u003E\n\u003Cp\u003ENo need to run a blog or have a social media account \u2013 using showr you can put content on the Internet without registering, and just post the link wherever and however you want.\u003C\/p\u003E\n\u003Ch3\u003EWith a self-destruct...\u003C\/h3\u003E\n\u003Cp\u003ESometimes you want things to be more volatile. Showr lets you set a time limit and limit of unique visitors \u2013 after either of them is reached, your content will just self-destruct.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/showr_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/showr_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022237\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Ch3\u003EEasily share content...\u003C\/h3\u003E\n\u003Cp\u003ENeed to send someone a nicely formatted text accessible via a simple link? Look no further. Simply add text, headers, images, tables, videos, quotes, code, etc. \u2013 and publish it with one click.\u003C\/p\u003E\n\u003Ch3\u003EAnonymously...\u003C\/h3\u003E\n\u003Cp\u003ENo need to run a blog or have a social media account \u2013 using showr you can put content on the Internet without registering, and just post the link wherever and however you want.\u003C\/p\u003E\n\u003Ch3\u003EWith a self-destruct...\u003C\/h3\u003E\n\u003Cp\u003ESometimes you want things to be more volatile. Showr lets you set a time limit and limit of unique visitors \u2013 after either of them is reached, your content will just self-destruct.\u003C\/p\u003E","words":103,"readTime":null,"lang":"en"}}},"projects\/suml-simple-unambiguous-markup-language":{"key":"projects\/suml-simple-unambiguous-markup-language","type":"article","published":true,"meta":{"createdAt":"2019-03-20T18:30:00+01:00","publishedAt":"2019-03-22T21:11:00+01:00","group":null,"links":[{"icon":"brands gitlab","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/SUML","displayUrl":"SUML documentation"},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/SUML-PHP","displayUrl":"SUML implementation in PHP"},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/SUML-Symfony","displayUrl":"SUML support for Symfony"},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/SUML-JS","displayUrl":"SUML implementation in JavaScript"},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/SUML-Loader","displayUrl":"SUML Webpack Loader"}],"category":"projects","subcategory":null,"slug":"suml-simple-unambiguous-markup-language"},"content":{"en":{"slug":"suml-simple-unambiguous-markup-language","title":"SUML: Simple \u0026 Unambiguous Markup Language","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/suml_small.png\u0022 alt=\u0022SUML logo\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022270\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABjUlEQVRIie2Vsa4pURSGv21jNBIKGckkWlGZQqLVeQAUWg8i8QieQisqmYpIlAozCDGJAg1GoRiJjDnVlXOS63By4+bmxt+stfKv7HxZxf7F9Xr1hRD4vg\/Ar\/5zBb70n+ff7dyrz+wE+Mf0BnqkN9Aj\/RhosVi8guOmp4FOpxOGYdBoNF7JQ\/A703Vdms0mpmkipaRSqXA+n2\/+4XBgu92iaRrRaBTHcQgEAsTjcQB2ux1SShKJxNNA317IcRza7Tb5fJ56vU6xWCQUCt38fr9PJpNhOp3ieR6TyYTxeMxsNsMwDGzbxrKsp2EeAmmaxnA4JJVKUS6XsSwLXddvvq7rmKbJ5XLB8zwURUEIwXw+R0pJOp3+8rv\/MVCr1aJarTIajeh2uwwGAwqFAgDL5ZLNZoMQAkVR6PV65HI5YrEYpVKJZDJJOBzmeDz+6EriXpb5vk82m6VWq+G6LqvVivV6TafTIRgMvizL7gIJIdjv99i2TSQSQVVVVFW9+\/BfAXqnPf9DdLxab6BH+gB93CzD0rwhugAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/suml_small.png\u0022 alt=\u0022SUML logo\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022270\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EYAML gets praised for being clear and human readable, but it\u2019s also criticised for being ambiguous.\u003C\/p\u003E\n\u003Cp\u003ESUML is an attempt to keep the good things about YAML but remove its ambiguity and needless complexity.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/suml_big.png\u0022 alt=\u0022SUML logo\u0022 class=\u0022border\u0022 width=\u0022640\u0022 height=\u0022360\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABjUlEQVRIie2Vsa4pURSGv21jNBIKGckkWlGZQqLVeQAUWg8i8QieQisqmYpIlAozCDGJAg1GoRiJjDnVlXOS63By4+bmxt+stfKv7HxZxf7F9Xr1hRD4vg\/Ar\/5zBb70n+ff7dyrz+wE+Mf0BnqkN9Aj\/RhosVi8guOmp4FOpxOGYdBoNF7JQ\/A703Vdms0mpmkipaRSqXA+n2\/+4XBgu92iaRrRaBTHcQgEAsTjcQB2ux1SShKJxNNA317IcRza7Tb5fJ56vU6xWCQUCt38fr9PJpNhOp3ieR6TyYTxeMxsNsMwDGzbxrKsp2EeAmmaxnA4JJVKUS6XsSwLXddvvq7rmKbJ5XLB8zwURUEIwXw+R0pJOp3+8rv\/MVCr1aJarTIajeh2uwwGAwqFAgDL5ZLNZoMQAkVR6PV65HI5YrEYpVKJZDJJOBzmeDz+6EriXpb5vk82m6VWq+G6LqvVivV6TafTIRgMvizL7gIJIdjv99i2TSQSQVVVVFW9+\/BfAXqnPf9DdLxab6BH+gB93CzD0rwhugAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/suml_big.png\u0022 alt=\u0022SUML logo\u0022 class=\u0022border\u0022 width=\u0022640\u0022 height=\u0022360\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EYAML gets praised for being clear and human readable, but it\u2019s also criticised for being ambiguous.\u003C\/p\u003E\n\u003Cp\u003ESUML is an attempt to keep the good things about YAML but remove its ambiguity and needless complexity.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["dumper","indentatio","language","markup","parser","programming","suml","yaml"],"hasMore":false,"image":"https:\/\/avris.it\/image\/suml_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/suml_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/suml_mini.png\u0022 alt=\u0022SUML logo\u0022 width=\u0022240\u0022 height=\u0022135\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EYAML gets praised for being clear and human readable, but it\u2019s also criticised for being ambiguous.\u003C\/p\u003E\n\u003Cp\u003ESUML is an attempt to keep the good things about YAML but remove its ambiguity and needless complexity.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/suml_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/suml_mini.png\u0022 alt=\u0022SUML logo\u0022 width=\u0022240\u0022 height=\u0022135\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EYAML gets praised for being clear and human readable, but it\u2019s also criticised for being ambiguous.\u003C\/p\u003E\n\u003Cp\u003ESUML is an attempt to keep the good things about YAML but remove its ambiguity and needless complexity.\u003C\/p\u003E","words":35,"readTime":null,"lang":"en"}}},"projects\/block-checker":{"key":"projects\/block-checker","type":"article","published":true,"meta":{"createdAt":"2019-03-12T10:39:28+01:00","publishedAt":"2019-03-12T10:38:00+01:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/blockchecker.avris.it\/","displayUrl":null}],"category":"projects","subcategory":null,"slug":"block-checker"},"content":{"en":{"slug":"block-checker","title":"Block Checker","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/block-checker_small.png\u0022 alt=\u0022Block Checker screenshot\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022287.69716088328\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAVCAYAAAAuJkyQAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB2klEQVRIic2WX2\/TMBTFf9dO0n9Ou7KBKBLw0i\/JR+QbbLCJJyQoINFlWZOmiXnY0oU0SZMAFefFke+5zrF9fG2x1loeYa1FRCgiD4vIPl7mFTl1Y7XlOHXkHMW+qvjfhmRZZo\/TTgenz6yrtrYNp2qLyhzVVUifWBd0EnQKDzn5x6frK24+f2fkCq8WC5TWfPn6jYtnZ4zGEz5cXfL6zVvieEsQrDk\/vyAIApbLJb6ZHIhtI76KsxfkT2csUsV2ExLHEf5sDlh834BoXr54ThDeMxkNOZtOWa\/XjMdjjJm0nn0rkfkpK3ugKvnJhJYiXURI0xStFDzmNRk\/yzKUUpWc\/SkLw5DVaoUojaMViGKXbNntUoajAWEYoR2NGQ\/ZxgnRNsHVgvYGpEmC7xtub9dY5TLyHJIkwYoijiJcR2OMIQgCtOMhZDjegE14h+sNmM\/nzKb+7yv0v6BXHfqXcLrWj\/wuu08gtVBOFx5sZLx+gjrVoSJ2Gfh6g7x\/x8\/IcrnK+PjDohT8iQk6e+hgheI78MxTHFAKJu6JBZXbtpymPABVZ+o2l+exnCpOXb3LW9Vk6iZRfa8GKRTOKtSuUFNSFxzbgfI\/Dk7ZSV6FDa9QVUfs299nQsWcX0hG\/OBSpUM6AAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/block-checker_small.png\u0022 alt=\u0022Block Checker screenshot\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022287.69716088328\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ECheck how many people you blocked on Twitter and compare yourself to others.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/block-checker_big.png\u0022 alt=\u0022Block Checker screenshot\u0022 class=\u0022border\u0022 width=\u0022634\u0022 height=\u0022380\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAVCAYAAAAuJkyQAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB2klEQVRIic2WX2\/TMBTFf9dO0n9Ou7KBKBLw0i\/JR+QbbLCJJyQoINFlWZOmiXnY0oU0SZMAFefFke+5zrF9fG2x1loeYa1FRCgiD4vIPl7mFTl1Y7XlOHXkHMW+qvjfhmRZZo\/TTgenz6yrtrYNp2qLyhzVVUifWBd0EnQKDzn5x6frK24+f2fkCq8WC5TWfPn6jYtnZ4zGEz5cXfL6zVvieEsQrDk\/vyAIApbLJb6ZHIhtI76KsxfkT2csUsV2ExLHEf5sDlh834BoXr54ThDeMxkNOZtOWa\/XjMdjjJm0nn0rkfkpK3ugKvnJhJYiXURI0xStFDzmNRk\/yzKUUpWc\/SkLw5DVaoUojaMViGKXbNntUoajAWEYoR2NGQ\/ZxgnRNsHVgvYGpEmC7xtub9dY5TLyHJIkwYoijiJcR2OMIQgCtOMhZDjegE14h+sNmM\/nzKb+7yv0v6BXHfqXcLrWj\/wuu08gtVBOFx5sZLx+gjrVoSJ2Gfh6g7x\/x8\/IcrnK+PjDohT8iQk6e+hgheI78MxTHFAKJu6JBZXbtpymPABVZ+o2l+exnCpOXb3LW9Vk6iZRfa8GKRTOKtSuUFNSFxzbgfI\/Dk7ZSV6FDa9QVUfs299nQsWcX0hG\/OBSpUM6AAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/block-checker_big.png\u0022 alt=\u0022Block Checker screenshot\u0022 class=\u0022border\u0022 width=\u0022634\u0022 height=\u0022380\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ECheck how many people you blocked on Twitter and compare yourself to others.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["api","ban","block","javascript","twitter","zeroserver"],"hasMore":false,"image":"https:\/\/avris.it\/image\/block-checker_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/block-checker_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/block-checker_mini.png\u0022 alt=\u0022Block Checker screenshot\u0022 width=\u0022240\u0022 height=\u0022143.84858044164\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ECheck how many people you blocked on Twitter and compare yourself to others.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/block-checker_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/block-checker_mini.png\u0022 alt=\u0022Block Checker screenshot\u0022 width=\u0022240\u0022 height=\u0022143.84858044164\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ECheck how many people you blocked on Twitter and compare yourself to others.\u003C\/p\u003E","words":13,"readTime":null,"lang":"en"}}},"projects\/avris-sync":{"key":"projects\/avris-sync","type":"article","published":true,"meta":{"createdAt":"2019-01-01T18:55:16+01:00","publishedAt":"2019-01-01T18:53:00+01:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/www.npmjs.com\/package\/avris-sync","displayUrl":"npm: avris-sync"},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Sync","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-sync"},"content":{"en":{"slug":"avris-sync","title":"avris-sync","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-sync_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHmklEQVRIiX2X2a9lRRXGf2uo2me459yh+17oZmgmUUDtQDSSEAOSMMWgQeOAJkQf9EHjg3+C7775YDQ+65PxBTHRaAQSSBSNAyB2BGmmhtB9+w7nTmfvquXDPt0YNVb2lOyqXV99X621vi3XXndbRKkIQdQKUTF3aikEgYrgapgqyZ35\/IhaK0RABAKICELfRAQRAYJLLSIWZ718JyoioCKYOyZC0wzxCCEiKLUgAQKUUhD6D6tqD1QUaiWp0i0mQGTRj8v9RQAEVXlvcrn0LEQtiBoR740zhKSG1oJfGiAoQSUCNATRfjJCUHVA6ErFEBQhRDHVBRv9QpD+3eJYXAx3Yz5vEYGIfoEiii7GmipuRlLFQxRqWRDcM0IEEoKq4aaYCCaKmyJRqbVSa+k\/4N6vvlZU7bJUKkLUShAsr6ywtXkRqBCCOEQtqAoEmCnJjOSXAAmgAnXBloCILmQwFMXMyJYYNQ1Ex\/7BAY07TXKyJ2qtlNLRlQJCv19qBeDEFRsc7c6A2pMWgWpegFJMe4mzKS6aiGiRMJCKXt6kgpr11FpCRVExVJxxM2Z1uMzF2TYaSpSg8YR6hiiECF3X9gwJnLr2Wt5+9TVEAgkwFYQAEiKxkExJprimTBcsIsYuxQqo9uyoYWpkd7IlFEMk0eTE9etL7O3POGpbrrhyg\/nBPrOdXUyE7EqNyl33383LL77ENDcE0UcWoNqLogoikEzJbnhoQtJCLoQaYKKoGiqKm+NqZM+4CMmcJImkDWtry3zmK59jbXWF3\/70F7x+9nWsWSJ5H02T5SXuuvduXnjyGVYGQ6AQET0YFVTATDDtWXMXnNwgnVNrLPQFUEQNNUfEcHNUE262OBP3PPRxHv3mFzjz3N94\/Hs\/IVG4+cRJolZ292Z4Nr78nW\/z3M+e4OrplHlpqdERUXrpdBFdqd9DOSmm4DIYU9uC1NrnoQDEEHHUEskcVSOZM0iZkTtf\/cZneeCRe5hd3OWJHzxO1iGrowE33nSSve3zbO8fcu+3vkRSoZ59gw+c2GB2sM9hN6fUjlJb0Epyw0xwV5ILKRkuoyky76BUAvo9giKSUDHEE1mdQUqMUuLRx+7jgUfuAeAvTz9PomGyNGFp1LC7ecCpj3yY+x++Cx80PPvdH7FxfBmNlu2doOsSJXpAIRXVIGXHXUhJ8Sy4DCeQOyggoRCKoCAOmjB1kjk5JU6fvp5Pff4Tl0vCzjszjl2xzlWnNjh12zVcc8cNjI9PiQhe\/+VTjIeZUpcYNB25qSCVGi1dNydqixqoBuZGbhxPgjNZhq4QIT2Y6KPLcFwTiiOLBPjY1x+6nJkBHvzaffxniwjefOoPzN89z\/p1xzjazrR7W0y1RawiFtTaUrsjhA41wVxJOeNNg+tkQir0dQbFQ0kYWZwcRlYjo9xx+lquumrtvwD8e6ul8PKvfs\/umZcZjJXB8oj1W66m2x6zc05QmSO0IJkoCZHaR1hyLGesGeKTlQmlAAuGDMHDGYgxQBlgNFW482M3\/V8ws3e3efHnzzC\/8C7DBlBoD\/bZv9DiMme03FDb0uceA5WELORSdywP0GaIX7k2pOuCWqCGoqEoRgohYQxCaYpw8w3H\/yeQg519\/v7087z5x5fI0jIc1L50VIgW6pFBo+ShEkkxiYVMCTXFUkZzg6QG8hD\/4EbD\/mHL\/Kgw7yqlVEqtSAgSFSuCiXB8dXQZxN7sgLNn3uTVP7\/Cmy\/8kyZaRl6IVHAqWSuhARYw72ulpCB54CaYCZoSkgeQDHKG3IAP8IdX32LvsDKbtezsVWZdsHsE+3M4bGHeCaWDH37\/xxzsHbB1foe9zR1yKSQKicpAK0PrGKdgOqjMRxUmQQphYL3NkNKiHlg2rAZtaxgT2iNDB4ntiyNaBsg9tx2P6SBxeNhbJbdMiFNxQhIFp2qmqxCioI6I4tpn7WOrKxztH5BNaBTGGSYZ1sfBidXCxnFjPBZeO7fF7OCAkltWTl7Fk7\/+Ha+eO2I6qGxsTDhqg2df3EOWVtZCU0bUsJTwZoCo4bnBU8ZSg6qRmwHmiZPr69x+6028fX6X8XDI+soqm5s7HF+eorXS7e1x46mTHG1uErubTFPL6hiSdiTrWBl33Hx6xNa5Ge+e22EyBJeO9TvvY\/+vv8Fv+fQXaZamdBUG4wmeGlQdMSd5QsQQ+rojIVyzNqUTuPqEsb2zx7xJjIdrXNg95LoTa0gpbJWCjtaRMmSPjpyMQapUqxw2ldZWWHs\/bM1eIQ2Fxju6i\/ss3foAXjBm+wdgifnuLiJ7gPZeKHoD3nshkFI5\/9brSK3Uw0OohWyGlEAiOHMm8BC0FkYpM0nOxJ3lJjFKgmthlGF22PLRD01546JSNzumQ5hsvcX7Hrwdv3j2H8zbFvVMLRVvhvDePwQCeEqoKhJB1ECjB6C1Il132eDX9ggXY+ud1xjkAS7C8tKUY9MVPCr7+zusTif86SXn7bND3tk+5NULhwxz0OicT3ZvIMdvvCVqKXTzObU9Io0nSAhlfoimpi8HtcPzAKD33IDWQBEkLnno3otrBELFRHAVXECpZDNUg65rEQobE2d5YGwe9Da3cbjzFPwLLIk8ktJRts4AAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-sync_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA simple file synchronisation tool using \u003Ccode\u003Eavris-fs\u003C\/code\u003E.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EWarning!\u003C\/strong\u003E It\u2019s a \u003Cem\u003Every\u003C\/em\u003E early version! Conflict handling is not implemented,\nso only use it when you can safely assume often synchronisations\/rare conflicts\/versioning on the remote, etc.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-sync_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHmklEQVRIiX2X2a9lRRXGf2uo2me459yh+17oZmgmUUDtQDSSEAOSMMWgQeOAJkQf9EHjg3+C7775YDQ+65PxBTHRaAQSSBSNAyB2BGmmhtB9+w7nTmfvquXDPt0YNVb2lOyqXV99X621vi3XXndbRKkIQdQKUTF3aikEgYrgapgqyZ35\/IhaK0RABAKICELfRAQRAYJLLSIWZ718JyoioCKYOyZC0wzxCCEiKLUgAQKUUhD6D6tqD1QUaiWp0i0mQGTRj8v9RQAEVXlvcrn0LEQtiBoR740zhKSG1oJfGiAoQSUCNATRfjJCUHVA6ErFEBQhRDHVBRv9QpD+3eJYXAx3Yz5vEYGIfoEiii7GmipuRlLFQxRqWRDcM0IEEoKq4aaYCCaKmyJRqbVSa+k\/4N6vvlZU7bJUKkLUShAsr6ywtXkRqBCCOEQtqAoEmCnJjOSXAAmgAnXBloCILmQwFMXMyJYYNQ1Ex\/7BAY07TXKyJ2qtlNLRlQJCv19qBeDEFRsc7c6A2pMWgWpegFJMe4mzKS6aiGiRMJCKXt6kgpr11FpCRVExVJxxM2Z1uMzF2TYaSpSg8YR6hiiECF3X9gwJnLr2Wt5+9TVEAgkwFYQAEiKxkExJprimTBcsIsYuxQqo9uyoYWpkd7IlFEMk0eTE9etL7O3POGpbrrhyg\/nBPrOdXUyE7EqNyl33383LL77ENDcE0UcWoNqLogoikEzJbnhoQtJCLoQaYKKoGiqKm+NqZM+4CMmcJImkDWtry3zmK59jbXWF3\/70F7x+9nWsWSJ5H02T5SXuuvduXnjyGVYGQ6AQET0YFVTATDDtWXMXnNwgnVNrLPQFUEQNNUfEcHNUE262OBP3PPRxHv3mFzjz3N94\/Hs\/IVG4+cRJolZ292Z4Nr78nW\/z3M+e4OrplHlpqdERUXrpdBFdqd9DOSmm4DIYU9uC1NrnoQDEEHHUEskcVSOZM0iZkTtf\/cZneeCRe5hd3OWJHzxO1iGrowE33nSSve3zbO8fcu+3vkRSoZ59gw+c2GB2sM9hN6fUjlJb0Epyw0xwV5ILKRkuoyky76BUAvo9giKSUDHEE1mdQUqMUuLRx+7jgUfuAeAvTz9PomGyNGFp1LC7ecCpj3yY+x++Cx80PPvdH7FxfBmNlu2doOsSJXpAIRXVIGXHXUhJ8Sy4DCeQOyggoRCKoCAOmjB1kjk5JU6fvp5Pff4Tl0vCzjszjl2xzlWnNjh12zVcc8cNjI9PiQhe\/+VTjIeZUpcYNB25qSCVGi1dNydqixqoBuZGbhxPgjNZhq4QIT2Y6KPLcFwTiiOLBPjY1x+6nJkBHvzaffxniwjefOoPzN89z\/p1xzjazrR7W0y1RawiFtTaUrsjhA41wVxJOeNNg+tkQir0dQbFQ0kYWZwcRlYjo9xx+lquumrtvwD8e6ul8PKvfs\/umZcZjJXB8oj1W66m2x6zc05QmSO0IJkoCZHaR1hyLGesGeKTlQmlAAuGDMHDGYgxQBlgNFW482M3\/V8ws3e3efHnzzC\/8C7DBlBoD\/bZv9DiMme03FDb0uceA5WELORSdywP0GaIX7k2pOuCWqCGoqEoRgohYQxCaYpw8w3H\/yeQg519\/v7087z5x5fI0jIc1L50VIgW6pFBo+ShEkkxiYVMCTXFUkZzg6QG8hD\/4EbD\/mHL\/Kgw7yqlVEqtSAgSFSuCiXB8dXQZxN7sgLNn3uTVP7\/Cmy\/8kyZaRl6IVHAqWSuhARYw72ulpCB54CaYCZoSkgeQDHKG3IAP8IdX32LvsDKbtezsVWZdsHsE+3M4bGHeCaWDH37\/xxzsHbB1foe9zR1yKSQKicpAK0PrGKdgOqjMRxUmQQphYL3NkNKiHlg2rAZtaxgT2iNDB4ntiyNaBsg9tx2P6SBxeNhbJbdMiFNxQhIFp2qmqxCioI6I4tpn7WOrKxztH5BNaBTGGSYZ1sfBidXCxnFjPBZeO7fF7OCAkltWTl7Fk7\/+Ha+eO2I6qGxsTDhqg2df3EOWVtZCU0bUsJTwZoCo4bnBU8ZSg6qRmwHmiZPr69x+6028fX6X8XDI+soqm5s7HF+eorXS7e1x46mTHG1uErubTFPL6hiSdiTrWBl33Hx6xNa5Ge+e22EyBJeO9TvvY\/+vv8Fv+fQXaZamdBUG4wmeGlQdMSd5QsQQ+rojIVyzNqUTuPqEsb2zx7xJjIdrXNg95LoTa0gpbJWCjtaRMmSPjpyMQapUqxw2ldZWWHs\/bM1eIQ2Fxju6i\/ss3foAXjBm+wdgifnuLiJ7gPZeKHoD3nshkFI5\/9brSK3Uw0OohWyGlEAiOHMm8BC0FkYpM0nOxJ3lJjFKgmthlGF22PLRD01546JSNzumQ5hsvcX7Hrwdv3j2H8zbFvVMLRVvhvDePwQCeEqoKhJB1ECjB6C1Il132eDX9ggXY+ud1xjkAS7C8tKUY9MVPCr7+zusTif86SXn7bND3tk+5NULhwxz0OicT3ZvIMdvvCVqKXTzObU9Io0nSAhlfoimpi8HtcPzAKD33IDWQBEkLnno3otrBELFRHAVXECpZDNUg65rEQobE2d5YGwe9Da3cbjzFPwLLIk8ktJRts4AAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-sync_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA simple file synchronisation tool using \u003Ccode\u003Eavris-fs\u003C\/code\u003E.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EWarning!\u003C\/strong\u003E It\u2019s a \u003Cem\u003Every\u003C\/em\u003E early version! Conflict handling is not implemented,\nso only use it when you can safely assume often synchronisations\/rare conflicts\/versioning on the remote, etc.\u003C\/p\u003E\n\u003Ch3\u003EExample\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs javascript border\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eimport\u003C\/span\u003E {AvrisSync} \u003Cspan class=\u0022hljs-keyword\u0022\u003Efrom\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0022avris-sync\u0022\u003C\/span\u003E;\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Eimport\u003C\/span\u003E {AvrisFilesystem} \u003Cspan class=\u0022hljs-keyword\u0022\u003Efrom\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0022avris-fs\/dist\/AvrisFilesystem\u0022\u003C\/span\u003E;\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Eimport\u003C\/span\u003E {LocalAdapter} \u003Cspan class=\u0022hljs-keyword\u0022\u003Efrom\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0022avris-fs\/dist\/adapter\/LocalAdapter\u0022\u003C\/span\u003E;\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Eimport\u003C\/span\u003E {S3Adapter} \u003Cspan class=\u0022hljs-keyword\u0022\u003Efrom\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0022avris-fs\/dist\/adapter\/S3Adapter\u0022\u003C\/span\u003E;\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Eimport\u003C\/span\u003E {dump} \u003Cspan class=\u0022hljs-keyword\u0022\u003Efrom\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0022avris-sync\/dist\/helpers\u0022\u003C\/span\u003E;\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Eimport\u003C\/span\u003E {config \u003Cspan class=\u0022hljs-keyword\u0022\u003Eas\u003C\/span\u003E dotenv} \u003Cspan class=\u0022hljs-keyword\u0022\u003Efrom\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027dotenv\u0027\u003C\/span\u003E;\n\ndotenv();\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Econst\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Eas\u003C\/span\u003E = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E AvrisSync(\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E AvrisFilesystem(\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E LocalAdapter(__dirname + \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\/data\/\u0027\u003C\/span\u003E),\n ),\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E AvrisFilesystem(\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E S3Adapter(\n process.env.AWS_BUCKET,\n process.env.AWS_KEY,\n process.env.AWS_SECRET\n ),\n ),\n);\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Eas\u003C\/span\u003E.sync().then(\u003Cspan class=\u0022hljs-function\u0022\u003E(\u003Cspan class=\u0022hljs-params\u0022\u003Eres\u003C\/span\u003E) =\u0026gt;\u003C\/span\u003E {\n dump(res);\n});\n\u003C\/code\u003E\u003C\/pre\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["javascript","sync","synchronisation","typescript"],"hasMore":true,"image":"https:\/\/avris.it\/image\/avris-sync_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-sync_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-sync_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA simple file synchronisation tool using \u003Ccode\u003Eavris-fs\u003C\/code\u003E.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EWarning!\u003C\/strong\u003E It\u2019s a \u003Cem\u003Every\u003C\/em\u003E early version! Conflict handling is not implemented,\nso only use it when you can safely assume often synchronisations\/rare conflicts\/versioning on the remote, etc.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-sync_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-sync_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA simple file synchronisation tool using \u003Ccode\u003Eavris-fs\u003C\/code\u003E.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EWarning!\u003C\/strong\u003E It\u2019s a \u003Cem\u003Every\u003C\/em\u003E early version! Conflict handling is not implemented,\nso only use it when you can safely assume often synchronisations\/rare conflicts\/versioning on the remote, etc.\u003C\/p\u003E\n\u003Ch3\u003EExample\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-js\u0022\u003Eimport {AvrisSync} from \u0022avris-sync\u0022;\nimport {AvrisFilesystem} from \u0022avris-fs\/dist\/AvrisFilesystem\u0022;\nimport {LocalAdapter} from \u0022avris-fs\/dist\/adapter\/LocalAdapter\u0022;\nimport {S3Adapter} from \u0022avris-fs\/dist\/adapter\/S3Adapter\u0022;\nimport {dump} from \u0022avris-sync\/dist\/helpers\u0022;\nimport {config as dotenv} from \u0027dotenv\u0027;\n\ndotenv();\n\nconst as = new AvrisSync(\n new AvrisFilesystem(\n new LocalAdapter(__dirname + \u0027\/data\/\u0027),\n ),\n new AvrisFilesystem(\n new S3Adapter(\n process.env.AWS_BUCKET,\n process.env.AWS_KEY,\n process.env.AWS_SECRET\n ),\n ),\n);\n\nas.sync().then((res) =\u0026gt; {\n dump(res);\n});\u003C\/code\u003E\u003C\/pre\u003E","words":113,"readTime":null,"lang":"en"}}},"projects\/avris-fs":{"key":"projects\/avris-fs","type":"article","published":true,"meta":{"createdAt":"2019-01-01T18:53:52+01:00","publishedAt":"2019-01-01T18:51:00+01:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/www.npmjs.com\/package\/avris-fs","displayUrl":"npm: avris-fs"},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Filesystem","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-fs"},"content":{"en":{"slug":"avris-fs","title":"avris-fs","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-fs_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHoUlEQVRIiX2Xy69lRRXGf+tRtfe595776u4LTQMNNLQCIpFgJEEDkiAQgwaNDzQhOtCBxoF\/gnNnDozGsY6IE8REoxFIIFE0PqBFIo9uumlIN933ce7r7F21HOzTF6PGyn4lu2rXV99Xa61vy\/U33B5RKkIQtUJUzJ1aCkGgIrgapkpyZzrdp9YKERCBACKCMDQRQUSA4EqLiNlZD+5ERQRUBHPHRGiaER4hRASlFiRAgFIKwvBhVR2AikKtJFX62QSIzPpx0F8EQFCV9yeXK89C1IKoEfH+OENIamgt+JUBghJUIkBDEB0mIwRVB4S+VAxBEUIUU52xMSwEGd7NjtnFcDem0w4RiBgWKKLobKyp4mYkVTxEoZYZwQMjRCAhqBpuiolgorgpEpVaK7WW4QPuw+prRdUOpFIRolaCYGl5mfVLl4EKIYhD1IKqQICZksxIfgWQACpQZ2wJiOhMBkNRzIxsibmmgejZ2d2lcadJTvZErZVSevpSQBj2S60AHL1qjf2tCVAH0iJQzTNQiukgcTbFRRMRHRIGUtGDTSqo2UCtJVQUFUPFmW\/mWRktcXmygYYSJWg8oZ4hCiFC33cDQwLHr7+ed948g0ggAaaCEEBCJGaSKckU15Tpg1nE2JVYAdWBHTVMjexOtoRiiCSanLjxyALbOxP2u46rrl5jurvDZHMLEyG7UqNy76fu47VTr7CYG4IYIgtQHURRBRFIpmQ3PDQhaSYXQg0wUVQNFcXNcTWyZ1yEZE6SRNKG1dUlPve1L7C6sszvnvwlb51+C2sWSD5E03hpgXsfuI+Xn3me5XYEFCJiAKOCCpgJpgNr7oKTG6R3ao2ZvgCKqKHmiBhujmrCzWZn4v5HPsHj3\/4Sr774d576wc9IFE4evYaola3tCZ6Nr37vu7z486e5dnGRaemo0RNRBul0Fl1p2EM5Kabg0s5Tu4LUOuShAMQQcdQSyRxVI5nTpsycO1\/\/1ud56LH7mVze4ukfPUXWEStzLSduvobtjYts7OzxwHe+QlKhnj7LB4+uMdndYa+fUmpPqR1oJblhJrgryYWUDJe5RWTaQ6kEDHsERSShYognsjptSsylxONPPMhDj90PwF+fe4lEw3hhzMJcw9alXY7f\/WE+9ei9eNvwwvd\/wtrhJTQ6NjaDvk+UGACFVFSDlB13ISXFs+AyGkPuoYCEQiiCgjhowtRJ5uSUuPPOG\/nMFz95UBI2351w6KojHDu+xvHbr+O6u25i\/vAiEcFbv3qW+VGm1AXapic3FaRSo6Pvp0TtUAPVwNzIjeNJcMZL0BciZAATQ3QZjmtCcWSWAJ\/45iMHmRng4W88yH+2iODcs39keuEiR244xP5GptteZ1E7xCpiQa0dtd9H6FETzJWUM940uI7HpMJQZ1A8lISRxclhZDUyyl13Xs+xY6v\/BeDfWy2F1379B7ZefY12XmmX5jhy67X0G\/NsnhdUpggdSCZKQqQOEZYcyxlrRvh4eUwpwIwhQ\/BwWjFalBajqcI9H7v5\/4KZXNjg1C+eZ\/reBUYNoNDt7rDzXofLlLmlhtqVIfcYqCRkJpe6Y7lFmxF+9eqIvg9qgRqKhqIYKYSE0YbSFOHkTYf\/J5DdzR3+8dxLnPvTK2TpGLV1KB0VooO6b9AoeaREUkxiJlNCTbGU0dwgqYE8wj+01rCz1zHdL0z7SimVUisSgkTFimAiHF6ZOwCxPdnl9KvnePMvr3Pu5TdoomPOC5EKTiVrJTTAAqZDrZQUJA\/cBDNBU0JyC8kgZ8gNeIs\/uvI223uVyaRjc7sy6YOtfdiZwl4H014oPfz4hz9ld3uX9YubbF\/aJJdCopCotFoZWc98ChbbynSuwjhIIbQ22AwpHeqBZcNq0HWGMabbN7RNbFyeo6NF7r\/9cCy2ib29wSq5ZUKcihOSKDhVM32FEAV1RBTXIWtnd1aXlpjubtMonDxxjM13z3FkPji6Ulg7bMzPC2fOrzPZ3aXkjuVrjvHMb37Pm+f3WWwra2tj9rvghVPbyMLyamjKiBqWEt60iBqeGzxlLDWoGrlpMU8kz7glHvr43Zw9f4nrjl7N1tYuV60sc\/70Oe647Wbq9oSLr7\/BcguHFpSVeUjak6xneb7n5J1zrJ+fcOH8JuMRuPQcuedBdv72W\/zWz36ZZmGRvkI7P8ZTg6oj5iRPiBjCUHckBCkVSuHQLSeoqxtsbG3D0hhZXmLj\/DZnNgtrS0fYH0\/Zd2E7KTkZbapUq+w1lc6WWf0ArE9eJ42Exnv6yzss3PYQXjAmO7tgienWFiLbgA5eKAYDPnghZmAqUitPPv061EI2Q0pwKgKrhfcuvI3WwlzKjJMzdmepScwlwbUwl2Gy1\/HROxY5e1mpl3oWRzBef5tbHv4Ifvn0P5l2HeqZWirejOD9fwgE8JRQVSSCqIFGIBForUjfHxj82u3jYqy\/e4Y2t7gISwuLHFpcxqOys7PJyuKYP7\/ivHN6xLsbe7z53h6jHDQ65dP9WeTwiVujlkI\/nVK7fdL8GAmhTPfQ1AzloPZ4bgEGzw1oDRRB4oqHHry4RiBUTARXwQWUSjZDNej7DqGwNnaWWuPS7mBzG4d7jsO\/AOFtP6chpFTOAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-fs_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA filesystem management abstraction layer for JavaScript.\nManage files on local filesystem, on FTP server, on Amazon S3, etc. all through the same interface.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EWarning!\u003C\/strong\u003E It\u2019s a \u003Cem\u003Every\u003C\/em\u003E early version!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-fs_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHoUlEQVRIiX2Xy69lRRXGf+tRtfe595776u4LTQMNNLQCIpFgJEEDkiAQgwaNDzQhOtCBxoF\/gnNnDozGsY6IE8REoxFIIFE0PqBFIo9uumlIN933ce7r7F21HOzTF6PGyn4lu2rXV99Xa61vy\/U33B5RKkIQtUJUzJ1aCkGgIrgapkpyZzrdp9YKERCBACKCMDQRQUSA4EqLiNlZD+5ERQRUBHPHRGiaER4hRASlFiRAgFIKwvBhVR2AikKtJFX62QSIzPpx0F8EQFCV9yeXK89C1IKoEfH+OENIamgt+JUBghJUIkBDEB0mIwRVB4S+VAxBEUIUU52xMSwEGd7NjtnFcDem0w4RiBgWKKLobKyp4mYkVTxEoZYZwQMjRCAhqBpuiolgorgpEpVaK7WW4QPuw+prRdUOpFIRolaCYGl5mfVLl4EKIYhD1IKqQICZksxIfgWQACpQZ2wJiOhMBkNRzIxsibmmgejZ2d2lcadJTvZErZVSevpSQBj2S60AHL1qjf2tCVAH0iJQzTNQiukgcTbFRRMRHRIGUtGDTSqo2UCtJVQUFUPFmW\/mWRktcXmygYYSJWg8oZ4hCiFC33cDQwLHr7+ed948g0ggAaaCEEBCJGaSKckU15Tpg1nE2JVYAdWBHTVMjexOtoRiiCSanLjxyALbOxP2u46rrl5jurvDZHMLEyG7UqNy76fu47VTr7CYG4IYIgtQHURRBRFIpmQ3PDQhaSYXQg0wUVQNFcXNcTWyZ1yEZE6SRNKG1dUlPve1L7C6sszvnvwlb51+C2sWSD5E03hpgXsfuI+Xn3me5XYEFCJiAKOCCpgJpgNr7oKTG6R3ao2ZvgCKqKHmiBhujmrCzWZn4v5HPsHj3\/4Sr774d576wc9IFE4evYaola3tCZ6Nr37vu7z486e5dnGRaemo0RNRBul0Fl1p2EM5Kabg0s5Tu4LUOuShAMQQcdQSyRxVI5nTpsycO1\/\/1ud56LH7mVze4ukfPUXWEStzLSduvobtjYts7OzxwHe+QlKhnj7LB4+uMdndYa+fUmpPqR1oJblhJrgryYWUDJe5RWTaQ6kEDHsERSShYognsjptSsylxONPPMhDj90PwF+fe4lEw3hhzMJcw9alXY7f\/WE+9ei9eNvwwvd\/wtrhJTQ6NjaDvk+UGACFVFSDlB13ISXFs+AyGkPuoYCEQiiCgjhowtRJ5uSUuPPOG\/nMFz95UBI2351w6KojHDu+xvHbr+O6u25i\/vAiEcFbv3qW+VGm1AXapic3FaRSo6Pvp0TtUAPVwNzIjeNJcMZL0BciZAATQ3QZjmtCcWSWAJ\/45iMHmRng4W88yH+2iODcs39keuEiR244xP5GptteZ1E7xCpiQa0dtd9H6FETzJWUM940uI7HpMJQZ1A8lISRxclhZDUyyl13Xs+xY6v\/BeDfWy2F1379B7ZefY12XmmX5jhy67X0G\/NsnhdUpggdSCZKQqQOEZYcyxlrRvh4eUwpwIwhQ\/BwWjFalBajqcI9H7v5\/4KZXNjg1C+eZ\/reBUYNoNDt7rDzXofLlLmlhtqVIfcYqCRkJpe6Y7lFmxF+9eqIvg9qgRqKhqIYKYSE0YbSFOHkTYf\/J5DdzR3+8dxLnPvTK2TpGLV1KB0VooO6b9AoeaREUkxiJlNCTbGU0dwgqYE8wj+01rCz1zHdL0z7SimVUisSgkTFimAiHF6ZOwCxPdnl9KvnePMvr3Pu5TdoomPOC5EKTiVrJTTAAqZDrZQUJA\/cBDNBU0JyC8kgZ8gNeIs\/uvI223uVyaRjc7sy6YOtfdiZwl4H014oPfz4hz9ld3uX9YubbF\/aJJdCopCotFoZWc98ChbbynSuwjhIIbQ22AwpHeqBZcNq0HWGMabbN7RNbFyeo6NF7r\/9cCy2ib29wSq5ZUKcihOSKDhVM32FEAV1RBTXIWtnd1aXlpjubtMonDxxjM13z3FkPji6Ulg7bMzPC2fOrzPZ3aXkjuVrjvHMb37Pm+f3WWwra2tj9rvghVPbyMLyamjKiBqWEt60iBqeGzxlLDWoGrlpMU8kz7glHvr43Zw9f4nrjl7N1tYuV60sc\/70Oe647Wbq9oSLr7\/BcguHFpSVeUjak6xneb7n5J1zrJ+fcOH8JuMRuPQcuedBdv72W\/zWz36ZZmGRvkI7P8ZTg6oj5iRPiBjCUHckBCkVSuHQLSeoqxtsbG3D0hhZXmLj\/DZnNgtrS0fYH0\/Zd2E7KTkZbapUq+w1lc6WWf0ArE9eJ42Exnv6yzss3PYQXjAmO7tgienWFiLbgA5eKAYDPnghZmAqUitPPv061EI2Q0pwKgKrhfcuvI3WwlzKjJMzdmepScwlwbUwl2Gy1\/HROxY5e1mpl3oWRzBef5tbHv4Ifvn0P5l2HeqZWirejOD9fwgE8JRQVSSCqIFGIBForUjfHxj82u3jYqy\/e4Y2t7gISwuLHFpcxqOys7PJyuKYP7\/ivHN6xLsbe7z53h6jHDQ65dP9WeTwiVujlkI\/nVK7fdL8GAmhTPfQ1AzloPZ4bgEGzw1oDRRB4oqHHry4RiBUTARXwQWUSjZDNej7DqGwNnaWWuPS7mBzG4d7jsO\/AOFtP6chpFTOAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-fs_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA filesystem management abstraction layer for JavaScript.\nManage files on local filesystem, on FTP server, on Amazon S3, etc. all through the same interface.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EWarning!\u003C\/strong\u003E It\u2019s a \u003Cem\u003Every\u003C\/em\u003E early version!\u003C\/p\u003E\n\u003Ch3\u003EExample\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs javascript border\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eimport\u003C\/span\u003E {AvrisFilesystem} \u003Cspan class=\u0022hljs-keyword\u0022\u003Efrom\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0022avris-fs\u0022\u003C\/span\u003E;\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Eimport\u003C\/span\u003E {LocalAdapter} \u003Cspan class=\u0022hljs-keyword\u0022\u003Efrom\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0022avris-fs\/dist\/adapter\/LocalAdapter\u0022\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Econst\u003C\/span\u003E afs = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E AvrisFilesystem(\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E LocalAdapter(__dirname + \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\/data\/\u0027\u003C\/span\u003E)\n);\n\nafs.put( \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ put = create or update\u003C\/span\u003E\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027dir\/subdir\/foo.txt\u0027\u003C\/span\u003E,\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027OSIEM!\u0027\u003C\/span\u003E\n).then(\u003Cspan class=\u0022hljs-function\u0022\u003E(\u003Cspan class=\u0022hljs-params\u0022\u003Emeta\u003C\/span\u003E) =\u0026gt;\u003C\/span\u003E {\n afs.read(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027dir\/subdir\/foo.txt\u0027\u003C\/span\u003E).then(\u003Cspan class=\u0022hljs-function\u0022\u003E(\u003Cspan class=\u0022hljs-params\u0022\u003Econtent\u003C\/span\u003E) =\u0026gt;\u003C\/span\u003E {\n \u003Cspan class=\u0022hljs-built_in\u0022\u003Econsole\u003C\/span\u003E.log(content); \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ \u0027OSIEM!\u0027\u003C\/span\u003E\n });\n})\n\nafs.create(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027dir\/bar.txt\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027OK!\u0027\u003C\/span\u003E).then(\u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E =\u0026gt;\u003C\/span\u003E {\n afs.list(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027dir\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-literal\u0022\u003Etrue\u003C\/span\u003E).then(\u003Cspan class=\u0022hljs-function\u0022\u003E(\u003Cspan class=\u0022hljs-params\u0022\u003Eobjects\u003C\/span\u003E) =\u0026gt;\u003C\/span\u003E {\n \u003Cspan class=\u0022hljs-built_in\u0022\u003Econsole\u003C\/span\u003E.log(objects);\n });\n});\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EAvailable adapters\u003C\/h3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003ELocalAdapter\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EMemoryAdapter\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003ENullAdapter\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003ES3Adapter\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003ESftpAdapter\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EBrowserStorageAdapter\u003C\/code\u003E (\u003Ccode\u003ElocalStorage\u003C\/code\u003E or \u003Ccode\u003EsessionStorage\u003C\/code\u003E)\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch3\u003EAPI\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode\u003Elist(directory: string = \u0027\u0027, recursive: boolean = false): Promise\u0026lt;{ [path: string]: Metadata }\u0026gt;;\nhas(path: string): Promise\u0026lt;boolean\u0026gt;;\ngetMetadata(path: string): Promise\u0026lt;Metadata\u0026gt;;\nread(path: string): Promise\u0026lt;Buffer\u0026gt;;\ncreate(path: string, content: Buffer): Promise\u0026lt;Metadata\u0026gt;;\nupdate(path: string, content: Buffer): Promise\u0026lt;Metadata\u0026gt;;\nput(path: string, content: Buffer): Promise\u0026lt;Metadata\u0026gt;;\nmove(path: string, newPath: string): Promise\u0026lt;Metadata\u0026gt;;\ncopy(path: string, newPath: string): Promise\u0026lt;Metadata\u0026gt;;\nremove(path: string): Promise\u0026lt;void\u0026gt;;\npublish(path: string): Promise\u0026lt;Metadata\u0026gt;;\nunpublish(path: string): Promise\u0026lt;Metadata\u0026gt;;\ncreateDir(path: string): Promise\u0026lt;Metadata\u0026gt;;\nremoveDir(path: string): Promise\u0026lt;void\u0026gt;;\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003ECredits\u003C\/h3\u003E\n\u003Cp\u003EGreatly inspired by \u003Ca href=\u0022https:\/\/flysystem.thephpleague.com\/docs\/\u0022\u003EFlysystem\u003C\/a\u003E, a similar project for PHP.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["filesystem","javascript","local","localstorage","npm","s3","sessionstorage","typescript"],"hasMore":true,"image":"https:\/\/avris.it\/image\/avris-fs_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-fs_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-fs_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA filesystem management abstraction layer for JavaScript.\nManage files on local filesystem, on FTP server, on Amazon S3, etc. all through the same interface.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EWarning!\u003C\/strong\u003E It\u2019s a \u003Cem\u003Every\u003C\/em\u003E early version!\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-fs_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-fs_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA filesystem management abstraction layer for JavaScript.\nManage files on local filesystem, on FTP server, on Amazon S3, etc. all through the same interface.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EWarning!\u003C\/strong\u003E It\u2019s a \u003Cem\u003Every\u003C\/em\u003E early version!\u003C\/p\u003E\n\u003Ch3\u003EExample\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-js\u0022\u003Eimport {AvrisFilesystem} from \u0022avris-fs\u0022;\nimport {LocalAdapter} from \u0022avris-fs\/dist\/adapter\/LocalAdapter\u0022;\n\nconst afs = new AvrisFilesystem(\n new LocalAdapter(__dirname + \u0027\/data\/\u0027)\n);\n\nafs.put( \/\/ put = create or update\n \u0027dir\/subdir\/foo.txt\u0027,\n \u0027OSIEM!\u0027\n).then((meta) =\u0026gt; {\n afs.read(\u0027dir\/subdir\/foo.txt\u0027).then((content) =\u0026gt; {\n console.log(content); \/\/ \u0027OSIEM!\u0027\n });\n})\n\nafs.create(\u0027dir\/bar.txt\u0027, \u0027OK!\u0027).then(() =\u0026gt; {\n afs.list(\u0027dir\u0027, true).then((objects) =\u0026gt; {\n console.log(objects);\n });\n});\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EAvailable adapters\u003C\/h3\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003ELocalAdapter\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EMemoryAdapter\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003ENullAdapter\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003ES3Adapter\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003ESftpAdapter\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EBrowserStorageAdapter\u003C\/code\u003E (\u003Ccode\u003ElocalStorage\u003C\/code\u003E or \u003Ccode\u003EsessionStorage\u003C\/code\u003E)\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch3\u003EAPI\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode\u003Elist(directory: string = \u0027\u0027, recursive: boolean = false): Promise\u0026lt;{ [path: string]: Metadata }\u0026gt;;\nhas(path: string): Promise\u0026lt;boolean\u0026gt;;\ngetMetadata(path: string): Promise\u0026lt;Metadata\u0026gt;;\nread(path: string): Promise\u0026lt;Buffer\u0026gt;;\ncreate(path: string, content: Buffer): Promise\u0026lt;Metadata\u0026gt;;\nupdate(path: string, content: Buffer): Promise\u0026lt;Metadata\u0026gt;;\nput(path: string, content: Buffer): Promise\u0026lt;Metadata\u0026gt;;\nmove(path: string, newPath: string): Promise\u0026lt;Metadata\u0026gt;;\ncopy(path: string, newPath: string): Promise\u0026lt;Metadata\u0026gt;;\nremove(path: string): Promise\u0026lt;void\u0026gt;;\npublish(path: string): Promise\u0026lt;Metadata\u0026gt;;\nunpublish(path: string): Promise\u0026lt;Metadata\u0026gt;;\ncreateDir(path: string): Promise\u0026lt;Metadata\u0026gt;;\nremoveDir(path: string): Promise\u0026lt;void\u0026gt;;\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003ECredits\u003C\/h3\u003E\n\u003Cp\u003EGreatly inspired by \u003Ca href=\u0022https:\/\/flysystem.thephpleague.com\/docs\/\u0022\u003EFlysystem\u003C\/a\u003E, a similar project for PHP.\u003C\/p\u003E","words":238,"readTime":null,"lang":"en"}}},"projects\/avris-graphqlbundle":{"key":"projects\/avris-graphqlbundle","type":"article","published":true,"meta":{"createdAt":"2018-09-27T23:32:04+02:00","publishedAt":"2018-09-27T23:30:00+02:00","group":null,"links":[{"icon":"brands gitlab","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/GraphqlBundle","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-graphqlbundle"},"content":{"en":{"slug":"avris-graphqlbundle","title":"Avris GraphqlBundle","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-graphql-bundle_small.png\u0022 alt=\u0022Avris GraphqlBundle\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHsklEQVRIiX2X268lRRXGf+tS1fty9j4XZs4AwzCIipJBiUQiCTEgCSoxmKBRoyZeHvRB44N\/gu+++WA0PuuT8QUx0Wi8JJooeEFAJIIzwDhOBmbmnLPP3mfv7qrlQ+8ZjBorXd2ddF2++r5atb6WW287E1EqQhC1QlTMnVoKQaAiuBqmSnJntVpSa4UIiEAAEUHoi4ggIkBwrUTEutbrT6IiAiqCuWMiNM0QjxAiglILEiBAKQWhH1hVe6CiUCtJlW49ASLrdlxvLwIgqMobk8u1dyFqQdSIeKOfISQ1tBb8WgdBCSoRoCGI9pMRgqoDQlcqhqAIIYqprtnoF4L039bX+ma4G6tViwhE9AsUUXTd11RxM5IqHqJQy5rgnhEikBBUDTfFRDBR3BSJSq2VWks\/gHu\/+lpRtetSqQhRK0GwubXF1ctXgAohiEPUgqpAgJmSzEh+DZAAKlDXbAmI6FoGQ1HMjGyJUdNAdMwXCxp3muRkT9RaKaWjKwWEfr\/UCsBNJ3ZZHsyA2pMWgWpeg1JMe4mzKS6aiGiRMJCKXt+kgpr11FpCRVExVJxxM2Z7uMmV2R4aSpSg8YR6hiiECF3X9gwJnL71Vv559mVEAgkwFYQAEiKxlkxJprimTBesI8auxQqo9uyoYWpkd7IlFEMk0eTEm45vcDifsWxbTty4y2oxZ7Z\/gImQXalRuf\/9D\/Dic88zzQ1B9JEFqPaiqIIIJFOyGx6akLSWC6EGmCiqhori5rga2TMuQjInSSJpw87OJh\/53MfY2d7i59\/\/Ea+cewVrNkjeR9Nkc4P7H3qAZ3\/xa7YGQ6AQET0YFVTATDDtWXMXnNwgnVNrrPUFUEQNNUfEcHNUE262rokHH3kvn\/zyJ3jhyb\/w+De+R6Jwx003E7VycDjDs\/Hpr32VJ3\/wBLdMp6xKS42OiNJLp+voSv0eykkxBZfBmNoWpNb+HApADBFHLZHMUTWSOYOUGbnz+S99lA889iCzKwc88a3HyTpkezTgzW+5mcO919ibH\/HQVz5FUqGee5W337TLbDHnqFtRakepLWgluWEmuCvJhZQMl9EUWXVQKgH9HkERSagY4omsziAlRinxyc88zAceexCAp3\/1DImGycaEjVHDweUFp9\/9Tt7\/6P34oOE3X\/8Ou8c20WjZ2w+6LlGiBxRSUQ1SdtyFlBTPgstwArmDAhIKoQgK4qAJUyeZk1Pi7rvfxIc\/\/r7rKWH\/4owbThzn5OldTp85xal7bmd8bEpE8MqPf8l4mCl1g0HTkZsKUqnR0nUroraogWpgbuTG8SQ4k03oChHSg4k+ugzHNaE4sj4AP\/PFR66fzAAf\/MLD\/GeJCM7\/8ilWl17j+G03sNzLtIdXmWqLWEUsqLWldkuEDjXBXEk5402D62RCKvR5BsVDSRhZnBxGViOj3HP3rZw8ufNfAP691FJ48Se\/4+CFFxmMlcHmiON33kK3N2b\/gqCyQmhBMlESIrWPsORYzlgzxCdbE0oB1gwZgoczEGOAMsBoqnDfe97yf8HMLu3x3A9\/zer1SwwbQKFdzJm\/3uKyYrTZUNvSnz0GKglZy6XuWB6gzRC\/cWdI1wW1QA1FQ1GMFELCGITSFOGO24\/9TyCL\/Tl\/\/dUznP\/982RpGQ5qnzoqRAt1adAoeahEUkxiLVNCTbGU0dwgqYE8xO\/abZgftayWhVVXKaVSakVCkKhYEUyEY9uj6yAOZwvOvXCes396ifPP\/p0mWkZeiFRwKlkroQEWsOpzpaQgeeAmmAmaEpIHkAxyhtyAD\/BHt\/\/B4VFlNmvZP6zMuuBgCfMVHLWw6oTSwbe\/+V0WhwuuvrbP4eV9cikkConKQCtD6xinYDqorEYVJkEKYWC9zZDSoh5YNqwGbWsYE9qloYPE3pURLQPkwTPHYjpIHB31VsktE+JUnJBEwamamW7vcPnKHiF9wnU1jt2ww3x2SDZj99g2SSplvs8kw\/FxcNN24a53nuJw7wIvX7jKbLGg5Jatm0\/yi5\/+lrMXlkwHld3dCcs2+M1zh8jG1k5oyogalhLeDBA1PDd4ylhquO2Wk5w8dRopLYFyfGvCfBXcuLvL4mBOVLjj9tvYHA95+rd\/4MadKdvjhlSXvO2ut7K4eBYtC5aXzrE17rjj7hFXL8y4dGGfyRBcOo7f9zDzP\/8MufezX4pmY0pXYTCe4KlB1RFzkidEjGFOnDl1gvlRS+kKt5\/Y5vzFK+zvH3Jic8w4ZxbzJYlgeXjE9qgh5kdsD5ydyYBGO+rhHtLO2RxV7jyzRTOGl556iclQaLxjeOIEebqJF4zZfAGWWB0cIHIIaO+FojfgKsqFC+eRUqFUnoqgWyygFrIZFhClYrWQ6L3xKGUmyZm4s9kkRklwLYwyzI5a7n3HlFevKPVyx3QIk6v\/4K0ffBd+5dzfWLUt6plaKt4M4Y1\/CATwlFBVJIKogUYgEWitSNddN\/i1XeJiXL34MoM8wEXY3Jhyw3QLj8p8vs\/2dMIfn3f+eW7Ixb0jzr5+xDAHja74UPcqcuzNd0YthW61orZL0niChFBWR2hq+nRQOzwPAHrPDWgNFEHimofuvbhGIFRMBFfBBZRKNkM16LoWobA7cTYHxuVFb3Mbh\/tOw78Ak6pNn\/7nMikAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-graphql-bundle_small.png\u0022 alt=\u0022Avris GraphqlBundle\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ESimplify Graphql configuration using plain methods with typehints and annotations.\u003C\/p\u003E\n\u003Cp\u003EThis bundle is a wrapper on \u003Ccode\u003Ewebonyx\/graphql-php\u003C\/code\u003E.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-graphql-bundle_big.png\u0022 alt=\u0022Avris GraphqlBundle\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHsklEQVRIiX2X268lRRXGf+tS1fty9j4XZs4AwzCIipJBiUQiCTEgCSoxmKBRoyZeHvRB44N\/gu+++WA0PuuT8QUx0Wi8JJooeEFAJIIzwDhOBmbmnLPP3mfv7qrlQ+8ZjBorXd2ddF2++r5atb6WW287E1EqQhC1QlTMnVoKQaAiuBqmSnJntVpSa4UIiEAAEUHoi4ggIkBwrUTEutbrT6IiAiqCuWMiNM0QjxAiglILEiBAKQWhH1hVe6CiUCtJlW49ASLrdlxvLwIgqMobk8u1dyFqQdSIeKOfISQ1tBb8WgdBCSoRoCGI9pMRgqoDQlcqhqAIIYqprtnoF4L039bX+ma4G6tViwhE9AsUUXTd11RxM5IqHqJQy5rgnhEikBBUDTfFRDBR3BSJSq2VWks\/gHu\/+lpRtetSqQhRK0GwubXF1ctXgAohiEPUgqpAgJmSzEh+DZAAKlDXbAmI6FoGQ1HMjGyJUdNAdMwXCxp3muRkT9RaKaWjKwWEfr\/UCsBNJ3ZZHsyA2pMWgWpeg1JMe4mzKS6aiGiRMJCKXt+kgpr11FpCRVExVJxxM2Z7uMmV2R4aSpSg8YR6hiiECF3X9gwJnL71Vv559mVEAgkwFYQAEiKxlkxJprimTBesI8auxQqo9uyoYWpkd7IlFEMk0eTEm45vcDifsWxbTty4y2oxZ7Z\/gImQXalRuf\/9D\/Dic88zzQ1B9JEFqPaiqIIIJFOyGx6akLSWC6EGmCiqhori5rga2TMuQjInSSJpw87OJh\/53MfY2d7i59\/\/Ea+cewVrNkjeR9Nkc4P7H3qAZ3\/xa7YGQ6AQET0YFVTATDDtWXMXnNwgnVNrrPUFUEQNNUfEcHNUE262rokHH3kvn\/zyJ3jhyb\/w+De+R6Jwx003E7VycDjDs\/Hpr32VJ3\/wBLdMp6xKS42OiNJLp+voSv0eykkxBZfBmNoWpNb+HApADBFHLZHMUTWSOYOUGbnz+S99lA889iCzKwc88a3HyTpkezTgzW+5mcO919ibH\/HQVz5FUqGee5W337TLbDHnqFtRakepLWgluWEmuCvJhZQMl9EUWXVQKgH9HkERSagY4omsziAlRinxyc88zAceexCAp3\/1DImGycaEjVHDweUFp9\/9Tt7\/6P34oOE3X\/8Ou8c20WjZ2w+6LlGiBxRSUQ1SdtyFlBTPgstwArmDAhIKoQgK4qAJUyeZk1Pi7rvfxIc\/\/r7rKWH\/4owbThzn5OldTp85xal7bmd8bEpE8MqPf8l4mCl1g0HTkZsKUqnR0nUroraogWpgbuTG8SQ4k03oChHSg4k+ugzHNaE4sj4AP\/PFR66fzAAf\/MLD\/GeJCM7\/8ilWl17j+G03sNzLtIdXmWqLWEUsqLWldkuEDjXBXEk5402D62RCKvR5BsVDSRhZnBxGViOj3HP3rZw8ufNfAP691FJ48Se\/4+CFFxmMlcHmiON33kK3N2b\/gqCyQmhBMlESIrWPsORYzlgzxCdbE0oB1gwZgoczEGOAMsBoqnDfe97yf8HMLu3x3A9\/zer1SwwbQKFdzJm\/3uKyYrTZUNvSnz0GKglZy6XuWB6gzRC\/cWdI1wW1QA1FQ1GMFELCGITSFOGO24\/9TyCL\/Tl\/\/dUznP\/982RpGQ5qnzoqRAt1adAoeahEUkxiLVNCTbGU0dwgqYE8xO\/abZgftayWhVVXKaVSakVCkKhYEUyEY9uj6yAOZwvOvXCes396ifPP\/p0mWkZeiFRwKlkroQEWsOpzpaQgeeAmmAmaEpIHkAxyhtyAD\/BHt\/\/B4VFlNmvZP6zMuuBgCfMVHLWw6oTSwbe\/+V0WhwuuvrbP4eV9cikkConKQCtD6xinYDqorEYVJkEKYWC9zZDSoh5YNqwGbWsYE9qloYPE3pURLQPkwTPHYjpIHB31VsktE+JUnJBEwamamW7vcPnKHiF9wnU1jt2ww3x2SDZj99g2SSplvs8kw\/FxcNN24a53nuJw7wIvX7jKbLGg5Jatm0\/yi5\/+lrMXlkwHld3dCcs2+M1zh8jG1k5oyogalhLeDBA1PDd4ylhquO2Wk5w8dRopLYFyfGvCfBXcuLvL4mBOVLjj9tvYHA95+rd\/4MadKdvjhlSXvO2ut7K4eBYtC5aXzrE17rjj7hFXL8y4dGGfyRBcOo7f9zDzP\/8MufezX4pmY0pXYTCe4KlB1RFzkidEjGFOnDl1gvlRS+kKt5\/Y5vzFK+zvH3Jic8w4ZxbzJYlgeXjE9qgh5kdsD5ydyYBGO+rhHtLO2RxV7jyzRTOGl556iclQaLxjeOIEebqJF4zZfAGWWB0cIHIIaO+FojfgKsqFC+eRUqFUnoqgWyygFrIZFhClYrWQ6L3xKGUmyZm4s9kkRklwLYwyzI5a7n3HlFevKPVyx3QIk6v\/4K0ffBd+5dzfWLUt6plaKt4M4Y1\/CATwlFBVJIKogUYgEWitSNddN\/i1XeJiXL34MoM8wEXY3Jhyw3QLj8p8vs\/2dMIfn3f+eW7Ixb0jzr5+xDAHja74UPcqcuzNd0YthW61orZL0niChFBWR2hq+nRQOzwPAHrPDWgNFEHimofuvbhGIFRMBFfBBZRKNkM16LoWobA7cTYHxuVFb3Mbh\/tOw78Ak6pNn\/7nMikAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-graphql-bundle_big.png\u0022 alt=\u0022Avris GraphqlBundle\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ESimplify Graphql configuration using plain methods with typehints and annotations.\u003C\/p\u003E\n\u003Cp\u003EThis bundle is a wrapper on \u003Ccode\u003Ewebonyx\/graphql-php\u003C\/code\u003E.\u003C\/p\u003E\n\u003Ch3\u003EDisclaimer\u003C\/h3\u003E\n\u003Cp\u003EI\u2019m new to GraphQL, currently writing my first project using it.\nI\u2019m sure that many things are missing from the bundle and many assumptions I made are wrong,\nso please be understanding, and if possible help out with a pull request.\u003C\/p\u003E\n\u003Ch3\u003EInstalation\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs bash border\u0022\u003E$ composer require avris\/graphql-bundle\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EThen add a route:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs yaml border\u0022\u003E\u003Cspan class=\u0022hljs-attr\u0022\u003Eavris_graphql_main:\u003C\/span\u003E\n \u003Cspan class=\u0022hljs-attr\u0022\u003Epath:\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\/graph\u0027\u003C\/span\u003E\n \u003Cspan class=\u0022hljs-attr\u0022\u003Econtroller:\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003EAvris\\GraphqlBundle\\Controller\\GraphqlController::main\u003C\/span\u003E\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EExample\u003C\/h3\u003E\n\u003Cp\u003ELet\u2019s say you have the following type in your app:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-meta\u0022\u003E\u0026lt;?php\u003C\/span\u003E\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Enamespace\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EApp\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EEntity\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Efinal\u003C\/span\u003E \u003Cspan class=\u0022hljs-class\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eclass\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EUser\u003C\/span\u003E\n\u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ properties, constructor, etc.\u003C\/span\u003E\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eprivate\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Estatic\u003C\/span\u003E $type = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enull\u003C\/span\u003E;\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Efinal\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Estatic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003Etype\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003EObjectType\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Estatic\u003C\/span\u003E::$type ?: \u003Cspan class=\u0022hljs-keyword\u0022\u003Estatic\u003C\/span\u003E::$type = \u003Cspan class=\u0022hljs-keyword\u0022\u003Estatic\u003C\/span\u003E::buildType();\n }\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eprivate\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Estatic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EbuildType\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003EObjectType\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E ObjectType([\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027name\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027User\u0027\u003C\/span\u003E,\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027fields\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027id\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027type\u0027\u003C\/span\u003E =\u0026gt; Type::id(),\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027resolve\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-params\u0022\u003E(User $user)\u003C\/span\u003E \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E $user-\u0026gt;getId();\n },\n ],\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027email\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027type\u0027\u003C\/span\u003E =\u0026gt; Type::string(),\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027resolve\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-params\u0022\u003E(User $user)\u003C\/span\u003E \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E $user-\u0026gt;getEmail();\n },\n ],\n ],\n ]);\n }\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EgetId\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003Estring\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;id;\n }\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EgetEmail\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003Estring\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;email;\n }\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAnd the following GraphQL schema:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E Schema([\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027query\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E ObjectType([\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027name\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Query\u0027\u003C\/span\u003E,\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027fields\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027hello\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027type\u0027\u003C\/span\u003E =\u0026gt; Type::string(),\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027resolve\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027GraphQL API\u0027\u003C\/span\u003E;\n }\n ],\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027user\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027type\u0027\u003C\/span\u003E =\u0026gt; User::type(),\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027args\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027id\u0027\u003C\/span\u003E =\u0026gt; [\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027type\u0027\u003C\/span\u003E =\u0026gt; Type::nonNull(Type::id())],\n ],\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027resolve\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;accessControl-\u0026gt;guard(\u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-params\u0022\u003E($root, $args)\u003C\/span\u003E \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;repository-\u0026gt;find($args[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027id\u0027\u003C\/span\u003E]);\n }, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027ROLE_ADMIN\u0027\u003C\/span\u003E),\n ],\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027currentUser\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027type\u0027\u003C\/span\u003E =\u0026gt; User::type(),\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027resolve\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-params\u0022\u003E($root, $args)\u003C\/span\u003E \u003C\/span\u003E{\n $user = \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;tokenStorage-\u0026gt;getToken()-\u0026gt;getUser();\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E $user \u003Cspan class=\u0022hljs-keyword\u0022\u003Einstanceof\u003C\/span\u003E User ? $user : \u003Cspan class=\u0022hljs-keyword\u0022\u003Enull\u003C\/span\u003E;\n },\n ],\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027jwt\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027type\u0027\u003C\/span\u003E =\u0026gt; Type::string(),\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027args\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027login\u0027\u003C\/span\u003E =\u0026gt; Type::nonNull(Type::string()),\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027password\u0027\u003C\/span\u003E =\u0026gt; Type::nonNull(Type::string()),\n ],\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027resolve\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-params\u0022\u003E($root, $args)\u003C\/span\u003E \u003C\/span\u003E{\n $user = \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;repository-\u0026gt;findOneBy([\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027email\u0027\u003C\/span\u003E =\u0026gt; $args[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027login\u0027\u003C\/span\u003E]]);\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E (!$user || !\u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;encoder-\u0026gt;isPasswordValid($user, $args[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027password\u0027\u003C\/span\u003E])) {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Enull\u003C\/span\u003E;\n }\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E (string) \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;jwtManager-\u0026gt;issue($user);\n },\n ]\n ],\n ]),\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027mutation\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E ObjectType([\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027name\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Mutation\u0027\u003C\/span\u003E,\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027fields\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027userRegistered\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027type\u0027\u003C\/span\u003E =\u0026gt; User::type(),\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027args\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027email\u0027\u003C\/span\u003E =\u0026gt; Type::nonNull(Type::string()),\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027password\u0027\u003C\/span\u003E =\u0026gt; Type::nonNull(Type::string()),\n ],\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027resolve\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-params\u0022\u003E($root, $args)\u003C\/span\u003E \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;eventDispatcher-\u0026gt;dispatch(\u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E UserRegisteredEvent($args[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027email\u0027\u003C\/span\u003E], $args[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027password\u0027\u003C\/span\u003E]));\n },\n ]\n ],\n ]),\n]);\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EUsing this bundle, you can rewrite the entity\/type like this:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-meta\u0022\u003E\u0026lt;?php\u003C\/span\u003E\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Enamespace\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EApp\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EEntity\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Euse\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EAvris\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EGraphqlBundle\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EAnnotation\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003Eas\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EGraphql\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/**\n * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\Type\n *\/\u003C\/span\u003E\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Efinal\u003C\/span\u003E \u003Cspan class=\u0022hljs-class\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eclass\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EUser\u003C\/span\u003E\n\u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ properties, constructor, etc.\u003C\/span\u003E\n\n \u003Cspan class=\u0022hljs-comment\u0022\u003E\/**\n * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\Query\n *\/\u003C\/span\u003E\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EgetId\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003Estring\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;id;\n }\n\n \u003Cspan class=\u0022hljs-comment\u0022\u003E\/**\n * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\Query\n *\/\u003C\/span\u003E\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EgetEmail\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003Estring\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;email;\n }\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAnd your schema\/controllers like this:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-meta\u0022\u003E\u0026lt;?php\u003C\/span\u003E\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Enamespace\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EApp\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EController\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Euse\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EAvris\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EGraphqlBundle\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EAnnotation\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003Eas\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EGraphql\u003C\/span\u003E;\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Euse\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003ESymfony\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EBundle\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EFrameworkBundle\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EController\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EAbstractController\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Efinal\u003C\/span\u003E \u003Cspan class=\u0022hljs-class\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eclass\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EHomeController\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Eextends\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EAbstractController\u003C\/span\u003E\n\u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-comment\u0022\u003E\/**\n * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\Query\n *\/\u003C\/span\u003E\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003Ehello\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003Estring\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027GraphQL API\u0027\u003C\/span\u003E;\n }\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Eand:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-meta\u0022\u003E\u0026lt;?php\u003C\/span\u003E\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Enamespace\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EApp\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EController\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Euse\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EAvris\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EGraphqlBundle\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EAnnotation\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003Eas\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EGraphql\u003C\/span\u003E;\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Euse\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EApp\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EEntity\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EUser\u003C\/span\u003E;\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Euse\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EApp\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EEvents\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EUserRegistered\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Efinal\u003C\/span\u003E \u003Cspan class=\u0022hljs-class\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eclass\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EUserController\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Eextends\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EBaseController\u003C\/span\u003E\n\u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ dependecies...\u003C\/span\u003E\n\n \u003Cspan class=\u0022hljs-comment\u0022\u003E\/**\n * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\Query\n * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\Security(\u0022ROLE_ADMIN\u0022)\n * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\ParamType(\u0022id\u0022, var=\u0022id\u0022)\n *\/\u003C\/span\u003E\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003Euser\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E(string $id)\u003C\/span\u003E: ?\u003Cspan class=\u0022hljs-title\u0022\u003EUser\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;repository-\u0026gt;find($id);\n }\n\n \u003Cspan class=\u0022hljs-comment\u0022\u003E\/**\n * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\Query\n *\/\u003C\/span\u003E\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EcurrentUser\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: ?\u003Cspan class=\u0022hljs-title\u0022\u003EUser\u003C\/span\u003E\n \u003C\/span\u003E{\n $user = \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;tokenStorage-\u0026gt;getToken()-\u0026gt;getUser();\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E $user \u003Cspan class=\u0022hljs-keyword\u0022\u003Einstanceof\u003C\/span\u003E User ? $user : \u003Cspan class=\u0022hljs-keyword\u0022\u003Enull\u003C\/span\u003E;\n }\n\n \u003Cspan class=\u0022hljs-comment\u0022\u003E\/**\n * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\Query\n *\/\u003C\/span\u003E\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003Ejwt\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E(string $login, string $password)\u003C\/span\u003E: ?\u003Cspan class=\u0022hljs-title\u0022\u003Estring\u003C\/span\u003E\n \u003C\/span\u003E{\n $user = \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;repository-\u0026gt;findOneBy([\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027email\u0027\u003C\/span\u003E =\u0026gt; $login]);\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E (!$user || !\u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;encoder-\u0026gt;isPasswordValid($user, $password)) {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Enull\u003C\/span\u003E;\n }\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E (string) \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;jwtManager-\u0026gt;issue($user);\n }\n\n \u003Cspan class=\u0022hljs-comment\u0022\u003E\/**\n * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@Graphql\u003C\/span\u003E\\Query(\u0022mutation\u0022)\n *\/\u003C\/span\u003E\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EuserRegistered\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E(string $email, string $password)\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003EUser\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;eventDispatcher-\u0026gt;dispatch(\u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E UserRegisteredEvent($email, $password));\n }\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EThe bundle will parse all the classes in \u003Ccode\u003Esrc\/Controller\u003C\/code\u003E and \u003Ccode\u003Esrc\/Entity\u003C\/code\u003E\n(that list can be configured in the config key \u003Ccode\u003Eavris_graphql.load\u003C\/code\u003E)\nlooking for the \u003Ccode\u003EGraphql\u003C\/code\u003E annotations.\u003C\/p\u003E\n\u003Cp\u003EAll parameters of a query-method, as well as its return type have to be typehinted.\nSupported built-in types are \u003Ccode\u003Estring\u003C\/code\u003E, \u003Ccode\u003Ebool\u003C\/code\u003E, \u003Ccode\u003Eint\u003C\/code\u003E and \u003Ccode\u003Efloat\u003C\/code\u003E.\nYou can also typehint any type you registered with \u003Ccode\u003E@Graphql\\Type\u003C\/code\u003E.\u003C\/p\u003E\n\u003Cp\u003EAdditionally, you can use \u003Ccode\u003Eid\u003C\/code\u003E, list (\u003Ccode\u003Eint[]\u003C\/code\u003E) and union (\u003Ccode\u003Eint|float\u003C\/code\u003E),\nbut for that you need an \u003Ccode\u003E@Graph\\ParamType\u003C\/code\u003E or \u003Ccode\u003E@Graph\\ReturnType\u003C\/code\u003E annotation for that.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["bundle","graphql","php","symfony"],"hasMore":true,"image":"https:\/\/avris.it\/image\/avris-graphql-bundle_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-graphql-bundle_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-graphql-bundle_mini.png\u0022 alt=\u0022Avris GraphqlBundle\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ESimplify Graphql configuration using plain methods with typehints and annotations.\u003C\/p\u003E\n\u003Cp\u003EThis bundle is a wrapper on \u003Ccode\u003Ewebonyx\/graphql-php\u003C\/code\u003E.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-graphql-bundle_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-graphql-bundle_mini.png\u0022 alt=\u0022Avris GraphqlBundle\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ESimplify Graphql configuration using plain methods with typehints and annotations.\u003C\/p\u003E\n\u003Cp\u003EThis bundle is a wrapper on \u003Ccode\u003Ewebonyx\/graphql-php\u003C\/code\u003E.\u003C\/p\u003E\n\u003Ch3\u003EDisclaimer\u003C\/h3\u003E\n\u003Cp\u003EI\u2019m new to GraphQL, currently writing my first project using it.\nI\u2019m sure that many things are missing from the bundle and many assumptions I made are wrong,\nso please be understanding, and if possible help out with a pull request.\u003C\/p\u003E\n\u003Ch3\u003EInstalation\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-bash\u0022\u003E$ composer require avris\/graphql-bundle\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EThen add a route:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-yaml\u0022\u003Eavris_graphql_main:\n path: \u0027\/graph\u0027\n controller: Avris\\GraphqlBundle\\Controller\\GraphqlController::main\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EExample\u003C\/h3\u003E\n\u003Cp\u003ELet\u2019s say you have the following type in your app:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E\u0026lt;?php\n\nnamespace App\\Entity;\n\nfinal class User\n{\n \/\/ properties, constructor, etc.\n\n private static $type = null;\n\n final public static function type(): ObjectType\n {\n return static::$type ?: static::$type = static::buildType();\n }\n\n private static function buildType(): ObjectType\n {\n return new ObjectType([\n \u0027name\u0027 =\u0026gt; \u0027User\u0027,\n \u0027fields\u0027 =\u0026gt; [\n \u0027id\u0027 =\u0026gt; [\n \u0027type\u0027 =\u0026gt; Type::id(),\n \u0027resolve\u0027 =\u0026gt; function (User $user) {\n return $user-\u0026gt;getId();\n },\n ],\n \u0027email\u0027 =\u0026gt; [\n \u0027type\u0027 =\u0026gt; Type::string(),\n \u0027resolve\u0027 =\u0026gt; function (User $user) {\n return $user-\u0026gt;getEmail();\n },\n ],\n ],\n ]);\n }\n\n public function getId(): string\n {\n return $this-\u0026gt;id;\n }\n\n public function getEmail(): string\n {\n return $this-\u0026gt;email;\n }\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAnd the following GraphQL schema:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003Enew Schema([\n \u0027query\u0027 =\u0026gt; new ObjectType([\n \u0027name\u0027 =\u0026gt; \u0027Query\u0027,\n \u0027fields\u0027 =\u0026gt; [\n \u0027hello\u0027 =\u0026gt; [\n \u0027type\u0027 =\u0026gt; Type::string(),\n \u0027resolve\u0027 =\u0026gt; function () {\n return \u0027GraphQL API\u0027;\n }\n ],\n \u0027user\u0027 =\u0026gt; [\n \u0027type\u0027 =\u0026gt; User::type(),\n \u0027args\u0027 =\u0026gt; [\n \u0027id\u0027 =\u0026gt; [\u0027type\u0027 =\u0026gt; Type::nonNull(Type::id())],\n ],\n \u0027resolve\u0027 =\u0026gt; $this-\u0026gt;accessControl-\u0026gt;guard(function ($root, $args) {\n return $this-\u0026gt;repository-\u0026gt;find($args[\u0027id\u0027]);\n }, \u0027ROLE_ADMIN\u0027),\n ],\n \u0027currentUser\u0027 =\u0026gt; [\n \u0027type\u0027 =\u0026gt; User::type(),\n \u0027resolve\u0027 =\u0026gt; function ($root, $args) {\n $user = $this-\u0026gt;tokenStorage-\u0026gt;getToken()-\u0026gt;getUser();\n\n return $user instanceof User ? $user : null;\n },\n ],\n \u0027jwt\u0027 =\u0026gt; [\n \u0027type\u0027 =\u0026gt; Type::string(),\n \u0027args\u0027 =\u0026gt; [\n \u0027login\u0027 =\u0026gt; Type::nonNull(Type::string()),\n \u0027password\u0027 =\u0026gt; Type::nonNull(Type::string()),\n ],\n \u0027resolve\u0027 =\u0026gt; function ($root, $args) {\n $user = $this-\u0026gt;repository-\u0026gt;findOneBy([\u0027email\u0027 =\u0026gt; $args[\u0027login\u0027]]);\n\n if (!$user || !$this-\u0026gt;encoder-\u0026gt;isPasswordValid($user, $args[\u0027password\u0027])) {\n return null;\n }\n\n return (string) $this-\u0026gt;jwtManager-\u0026gt;issue($user);\n },\n ]\n ],\n ]),\n \u0027mutation\u0027 =\u0026gt; new ObjectType([\n \u0027name\u0027 =\u0026gt; \u0027Mutation\u0027,\n \u0027fields\u0027 =\u0026gt; [\n \u0027userRegistered\u0027 =\u0026gt; [\n \u0027type\u0027 =\u0026gt; User::type(),\n \u0027args\u0027 =\u0026gt; [\n \u0027email\u0027 =\u0026gt; Type::nonNull(Type::string()),\n \u0027password\u0027 =\u0026gt; Type::nonNull(Type::string()),\n ],\n \u0027resolve\u0027 =\u0026gt; function ($root, $args) {\n return $this-\u0026gt;eventDispatcher-\u0026gt;dispatch(new UserRegisteredEvent($args[\u0027email\u0027], $args[\u0027password\u0027]));\n },\n ]\n ],\n ]),\n]);\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EUsing this bundle, you can rewrite the entity\/type like this:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E\u0026lt;?php\n\nnamespace App\\Entity;\n\nuse Avris\\GraphqlBundle\\Annotation as Graphql;\n\n\/**\n * @Graphql\\Type\n *\/\nfinal class User\n{\n \/\/ properties, constructor, etc.\n\n \/**\n * @Graphql\\Query\n *\/\n public function getId(): string\n {\n return $this-\u0026gt;id;\n }\n\n \/**\n * @Graphql\\Query\n *\/\n public function getEmail(): string\n {\n return $this-\u0026gt;email;\n }\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAnd your schema\/controllers like this:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E\u0026lt;?php\n\nnamespace App\\Controller;\n\nuse Avris\\GraphqlBundle\\Annotation as Graphql;\nuse Symfony\\Bundle\\FrameworkBundle\\Controller\\AbstractController;\n\nfinal class HomeController extends AbstractController\n{\n \/**\n * @Graphql\\Query\n *\/\n public function hello(): string\n {\n return \u0027GraphQL API\u0027;\n }\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Eand:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E\u0026lt;?php\n\nnamespace App\\Controller;\n\nuse Avris\\GraphqlBundle\\Annotation as Graphql;\nuse App\\Entity\\User;\nuse App\\Events\\UserRegistered;\n\nfinal class UserController extends BaseController\n{\n \/\/ dependecies...\n\n \/**\n * @Graphql\\Query\n * @Graphql\\Security(\u0022ROLE_ADMIN\u0022)\n * @Graphql\\ParamType(\u0022id\u0022, var=\u0022id\u0022)\n *\/\n public function user(string $id): ?User\n {\n return $this-\u0026gt;repository-\u0026gt;find($id);\n }\n\n \/**\n * @Graphql\\Query\n *\/\n public function currentUser(): ?User\n {\n $user = $this-\u0026gt;tokenStorage-\u0026gt;getToken()-\u0026gt;getUser();\n\n return $user instanceof User ? $user : null;\n }\n\n \/**\n * @Graphql\\Query\n *\/\n public function jwt(string $login, string $password): ?string\n {\n $user = $this-\u0026gt;repository-\u0026gt;findOneBy([\u0027email\u0027 =\u0026gt; $login]);\n\n if (!$user || !$this-\u0026gt;encoder-\u0026gt;isPasswordValid($user, $password)) {\n return null;\n }\n\n return (string) $this-\u0026gt;jwtManager-\u0026gt;issue($user);\n }\n\n \/**\n * @Graphql\\Query(\u0022mutation\u0022)\n *\/\n public function userRegistered(string $email, string $password): User\n {\n return $this-\u0026gt;eventDispatcher-\u0026gt;dispatch(new UserRegisteredEvent($email, $password));\n }\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EThe bundle will parse all the classes in \u003Ccode\u003Esrc\/Controller\u003C\/code\u003E and \u003Ccode\u003Esrc\/Entity\u003C\/code\u003E\n(that list can be configured in the config key \u003Ccode\u003Eavris_graphql.load\u003C\/code\u003E)\nlooking for the \u003Ccode\u003EGraphql\u003C\/code\u003E annotations.\u003C\/p\u003E\n\u003Cp\u003EAll parameters of a query-method, as well as its return type have to be typehinted.\nSupported built-in types are \u003Ccode\u003Estring\u003C\/code\u003E, \u003Ccode\u003Ebool\u003C\/code\u003E, \u003Ccode\u003Eint\u003C\/code\u003E and \u003Ccode\u003Efloat\u003C\/code\u003E.\nYou can also typehint any type you registered with \u003Ccode\u003E@Graphql\\Type\u003C\/code\u003E.\u003C\/p\u003E\n\u003Cp\u003EAdditionally, you can use \u003Ccode\u003Eid\u003C\/code\u003E, list (\u003Ccode\u003Eint[]\u003C\/code\u003E) and union (\u003Ccode\u003Eint|float\u003C\/code\u003E),\nbut for that you need an \u003Ccode\u003E@Graph\\ParamType\u003C\/code\u003E or \u003Ccode\u003E@Graph\\ReturnType\u003C\/code\u003E annotation for that.\u003C\/p\u003E","words":680,"readTime":3,"lang":"en"}}},"projects\/daemonise":{"key":"projects\/daemonise","type":"article","published":true,"meta":{"createdAt":"2018-08-11T11:49:57+02:00","publishedAt":"2018-08-11T11:48:00+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/www.npmjs.com\/package\/avris-daemonise","displayUrl":"npm: avris-daemonise"},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Daemonise","displayUrl":null}],"category":"projects","subcategory":null,"slug":"daemonise"},"content":{"en":{"slug":"daemonise","title":"Daemonise","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-daemonise_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022256\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAATCAYAAAD4f6+NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACVUlEQVRIie2VS4\/TMBSFv2s7ryZNSzswIAYk2A\/\/\/1+wQfwAQIBmaOkrTeIkviw6rZgFQuIhuuBsrGvJ9vG5x8fyKnupnBGc6lnxwQnyrzncg1POTCHOTSE5Lz64Y8fGzxzx2CIO6IXmxmGzOWIdoWsJCtYYxEUM3oMRrLEkw55sXLBeLLEuotps8L4HBWOFEALGmNOoqqjqoRaDomgIaDgSulOoMJdE3jEpZjR1xXa0Y34xBuuo1gGMpSxz2qZht\/XU+z2Pn15SV1A+mJLEMdYZ1mmCixxplqFhIARFREAMeZGxuF3Q7Gvmj+b4tqecjnn7+g2+9QDIdXrIoYvLC6yziBhAcdHhtnE2wlmDbz1hGOj7gXI2pd3vcVGEquLbjihyuNihQem6jiiO2e8qjLV0bUvfD+Tj\/G7fLQpMHkwBZfN1zWa1PSgkcuhZCIEiL+i7QDpKWH1ZkpclWT7i87sP5JMSEWFUFvTes1quEOOYzUuaugZSFGXoe+IkYbX4Suc909mMwRosQpql3H66oW0aAHbrzck7Ry\/LdfpCAZ48v0JDT5yO8HXFerVFgBAUUJq6+RsePpE55rM7TlbckEwsbbRGE8G1DjeagY3QriUK4NydqduDqY0xxF1FPilZL5bEScKn9x9\/i9yJ0Cy5Yjqe4NuBwXrmV5ZquyMrEgwRdd3gnMMYQYqc5Zcljy8fsrz1VJsdwxBY3i5+iwyAXGeHlglgjEUBDQF+kOAiBj2+UQQR+a7+dRxPO+WQAsMw\/HzhvcMPmfIn4c7s5\/j\/2\/8UZ6fQN+aNGGDFN9nmAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-daemonise_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022256\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EUse this library to run any process in the background without blocking the console. It will start a child process, detach it, and save its PID to a file in order to be able to stop it later.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-daemonise_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022480\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAATCAYAAAD4f6+NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACVUlEQVRIie2VS4\/TMBSFv2s7ryZNSzswIAYk2A\/\/\/1+wQfwAQIBmaOkrTeIkviw6rZgFQuIhuuBsrGvJ9vG5x8fyKnupnBGc6lnxwQnyrzncg1POTCHOTSE5Lz64Y8fGzxzx2CIO6IXmxmGzOWIdoWsJCtYYxEUM3oMRrLEkw55sXLBeLLEuotps8L4HBWOFEALGmNOoqqjqoRaDomgIaDgSulOoMJdE3jEpZjR1xXa0Y34xBuuo1gGMpSxz2qZht\/XU+z2Pn15SV1A+mJLEMdYZ1mmCixxplqFhIARFREAMeZGxuF3Q7Gvmj+b4tqecjnn7+g2+9QDIdXrIoYvLC6yziBhAcdHhtnE2wlmDbz1hGOj7gXI2pd3vcVGEquLbjihyuNihQem6jiiO2e8qjLV0bUvfD+Tj\/G7fLQpMHkwBZfN1zWa1PSgkcuhZCIEiL+i7QDpKWH1ZkpclWT7i87sP5JMSEWFUFvTes1quEOOYzUuaugZSFGXoe+IkYbX4Suc909mMwRosQpql3H66oW0aAHbrzck7Ry\/LdfpCAZ48v0JDT5yO8HXFerVFgBAUUJq6+RsePpE55rM7TlbckEwsbbRGE8G1DjeagY3QriUK4NydqduDqY0xxF1FPilZL5bEScKn9x9\/i9yJ0Cy5Yjqe4NuBwXrmV5ZquyMrEgwRdd3gnMMYQYqc5Zcljy8fsrz1VJsdwxBY3i5+iwyAXGeHlglgjEUBDQF+kOAiBj2+UQQR+a7+dRxPO+WQAsMw\/HzhvcMPmfIn4c7s5\/j\/2\/8UZ6fQN+aNGGDFN9nmAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-daemonise_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022480\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EUse this library to run any process in the background without blocking the console. It will start a child process, detach it, and save its PID to a file in order to be able to stop it later.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["background","daemon","detach","javascript","js","nodejs","process","server"],"hasMore":false,"image":"https:\/\/avris.it\/image\/avris-daemonise_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-daemonise_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-daemonise_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022128\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EUse this library to run any process in the background without blocking the console. It will start a child process, detach it, and save its PID to a file in order to be able to stop it later.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-daemonise_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-daemonise_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022128\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EUse this library to run any process in the background without blocking the console. It will start a child process, detach it, and save its PID to a file in order to be able to stop it later.\u003C\/p\u003E","words":38,"readTime":null,"lang":"en"}}},"projects\/avris-dojo":{"key":"projects\/avris-dojo","type":"article","published":true,"meta":{"createdAt":"2018-03-25T16:15:20+02:00","publishedAt":"2018-03-25T16:14:00+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/dojo.avris.it\/","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-dojo"},"content":{"en":{"slug":"avris-dojo","title":"Avris Dojo","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-dojo_small.png\u0022 alt=\u0022Avris Dojo\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022284.66876971609\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAVCAYAAAAuJkyQAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF20lEQVRIiWWWy69cRxHGf1Xd55yZuXfuw49rrklEggheRFiABCsiESkbVghYsYQVbBB\/Qf4BVixRNpFYsvECiQVCgMJDQohH5IhYUewY4mD8GPt6XufVVSz6zNwhjNSq03161N\/5vq+qWm786HsuAiKgIgg5qoAgwzqo5j1hmO\/GIBAUggpRIQQhBghBCTEQYyDEiIQAIrg5bglLidT1pD7R90afIBaatgfvgpINqO36AILNEAI7gIYRFaIqMSixUGJVEMoKrcZoOYJQQOqxrsaaNdbWdI2jYqgkYsDOgWwA7LI0gJANkI+ztAMqilBIZidGJZZKHJWE\/SN0\/wpSXcDjBEkNdGfY4j5p8RghkUioOzFqj7DLhmwP\/3jcsJKfPc8FAhAFgghBlahCjBDLSJzsowdX8b0XSKMTCGOwDmkeo6ECSYh1iLWQnBg8ZYmGA8XPJVLfYWu7xwdQGVyMFZPTa8RqjD39AKln2UMFhKpA9g7x6jI2+gQ+OgJRcMc1Qr9Cx0+gPiO2ggcjRu8yQ8OB\/8+O7PhmI1te23\/uOidf\/T5ajLD6GVKMaO\/8lu7WDVQMCY6EgEseILg7ACIBJILGTK8aQRJRU7f1ycZHW+9s5PPzuQ4SlQcnXHnthzT3\/s7Z736C9EuqC59k\/8vfQT71FdL9PwAdeAP9Eto5HqpsakvQzqGfg63AmiyjdUT6bqBGcDI1LgBgIqg4vmv4gcbpS6+ACLNf\/RhNazQINvsn9V9+yuiL3yZ9+Gu8XeDNY0RHhLViaYWHMViLtjO0\/QhvH+HtHPoaUke0rkNE8C0j2TgbdhBwwNWxTQoKhMkFrJ6TlmegkgEFof\/Pe4gU2GqFeA\/eIf0KGc3Qego6AuvAFng7wxaP8PkCXzd43RP7rh+MS2aCzJDjuAo2vLOdVHdxmod3mb78GsXla7T3bm5rQBhfpX\/4Pr5cQ9dibYOsl8j4IVIOknnCmxpfr7dAvO5JrRGbuj\/PKhkybai8gp+vDz4zzc+P\/vxzjr\/0LU6+\/jr\/euO7dKsnUJZMXnyF1du\/gGVLaBVpO2RdQ7FA4vBnc0iGdwlvDW+NvjNSb8SuS4OZfcuAiOCaU9y3kg3esiHOZ9x58wccvvwqMjmiOL5KeXzK8r3f449vE4JgJoSkaAcSFN9UVnM8OZ6M1Dmpd1IyUnJimxwV38qW2cprYTBzEEcT\/8PW5OIpz\/79AfXZz6BbU06PKJ49Ij39iGK0h7RrArbtgapCUSpxr8T7RD1v6ZNj5iSDlJzenNjZAIRzWWRorCq+I6dv309PX2Ty6c+DJ8rJFGuWNA9u4+N9Dq5\/jfTsAWk5Y\/7ub7YfEAJMi4o4KaCGtkss645kWUEbYuxdh8TxXKUhy8cOKHZBO+2Hd3hy7\/Z5PwuKekIF4j\/+SLV\/TFo8Ak+IOEFgXAWkisiFI6gbwmxNv2xpewdR3AVDiAklZ\/oAQhx8SH9ADA5PX6AoK8rJPv16QYwFqor1DaJKjAFVxds1xWhMu5qjFw\/x1BGrCd6vqC5fwZt3c+MpR1AEzKFNGxYUESWikai5pAvnI5d4x3Ge3r+LDHPZ2adsJLUte0L2XN5jCE5Uxx+\/T3n1gHh2BjipTyRzRCOJwNN5w2LVEG+89Tde\/cI1Ti8eMeQTuIEb7o6ZDfMMUobD8r4NaMGxzLTk5QxIhmYshHCeEdYnHOhcuXl3xsOzFeumQxVi3\/f88k83qYrI3jgiCIvVmv1xRRkDlw6nfOa5KxzujXCzzBIZYPadDUB1+0EZtOZMxahKiDHmdpQSfdvxcN7y1jv3qNseRCgKzVefb16\/5Plr2NYigcwK4EP87POnXD6aslyt2RuXXD6csjcqtmxu2BI8lwnNkgYx9krh+KBg\/7AkFcKtOzPefucBXTKSOyKSryUI8o3PXfLNnXnTy7L2+Zejb6MOfQ6MURG5dDjl5OiAl54\/QTwzGMQJKgQ12qbh4rSkLGC2qvnrrfs0bcLcMQZ5B0Mjwn8BPTrtWGhicvgAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-dojo_small.png\u0022 alt=\u0022Avris Dojo\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022284.66876971609\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA Coding Dojo is a great way to practise programming, test-driven development, teamwork, pair programming and problem solving. Avris Dojo provides an easy way to synchronise your dojo codebase with your teammates.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-dojo_big.png\u0022 alt=\u0022Avris Dojo\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022569.33753943218\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAVCAYAAAAuJkyQAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF20lEQVRIiWWWy69cRxHGf1Xd55yZuXfuw49rrklEggheRFiABCsiESkbVghYsYQVbBB\/Qf4BVixRNpFYsvECiQVCgMJDQohH5IhYUewY4mD8GPt6XufVVSz6zNwhjNSq03161N\/5vq+qWm786HsuAiKgIgg5qoAgwzqo5j1hmO\/GIBAUggpRIQQhBghBCTEQYyDEiIQAIrg5bglLidT1pD7R90afIBaatgfvgpINqO36AILNEAI7gIYRFaIqMSixUGJVEMoKrcZoOYJQQOqxrsaaNdbWdI2jYqgkYsDOgWwA7LI0gJANkI+ztAMqilBIZidGJZZKHJWE\/SN0\/wpSXcDjBEkNdGfY4j5p8RghkUioOzFqj7DLhmwP\/3jcsJKfPc8FAhAFgghBlahCjBDLSJzsowdX8b0XSKMTCGOwDmkeo6ECSYh1iLWQnBg8ZYmGA8XPJVLfYWu7xwdQGVyMFZPTa8RqjD39AKln2UMFhKpA9g7x6jI2+gQ+OgJRcMc1Qr9Cx0+gPiO2ggcjRu8yQ8OB\/8+O7PhmI1te23\/uOidf\/T5ajLD6GVKMaO\/8lu7WDVQMCY6EgEseILg7ACIBJILGTK8aQRJRU7f1ycZHW+9s5PPzuQ4SlQcnXHnthzT3\/s7Z736C9EuqC59k\/8vfQT71FdL9PwAdeAP9Eto5HqpsakvQzqGfg63AmiyjdUT6bqBGcDI1LgBgIqg4vmv4gcbpS6+ACLNf\/RhNazQINvsn9V9+yuiL3yZ9+Gu8XeDNY0RHhLViaYWHMViLtjO0\/QhvH+HtHPoaUke0rkNE8C0j2TgbdhBwwNWxTQoKhMkFrJ6TlmegkgEFof\/Pe4gU2GqFeA\/eIf0KGc3Qego6AuvAFng7wxaP8PkCXzd43RP7rh+MS2aCzJDjuAo2vLOdVHdxmod3mb78GsXla7T3bm5rQBhfpX\/4Pr5cQ9dibYOsl8j4IVIOknnCmxpfr7dAvO5JrRGbuj\/PKhkybai8gp+vDz4zzc+P\/vxzjr\/0LU6+\/jr\/euO7dKsnUJZMXnyF1du\/gGVLaBVpO2RdQ7FA4vBnc0iGdwlvDW+NvjNSb8SuS4OZfcuAiOCaU9y3kg3esiHOZ9x58wccvvwqMjmiOL5KeXzK8r3f449vE4JgJoSkaAcSFN9UVnM8OZ6M1Dmpd1IyUnJimxwV38qW2cprYTBzEEcT\/8PW5OIpz\/79AfXZz6BbU06PKJ49Ij39iGK0h7RrArbtgapCUSpxr8T7RD1v6ZNj5iSDlJzenNjZAIRzWWRorCq+I6dv309PX2Ty6c+DJ8rJFGuWNA9u4+N9Dq5\/jfTsAWk5Y\/7ub7YfEAJMi4o4KaCGtkss645kWUEbYuxdh8TxXKUhy8cOKHZBO+2Hd3hy7\/Z5PwuKekIF4j\/+SLV\/TFo8Ak+IOEFgXAWkisiFI6gbwmxNv2xpewdR3AVDiAklZ\/oAQhx8SH9ADA5PX6AoK8rJPv16QYwFqor1DaJKjAFVxds1xWhMu5qjFw\/x1BGrCd6vqC5fwZt3c+MpR1AEzKFNGxYUESWikai5pAvnI5d4x3Ge3r+LDHPZ2adsJLUte0L2XN5jCE5Uxx+\/T3n1gHh2BjipTyRzRCOJwNN5w2LVEG+89Tde\/cI1Ti8eMeQTuIEb7o6ZDfMMUobD8r4NaMGxzLTk5QxIhmYshHCeEdYnHOhcuXl3xsOzFeumQxVi3\/f88k83qYrI3jgiCIvVmv1xRRkDlw6nfOa5KxzujXCzzBIZYPadDUB1+0EZtOZMxahKiDHmdpQSfdvxcN7y1jv3qNseRCgKzVefb16\/5Plr2NYigcwK4EP87POnXD6aslyt2RuXXD6csjcqtmxu2BI8lwnNkgYx9krh+KBg\/7AkFcKtOzPefucBXTKSOyKSryUI8o3PXfLNnXnTy7L2+Zejb6MOfQ6MURG5dDjl5OiAl54\/QTwzGMQJKgQ12qbh4rSkLGC2qvnrrfs0bcLcMQZ5B0Mjwn8BPTrtWGhicvgAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-dojo_big.png\u0022 alt=\u0022Avris Dojo\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022569.33753943218\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA Coding Dojo is a great way to practise programming, test-driven development, teamwork, pair programming and problem solving. Avris Dojo provides an easy way to synchronise your dojo codebase with your teammates.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["coding","cooperation","dojo","interview","practise","programming","tdd","team"],"hasMore":false,"image":"https:\/\/avris.it\/image\/avris-dojo_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-dojo_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-dojo_mini.png\u0022 alt=\u0022Avris Dojo\u0022 width=\u0022240\u0022 height=\u0022142.33438485804\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA Coding Dojo is a great way to practise programming, test-driven development, teamwork, pair programming and problem solving. Avris Dojo provides an easy way to synchronise your dojo codebase with your teammates.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-dojo_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-dojo_mini.png\u0022 alt=\u0022Avris Dojo\u0022 width=\u0022240\u0022 height=\u0022142.33438485804\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA Coding Dojo is a great way to practise programming, test-driven development, teamwork, pair programming and problem solving. Avris Dojo provides an easy way to synchronise your dojo codebase with your teammates.\u003C\/p\u003E","words":32,"readTime":null,"lang":"en"}}},"projects\/vanillin":{"key":"projects\/vanillin","type":"article","published":true,"meta":{"createdAt":"2018-02-10T22:05:06+01:00","publishedAt":"2018-02-10T22:03:00+01:00","group":"vanillin","links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/www.npmjs.com\/package\/avris-vanillin","displayUrl":"npm: avris-vanillin"},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Vanillin","displayUrl":null}],"category":"projects","subcategory":null,"slug":"vanillin"},"content":{"en":{"slug":"vanillin","title":"Vanillin \u2013 Almost like vanilla JavaScript","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/vanillin_small.png\u0022 alt=\u0022Vanillin.js\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022269.94727592267\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADvElEQVRIie2VXUxbZRjHf+05W6nAYGXyjXQQBwlpJpQLGwxZIioGF73QeGMiMSaGRA3BmV15YbhYxAuucLvQxCySJYZENgwKk5oomYUOSIflK5J+WAqF5qwttKctpz1eWBAZSxZDvdo\/eXPe\/J8n7\/N7P877wmP9B83Pzz8zPT39bnt7+4vOmpp+f23t+qzRaL9WVtac7driYWN2dva5qqqqn3t7e0WDwUCiuJhSQaBQkkpXUqnvns\/NPTsRjSrZAtIeNhRFeXloaEjc3t6mtbWVqYYG0GpJqioyVAqiaMgWzJFANpvt5vj4eDKVSiHLMo4TJ\/g+HOY3Wcaxu3tXCoc3\/xeg1dXVdo\/HY19cXPw8Ho\/vCILAxsYGoVCIr8vKKLp6lS6rNe\/D69efzSaQCNDd3S0WFBTcGBgYKEylUpSXl1NcXExlZSWRSARtURHeWIzXzp2rX1he\/gpoeISxtUCaf85pOtOOyvk3UCwWY2JiQlxYWKClpYWcnBwmJydxu900NTWRm5vL6OgoJpMJt9t9cLBPgSvA+8A3wCaQl4m3AaeACPACsAhcAwqBDaAUuACMA3EgBiAAzMzMpGVZTgiC8FIymWR9fZ1AIICiKMiyjN\/vJxAI8NPt27GNQOBNp9PpBVTgdeAs4AI+AFqBtzP+\/cyEt4Fa4EnAnImFgJ1M\/hXADqztA42MjDyh0+k+iUQiNRaLhWQySTQaRa\/X09jYiCiKvOJw0Ol2a8rcbvG0VvuDPR5PAT6gDxgA3gCimUL3MyASYATqM34UuMvfW14C5APhTP+X\/S2rrq5+p7m5ua2np4elpSUkScJiseDz+YhEItT6fHSk01BUJMrBYGeJXm8nFPoCuAeYgCTwauZ7UGke\/JP3vE7ABsxmVox9IJfLRUVFBWazGavVisFgYHd3F0VRsNvt5IfDfHvmDClVJZFIIMXjTx8osAcR42gdPsh73pdHJQsAer3+XiAQMMZisbzTd+7IHwWD+TUuF6LXy1MdHbzV10eivh5rMMif5eVcvHw52WQ2\/zg2NrbzEIjj04zR+Gvq\/Hk13damBk0mVdraUtPptCrLstrf369OTU2p8XhcHRwcvJGN+g\/c1CuKsuLZ2WHL62UhGuX3uTlCoRDLy8s4HA7q6uqQJAm\/35+VJ0Q4bJScPGnzqGqjQ1GM2y0tGoxGbt66xfDwMC6XC41Gg81m887NzXU5nc614wbSPCzw8aVLF04VFHT5fD6nTqebXFtbe8\/j8fzh9Xo\/29zcjBw3yGM9qv4CsPqrHrao4OAAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/vanillin_small.png\u0022 alt=\u0022Vanillin.js\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022269.94727592267\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EjQuery used to be virtually indispensable,\nif you wanted to develop a cross-browser website without getting a headache.\u003C\/p\u003E\n\u003Cp\u003EToday, however, you might not need jQuery,\nespecially, if you\u2019re developing a library and want to avoid unnecessary dependencies.\u003C\/p\u003E\n\u003Cp\u003EStill, some helpers could be useful...\nVanillin is an opinionated set of helpers\nthat I find most useful, a bare minimum to make life easier.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/vanillin_big.png\u0022 alt=\u0022Vanillin.js\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022539.89455184534\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADvElEQVRIie2VXUxbZRjHf+05W6nAYGXyjXQQBwlpJpQLGwxZIioGF73QeGMiMSaGRA3BmV15YbhYxAuucLvQxCySJYZENgwKk5oomYUOSIflK5J+WAqF5qwttKctpz1eWBAZSxZDvdo\/eXPe\/J8n7\/N7P877wmP9B83Pzz8zPT39bnt7+4vOmpp+f23t+qzRaL9WVtac7driYWN2dva5qqqqn3t7e0WDwUCiuJhSQaBQkkpXUqnvns\/NPTsRjSrZAtIeNhRFeXloaEjc3t6mtbWVqYYG0GpJqioyVAqiaMgWzJFANpvt5vj4eDKVSiHLMo4TJ\/g+HOY3Wcaxu3tXCoc3\/xeg1dXVdo\/HY19cXPw8Ho\/vCILAxsYGoVCIr8vKKLp6lS6rNe\/D69efzSaQCNDd3S0WFBTcGBgYKEylUpSXl1NcXExlZSWRSARtURHeWIzXzp2rX1he\/gpoeISxtUCaf85pOtOOyvk3UCwWY2JiQlxYWKClpYWcnBwmJydxu900NTWRm5vL6OgoJpMJt9t9cLBPgSvA+8A3wCaQl4m3AaeACPACsAhcAwqBDaAUuACMA3EgBiAAzMzMpGVZTgiC8FIymWR9fZ1AIICiKMiyjN\/vJxAI8NPt27GNQOBNp9PpBVTgdeAs4AI+AFqBtzP+\/cyEt4Fa4EnAnImFgJ1M\/hXADqztA42MjDyh0+k+iUQiNRaLhWQySTQaRa\/X09jYiCiKvOJw0Ol2a8rcbvG0VvuDPR5PAT6gDxgA3gCimUL3MyASYATqM34UuMvfW14C5APhTP+X\/S2rrq5+p7m5ua2np4elpSUkScJiseDz+YhEItT6fHSk01BUJMrBYGeJXm8nFPoCuAeYgCTwauZ7UGke\/JP3vE7ABsxmVox9IJfLRUVFBWazGavVisFgYHd3F0VRsNvt5IfDfHvmDClVJZFIIMXjTx8osAcR42gdPsh73pdHJQsAer3+XiAQMMZisbzTd+7IHwWD+TUuF6LXy1MdHbzV10eivh5rMMif5eVcvHw52WQ2\/zg2NrbzEIjj04zR+Gvq\/Hk13damBk0mVdraUtPptCrLstrf369OTU2p8XhcHRwcvJGN+g\/c1CuKsuLZ2WHL62UhGuX3uTlCoRDLy8s4HA7q6uqQJAm\/35+VJ0Q4bJScPGnzqGqjQ1GM2y0tGoxGbt66xfDwMC6XC41Gg81m887NzXU5nc614wbSPCzw8aVLF04VFHT5fD6nTqebXFtbe8\/j8fzh9Xo\/29zcjBw3yGM9qv4CsPqrHrao4OAAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/vanillin_big.png\u0022 alt=\u0022Vanillin.js\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022539.89455184534\u0022\u003E\u003C\/span\u003E\n \u003Cfigcaption\u003E\n \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Vanillin#\/media\/File:Vanillin-3d.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\n \u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E\n en.wikipedia.org\/wiki\/Vanillin#\/media\/File:Vanillin-3d.png\n \u003C\/a\u003E\n \u003C\/figcaption\u003E\n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EjQuery used to be virtually indispensable,\nif you wanted to develop a cross-browser website without getting a headache.\u003C\/p\u003E\n\u003Cp\u003EToday, however, you might not need jQuery,\nespecially, if you\u2019re developing a library and want to avoid unnecessary dependencies.\u003C\/p\u003E\n\u003Cp\u003EStill, some helpers could be useful...\nVanillin is an opinionated set of helpers\nthat I find most useful, a bare minimum to make life easier.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["helper","javascript","js","library","programming","vanilla"],"hasMore":false,"image":"https:\/\/avris.it\/image\/vanillin_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/vanillin_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/vanillin_mini.png\u0022 alt=\u0022Vanillin.js\u0022 width=\u0022240\u0022 height=\u0022134.97363796134\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EjQuery used to be virtually indispensable,\nif you wanted to develop a cross-browser website without getting a headache.\u003C\/p\u003E\n\u003Cp\u003EToday, however, you might not need jQuery,\nespecially, if you\u2019re developing a library and want to avoid unnecessary dependencies.\u003C\/p\u003E\n\u003Cp\u003EStill, some helpers could be useful...\nVanillin is an opinionated set of helpers\nthat I find most useful, a bare minimum to make life easier.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/vanillin_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/vanillin_mini.png\u0022 alt=\u0022Vanillin.js\u0022 width=\u0022240\u0022 height=\u0022134.97363796134\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003Cfigcaption\u003E\n \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Vanillin#\/media\/File:Vanillin-3d.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csmall\u003Een.wikipedia.org\/wiki\/Vanillin#\/media\/File:Vanillin-3d.png\u003C\/small\u003E\u003C\/a\u003E\n \u003C\/figcaption\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EjQuery used to be virtually indispensable,\nif you wanted to develop a cross-browser website without getting a headache.\u003C\/p\u003E\n\u003Cp\u003EToday, however, you might not need jQuery,\nespecially, if you\u2019re developing a library and want to avoid unnecessary dependencies.\u003C\/p\u003E\n\u003Cp\u003EStill, some helpers could be useful...\nVanillin is an opinionated set of helpers\nthat I find most useful, a bare minimum to make life easier.\u003C\/p\u003E","words":73,"readTime":null,"lang":"en"}}},"projects\/twitler":{"key":"projects\/twitler","type":"article","published":true,"meta":{"createdAt":"2018-01-31T19:40:40+01:00","publishedAt":"2018-01-31T22:39:00+01:00","group":"chrome-extensions","links":[{"icon":"brands chrome","colour":"primary","url":"https:\/\/chrome.google.com\/webstore\/detail\/ocamlipdmiooemncfblabcceccikkhnf","displayUrl":"Chrome Extension"},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Twitler","displayUrl":null}],"category":"projects","subcategory":null,"slug":"twitler"},"content":{"en":{"slug":"twitler","title":"Twitler","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/twitler_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022300\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAWCAYAAACosj4+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC30lEQVRIiaWWT08TQRjGfzO7ZUtLpZYCQRLwH1rjwaBGMcQY+AaeTbxx8RN49AP4DTxx8WqiF8\/ERKOJKAYNchAj1JiUPypI2basBzrd2els\/4RT386z8+w7z\/vO+6xYGBoKhADhAC4IJ0C4R\/\/NGBW7QX0tjNHXFY8Rt+KnvlcKAcg6oayTyDBGAjKo43USeRTjBOFeta546rHaa+NH8WuckgZJ+Kte0sBMvPECDbPgtMFt+2Wnp8UxlOrgtLFqSoPfCfllhKQLuYWWgK2cQkugLb\/GKU010NQwExBaAlgSsJfL4Hda88uwHKpczbWN4LITPIjwtNxv4PLYcrcrp6WfIvyGgjKu+dQDiVyexMAgTl8mQpK6cBW3fyCSjDd6kezMHCKRaFHOKH94i4NQoVCN5nKcnL3L+cfPyUzepic\/jHAE3ug50oUp3P4cTjrD6IN5UoVpavubpC\/NIr0ehBQkx6\/hZHIIr5fk+BQ9Q4Xm22XMOdcmt968pRdPOHFjhr3lVwzfe0h1u4ibzSNTfXjb3yj727jZYRKDY\/i\/ljj090DCian7pCbuIHuz7C49JXn6Fvtfn1H78yXSd2Y\/yU5mCcBh+Tfpy9OkCjcpf\/\/I\/uobvJEJgsCnUlqjuvMDqMKhf6RMOofw0hwU3yEk+BuvKa8vxM4q1QrO3KnUI5s3qRgHan9LVEpr+MUVdj+85KC4jP\/zMz0jZ6lurXGw\/p7kmUkqpRX84iLe2BV2F+cRMqCytUpl8xO1fxsElZ0mv8P0vrfX84FphMSYq2mEsUZrM1ebSevrDXM1Rrd9lrSxBu32xFqD0byNhHVbkdot62qWqJPGzBKlmM0aIn1j2paj5lC31iBbzxKlhmijhs3EZbej3YrLLnEnHpdNcpvWYJP7uOWUBr+moIz7LrENSxEn93HLqdlW1Dqa5A5ojddfZC1HsxpmP+kHVM0tbXLbR3vcaYk5rQ1XCRrfTBr+H89kM5HVov2eAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/twitler_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022300\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA Chrome extension that replaces \u201cDonald Trump\u201d on all websites with \u201cTwitler\u201d.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/twitler_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022640\u0022 height=\u0022400\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAWCAYAAACosj4+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC30lEQVRIiaWWT08TQRjGfzO7ZUtLpZYCQRLwH1rjwaBGMcQY+AaeTbxx8RN49AP4DTxx8WqiF8\/ERKOJKAYNchAj1JiUPypI2basBzrd2els\/4RT386z8+w7z\/vO+6xYGBoKhADhAC4IJ0C4R\/\/NGBW7QX0tjNHXFY8Rt+KnvlcKAcg6oayTyDBGAjKo43USeRTjBOFeta546rHaa+NH8WuckgZJ+Kte0sBMvPECDbPgtMFt+2Wnp8UxlOrgtLFqSoPfCfllhKQLuYWWgK2cQkugLb\/GKU010NQwExBaAlgSsJfL4Hda88uwHKpczbWN4LITPIjwtNxv4PLYcrcrp6WfIvyGgjKu+dQDiVyexMAgTl8mQpK6cBW3fyCSjDd6kezMHCKRaFHOKH94i4NQoVCN5nKcnL3L+cfPyUzepic\/jHAE3ug50oUp3P4cTjrD6IN5UoVpavubpC\/NIr0ehBQkx6\/hZHIIr5fk+BQ9Q4Xm22XMOdcmt968pRdPOHFjhr3lVwzfe0h1u4ibzSNTfXjb3yj727jZYRKDY\/i\/ljj090DCian7pCbuIHuz7C49JXn6Fvtfn1H78yXSd2Y\/yU5mCcBh+Tfpy9OkCjcpf\/\/I\/uobvJEJgsCnUlqjuvMDqMKhf6RMOofw0hwU3yEk+BuvKa8vxM4q1QrO3KnUI5s3qRgHan9LVEpr+MUVdj+85KC4jP\/zMz0jZ6lurXGw\/p7kmUkqpRX84iLe2BV2F+cRMqCytUpl8xO1fxsElZ0mv8P0vrfX84FphMSYq2mEsUZrM1ebSevrDXM1Rrd9lrSxBu32xFqD0byNhHVbkdot62qWqJPGzBKlmM0aIn1j2paj5lC31iBbzxKlhmijhs3EZbej3YrLLnEnHpdNcpvWYJP7uOWUBr+moIz7LrENSxEn93HLqdlW1Dqa5A5ojddfZC1HsxpmP+kHVM0tbXLbR3vcaYk5rQ1XCRrfTBr+H89kM5HVov2eAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/twitler_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022640\u0022 height=\u0022400\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA Chrome extension that replaces \u201cDonald Trump\u201d on all websites with \u201cTwitler\u201d.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["chrome","donald trump","extension","twitler","twitter"],"hasMore":false,"image":"https:\/\/avris.it\/image\/twitler_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/twitler_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/twitler_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022150\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA Chrome extension that replaces \u201cDonald Trump\u201d on all websites with \u201cTwitler\u201d.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/twitler_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/twitler_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022150\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA Chrome extension that replaces \u201cDonald Trump\u201d on all websites with \u201cTwitler\u201d.\u003C\/p\u003E","words":12,"readTime":null,"lang":"en"}}},"projects\/micrus-v4":{"key":"projects\/micrus-v4","type":"article","published":true,"meta":{"createdAt":"2018-01-28T12:45:41+01:00","publishedAt":"2018-01-28T12:40:00+01:00","group":"micrus","links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/micrus.avris.it","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Micrus","displayUrl":null}],"category":"projects","subcategory":null,"slug":"micrus-v4"},"content":{"en":{"slug":"micrus-v4","title":"Micrus v4 \u2022 Beauty of simplicity","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/micrus-demo_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022279.53757225434\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEgklEQVRIicWWy44bRRSGv1NdfbE9Y0+scTJBIQosgGwQICEWvAAb3oGX4hV4CRYsWCAuEkgIERCCEEKSGWcSz3hst12Xw6K6fZkJGyTgqOVqd50+9Z\/z\/12nRJMBoKocHx9js4yyqphOz+l293BuRZZllGXJ+fkZZdkhhgAC+\/0+ZVGwbSKCqq5HgOn9x2CUjsk5mzyEm7fpdDo45zg4OFj7ydc\/nTR365\/d4AiKrmc2znrFtzVtp7bChRAQbSKIIMZceikN9tNvHzVZtRGkvV4IcAeG6g423XFSaJJ50Zyy\/Z4imkZrshZMm5SuqyVyeaUX1UV3cekmEb2CtPVpqJRNXkgarTXbgJoZEaTxfve1Ef1uzlc\/j\/ngnVt8\/sMTnjxfbBaj1ckmKxE47HfwMRKjEiMU1hBUmdeeehV2C9mMqmC7uUkwRLbKmji7ddjj\/bvXAXjtpT5lnvHhe7f55LNfWPmwlfbm3cIaepUlaMQKRAMYwaAYIwy6lk4uzGq\/RaYkyhTszf0ilasJGJvggvDmnSHf3Dum3yt45eaAr348ZtArePuVIb8+Pmv8dxWcW6HKM0JstCFCjBEQoiohRHLJsC2l2nLWAHLBUUdDP1dqDw\/PA93c8PqhZfL0Kb52nM5gfjbB157xDLpVzlEvBfAq3Bs7vn9c40NEEbql4VrHMqgyEBhUBh8Ua2C+ijyfJ9qu7+csHIwvPMNuxqtDi3z08RdqAMQkLWkqcSZw93rJG7eukZtIgWe\/EDCG356teKlyfPfI8eWfnplLWhGgU2YMewXj6RIUjEDtGnpjREXxARZL3yqW3BgQMIDNTSvEVF4UFivP09pztnB8+fuMw\/2CvdJiM4OqMl04AKbLgI9KbpQoSbz1MvKwdolKTV9giMrKe0IjchCMQGYSzT5GUJLu3nq5h\/Pw5HzJn88WTOYOVYiAc46lD5yeC3lmyDJDlVvKPCMzwnLlGE8umNcritxSFJZeVXLQK7GZTV+ZQoxKCIaoEGLER8UAEUWi4pvqirHYUancO3c4Hxn2CoZ7JSjUPuBaZ92IPjOCaspouXL0OgXdKifGiI9wUS+Zzmuu7XW4PdonzwwhJBAtIEEQ02zDknqBUXDBI4t6+fc94H8wK+tdMfFts+w\/BaCqW1uHYtPAmpPT06c8ePCAo6MbIIaqLBmNRuvu3Qb5J\/fbz9ZgoqaTA01rXNSrLYVAWeT\/SiX+zmKMOB9ou6Hd9ONkIQTOziY450GVvCgYDodXAi0Wc+7f\/x3JLEVnnzu3jjCXDgchBMbjE55Pa4y1HFwbcuOgt3NO2vTA9N+mRtrSlh4aY9a9zTnHyckJVVUxGAzWi4kYBoMBe3t7O89baxfM84JBT4nVAf1etaZsG9Q2jetT0lZrJUZFYyTGyGqZTosXFxdMJpPNipIxz\/qcectv4xlLH7ey3nKr9lnmA0SETm6uzF9K46qoE7i0e9osw+YZIQSMMcxms3U1DJFunJI5IUZlcnpBCJHR6JA83+jQhprKXWCC4Y9TJSjcGfVecPRLBP0FlaGMv+a4vYsAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/micrus-demo_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022279.53757225434\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA framework doesn\u2019t have to be overly complex! Micrus provides you with a quick, easy and comfortable way of creating neatly structured, modular MVC websites, which can be easily extended and configured.\u003C\/p\u003E\n\u003Cp\u003EOur goal is to keep the framework as simple as possible, while offering all the most important features.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/micrus-demo_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022559.07514450867\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEgklEQVRIicWWy44bRRSGv1NdfbE9Y0+scTJBIQosgGwQICEWvAAb3oGX4hV4CRYsWCAuEkgIERCCEEKSGWcSz3hst12Xw6K6fZkJGyTgqOVqd50+9Z\/z\/12nRJMBoKocHx9js4yyqphOz+l293BuRZZllGXJ+fkZZdkhhgAC+\/0+ZVGwbSKCqq5HgOn9x2CUjsk5mzyEm7fpdDo45zg4OFj7ydc\/nTR365\/d4AiKrmc2znrFtzVtp7bChRAQbSKIIMZceikN9tNvHzVZtRGkvV4IcAeG6g423XFSaJJ50Zyy\/Z4imkZrshZMm5SuqyVyeaUX1UV3cekmEb2CtPVpqJRNXkgarTXbgJoZEaTxfve1Ef1uzlc\/j\/ngnVt8\/sMTnjxfbBaj1ckmKxE47HfwMRKjEiMU1hBUmdeeehV2C9mMqmC7uUkwRLbKmji7ddjj\/bvXAXjtpT5lnvHhe7f55LNfWPmwlfbm3cIaepUlaMQKRAMYwaAYIwy6lk4uzGq\/RaYkyhTszf0ilasJGJvggvDmnSHf3Dum3yt45eaAr348ZtArePuVIb8+Pmv8dxWcW6HKM0JstCFCjBEQoiohRHLJsC2l2nLWAHLBUUdDP1dqDw\/PA93c8PqhZfL0Kb52nM5gfjbB157xDLpVzlEvBfAq3Bs7vn9c40NEEbql4VrHMqgyEBhUBh8Ua2C+ijyfJ9qu7+csHIwvPMNuxqtDi3z08RdqAMQkLWkqcSZw93rJG7eukZtIgWe\/EDCG356teKlyfPfI8eWfnplLWhGgU2YMewXj6RIUjEDtGnpjREXxARZL3yqW3BgQMIDNTSvEVF4UFivP09pztnB8+fuMw\/2CvdJiM4OqMl04AKbLgI9KbpQoSbz1MvKwdolKTV9giMrKe0IjchCMQGYSzT5GUJLu3nq5h\/Pw5HzJn88WTOYOVYiAc46lD5yeC3lmyDJDlVvKPCMzwnLlGE8umNcritxSFJZeVXLQK7GZTV+ZQoxKCIaoEGLER8UAEUWi4pvqirHYUancO3c4Hxn2CoZ7JSjUPuBaZ92IPjOCaspouXL0OgXdKifGiI9wUS+Zzmuu7XW4PdonzwwhJBAtIEEQ02zDknqBUXDBI4t6+fc94H8wK+tdMfFts+w\/BaCqW1uHYtPAmpPT06c8ePCAo6MbIIaqLBmNRuvu3Qb5J\/fbz9ZgoqaTA01rXNSrLYVAWeT\/SiX+zmKMOB9ou6Hd9ONkIQTOziY450GVvCgYDodXAi0Wc+7f\/x3JLEVnnzu3jjCXDgchBMbjE55Pa4y1HFwbcuOgt3NO2vTA9N+mRtrSlh4aY9a9zTnHyckJVVUxGAzWi4kYBoMBe3t7O89baxfM84JBT4nVAf1etaZsG9Q2jetT0lZrJUZFYyTGyGqZTosXFxdMJpPNipIxz\/qcectv4xlLH7ey3nKr9lnmA0SETm6uzF9K46qoE7i0e9osw+YZIQSMMcxms3U1DJFunJI5IUZlcnpBCJHR6JA83+jQhprKXWCC4Y9TJSjcGfVecPRLBP0FlaGMv+a4vYsAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/micrus-demo_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022559.07514450867\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA framework doesn\u2019t have to be overly complex! Micrus provides you with a quick, easy and comfortable way of creating neatly structured, modular MVC websites, which can be easily extended and configured.\u003C\/p\u003E\n\u003Cp\u003EOur goal is to keep the framework as simple as possible, while offering all the most important features.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["container","dependency injection","doctrine","event dispatcher","framework","full-stack","micrus","mvc","php","routing","twig"],"hasMore":false,"image":"https:\/\/avris.it\/image\/micrus-demo_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/micrus-demo_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/micrus-demo_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022139.76878612717\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA framework doesn\u2019t have to be overly complex! Micrus provides you with a quick, easy and comfortable way of creating neatly structured, modular MVC websites, which can be easily extended and configured.\u003C\/p\u003E\n\u003Cp\u003EOur goal is to keep the framework as simple as possible, while offering all the most important features.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/micrus-demo_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/micrus-demo_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022139.76878612717\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA framework doesn\u2019t have to be overly complex! Micrus provides you with a quick, easy and comfortable way of creating neatly structured, modular MVC websites, which can be easily extended and configured.\u003C\/p\u003E\n\u003Cp\u003EOur goal is to keep the framework as simple as possible, while offering all the most important features.\u003C\/p\u003E","words":51,"readTime":null,"lang":"en"}}},"projects\/avris-forms":{"key":"projects\/avris-forms","type":"article","published":true,"meta":{"createdAt":"2018-01-26T20:28:10+01:00","publishedAt":"2018-01-26T20:27:00+01:00","group":null,"links":[{"icon":"brands gitlab","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/Forms","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-forms"},"content":{"en":{"slug":"avris-forms","title":"Avris Forms","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-forms_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHk0lEQVRIiX2X268lRRXGf+tS1b33PnufM8PMgWGA4SaKqEQikYQQkASBGDRovKAJ0Qd90Pjgn+C7bz4Yjc\/6ZHxBTDQagQQSReMFEIngzHAZEOZyztnnsnd31fKh9wxGjZWu7k66Ll99X61aX8s1194SUSpCELVCVMydWgpBoCK4GqZKcme5XFBrhQiIQAARQRiKiCAiQHCxRMSq1ktPoiICKoK5YyI0zQiPECKCUgsSIEApBWEYWFUHoKJQK0mVfjUBIqt2XGovAiCoyruTy8V3IWpB1Ih4t58hJDW0FvxiB0EJKhGgIYgOkxGCqgNCXyqGoAghiqmu2BgWggzfVtfqZrgby2WHCEQMCxRRdNXXVHEzkioeolDLiuCBESKQEFQNN8VEMFHcFIlKrZVayzCA+7D6WlG1S1KpCFErQbC+scGFc+eBCiGIQ9SCqkCAmZLMSH4RkAAqUFdsCYjoSgZDUcyMbIlx00D07O3v07jTJCd7otZKKT19KSAM+6VWAI5dvsliZw7UgbQIVPMKlGI6SJxNcdFERIeEgVT00iYV1Gyg1hIqioqh4kyaCYdG65yfb6GhRAkaT6hniEKI0PfdwJDAiWuu4c2TpxEJJMBUEAJIiMRKMiWZ4poyfbCKGLsYK6A6sKOGqZHdyZZQDJFEkxPXHV1jd2\/Oouu4\/IpNlvt7zLd3MBGyKzUqd378bl5+4UVmuSGIIbIA1UEUVRCBZEp2w0MTklZyIdQAE0XVUFHcHFcje8ZFSOYkSSRtOHx4nU9\/+bMcPrTBb37yc1499SrWrJF8iKbp+hp33ns3zz\/xNBvtCChExABGBRUwE0wH1twFJzdI79QaK30BFFFDzREx3BzVhJutauKeB+\/ikW98npee\/SuPfffHJAo3HbuSqJWd3TmejS99+1s8+9PHuWo2Y1k6avRElEE6XUVXGvZQToopuLQTaleQWodzKAAxRBy1RDJH1UjmtCkzducrX\/8M9z98D\/PzOzz+\/cfIOuLQuOWGG69kd+sdtvYOuPebXySpUE+9xvuObTLf3+OgX1JqT6kdaCW5YSa4K8mFlAyX8QxZ9lAqAcMeQRFJqBjiiaxOmxLjlHjk0fu4\/+F7APjzU8+RaJiuTVkbN+yc2+fERz7Exx+6E28bnvnOD9k8so5Gx9Z20PeJEgOgkIpqkLLjLqSkeBZcRlPIPRSQUAhFUBAHTZg6yZycErfeeh2f\/NzHLqWE7bfmXHb5UY6f2OTELVdz9W3XMzkyIyJ49RdPMhllSl2jbXpyU0EqNTr6fknUDjVQDcyN3DieBGe6Dn0hQgYwMUSX4bgmFEdWB+CjX3vw0skM8MBX7+M\/S0Tw+pO\/Z\/n2Oxy99jIWW5lu9wIz7RCriAW1dtR+gdCjJpgrKWe8aXCdTkmFIc+geCgJI4uTw8hqZJTbbr2G48cP\/xeAfy+1FF7+5e\/Yeell2onSro85evNV9FsTts8IKkuEDiQTJSFShwhLjuWMNSN8ujGlFGDFkCF4OK0YLUqL0VThjo\/e+H\/BzN\/e4oWfPc3y7NuMGkCh299j72yHy5LxekPtynD2GKgkZCWXumO5RZsRfsXhEX0f1AI1FA1FMVIICaMNpSnCTdcf+Z9A9rf3+NtTz\/H6H14kS8eorUPqqBAd1IVBo+SREkkxiZVMCTXFUkZzg6QG8gj\/wGbD3kHHclFY9pVSKqVWJASJihXBRDhyaHwJxO58n1Mvvc7JP73C68\/\/gyY6xl6IVHAqWSuhARawHHKlpCB54CaYCZoSkltIBjlDbsBb\/KFDb7B7UJnPO7Z3K\/M+2FnA3hIOOlj2QunhB9\/7Efu7+1x4Z5vdc9vkUkgUEpVWKyPrmaRg1laW4wrTIIXQ2mAzpHSoB5YNq0HXGcaUbmFom9g6P6ajRe655UjM2sTBwWCV3DIhTsUJSRScqpm+QoiCOiLKxmydyXjMztYW2YxsQqMwyTDNcHQSHDtU2DxiTCbC6TMXmO\/vU3LHxpXHeeJXv+XkmQWztrK5OWXRBc+8sIusbRwOTRlRw1LCmxZRw3ODp4ylBlUjNy3mieQZt8Rdd9xOt79gbTyiWxYmueXoxoTFzpxzp99gTM9GC5etKYcmkLQnWc\/GpOemW8dcODPn7TPbTEfg0nP0jvvY+8uv8Zs\/9QWatRl9hXYyxVODqiPmJE+IGMKQdyQEKRVKYTGbMmePzWNHOHt2i3mFRAttIh8fsdies3BhNyk5GW2qVKscNJXONjj8Xrgwf4U0Ehrv6c\/vsfb++\/GCMd\/bB0ssd3YQ2QV08EIxGPDBC7ECU5Fa+efpA6iFV08aUgKJwGohMXjjccpMkzN1Z71JjJPgWhhnmB903P7BGa+dV+q5ntkIphfe4D0PfBg\/f+rvLLsO9UwtFW9G8O4\/BAJ4SqgqEkHUQGMAoLUifX\/J4NdugYtx4a3TtLnFRVhfm3HZbAOPyt7eNodmU\/74ovPmqRFvbR1w8uwBoxw0uuQT\/WvIkRtujloK\/XJJ7RakyRQJoSwP0NQM6aD2eG4BBs8NaA0UQeKihx68uEYgVEwEV8EFlEo2QzXo+w6hsDl11lvj3P5gcxuHO07AvwDs3DcxrBe3EwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-forms_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EForms are complicated. There are many things you must take into consideration:\nbinding an existing object (if any) to each sparate field of the form,\nvalidating them after user has submited the form,\nif invalid redisplaying it with POST data bound and with validation errors,\nbinding the data back to an object...\u003C\/p\u003E\n\u003Cp\u003EAvris Forms add an abstraction layer that handles all of that.\nYou just need to define the list of fields you need and their cofiguration options.\nYou\u2019ll get an object that will handle everything for you.\nJust handle it in the controller and display it in the view.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-forms_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHk0lEQVRIiX2X268lRRXGf+tS1b33PnufM8PMgWGA4SaKqEQikYQQkASBGDRovKAJ0Qd90Pjgn+C7bz4Yjc\/6ZHxBTDQagQQSReMFEIngzHAZEOZyztnnsnd31fKh9wxGjZWu7k66Ll99X61aX8s1194SUSpCELVCVMydWgpBoCK4GqZKcme5XFBrhQiIQAARQRiKiCAiQHCxRMSq1ktPoiICKoK5YyI0zQiPECKCUgsSIEApBWEYWFUHoKJQK0mVfjUBIqt2XGovAiCoyruTy8V3IWpB1Ih4t58hJDW0FvxiB0EJKhGgIYgOkxGCqgNCXyqGoAghiqmu2BgWggzfVtfqZrgby2WHCEQMCxRRdNXXVHEzkioeolDLiuCBESKQEFQNN8VEMFHcFIlKrZVayzCA+7D6WlG1S1KpCFErQbC+scGFc+eBCiGIQ9SCqkCAmZLMSH4RkAAqUFdsCYjoSgZDUcyMbIlx00D07O3v07jTJCd7otZKKT19KSAM+6VWAI5dvsliZw7UgbQIVPMKlGI6SJxNcdFERIeEgVT00iYV1Gyg1hIqioqh4kyaCYdG65yfb6GhRAkaT6hniEKI0PfdwJDAiWuu4c2TpxEJJMBUEAJIiMRKMiWZ4poyfbCKGLsYK6A6sKOGqZHdyZZQDJFEkxPXHV1jd2\/Oouu4\/IpNlvt7zLd3MBGyKzUqd378bl5+4UVmuSGIIbIA1UEUVRCBZEp2w0MTklZyIdQAE0XVUFHcHFcje8ZFSOYkSSRtOHx4nU9\/+bMcPrTBb37yc1499SrWrJF8iKbp+hp33ns3zz\/xNBvtCChExABGBRUwE0wH1twFJzdI79QaK30BFFFDzREx3BzVhJutauKeB+\/ikW98npee\/SuPfffHJAo3HbuSqJWd3TmejS99+1s8+9PHuWo2Y1k6avRElEE6XUVXGvZQToopuLQTaleQWodzKAAxRBy1RDJH1UjmtCkzducrX\/8M9z98D\/PzOzz+\/cfIOuLQuOWGG69kd+sdtvYOuPebXySpUE+9xvuObTLf3+OgX1JqT6kdaCW5YSa4K8mFlAyX8QxZ9lAqAcMeQRFJqBjiiaxOmxLjlHjk0fu4\/+F7APjzU8+RaJiuTVkbN+yc2+fERz7Exx+6E28bnvnOD9k8so5Gx9Z20PeJEgOgkIpqkLLjLqSkeBZcRlPIPRSQUAhFUBAHTZg6yZycErfeeh2f\/NzHLqWE7bfmXHb5UY6f2OTELVdz9W3XMzkyIyJ49RdPMhllSl2jbXpyU0EqNTr6fknUDjVQDcyN3DieBGe6Dn0hQgYwMUSX4bgmFEdWB+CjX3vw0skM8MBX7+M\/S0Tw+pO\/Z\/n2Oxy99jIWW5lu9wIz7RCriAW1dtR+gdCjJpgrKWe8aXCdTkmFIc+geCgJI4uTw8hqZJTbbr2G48cP\/xeAfy+1FF7+5e\/Yeell2onSro85evNV9FsTts8IKkuEDiQTJSFShwhLjuWMNSN8ujGlFGDFkCF4OK0YLUqL0VThjo\/e+H\/BzN\/e4oWfPc3y7NuMGkCh299j72yHy5LxekPtynD2GKgkZCWXumO5RZsRfsXhEX0f1AI1FA1FMVIICaMNpSnCTdcf+Z9A9rf3+NtTz\/H6H14kS8eorUPqqBAd1IVBo+SREkkxiZVMCTXFUkZzg6QG8gj\/wGbD3kHHclFY9pVSKqVWJASJihXBRDhyaHwJxO58n1Mvvc7JP73C68\/\/gyY6xl6IVHAqWSuhARawHHKlpCB54CaYCZoSkltIBjlDbsBb\/KFDb7B7UJnPO7Z3K\/M+2FnA3hIOOlj2QunhB9\/7Efu7+1x4Z5vdc9vkUkgUEpVWKyPrmaRg1laW4wrTIIXQ2mAzpHSoB5YNq0HXGcaUbmFom9g6P6ajRe655UjM2sTBwWCV3DIhTsUJSRScqpm+QoiCOiLKxmydyXjMztYW2YxsQqMwyTDNcHQSHDtU2DxiTCbC6TMXmO\/vU3LHxpXHeeJXv+XkmQWztrK5OWXRBc+8sIusbRwOTRlRw1LCmxZRw3ODp4ylBlUjNy3mieQZt8Rdd9xOt79gbTyiWxYmueXoxoTFzpxzp99gTM9GC5etKYcmkLQnWc\/GpOemW8dcODPn7TPbTEfg0nP0jvvY+8uv8Zs\/9QWatRl9hXYyxVODqiPmJE+IGMKQdyQEKRVKYTGbMmePzWNHOHt2i3mFRAttIh8fsdies3BhNyk5GW2qVKscNJXONjj8Xrgwf4U0Ehrv6c\/vsfb++\/GCMd\/bB0ssd3YQ2QV08EIxGPDBC7ECU5Fa+efpA6iFV08aUgKJwGohMXjjccpMkzN1Z71JjJPgWhhnmB903P7BGa+dV+q5ntkIphfe4D0PfBg\/f+rvLLsO9UwtFW9G8O4\/BAJ4SqgqEkHUQGMAoLUifX\/J4NdugYtx4a3TtLnFRVhfm3HZbAOPyt7eNodmU\/74ovPmqRFvbR1w8uwBoxw0uuQT\/WvIkRtujloK\/XJJ7RakyRQJoSwP0NQM6aD2eG4BBs8NaA0UQeKihx68uEYgVEwEV8EFlEo2QzXo+w6hsDl11lvj3P5gcxuHO07AvwDs3DcxrBe3EwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-forms_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EForms are complicated. There are many things you must take into consideration:\nbinding an existing object (if any) to each sparate field of the form,\nvalidating them after user has submited the form,\nif invalid redisplaying it with POST data bound and with validation errors,\nbinding the data back to an object...\u003C\/p\u003E\n\u003Cp\u003EAvris Forms add an abstraction layer that handles all of that.\nYou just need to define the list of fields you need and their cofiguration options.\nYou\u2019ll get an object that will handle everything for you.\nJust handle it in the controller and display it in the view.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["abstraction","forms","library","php"],"hasMore":false,"image":"https:\/\/avris.it\/image\/avris-forms_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-forms_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-forms_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EForms are complicated. There are many things you must take into consideration:\nbinding an existing object (if any) to each sparate field of the form,\nvalidating them after user has submited the form,\nif invalid redisplaying it with POST data bound and with validation errors,\nbinding the data back to an object...\u003C\/p\u003E\n\u003Cp\u003EAvris Forms add an abstraction layer that handles all of that.\nYou just need to define the list of fields you need and their cofiguration options.\nYou\u2019ll get an object that will handle everything for you.\nJust handle it in the controller and display it in the view.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-forms_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-forms_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EForms are complicated. There are many things you must take into consideration:\nbinding an existing object (if any) to each sparate field of the form,\nvalidating them after user has submited the form,\nif invalid redisplaying it with POST data bound and with validation errors,\nbinding the data back to an object...\u003C\/p\u003E\n\u003Cp\u003EAvris Forms add an abstraction layer that handles all of that.\nYou just need to define the list of fields you need and their cofiguration options.\nYou\u2019ll get an object that will handle everything for you.\nJust handle it in the controller and display it in the view.\u003C\/p\u003E","words":101,"readTime":null,"lang":"en"}}},"projects\/avris-http":{"key":"projects\/avris-http","type":"article","published":true,"meta":{"createdAt":"2018-01-12T20:41:21+01:00","publishedAt":"2018-01-12T20:40:00+01:00","group":null,"links":[{"icon":"brands gitlab","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/Http","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-http"},"content":{"en":{"slug":"avris-http","title":"Avris Http","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-http_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHiklEQVRIiX2Xy69lRRXGf+tRtfc55577aLovb5qXKKJ0RI0kxIAkvGLQoPGBJkQHOtA48E9w7syB0TjWkXGCmGg0AgkkisYHIBJBGmga0tD3de659569q5aDfboxaqzsV7Krdn31fWvV+rZcc+0tEaUiBFErRMXcqaUQBCqCq2GqJHcWiyNqrRABEQggIghDExFEBAgutIhYnvXinaiIgIpg7pgITTPCI4SIoNSCBAhQSkEYPqyqA1BRqJWkSr+cAJFlPy72FwEQVOXdyeXCsxC1IGpEvDvOEJIaWgt+YYCgBJUI0BBEh8kIQdUBoS8VQ1CEEMVUl2wMC0GGd8tjeTHcjcWiQwQihgWKKLoca6q4GUkVD1GoZUnwwAgRSAiqhptiIpgobopEpdZKrWX4gPuw+lpRtYtSqQhRK0Gwtr7O9vktoEII4hC1oCoQYKYkM5JfACSACtQlWwIiupTBUBQzI1ti3DQQPfODAxp3muRkT9RaKaWnLwWEIV5qBeDySzc52psBdSAtAtW8BKWYDhJnU1w0EdEhYSAVvRikgpoN1FpCRVExVJxJM2FjtMbWbAcNJUrQeEI9QxRChL7vBoYETl5zDW++8ioigQSYCkIACZFYSqYkU1xTpg+WGWMXcgVUB3bUMDWyO9kSiiGSaHLiuhMr7M9nHHUdl162yeJgzmx3DxMhu1Kjcse9d\/LS8y+wmhuCGDILUB1EUQURSKZkNzw0IWkpF0INMFFUDRXFzXE1smdchGROkkTShmPH1vjMVz7HsY11fvvTX\/Da6dewZoXkQzZN11a44+47ee7xp1hvR0AhIgYwKqiAmWA6sOYuOLlBeqfWWOoLoIgaao6I4eaoJtxseSbueuDjPPzNL\/DiM3\/j0e\/9hEThpsuvIGplb3+GZ+PL3\/k2z\/zsMa5aXWVROmr0RJRBOl1mVxpiKCfFFFzaCbUrSK3DPhSAGCKOWiKZo2okc9qUGbvz1W98lvseuovZ1h6P\/eBRso7YGLfccOMV7O+8zc78kLu\/9SWSCvX067zv8k1mB3MO+wWl9pTagVaSG2aCu5JcSMlwGa8iix5KJWCIERSRhIohnsjqtCkxTomHH7mH+x66C4C\/PPksiYbpypSVccPe+QNOfuRW7n3wDrxtePq7P2Lz+BoaHTu7Qd8nSgyAQiqqQcqOu5CS4llwGU0h91BAQiEUQUEcNGHqJHNySpw6dR2f+vwnLpaE3bdmXHLpCa48ucnJW67m6tuuZ3J8lYjgtV8+wWSUKXWFtunJTQWp1Ojo+wVRO9RANTA3cuN4EpzpGvSFCBnAxJBdhuOaUBxZboCPfP2BizszwP1fu4f\/bBHBmSf+wOLc25y49hKOdjLd\/jar2iFWEQtq7aj9EUKPmmCupJzxpsF1OiUVhjqD4qEkjCxODiOrkVFuO3UNV1557L8A\/HurpfDSr37P3osv0U6Udm3MiZuvot+ZsHtWUFkgdCCZKAmROmRYcixnrBnh0\/UppQBLhgzBw2nFaFFajKYKt3\/sxv8LZnZuh+d\/\/hSLd84xagCF7mDO\/J0OlwXjtYbalWHvMVBJyFIudcdyizYj\/LJjI\/o+qAVqKBqKYqQQEkYbSlOEm64\/\/j+BHOzO+fuTz3Lmjy+QpWPU1qF0VIgO6pFBo+SREkkxiaVMCTXFUkZzg6QG8gj\/wGbD\/LBjcVRY9JVSKqVWJASJihXBRDi+Mb4IYn92wOkXz\/DKn1\/mzHP\/pImOsRciFZxK1kpogAUshlopKUgeuAlmgqaE5BaSQc6QG\/AWf3DjDfYPK7NZx+5+ZdYHe0cwX8BhB4teKD388Ps\/5mD\/gO23d9k\/v0suhUQhUWm1MrKeSQpW28piXGEapBBaG2yGlA71wLJhNeg6w5jSHRnaJna2xnS0yF23HI\/VNnF4OFglt0yIU3FCEgWnaqavEKKgjojiakzGY7IZCmQTPAqTDNMMJybB5RuFzePGZCK8enab2cEBJXesX3Elj\/\/6d7xy9ojVtrK5OeWoC55+fh9ZWT8WmjKihqWENy2ihucGTxlLDapGblrME8kzbommGXHHh29lbWUFFSOLsb+9w8HWNoutHTZaZb2FS1aUjQkk7UnWsz7puenUmO2zM86d3WU6ApeeE7ffw\/yvv8Fv\/vQXaVZW6Su0kymeGlQdMSd5QsQQhrojIUipUApSg\/loynxRWBtlLIRLr72e1+RNelnhyJQjF\/aTkpPRpkq1ymFT6WydY++F7dnLpJHQeE+\/NWfl\/ffhBWM2PwBLLPb2ENkHdPBCMRjwwQuxBFORWqmHh7z1aiGbISWQCDwCD0FrYZwy0+RM3VlrEuMkuBbGGWaHHR\/94Cqvbyn1fM\/qCKbbb\/Ce+z+Eb53+B4uuQz1TS8WbEbz7D4EAnhKqikQQNdAYAGitSN9fNPi1O8LF2H7rVdrc4iKsraxyyeo6HpX5fJeN1Sl\/esF58\/SIt3YOeeWdQ0Y5aHTBJ\/vXkeM33By1FPrFgtodkSZTJISyOERTM5SD2uO5BRg8N6A1UASJCx568OIagVAxEVwFF1DqEPwa9H2HUNicOmutcf5gsLmNw+0n4V\/6+DKRylDp2gAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-http_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EHTTP Request\/Response abstraction\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-http_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHiklEQVRIiX2Xy69lRRXGf+tRtfc55577aLovb5qXKKJ0RI0kxIAkvGLQoPGBJkQHOtA48E9w7syB0TjWkXGCmGg0AgkkisYHIBJBGmga0tD3de659569q5aDfboxaqzsV7Krdn31fWvV+rZcc+0tEaUiBFErRMXcqaUQBCqCq2GqJHcWiyNqrRABEQggIghDExFEBAgutIhYnvXinaiIgIpg7pgITTPCI4SIoNSCBAhQSkEYPqyqA1BRqJWkSr+cAJFlPy72FwEQVOXdyeXCsxC1IGpEvDvOEJIaWgt+YYCgBJUI0BBEh8kIQdUBoS8VQ1CEEMVUl2wMC0GGd8tjeTHcjcWiQwQihgWKKLoca6q4GUkVD1GoZUnwwAgRSAiqhptiIpgobopEpdZKrWX4gPuw+lpRtYtSqQhRK0Gwtr7O9vktoEII4hC1oCoQYKYkM5JfACSACtQlWwIiupTBUBQzI1ti3DQQPfODAxp3muRkT9RaKaWnLwWEIV5qBeDySzc52psBdSAtAtW8BKWYDhJnU1w0EdEhYSAVvRikgpoN1FpCRVExVJxJM2FjtMbWbAcNJUrQeEI9QxRChL7vBoYETl5zDW++8ioigQSYCkIACZFYSqYkU1xTpg+WGWMXcgVUB3bUMDWyO9kSiiGSaHLiuhMr7M9nHHUdl162yeJgzmx3DxMhu1Kjcse9d\/LS8y+wmhuCGDILUB1EUQURSKZkNzw0IWkpF0INMFFUDRXFzXE1smdchGROkkTShmPH1vjMVz7HsY11fvvTX\/Da6dewZoXkQzZN11a44+47ee7xp1hvR0AhIgYwKqiAmWA6sOYuOLlBeqfWWOoLoIgaao6I4eaoJtxseSbueuDjPPzNL\/DiM3\/j0e\/9hEThpsuvIGplb3+GZ+PL3\/k2z\/zsMa5aXWVROmr0RJRBOl1mVxpiKCfFFFzaCbUrSK3DPhSAGCKOWiKZo2okc9qUGbvz1W98lvseuovZ1h6P\/eBRso7YGLfccOMV7O+8zc78kLu\/9SWSCvX067zv8k1mB3MO+wWl9pTagVaSG2aCu5JcSMlwGa8iix5KJWCIERSRhIohnsjqtCkxTomHH7mH+x66C4C\/PPksiYbpypSVccPe+QNOfuRW7n3wDrxtePq7P2Lz+BoaHTu7Qd8nSgyAQiqqQcqOu5CS4llwGU0h91BAQiEUQUEcNGHqJHNySpw6dR2f+vwnLpaE3bdmXHLpCa48ucnJW67m6tuuZ3J8lYjgtV8+wWSUKXWFtunJTQWp1Ojo+wVRO9RANTA3cuN4EpzpGvSFCBnAxJBdhuOaUBxZboCPfP2BizszwP1fu4f\/bBHBmSf+wOLc25y49hKOdjLd\/jar2iFWEQtq7aj9EUKPmmCupJzxpsF1OiUVhjqD4qEkjCxODiOrkVFuO3UNV1557L8A\/HurpfDSr37P3osv0U6Udm3MiZuvot+ZsHtWUFkgdCCZKAmROmRYcixnrBnh0\/UppQBLhgzBw2nFaFFajKYKt3\/sxv8LZnZuh+d\/\/hSLd84xagCF7mDO\/J0OlwXjtYbalWHvMVBJyFIudcdyizYj\/LJjI\/o+qAVqKBqKYqQQEkYbSlOEm64\/\/j+BHOzO+fuTz3Lmjy+QpWPU1qF0VIgO6pFBo+SREkkxiaVMCTXFUkZzg6QG8gj\/wGbD\/LBjcVRY9JVSKqVWJASJihXBRDi+Mb4IYn92wOkXz\/DKn1\/mzHP\/pImOsRciFZxK1kpogAUshlopKUgeuAlmgqaE5BaSQc6QG\/AWf3DjDfYPK7NZx+5+ZdYHe0cwX8BhB4teKD388Ps\/5mD\/gO23d9k\/v0suhUQhUWm1MrKeSQpW28piXGEapBBaG2yGlA71wLJhNeg6w5jSHRnaJna2xnS0yF23HI\/VNnF4OFglt0yIU3FCEgWnaqavEKKgjojiakzGY7IZCmQTPAqTDNMMJybB5RuFzePGZCK8enab2cEBJXesX3Elj\/\/6d7xy9ojVtrK5OeWoC55+fh9ZWT8WmjKihqWENy2ihucGTxlLDapGblrME8kzbommGXHHh29lbWUFFSOLsb+9w8HWNoutHTZaZb2FS1aUjQkk7UnWsz7puenUmO2zM86d3WU6ApeeE7ffw\/yvv8Fv\/vQXaVZW6Su0kymeGlQdMSd5QsQQhrojIUipUApSg\/loynxRWBtlLIRLr72e1+RNelnhyJQjF\/aTkpPRpkq1ymFT6WydY++F7dnLpJHQeE+\/NWfl\/ffhBWM2PwBLLPb2ENkHdPBCMRjwwQuxBFORWqmHh7z1aiGbISWQCDwCD0FrYZwy0+RM3VlrEuMkuBbGGWaHHR\/94Cqvbyn1fM\/qCKbbb\/Ce+z+Eb53+B4uuQz1TS8WbEbz7D4EAnhKqikQQNdAYAGitSN9fNPi1O8LF2H7rVdrc4iKsraxyyeo6HpX5fJeN1Sl\/esF58\/SIt3YOeeWdQ0Y5aHTBJ\/vXkeM33By1FPrFgtodkSZTJISyOERTM5SD2uO5BRg8N6A1UASJCx568OIagVAxEVwFF1DqEPwa9H2HUNicOmutcf5gsLmNw+0n4V\/6+DKRylDp2gAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-http_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EHTTP Request\/Response abstraction\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["abstraction","http","library","php","request","response","session"],"hasMore":false,"image":"https:\/\/avris.it\/image\/avris-http_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-http_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-http_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EHTTP Request\/Response abstraction\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-http_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-http_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EHTTP Request\/Response abstraction\u003C\/p\u003E","words":4,"readTime":null,"lang":"en"}}},"projects\/avris-polonisator":{"key":"projects\/avris-polonisator","type":"article","published":true,"meta":{"createdAt":"2018-01-10T19:14:14+01:00","publishedAt":"2018-01-10T19:12:00+01:00","group":null,"links":[{"icon":"brands gitlab","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/Polonisator","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-polonisator"},"content":{"en":{"slug":"avris-polonisator","title":"Avris Polonisator","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-polonisator_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHp0lEQVRIiX2XyY8kRxXGf2+JyKyurupletp4DB6DwWAbY2GxGFmAQTIGIUCAWAySBQc4gDjwJ3DnxgGBOMMJcWGRQOwSSGxiszEWNh5vY2s801t1VXdlRjwOWTNGgAhlZKaUsXzxffHifSk33nR7RKkIQdQKUTF3aikEgYrgapgqyZ3l8pRaK0RABAKICMJQRAQRAYKrJSJWtV57EhURUBHMHROhaUZ4hBARlFqQAAFKKQjDwKo6ABWFWkmq9KsJEFm141p7EQBBVV6cXK6+C1ELokbEi\/0MIamhteBXOwhKUIkADUF0mIwQVB0Q+lIxBEUIUUx1xcawEGT4trpWN8PdWC47RCBiWKCIoqu+poqbkVTxEIVaVgQPjBCBhKBquCkmgonipkhUaq3UWoYB3IfV14qqXZNKRYhaCYKNzU32r+wBFUIQh6gFVYEAMyWZkfwqIAFUoK7YEhDRlQyGopgZ2RJrTQPRM18saNxpkpM9UWullJ6+FBCG\/VIrANdft8vp0QyoA2kRqOYVKMV0kDib4qKJiA4JA6notU0qqNlArSVUFBVDxRk3Y7ZGG+zNDtBQogSNJ9QzRCFE6PtuYEjg\/I038twTTyISSICpIASQEImVZEoyxTVl+mAVMXY1VkB1YEcNUyO7ky2hGCKJJidefnad4\/mM067jupfsslzMmR0eYSJkV2pU7nnX23ns4UeY5oYghsgCVAdRVEEEkinZDQ9NSFrJhVADTBRVQ0Vxc1yN7BkXIZmTJJG0YXt7gw996iNsb23ys2\/\/gKcuPIU16yQfommysc4973w7D\/38V2y2I6AQEQMYFVTATDAdWHMXnNwgvVNrrPQFUEQNNUfEcHNUE262qol73\/NWHvj8x3j0d3\/ju1\/5FonCLdefI2rl6HiGZ+OTX\/oiv\/vO93npdMqydNToiSiDdLqKrjTsoZwUU3Bpx9SuILUO51AAYog4aolkjqqRzGlTZs2dT3\/uw9z\/wXuZ7R3x\/a99l6wjttZabn7lOY4PXuBgfsI7v\/AJkgr1wtO85vpdZos5J\/2SUntK7UAryQ0zwV1JLqRkuKxNkWUPpRIw7BEUkYSKIZ7I6rQpsZYSDzx4H\/d\/8F4A\/vzLv5JomKxPWF9rOLqy4PwbXse73ncP3jb8+svfYHdnA42Og8Og7xMlBkAhFdUgZcddSEnxLLiMJpB7KCChEIqgIA6aMHWSOTkl7rzz5bz\/o++4lhIOn59x5rqz3HB+l\/O3v4yX3fUKxjtTIoKnfvgLxqNMqeu0TU9uKkilRkffL4naoQaqgbmRG8eT4Ew2oC9EyAAmhugyHNeE4sjqAHzws++5djIDvPsz9\/GfJSJ45he\/Z3npBc7edIbTg0x3vM9UO8QqYkGtHbU\/RehRE8yVlDPeNLhOJqTCkGdQPJSEkcXJYWQ1Mspdd97IDTds\/xeAfy+1FB770W85evQx2rHSbqxx9taX0h+MObwoqCwROpBMlIRIHSIsOZYz1ozwyeaEUoAVQ4bg4bRitCgtRlOFu9\/8yv8LZnbpgIe\/9yuWly8xagCFbjFnfrnDZcnaRkPtynD2GKgkZCWXumO5RZsR\/pLtEX0f1AI1FA1FMVIICaMNpSnCLa\/Y+Z9AFodz\/v7Lv\/LMHx4hS8eorUPqqBAd1FODRskjJZJiEiuZEmqKpYzmBkkN5BH+2t2G+UnH8rSw7CulVEqtSAgSFSuCibCztXYNxPFswYVHn+GJPz3OMw\/9kyY61rwQqeBUslZCAyxgOeRKSUHywE0wEzQlJLeQDHKG3IC3+Pu2nuX4pDKbdRweV2Z9cHQK8yWcdLDshdLD17\/6TRbHC\/ZfOOT4yiG5FBKFRKXVysh6ximYtpXlWoVJkEJobbAZUjrUA8uG1aDrDGNCd2pomzjYW6OjRe69fSembeLkZLBKbpkQp+KEJApO1UxfYTRex3PD0dExO2fOMDs8WuU4Y3tjnW5+zDjD5kjZbgvXbxV2d4zxWHjy4j6zxYKSOzbP3cDPf\/wbnrh4yrSt7O5OOO2CXz98jKxvboemjKhhKeFNi6jhucFTxlKDqpGblre95U2c2dxib2+P7a0zXLmyz9ZkyvK058x0wv4Le9x0bodxysTJjM1xor\/8LOu6IGlPsp7Ncc8td66xf3HGpYuHTEbg0nP27vuY\/+Un+K0f+DjN+pS+Qjue4KlB1RFzkidEDGHIO7a1wSOX9rnjtpspXWFz4xytG8dXDpnnhp2bz7IUYTE\/YdLusFDjuD9FxkabKtUqJ02ls022Xw37s8dJI6Hxnn5vzvpt9+MFYzZfgCWWR0eIHAM6eKEYDPjgheDyc89Cqfz04lPUkxOohWyGlEAisFpIDN54LWUmyZm4s9Ek1pLgWljLMDvpeOMdU57eU+qVnukIJvvP8qp3vx7fu\/APll2HeqaWijcjePEfAgE8JVQViSBqoDEA0FqRvr9m8Gt3ioux\/\/yTtLnFRdhYn3JmuolHZT4\/ZGs64Y+POM9dGPH8wQlPXD5hlINGl7y3fxrZufnWqKXQL5fU7pQ0niAhlOUJmpohHdQezy3A4LkBrYEiSFz10IMX1wiEiongKriAUslmqAZ93yEUdifORmtcWQw2t3G4+zz8C1qOQnwD4bZcAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-polonisator_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EAn extension to Avris Localisator and Avris Stringer introducing support for the Polish language.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-polonisator_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHp0lEQVRIiX2XyY8kRxXGf2+JyKyurupletp4DB6DwWAbY2GxGFmAQTIGIUCAWAySBQc4gDjwJ3DnxgGBOMMJcWGRQOwSSGxiszEWNh5vY2s801t1VXdlRjwOWTNGgAhlZKaUsXzxffHifSk33nR7RKkIQdQKUTF3aikEgYrgapgqyZ3l8pRaK0RABAKICMJQRAQRAYKrJSJWtV57EhURUBHMHROhaUZ4hBARlFqQAAFKKQjDwKo6ABWFWkmq9KsJEFm141p7EQBBVV6cXK6+C1ELokbEi\/0MIamhteBXOwhKUIkADUF0mIwQVB0Q+lIxBEUIUUx1xcawEGT4trpWN8PdWC47RCBiWKCIoqu+poqbkVTxEIVaVgQPjBCBhKBquCkmgonipkhUaq3UWoYB3IfV14qqXZNKRYhaCYKNzU32r+wBFUIQh6gFVYEAMyWZkfwqIAFUoK7YEhDRlQyGopgZ2RJrTQPRM18saNxpkpM9UWullJ6+FBCG\/VIrANdft8vp0QyoA2kRqOYVKMV0kDib4qKJiA4JA6notU0qqNlArSVUFBVDxRk3Y7ZGG+zNDtBQogSNJ9QzRCFE6PtuYEjg\/I038twTTyISSICpIASQEImVZEoyxTVl+mAVMXY1VkB1YEcNUyO7ky2hGCKJJidefnad4\/mM067jupfsslzMmR0eYSJkV2pU7nnX23ns4UeY5oYghsgCVAdRVEEEkinZDQ9NSFrJhVADTBRVQ0Vxc1yN7BkXIZmTJJG0YXt7gw996iNsb23ys2\/\/gKcuPIU16yQfommysc4973w7D\/38V2y2I6AQEQMYFVTATDAdWHMXnNwgvVNrrPQFUEQNNUfEcHNUE262qol73\/NWHvj8x3j0d3\/ju1\/5FonCLdefI2rl6HiGZ+OTX\/oiv\/vO93npdMqydNToiSiDdLqKrjTsoZwUU3Bpx9SuILUO51AAYog4aolkjqqRzGlTZs2dT3\/uw9z\/wXuZ7R3x\/a99l6wjttZabn7lOY4PXuBgfsI7v\/AJkgr1wtO85vpdZos5J\/2SUntK7UAryQ0zwV1JLqRkuKxNkWUPpRIw7BEUkYSKIZ7I6rQpsZYSDzx4H\/d\/8F4A\/vzLv5JomKxPWF9rOLqy4PwbXse73ncP3jb8+svfYHdnA42Og8Og7xMlBkAhFdUgZcddSEnxLLiMJpB7KCChEIqgIA6aMHWSOTkl7rzz5bz\/o++4lhIOn59x5rqz3HB+l\/O3v4yX3fUKxjtTIoKnfvgLxqNMqeu0TU9uKkilRkffL4naoQaqgbmRG8eT4Ew2oC9EyAAmhugyHNeE4sjqAHzws++5djIDvPsz9\/GfJSJ45he\/Z3npBc7edIbTg0x3vM9UO8QqYkGtHbU\/RehRE8yVlDPeNLhOJqTCkGdQPJSEkcXJYWQ1Mspdd97IDTds\/xeAfy+1FB770W85evQx2rHSbqxx9taX0h+MObwoqCwROpBMlIRIHSIsOZYz1ozwyeaEUoAVQ4bg4bRitCgtRlOFu9\/8yv8LZnbpgIe\/9yuWly8xagCFbjFnfrnDZcnaRkPtynD2GKgkZCWXumO5RZsR\/pLtEX0f1AI1FA1FMVIICaMNpSnCLa\/Y+Z9AFodz\/v7Lv\/LMHx4hS8eorUPqqBAd1FODRskjJZJiEiuZEmqKpYzmBkkN5BH+2t2G+UnH8rSw7CulVEqtSAgSFSuCibCztXYNxPFswYVHn+GJPz3OMw\/9kyY61rwQqeBUslZCAyxgOeRKSUHywE0wEzQlJLeQDHKG3IC3+Pu2nuX4pDKbdRweV2Z9cHQK8yWcdLDshdLD17\/6TRbHC\/ZfOOT4yiG5FBKFRKXVysh6ximYtpXlWoVJkEJobbAZUjrUA8uG1aDrDGNCd2pomzjYW6OjRe69fSembeLkZLBKbpkQp+KEJApO1UxfYTRex3PD0dExO2fOMDs8WuU4Y3tjnW5+zDjD5kjZbgvXbxV2d4zxWHjy4j6zxYKSOzbP3cDPf\/wbnrh4yrSt7O5OOO2CXz98jKxvboemjKhhKeFNi6jhucFTxlKDqpGblre95U2c2dxib2+P7a0zXLmyz9ZkyvK058x0wv4Le9x0bodxysTJjM1xor\/8LOu6IGlPsp7Ncc8td66xf3HGpYuHTEbg0nP27vuY\/+Un+K0f+DjN+pS+Qjue4KlB1RFzkidEDGHIO7a1wSOX9rnjtpspXWFz4xytG8dXDpnnhp2bz7IUYTE\/YdLusFDjuD9FxkabKtUqJ02ls022Xw37s8dJI6Hxnn5vzvpt9+MFYzZfgCWWR0eIHAM6eKEYDPjgheDyc89Cqfz04lPUkxOohWyGlEAisFpIDN54LWUmyZm4s9Ek1pLgWljLMDvpeOMdU57eU+qVnukIJvvP8qp3vx7fu\/APll2HeqaWijcjePEfAgE8JVQViSBqoDEA0FqRvr9m8Gt3ioux\/\/yTtLnFRdhYn3JmuolHZT4\/ZGs64Y+POM9dGPH8wQlPXD5hlINGl7y3fxrZufnWqKXQL5fU7pQ0niAhlOUJmpohHdQezy3A4LkBrYEiSFz10IMX1wiEiongKriAUslmqAZ93yEUdifORmtcWQw2t3G4+zz8C1qOQnwD4bZcAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-polonisator_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EAn extension to Avris Localisator and Avris Stringer introducing support for the Polish language.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["library","locale","localisation","localization","php","polish","translation"],"hasMore":false,"image":"https:\/\/avris.it\/image\/avris-polonisator_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-polonisator_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-polonisator_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EAn extension to Avris Localisator and Avris Stringer introducing support for the Polish language.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-polonisator_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-polonisator_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EAn extension to Avris Localisator and Avris Stringer introducing support for the Polish language.\u003C\/p\u003E","words":14,"readTime":null,"lang":"en"}}},"projects\/avris-stringer":{"key":"projects\/avris-stringer","type":"article","published":true,"meta":{"createdAt":"2018-01-10T19:12:52+01:00","publishedAt":"2018-01-10T19:10:00+01:00","group":null,"links":[{"icon":"brands gitlab","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/Stringer","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-stringer"},"content":{"en":{"slug":"avris-stringer","title":"Avris Stringer","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-stringer_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHlklEQVRIiX2X268lRRXGf+tS1b33PnufM7fDneGuiDoRJZIQA5IgEIMGjRc0IfqgDxof\/BN8980Ho\/FZn4wviIlGI5BAAmi8wIBEYAYYBgLMnMs+t91dtXzoPYNRY6Wru5Ouy1ffV6vW13L1NbdElIoQRK0QFXOnlkIQqAiuhqmS3FksDqi1QgREIICIIAxFRBARILhQImJZ68UnUREBFcHcMRGaZoRHCBFBqQUJEKCUgjAMrKoDUFGolaRKv5wAkWU7LrYXARBU5f3J5cK7ELUgakS8388QkhpaC36hg6AElQjQEESHyQhB1QGhLxVDUIQQxVSXbAwLQYZvy2t5M9yNxaJDBCKGBYoouuxrqrgZSRUPUahlSfDACBFICKqGm2IimChuikSl1kqtZRjAfVh9rajaRalUhKiVIFhdW2Pj3HmgQgjiELWgKhBgpiQzkl8AJIAK1CVbAiK6lMFQFDMjW2LcNBA9u3t7NO40ycmeqLVSSk9fCgjDfqkVgMsuWedgew7UgbQIVPMSlGI6SJxNcdFERIeEgVT04iYV1Gyg1hIqioqh4kyaCYdGq5yfb6KhRAkaT6hniEKI0PfdwJDA8auv5q1TryESSICpIASQEImlZEoyxTVl+mAZMXYhVkB1YEcNUyO7ky2hGCKJJieuPbbCzu6cg67jkkvXWeztMt\/axkTIrtSo3PGZO3n55IvMckMQQ2QBqoMoqiACyZTshocmJC3lQqgBJoqqoaK4Oa5G9oyLkMxJkkjacPjwKl\/4xpc4fGiNP\/7yN7x++nWsWSH5EE3T1RXuuPtOnn\/sSdbaEVCIiAGMCipgJpgOrLkLTm6Q3qk1lvoCKKKGmiNiuDmqCTdb1sRd93+Kh777FV569gUe+dEvSBRuuuxyola2d+Z4Nr7+g+\/z7K8e5crZjEXpqNETUQbpdBldadhDOSmm4NJOqF1Bah3OoQDEEHHUEskcVSOZ06bM2J1vfueL3PvgXczPb\/PoTx4h64hD45brb7icnc132dzd5+7vfY2kQj39Bh+8bJ353i77\/YJSe0rtQCvJDTPBXUkupGS4jGfIoodSCRj2CIpIQsUQT2R12pQYp8RDD9\/DvQ\/eBcDfnniORMN0ZcrKuGH73B7HP\/FRPvPAHXjb8NQPf8b60VU0Oja3gr5PlBgAhVRUg5QddyElxbPgMppC7qGAhEIogoI4aMLUSebklDhx4lo+9+VPX0wJW2\/POXLJMa44vs7xW67iqluvY3J0RkTw+m8fZzLKlLpC2\/TkpoJUanT0\/YKoHWqgGpgbuXE8Cc50FfpChAxgYoguw3FNKI4sD8CHv33\/xZMZ4L5v3cN\/lojgzON\/YvHOuxy75ggHm5luZ4OZdohVxIJaO2p\/gNCjJpgrKWe8aXCdTkmFIc+geCgJI4uTw8hqZJRbT1zNFVcc\/i8A\/15qKbz8u2fYfull2onSro45dvOV9JsTts4KKguEDiQTJSFShwhLjuWMNSN8ujalFGDJkCF4OK0YLUqL0VTh9k\/e8H\/BzN\/Z5OSvn2Tx3juMGkCh29tl970OlwXj1YbaleHsMVBJyFIudcdyizYj\/NLDI\/o+qAVqKBqKYqQQEkYbSlOEm647+j+B7G3t8o8nnuPMn18kS8eorUPqqBAd1AODRskjJZJiEkuZEmqKpYzmBkkN5BH+4fWG3f2OxUFh0VdKqZRakRAkKlYEE+HoofFFEDvzPU6\/dIZTf32FM8+\/ShMdYy9EKjiVrJXQAAtYDLlSUpA8cBPMBE0JyS0kg5whN+At\/sChN9nZr8znHVs7lXkfbB\/A7gL2O1j0Qunhpz\/+OXs7e2y8u8XOuS1yKSQKiUqrlZH1TFIwayuLcYVpkEJobbAZUjrUA8uG1aDrDGNKd2Bom9g8P6ajRe665WjM2sT+\/mCV3DIhTsUJSRScqpm+QoiCOuPxhDY37O\/tsTqdEn2PUWkUJhmmGY5NgssOFdaPGpOJ8NrZDeZ7e5TcsXb5FTz2+6c5dfaAWVtZX59y0AVPndxBVtYOh6aMqGEp4U2LqOG5wVPGUoOqkZsW80TyzO23fZyjq6vsbM\/Jnil9ZeyJ6bghRWHWZjZeO0Pu5hxZUQ5NIGlPsp61Sc9NJ8ZsnJ3zztktpiNw6Tl2+z3s\/v0P+M2f\/yrNyoy+QjuZ4qlB1RFzkidEDGHIOxKClEq\/0lJnK6ysBdtbO2gENA3X3XglJ0++yqKDbVZZG62xk5ScjDZVqlX2m0pnaxz+AGzMXyGNhMZ7+vO7rHzoXrxgzHf3wBKL7W1EdgAdvFAMBnzwQiClQqm8e7bywv4+1EI2Q0ogETz9zNNYFbQWxikzTc7UndUmMU6Ca2GcYb7fcdtHZrxxXqnnemYjmG68yY33fQw\/f\/qfLLoO9UwtFW9G8P4\/BAJ4SqgqEkHUQGMAoLUifX\/R4NfuABdj4+3XaHOLi7C6MuPIbA2Pyu7uFodmU\/7yovPW6RFvb+5z6r19RjlodMFn+zeQo9ffHLUU+sWC2h2QJlMkhLLYR1MzpIPa47kFGDw3oDVQBIkLHnrw4hqBUDERXAUXUCrZDNWg7zuEwvrUWW2Nc3uDzW0cbj8O\/wI5fjvJRZLhiwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-stringer_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA set of useful, string-related helpers:\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-stringer_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHlklEQVRIiX2X268lRRXGf+tS1b33PnufM7fDneGuiDoRJZIQA5IgEIMGjRc0IfqgDxof\/BN8980Ho\/FZn4wviIlGI5BAAmi8wIBEYAYYBgLMnMs+t91dtXzoPYNRY6Wru5Ouy1ffV6vW13L1NbdElIoQRK0QFXOnlkIQqAiuhqmS3FksDqi1QgREIICIIAxFRBARILhQImJZ68UnUREBFcHcMRGaZoRHCBFBqQUJEKCUgjAMrKoDUFGolaRKv5wAkWU7LrYXARBU5f3J5cK7ELUgakS8388QkhpaC36hg6AElQjQEESHyQhB1QGhLxVDUIQQxVSXbAwLQYZvy2t5M9yNxaJDBCKGBYoouuxrqrgZSRUPUahlSfDACBFICKqGm2IimChuikSl1kqtZRjAfVh9rajaRalUhKiVIFhdW2Pj3HmgQgjiELWgKhBgpiQzkl8AJIAK1CVbAiK6lMFQFDMjW2LcNBA9u3t7NO40ycmeqLVSSk9fCgjDfqkVgMsuWedgew7UgbQIVPMSlGI6SJxNcdFERIeEgVT04iYV1Gyg1hIqioqh4kyaCYdGq5yfb6KhRAkaT6hniEKI0PfdwJDA8auv5q1TryESSICpIASQEImlZEoyxTVl+mAZMXYhVkB1YEcNUyO7ky2hGCKJJieuPbbCzu6cg67jkkvXWeztMt\/axkTIrtSo3PGZO3n55IvMckMQQ2QBqoMoqiACyZTshocmJC3lQqgBJoqqoaK4Oa5G9oyLkMxJkkjacPjwKl\/4xpc4fGiNP\/7yN7x++nWsWSH5EE3T1RXuuPtOnn\/sSdbaEVCIiAGMCipgJpgOrLkLTm6Q3qk1lvoCKKKGmiNiuDmqCTdb1sRd93+Kh777FV569gUe+dEvSBRuuuxyola2d+Z4Nr7+g+\/z7K8e5crZjEXpqNETUQbpdBldadhDOSmm4NJOqF1Bah3OoQDEEHHUEskcVSOZ06bM2J1vfueL3PvgXczPb\/PoTx4h64hD45brb7icnc132dzd5+7vfY2kQj39Bh+8bJ353i77\/YJSe0rtQCvJDTPBXUkupGS4jGfIoodSCRj2CIpIQsUQT2R12pQYp8RDD9\/DvQ\/eBcDfnniORMN0ZcrKuGH73B7HP\/FRPvPAHXjb8NQPf8b60VU0Oja3gr5PlBgAhVRUg5QddyElxbPgMppC7qGAhEIogoI4aMLUSebklDhx4lo+9+VPX0wJW2\/POXLJMa44vs7xW67iqluvY3J0RkTw+m8fZzLKlLpC2\/TkpoJUanT0\/YKoHWqgGpgbuXE8Cc50FfpChAxgYoguw3FNKI4sD8CHv33\/xZMZ4L5v3cN\/lojgzON\/YvHOuxy75ggHm5luZ4OZdohVxIJaO2p\/gNCjJpgrKWe8aXCdTkmFIc+geCgJI4uTw8hqZJRbT1zNFVcc\/i8A\/15qKbz8u2fYfull2onSro45dvOV9JsTts4KKguEDiQTJSFShwhLjuWMNSN8ujalFGDJkCF4OK0YLUqL0VTh9k\/e8H\/BzN\/Z5OSvn2Tx3juMGkCh29tl970OlwXj1YbaleHsMVBJyFIudcdyizYj\/NLDI\/o+qAVqKBqKYqQQEkYbSlOEm647+j+B7G3t8o8nnuPMn18kS8eorUPqqBAd1AODRskjJZJiEkuZEmqKpYzmBkkN5BH+4fWG3f2OxUFh0VdKqZRakRAkKlYEE+HoofFFEDvzPU6\/dIZTf32FM8+\/ShMdYy9EKjiVrJXQAAtYDLlSUpA8cBPMBE0JyS0kg5whN+At\/sChN9nZr8znHVs7lXkfbB\/A7gL2O1j0Qunhpz\/+OXs7e2y8u8XOuS1yKSQKiUqrlZH1TFIwayuLcYVpkEJobbAZUjrUA8uG1aDrDGNKd2Bom9g8P6ajRe665WjM2sT+\/mCV3DIhTsUJSRScqpm+QoiCOuPxhDY37O\/tsTqdEn2PUWkUJhmmGY5NgssOFdaPGpOJ8NrZDeZ7e5TcsXb5FTz2+6c5dfaAWVtZX59y0AVPndxBVtYOh6aMqGEp4U2LqOG5wVPGUoOqkZsW80TyzO23fZyjq6vsbM\/Jnil9ZeyJ6bghRWHWZjZeO0Pu5hxZUQ5NIGlPsp61Sc9NJ8ZsnJ3zztktpiNw6Tl2+z3s\/v0P+M2f\/yrNyoy+QjuZ4qlB1RFzkidEDGHIOxKClEq\/0lJnK6ysBdtbO2gENA3X3XglJ0++yqKDbVZZG62xk5ScjDZVqlX2m0pnaxz+AGzMXyGNhMZ7+vO7rHzoXrxgzHf3wBKL7W1EdgAdvFAMBnzwQiClQqm8e7bywv4+1EI2Q0ogETz9zNNYFbQWxikzTc7UndUmMU6Ca2GcYb7fcdtHZrxxXqnnemYjmG68yY33fQw\/f\/qfLLoO9UwtFW9G8P4\/BAJ4SqgqEkHUQGMAoLUifX\/R4NfuABdj4+3XaHOLi7C6MuPIbA2Pyu7uFodmU\/7yovPW6RFvb+5z6r19RjlodMFn+zeQo9ffHLUU+sWC2h2QJlMkhLLYR1MzpIPa47kFGDw3oDVQBIkLHnrw4hqBUDERXAUXUCrZDNWg7zuEwvrUWW2Nc3uDzW0cbj8O\/wI5fjvJRZLhiwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-stringer_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA set of useful, string-related helpers:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EconvertCase\u003C\/li\u003E\n\u003Cli\u003EcleanUrl\u003C\/li\u003E\n\u003Cli\u003EnumberInWords\u003C\/li\u003E\n\u003Cli\u003EtimeInWords\u003C\/li\u003E\n\u003Cli\u003EtimeDiff\u003C\/li\u003E\n\u003Cli\u003Elistify\u003C\/li\u003E\n\u003Cli\u003Ephone\u003C\/li\u003E\n\u003Cli\u003EarabicToRoman\u003C\/li\u003E\n\u003C\/ul\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["helper","language","library","numbers","php","string","time","words"],"hasMore":true,"image":"https:\/\/avris.it\/image\/avris-stringer_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-stringer_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-stringer_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA set of useful, string-related helpers:\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-stringer_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-stringer_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA set of useful, string-related helpers:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EconvertCase\u003C\/li\u003E\n\u003Cli\u003EcleanUrl\u003C\/li\u003E\n\u003Cli\u003EnumberInWords\u003C\/li\u003E\n\u003Cli\u003EtimeInWords\u003C\/li\u003E\n\u003Cli\u003EtimeDiff\u003C\/li\u003E\n\u003Cli\u003Elistify\u003C\/li\u003E\n\u003Cli\u003Ephone\u003C\/li\u003E\n\u003Cli\u003EarabicToRoman\u003C\/li\u003E\n\u003C\/ul\u003E","words":14,"readTime":null,"lang":"en"}}},"projects\/avris-localisator":{"key":"projects\/avris-localisator","type":"article","published":true,"meta":{"createdAt":"2018-01-10T19:09:58+01:00","publishedAt":"2018-01-10T19:08:00+01:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/Localisator","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-localisator"},"content":{"en":{"slug":"avris-localisator","title":"Avris Localisator","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-localisator_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHmUlEQVRIiX2Xya8dRxXGf2eo6r73vfsGx37GQ+wMEAgBLBCISBFKiJRJCBAgZgnBAhYgFvwJ7NmxQCDWsEJsGCQQiEFKJAiIIQkhIiGOY0xkx2+67973bnfVYdHXDgJEqSepq7q++r4653wt5267J6JUhCBqhaiYO7UUgkBFcDVMleTOYnFErRUiIAIBRARhaCKCiADBjRYRy7PevBMVEVARzB0ToWlGeIQQEZRakAABSikIw4dVdQAqCrWSVOmXEyCy7MfN\/iIAgqq8NrnceBaiFkSNiNfGGUJSQ2vBbwwQlKASARqC6DAZIag6IPSlYgiKEKKY6pKNYSHI8G55LC+Gu7FYdIhAxLBAEUWXY00VNyOp4iEKtSwJHhghAglB1XBTTAQTxU2RqNRaqbUMH3AfVl8rqnZTKhUhaiUI1jc22Lm+DVQIQRyiFlQFAsyUZEbyG4AEUIG6ZEtARJcyGIpiZmRLjJsGomc2n9O40yQne6LWSik9fSkgDPulVgBOndziaH8K1IG0CFTzEpRiOkicTXHRRESHhIFU9OYmFdRsoNYSKoqKoeKsNCtsjtbZnu6ioUQJGk+oZ4hCiND33cCQwPlz5\/jniy8hEkiAqSAEkBCJpWRKMsU1ZfpgGTF2I1ZAdWBHDVMju5MtoRgiiSYnbj+xysFsylHXcfJ1WyzmM6Z7+5gI2ZUalfsevp\/nn3mWtdwQxBBZgOogiiqIQDIlu+GhCUlLuRBqgImiaqgobo6rkT3jIiRzkiSSNhw7ts6HP\/tRjm1u8Ivv\/ZhLFy9hzSrJh2iarK9y34P38\/QvH2ejHQGFiBjAqKACZoLpwJq74OQG6Z1aY6kvgCJqqDkihpujmnCz5Zl44LH38MkvfZznnvwLP\/j6d0kU7jp1mqiV\/YMpno1Pf\/UrPPn9H3F2bY1F6ajRE1EG6XQZXWnYQzkppuDSrlC7gtQ65KEAxBBx1BLJHFUjmdOmzNidz33xIzzyoQeYbu\/zo2\/+gKwjNsctd77+NAe719idHfLglz9FUqFefJk3ndpiOp9x2C8otafUDrSS3DAT3JXkQkqGy3gNWfRQKgHDHkERSagY4omsTpsS45T45Gce4pEPPQDAn379FImGyeqE1XHD\/vU559\/5Nh5+\/3142\/DE177N1vF1NDp294K+T5QYAIVUVIOUHXchJcWz4DKaQO6hgIRCKIKCOGjC1Enm5JS4cOF2PvCx994sCXuvTLnl5AnOnN\/i\/D23cus77mDl+BoRwaWf\/IqVUabUVdqmJzcVpFKjo+8XRO1QA9XA3MiN40lwJuvQFyJkABNDdBmOa0JxZJkAP\/OFx25mZoBHP\/8Q\/9kigsu\/+h2Lq9c4cdstHO1muoMd1rRDrCIW1NpR+yOEHjXBXEk5402D62RCKgx1BsVDSRhZnBxGViOjvOPCOc6cOfZfAP691VJ4\/qe\/Zf+552lXlHZ9zIm7z9LvrrB3RVBZIHQgmSgJkTpEWHIsZ6wZ4ZONCaUAS4YMwcNpxWhRWoymCve++\/X\/F8z06i7P\/PBxFq9eZdQACt18xuzVDpcF4\/WG2pUh9xioJGQpl7pjuUWbEf66YyP6PqgFaigaimKkEBJGG0pThLvuOP4\/gcz3Zvz1109x+ffPkqVj1NahdFSIDuqRQaPkkRJJMYmlTAk1xVJGc4OkBvIIf8tWw+ywY3FUWPSVUiqlViQEiYoVwUQ4vjm+CeJgOufic5d58Y8vcPnpv9NEx9gLkQpOJWslNMACFkOtlBQkD9wEM0FTQnILySBnyA14i79\/8x8cHFam0469g8q0D\/aPYLaAww4WvVB6+NY3vsP8YM7OtT0Oru+RSyFRSFRarYysZyUFa21lMa4wCVIIrQ02Q0qHemDZsBp0nWFM6I4MbRO722M6WuSBe47HWps4PBysklsmxKk4IYmCUzXTV0CN1Izouh7XIWtnd86dPc3OtWskKquNMMlwfFw5tVnYOm6srAgvXdlhOp9TcsfG6TP88me\/4cUrR6y1la2tCUdd8MQzB8jqxrHQlBE1LCW8aRE1PDd4ylhqUDVy07Kysspdd9xOm5xx07K9O+eOs6c4trnJwd4B+9u7vOH8KepszkiD1grl6iU2VyBpT7KejZWeuy6M2bky5eqVPSYjcOk5ce9DzP78c\/zuD36CZnWNvkK7MsFTg6oj5iRPiBjCUHeyGm+89STz+SEuwnpXEIK5GfPGOXHnSa4fLWjaFjOhO5gR6Sw5GW2qVKscNpXONjj2RtiZvkAaCY339NszVt\/8CF4wprM5WGKxv4\/IAaCDF4rBgA9eCKRUrly6iNRKPTyEWshmSAkkAquFxOCNxykzSc7EnfUmMU6Ca2GcYXrY8a63rvHytlKv96yNYLLzD97w6Nvx7Yt\/Y9F1qGdqqXgzgtf+IRDAU0JVkQiiBhoDAK0V6fubBr92R7gYO6+8RJvbgcXVNW5Z28CjMpvtsbk24Q\/POv+8OOKV3UNefPWQUQ4aXfC+\/mXk+J13Ry2FfrGgdkeklQkSQlkcoqkZykHt8dwCDJ4b0BoogsQNDz14cY1AqJgIroILKJVshmrQ9x1CYWvirLfG9flgcxuHe8\/DvwDS\/jrrbBLcdQAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-localisator_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA neat tool to localise messages.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-localisator_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHmUlEQVRIiX2Xya8dRxXGf2eo6r73vfsGx37GQ+wMEAgBLBCISBFKiJRJCBAgZgnBAhYgFvwJ7NmxQCDWsEJsGCQQiEFKJAiIIQkhIiGOY0xkx2+67973bnfVYdHXDgJEqSepq7q++r4653wt5267J6JUhCBqhaiYO7UUgkBFcDVMleTOYnFErRUiIAIBRARhaCKCiADBjRYRy7PevBMVEVARzB0ToWlGeIQQEZRakAABSikIw4dVdQAqCrWSVOmXEyCy7MfN\/iIAgqq8NrnceBaiFkSNiNfGGUJSQ2vBbwwQlKASARqC6DAZIag6IPSlYgiKEKKY6pKNYSHI8G55LC+Gu7FYdIhAxLBAEUWXY00VNyOp4iEKtSwJHhghAglB1XBTTAQTxU2RqNRaqbUMH3AfVl8rqnZTKhUhaiUI1jc22Lm+DVQIQRyiFlQFAsyUZEbyG4AEUIG6ZEtARJcyGIpiZmRLjJsGomc2n9O40yQne6LWSik9fSkgDPulVgBOndziaH8K1IG0CFTzEpRiOkicTXHRRESHhIFU9OYmFdRsoNYSKoqKoeKsNCtsjtbZnu6ioUQJGk+oZ4hCiND33cCQwPlz5\/jniy8hEkiAqSAEkBCJpWRKMsU1ZfpgGTF2I1ZAdWBHDVMju5MtoRgiiSYnbj+xysFsylHXcfJ1WyzmM6Z7+5gI2ZUalfsevp\/nn3mWtdwQxBBZgOogiiqIQDIlu+GhCUlLuRBqgImiaqgobo6rkT3jIiRzkiSSNhw7ts6HP\/tRjm1u8Ivv\/ZhLFy9hzSrJh2iarK9y34P38\/QvH2ejHQGFiBjAqKACZoLpwJq74OQG6Z1aY6kvgCJqqDkihpujmnCz5Zl44LH38MkvfZznnvwLP\/j6d0kU7jp1mqiV\/YMpno1Pf\/UrPPn9H3F2bY1F6ajRE1EG6XQZXWnYQzkppuDSrlC7gtQ65KEAxBBx1BLJHFUjmdOmzNidz33xIzzyoQeYbu\/zo2\/+gKwjNsctd77+NAe719idHfLglz9FUqFefJk3ndpiOp9x2C8otafUDrSS3DAT3JXkQkqGy3gNWfRQKgHDHkERSagY4omsTpsS45T45Gce4pEPPQDAn379FImGyeqE1XHD\/vU559\/5Nh5+\/3142\/DE177N1vF1NDp294K+T5QYAIVUVIOUHXchJcWz4DKaQO6hgIRCKIKCOGjC1Enm5JS4cOF2PvCx994sCXuvTLnl5AnOnN\/i\/D23cus77mDl+BoRwaWf\/IqVUabUVdqmJzcVpFKjo+8XRO1QA9XA3MiN40lwJuvQFyJkABNDdBmOa0JxZJkAP\/OFx25mZoBHP\/8Q\/9kigsu\/+h2Lq9c4cdstHO1muoMd1rRDrCIW1NpR+yOEHjXBXEk5402D62RCKgx1BsVDSRhZnBxGViOjvOPCOc6cOfZfAP691VJ4\/qe\/Zf+552lXlHZ9zIm7z9LvrrB3RVBZIHQgmSgJkTpEWHIsZ6wZ4ZONCaUAS4YMwcNpxWhRWoymCve++\/X\/F8z06i7P\/PBxFq9eZdQACt18xuzVDpcF4\/WG2pUh9xioJGQpl7pjuUWbEf66YyP6PqgFaigaimKkEBJGG0pThLvuOP4\/gcz3Zvz1109x+ffPkqVj1NahdFSIDuqRQaPkkRJJMYmlTAk1xVJGc4OkBvIIf8tWw+ywY3FUWPSVUiqlViQEiYoVwUQ4vjm+CeJgOufic5d58Y8vcPnpv9NEx9gLkQpOJWslNMACFkOtlBQkD9wEM0FTQnILySBnyA14i79\/8x8cHFam0469g8q0D\/aPYLaAww4WvVB6+NY3vsP8YM7OtT0Oru+RSyFRSFRarYysZyUFa21lMa4wCVIIrQ02Q0qHemDZsBp0nWFM6I4MbRO722M6WuSBe47HWps4PBysklsmxKk4IYmCUzXTV0CN1Izouh7XIWtnd86dPc3OtWskKquNMMlwfFw5tVnYOm6srAgvXdlhOp9TcsfG6TP88me\/4cUrR6y1la2tCUdd8MQzB8jqxrHQlBE1LCW8aRE1PDd4ylhqUDVy07Kysspdd9xOm5xx07K9O+eOs6c4trnJwd4B+9u7vOH8KepszkiD1grl6iU2VyBpT7KejZWeuy6M2bky5eqVPSYjcOk5ce9DzP78c\/zuD36CZnWNvkK7MsFTg6oj5iRPiBjCUHeyGm+89STz+SEuwnpXEIK5GfPGOXHnSa4fLWjaFjOhO5gR6Sw5GW2qVKscNpXONjj2RtiZvkAaCY339NszVt\/8CF4wprM5WGKxv4\/IAaCDF4rBgA9eCKRUrly6iNRKPTyEWshmSAkkAquFxOCNxykzSc7EnfUmMU6Ca2GcYXrY8a63rvHytlKv96yNYLLzD97w6Nvx7Yt\/Y9F1qGdqqXgzgtf+IRDAU0JVkQiiBhoDAK0V6fubBr92R7gYO6+8RJvbgcXVNW5Z28CjMpvtsbk24Q\/POv+8OOKV3UNefPWQUQ4aXfC+\/mXk+J13Ry2FfrGgdkeklQkSQlkcoqkZykHt8dwCDJ4b0BoogsQNDz14cY1AqJgIroILKJVshmrQ9x1CYWvirLfG9flgcxuHe8\/DvwDS\/jrrbBLcdQAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-localisator_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA neat tool to localise messages.\u003C\/p\u003E\n\u003Cp\u003ELocalisator uses three elements to translate your messages:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003ELocaleOrder \u2013 decides which language(s) should be used,\u003C\/li\u003E\n\u003Cli\u003EProviders \u2013 fetches a translation for a specific key from a source (file, database, cache, ...),\u003C\/li\u003E\n\u003Cli\u003ETransformers \u2013 modifies the translation with more advanced logic (pluralisation, fallback, nesting, ...).\u003C\/li\u003E\n\u003C\/ul\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["i18n","language","library","locale","localisation","localization","php","translation"],"hasMore":true,"image":"https:\/\/avris.it\/image\/avris-localisator_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-localisator_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-localisator_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA neat tool to localise messages.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-localisator_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-localisator_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA neat tool to localise messages.\u003C\/p\u003E\n\u003Cp\u003ELocalisator uses three elements to translate your messages:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003ELocaleOrder \u2013 decides which language(s) should be used,\u003C\/li\u003E\n\u003Cli\u003EProviders \u2013 fetches a translation for a specific key from a source (file, database, cache, ...),\u003C\/li\u003E\n\u003Cli\u003ETransformers \u2013 modifies the translation with more advanced logic (pluralisation, fallback, nesting, ...).\u003C\/li\u003E\n\u003C\/ul\u003E","words":47,"readTime":null,"lang":"en"}}},"projects\/avris-container":{"key":"projects\/avris-container","type":"article","published":true,"meta":{"createdAt":"2018-01-09T20:22:03+01:00","publishedAt":"2018-01-09T20:21:00+01:00","group":null,"links":[{"icon":"brands gitlab","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/Container","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-container"},"content":{"en":{"slug":"avris-container","title":"Avris Container","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-container_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHlklEQVRIiX2XyY8kRxXGf2+JyKyqruplZnq8zoA3MAYsNmFkIYwlLwgBAsRikBAc4ADiwJ\/AnRsHBOIMJ8TFgAQCgS3ZEptYjbEweLwNlsczvVR3V1dmxOOQNW0EiFBGZkoZyxffFy\/el3LuNXdElIoQRK0QFXOnlkIQqAiuhqmS3Fkuj6m1QgREIICIIAxFRBARILhaImJV68mTqIiAimDumAhNM8IjhIig1IIECFBKQRgGVtUBqCjUSlKlX02AyKodJ+1FAARVeXVyufouRC2IGhGv9jOEpIbWgl\/tIChBJQI0BNFhMkJQdUDoS8UQFCFEMdUVG8NCkOHb6lrdDHdjuewQgYhhgSKKrvqaKm5GUsVDFGpZETwwQgQSgqrhppgIJoqbIlGptVJrGQZwH1ZfK6p2IpWKELUSBOsbG+xcvgJUCEEcohZUBQLMlGRG8quABFCBumJLQERXMhiKYmZkS4ybBqLn8OiIxp0mOdkTtVZK6elLAWHYL7UCcO3ZbY7350AdSItANa9AKaaDxNkUF01EdEgYSEVPNqmgZgO1llBRVAwVZ9JM2Bytc2W+i4YSJWg8oZ4hCiFC33cDQwLnz53jn888i0ggAaaCEEBCJFaSKckU15Tpg1XE2NVYAdWBHTVMjexOtoRiiCSanHjtmTUODuccdx1nr9lmeXTIfG8fEyG7UqNy9\/3v4eknnmSWG4IYIgtQHURRBRFIpmQ3PDQhaSUXQg0wUVQNFcXNcTWyZ1yEZE6SRNKGra11PvLZj7G1ucHPv\/cjnrvwHNaskXyIpun6Gnff+x7+\/IvH2GhHQCEiBjAqqICZYDqw5i44uUF6p9ZY6QugiBpqjojh5qgm3GxVE\/e879089KVP8NSv\/8LDX\/8uicJt115H1Mr+wRzPxqe\/+hV+\/f0fcsNsxrJ01OiJKIN0uoquNOyhnBRTcGkn1K4gtQ7nUABiiDhqiWSOqpHMaVNm7M7nvvhRHvjwPcyv7PPDbz5M1hGb45abb7mOg91L7B4uuPfLnyKpUC88z+uv3WZ+dMiiX1JqT6kdaCW5YSa4K8mFlAyX8QxZ9lAqAcMeQRFJqBjiiaxOmxLjlHjoM\/fxwIfvAeAPj\/6JRMN0bcrauGH\/8hHn3\/5m7v\/A3Xjb8PjXvs326XU0Onb3gr5PlBgAhVRUg5QddyElxbPgMppC7qGAhEIogoI4aMLUSebklLjzztfywY+\/9yQl7L0059TZM1x\/fpvzd9zIjW+9icnpGRHBcz9+hMkoU+oabdOTmwpSqdHR90uidqiBamBu5MbxJDjTdegLETKAiSG6DMc1oTiyOgA\/84X3nZzMAA9+\/j7+s0QELzzyG5YvX+LMa05xvJvpDnaYaYdYRSyotaP2xwg9aoK5knLGmwbX6ZRUGPIMioeSMLI4OYysRkZ5653nuP76rf8C8O+llsLTP\/kV+089TTtR2vUxZ26\/gX53wt5FQWWJ0IFkoiRE6hBhybGcsWaETzemlAKsGDIED6cVo0VpMZoq3PXOW\/4vmPnLuzzxg8dYvvIyowZQ6I4OOXylw2XJeL2hdmU4ewxUErKSS92x3KLNCL9ma0TfB7VADUVDUYwUQsJoQ2mKcNtNp\/8nkKO9Q\/766J944bdPkqVj1NYhdVSIDuqxQaPkkRJJMYmVTAk1xVJGc4OkBvIIf+N2w+GiY3lcWPaVUiqlViQEiYoVwUQ4vTk+AXEwP+LCUy\/wzO\/\/zgt\/\/gdNdIy9EKngVLJWQgMsYDnkSklB8sBNMBM0JSS3kAxyhtyAt\/gHNl\/kYFGZzzv2DirzPtg\/hsMlLDpY9kLp4Vvf+A5HB0fsXNrj4PIeuRQShUSl1crIeiYpmLWV5bjCNEghtDbYDCkd6oFlw2rQdYYxpTs2tE3sXhnT0SL33HE6Zm1isRisklsmxKk4IYmCUzXTVwhR1BObm6fY29nFzWhSovGES2VrfQLHB0wznJkE124Wtk8bk4nw7MUd5kdHlNyxcd31\/OKnv+SZi8fM2sr29pTjLnj8iQNkbWMrNGVEDUsJb1pEDc8NnjKWGlSN3LSYJ971trdw8dIut95wltJVmmZE45mttTGH+wdMsjNrE9Ns7D1\/gTVZsDmBpD3JejYmPbfdOWbn4pyXL+4xHYFLz5m77uPwjz\/Db\/\/QJ2nWZvQV2skUTw2qjpiTPCFiCEPekRB8NuGmc7A1m7C7e0DfdUzHI3p3sAn7xx21KseLYFG3kFbJyWhTpVpl0VQ622DrdbAz\/ztpJDTe0185ZO0ND+AFY354BJZY7u8jcgDo4IViMOCDFwIplUsvVqRW6mIBtZDNkBJIBFYLicEbj1NmmpypO+tNYpwE18I4w3zR8Y43zXj+ilIv98xGMN15kVsffAt+5cLfWHYd6plaKt6M4NV\/CATwlFBVJIKogcYAQGtF+v7E4NfuGBdj56VnaXOLi7C+NuPUbAOPyuHhHpuzKb970vnnhREv7S545pUFoxw0uuT9\/fPI6Ztvj1oK\/XJJ7Y5JkykSQlku0NQM6aD2eG4BBs8NaA0UQeKqhx68uEYgVEwEV8EFlEo2QzXo+w6hsD111lvj8tFgcxuHu87DvwCrEznQnIJIIAAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-container_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA dependency injection container with autowiring\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-container_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHlklEQVRIiX2XyY8kRxXGf2+JyKyqruplZnq8zoA3MAYsNmFkIYwlLwgBAsRikBAc4ADiwJ\/AnRsHBOIMJ8TFgAQCgS3ZEptYjbEweLwNlsczvVR3V1dmxOOQNW0EiFBGZkoZyxffFy\/el3LuNXdElIoQRK0QFXOnlkIQqAiuhqmS3Fkuj6m1QgREIICIIAxFRBARILhaImJV68mTqIiAimDumAhNM8IjhIig1IIECFBKQRgGVtUBqCjUSlKlX02AyKodJ+1FAARVeXVyufouRC2IGhGv9jOEpIbWgl\/tIChBJQI0BNFhMkJQdUDoS8UQFCFEMdUVG8NCkOHb6lrdDHdjuewQgYhhgSKKrvqaKm5GUsVDFGpZETwwQgQSgqrhppgIJoqbIlGptVJrGQZwH1ZfK6p2IpWKELUSBOsbG+xcvgJUCEEcohZUBQLMlGRG8quABFCBumJLQERXMhiKYmZkS4ybBqLn8OiIxp0mOdkTtVZK6elLAWHYL7UCcO3ZbY7350AdSItANa9AKaaDxNkUF01EdEgYSEVPNqmgZgO1llBRVAwVZ9JM2Bytc2W+i4YSJWg8oZ4hCiFC33cDQwLnz53jn888i0ggAaaCEEBCJFaSKckU15Tpg1XE2NVYAdWBHTVMjexOtoRiiCSanHjtmTUODuccdx1nr9lmeXTIfG8fEyG7UqNy9\/3v4eknnmSWG4IYIgtQHURRBRFIpmQ3PDQhaSUXQg0wUVQNFcXNcTWyZ1yEZE6SRNKGra11PvLZj7G1ucHPv\/cjnrvwHNaskXyIpun6Gnff+x7+\/IvH2GhHQCEiBjAqqICZYDqw5i44uUF6p9ZY6QugiBpqjojh5qgm3GxVE\/e879089KVP8NSv\/8LDX\/8uicJt115H1Mr+wRzPxqe\/+hV+\/f0fcsNsxrJ01OiJKIN0uoquNOyhnBRTcGkn1K4gtQ7nUABiiDhqiWSOqpHMaVNm7M7nvvhRHvjwPcyv7PPDbz5M1hGb45abb7mOg91L7B4uuPfLnyKpUC88z+uv3WZ+dMiiX1JqT6kdaCW5YSa4K8mFlAyX8QxZ9lAqAcMeQRFJqBjiiaxOmxLjlHjoM\/fxwIfvAeAPj\/6JRMN0bcrauGH\/8hHn3\/5m7v\/A3Xjb8PjXvs326XU0Onb3gr5PlBgAhVRUg5QddyElxbPgMppC7qGAhEIogoI4aMLUSebklLjzztfywY+\/9yQl7L0059TZM1x\/fpvzd9zIjW+9icnpGRHBcz9+hMkoU+oabdOTmwpSqdHR90uidqiBamBu5MbxJDjTdegLETKAiSG6DMc1oTiyOgA\/84X3nZzMAA9+\/j7+s0QELzzyG5YvX+LMa05xvJvpDnaYaYdYRSyotaP2xwg9aoK5knLGmwbX6ZRUGPIMioeSMLI4OYysRkZ5653nuP76rf8C8O+llsLTP\/kV+089TTtR2vUxZ26\/gX53wt5FQWWJ0IFkoiRE6hBhybGcsWaETzemlAKsGDIED6cVo0VpMZoq3PXOW\/4vmPnLuzzxg8dYvvIyowZQ6I4OOXylw2XJeL2hdmU4ewxUErKSS92x3KLNCL9ma0TfB7VADUVDUYwUQsJoQ2mKcNtNp\/8nkKO9Q\/766J944bdPkqVj1NYhdVSIDuqxQaPkkRJJMYmVTAk1xVJGc4OkBvIIf+N2w+GiY3lcWPaVUiqlViQEiYoVwUQ4vTk+AXEwP+LCUy\/wzO\/\/zgt\/\/gdNdIy9EKngVLJWQgMsYDnkSklB8sBNMBM0JSS3kAxyhtyAt\/gHNl\/kYFGZzzv2DirzPtg\/hsMlLDpY9kLp4Vvf+A5HB0fsXNrj4PIeuRQShUSl1crIeiYpmLWV5bjCNEghtDbYDCkd6oFlw2rQdYYxpTs2tE3sXhnT0SL33HE6Zm1isRisklsmxKk4IYmCUzXTVwhR1BObm6fY29nFzWhSovGES2VrfQLHB0wznJkE124Wtk8bk4nw7MUd5kdHlNyxcd31\/OKnv+SZi8fM2sr29pTjLnj8iQNkbWMrNGVEDUsJb1pEDc8NnjKWGlSN3LSYJ971trdw8dIut95wltJVmmZE45mttTGH+wdMsjNrE9Ns7D1\/gTVZsDmBpD3JejYmPbfdOWbn4pyXL+4xHYFLz5m77uPwjz\/Db\/\/QJ2nWZvQV2skUTw2qjpiTPCFiCEPekRB8NuGmc7A1m7C7e0DfdUzHI3p3sAn7xx21KseLYFG3kFbJyWhTpVpl0VQ622DrdbAz\/ztpJDTe0185ZO0ND+AFY354BJZY7u8jcgDo4IViMOCDFwIplUsvVqRW6mIBtZDNkBJIBFYLicEbj1NmmpypO+tNYpwE18I4w3zR8Y43zXj+ilIv98xGMN15kVsffAt+5cLfWHYd6plaKt6M4NV\/CATwlFBVJIKogcYAQGtF+v7E4NfuGBdj56VnaXOLi7C+NuPUbAOPyuHhHpuzKb970vnnhREv7S545pUFoxw0uuT9\/fPI6Ztvj1oK\/XJJ7Y5JkykSQlku0NQM6aD2eG4BBs8NaA0UQeKqhx68uEYgVEwEV8EFlEo2QzXo+w6hsD111lvj8tFgcxuHu87DvwCrEznQnIJIIAAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-container_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA dependency injection container with autowiring\u003C\/p\u003E\n\u003Ch3\u003EInstallation\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs bash border\u0022\u003Ecomposer require avris\/container\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EUsage\u003C\/h3\u003E\n\u003Ch4\u003EBasics\u003C\/h4\u003E\n\u003Cp\u003EContainer resolves dependencies between defined services,\nin order to simplify the development process, avoid duplication of code,\nfacilitate interoperability and improve maintainability and testability.\nSee: \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\u0022\u003EDependency Injection pattern\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$parameterProvider = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E SimpleParameterProvider([\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027ROOT_DIR\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003E__DIR__\u003C\/span\u003E]);\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ parameter provider is optional\u003C\/span\u003E\n\n$container = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E Container($parameterProvider);\n\n$container-\u0026gt;set(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027number\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-number\u0022\u003E4\u003C\/span\u003E);\n$container-\u0026gt;set(Foo::class, \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E Foo);\n$container-\u0026gt;setDefinition(Bar::class, [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027arguments\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027$foo\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027@\u0027\u003C\/span\u003E . Foo::class,\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027$dir\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027%ROOT_DIR%\/bar\u0027\u003C\/span\u003E,\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027$number\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027@number\u0027\u003C\/span\u003E,\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027$float\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-number\u0022\u003E69.123\u003C\/span\u003E,\n ],\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027public\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003Etrue\u003C\/span\u003E,\n]);\n$container-\u0026gt;setDefinition(BarInterface::class, Bar::class); \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ alias\u003C\/span\u003E\n\n$container-\u0026gt;get(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027number\u0027\u003C\/span\u003E); \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ 4\u003C\/span\u003E\n$container-\u0026gt;get(Foo::class); \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ new Foo\u003C\/span\u003E\n$container-\u0026gt;get(BarInterface::class); \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ new Bar(new Foo, __DIR__ . \u0027\/bar\u0027, 4, 69.123)\u003C\/span\u003E\n$container-\u0026gt;getParameter(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027ROOT_DIR\u0027\u003C\/span\u003E); \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ __DIR__\u003C\/span\u003E\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch4\u003EOptions\u003C\/h4\u003E\n\u003Cul\u003E\n\u003Cli\u003E\n\u003Cp\u003E\u003Ccode\u003Eclass\u003C\/code\u003E \u2013 the class of the service, will default to the service name if not given.\nIf the given class implements the \u003Ccode\u003EResolver\u003C\/code\u003E interface, it will be instantiated,\nand it\u2019s \u003Ccode\u003Eresolve\u003C\/code\u003E method executed to provide an actual value to be put in the container.\u003C\/p\u003E\n\u003C\/li\u003E\n\u003Cli\u003E\n\u003Cp\u003E\u003Ccode\u003Earguments\u003C\/code\u003E \u2013 constructor arguments.\u003C\/p\u003E\n\u003C\/li\u003E\n\u003Cli\u003E\n\u003Cp\u003E\u003Ccode\u003Ecalls\u003C\/code\u003E \u2013 method calls to be executed right after constructing the service (setter injection etc.)\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode\u003E\u0027calls\u0027 =\u0026gt; [\n [\u0027setLogger\u0027, [\u0027@logger\u0027]],\n [\u0027registerListener\u0027, [\u0027@listenerA\u0027]],\n [\u0027registerListener\u0027, [\u0027@listenerB\u0027]],\n],\u003C\/code\u003E\u003C\/pre\u003E\n\u003C\/li\u003E\n\u003Cli\u003E\n\u003Cp\u003E\u003Ccode\u003Etags\u003C\/code\u003E \u2013 an array of string that help group similar services together; tagged services can be injected with \u003Ccode\u003E#tagName\u003C\/code\u003E:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode\u003E$container-\u0026gt;setDefinition(HandlerA::class, [\u0027tags\u0027 =\u0026gt; \u0027handler\u0027]);\n$container-\u0026gt;setDefinition(HandlerB::class, [\u0027tags\u0027 =\u0026gt; \u0027handler\u0027]);\n$container-\u0026gt;setDefinition(HandlerC::class, [\u0027tags\u0027 =\u0026gt; \u0027handler\u0027]);\n$container-\u0026gt;setDefinition(Manager::class, [\u0027arguments\u0027 =\u0026gt; [\u0027$handlers\u0027 =\u0026gt; \u0027#handler\u0027]]);\u003C\/code\u003E\u003C\/pre\u003E\n\u003C\/li\u003E\n\u003Cli\u003E\n\u003Cp\u003E\u003Ccode\u003Efactory\u003C\/code\u003E -- determines if each \u003Ccode\u003Eget\u003C\/code\u003E should create a new service (\u003Ccode\u003Etrue\u003C\/code\u003E),\nor should one service be reused (\u003Ccode\u003Efalse\u003C\/code\u003E, default).\u003C\/p\u003E\n\u003C\/li\u003E\n\u003Cli\u003E\n\u003Cp\u003E\u003Ccode\u003Eresolve\u003C\/code\u003E \u2013 instead of using \u003Ccode\u003Eclass\u003C\/code\u003E + \u003Ccode\u003Earguments\u003C\/code\u003E to construct the service,\nyou can use \u003Ccode\u003Eresolve\u003C\/code\u003E to define how it should be created:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode\u003E$container-\u0026gt;setDefinition(\u0027foo\u0027, [\u0027resolve\u0027 =\u0026gt; 4]); \/\/ 4\n$container-\u0026gt;setDefinition(\u0027language\u0027, [\u0027resolve\u0027 =\u0026gt; \u0027@Request.locale.language\u0027]); \/\/ $container-\u0026gt;get(\u0027Request\u0027)-\u0026gt;getLocale()-\u0026gt;getLanguage()\u003C\/code\u003E\u003C\/pre\u003E\n\u003C\/li\u003E\n\u003Cli\u003E\n\u003Cp\u003E\u003Ccode\u003Epublic\u003C\/code\u003E \u2013 determines if the service should be accessible directly with \u003Ccode\u003Eget\u003C\/code\u003E,\nor can it only be injected into other services.\u003C\/p\u003E\n\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch4\u003EContainerCompiler: autowiring and autoconfiguration\u003C\/h4\u003E\n\u003Cp\u003EUsually it\u2019s obvious, which service should be injected into another.\nFor instance when your service has a constructor argument \u003Ccode\u003EPsr\\Cache\\CacheItemPoolInterface $cache\u003C\/code\u003E,\nand the container does have a service named \u003Ccode\u003EPsr\\Cache\\CacheItemPoolInterface\u003C\/code\u003E,\nthen explicitly writing \u003Ccode\u003E[\u0027arguments\u0027 =\u0026gt; [\u0027$cache\u0027 =\u0026gt; \u0027@Psr\\Cache\\CacheItemPoolInterface\u0027]\u003C\/code\u003E is redundant.\nYou can always specify the dependencies manually, then autowiring won\u0027t overwrite them.\u003C\/p\u003E\n\u003Cp\u003EAutowiring is not magic \u2013 it just follows simple rules to determine,\nwhich service should be injected into the constructor:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003Eif the argument is a class which is defined in the container, use this service,\u003C\/li\u003E\n\u003Cli\u003Eif the argument is a class which is not defined in the container,\ntry to autowire that class and create a private service out of it,\u003C\/li\u003E\n\u003Cli\u003Eif the argument is an array and its name ends with \u003Ccode\u003Es\u003C\/code\u003E (e.g. \u003Ccode\u003Earray $helpers\u003C\/code\u003E),\ninject an array of services with a specific tag (\u003Ccode\u003E#helper\u003C\/code\u003E).\u003C\/li\u003E\n\u003Cli\u003Eif the argument is of type \u003Ccode\u003EBag\u003C\/code\u003E, inject the config value with its name\n(e.g. \u003Ccode\u003EBag $localisation\u003C\/code\u003E -\u0026gt; \u003Ccode\u003E@config.localisation\u003C\/code\u003E),\u003C\/li\u003E\n\u003Cli\u003Eif its name starts with \u003Ccode\u003Eenv\u003C\/code\u003E, inject a parameter:\n(e.g. \u003Ccode\u003Estring $envCacheDir\u003C\/code\u003E -\u0026gt; \u003Ccode\u003E%CACHE_DIR%\u003C\/code\u003E)\u003C\/li\u003E\n\u003Cli\u003Eif none of the above is true, but there is a default value, just use it,\u003C\/li\u003E\n\u003Cli\u003Eif none of the above is true, throw an exception \u2013 this argument should be defined explicitly.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EAutoconfiguration is another way to make your life simpler.\nFor instance, if you\u2019re using \u003Ca href=\u0022https:\/\/twig.symfony.com\/\u0022\u003ETwig\u003C\/a\u003E,\nyou might want all the classes in your code that extend \u003Ccode\u003ETwig\\Extension\\AbstractExtension\u003C\/code\u003E\nto be automatically registered as twig extension.\nAutoconfiguration lets you define what default config (tags, public etc.) should be added to them.\u003C\/p\u003E\n\u003Cp\u003ETo use autowiring and autoconfiguration, run the \u003Ccode\u003EContainerCompiler\u003C\/code\u003E:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$container = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E Container;\n\n$services = [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027App\\\u0027 =\u0026gt; [\n \u0027\u003C\/span\u003Edir\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027 =\u0026gt; \u0027\u003C\/span\u003E%MODULE_DIR%\/src\/\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027,\n \u0027\u003C\/span\u003Eexclude\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027 =\u0026gt; [\u0027\u003C\/span\u003E\u003Cspan class=\u0022hljs-comment\u0022\u003E#^Entity\/#\u0027],\u003C\/span\u003E\n ],\n\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027App\\Foo\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027arguments\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027$bar\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-number\u0022\u003E5\u003C\/span\u003E,\n ],\n ],\n\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027App\\Bar\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027public\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-keyword\u0022\u003Etrue\u003C\/span\u003E,\n ],\n];\n\n$autoconfiguration = [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027Twig\\Extension\\AbstractExtension\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027tags\u0027\u003C\/span\u003E =\u0026gt; [\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027twigExtension\u0027\u003C\/span\u003E],\n ],\n];\n\n$definitions = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E ContainerCompiler(\n $container,\n $services,\n $autoconfiguration\n))-\u0026gt;compile();\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/** \u003Cspan class=\u0022hljs-doctag\u0022\u003E@var\u003C\/span\u003E ServiceDefinition $definition *\/\u003C\/span\u003E\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Eforeach\u003C\/span\u003E ($definitions \u003Cspan class=\u0022hljs-keyword\u0022\u003Eas\u003C\/span\u003E $name =\u0026gt; $definition) {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E (!$container-\u0026gt;has($name)) {\n $container-\u0026gt;setDefinition($name, $definition);\n }\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EIn this example, the whole \u003Ccode\u003E%MODULE_DIR%\/src\/\u003C\/code\u003E except for (the \u003Ccode\u003E\/src\/Entity\u003C\/code\u003E dir) will be scanned for PHP files\nand all the found classes will be autowired as private services. If some of them are not used and not public,\nthey will be removed from the container.\u003C\/p\u003E\n\u003Cp\u003ECompiling the container has \u003Cstrong\u003Eno impact on performance\u003C\/strong\u003E on production environment,\nas long as you \u003Cstrong\u003Ecache the result of \u003Ccode\u003Ecompile()\u003C\/code\u003E\u003C\/strong\u003E.\u003C\/p\u003E\n\u003Ch4\u003EServiceLocator\u003C\/h4\u003E\n\u003Cp\u003EService locator restricts access to services in the container only to a selected list of names:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$container = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E Container();\n$container-\u0026gt;set(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027abc\u0027\u003C\/span\u003E);\n$container-\u0026gt;set(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027def\u0027\u003C\/span\u003E);\n$container-\u0026gt;set(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027secret\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027XYZ\u0027\u003C\/span\u003E);\n\n$locator = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E ServiceLocator($container, [\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E]);\n\n$locator-\u0026gt;get(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E); \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ \u0027abc\u0027\u003C\/span\u003E\n$locator-\u0026gt;get(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E); \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ \u0027def\u0027\u003C\/span\u003E\n$locator-\u0026gt;get(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027secret\u0027\u003C\/span\u003E); \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ Exception\u003C\/span\u003E\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EContainerAssistedBuilder\u003C\/h3\u003E\n\u003Cp\u003E\u003Ccode\u003EContainerAssistedBuilder\u003C\/code\u003E can be used to join together a couple of \u003Ccode\u003EContainerBuilderExtension\u003C\/code\u003Es\nwhich encapsulate a set of service definitions that form a library together.\nFor an example, see \u003Ca href=\u0022https:\/\/gitlab.com\/Avris\/Localisator\u0022\u003EAvris Localisator\u003C\/a\u003E.\u003C\/p\u003E\n\u003Ch4\u003EMicrus\u003C\/h4\u003E\n\u003Cp\u003EThis container was originally built as a part of the \u003Ca href=\u0022https:\/\/micrus.avris.it\u0022\u003EMicrus framework\u003C\/a\u003E.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["autoconfiguration","autowiring","container","dependencies","dependency injection","library","php","programming"],"hasMore":true,"image":"https:\/\/avris.it\/image\/avris-container_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-container_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-container_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA dependency injection container with autowiring\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-container_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-container_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA dependency injection container with autowiring\u003C\/p\u003E\n\u003Ch3\u003EInstallation\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-bash\u0022\u003Ecomposer require avris\/container\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EUsage\u003C\/h3\u003E\n\u003Ch4\u003EBasics\u003C\/h4\u003E\n\u003Cp\u003EContainer resolves dependencies between defined services,\nin order to simplify the development process, avoid duplication of code,\nfacilitate interoperability and improve maintainability and testability.\nSee: \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\u0022\u003EDependency Injection pattern\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$parameterProvider = new SimpleParameterProvider([\u0027ROOT_DIR\u0027 =\u0026gt; __DIR__]);\n\/\/ parameter provider is optional\n\n$container = new Container($parameterProvider);\n\n$container-\u0026gt;set(\u0027number\u0027, 4);\n$container-\u0026gt;set(Foo::class, new Foo);\n$container-\u0026gt;setDefinition(Bar::class, [\n \u0027arguments\u0027 =\u0026gt; [\n \u0027$foo\u0027 =\u0026gt; \u0027@\u0027 . Foo::class,\n \u0027$dir\u0027 =\u0026gt; \u0027%ROOT_DIR%\/bar\u0027,\n \u0027$number\u0027 =\u0026gt; \u0027@number\u0027,\n \u0027$float\u0027 =\u0026gt; 69.123,\n ],\n \u0027public\u0027 =\u0026gt; true,\n]);\n$container-\u0026gt;setDefinition(BarInterface::class, Bar::class); \/\/ alias\n\n$container-\u0026gt;get(\u0027number\u0027); \/\/ 4\n$container-\u0026gt;get(Foo::class); \/\/ new Foo\n$container-\u0026gt;get(BarInterface::class); \/\/ new Bar(new Foo, __DIR__ . \u0027\/bar\u0027, 4, 69.123)\n$container-\u0026gt;getParameter(\u0027ROOT_DIR\u0027); \/\/ __DIR__\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch4\u003EOptions\u003C\/h4\u003E\n\u003Cul\u003E\n\u003Cli\u003E\n\u003Cp\u003E\u003Ccode\u003Eclass\u003C\/code\u003E \u2013 the class of the service, will default to the service name if not given.\nIf the given class implements the \u003Ccode\u003EResolver\u003C\/code\u003E interface, it will be instantiated,\nand it\u2019s \u003Ccode\u003Eresolve\u003C\/code\u003E method executed to provide an actual value to be put in the container.\u003C\/p\u003E\n\u003C\/li\u003E\n\u003Cli\u003E\n\u003Cp\u003E\u003Ccode\u003Earguments\u003C\/code\u003E \u2013 constructor arguments.\u003C\/p\u003E\n\u003C\/li\u003E\n\u003Cli\u003E\n\u003Cp\u003E\u003Ccode\u003Ecalls\u003C\/code\u003E \u2013 method calls to be executed right after constructing the service (setter injection etc.)\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode\u003E\u0027calls\u0027 =\u0026gt; [\n [\u0027setLogger\u0027, [\u0027@logger\u0027]],\n [\u0027registerListener\u0027, [\u0027@listenerA\u0027]],\n [\u0027registerListener\u0027, [\u0027@listenerB\u0027]],\n],\u003C\/code\u003E\u003C\/pre\u003E\n\u003C\/li\u003E\n\u003Cli\u003E\n\u003Cp\u003E\u003Ccode\u003Etags\u003C\/code\u003E \u2013 an array of string that help group similar services together; tagged services can be injected with \u003Ccode\u003E#tagName\u003C\/code\u003E:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode\u003E$container-\u0026gt;setDefinition(HandlerA::class, [\u0027tags\u0027 =\u0026gt; \u0027handler\u0027]);\n$container-\u0026gt;setDefinition(HandlerB::class, [\u0027tags\u0027 =\u0026gt; \u0027handler\u0027]);\n$container-\u0026gt;setDefinition(HandlerC::class, [\u0027tags\u0027 =\u0026gt; \u0027handler\u0027]);\n$container-\u0026gt;setDefinition(Manager::class, [\u0027arguments\u0027 =\u0026gt; [\u0027$handlers\u0027 =\u0026gt; \u0027#handler\u0027]]);\u003C\/code\u003E\u003C\/pre\u003E\n\u003C\/li\u003E\n\u003Cli\u003E\n\u003Cp\u003E\u003Ccode\u003Efactory\u003C\/code\u003E -- determines if each \u003Ccode\u003Eget\u003C\/code\u003E should create a new service (\u003Ccode\u003Etrue\u003C\/code\u003E),\nor should one service be reused (\u003Ccode\u003Efalse\u003C\/code\u003E, default).\u003C\/p\u003E\n\u003C\/li\u003E\n\u003Cli\u003E\n\u003Cp\u003E\u003Ccode\u003Eresolve\u003C\/code\u003E \u2013 instead of using \u003Ccode\u003Eclass\u003C\/code\u003E + \u003Ccode\u003Earguments\u003C\/code\u003E to construct the service,\nyou can use \u003Ccode\u003Eresolve\u003C\/code\u003E to define how it should be created:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode\u003E$container-\u0026gt;setDefinition(\u0027foo\u0027, [\u0027resolve\u0027 =\u0026gt; 4]); \/\/ 4\n$container-\u0026gt;setDefinition(\u0027language\u0027, [\u0027resolve\u0027 =\u0026gt; \u0027@Request.locale.language\u0027]); \/\/ $container-\u0026gt;get(\u0027Request\u0027)-\u0026gt;getLocale()-\u0026gt;getLanguage()\u003C\/code\u003E\u003C\/pre\u003E\n\u003C\/li\u003E\n\u003Cli\u003E\n\u003Cp\u003E\u003Ccode\u003Epublic\u003C\/code\u003E \u2013 determines if the service should be accessible directly with \u003Ccode\u003Eget\u003C\/code\u003E,\nor can it only be injected into other services.\u003C\/p\u003E\n\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch4\u003EContainerCompiler: autowiring and autoconfiguration\u003C\/h4\u003E\n\u003Cp\u003EUsually it\u2019s obvious, which service should be injected into another.\nFor instance when your service has a constructor argument \u003Ccode\u003EPsr\\Cache\\CacheItemPoolInterface $cache\u003C\/code\u003E,\nand the container does have a service named \u003Ccode\u003EPsr\\Cache\\CacheItemPoolInterface\u003C\/code\u003E,\nthen explicitly writing \u003Ccode\u003E[\u0027arguments\u0027 =\u0026gt; [\u0027$cache\u0027 =\u0026gt; \u0027@Psr\\Cache\\CacheItemPoolInterface\u0027]\u003C\/code\u003E is redundant.\nYou can always specify the dependencies manually, then autowiring won\u0027t overwrite them.\u003C\/p\u003E\n\u003Cp\u003EAutowiring is not magic \u2013 it just follows simple rules to determine,\nwhich service should be injected into the constructor:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003Eif the argument is a class which is defined in the container, use this service,\u003C\/li\u003E\n\u003Cli\u003Eif the argument is a class which is not defined in the container,\ntry to autowire that class and create a private service out of it,\u003C\/li\u003E\n\u003Cli\u003Eif the argument is an array and its name ends with \u003Ccode\u003Es\u003C\/code\u003E (e.g. \u003Ccode\u003Earray $helpers\u003C\/code\u003E),\ninject an array of services with a specific tag (\u003Ccode\u003E#helper\u003C\/code\u003E).\u003C\/li\u003E\n\u003Cli\u003Eif the argument is of type \u003Ccode\u003EBag\u003C\/code\u003E, inject the config value with its name\n(e.g. \u003Ccode\u003EBag $localisation\u003C\/code\u003E -\u0026gt; \u003Ccode\u003E@config.localisation\u003C\/code\u003E),\u003C\/li\u003E\n\u003Cli\u003Eif its name starts with \u003Ccode\u003Eenv\u003C\/code\u003E, inject a parameter:\n(e.g. \u003Ccode\u003Estring $envCacheDir\u003C\/code\u003E -\u0026gt; \u003Ccode\u003E%CACHE_DIR%\u003C\/code\u003E)\u003C\/li\u003E\n\u003Cli\u003Eif none of the above is true, but there is a default value, just use it,\u003C\/li\u003E\n\u003Cli\u003Eif none of the above is true, throw an exception \u2013 this argument should be defined explicitly.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EAutoconfiguration is another way to make your life simpler.\nFor instance, if you\u2019re using \u003Ca href=\u0022https:\/\/twig.symfony.com\/\u0022\u003ETwig\u003C\/a\u003E,\nyou might want all the classes in your code that extend \u003Ccode\u003ETwig\\Extension\\AbstractExtension\u003C\/code\u003E\nto be automatically registered as twig extension.\nAutoconfiguration lets you define what default config (tags, public etc.) should be added to them.\u003C\/p\u003E\n\u003Cp\u003ETo use autowiring and autoconfiguration, run the \u003Ccode\u003EContainerCompiler\u003C\/code\u003E:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$container = new Container;\n\n$services = [\n \u0027App\\\u0027 =\u0026gt; [\n \u0027dir\u0027 =\u0026gt; \u0027%MODULE_DIR%\/src\/\u0027,\n \u0027exclude\u0027 =\u0026gt; [\u0027#^Entity\/#\u0027],\n ],\n\n \u0027App\\Foo\u0027 =\u0026gt; [\n \u0027arguments\u0027 =\u0026gt; [\n \u0027$bar\u0027 =\u0026gt; 5,\n ],\n ],\n\n \u0027App\\Bar\u0027 =\u0026gt; [\n \u0027public\u0027 =\u0026gt; true,\n ],\n];\n\n$autoconfiguration = [\n \u0027Twig\\Extension\\AbstractExtension\u0027 =\u0026gt; [\n \u0027tags\u0027 =\u0026gt; [\u0027twigExtension\u0027],\n ],\n];\n\n$definitions = new ContainerCompiler(\n $container,\n $services,\n $autoconfiguration\n))-\u0026gt;compile();\n\n\/** @var ServiceDefinition $definition *\/\nforeach ($definitions as $name =\u0026gt; $definition) {\n if (!$container-\u0026gt;has($name)) {\n $container-\u0026gt;setDefinition($name, $definition);\n }\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EIn this example, the whole \u003Ccode\u003E%MODULE_DIR%\/src\/\u003C\/code\u003E except for (the \u003Ccode\u003E\/src\/Entity\u003C\/code\u003E dir) will be scanned for PHP files\nand all the found classes will be autowired as private services. If some of them are not used and not public,\nthey will be removed from the container.\u003C\/p\u003E\n\u003Cp\u003ECompiling the container has \u003Cstrong\u003Eno impact on performance\u003C\/strong\u003E on production environment,\nas long as you \u003Cstrong\u003Ecache the result of \u003Ccode\u003Ecompile()\u003C\/code\u003E\u003C\/strong\u003E.\u003C\/p\u003E\n\u003Ch4\u003EServiceLocator\u003C\/h4\u003E\n\u003Cp\u003EService locator restricts access to services in the container only to a selected list of names:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$container = new Container();\n$container-\u0026gt;set(\u0027foo\u0027, \u0027abc\u0027);\n$container-\u0026gt;set(\u0027bar\u0027, \u0027def\u0027);\n$container-\u0026gt;set(\u0027secret\u0027, \u0027XYZ\u0027);\n\n$locator = new ServiceLocator($container, [\u0027foo\u0027, \u0027bar\u0027]);\n\n$locator-\u0026gt;get(\u0027foo\u0027); \/\/ \u0027abc\u0027\n$locator-\u0026gt;get(\u0027bar\u0027); \/\/ \u0027def\u0027\n$locator-\u0026gt;get(\u0027secret\u0027); \/\/ Exception\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EContainerAssistedBuilder\u003C\/h3\u003E\n\u003Cp\u003E\u003Ccode\u003EContainerAssistedBuilder\u003C\/code\u003E can be used to join together a couple of \u003Ccode\u003EContainerBuilderExtension\u003C\/code\u003Es\nwhich encapsulate a set of service definitions that form a library together.\nFor an example, see \u003Ca href=\u0022https:\/\/gitlab.com\/Avris\/Localisator\u0022\u003EAvris Localisator\u003C\/a\u003E.\u003C\/p\u003E\n\u003Ch4\u003EMicrus\u003C\/h4\u003E\n\u003Cp\u003EThis container was originally built as a part of the \u003Ca href=\u0022https:\/\/micrus.avris.it\u0022\u003EMicrus framework\u003C\/a\u003E.\u003C\/p\u003E","words":868,"readTime":4,"lang":"en"}}},"projects\/avris-dotenv":{"key":"projects\/avris-dotenv","type":"article","published":true,"meta":{"createdAt":"2017-12-31T14:35:44+01:00","publishedAt":"2017-12-31T14:34:00+01:00","group":null,"links":[{"icon":"brands gitlab","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/Dotenv","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-dotenv"},"content":{"en":{"slug":"avris-dotenv","title":"Avris Dotenv","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-dotenv_small.png\u0022 alt=\u0022Avris Dotenv\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHnElEQVRIiX2X268lRRXGf+tS1b33OXufM2dmzjDchpsooo4QjSTEgCQIxKBB4wVNiD7og8YH\/wTfffPBaHzWJ+MLYqLRCCSQKBqVi0i4zADDQIaZOZd9bru7avnQewajxkpXdyddl6++r1atr+Xa626NKBUhiFohKuZOLYUgUBFcDVMluTOfH1BrhQiIQAARQRiKiCAiQHCpRMSi1stPoiICKoK5YyI0zQiPECKCUgsSIEApBWEYWFUHoKJQK0mVfjEBIot2XG4vAiCoynuTy6V3IWpB1Ih4r58hJDW0FvxSB0EJKhGgIYgOkxGCqgNCXyqGoAghiqku2BgWggzfFtfiZrgb83mHCEQMCxRRdNHXVHEzkioeolDLguCBESKQEFQNN8VEMFHcFIlKrZVayzCA+7D6WlG1y1KpCFErQbCyusrGhYtAhRDEIWpBVSDATElmJL8ESAAVqAu2BER0IYOhKGZGtsS4aSB6dvf2aNxpkpM9UWullJ6+FBCG\/VIrAMePrXOwPQPqQFoEqnkBSjEdJM6muGgiokPCQCp6eZMKajZQawkVRcVQcZaaJQ6NVrg420RDiRI0nlDPEIUQoe+7gSGBE9dey9unXkckkABTQQggIRILyZRkimvK9MEiYuxSrIDqwI4apkZ2J1tCMUQSTU5cf3SZnd0ZB13HsSvWme\/tMtvaxkTIrtSo3Pnpu3jlhReZ5oYghsgCVAdRVEEEkinZDQ9NSFrIhVADTBRVQ0Vxc1yN7BkXIZmTJJG0YW1thc9\/\/YusHVrlD7\/4NW+cfgNrlkk+RNNkZZk777mL5x9\/itV2BBQiYgCjggqYCaYDa+6Ckxukd2qNhb4Aiqih5ogYbo5qws0WNXH3A5\/k4e98mZee+QeP\/vDnJAo3H7+SqJXtnRmeja99\/3s888vHuHo6ZV46avRElEE6XURXGvZQToopuLRL1K4gtQ7nUABiiDhqiWSOqpHMaVNm7M43vv0F7nvobmYXt3nsx4+SdcShccuNN13Jzua7bO7uc893v0pSoZ5+kw8cX2e2t8t+P6fUnlI70Epyw0xwV5ILKRku4yky76FUAoY9giKSUDHEE1mdNiXGKfHwI\/dy30N3A\/D3J58j0TBZnrA8bti+sMeJj32ETz94J942PP2Dn7J+ZAWNjs2toO8TJQZAIRXVIGXHXUhJ8Sy4jCaQeyggoRCKoCAOmjB1kjk5JU6evJ7PfulTl1PC1jszDh87ylUn1jlx6zVcc\/sNLB2ZEhG88ZsnWBplSl2mbXpyU0EqNTr6fk7UDjVQDcyN3DieBGeyAn0hQgYwMUSX4bgmFEcWB+Aj33rg8skMcP837+U\/S0Rw5ok\/Mz\/3LkevO8zBZqbb2WCqHWIVsaDWjtofIPSoCeZKyhlvGlwnE1JhyDMoHkrCyOLkMLIaGeX2k9dy1VVr\/wXg30sthVd++ye2X3qFdklpV8YcveVq+s0lts4KKnOEDiQTJSFShwhLjuWMNSN8sjqhFGDBkCF4OK0YLUqL0VThjk\/c9H\/BzM5t8sKvnmJ+\/hyjBlDo9nbZPd\/hMme80lC7Mpw9BioJWcil7lhu0WaEX7E2ou+DWqCGoqEoRgohYbShNEW4+YYj\/xPI3tYu\/3zyOc785UWydIzaOqSOCtFBPTBolDxSIikmsZApoaZYymhukNRAHuEfWm\/Y3e+YHxTmfaWUSqkVCUGiYkUwEY4cGl8GsTPb4\/RLZzj1t1c58\/xrNNEx9kKkglPJWgkNsID5kCslBckDN8FM0JSQ3EIyyBlyA97iDx56i539ymzWsbVTmfXB9gHszmG\/g3kvlB5+8qOfsbezx8a7W+xc2CKXQqKQqLRaGVnPUgqmbWU+rjAJUgitDTZDSod6YNmwGnSdYUzoDgxtE5sXx3S0yN23Holpm9jfH6ySWybEqTghiYJTNdNXCFFQx8y5Yv0YF86fJ7szypn1I6vsb2\/RSM8kw9Gl4PihwvoRY2lJeP3sBrO9PUruWL3yKh7\/3R85dfaAaVtZX59w0AVPv7CDLK+uhaaMqGEp4U2LqOG5wVPGUoOqkZsW80TyzOG1NW7\/6G200bG5tcfx9XXWpsucOfUmy9lZTsaF106x2sLhZeXQEiTtSdazutRz88kxG2dnnDu7xWQELj1H77iX3Wd\/j9\/yua\/QLE\/pK7RLEzw1qDpiTvKEiCEMeUdCkFJpTFg6ts7Ozj7j5cosgjo3YmWdjf0DRtMpB5OOAxd2kpKT0aZKtcp+U+lslbX3w8bsVdJIaLynv7jL8gfvwwvGbHcPLDHf3kZkB9DBC8VgwAcvBFIqlIrUyhsvvwS1kM2QEkgEVgsJ49laGKfMJDkTd1aaxDgJroVxhtl+x8c\/POXNi0q90DMdwWTjLd53\/234xdMvM+861DO1VLwZwXv\/EAjgKaGqSARRA40BgNaK9P1lg1+7A1yMjXdep80tLsLK8pTD01U8Kru7WxyaTvjri87bp0e8s7nPqfP7jHLQ6JzP9G8iR268JWop9PM5tTsgLU2QEMp8H03NkA5qj+cWYPDcgNZAESQueejBi2sEQsVEcBVcQKlkM1SDvu8QCusTZ6U1LuwNNrdxuOME\/AvjxTpTHhTrrwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-dotenv_small.png\u0022 alt=\u0022Avris Dotenv\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E.env file handler\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-dotenv_big.png\u0022 alt=\u0022Avris Dotenv\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHnElEQVRIiX2X268lRRXGf+tS1b33OXufM2dmzjDchpsooo4QjSTEgCQIxKBB4wVNiD7og8YH\/wTfffPBaHzWJ+MLYqLRCCSQKBqVi0i4zADDQIaZOZd9bru7avnQewajxkpXdyddl6++r1atr+Xa626NKBUhiFohKuZOLYUgUBFcDVMluTOfH1BrhQiIQAARQRiKiCAiQHCpRMSi1stPoiICKoK5YyI0zQiPECKCUgsSIEApBWEYWFUHoKJQK0mVfjEBIot2XG4vAiCoynuTy6V3IWpB1Ih4r58hJDW0FvxSB0EJKhGgIYgOkxGCqgNCXyqGoAghiqku2BgWggzfFtfiZrgb83mHCEQMCxRRdNHXVHEzkioeolDLguCBESKQEFQNN8VEMFHcFIlKrZVayzCA+7D6WlG1y1KpCFErQbCyusrGhYtAhRDEIWpBVSDATElmJL8ESAAVqAu2BER0IYOhKGZGtsS4aSB6dvf2aNxpkpM9UWullJ6+FBCG\/VIrAMePrXOwPQPqQFoEqnkBSjEdJM6muGgiokPCQCp6eZMKajZQawkVRcVQcZaaJQ6NVrg420RDiRI0nlDPEIUQoe+7gSGBE9dey9unXkckkABTQQggIRILyZRkimvK9MEiYuxSrIDqwI4apkZ2J1tCMUQSTU5cf3SZnd0ZB13HsSvWme\/tMtvaxkTIrtSo3Pnpu3jlhReZ5oYghsgCVAdRVEEEkinZDQ9NSFrIhVADTBRVQ0Vxc1yN7BkXIZmTJJG0YW1thc9\/\/YusHVrlD7\/4NW+cfgNrlkk+RNNkZZk777mL5x9\/itV2BBQiYgCjggqYCaYDa+6Ckxukd2qNhb4Aiqih5ogYbo5qws0WNXH3A5\/k4e98mZee+QeP\/vDnJAo3H7+SqJXtnRmeja99\/3s888vHuHo6ZV46avRElEE6XURXGvZQToopuLRL1K4gtQ7nUABiiDhqiWSOqpHMaVNm7M43vv0F7nvobmYXt3nsx4+SdcShccuNN13Jzua7bO7uc893v0pSoZ5+kw8cX2e2t8t+P6fUnlI70Epyw0xwV5ILKRku4yky76FUAoY9giKSUDHEE1mdNiXGKfHwI\/dy30N3A\/D3J58j0TBZnrA8bti+sMeJj32ETz94J942PP2Dn7J+ZAWNjs2toO8TJQZAIRXVIGXHXUhJ8Sy4jCaQeyggoRCKoCAOmjB1kjk5JU6evJ7PfulTl1PC1jszDh87ylUn1jlx6zVcc\/sNLB2ZEhG88ZsnWBplSl2mbXpyU0EqNTr6fk7UDjVQDcyN3DieBGeyAn0hQgYwMUSX4bgmFEcWB+Aj33rg8skMcP837+U\/S0Rw5ok\/Mz\/3LkevO8zBZqbb2WCqHWIVsaDWjtofIPSoCeZKyhlvGlwnE1JhyDMoHkrCyOLkMLIaGeX2k9dy1VVr\/wXg30sthVd++ye2X3qFdklpV8YcveVq+s0lts4KKnOEDiQTJSFShwhLjuWMNSN8sjqhFGDBkCF4OK0YLUqL0VThjk\/c9H\/BzM5t8sKvnmJ+\/hyjBlDo9nbZPd\/hMme80lC7Mpw9BioJWcil7lhu0WaEX7E2ou+DWqCGoqEoRgohYbShNEW4+YYj\/xPI3tYu\/3zyOc785UWydIzaOqSOCtFBPTBolDxSIikmsZApoaZYymhukNRAHuEfWm\/Y3e+YHxTmfaWUSqkVCUGiYkUwEY4cGl8GsTPb4\/RLZzj1t1c58\/xrNNEx9kKkglPJWgkNsID5kCslBckDN8FM0JSQ3EIyyBlyA97iDx56i539ymzWsbVTmfXB9gHszmG\/g3kvlB5+8qOfsbezx8a7W+xc2CKXQqKQqLRaGVnPUgqmbWU+rjAJUgitDTZDSod6YNmwGnSdYUzoDgxtE5sXx3S0yN23Holpm9jfH6ySWybEqTghiYJTNdNXCFFQx8y5Yv0YF86fJ7szypn1I6vsb2\/RSM8kw9Gl4PihwvoRY2lJeP3sBrO9PUruWL3yKh7\/3R85dfaAaVtZX59w0AVPv7CDLK+uhaaMqGEp4U2LqOG5wVPGUoOqkZsW80TyzOG1NW7\/6G200bG5tcfx9XXWpsucOfUmy9lZTsaF106x2sLhZeXQEiTtSdazutRz88kxG2dnnDu7xWQELj1H77iX3Wd\/j9\/yua\/QLE\/pK7RLEzw1qDpiTvKEiCEMeUdCkFJpTFg6ts7Ozj7j5cosgjo3YmWdjf0DRtMpB5OOAxd2kpKT0aZKtcp+U+lslbX3w8bsVdJIaLynv7jL8gfvwwvGbHcPLDHf3kZkB9DBC8VgwAcvBFIqlIrUyhsvvwS1kM2QEkgEVgsJ49laGKfMJDkTd1aaxDgJroVxhtl+x8c\/POXNi0q90DMdwWTjLd53\/234xdMvM+861DO1VLwZwXv\/EAjgKaGqSARRA40BgNaK9P1lg1+7A1yMjXdep80tLsLK8pTD01U8Kru7WxyaTvjri87bp0e8s7nPqfP7jHLQ6JzP9G8iR268JWop9PM5tTsgLU2QEMp8H03NkA5qj+cWYPDcgNZAESQueejBi2sEQsVEcBVcQKlkM1SDvu8QCusTZ6U1LuwNNrdxuOME\/AvjxTpTHhTrrwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-dotenv_big.png\u0022 alt=\u0022Avris Dotenv\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E.env file handler\u003C\/p\u003E\n\u003Ch3\u003EInstalation\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs bash border\u0022\u003Ecomposer require avris\/dotenv\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003E.env\u003C\/h3\u003E\n\u003Cp\u003EEnvironmental variables are a great way to adjust your application to a specific environment,\nespecially when it comes to sensitive data, like database password.\u003C\/p\u003E\n\u003Cp\u003EThose variables should be set by your HTTP server,\nbut for local development having a \u003Ccode\u003E.env\u003C\/code\u003E file is way simpler:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs border\u0022\u003EAPP_ENV=prod\nAPP_DEBUG=0\n\nDB_HOST=127.0.0.1\nDB_DATABASE=prod\nDB_USER=user\nDB_PASS=pass\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAll you need to do in your front controller is load this file using Dotenv:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E(\u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E \\Avris\\Dotenv\\Dotenv)-\u0026gt;load(\u003Cspan class=\u0022hljs-keyword\u0022\u003E__DIR__\u003C\/span\u003E . \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\/..\/.env\u0027\u003C\/span\u003E);\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003ENow all the variables from the file will be available via \u003Ccode\u003Egetenv\u003C\/code\u003E, \u003Ccode\u003E$_ENV\u003C\/code\u003E and \u003Ccode\u003E$_SERVER\u003C\/code\u003E.\u003C\/p\u003E\n\u003Ch3\u003EAdvanced\u003C\/h3\u003E\n\u003Cp\u003EIf your variable value contains a space, remember to quote it:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs border\u0022\u003EFOO=\u0026quot;Lorem ipsum\u0026quot;\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EYou can add a comment if you start a line with a \u003Ccode\u003E#\u003C\/code\u003E:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs border\u0022\u003E# comment\nFOO=bar\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EYou can use vars inside other vars (escape \u003Ccode\u003E$\u003C\/code\u003E with \u003Ccode\u003E\\$\u003C\/code\u003E):\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs border\u0022\u003EVAR1=osiem\nVAR2=\u0026quot;${VAR1}na\u015bcie ${CZEGO}\u0026quot;\nVAR3=\\$ESC\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EYou can also use output of a command (\u003Ccode\u003Esymfony\/process\u003C\/code\u003E is required, escape \u003Ccode\u003E$\u003C\/code\u003E with \u003Ccode\u003E\\$\u003C\/code\u003E):\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs border\u0022\u003ECOMM1=$(whoami)\nCOMM2=\\$(whoami)\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003ERemember .env is a valid bash script.\u003C\/p\u003E\n\u003Ch3\u003EOther features\u003C\/h3\u003E\n\u003Cp\u003EYou can just read the variables from a file without populating it as environment variables: \u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$vars = (\u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E \\Avris\\Dotenv\\Dotenv)-\u0026gt;read(\u003Cspan class=\u0022hljs-keyword\u0022\u003E__DIR__\u003C\/span\u003E . \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\/..\/.env\u0027\u003C\/span\u003E);\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EOr just populate vars into environment without parsing a file:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E(\u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E \\Avris\\Dotenv\\Dotenv)-\u0026gt;populate([\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027FOO\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E,\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027BAR\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E,\n]);\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EYou can also rever the process and dump vars into a .env file:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E(\u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E \\Avris\\Dotenv\\Dotenv)-\u0026gt;save(\u003Cspan class=\u0022hljs-keyword\u0022\u003E__DIR__\u003C\/span\u003E . \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\/.env\u0027\u003C\/span\u003E, [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027FOO\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E,\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027BAR\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E,\n]);\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EOr without saving to a file:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$string = (\u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E \\Avris\\Dotenv\\Dotenv)-\u0026gt;dump([\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027FOO\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E,\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027BAR\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E,\n]);\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EFill command\u003C\/h3\u003E\n\u003Cp\u003EDotenv provides a simple way to fill your \u003Ccode\u003E.env\u003C\/code\u003E file with values based on user input and defaults.\u003C\/p\u003E\n\u003Cp\u003ELet\u0027s say you have an application with two modules that require some environment variables: \u003Ccode\u003EFoo\\Database\u003C\/code\u003E and \u003Ccode\u003EFoo\\Mailer\u003C\/code\u003E.\nInstall \u003Ccode\u003Esymfony\/console\u003C\/code\u003E and create a command that extends \u003Ccode\u003EAvris\\Dotenv\\Command\\FillCommand\u003C\/code\u003E, providing all the defaults:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efinal\u003C\/span\u003E \u003Cspan class=\u0022hljs-class\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eclass\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EFillCommandImplementation\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Eextends\u003C\/span\u003E \\\u003Cspan class=\u0022hljs-title\u0022\u003EAvris\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EDotenv\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003ECommand\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EFillCommand\u003C\/span\u003E\n\u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eprotected\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EgetDefaults\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003Eiterable\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eyield\u003C\/span\u003E `Foo\\Database` =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027DB_HOST\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027127.0.0.1\u0027\u003C\/span\u003E,\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027DB_DATABASE\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E,\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027DB_USER\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027root\u0027\u003C\/span\u003E,\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027DB_PASS\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\u0027\u003C\/span\u003E,\n ]; \n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eyield\u003C\/span\u003E `Foo\\Mailer` =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027MAILER_URL\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027null:\/\/localhost\u0027\u003C\/span\u003E,\n ];\n }\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003ELet\u2019s say your \u003Ccode\u003E.env\u003C\/code\u003E file looks like this:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs bash border\u0022\u003E\u003Cspan class=\u0022hljs-comment\u0022\u003E###\u0026gt; Foo\\Database ###\u003C\/span\u003E\nDB_HOST=127.0.0.1\nDB_DATABASE=prod\nDB_USER=user\n\u003Cspan class=\u0022hljs-comment\u0022\u003E###\u0026lt; Foo\\Database ###\u003C\/span\u003E\n\nFOO=bar\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EBoth \u003Ccode\u003EDB_PASS\u003C\/code\u003E and \u003Ccode\u003EMAILER_URL\u003C\/code\u003E are missing and an additional variable \u003Ccode\u003EFOO\u003C\/code\u003E is defined.\u003C\/p\u003E\n\u003Cp\u003EIf you now \u003Ca href=\u0022https:\/\/symfony.com\/doc\/current\/components\/console.html\u0022\u003Erun the command\u003C\/a\u003E,\nyou will be asked what should \u003Ccode\u003EDB_PASS\u003C\/code\u003E and \u003Ccode\u003EMAILER_URL\u003C\/code\u003E be (defaults \u003Ccode\u003E\u0027\u0027\u003C\/code\u003E and \u003Ccode\u003Enull:\/\/localhost\u003C\/code\u003E are offered),\nand the values you submit will be put in the \u003Ccode\u003E.env\u003C\/code\u003E file without removing \u003Ccode\u003EFOO\u003C\/code\u003E. \u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["dotenv","environment variables","php"],"hasMore":true,"image":"https:\/\/avris.it\/image\/avris-dotenv_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-dotenv_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-dotenv_mini.png\u0022 alt=\u0022Avris Dotenv\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E.env file handler\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-dotenv_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-dotenv_mini.png\u0022 alt=\u0022Avris Dotenv\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E.env file handler\u003C\/p\u003E\n\u003Ch3\u003EInstalation\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-bash\u0022\u003Ecomposer require avris\/dotenv\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003E.env\u003C\/h3\u003E\n\u003Cp\u003EEnvironmental variables are a great way to adjust your application to a specific environment,\nespecially when it comes to sensitive data, like database password.\u003C\/p\u003E\n\u003Cp\u003EThose variables should be set by your HTTP server,\nbut for local development having a \u003Ccode\u003E.env\u003C\/code\u003E file is way simpler:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-dotenv\u0022\u003EAPP_ENV=prod\nAPP_DEBUG=0\n\nDB_HOST=127.0.0.1\nDB_DATABASE=prod\nDB_USER=user\nDB_PASS=pass\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAll you need to do in your front controller is load this file using Dotenv:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E(new \\Avris\\Dotenv\\Dotenv)-\u0026gt;load(__DIR__ . \u0027\/..\/.env\u0027);\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003ENow all the variables from the file will be available via \u003Ccode\u003Egetenv\u003C\/code\u003E, \u003Ccode\u003E$_ENV\u003C\/code\u003E and \u003Ccode\u003E$_SERVER\u003C\/code\u003E.\u003C\/p\u003E\n\u003Ch3\u003EAdvanced\u003C\/h3\u003E\n\u003Cp\u003EIf your variable value contains a space, remember to quote it:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-dotenv\u0022\u003EFOO=\u0022Lorem ipsum\u0022\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EYou can add a comment if you start a line with a \u003Ccode\u003E#\u003C\/code\u003E:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-dotenv\u0022\u003E# comment\nFOO=bar\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EYou can use vars inside other vars (escape \u003Ccode\u003E$\u003C\/code\u003E with \u003Ccode\u003E\\$\u003C\/code\u003E):\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-dotenv\u0022\u003EVAR1=osiem\nVAR2=\u0022${VAR1}na\u015bcie ${CZEGO}\u0022\nVAR3=\\$ESC\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EYou can also use output of a command (\u003Ccode\u003Esymfony\/process\u003C\/code\u003E is required, escape \u003Ccode\u003E$\u003C\/code\u003E with \u003Ccode\u003E\\$\u003C\/code\u003E):\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-dotenv\u0022\u003ECOMM1=$(whoami)\nCOMM2=\\$(whoami)\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003ERemember .env is a valid bash script.\u003C\/p\u003E\n\u003Ch3\u003EOther features\u003C\/h3\u003E\n\u003Cp\u003EYou can just read the variables from a file without populating it as environment variables: \u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$vars = (new \\Avris\\Dotenv\\Dotenv)-\u0026gt;read(__DIR__ . \u0027\/..\/.env\u0027);\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EOr just populate vars into environment without parsing a file:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E(new \\Avris\\Dotenv\\Dotenv)-\u0026gt;populate([\n \u0027FOO\u0027 =\u0026gt; \u0027foo\u0027,\n \u0027BAR\u0027 =\u0026gt; \u0027bar\u0027,\n]);\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EYou can also rever the process and dump vars into a .env file:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E(new \\Avris\\Dotenv\\Dotenv)-\u0026gt;save(__DIR__ . \u0027\/.env\u0027, [\n \u0027FOO\u0027 =\u0026gt; \u0027foo\u0027,\n \u0027BAR\u0027 =\u0026gt; \u0027bar\u0027,\n]);\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EOr without saving to a file:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$string = (new \\Avris\\Dotenv\\Dotenv)-\u0026gt;dump([\n \u0027FOO\u0027 =\u0026gt; \u0027foo\u0027,\n \u0027BAR\u0027 =\u0026gt; \u0027bar\u0027,\n]);\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EFill command\u003C\/h3\u003E\n\u003Cp\u003EDotenv provides a simple way to fill your \u003Ccode\u003E.env\u003C\/code\u003E file with values based on user input and defaults.\u003C\/p\u003E\n\u003Cp\u003ELet\u0027s say you have an application with two modules that require some environment variables: \u003Ccode\u003EFoo\\Database\u003C\/code\u003E and \u003Ccode\u003EFoo\\Mailer\u003C\/code\u003E.\nInstall \u003Ccode\u003Esymfony\/console\u003C\/code\u003E and create a command that extends \u003Ccode\u003EAvris\\Dotenv\\Command\\FillCommand\u003C\/code\u003E, providing all the defaults:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003Efinal class FillCommandImplementation extends \\Avris\\Dotenv\\Command\\FillCommand\n{\n protected function getDefaults(): iterable\n {\n yield `Foo\\Database` =\u0026gt; [\n \u0027DB_HOST\u0027 =\u0026gt; \u0027127.0.0.1\u0027,\n \u0027DB_DATABASE\u0027 =\u0026gt; \u0027foo\u0027,\n \u0027DB_USER\u0027 =\u0026gt; \u0027root\u0027,\n \u0027DB_PASS\u0027 =\u0026gt; \u0027\u0027,\n ]; \n yield `Foo\\Mailer` =\u0026gt; [\n \u0027MAILER_URL\u0027 =\u0026gt; \u0027null:\/\/localhost\u0027,\n ];\n }\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003ELet\u2019s say your \u003Ccode\u003E.env\u003C\/code\u003E file looks like this:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-bash\u0022\u003E###\u0026gt; Foo\\Database ###\nDB_HOST=127.0.0.1\nDB_DATABASE=prod\nDB_USER=user\n###\u0026lt; Foo\\Database ###\n\nFOO=bar\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EBoth \u003Ccode\u003EDB_PASS\u003C\/code\u003E and \u003Ccode\u003EMAILER_URL\u003C\/code\u003E are missing and an additional variable \u003Ccode\u003EFOO\u003C\/code\u003E is defined.\u003C\/p\u003E\n\u003Cp\u003EIf you now \u003Ca href=\u0022https:\/\/symfony.com\/doc\/current\/components\/console.html\u0022\u003Erun the command\u003C\/a\u003E,\nyou will be asked what should \u003Ccode\u003EDB_PASS\u003C\/code\u003E and \u003Ccode\u003EMAILER_URL\u003C\/code\u003E be (defaults \u003Ccode\u003E\u0027\u0027\u003C\/code\u003E and \u003Ccode\u003Enull:\/\/localhost\u003C\/code\u003E are offered),\nand the values you submit will be put in the \u003Ccode\u003E.env\u003C\/code\u003E file without removing \u003Ccode\u003EFOO\u003C\/code\u003E. \u003C\/p\u003E","words":464,"readTime":2,"lang":"en"}}},"projects\/avris-dispatcher":{"key":"projects\/avris-dispatcher","type":"article","published":true,"meta":{"createdAt":"2017-12-31T13:16:19+01:00","publishedAt":"2017-12-31T13:14:00+01:00","group":null,"links":[{"icon":"brands gitlab","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/Dispatcher","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-dispatcher"},"content":{"en":{"slug":"avris-dispatcher","title":"Avris Dispatcher","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-dispatcher_small.png\u0022 alt=\u0022Avris Dispatcher\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHp0lEQVRIiX2X2a8lV3XGf2vYu+qce88dum\/f7nbb3QYbgzFgBSXCkoXsWPKAiEEkYpYQPJCHIB74E3jnjQcE4jl5ivJCiAICMUhYYogygONYmLjdbjdWT3c490xVey8e6nQbJVG2aleVVHv49vfttddXcvH+RyJKRQiiVoiKuVNLIQhUBFfDVEnurFZLaq0QAREIICIIQxERRAQI7pSIWNd690lUREBFMHdMhKYZ4RFCRFBqQQIEKKUgDAOr6gBUFGolqdKvJ0Bk3Y677UUABFV5a3K58y5ELYgaEW\/1M4SkhtaC3+kgKEElAjQE0WEyQlB1QOhLxRAUIUQx1TUbw0KQ4dv6Wt8Md2O16hCBiGGBIoqu+5oqbkZSxUMUalkTPDBCBBKCquGmmAgmipsiUam1UmsZBnAfVl8rqnZXKhUhaiUItnd2OLh1G6gQgjhELagKBJgpyYzkdwAJoAJ1zZaAiK5lMBTFzMiWGDcNRM9sPqdxp0lO9kStlVJ6+lJAGPZLrQCcP7vP8ngK1IG0CFTzGpRiOkicTXHRRESHhIFU9O4mFdRsoNYSKoqKoeJsNBvsjra5PT1EQ4kSNJ5QzxCFEKHvu4EhgUsXL\/L7V19DJJAAU0EIICESa8mUZIpryvTBOmLsTqyA6sCOGqZGdidbQjFEEk1OvO3MJiezKcuu4+y5fVbzGdOjY0yE7EqNyuPPPMErL77EVm4IYogsQHUQRRVEIJmS3fDQhKS1XAg1wERRNVQUN8fVyJ5xEZI5SRJJG06d2uYvP\/9xTu3u8KO\/\/yeuXL6CNZskH6Jpsr3J4089wW9+\/DN22hFQiIgBjAoqYCaYDqy5C05ukN6pNdb6AiiihpojYrg5qgk3W9fEkx\/6IJ\/+0id5+Zf\/yXe+\/nckCg+dv4eoleOTKZ6Nz371K\/zyH77LvVtbrEpHjZ6IMkin6+hKwx7KSTEFl3aD2hWk1uEcCkAMEUctkcxRNZI5bcqM3fnC3\/wVz37sSaa3j\/nuN79D1hG745YHHryHk8MbHM4WPPXlz5BUqJdf513n95nOZyz6FaX2lNqBVpIbZoK7klxIyXAZbyGrHkolYNgjKCIJFUM8kdVpU2KcEp\/+3NM8+7EnAfj3n\/6aRMNkc8LmuOH41pxLf\/o+nnn+cbxteOFr32Z\/bxuNjsOjoO8TJQZAIRXVIGXHXUhJ8Sy4jCaQeyggoRCKoCAOmjB1kjk5JR599G185BN\/fjclHL055fTZM1y4tM+lR+7jvve\/nY29LSKCK9\/7CRujTKmbtE1PbipIpUZH36+I2qEGqoG5kRvHk+BMtqEvRMgAJoboMhzXhOLI+gD83F9\/6O7JDPDcF5\/mf5aI4OpPfsXq+g3O3H+a5WGmOzlgSzvEKmJBrR21XyL0qAnmSsoZbxpcJxNSYcgzKB5Kwsji5DCyGhnl\/Y9e5MKFU\/8LwB+XWgqvfP8XHL\/8Cu2G0m6POfPwvfSHGxxdE1RWCB1IJkpCpA4RlhzLGWtG+GRnQinAmiFD8HBaMVqUFqOpwmMfePD\/BTO9fsiL\/\/gzVjevM2oAhW4+Y3azw2XFeLuhdmU4ewxUErKWS92x3KLNCD93akTfB7VADUVDUYwUQsJoQ2mK8NDb9\/5PIPOjGf\/1019z9V9eIkvHqK1D6qgQHdSlQaPkkRJJMYm1TAk1xVJGc4OkBvIIf89+w2zRsVoWVn2llEqpFQlBomJFMBH2dsd3QZxM51x++Sqv\/tvvuPqb\/6aJjrEXIhWcStZKaIAFrIZcKSlIHrgJZoKmhOQWkkHOkBvwFn9+9w1OFpXptOPopDLtg+MlzFaw6GDVC6WHb33jb5mfzDm4ccTJrSNyKSQKiUqrlZH1bKRgq62sxhUmQQqhtcFmSOlQDywbVoOuM4wJ3dLQNnF4e0xHizz5yF5stYnFYrBKbpkQp+KEJApO1UxfIUQ5e\/4Cy8WS2ckMU13nOGOUHY\/Cub0JLI45sxGc3y3s7xkbG8Jr1w6YzueU3LFzzwV+\/IOf8+q1JVttZX9\/wrILXnjxBNncORWaMqKGpYQ3LaKG5wZPGUsNqkZuWswTf\/HM07QW3Lh5SNdVVIxL5\/dJ3nJ04yZnT+8gyznn9rYox4f016+wuwFJe5L17Gz0PPTomINrU65fO2IyApeeM489zew\/fog\/\/NFP0Wxu0VdoNyZ4alB1xJzkCRFDGPKOhLB58R7m8yXteMW79k9x9doN8vYGB7dP8NPneHPRsTs+zdVbS8ZsEulecjLaVKlWWTSVznY49U44mP6ONBIa7+lvz9h897N4wZjO5mCJ1fExIieADl4oBgM+eCGQUvnnN64gtVIXC34eFVdFSiARWC0kBm88TplJcibubDeJcRJcC+MM00XHn713i9dvK\/VWz9YIJgdv8I7n\/gS\/ffm3rLoO9UwtFW9G8NY\/BAJ4SqgqEkHUQGMAoLUifX\/X4NduiYtx8OZrtLnFRdje3OL01g4eldnsiN2tCf\/6kvP7yyPePFzw6s0Foxw0uuLD\/evI3gMPRy2FfrWidkvSxgQJoawWaGqGdFB7PLcAg+cGtAaKIHHHQw9eXCMQKiaCq+ACSiWboRr0fYdQ2J84261xaz7Y3MbhsUvwB7\/yQ03P6NWiAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-dispatcher_small.png\u0022 alt=\u0022Avris Dispatcher\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EAn event dispatcher\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-dispatcher_big.png\u0022 alt=\u0022Avris Dispatcher\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHp0lEQVRIiX2X2a8lV3XGf2vYu+qce88dum\/f7nbb3QYbgzFgBSXCkoXsWPKAiEEkYpYQPJCHIB74E3jnjQcE4jl5ivJCiAICMUhYYogygONYmLjdbjdWT3c490xVey8e6nQbJVG2aleVVHv49vfttddXcvH+RyJKRQiiVoiKuVNLIQhUBFfDVEnurFZLaq0QAREIICIIQxERRAQI7pSIWNd690lUREBFMHdMhKYZ4RFCRFBqQQIEKKUgDAOr6gBUFGolqdKvJ0Bk3Y677UUABFV5a3K58y5ELYgaEW\/1M4SkhtaC3+kgKEElAjQE0WEyQlB1QOhLxRAUIUQx1TUbw0KQ4dv6Wt8Md2O16hCBiGGBIoqu+5oqbkZSxUMUalkTPDBCBBKCquGmmAgmipsiUam1UmsZBnAfVl8rqnZXKhUhaiUItnd2OLh1G6gQgjhELagKBJgpyYzkdwAJoAJ1zZaAiK5lMBTFzMiWGDcNRM9sPqdxp0lO9kStlVJ6+lJAGPZLrQCcP7vP8ngK1IG0CFTzGpRiOkicTXHRRESHhIFU9O4mFdRsoNYSKoqKoeJsNBvsjra5PT1EQ4kSNJ5QzxCFEKHvu4EhgUsXL\/L7V19DJJAAU0EIICESa8mUZIpryvTBOmLsTqyA6sCOGqZGdidbQjFEEk1OvO3MJiezKcuu4+y5fVbzGdOjY0yE7EqNyuPPPMErL77EVm4IYogsQHUQRRVEIJmS3fDQhKS1XAg1wERRNVQUN8fVyJ5xEZI5SRJJG06d2uYvP\/9xTu3u8KO\/\/yeuXL6CNZskH6Jpsr3J4089wW9+\/DN22hFQiIgBjAoqYCaYDqy5C05ukN6pNdb6AiiihpojYrg5qgk3W9fEkx\/6IJ\/+0id5+Zf\/yXe+\/nckCg+dv4eoleOTKZ6Nz371K\/zyH77LvVtbrEpHjZ6IMkin6+hKwx7KSTEFl3aD2hWk1uEcCkAMEUctkcxRNZI5bcqM3fnC3\/wVz37sSaa3j\/nuN79D1hG745YHHryHk8MbHM4WPPXlz5BUqJdf513n95nOZyz6FaX2lNqBVpIbZoK7klxIyXAZbyGrHkolYNgjKCIJFUM8kdVpU2KcEp\/+3NM8+7EnAfj3n\/6aRMNkc8LmuOH41pxLf\/o+nnn+cbxteOFr32Z\/bxuNjsOjoO8TJQZAIRXVIGXHXUhJ8Sy4jCaQeyggoRCKoCAOmjB1kjk5JR599G185BN\/fjclHL055fTZM1y4tM+lR+7jvve\/nY29LSKCK9\/7CRujTKmbtE1PbipIpUZH36+I2qEGqoG5kRvHk+BMtqEvRMgAJoboMhzXhOLI+gD83F9\/6O7JDPDcF5\/mf5aI4OpPfsXq+g3O3H+a5WGmOzlgSzvEKmJBrR21XyL0qAnmSsoZbxpcJxNSYcgzKB5Kwsji5DCyGhnl\/Y9e5MKFU\/8LwB+XWgqvfP8XHL\/8Cu2G0m6POfPwvfSHGxxdE1RWCB1IJkpCpA4RlhzLGWtG+GRnQinAmiFD8HBaMVqUFqOpwmMfePD\/BTO9fsiL\/\/gzVjevM2oAhW4+Y3azw2XFeLuhdmU4ewxUErKWS92x3KLNCD93akTfB7VADUVDUYwUQsJoQ2mK8NDb9\/5PIPOjGf\/1019z9V9eIkvHqK1D6qgQHdSlQaPkkRJJMYm1TAk1xVJGc4OkBvIIf89+w2zRsVoWVn2llEqpFQlBomJFMBH2dsd3QZxM51x++Sqv\/tvvuPqb\/6aJjrEXIhWcStZKaIAFrIZcKSlIHrgJZoKmhOQWkkHOkBvwFn9+9w1OFpXptOPopDLtg+MlzFaw6GDVC6WHb33jb5mfzDm4ccTJrSNyKSQKiUqrlZH1bKRgq62sxhUmQQqhtcFmSOlQDywbVoOuM4wJ3dLQNnF4e0xHizz5yF5stYnFYrBKbpkQp+KEJApO1UxfIUQ5e\/4Cy8WS2ckMU13nOGOUHY\/Cub0JLI45sxGc3y3s7xkbG8Jr1w6YzueU3LFzzwV+\/IOf8+q1JVttZX9\/wrILXnjxBNncORWaMqKGpYQ3LaKG5wZPGUsNqkZuWswTf\/HM07QW3Lh5SNdVVIxL5\/dJ3nJ04yZnT+8gyznn9rYox4f016+wuwFJe5L17Gz0PPTomINrU65fO2IyApeeM489zew\/fog\/\/NFP0Wxu0VdoNyZ4alB1xJzkCRFDGPKOhLB58R7m8yXteMW79k9x9doN8vYGB7dP8NPneHPRsTs+zdVbS8ZsEulecjLaVKlWWTSVznY49U44mP6ONBIa7+lvz9h897N4wZjO5mCJ1fExIieADl4oBgM+eCGQUvnnN64gtVIXC34eFVdFSiARWC0kBm88TplJcibubDeJcRJcC+MM00XHn713i9dvK\/VWz9YIJgdv8I7n\/gS\/ffm3rLoO9UwtFW9G8NY\/BAJ4SqgqEkHUQGMAoLUifX\/X4NduiYtx8OZrtLnFRdje3OL01g4eldnsiN2tCf\/6kvP7yyPePFzw6s0Foxw0uuLD\/evI3gMPRy2FfrWidkvSxgQJoawWaGqGdFB7PLcAg+cGtAaKIHHHQw9eXCMQKiaCq+ACSiWboRr0fYdQ2J84261xaz7Y3MbhsUvwB7\/yQ03P6NWiAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-dispatcher_big.png\u0022 alt=\u0022Avris Dispatcher\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EAn event dispatcher\u003C\/p\u003E\n\u003Ch3\u003EInstalation\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs bash border\u0022\u003Ecomposer require avris\/dispatcher\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EEvent Definition\u003C\/h3\u003E\n\u003Cp\u003EAn event is an object that extends \u003Ccode\u003EAvris\\Dispatcher\\Event\u003C\/code\u003E.\nIt has to provide its name (used as an identifier for triggering it)\nand a setter and getter for its value (for instance if \u003Ccode\u003ERequestEvent\u003C\/code\u003E is supposed to produce a \u003Ccode\u003EResponse\u003C\/code\u003E, that response is the value).\u003C\/p\u003E\n\u003Cp\u003EFor example:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efinal\u003C\/span\u003E \u003Cspan class=\u0022hljs-class\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eclass\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003ERequestEvent\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Eextends\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EEvent\u003C\/span\u003E\n\u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-comment\u0022\u003E\/** \u003Cspan class=\u0022hljs-doctag\u0022\u003E@var\u003C\/span\u003E RequestInterface *\/\u003C\/span\u003E\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eprivate\u003C\/span\u003E $request;\n\n \u003Cspan class=\u0022hljs-comment\u0022\u003E\/** \u003Cspan class=\u0022hljs-doctag\u0022\u003E@var\u003C\/span\u003E ResponseInterface *\/\u003C\/span\u003E\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eprivate\u003C\/span\u003E $response;\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003E__construct\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E(RequestInterface $request)\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;request = $request;\n }\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EgetName\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003Estring\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027request\u0027\u003C\/span\u003E;\n }\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EgetRequest\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003ERequestInterface\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;request;\n }\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EgetResponse\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: ?\u003Cspan class=\u0022hljs-title\u0022\u003EResponseInterface\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;response;\n }\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EsetResponse\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E(ResponseInterface $response)\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003Eself\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;response = $response;\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E;\n }\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EsetValue\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E($value)\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003EEvent\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;response = $value;\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E;\n }\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EgetValue\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;response;\n }\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EAttaching listeners\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$dispatcher = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E EventDispatcher();\n$dispatcher-\u0026gt;attachListener(\u2019request\u2019, \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-params\u0022\u003E(RequestEvent $event)\u003C\/span\u003E \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E (substr($event-\u0026gt;getRequest()-\u0026gt;getUrl(), \u003Cspan class=\u0022hljs-number\u0022\u003E0\u003C\/span\u003E, \u003Cspan class=\u0022hljs-number\u0022\u003E6\u003C\/span\u003E) === \u2018\/admin\u2019 \u0026amp;\u0026amp; !is_admin()) {\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E Response(\u2019Forbidden\u2019, \u003Cspan class=\u0022hljs-number\u0022\u003E403\u003C\/span\u003E);\n }\n});\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EReturning anything other than \u003Ccode\u003Enull\u003C\/code\u003E will automatically set event\u2019s value\n(you can also do it explicitly with \u003Ccode\u003E$event-\u0026gt;setResponse($response)\u003C\/code\u003E).\u003C\/p\u003E\n\u003Cp\u003EAs a last argument of \u003Ccode\u003EattachListener\u003C\/code\u003E you can specify the priority of the listener, for example:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$dispatcher-\u0026gt;attachListener(\u2019request\u2019, [\u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E, \u2018one\u2019]);\n$dispatcher-\u0026gt;attachListener(\u2019request\u2019, [\u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E, \u2018two\u2019]);\n$dispatcher-\u0026gt;attachListener(\u2019request\u2019, [\u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E, \u2018three\u2019], \u003Cspan class=\u0022hljs-number\u0022\u003E-9\u003C\/span\u003E);\n$dispatcher-\u0026gt;attachListener(\u2019request\u2019, [\u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E, \u2018four\u2019], \u003Cspan class=\u0022hljs-number\u0022\u003E9\u003C\/span\u003E);\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EThe listeners will be triggered in order: \u003Ccode\u003Efour\u003C\/code\u003E, \u003Ccode\u003Eone\u003C\/code\u003E, \u003Ccode\u003Etwo\u003C\/code\u003E, \u003Ccode\u003Ethree\u003C\/code\u003E.\u003C\/p\u003E\n\u003Cp\u003ETo stop propagation of an event, use \u003Ccode\u003E$event-\u0026gt;stopPropagation()\u003C\/code\u003E.\u003C\/p\u003E\n\u003Ch3\u003ETriggering events\u003C\/h3\u003E\n\u003Cp\u003ETo trigger an event:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode\u003E$response = $dispatcher-\u0026gt;trigger(new RequestEvent($request));\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAs you can see, the value of the event after executing the listeners will be returned for convenience\n(again, you can explicitly use \u003Ccode\u003E$event-\u0026gt;getResponse()\u003C\/code\u003E).\u003C\/p\u003E\n\u003Ch3\u003EEvent subscribers\u003C\/h3\u003E\n\u003Cp\u003EA subscriber is an object that defines event listeners in an elegant manner,\nencapsulating possibly multiple listeners related to one service.\u003C\/p\u003E\n\u003Cp\u003EIt needs to implement \u003Ccode\u003EAvris\\Dispatcher\\EventSubscriberInterface\u003C\/code\u003E:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efinal\u003C\/span\u003E \u003Cspan class=\u0022hljs-class\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eclass\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EFooService\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Eimplements\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EEventSubscriberInterface\u003C\/span\u003E\n\u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EgetSubscribedEvents\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003Eiterable\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eyield\u003C\/span\u003E \u2018request\u2019 =\u0026gt; [\u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E, \u2018onRequest\u2019];\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eyield\u003C\/span\u003E \u2018response:\u003Cspan class=\u0022hljs-number\u0022\u003E9\u003C\/span\u003E\u2019 =\u0026gt; [\u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E, \u2018onResponse\u2019]; \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ priority 9\u003C\/span\u003E\n }\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003ETo register them in the dispatcher:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$fooService = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E FooService();\n\u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;dispatcher-\u0026gt;registerSubscriber($fooService);\n\u003C\/code\u003E\u003C\/pre\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["dispatcher","event","library","php"],"hasMore":true,"image":"https:\/\/avris.it\/image\/avris-dispatcher_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-dispatcher_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-dispatcher_mini.png\u0022 alt=\u0022Avris Dispatcher\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EAn event dispatcher\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-dispatcher_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-dispatcher_mini.png\u0022 alt=\u0022Avris Dispatcher\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EAn event dispatcher\u003C\/p\u003E\n\u003Ch3\u003EInstalation\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-bash\u0022\u003Ecomposer require avris\/dispatcher\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EEvent Definition\u003C\/h3\u003E\n\u003Cp\u003EAn event is an object that extends \u003Ccode\u003EAvris\\Dispatcher\\Event\u003C\/code\u003E.\nIt has to provide its name (used as an identifier for triggering it)\nand a setter and getter for its value (for instance if \u003Ccode\u003ERequestEvent\u003C\/code\u003E is supposed to produce a \u003Ccode\u003EResponse\u003C\/code\u003E, that response is the value).\u003C\/p\u003E\n\u003Cp\u003EFor example:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003Efinal class RequestEvent extends Event\n{\n \/** @var RequestInterface *\/\n private $request;\n\n \/** @var ResponseInterface *\/\n private $response;\n\n public function __construct(RequestInterface $request)\n {\n $this-\u0026gt;request = $request;\n }\n\n public function getName(): string\n {\n return \u0027request\u0027;\n }\n\n public function getRequest(): RequestInterface\n {\n return $this-\u0026gt;request;\n }\n\n public function getResponse(): ?ResponseInterface\n {\n return $this-\u0026gt;response;\n }\n\n public function setResponse(ResponseInterface $response): self\n {\n $this-\u0026gt;response = $response;\n\n return $this;\n }\n\n public function setValue($value): Event\n {\n $this-\u0026gt;response = $value;\n\n return $this;\n }\n\n public function getValue()\n {\n return $this-\u0026gt;response;\n }\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EAttaching listeners\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$dispatcher = new EventDispatcher();\n$dispatcher-\u0026gt;attachListener(\u2019request\u2019, function (RequestEvent $event) {\n if (substr($event-\u0026gt;getRequest()-\u0026gt;getUrl(), 0, 6) === \u2018\/admin\u2019 \u0026amp;\u0026amp; !is_admin()) {\n return new Response(\u2019Forbidden\u2019, 403);\n }\n});\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EReturning anything other than \u003Ccode\u003Enull\u003C\/code\u003E will automatically set event\u2019s value\n(you can also do it explicitly with \u003Ccode\u003E$event-\u0026gt;setResponse($response)\u003C\/code\u003E).\u003C\/p\u003E\n\u003Cp\u003EAs a last argument of \u003Ccode\u003EattachListener\u003C\/code\u003E you can specify the priority of the listener, for example:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$dispatcher-\u0026gt;attachListener(\u2019request\u2019, [$this, \u2018one\u2019]);\n$dispatcher-\u0026gt;attachListener(\u2019request\u2019, [$this, \u2018two\u2019]);\n$dispatcher-\u0026gt;attachListener(\u2019request\u2019, [$this, \u2018three\u2019], -9);\n$dispatcher-\u0026gt;attachListener(\u2019request\u2019, [$this, \u2018four\u2019], 9);\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EThe listeners will be triggered in order: \u003Ccode\u003Efour\u003C\/code\u003E, \u003Ccode\u003Eone\u003C\/code\u003E, \u003Ccode\u003Etwo\u003C\/code\u003E, \u003Ccode\u003Ethree\u003C\/code\u003E.\u003C\/p\u003E\n\u003Cp\u003ETo stop propagation of an event, use \u003Ccode\u003E$event-\u0026gt;stopPropagation()\u003C\/code\u003E.\u003C\/p\u003E\n\u003Ch3\u003ETriggering events\u003C\/h3\u003E\n\u003Cp\u003ETo trigger an event:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode\u003E$response = $dispatcher-\u0026gt;trigger(new RequestEvent($request));\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAs you can see, the value of the event after executing the listeners will be returned for convenience\n(again, you can explicitly use \u003Ccode\u003E$event-\u0026gt;getResponse()\u003C\/code\u003E).\u003C\/p\u003E\n\u003Ch3\u003EEvent subscribers\u003C\/h3\u003E\n\u003Cp\u003EA subscriber is an object that defines event listeners in an elegant manner,\nencapsulating possibly multiple listeners related to one service.\u003C\/p\u003E\n\u003Cp\u003EIt needs to implement \u003Ccode\u003EAvris\\Dispatcher\\EventSubscriberInterface\u003C\/code\u003E:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003Efinal class FooService implements EventSubscriberInterface\n{\n public function getSubscribedEvents(): iterable\n {\n yield \u2018request\u2019 =\u0026gt; [$this, \u2018onRequest\u2019];\n yield \u2018response:9\u2019 =\u0026gt; [$this, \u2018onResponse\u2019]; \/\/ priority 9\n }\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003ETo register them in the dispatcher:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$fooService = new FooService();\n$this-\u0026gt;dispatcher-\u0026gt;registerSubscriber($fooService);\u003C\/code\u003E\u003C\/pre\u003E","words":349,"readTime":2,"lang":"en"}}},"projects\/altdownloader":{"key":"projects\/altdownloader","type":"article","published":true,"meta":{"createdAt":"2017-12-27T20:28:08+01:00","publishedAt":"2017-12-27T20:26:00+01:00","group":"chrome-extensions","links":[{"icon":"brands chrome","colour":"primary","url":"https:\/\/chrome.google.com\/webstore\/detail\/kpecilpnbadggclbgkbpcgpinihjnmnb","displayUrl":"Chrome Extension"},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/AltDownloader","displayUrl":null}],"category":"projects","subcategory":null,"slug":"altdownloader"},"content":{"en":{"slug":"altdownloader","title":"AltDownloader","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/alt-downloader_small.png\u0022 alt=\u0022AltDownloader\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022300\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAWCAYAAACosj4+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGzUlEQVRIiW2WT2wUyRXGf1XTPf89M7YhAWMvtgEDu7GDUIIsJZG4LsLn3eQMPnOBXYnD5oQsxAqtIkuJ4IBWoCQnfIgSy4dcohwiAY7FCggL2Abb2GbtmbFnPD0z3fVyqJ6eIaFHNV2qrj+vvve97z31pz\/\/UQTBPgplX1FfRDDGhJ9b39vzFAoJl9Q8j2Jpi2KpyPDgEVLJFNKxu99sYkQAQURAQBB7kgIEHEEQaZkjiAJEtfvhIwjK7vHBRxSkkkn8bI5Cvpul14skkykGBwZBxK5XChP4dr6xY6FVKGUvpu2Y2EUidqK0W4dFmNZYeEDnvNY6rTWu4zI8eIRMKs3Cd\/9mp7LTPtQYTBBgJLD9sAVBgAkCHKVUB6z2v42Eao9pjfEDXrx8GdnYASAxx2FsbJRGs4Ef+MRiDvl8N5l0huWVZZRSHBk6ih8i1Dqu82IKhaO1tocFgfWvgEFQivdc1Nvby7d3vuXKlSsfdFm1WuXu3bv88le\/oOJVSKViADiOy9BHw+xWdvjuyWMqexVGT45aez7gCS0iaKXYLm1TrVb\/zwWRp42hv7+fsbExNjY2cF2X0dFRFhcXKRQKnDx5knK5jFf3SMQTxN0EibhthUKBnu5ejh0Z4ePjn0SBYowhCN3lh80BqDcazP19lp+d+jn9hwaIxWKg1AcZLCI8fPiQ+fl5PM+jXC4zPT3NysoKZ86cYae0G84sRWtevXrFyMgx0tk0qUQSr163nInQkZDGYjn0z3\/9g76Dh8hmuwh8H4VCa92mUAdZlFJMTExw+\/ZtFhYW2Nzc5OzZs+zs7PDZZ5990J1LS0tMT0\/zyU8+RoBYLEaz2cCIwQjQwSO9+cMmr1eWOTp0lGQigRDCKWEEiCDGRH4WERYWFigWi6yvr\/Pu3TtehkT3PI9ms4mIUK\/XqdVq1Gq1Dg7bXywWw4gQBAZjAkzQjjb917m\/cGToKOlUmlgsZoVOTGRExKMO9z179ozTp09z8eJFent7efDgAQBzc3Ncv36djY0N5ubmuH\/\/PjMzMzQajegyxthw11rhBz6+74fvJs1mE6cZNOk7cAgVckZsjIEBpUGJQpQ1suWyy5cvk0wmuXbtGhcuXGBxcZHV1VUmJiY4f\/48N27c4NKlS7iui1KKpaUlq+pKoVAEEhDTMXzfxxhDtVpBa00ikcAZPTlGKpmKIEUsZQwGFViE9mp7pNMplpaWmJqaAqCnp4d79+4xPDzMo0ePGB8fjwyenJzkzp07JJNJAMbHx6lUdnn2\/CnpVJqDBw6ys1tmcfkVIkJ\/Xz\/pdAZjDM7+3v3EtG5zBFAi7NVqlHfLpFNpugvdVCoVfv2bz\/G8OgBdXVkAarUaPT09zM\/PMzY2RiKRYGhoiMnJSSt2IULpVJrDA4ep7FV5+vwp9brH0OEhXDeO1trKjBKcRCIR+VcpxZvV16ytv2X\/vv0MDgziOA6EvNra+oFCoZtkMonneQAsLy+zt7fHrVu3bNpwXc6dO\/delD1+\/Jh8IY9SikwqzdDhYfzAj0AwIV+NMTgxHXtPY4rlEsePHiebydrQD3UCFKKE4naRr776LV9\/fQOllA0EZWVCKUWpVGJ29m8ANH0fx3HoymY5fnyEYqlo9wQUjhXFsJKwWR\/UN7+7Ka3NlFKUyiW01uRzebTSKK0iMiqliDkOrhPnyy++ZG5ujr6+Pmq1Gjs7O6yurrJd3KZY2gKBmlfDdV1agtap0FFfrFEmTLqOTQvWf1prCvkCK2sr5HP5NjIikUj6fpNkIsHAwABbW1ucOHGCfD7PgQMHmJqaYmh4kB\/9eH8kGWvraziOS7PZoN5oUG941Ot1PM+j3qhTr9fx\/SZ+K9uLCCZMpMYYFNYNxhi044TwduZ1qFQrfHruU65evcrMzAyFQoEnT54wOzvLzW9usr29RWACRIR4PE4mk32vxIj0x\/dp+n6Yy5oEgY8TGIMOK8CW2wq5AuXdMj2FnsgIhQIdSS4DH\/Vz6tRPGRkZIZPJICJc+eIKa+trNJsNgiAgCHy2i9tkM10tkkYVRXtfOlKTwhFjCJSy5QYKjcJ1XWpeDa10NFmwFUALreU3Sxw7cYw\/3Po99XodrTVv199iTIBWGtGCUi4AG5vrZDJZ4vF4e6\/3skC7OUYMKro6NtlpQ3WvyovF7+ku9NDbsw+tW0puF+5Wdsnn8rxZeRNFaFvL2nkvEU+QSWfY26tSKpfI53ItsDDGEls6w95uYrD+sBsFgdDbu48Xr74nl8vz\/OV\/UEoRd+PkunJks114dQ8jEtbAbRT\/t2SxpQwkkylc12VrewutNblsDtVCv6MM+S\/6sEayQzUw9gAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/alt-downloader_small.png\u0022 alt=\u0022AltDownloader\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022300\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA Chrome extension that lets you download images and videos by just Ctrl+Alt+Clicking on them.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/alt-downloader_big.png\u0022 alt=\u0022AltDownloader\u0022 class=\u0022border\u0022 width=\u0022640\u0022 height=\u0022400\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAWCAYAAACosj4+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGzUlEQVRIiW2WT2wUyRXGf1XTPf89M7YhAWMvtgEDu7GDUIIsJZG4LsLn3eQMPnOBXYnD5oQsxAqtIkuJ4IBWoCQnfIgSy4dcohwiAY7FCggL2Abb2GbtmbFnPD0z3fVyqJ6eIaFHNV2qrj+vvve97z31pz\/\/UQTBPgplX1FfRDDGhJ9b39vzFAoJl9Q8j2Jpi2KpyPDgEVLJFNKxu99sYkQAQURAQBB7kgIEHEEQaZkjiAJEtfvhIwjK7vHBRxSkkkn8bI5Cvpul14skkykGBwZBxK5XChP4dr6xY6FVKGUvpu2Y2EUidqK0W4dFmNZYeEDnvNY6rTWu4zI8eIRMKs3Cd\/9mp7LTPtQYTBBgJLD9sAVBgAkCHKVUB6z2v42Eao9pjfEDXrx8GdnYASAxx2FsbJRGs4Ef+MRiDvl8N5l0huWVZZRSHBk6ih8i1Dqu82IKhaO1tocFgfWvgEFQivdc1Nvby7d3vuXKlSsfdFm1WuXu3bv88le\/oOJVSKViADiOy9BHw+xWdvjuyWMqexVGT45aez7gCS0iaKXYLm1TrVb\/zwWRp42hv7+fsbExNjY2cF2X0dFRFhcXKRQKnDx5knK5jFf3SMQTxN0EibhthUKBnu5ejh0Z4ePjn0SBYowhCN3lh80BqDcazP19lp+d+jn9hwaIxWKg1AcZLCI8fPiQ+fl5PM+jXC4zPT3NysoKZ86cYae0G84sRWtevXrFyMgx0tk0qUQSr163nInQkZDGYjn0z3\/9g76Dh8hmuwh8H4VCa92mUAdZlFJMTExw+\/ZtFhYW2Nzc5OzZs+zs7PDZZ5990J1LS0tMT0\/zyU8+RoBYLEaz2cCIwQjQwSO9+cMmr1eWOTp0lGQigRDCKWEEiCDGRH4WERYWFigWi6yvr\/Pu3TtehkT3PI9ms4mIUK\/XqdVq1Gq1Dg7bXywWw4gQBAZjAkzQjjb917m\/cGToKOlUmlgsZoVOTGRExKMO9z179ozTp09z8eJFent7efDgAQBzc3Ncv36djY0N5ubmuH\/\/PjMzMzQajegyxthw11rhBz6+74fvJs1mE6cZNOk7cAgVckZsjIEBpUGJQpQ1suWyy5cvk0wmuXbtGhcuXGBxcZHV1VUmJiY4f\/48N27c4NKlS7iui1KKpaUlq+pKoVAEEhDTMXzfxxhDtVpBa00ikcAZPTlGKpmKIEUsZQwGFViE9mp7pNMplpaWmJqaAqCnp4d79+4xPDzMo0ePGB8fjwyenJzkzp07JJNJAMbHx6lUdnn2\/CnpVJqDBw6ys1tmcfkVIkJ\/Xz\/pdAZjDM7+3v3EtG5zBFAi7NVqlHfLpFNpugvdVCoVfv2bz\/G8OgBdXVkAarUaPT09zM\/PMzY2RiKRYGhoiMnJSSt2IULpVJrDA4ep7FV5+vwp9brH0OEhXDeO1trKjBKcRCIR+VcpxZvV16ytv2X\/vv0MDgziOA6EvNra+oFCoZtkMonneQAsLy+zt7fHrVu3bNpwXc6dO\/delD1+\/Jh8IY9SikwqzdDhYfzAj0AwIV+NMTgxHXtPY4rlEsePHiebydrQD3UCFKKE4naRr776LV9\/fQOllA0EZWVCKUWpVGJ29m8ANH0fx3HoymY5fnyEYqlo9wQUjhXFsJKwWR\/UN7+7Ka3NlFKUyiW01uRzebTSKK0iMiqliDkOrhPnyy++ZG5ujr6+Pmq1Gjs7O6yurrJd3KZY2gKBmlfDdV1agtap0FFfrFEmTLqOTQvWf1prCvkCK2sr5HP5NjIikUj6fpNkIsHAwABbW1ucOHGCfD7PgQMHmJqaYmh4kB\/9eH8kGWvraziOS7PZoN5oUG941Ot1PM+j3qhTr9fx\/SZ+K9uLCCZMpMYYFNYNxhi044TwduZ1qFQrfHruU65evcrMzAyFQoEnT54wOzvLzW9usr29RWACRIR4PE4mk32vxIj0x\/dp+n6Yy5oEgY8TGIMOK8CW2wq5AuXdMj2FnsgIhQIdSS4DH\/Vz6tRPGRkZIZPJICJc+eIKa+trNJsNgiAgCHy2i9tkM10tkkYVRXtfOlKTwhFjCJSy5QYKjcJ1XWpeDa10NFmwFUALreU3Sxw7cYw\/3Po99XodrTVv199iTIBWGtGCUi4AG5vrZDJZ4vF4e6\/3skC7OUYMKro6NtlpQ3WvyovF7+ku9NDbsw+tW0puF+5Wdsnn8rxZeRNFaFvL2nkvEU+QSWfY26tSKpfI53ItsDDGEls6w95uYrD+sBsFgdDbu48Xr74nl8vz\/OV\/UEoRd+PkunJks114dQ8jEtbAbRT\/t2SxpQwkkylc12VrewutNblsDtVCv6MM+S\/6sEayQzUw9gAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/alt-downloader_big.png\u0022 alt=\u0022AltDownloader\u0022 class=\u0022border\u0022 width=\u0022640\u0022 height=\u0022400\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA Chrome extension that lets you download images and videos by just Ctrl+Alt+Clicking on them.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["chrome","download","extension","images","porn","ui","videos"],"hasMore":false,"image":"https:\/\/avris.it\/image\/alt-downloader_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/alt-downloader_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/alt-downloader_mini.png\u0022 alt=\u0022AltDownloader\u0022 width=\u0022240\u0022 height=\u0022150\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA Chrome extension that lets you download images and videos by just Ctrl+Alt+Clicking on them.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/alt-downloader_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/alt-downloader_mini.png\u0022 alt=\u0022AltDownloader\u0022 width=\u0022240\u0022 height=\u0022150\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA Chrome extension that lets you download images and videos by just Ctrl+Alt+Clicking on them.\u003C\/p\u003E","words":17,"readTime":null,"lang":"en"}}},"projects\/avris-bag-nicer-arrays-for-php":{"key":"projects\/avris-bag-nicer-arrays-for-php","type":"article","published":true,"meta":{"createdAt":"2017-12-25T21:04:49+01:00","publishedAt":"2017-12-25T21:02:00+01:00","group":null,"links":[{"icon":"brands gitlab","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/Bag","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-bag-nicer-arrays-for-php"},"content":{"en":{"slug":"avris-bag-nicer-arrays-for-php","title":"Avris Bag \u2022 Nicer arrays for PHP","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-bag_small.png\u0022 alt=\u0022Avris Bag\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHlElEQVRIiX2X268lRRXGf+tS1b3PPvtc5nKGmQGGmyiiTiQaSYhhJEEgBhWNFzQh+qAPGh\/8E3z3zQej8VmfjC+IiUYjkECiSLwAInKZGRgGMsycOefsc9vdVcuH3jMYNVa6ujvpunz1fbVqfS3X33B7RKkIQdQKUTF3aikEgYrgapgqyZ3ZbJ9aK0RABAKICMJQRAQRAYIrJSLmtV59EhURUBHMHROhaUZ4hBARlFqQAAFKKQjDwKo6ABWFWkmq9PMJEJm342p7EQBBVd6dXK68C1ELokbEu\/0MIamhteBXOghKUIkADUF0mIwQVB0Q+lIxBEUIUUx1zsawEGT4Nr\/mN8PdmM06RCBiWKCIovO+poqbkVTxEIVa5gQPjBCBhKBquCkmgonipkhUaq3UWoYB3IfV14qqXZVKRYhaCYLllRUuX1oHKoQgDlELqgIBZkoyI\/kVQAKoQJ2zJSCicxkMRTEzsiUWmgaiZ2d3l8adJjnZE7VWSunpSwFh2C+1AnD0yBr7W1OgDqRFoJrnoBTTQeJsiosmIjokDKSiVzepoGYDtZZQUVQMFWfcjFkdLbM+3UBDiRI0nlDPEIUQoe+7gSGBE9dfz1unzyISSICpIASQEIm5ZEoyxTVl+mAeMXYlVkB1YEcNUyO7ky2hGCKJJiduPLzI9s6U\/a7jyDVrzHZ3mG5uYSJkV2pU7vrk3bzywoss5YYghsgCVAdRVEEEkinZDQ9NSJrLhVADTBRVQ0Vxc1yN7BkXIZmTJJG04cCBZT73tS9wYHWF3\/\/8V7x+5nWsWST5EE2T5UXuuudunn\/8KVbaEVCIiAGMCipgJpgOrLkLTm6Q3qk15voCKKKGmiNiuDmqCTeb18SpBz7Ow9\/+Ei8983ce\/cHPSBRuPXqMqJWt7Smeja9+77s884vHuHZpiVnpqNETUQbpdB5dadhDOSmm4NKOqV1Bah3OoQDEEHHUEskcVSOZ06bMgjtf\/9bnue+hU0zXt3jsR4+SdcTqQsvNtxxje+MdNnb2uOc7XyGpUM+8wfuOrjHd3WGvn1FqT6kdaCW5YSa4K8mFlAyXhSVk1kOpBAx7BEUkoWKIJ7I6bUospMTDj9zLfQ+dAuCvTz5HomGyOGFxoWHr0i4nPvIhPvngXXjb8PT3f8LaoWU0OjY2g75PlBgAhVRUg5QddyElxbPgMppA7qGAhEIogoI4aMLUSebklDh58kY+\/cVPXE0Jm29POXjkMMdPrHHi9uu47o6bGB9aIiJ4\/ddPMB5lSl2kbXpyU0EqNTr6fkbUDjVQDcyN3DieBGeyDH0hQgYwMUSX4bgmFEfmB+Aj33zg6skMcP837uU\/S0Rw7ok\/MbvwDodvOMj+RqbbvsySdohVxIJaO2q\/j9CjJpgrKWe8aXCdTEiFIc+geCgJI4uTw8hqZJQ7Tl7P8eMH\/gvAv5daCq\/85o9svfQK7Vhplxc4fNu19BtjNs8LKjOEDiQTJSFShwhLjuWMNSN8sjKhFGDOkCF4OK0YLUqL0VThzo\/d8n\/BTC9s8MIvn2J28QKjBlDodnfYudjhMmNhuaF2ZTh7DFQSMpdL3bHcos0Iv+bAiL4PaoEaioaiGCmEhNGG0hTh1psO\/U8gu5s7\/OPJ5zj37Itk6Ri1dUgdFaKDum\/QKHmkRFJMYi5TQk2xlNHcIKmBPMI\/sNaws9cx2y\/M+koplVIrEoJExYpgIhxaXbgKYnu6y5mXznH6L69y7vnXaKJjwQuRCk4layU0wAJmQ66UFCQP3AQzQVNCcgvJIGfIDXiLP7j6Jtt7lem0Y3O7Mu2DrX3YmcFeB7NeKD38+Ic\/ZXd7l8vvbLJ9aZNcColCotJqZWQ94xQstZXZQoVJkEJobbAZUjrUA8uG1aDrDGNCt29om9hYX6CjRU7dfiiW2sTe3mCV3DIhTsUJSRScqpm+QoiCOiKKq5HcOXbkCBvr62QTGoVxhkmGw+Pg6Gph7ZAxHgtnz19murtLyR0rx47z+G\/\/wOnz+yy1lbW1Cftd8PQL28jiyoHQlBE1LCW8aRE1PDd4ylhqUDVy02KeSJ5xSzTNiIPLyzz82Qd49tnnWF0cE33htef\/yXIyVltlpYWDi8rqGJL2JOtZGffcenKBy+enXDi\/yWQELj2H77yXnb\/9Dr\/tM1+mWVyir9COJ3hqUHXEnOQJEUMY8o6EIKVCKUgNRma8fHGHxWMn8JQ4fmiZ1y7s0wvsm7LvwnZScjLaVKlW2Wsqna1w4L1wefoqaSQ03tOv77D4\/vvwgjHd2QVLzLa2ENkGdPBCMRjwwQsxB1ORWql7e1ALb559GSmBRuAEVgWthYWUmSRn4s5yk1hIgmthIcN0r+OjH1zijXWlXupZGsHk8pu85\/4P4+tnXmbWdahnaql4M4J3\/yEQwFNCVZEIog6TSwRaK9L3Vw1+7fZxMS6\/fZY2t7gIy4tLHFxawaOys7PJ6tKEP7\/ovHVmxNsbe5y+uMcoB43O+FT\/BnLo5tuilkI\/m1G7fdJ4goRQZntoaoZ0UHs8twCD5wa0BoogccVDD15cIxAqJoKr4AJKJZuhGvR9h1BYmzjLrXFpd7C5jcOdJ+BfJyEzM18yLlUAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-bag_small.png\u0022 alt=\u0022Avris Bag\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003EAvris Bag\u003C\/em\u003E is a set of helpers that make working with arrays in PHP way easier.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-bag_big.png\u0022 alt=\u0022Avris Bag\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHlElEQVRIiX2X268lRRXGf+tS1b3PPvtc5nKGmQGGmyiiTiQaSYhhJEEgBhWNFzQh+qAPGh\/8E3z3zQej8VmfjC+IiUYjkECiSLwAInKZGRgGMsycOefsc9vdVcuH3jMYNVa6ujvpunz1fbVqfS3X33B7RKkIQdQKUTF3aikEgYrgapgqyZ3ZbJ9aK0RABAKICMJQRAQRAYIrJSLmtV59EhURUBHMHROhaUZ4hBARlFqQAAFKKQjDwKo6ABWFWkmq9PMJEJm342p7EQBBVd6dXK68C1ELokbEu\/0MIamhteBXOghKUIkADUF0mIwQVB0Q+lIxBEUIUUx1zsawEGT4Nr\/mN8PdmM06RCBiWKCIovO+poqbkVTxEIVa5gQPjBCBhKBquCkmgonipkhUaq3UWoYB3IfV14qqXZVKRYhaCYLllRUuX1oHKoQgDlELqgIBZkoyI\/kVQAKoQJ2zJSCicxkMRTEzsiUWmgaiZ2d3l8adJjnZE7VWSunpSwFh2C+1AnD0yBr7W1OgDqRFoJrnoBTTQeJsiosmIjokDKSiVzepoGYDtZZQUVQMFWfcjFkdLbM+3UBDiRI0nlDPEIUQoe+7gSGBE9dfz1unzyISSICpIASQEIm5ZEoyxTVl+mAeMXYlVkB1YEcNUyO7ky2hGCKJJiduPLzI9s6U\/a7jyDVrzHZ3mG5uYSJkV2pU7vrk3bzywoss5YYghsgCVAdRVEEEkinZDQ9NSJrLhVADTBRVQ0Vxc1yN7BkXIZmTJJG04cCBZT73tS9wYHWF3\/\/8V7x+5nWsWST5EE2T5UXuuudunn\/8KVbaEVCIiAGMCipgJpgOrLkLTm6Q3qk15voCKKKGmiNiuDmqCTeb18SpBz7Ow9\/+Ei8983ce\/cHPSBRuPXqMqJWt7Smeja9+77s884vHuHZpiVnpqNETUQbpdB5dadhDOSmm4NKOqV1Bah3OoQDEEHHUEskcVSOZ06bMgjtf\/9bnue+hU0zXt3jsR4+SdcTqQsvNtxxje+MdNnb2uOc7XyGpUM+8wfuOrjHd3WGvn1FqT6kdaCW5YSa4K8mFlAyXhSVk1kOpBAx7BEUkoWKIJ7I6bUospMTDj9zLfQ+dAuCvTz5HomGyOGFxoWHr0i4nPvIhPvngXXjb8PT3f8LaoWU0OjY2g75PlBgAhVRUg5QddyElxbPgMppA7qGAhEIogoI4aMLUSebklDh58kY+\/cVPXE0Jm29POXjkMMdPrHHi9uu47o6bGB9aIiJ4\/ddPMB5lSl2kbXpyU0EqNTr6fkbUDjVQDcyN3DieBGeyDH0hQgYwMUSX4bgmFEfmB+Aj33zg6skMcP837uU\/S0Rw7ok\/MbvwDodvOMj+RqbbvsySdohVxIJaO2q\/j9CjJpgrKWe8aXCdTEiFIc+geCgJI4uTw8hqZJQ7Tl7P8eMH\/gvAv5daCq\/85o9svfQK7Vhplxc4fNu19BtjNs8LKjOEDiQTJSFShwhLjuWMNSN8sjKhFGDOkCF4OK0YLUqL0VThzo\/d8n\/BTC9s8MIvn2J28QKjBlDodnfYudjhMmNhuaF2ZTh7DFQSMpdL3bHcos0Iv+bAiL4PaoEaioaiGCmEhNGG0hTh1psO\/U8gu5s7\/OPJ5zj37Itk6Ri1dUgdFaKDum\/QKHmkRFJMYi5TQk2xlNHcIKmBPMI\/sNaws9cx2y\/M+koplVIrEoJExYpgIhxaXbgKYnu6y5mXznH6L69y7vnXaKJjwQuRCk4layU0wAJmQ66UFCQP3AQzQVNCcgvJIGfIDXiLP7j6Jtt7lem0Y3O7Mu2DrX3YmcFeB7NeKD38+Ic\/ZXd7l8vvbLJ9aZNcColCotJqZWQ94xQstZXZQoVJkEJobbAZUjrUA8uG1aDrDGNCt29om9hYX6CjRU7dfiiW2sTe3mCV3DIhTsUJSRScqpm+QoiCOiKKq5HcOXbkCBvr62QTGoVxhkmGw+Pg6Gph7ZAxHgtnz19murtLyR0rx47z+G\/\/wOnz+yy1lbW1Cftd8PQL28jiyoHQlBE1LCW8aRE1PDd4ylhqUDVy02KeSJ5xSzTNiIPLyzz82Qd49tnnWF0cE33htef\/yXIyVltlpYWDi8rqGJL2JOtZGffcenKBy+enXDi\/yWQELj2H77yXnb\/9Dr\/tM1+mWVyir9COJ3hqUHXEnOQJEUMY8o6EIKVCKUgNRma8fHGHxWMn8JQ4fmiZ1y7s0wvsm7LvwnZScjLaVKlW2Wsqna1w4L1wefoqaSQ03tOv77D4\/vvwgjHd2QVLzLa2ENkGdPBCMRjwwQsxB1ORWql7e1ALb559GSmBRuAEVgWthYWUmSRn4s5yk1hIgmthIcN0r+OjH1zijXWlXupZGsHk8pu85\/4P4+tnXmbWdahnaql4M4J3\/yEQwFNCVZEIog6TSwRaK9L3Vw1+7fZxMS6\/fZY2t7gIy4tLHFxawaOys7PJ6tKEP7\/ovHVmxNsbe5y+uMcoB43O+FT\/BnLo5tuilkI\/m1G7fdJ4goRQZntoaoZ0UHs8twCD5wa0BoogccVDD15cIxAqJoKr4AJKJZuhGvR9h1BYmzjLrXFpd7C5jcOdJ+BfJyEzM18yLlUAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-bag_big.png\u0022 alt=\u0022Avris Bag\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003EAvris Bag\u003C\/em\u003E is a set of helpers that make working with arrays in PHP way easier.\u003C\/p\u003E\n\u003Ch3\u003EInstalation\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs bash border\u0022\u003Ecomposer require avris\/bag\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EBag\u003C\/h3\u003E\n\u003Cp\u003E\u003Cem\u003EBag\u003C\/em\u003E class represents a key-value store. It can be used both as an array and as an object, leading to a shorter and nicer code:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$array = [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E,\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027lorem\u0027\u003C\/span\u003E =\u0026gt; [\n \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027ipsum\u0027\u003C\/span\u003E =\u0026gt; [\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027dolor\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027sit\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027amet\u0027\u003C\/span\u003E]\n ],\n];\n\n$bag = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E Bag($array);\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all return \u0027bar\u0027\u003C\/span\u003E\nvar_dump(\u003Cspan class=\u0022hljs-keyword\u0022\u003Eisset\u003C\/span\u003E($array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E]) ? $array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E] : \u003Cspan class=\u0022hljs-keyword\u0022\u003Enull\u003C\/span\u003E);\nvar_dump($bag-\u0026gt;get(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E));\nvar_dump($bag[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E]);\nvar_dump($bag(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E));\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all return null\u003C\/span\u003E\nvar_dump(\u003Cspan class=\u0022hljs-keyword\u0022\u003Eisset\u003C\/span\u003E($array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E]) ? $array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E] : \u003Cspan class=\u0022hljs-keyword\u0022\u003Enull\u003C\/span\u003E);\nvar_dump($bag-\u0026gt;get(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E));\nvar_dump($bag[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E]);\nvar_dump($bag(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E));\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all return \u0027default\u0027\u003C\/span\u003E\nvar_dump(\u003Cspan class=\u0022hljs-keyword\u0022\u003Eisset\u003C\/span\u003E($array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E]) ? $array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E] : \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027default\u0027\u003C\/span\u003E);\nvar_dump($bag-\u0026gt;get(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027default\u0027\u003C\/span\u003E));\nvar_dump($bag[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E] ?: \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027default\u0027\u003C\/span\u003E);\nvar_dump($bag(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027nonexistent\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027default\u0027\u003C\/span\u003E));\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all are equivalent\u003C\/span\u003E\n$array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027x\u0027\u003C\/span\u003E] =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027y\u0027\u003C\/span\u003E;\n$bag-\u0026gt;set(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027x\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027y\u0027\u003C\/span\u003E);\n$bag[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027x\u0027\u003C\/span\u003E] = \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027y\u0027\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all are equivalent\u003C\/span\u003E\nvar_dump(count($array));\nvar_dump($bag-\u0026gt;count());\nvar_dump(count($bag));\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all are equivalent\u003C\/span\u003E\nvar_dump(count($array) === \u003Cspan class=\u0022hljs-number\u0022\u003E0\u003C\/span\u003E);\nvar_dump($bag-\u0026gt;isEmpty());\nvar_dump(count($bag) === \u003Cspan class=\u0022hljs-number\u0022\u003E0\u003C\/span\u003E);\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all are equivalent\u003C\/span\u003E\nvar_dump(array_keys($array));\nvar_dump($bag-\u0026gt;keys());\nvar_dump(array_keys($bag));\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all are equivalent\u003C\/span\u003E\nvar_dump(\u003Cspan class=\u0022hljs-keyword\u0022\u003Eisset\u003C\/span\u003E($array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E]));\nvar_dump($bag-\u0026gt;has(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E));\nvar_dump(\u003Cspan class=\u0022hljs-keyword\u0022\u003Eisset\u003C\/span\u003E($bag[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E]));\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all are equivalent\u003C\/span\u003E\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Eunset\u003C\/span\u003E($array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E]);\n$bag-\u0026gt;delete(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E);\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Eunset\u003C\/span\u003E($bag[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E]);\n\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ all are equivalent\u003C\/span\u003E\n$array = [];\n$bag-\u0026gt;clear();\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EJust like with a simple array, you can also \u003Cstrong\u003Eiterate\u003C\/strong\u003E over a Bag and \u003Cstrong\u003Ejson_encode\u003C\/strong\u003E it.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EAdditional features\u003C\/strong\u003E include:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;getDeep($key, $default = null)\u003C\/code\u003E \u2013 gets a value from a nested tree, using dot-separated string as a key, for instance \u003Ccode\u003E$bag-\u0026gt;getDeep(\u0027lorem.ipsum.1\u0027)\u003C\/code\u003E will return \u2018sit\u2019;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;add(array)\u003C\/code\u003E \u2013 merges the other array into the Bag, without overwriting the existing keys;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;replace(array)\u003C\/code\u003E \u2013 merges the other array into the Bag, with overwriting the existing keys;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;appendToElement($key, $value)\u003C\/code\u003E \u2013 treats \u003Ccode\u003E$bag[$key]\u003C\/code\u003E as a list and appends \u003Ccode\u003E$value\u003C\/code\u003E at its end;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;prependToElement($key, $value)\u003C\/code\u003E \u2013 treats \u003Ccode\u003E$bag[$key]\u003C\/code\u003E as a list and prepends \u003Ccode\u003E$value\u003C\/code\u003E at its beginning;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;map(function ($key, $value) {})\u003C\/code\u003E \u2013 returns a new Bag, with values mapped by the callback function;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;filter(function ($key, $value) {})\u003C\/code\u003E \u2013 returns a new Bag, with only those values from the original Bag, for which the callback function returns true.\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;flatten()\u003C\/code\u003E \u2013 returns a new Bag, with keys flattened, for instance \u003Ccode\u003Elorem.ipsum\u003C\/code\u003E.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch3\u003ESet\u003C\/h3\u003E\n\u003Cp\u003ESet is a similar structure, but it doesn\u2019t care about the keys and it makes sure that all the values are unique. Sometimes it\u2019s helpful to instantiate it with a callback:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$set = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E Set([\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027post\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027get\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027GET\u0027\u003C\/span\u003E], \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027strtoupper\u0027\u003C\/span\u003E);\n\u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ internal values are: \u0027POST\u0027 and \u0027GET\u0027\u003C\/span\u003E\n\nvar_dump($set-\u0026gt;has(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027post\u0027\u003C\/span\u003E)); \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ true\u003C\/span\u003E\nvar_dump($set-\u0026gt;has(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027POST\u0027\u003C\/span\u003E)); \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ true\u003C\/span\u003E\nvar_dump($set-\u0026gt;has(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027DELETE\u0027\u003C\/span\u003E)); \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ false\u003C\/span\u003E\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EMethods:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;add($value)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;addMultiple(array $values)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;has($value)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;delete($value)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;first()\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;last()\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;clear()\u003C\/code\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch3\u003EBagHelper\u003C\/h3\u003E\n\u003Cp\u003EThis class provides four static methods:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003EBagHelper::isArray($object)\u003C\/code\u003E \u2013 checks if \u003Ccode\u003E$object\u003C\/code\u003E is an array or array-like (\u003Ccode\u003E\\Traversable\u003C\/code\u003E);\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EBagHelper::toArray($object)\u003C\/code\u003E \u2013 converts \u003Ccode\u003E$object\u003C\/code\u003E to an array;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EBagHelper::magicGetter($object, $attr, $default = null)\u003C\/code\u003E \u2013 tries to get a value from object, using:\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003E$object[\u0027key\u0027]\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;key()\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;getKey()\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;key\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;get(\u0027key\u0027)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003Eor fallbacks to \u003Ccode\u003E$default\u003C\/code\u003E.\u003C\/li\u003E\n\u003C\/ul\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EBagHelper::magicSetter($object, $attr, $value)\u003C\/code\u003E \u2013 tries to set a value to object, using:\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003E$object[\u0027key\u0027] = $value\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;setKey($value)\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;key = $value\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;set($key, $value)\u003C\/code\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch3\u003ENested\u003C\/h3\u003E\n\u003Cp\u003EThis class provides two static methods for a nested access to arrays and objects:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003ENested::get($object, array $keys, $default = null)\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003ENested::set(array \u0026amp;$array, array $keys, $value)\u003C\/code\u003E (only arrays are supported).\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EFor example:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003ENested::get($container, [\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027github\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027webhooks\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E]);\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Ecould return a value of:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$container-\u0026gt;get(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027github\u0027\u003C\/span\u003E)-\u0026gt;getWebhooks()[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E];\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Eunless any of the chain elements doesn\u2019t exist \u2013 then \u003Ccode\u003E$default\u003C\/code\u003E is returned.\u003C\/p\u003E\n\u003Cp\u003ESimilarly:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003ENested::set($array, [\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027baz\u0027\u003C\/span\u003E], \u003Cspan class=\u0022hljs-number\u0022\u003E8\u003C\/span\u003E);\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Eis in equivalent to:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$array[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E][\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E][\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027baz\u0027\u003C\/span\u003E] = \u003Cspan class=\u0022hljs-number\u0022\u003E8\u003C\/span\u003E;\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Ebut it creates all the arrays on the way, if they don\u2019t exist yet.\u003C\/p\u003E\n\u003Ch3\u003EQueueBag\u003C\/h3\u003E\n\u003Cp\u003EThis class works like a normal queue, but lets you enqueue and dequeue\na key-value pair and gives you standard \u003Ccode\u003EBag\u003C\/code\u003E features.\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$queue = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E QueueBag();\n$queue-\u0026gt;enqueue(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027key\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027value\u0027\u003C\/span\u003E)\n$queue-\u0026gt;enqueue(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E)\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Elist\u003C\/span\u003E($key, $value) = $queue-\u0026gt;dequeue()\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EStackBag\u003C\/h3\u003E\n\u003Cp\u003EThis class works like a normal stack, but lets you push and pop\na key-value pair and gives you standard \u003Ccode\u003EBag\u003C\/code\u003E features.\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$stack = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E StackBag();\n$stack-\u0026gt;push(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027key\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027value\u0027\u003C\/span\u003E)\n$stack-\u0026gt;push(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027foo\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027bar\u0027\u003C\/span\u003E)\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Elist\u003C\/span\u003E($key, $value) = $stack-\u0026gt;pop()\n\u003C\/code\u003E\u003C\/pre\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["accessor","array","helper","php","queue","stack"],"hasMore":true,"image":"https:\/\/avris.it\/image\/avris-bag_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-bag_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-bag_mini.png\u0022 alt=\u0022Avris Bag\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003EAvris Bag\u003C\/em\u003E is a set of helpers that make working with arrays in PHP way easier.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-bag_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-bag_mini.png\u0022 alt=\u0022Avris Bag\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003EAvris Bag\u003C\/em\u003E is a set of helpers that make working with arrays in PHP way easier.\u003C\/p\u003E\n\u003Ch3\u003EInstalation\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-bash\u0022\u003Ecomposer require avris\/bag\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EBag\u003C\/h3\u003E\n\u003Cp\u003E\u003Cem\u003EBag\u003C\/em\u003E class represents a key-value store. It can be used both as an array and as an object, leading to a shorter and nicer code:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$array = [\n \u0027foo\u0027 =\u0026gt; \u0027bar\u0027,\n \u0027lorem\u0027 =\u0026gt; [\n \u0027ipsum\u0027 =\u0026gt; [\u0027dolor\u0027, \u0027sit\u0027, \u0027amet\u0027]\n ],\n];\n\n$bag = new Bag($array);\n\n\/\/ all return \u0027bar\u0027\nvar_dump(isset($array[\u0027foo\u0027]) ? $array[\u0027foo\u0027] : null);\nvar_dump($bag-\u0026gt;get(\u0027foo\u0027));\nvar_dump($bag[\u0027foo\u0027]);\nvar_dump($bag(\u0027foo\u0027));\n\n\/\/ all return null\nvar_dump(isset($array[\u0027nonexistent\u0027]) ? $array[\u0027nonexistent\u0027] : null);\nvar_dump($bag-\u0026gt;get(\u0027nonexistent\u0027));\nvar_dump($bag[\u0027nonexistent\u0027]);\nvar_dump($bag(\u0027nonexistent\u0027));\n\n\/\/ all return \u0027default\u0027\nvar_dump(isset($array[\u0027nonexistent\u0027]) ? $array[\u0027nonexistent\u0027] : \u0027default\u0027);\nvar_dump($bag-\u0026gt;get(\u0027nonexistent\u0027, \u0027default\u0027));\nvar_dump($bag[\u0027nonexistent\u0027] ?: \u0027default\u0027);\nvar_dump($bag(\u0027nonexistent\u0027, \u0027default\u0027));\n\n\/\/ all are equivalent\n$array[\u0027x\u0027] =\u0026gt; \u0027y\u0027;\n$bag-\u0026gt;set(\u0027x\u0027, \u0027y\u0027);\n$bag[\u0027x\u0027] = \u0027y\u0027;\n\n\/\/ all are equivalent\nvar_dump(count($array));\nvar_dump($bag-\u0026gt;count());\nvar_dump(count($bag));\n\n\/\/ all are equivalent\nvar_dump(count($array) === 0);\nvar_dump($bag-\u0026gt;isEmpty());\nvar_dump(count($bag) === 0);\n\n\/\/ all are equivalent\nvar_dump(array_keys($array));\nvar_dump($bag-\u0026gt;keys());\nvar_dump(array_keys($bag));\n\n\/\/ all are equivalent\nvar_dump(isset($array[\u0027foo\u0027]));\nvar_dump($bag-\u0026gt;has(\u0027foo\u0027));\nvar_dump(isset($bag[\u0027foo\u0027]));\n\n\/\/ all are equivalent\nunset($array[\u0027foo\u0027]);\n$bag-\u0026gt;delete(\u0027foo\u0027);\nunset($bag[\u0027foo\u0027]);\n\n\/\/ all are equivalent\n$array = [];\n$bag-\u0026gt;clear();\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EJust like with a simple array, you can also \u003Cstrong\u003Eiterate\u003C\/strong\u003E over a Bag and \u003Cstrong\u003Ejson_encode\u003C\/strong\u003E it.\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EAdditional features\u003C\/strong\u003E include:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;getDeep($key, $default = null)\u003C\/code\u003E \u2013 gets a value from a nested tree, using dot-separated string as a key, for instance \u003Ccode\u003E$bag-\u0026gt;getDeep(\u0027lorem.ipsum.1\u0027)\u003C\/code\u003E will return \u2018sit\u2019;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;add(array)\u003C\/code\u003E \u2013 merges the other array into the Bag, without overwriting the existing keys;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;replace(array)\u003C\/code\u003E \u2013 merges the other array into the Bag, with overwriting the existing keys;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;appendToElement($key, $value)\u003C\/code\u003E \u2013 treats \u003Ccode\u003E$bag[$key]\u003C\/code\u003E as a list and appends \u003Ccode\u003E$value\u003C\/code\u003E at its end;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;prependToElement($key, $value)\u003C\/code\u003E \u2013 treats \u003Ccode\u003E$bag[$key]\u003C\/code\u003E as a list and prepends \u003Ccode\u003E$value\u003C\/code\u003E at its beginning;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;map(function ($key, $value) {})\u003C\/code\u003E \u2013 returns a new Bag, with values mapped by the callback function;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;filter(function ($key, $value) {})\u003C\/code\u003E \u2013 returns a new Bag, with only those values from the original Bag, for which the callback function returns true.\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$bag-\u0026gt;flatten()\u003C\/code\u003E \u2013 returns a new Bag, with keys flattened, for instance \u003Ccode\u003Elorem.ipsum\u003C\/code\u003E.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch3\u003ESet\u003C\/h3\u003E\n\u003Cp\u003ESet is a similar structure, but it doesn\u2019t care about the keys and it makes sure that all the values are unique. Sometimes it\u2019s helpful to instantiate it with a callback:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$set = new Set([\u0027post\u0027, \u0027get\u0027, \u0027GET\u0027], \u0027strtoupper\u0027);\n\/\/ internal values are: \u0027POST\u0027 and \u0027GET\u0027\n\nvar_dump($set-\u0026gt;has(\u0027post\u0027)); \/\/ true\nvar_dump($set-\u0026gt;has(\u0027POST\u0027)); \/\/ true\nvar_dump($set-\u0026gt;has(\u0027DELETE\u0027)); \/\/ false\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EMethods:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;add($value)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;addMultiple(array $values)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;has($value)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;delete($value)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;first()\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;last()\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$set-\u0026gt;clear()\u003C\/code\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch3\u003EBagHelper\u003C\/h3\u003E\n\u003Cp\u003EThis class provides four static methods:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003EBagHelper::isArray($object)\u003C\/code\u003E \u2013 checks if \u003Ccode\u003E$object\u003C\/code\u003E is an array or array-like (\u003Ccode\u003E\\Traversable\u003C\/code\u003E);\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EBagHelper::toArray($object)\u003C\/code\u003E \u2013 converts \u003Ccode\u003E$object\u003C\/code\u003E to an array;\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EBagHelper::magicGetter($object, $attr, $default = null)\u003C\/code\u003E \u2013 tries to get a value from object, using:\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003E$object[\u0027key\u0027]\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;key()\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;getKey()\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;key\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;get(\u0027key\u0027)\u003C\/code\u003E\u003C\/li\u003E\n\u003Cli\u003Eor fallbacks to \u003Ccode\u003E$default\u003C\/code\u003E.\u003C\/li\u003E\n\u003C\/ul\u003E\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003EBagHelper::magicSetter($object, $attr, $value)\u003C\/code\u003E \u2013 tries to set a value to object, using:\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003E$object[\u0027key\u0027] = $value\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;setKey($value)\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;key = $value\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003E$object-\u0026gt;set($key, $value)\u003C\/code\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Ch3\u003ENested\u003C\/h3\u003E\n\u003Cp\u003EThis class provides two static methods for a nested access to arrays and objects:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003E\u003Ccode\u003ENested::get($object, array $keys, $default = null)\u003C\/code\u003E,\u003C\/li\u003E\n\u003Cli\u003E\u003Ccode\u003ENested::set(array \u0026amp;$array, array $keys, $value)\u003C\/code\u003E (only arrays are supported).\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EFor example:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003ENested::get($container, [\u0027github\u0027, \u0027webhooks\u0027, \u0027foo\u0027]);\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Ecould return a value of:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$container-\u0026gt;get(\u0027github\u0027)-\u0026gt;getWebhooks()[\u0027foo\u0027];\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Eunless any of the chain elements doesn\u2019t exist \u2013 then \u003Ccode\u003E$default\u003C\/code\u003E is returned.\u003C\/p\u003E\n\u003Cp\u003ESimilarly:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003ENested::set($array, [\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027], 8);\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Eis in equivalent to:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$array[\u0027foo\u0027][\u0027bar\u0027][\u0027baz\u0027] = 8;\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003Ebut it creates all the arrays on the way, if they don\u2019t exist yet.\u003C\/p\u003E\n\u003Ch3\u003EQueueBag\u003C\/h3\u003E\n\u003Cp\u003EThis class works like a normal queue, but lets you enqueue and dequeue\na key-value pair and gives you standard \u003Ccode\u003EBag\u003C\/code\u003E features.\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$queue = new QueueBag();\n$queue-\u0026gt;enqueue(\u0027key\u0027, \u0027value\u0027)\n$queue-\u0026gt;enqueue(\u0027foo\u0027, \u0027bar\u0027)\nlist($key, $value) = $queue-\u0026gt;dequeue()\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EStackBag\u003C\/h3\u003E\n\u003Cp\u003EThis class works like a normal stack, but lets you push and pop\na key-value pair and gives you standard \u003Ccode\u003EBag\u003C\/code\u003E features.\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$stack = new StackBag();\n$stack-\u0026gt;push(\u0027key\u0027, \u0027value\u0027)\n$stack-\u0026gt;push(\u0027foo\u0027, \u0027bar\u0027)\nlist($key, $value) = $stack-\u0026gt;pop()\u003C\/code\u003E\u003C\/pre\u003E","words":782,"readTime":4,"lang":"en"}}},"projects\/oursong-let-s-choose-our-song":{"key":"projects\/oursong-let-s-choose-our-song","type":"article","published":true,"meta":{"createdAt":"2017-12-25T00:38:58+01:00","publishedAt":"2017-12-25T00:33:00+01:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/oursong.eurovote.eu\/","displayUrl":null}],"category":"projects","subcategory":null,"slug":"oursong-let-s-choose-our-song"},"content":{"en":{"slug":"oursong-let-s-choose-our-song","title":"OurSong \u2022 Let\u0027s choose our song!","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/oursong_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022603\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAkCAYAAACaJFpUAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHhElEQVRIiZWXW48cRxmGn6rq0\/ScdmfP6+Pasr2RA0bYkIOQIoyAIIE4SMAlEvwJFEWIn8AlcBP+ATdcAOIiikSEsAgRgQSvYsfr9SHrncPOoXu6u7qquBjvsOudxM4ntdSaqvre+qrrfd9vhLXWCSFwziGEIMsyOp0O9XodACHE9InjmE+LdncAJiGqTNZWq1WEEEfmiM+9\/Ir72qLkvlbc1j5KwNW6pVaJkM0ldjsd5poNiixle28fs3yWhw8eIpxFOAcLKzR\/8FPS0hBIyUoccHm+ylolYCnyyYzlUabZywo+Hmu8cT7GaY+2baDCmKzfZt8VMB7iD7psrKxSrYd4YcblhWVu3NlmN8vQKqLIxlSDACUgNxYLxJ7kYr3CfOgRSck+JQ3fQwlBw\/fwAAJPMiwjwjBkZOFG13BqcZ6fvfpV3vnnP3jxi1dZHN+l12mj4gYnHnV4e7tH2wZsNGM25JjyxDIAX2jV2JyLcc4hBcyFinXr2C9KxqXFE0BHS6wz5FoTBxJdgAsjtgcZr37nu\/h5nyRNOHt6nbgIqEtNpARv3R1wai4ifPAR15\/fRAqQwF6mETjW4oCqJ3HAYuiRGYtav\/jcL3vOo7AOz\/MYpynGlKz6OcnuXXof32e9EfKrP73DOdcBAautCmm\/w72B5e6jLiUeV659mZE27I4LPClo+IpQCZQU5MaRWwcCJEIx0gYRVvCaC8zNt1hZWmatEbE7KhHKY5wXbMxXuLk7oH1\/B18ZXl7L8VzJUj2mnyRsJwWPck2oJANt6BeGkbZ0spKxsYyNmeD89W9\/dwhASLyognKWMPApxinOWRpxRDX0ocyh1KA8wihA6JTeWFA6x0ALls5sIIUEIFKCQE6OsnQO6xzGgScEIs\/zIzwE8DzvCHecc9x4+03iWp3nr1w7NjYYDHDOoZQiCAIAtNaEYTjl8kH+Y4DOOdrtNk\/+ppSi0WgwHA5QykMpD3AIKREqxDqBA9p5lw\/2t1iK57i2+NyRHEIIjpbyODzPwxhDGIbUarUjY\/VaHanUkQqzEtLCkI\/2GfU6nCznqO8JWDyee+aR+r5Pt9vlozs7\/OXNt\/jjH37PzZs3wTmstdPFy8vLvPvuu+R5Pl0vpeTJfE+t0DnH3t4ev\/ntr\/ndG29QiWNKXbB26gybV77E1nvvcPvm+9OEWVGSFQYQBIEPCASWWsU\/fnqzALXWpFmGtpafv\/46J09vsPNwl\/fe3+KlF1\/g69\/6NvvdNjsfvg9AFEVYaemUu9xLdpC6hhuu85VLczjnng4ohCDPM775jev0en1Ori0RRiHddgcpBQuxYqV5mgtnTgJQlJZBotk3Bf2xRuoCvzCzUs8GlFLSnF\/Cbt\/hwYNH\/Ptf7yGkIpCOpHOfhXPrZIUhCv9vV2M3IvQU5+ILMK6wWCmeHRCgGtdIx5p00OHezn2KPOP8xec4sbJMFHiEvk8YTjgXedCqSQba4oQFz6JKfew4YaK1MyOOQj5\/5SqdTocz6y1CkTPq7XL54nnmalUkhnocAZAkCSoTrHpLnKotcGopJlqof5YKBYEvObu+yvd\/\/BO2b33A6XOXWGjNc2HjLGElRuuS\/nAITGgkpURKibEGgZidFhBFUTjgCG+sMZRm8tH3e11Gw8GUS845FpdXqVQqU7A0SUjHY6SUlGWJlBKlPFqt+eNKcxjoANgPAg4YVOoq6bCPcxYlJc5BvV7D94Pp\/H7m+O\/OCCEEgR+gPEEUOFqtZzzShw8fIqUEHM5Btdmi0WggpSRJEgaDIb7vT3edaslu6hN4Er+UJHlBHFqubBy\/NDPF+0m3yLIMYyxCTHT2wBEOKsyyDF2WRI\/dAT7ZLY5VKITgez\/8EeMiZzQa4QUBUgjATUABISWlLqlEIS+\/8AK\/eO01wiCAyTQ83ycMQ8qyfDalUdUYYw1xax4hPeYadcZZhrOTy5SmKVJ6yEqEEZK836YQAVGlMrlEaYq1dlrh4ZjJQ2MMxjr8IGSh2cCOUurCY96PcElOs9HECxTD0QgpBYVXJUkHaK2x1iKEQGs9K\/VsQKdLsAadZ4TOsra2zK0Pt7h1+yMCqVDGYq3FliXOWCQOKXw8pTDGYK09dg8+FXDU79PfazPs9tBIbm9tMRgM2dy8RFCrIQWMOl3S\/pBxmuKUoTQlWV5gjCHP8plg8Anf8PK1E7QurfKfP4\/xy5R6o05Z5OztPiAZpYTVECUdnrRIQIwSlFTAxKAd7jGtnhFwtXmJUIdsbvYQOmM4GHH9+ivUmzWMLpFKUVoo8oILF86jqnOYXveIwx9+PxwzWwxrLWVZPvbFnCRJprIWRRFxHE\/nBkFAng4YJjlBGBJFEVLKiWIdEocpD5\/cwUGSA3InowH37mxN+ees5cq1lwjDiVM453BSojyF7wcT9zcGO8OaZlb4pLYexM72LaKowtLK+rGxYbJPr9MnDCPmmk2MdVQq0bFW81ObqCcFfWl5DSnVkbEDFREiphpn1BvzKKVQj7s7daid\/EwVHh6bABzdzNPiSOdtjHnqilxbjJ3833OAc+B7EmsdQkyaqEqgUPKTjfcg\/geiigyZapzK0gAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/oursong_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022603\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA musical competition, in which the managers lead their countries every week to a fight for a title of the best song.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/oursong_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022800\u0022 height=\u00221005\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAkCAYAAACaJFpUAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHhElEQVRIiZWXW48cRxmGn6rq0\/ScdmfP6+Pasr2RA0bYkIOQIoyAIIE4SMAlEvwJFEWIn8AlcBP+ATdcAOIiikSEsAgRgQSvYsfr9SHrncPOoXu6u7qquBjvsOudxM4ntdSaqvre+qrrfd9vhLXWCSFwziGEIMsyOp0O9XodACHE9InjmE+LdncAJiGqTNZWq1WEEEfmiM+9\/Ir72qLkvlbc1j5KwNW6pVaJkM0ldjsd5poNiixle28fs3yWhw8eIpxFOAcLKzR\/8FPS0hBIyUoccHm+ylolYCnyyYzlUabZywo+Hmu8cT7GaY+2baDCmKzfZt8VMB7iD7psrKxSrYd4YcblhWVu3NlmN8vQKqLIxlSDACUgNxYLxJ7kYr3CfOgRSck+JQ3fQwlBw\/fwAAJPMiwjwjBkZOFG13BqcZ6fvfpV3vnnP3jxi1dZHN+l12mj4gYnHnV4e7tH2wZsNGM25JjyxDIAX2jV2JyLcc4hBcyFinXr2C9KxqXFE0BHS6wz5FoTBxJdgAsjtgcZr37nu\/h5nyRNOHt6nbgIqEtNpARv3R1wai4ifPAR15\/fRAqQwF6mETjW4oCqJ3HAYuiRGYtav\/jcL3vOo7AOz\/MYpynGlKz6OcnuXXof32e9EfKrP73DOdcBAautCmm\/w72B5e6jLiUeV659mZE27I4LPClo+IpQCZQU5MaRWwcCJEIx0gYRVvCaC8zNt1hZWmatEbE7KhHKY5wXbMxXuLk7oH1\/B18ZXl7L8VzJUj2mnyRsJwWPck2oJANt6BeGkbZ0spKxsYyNmeD89W9\/dwhASLyognKWMPApxinOWRpxRDX0ocyh1KA8wihA6JTeWFA6x0ALls5sIIUEIFKCQE6OsnQO6xzGgScEIs\/zIzwE8DzvCHecc9x4+03iWp3nr1w7NjYYDHDOoZQiCAIAtNaEYTjl8kH+Y4DOOdrtNk\/+ppSi0WgwHA5QykMpD3AIKREqxDqBA9p5lw\/2t1iK57i2+NyRHEIIjpbyODzPwxhDGIbUarUjY\/VaHanUkQqzEtLCkI\/2GfU6nCznqO8JWDyee+aR+r5Pt9vlozs7\/OXNt\/jjH37PzZs3wTmstdPFy8vLvPvuu+R5Pl0vpeTJfE+t0DnH3t4ev\/ntr\/ndG29QiWNKXbB26gybV77E1nvvcPvm+9OEWVGSFQYQBIEPCASWWsU\/fnqzALXWpFmGtpafv\/46J09vsPNwl\/fe3+KlF1\/g69\/6NvvdNjsfvg9AFEVYaemUu9xLdpC6hhuu85VLczjnng4ohCDPM775jev0en1Ori0RRiHddgcpBQuxYqV5mgtnTgJQlJZBotk3Bf2xRuoCvzCzUs8GlFLSnF\/Cbt\/hwYNH\/Ptf7yGkIpCOpHOfhXPrZIUhCv9vV2M3IvQU5+ILMK6wWCmeHRCgGtdIx5p00OHezn2KPOP8xec4sbJMFHiEvk8YTjgXedCqSQba4oQFz6JKfew4YaK1MyOOQj5\/5SqdTocz6y1CkTPq7XL54nnmalUkhnocAZAkCSoTrHpLnKotcGopJlqof5YKBYEvObu+yvd\/\/BO2b33A6XOXWGjNc2HjLGElRuuS\/nAITGgkpURKibEGgZidFhBFUTjgCG+sMZRm8tH3e11Gw8GUS845FpdXqVQqU7A0SUjHY6SUlGWJlBKlPFqt+eNKcxjoANgPAg4YVOoq6bCPcxYlJc5BvV7D94Pp\/H7m+O\/OCCEEgR+gPEEUOFqtZzzShw8fIqUEHM5Btdmi0WggpSRJEgaDIb7vT3edaslu6hN4Er+UJHlBHFqubBy\/NDPF+0m3yLIMYyxCTHT2wBEOKsyyDF2WRI\/dAT7ZLY5VKITgez\/8EeMiZzQa4QUBUgjATUABISWlLqlEIS+\/8AK\/eO01wiCAyTQ83ycMQ8qyfDalUdUYYw1xax4hPeYadcZZhrOTy5SmKVJ6yEqEEZK836YQAVGlMrlEaYq1dlrh4ZjJQ2MMxjr8IGSh2cCOUurCY96PcElOs9HECxTD0QgpBYVXJUkHaK2x1iKEQGs9K\/VsQKdLsAadZ4TOsra2zK0Pt7h1+yMCqVDGYq3FliXOWCQOKXw8pTDGYK09dg8+FXDU79PfazPs9tBIbm9tMRgM2dy8RFCrIQWMOl3S\/pBxmuKUoTQlWV5gjCHP8plg8Anf8PK1E7QurfKfP4\/xy5R6o05Z5OztPiAZpYTVECUdnrRIQIwSlFTAxKAd7jGtnhFwtXmJUIdsbvYQOmM4GHH9+ivUmzWMLpFKUVoo8oILF86jqnOYXveIwx9+PxwzWwxrLWVZPvbFnCRJprIWRRFxHE\/nBkFAng4YJjlBGBJFEVLKiWIdEocpD5\/cwUGSA3InowH37mxN+ees5cq1lwjDiVM453BSojyF7wcT9zcGO8OaZlb4pLYexM72LaKowtLK+rGxYbJPr9MnDCPmmk2MdVQq0bFW81ObqCcFfWl5DSnVkbEDFREiphpn1BvzKKVQj7s7daid\/EwVHh6bABzdzNPiSOdtjHnqilxbjJ3833OAc+B7EmsdQkyaqEqgUPKTjfcg\/geiigyZapzK0gAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/oursong_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022800\u0022 height=\u00221005\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA musical competition, in which the managers lead their countries every week to a fight for a title of the best song.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["competition","esc","eurovision","facebook","javascript","micrus","music","php","song","voting","websockets"],"hasMore":false,"image":"https:\/\/avris.it\/image\/oursong_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/oursong_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/oursong_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022301.5\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA musical competition, in which the managers lead their countries every week to a fight for a title of the best song.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/oursong_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/oursong_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022301.5\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA musical competition, in which the managers lead their countries every week to a fight for a title of the best song.\u003C\/p\u003E","words":22,"readTime":null,"lang":"en"},"pl":{"slug":"oursong-wybierzmy-nasz\u0105-piosenk\u0119","title":"OurSong \u2022 Wybierzmy nasz\u0105 piosenk\u0119!","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/oursong_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022603\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAkCAYAAACaJFpUAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHhElEQVRIiZWXW48cRxmGn6rq0\/ScdmfP6+Pasr2RA0bYkIOQIoyAIIE4SMAlEvwJFEWIn8AlcBP+ATdcAOIiikSEsAgRgQSvYsfr9SHrncPOoXu6u7qquBjvsOudxM4ntdSaqvre+qrrfd9vhLXWCSFwziGEIMsyOp0O9XodACHE9InjmE+LdncAJiGqTNZWq1WEEEfmiM+9\/Ir72qLkvlbc1j5KwNW6pVaJkM0ldjsd5poNiixle28fs3yWhw8eIpxFOAcLKzR\/8FPS0hBIyUoccHm+ylolYCnyyYzlUabZywo+Hmu8cT7GaY+2baDCmKzfZt8VMB7iD7psrKxSrYd4YcblhWVu3NlmN8vQKqLIxlSDACUgNxYLxJ7kYr3CfOgRSck+JQ3fQwlBw\/fwAAJPMiwjwjBkZOFG13BqcZ6fvfpV3vnnP3jxi1dZHN+l12mj4gYnHnV4e7tH2wZsNGM25JjyxDIAX2jV2JyLcc4hBcyFinXr2C9KxqXFE0BHS6wz5FoTBxJdgAsjtgcZr37nu\/h5nyRNOHt6nbgIqEtNpARv3R1wai4ifPAR15\/fRAqQwF6mETjW4oCqJ3HAYuiRGYtav\/jcL3vOo7AOz\/MYpynGlKz6OcnuXXof32e9EfKrP73DOdcBAautCmm\/w72B5e6jLiUeV659mZE27I4LPClo+IpQCZQU5MaRWwcCJEIx0gYRVvCaC8zNt1hZWmatEbE7KhHKY5wXbMxXuLk7oH1\/B18ZXl7L8VzJUj2mnyRsJwWPck2oJANt6BeGkbZ0spKxsYyNmeD89W9\/dwhASLyognKWMPApxinOWRpxRDX0ocyh1KA8wihA6JTeWFA6x0ALls5sIIUEIFKCQE6OsnQO6xzGgScEIs\/zIzwE8DzvCHecc9x4+03iWp3nr1w7NjYYDHDOoZQiCAIAtNaEYTjl8kH+Y4DOOdrtNk\/+ppSi0WgwHA5QykMpD3AIKREqxDqBA9p5lw\/2t1iK57i2+NyRHEIIjpbyODzPwxhDGIbUarUjY\/VaHanUkQqzEtLCkI\/2GfU6nCznqO8JWDyee+aR+r5Pt9vlozs7\/OXNt\/jjH37PzZs3wTmstdPFy8vLvPvuu+R5Pl0vpeTJfE+t0DnH3t4ev\/ntr\/ndG29QiWNKXbB26gybV77E1nvvcPvm+9OEWVGSFQYQBIEPCASWWsU\/fnqzALXWpFmGtpafv\/46J09vsPNwl\/fe3+KlF1\/g69\/6NvvdNjsfvg9AFEVYaemUu9xLdpC6hhuu85VLczjnng4ohCDPM775jev0en1Ori0RRiHddgcpBQuxYqV5mgtnTgJQlJZBotk3Bf2xRuoCvzCzUs8GlFLSnF\/Cbt\/hwYNH\/Ptf7yGkIpCOpHOfhXPrZIUhCv9vV2M3IvQU5+ILMK6wWCmeHRCgGtdIx5p00OHezn2KPOP8xec4sbJMFHiEvk8YTjgXedCqSQba4oQFz6JKfew4YaK1MyOOQj5\/5SqdTocz6y1CkTPq7XL54nnmalUkhnocAZAkCSoTrHpLnKotcGopJlqof5YKBYEvObu+yvd\/\/BO2b33A6XOXWGjNc2HjLGElRuuS\/nAITGgkpURKibEGgZidFhBFUTjgCG+sMZRm8tH3e11Gw8GUS845FpdXqVQqU7A0SUjHY6SUlGWJlBKlPFqt+eNKcxjoANgPAg4YVOoq6bCPcxYlJc5BvV7D94Pp\/H7m+O\/OCCEEgR+gPEEUOFqtZzzShw8fIqUEHM5Btdmi0WggpSRJEgaDIb7vT3edaslu6hN4Er+UJHlBHFqubBy\/NDPF+0m3yLIMYyxCTHT2wBEOKsyyDF2WRI\/dAT7ZLY5VKITgez\/8EeMiZzQa4QUBUgjATUABISWlLqlEIS+\/8AK\/eO01wiCAyTQ83ycMQ8qyfDalUdUYYw1xax4hPeYadcZZhrOTy5SmKVJ6yEqEEZK836YQAVGlMrlEaYq1dlrh4ZjJQ2MMxjr8IGSh2cCOUurCY96PcElOs9HECxTD0QgpBYVXJUkHaK2x1iKEQGs9K\/VsQKdLsAadZ4TOsra2zK0Pt7h1+yMCqVDGYq3FliXOWCQOKXw8pTDGYK09dg8+FXDU79PfazPs9tBIbm9tMRgM2dy8RFCrIQWMOl3S\/pBxmuKUoTQlWV5gjCHP8plg8Anf8PK1E7QurfKfP4\/xy5R6o05Z5OztPiAZpYTVECUdnrRIQIwSlFTAxKAd7jGtnhFwtXmJUIdsbvYQOmM4GHH9+ivUmzWMLpFKUVoo8oILF86jqnOYXveIwx9+PxwzWwxrLWVZPvbFnCRJprIWRRFxHE\/nBkFAng4YJjlBGBJFEVLKiWIdEocpD5\/cwUGSA3InowH37mxN+ees5cq1lwjDiVM453BSojyF7wcT9zcGO8OaZlb4pLYexM72LaKowtLK+rGxYbJPr9MnDCPmmk2MdVQq0bFW81ObqCcFfWl5DSnVkbEDFREiphpn1BvzKKVQj7s7daid\/EwVHh6bABzdzNPiSOdtjHnqilxbjJ3833OAc+B7EmsdQkyaqEqgUPKTjfcg\/geiigyZapzK0gAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/oursong_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022603\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EKonkurs muzyczny, w kt\u00f3rym menad\u017cerowie prowadz\u0105cy wybrane przez siebie kraje z ca\u0142ego \u015bwiata co tydzie\u0144 rywalizuj\u0105 o miano najlepszego utworu.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/oursong_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022800\u0022 height=\u00221005\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAkCAYAAACaJFpUAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHhElEQVRIiZWXW48cRxmGn6rq0\/ScdmfP6+Pasr2RA0bYkIOQIoyAIIE4SMAlEvwJFEWIn8AlcBP+ATdcAOIiikSEsAgRgQSvYsfr9SHrncPOoXu6u7qquBjvsOudxM4ntdSaqvre+qrrfd9vhLXWCSFwziGEIMsyOp0O9XodACHE9InjmE+LdncAJiGqTNZWq1WEEEfmiM+9\/Ir72qLkvlbc1j5KwNW6pVaJkM0ldjsd5poNiixle28fs3yWhw8eIpxFOAcLKzR\/8FPS0hBIyUoccHm+ylolYCnyyYzlUabZywo+Hmu8cT7GaY+2baDCmKzfZt8VMB7iD7psrKxSrYd4YcblhWVu3NlmN8vQKqLIxlSDACUgNxYLxJ7kYr3CfOgRSck+JQ3fQwlBw\/fwAAJPMiwjwjBkZOFG13BqcZ6fvfpV3vnnP3jxi1dZHN+l12mj4gYnHnV4e7tH2wZsNGM25JjyxDIAX2jV2JyLcc4hBcyFinXr2C9KxqXFE0BHS6wz5FoTBxJdgAsjtgcZr37nu\/h5nyRNOHt6nbgIqEtNpARv3R1wai4ifPAR15\/fRAqQwF6mETjW4oCqJ3HAYuiRGYtav\/jcL3vOo7AOz\/MYpynGlKz6OcnuXXof32e9EfKrP73DOdcBAautCmm\/w72B5e6jLiUeV659mZE27I4LPClo+IpQCZQU5MaRWwcCJEIx0gYRVvCaC8zNt1hZWmatEbE7KhHKY5wXbMxXuLk7oH1\/B18ZXl7L8VzJUj2mnyRsJwWPck2oJANt6BeGkbZ0spKxsYyNmeD89W9\/dwhASLyognKWMPApxinOWRpxRDX0ocyh1KA8wihA6JTeWFA6x0ALls5sIIUEIFKCQE6OsnQO6xzGgScEIs\/zIzwE8DzvCHecc9x4+03iWp3nr1w7NjYYDHDOoZQiCAIAtNaEYTjl8kH+Y4DOOdrtNk\/+ppSi0WgwHA5QykMpD3AIKREqxDqBA9p5lw\/2t1iK57i2+NyRHEIIjpbyODzPwxhDGIbUarUjY\/VaHanUkQqzEtLCkI\/2GfU6nCznqO8JWDyee+aR+r5Pt9vlozs7\/OXNt\/jjH37PzZs3wTmstdPFy8vLvPvuu+R5Pl0vpeTJfE+t0DnH3t4ev\/ntr\/ndG29QiWNKXbB26gybV77E1nvvcPvm+9OEWVGSFQYQBIEPCASWWsU\/fnqzALXWpFmGtpafv\/46J09vsPNwl\/fe3+KlF1\/g69\/6NvvdNjsfvg9AFEVYaemUu9xLdpC6hhuu85VLczjnng4ohCDPM775jev0en1Ori0RRiHddgcpBQuxYqV5mgtnTgJQlJZBotk3Bf2xRuoCvzCzUs8GlFLSnF\/Cbt\/hwYNH\/Ptf7yGkIpCOpHOfhXPrZIUhCv9vV2M3IvQU5+ILMK6wWCmeHRCgGtdIx5p00OHezn2KPOP8xec4sbJMFHiEvk8YTjgXedCqSQba4oQFz6JKfew4YaK1MyOOQj5\/5SqdTocz6y1CkTPq7XL54nnmalUkhnocAZAkCSoTrHpLnKotcGopJlqof5YKBYEvObu+yvd\/\/BO2b33A6XOXWGjNc2HjLGElRuuS\/nAITGgkpURKibEGgZidFhBFUTjgCG+sMZRm8tH3e11Gw8GUS845FpdXqVQqU7A0SUjHY6SUlGWJlBKlPFqt+eNKcxjoANgPAg4YVOoq6bCPcxYlJc5BvV7D94Pp\/H7m+O\/OCCEEgR+gPEEUOFqtZzzShw8fIqUEHM5Btdmi0WggpSRJEgaDIb7vT3edaslu6hN4Er+UJHlBHFqubBy\/NDPF+0m3yLIMYyxCTHT2wBEOKsyyDF2WRI\/dAT7ZLY5VKITgez\/8EeMiZzQa4QUBUgjATUABISWlLqlEIS+\/8AK\/eO01wiCAyTQ83ycMQ8qyfDalUdUYYw1xax4hPeYadcZZhrOTy5SmKVJ6yEqEEZK836YQAVGlMrlEaYq1dlrh4ZjJQ2MMxjr8IGSh2cCOUurCY96PcElOs9HECxTD0QgpBYVXJUkHaK2x1iKEQGs9K\/VsQKdLsAadZ4TOsra2zK0Pt7h1+yMCqVDGYq3FliXOWCQOKXw8pTDGYK09dg8+FXDU79PfazPs9tBIbm9tMRgM2dy8RFCrIQWMOl3S\/pBxmuKUoTQlWV5gjCHP8plg8Anf8PK1E7QurfKfP4\/xy5R6o05Z5OztPiAZpYTVECUdnrRIQIwSlFTAxKAd7jGtnhFwtXmJUIdsbvYQOmM4GHH9+ivUmzWMLpFKUVoo8oILF86jqnOYXveIwx9+PxwzWwxrLWVZPvbFnCRJprIWRRFxHE\/nBkFAng4YJjlBGBJFEVLKiWIdEocpD5\/cwUGSA3InowH37mxN+ees5cq1lwjDiVM453BSojyF7wcT9zcGO8OaZlb4pLYexM72LaKowtLK+rGxYbJPr9MnDCPmmk2MdVQq0bFW81ObqCcFfWl5DSnVkbEDFREiphpn1BvzKKVQj7s7daid\/EwVHh6bABzdzNPiSOdtjHnqilxbjJ3833OAc+B7EmsdQkyaqEqgUPKTjfcg\/geiigyZapzK0gAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/oursong_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022800\u0022 height=\u00221005\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EKonkurs muzyczny, w kt\u00f3rym menad\u017cerowie prowadz\u0105cy wybrane przez siebie kraje z ca\u0142ego \u015bwiata co tydzie\u0144 rywalizuj\u0105 o miano najlepszego utworu.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["eurowizja","facebook","g\u0142osowanie","javascript","konkurs","muzyka","php","piosenka","programowanie","websockets"],"hasMore":false,"image":"https:\/\/avris.it\/image\/oursong_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/oursong_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/oursong_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022301.5\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EKonkurs muzyczny, w kt\u00f3rym menad\u017cerowie prowadz\u0105cy wybrane przez siebie kraje z ca\u0142ego \u015bwiata co tydzie\u0144 rywalizuj\u0105 o miano najlepszego utworu.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/oursong_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/oursong_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022301.5\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EKonkurs muzyczny, w kt\u00f3rym menad\u017cerowie prowadz\u0105cy wybrane przez siebie kraje z ca\u0142ego \u015bwiata co tydzie\u0144 rywalizuj\u0105 o miano najlepszego utworu.\u003C\/p\u003E","words":24,"readTime":null,"lang":"pl"}}},"projects\/avris-functionmock":{"key":"projects\/avris-functionmock","type":"article","published":true,"meta":{"createdAt":"2017-12-21T10:18:21+01:00","publishedAt":"2017-12-21T10:16:00+01:00","group":"mocks","links":[{"icon":"brands gitlab","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/FunctionMock","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-functionmock"},"content":{"en":{"slug":"avris-functionmock","title":"Avris FunctionMock","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-function-mock_small.png\u0022 alt=\u0022Avris FunctionMock\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHpklEQVRIiX2X269dVRXGf+My59p7n7PPpZfTlkJLAVFStZFIJCFKIQEhBhM0atAE9UEfMD74J\/jumw9G47M+GV8QE41GIIFEwXgBRCLYAgVKS9tz2\/vsvdacw4e1W4waZ9ZcayVrXr75fXPM8S05duPJiFIRgqgVomLu1FIIAhXB1TBVkjvz+YxaK0RABAKICEJfRAQRAYKrJSIWtV57EhURUBHMHROhaYZ4hBARlFqQAAFKKQj9wKraAxWFWkmqdIsJEFm041p7EQBBVd6fXK6+C1ELokbE+\/0MIamhteBXOwhKUIkADUG0n4wQVB0QulIxBEUIUUx1wUa\/EKT\/trgWN8PdmM9bRCCiX6CIoou+poqbkVTxEIVaFgT3jBCBhKBquCkmgonipkhUaq3UWvoB3PvV14qqXZNKRYhaCYLVtTWuXLoMVAhBHKIWVAUCzJRkRvKrgARQgbpgS0BEFzIYimJmZEuMmgaiYzKd0rjTJCd7otZKKR1dKSD0+6VWAI4c2mC2vQPUnrQIVPMClGLaS5xNcdFERIuEgVT02iYV1Kyn1hIqioqh4iw1S6wPV7m8s4mGEiVoPKGeIQohQte1PUMCx48d450zryMSSICpIASQEImFZEoyxTVlumARMXY1VkC1Z0cNUyO7ky2hGCKJJidOHFxmd7LDrG05dHiD+XTCztY2JkJ2pUblrvvv5tWXXmYlNwTRRxag2ouiCiKQTMlueGhC0kIuhBpgoqgaKoqb42pkz7gIyZwkiaQN+\/at8rmvfYF962v87me\/5I2zb2DNMsn7aBqvLnPXvXfz4pPPsDYYAoWI6MGooAJmgmnPmrvg5AbpnFpjoS+AImqoOSKGm6OacLNFTZx+8JM88q0v8cpzf+Px7\/+UROHWI9cRtbK9u4Nn4yvf\/Q7P\/fwJrl9ZYV5aanRElF46XURX6vdQToopuAyWqG1Bau3PoQDEEHHUEskcVSOZM0iZkTtff+zzfPrh0+xc3uaJHz5O1iHrowE333Idu5sX2Zzsce+3v0xSoZ59kw8d2WBnOmGvm1NqR6ktaCW5YSa4K8mFlAyX0Qoy76BUAvo9giKSUDHEE1mdQUqMUuKRR+\/j0w+fBuAvT79AomG8PGZ51LB9acrxj3+U+x+6Cx80PPu9H7NxYBWNls2toOsSJXpAIRXVIGXHXUhJ8Sy4DMeQOyggoRCKoCAOmjB1kjk5JU6dOsFnv3jPtZSwdX6H\/YcOcvT4BsdP3sANt9\/E0oEVIoI3fvUUS8NMqcsMmo7cVJBKjZaumxO1RQ1UA3MjN44nwRmvQleIkB5M9NFlOK4JxZHFAfjoNx+8djIDPPCN+\/jPEhGce+p55hcucvDG\/cw2M+3uFVa0RawiFtTaUrsZQoeaYK6knPGmwXU8JhX6PIPioSSMLE4OI6uRUW4\/dYyjR\/f9F4B\/L7UUXv31H9h+5VUGS8pgdcTB266n21xi621BZY7QgmSiJERqH2HJsZyxZoiP18aUAiwYMgQPZyDGAGWA0VThzk\/c8n\/B7FzY5KVfPMP8vQsMG0ChnU6YvNfiMme02lDb0p89BioJWcil7lgeoM0QP7xvSNcFtUANRUNRjBRCwhiE0hTh1psO\/E8g060Jf3\/6Bc798WWytAwHtU8dFaKFOjNolDxUIikmsZApoaZYymhukNRAHuIf3miY7LXMZ4V5VymlUmpFQpCoWBFMhAPro2sgdnemnH3lHGf+\/BrnXvwnTbSMvBCp4FSyVkIDLGDe50pJQfLATTATNCUkDyAZ5Ay5AR\/gD62\/xe5eZWenZWu3stMF2zOYzGGvhXknlA5+9IOfMN2dcuXiFruXtsilkCgkKgOtDK1jKQUrg8p8VGEcpBAG1tsMKS3qgWXDatC2hjGmnRk6SGxeHtEyQE6fPBArg8TeXm+V3DIhTsUJSRScqpmNw9dx\/uJFutI7AVejaRrWxsvMJlOyCY3C+nJmnIPVNOfIeuHEiXWo27z+9hV2plNKblm77ihP\/ub3nHl7xsqgsrExZtYGz760iz93rqIpEFUsGd4kRA3PDZ4ylhpUjdP3fIr5Sy9zcH0N1IlQjmwc4sKFyxxcX8VDmE+mnPzgCRoRdi+8yygHZd8Yn13iUPc611vH2lLHradG3HPTMS68vcV4CC4dB++8j8lff4vc8dXHolleoaswWBrjqUHVEXOSJ0QMAa7fv8YwJdZGDRcvbTNKjtTKbDrjwHjEZHePaDuWkhN7Mw6vLjFSWM7KQAvtlQtkq6yOKredXKNZgteef43xUGi8Y3joEHllFS8YO5MpWGK+vY3ILqC9F4regKsol997FykVSkVqpe7tQS1kM6QEEoHVQqL3xqOUGSdn7M5qkxglwbUwyrCz13LHR1Z487JSL3WsDGF85S0+8MDH8Mtn\/8G8bVHP1FLxZgjv\/0MggKeEqiIRRA00egBaK9J11wx+bWe4GFfOv84gD3ARVpdX2L+yhkdlMtlifWXMn1523jk75PzmHmfe22OYg0bnfKZ7Ezlw821RS6Gbz6ntjLQ0RkIo8z00NX06qB2eBwC95wa0BoogcdVD915cIxAqJoKr4AJKJZuhGnRdi1DYGDurA+PStLe5jcOdx+FfEghCLeMqGgkAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-function-mock_small.png\u0022 alt=\u0022Avris FunctionMock\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EFunctionMock is a simple and elegant way to mock away system\/global functions in your tests.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-function-mock_big.png\u0022 alt=\u0022Avris FunctionMock\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHpklEQVRIiX2X269dVRXGf+My59p7n7PPpZfTlkJLAVFStZFIJCFKIQEhBhM0atAE9UEfMD74J\/jumw9G47M+GV8QE41GIIFEwXgBRCLYAgVKS9tz2\/vsvdacw4e1W4waZ9ZcayVrXr75fXPM8S05duPJiFIRgqgVomLu1FIIAhXB1TBVkjvz+YxaK0RABAKICEJfRAQRAYKrJSIWtV57EhURUBHMHROhaYZ4hBARlFqQAAFKKQj9wKraAxWFWkmqdIsJEFm041p7EQBBVd6fXK6+C1ELokbE+\/0MIamhteBXOwhKUIkADUG0n4wQVB0QulIxBEUIUUx1wUa\/EKT\/trgWN8PdmM9bRCCiX6CIoou+poqbkVTxEIVaFgT3jBCBhKBquCkmgonipkhUaq3UWvoB3PvV14qqXZNKRYhaCYLVtTWuXLoMVAhBHKIWVAUCzJRkRvKrgARQgbpgS0BEFzIYimJmZEuMmgaiYzKd0rjTJCd7otZKKR1dKSD0+6VWAI4c2mC2vQPUnrQIVPMClGLaS5xNcdFERIuEgVT02iYV1Kyn1hIqioqh4iw1S6wPV7m8s4mGEiVoPKGeIQohQte1PUMCx48d450zryMSSICpIASQEImFZEoyxTVlumARMXY1VkC1Z0cNUyO7ky2hGCKJJidOHFxmd7LDrG05dHiD+XTCztY2JkJ2pUblrvvv5tWXXmYlNwTRRxag2ouiCiKQTMlueGhC0kIuhBpgoqgaKoqb42pkz7gIyZwkiaQN+\/at8rmvfYF962v87me\/5I2zb2DNMsn7aBqvLnPXvXfz4pPPsDYYAoWI6MGooAJmgmnPmrvg5AbpnFpjoS+AImqoOSKGm6OacLNFTZx+8JM88q0v8cpzf+Px7\/+UROHWI9cRtbK9u4Nn4yvf\/Q7P\/fwJrl9ZYV5aanRElF46XURX6vdQToopuAyWqG1Bau3PoQDEEHHUEskcVSOZM0iZkTtff+zzfPrh0+xc3uaJHz5O1iHrowE333Idu5sX2Zzsce+3v0xSoZ59kw8d2WBnOmGvm1NqR6ktaCW5YSa4K8mFlAyX0Qoy76BUAvo9giKSUDHEE1mdQUqMUuKRR+\/j0w+fBuAvT79AomG8PGZ51LB9acrxj3+U+x+6Cx80PPu9H7NxYBWNls2toOsSJXpAIRXVIGXHXUhJ8Sy4DMeQOyggoRCKoCAOmjB1kjk5JU6dOsFnv3jPtZSwdX6H\/YcOcvT4BsdP3sANt9\/E0oEVIoI3fvUUS8NMqcsMmo7cVJBKjZaumxO1RQ1UA3MjN44nwRmvQleIkB5M9NFlOK4JxZHFAfjoNx+8djIDPPCN+\/jPEhGce+p55hcucvDG\/cw2M+3uFVa0RawiFtTaUrsZQoeaYK6knPGmwXU8JhX6PIPioSSMLE4OI6uRUW4\/dYyjR\/f9F4B\/L7UUXv31H9h+5VUGS8pgdcTB266n21xi621BZY7QgmSiJERqH2HJsZyxZoiP18aUAiwYMgQPZyDGAGWA0VThzk\/c8n\/B7FzY5KVfPMP8vQsMG0ChnU6YvNfiMme02lDb0p89BioJWcil7lgeoM0QP7xvSNcFtUANRUNRjBRCwhiE0hTh1psO\/E8g060Jf3\/6Bc798WWytAwHtU8dFaKFOjNolDxUIikmsZApoaZYymhukNRAHuIf3miY7LXMZ4V5VymlUmpFQpCoWBFMhAPro2sgdnemnH3lHGf+\/BrnXvwnTbSMvBCp4FSyVkIDLGDe50pJQfLATTATNCUkDyAZ5Ay5AR\/gD62\/xe5eZWenZWu3stMF2zOYzGGvhXknlA5+9IOfMN2dcuXiFruXtsilkCgkKgOtDK1jKQUrg8p8VGEcpBAG1tsMKS3qgWXDatC2hjGmnRk6SGxeHtEyQE6fPBArg8TeXm+V3DIhTsUJSRScqpmNw9dx\/uJFutI7AVejaRrWxsvMJlOyCY3C+nJmnIPVNOfIeuHEiXWo27z+9hV2plNKblm77ihP\/ub3nHl7xsqgsrExZtYGz760iz93rqIpEFUsGd4kRA3PDZ4ylhpUjdP3fIr5Sy9zcH0N1IlQjmwc4sKFyxxcX8VDmE+mnPzgCRoRdi+8yygHZd8Yn13iUPc611vH2lLHradG3HPTMS68vcV4CC4dB++8j8lff4vc8dXHolleoaswWBrjqUHVEXOSJ0QMAa7fv8YwJdZGDRcvbTNKjtTKbDrjwHjEZHePaDuWkhN7Mw6vLjFSWM7KQAvtlQtkq6yOKredXKNZgteef43xUGi8Y3joEHllFS8YO5MpWGK+vY3ILqC9F4regKsol997FykVSkVqpe7tQS1kM6QEEoHVQqL3xqOUGSdn7M5qkxglwbUwyrCz13LHR1Z487JSL3WsDGF85S0+8MDH8Mtn\/8G8bVHP1FLxZgjv\/0MggKeEqiIRRA00egBaK9J11wx+bWe4GFfOv84gD3ARVpdX2L+yhkdlMtlifWXMn1523jk75PzmHmfe22OYg0bnfKZ7Ezlw821RS6Gbz6ntjLQ0RkIo8z00NX06qB2eBwC95wa0BoogcdVD915cIxAqJoKr4AJKJZuhGnRdi1DYGDurA+PStLe5jcOdx+FfEghCLeMqGgkAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-function-mock_big.png\u0022 alt=\u0022Avris FunctionMock\u0022 class=\u0022border\u0022 width=\u0022900\u0022 height=\u0022600\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EFunctionMock is a simple and elegant way to mock away system\/global functions in your tests.\u003C\/p\u003E\n\u003Ch3\u003EInstalation\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs bash border\u0022\u003Ecomposer require --dev avris\/\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E-mock\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EUsage\u003C\/h3\u003E\n\u003Cp\u003ELet\u2019s say you have a class that writes something to a file:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-meta\u0022\u003E\u0026lt;?php\u003C\/span\u003E\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Enamespace\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EApp\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EService\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-class\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eclass\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EWorkService\u003C\/span\u003E\n\u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003Ework\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E(int $input)\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003Ebool\u003C\/span\u003E\n \u003C\/span\u003E{\n $result = \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027correctResult\u0027\u003C\/span\u003E; \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ ... calculate the result somehow\u003C\/span\u003E\n\n $filename = \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\/tmp\/foo\u0027\u003C\/span\u003E;\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E file_put_contents($filename, $result);\n }\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003ETo test it, without actually using filesystem, you can use FunctionMock:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-meta\u0022\u003E\u0026lt;?php\u003C\/span\u003E\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Enamespace\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EApp\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003ETest\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Euse\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EApp\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EService\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EWorkService\u003C\/span\u003E\n\u003Cspan class=\u0022hljs-title\u0022\u003Euse\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EPHPUnit\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003EFramework\u003C\/span\u003E\\\u003Cspan class=\u0022hljs-title\u0022\u003ETestCase\u003C\/span\u003E;\n\n\u003Cspan class=\u0022hljs-class\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eclass\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EServiceTest\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003Eextends\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003ETestCase\u003C\/span\u003E\n\u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-comment\u0022\u003E\/** \u003Cspan class=\u0022hljs-doctag\u0022\u003E@var\u003C\/span\u003E WorkService *\/\u003C\/span\u003E\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eprivate\u003C\/span\u003E $service;\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eprotected\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EsetUp\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E\n \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;service = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E WorkService();\n }\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Eprotected\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EtearDown\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E\n \u003C\/span\u003E{\n FunctionMock::clean();\n }\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EtestWork\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E\n \u003C\/span\u003E{\n $mock = FunctionMock::create(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027App\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027file_put_contents\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-keyword\u0022\u003Etrue\u003C\/span\u003E);\n\n $returnValue = \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;service-\u0026gt;work(\u003Cspan class=\u0022hljs-number\u0022\u003E8\u003C\/span\u003E);\n\n \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;assertTrue($returnValue);\n \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;assertEquals([[\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\/tmp\/foo\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027correctResult\u0027\u003C\/span\u003E]], $mock-\u0026gt;getInvocations());\n }\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EIf your tests are in the same namespace with your tested classes, it\u2019s recommended to use \u003Ccode\u003E__NAMESPACE__\u003C\/code\u003E. \u003C\/p\u003E\n\u003Cp\u003EThe third parameter, the return value of the mocked function, can either be a literal or a callable:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$mock = FunctionMock::create(\u003Cspan class=\u0022hljs-keyword\u0022\u003E__NAMESPACE__\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027file_put_contents\u0027\u003C\/span\u003E, \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-params\u0022\u003E($filename, $data)\u003C\/span\u003E \u003C\/span\u003E{\n \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E $filename === \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027\/tmp\/foo\u0027\u003C\/span\u003E;\n});\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EYou can disable\/re-enable the mock by invoking \u003Ccode\u003E$mock-\u0026gt;disable()\u003C\/code\u003E and \u003Ccode\u003E$mock-\u0026gt;enable()\u003C\/code\u003E,\nas well as clear the list of logged invocations with \u003Ccode\u003E$mock-\u0026gt;clearInvocations()\u003C\/code\u003E.\u003C\/p\u003E\n\u003Ch3\u003EKnown limitations\u003C\/h3\u003E\n\u003Cp\u003EFunctionMock works thanks to the fact that \u003Ccode\u003Efile_get_contents\u003C\/code\u003E inside of \u003Ccode\u003EApp\\Service\u003C\/code\u003E namespace references to the function\n\u003Ccode\u003EApp\\Service\\file_get_contents\u003C\/code\u003E and only if it\u2019s not defined it falls back to the global \u003Ccode\u003E\\file_get_contents\u003C\/code\u003E.\u003C\/p\u003E\n\u003Cp\u003EFunctionMock defines this \u003Ccode\u003EApp\\Service\\file_get_contents\u003C\/code\u003E function on the fly\nand makes it adjustable to your needs in the runtime.\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EIf you already have invoked \u003Ccode\u003Efile_get_contents\u003C\/code\u003E inside of \u003Ccode\u003EApp\\Service\u003C\/code\u003E before registering a mock,\nPHP will continue using the global function and it cannot be overwritten anymore.\u003C\/li\u003E\n\u003Cli\u003EIf you\u2019re using \u003Ccode\u003E\\file_get_contents\u003C\/code\u003E (explicitly global namespace) inside your tested class,\nthere\u2019s obviously no way to mock it.\u003C\/li\u003E\n\u003Cli\u003EAfter being registered, mock function cannot be really unset, only disabled.\u003C\/li\u003E\n\u003C\/ul\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["function","global function","mock","namespaces","php","tests"],"hasMore":true,"image":"https:\/\/avris.it\/image\/avris-function-mock_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-function-mock_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-function-mock_mini.png\u0022 alt=\u0022Avris FunctionMock\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EFunctionMock is a simple and elegant way to mock away system\/global functions in your tests.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-function-mock_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-function-mock_mini.png\u0022 alt=\u0022Avris FunctionMock\u0022 width=\u0022240\u0022 height=\u0022160\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EFunctionMock is a simple and elegant way to mock away system\/global functions in your tests.\u003C\/p\u003E\n\u003Ch3\u003EInstalation\u003C\/h3\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-bash\u0022\u003Ecomposer require --dev avris\/function-mock\u003C\/code\u003E\u003C\/pre\u003E\n\u003Ch3\u003EUsage\u003C\/h3\u003E\n\u003Cp\u003ELet\u2019s say you have a class that writes something to a file:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E\u0026lt;?php\nnamespace App\\Service;\n\nclass WorkService\n{\n public function work(int $input): bool\n {\n $result = \u0027correctResult\u0027; \/\/ ... calculate the result somehow\n\n $filename = \u0027\/tmp\/foo\u0027;\n\n return file_put_contents($filename, $result);\n }\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003ETo test it, without actually using filesystem, you can use FunctionMock:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E\u0026lt;?php\nnamespace App\\Test;\n\nuse App\\Service\\WorkService\nuse PHPUnit\\Framework\\TestCase;\n\nclass ServiceTest extends TestCase\n{\n \/** @var WorkService *\/\n private $service;\n\n protected function setUp()\n {\n $this-\u0026gt;service = new WorkService();\n }\n\n protected function tearDown()\n {\n FunctionMock::clean();\n }\n\n public function testWork()\n {\n $mock = FunctionMock::create(\u0027App\u0027, \u0027file_put_contents\u0027, true);\n\n $returnValue = $this-\u0026gt;service-\u0026gt;work(8);\n\n $this-\u0026gt;assertTrue($returnValue);\n $this-\u0026gt;assertEquals([[\u0027\/tmp\/foo\u0027, \u0027correctResult\u0027]], $mock-\u0026gt;getInvocations());\n }\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EIf your tests are in the same namespace with your tested classes, it\u2019s recommended to use \u003Ccode\u003E__NAMESPACE__\u003C\/code\u003E. \u003C\/p\u003E\n\u003Cp\u003EThe third parameter, the return value of the mocked function, can either be a literal or a callable:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E$mock = FunctionMock::create(__NAMESPACE__, \u0027file_put_contents\u0027, function ($filename, $data) {\n return $filename === \u0027\/tmp\/foo\u0027;\n});\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EYou can disable\/re-enable the mock by invoking \u003Ccode\u003E$mock-\u0026gt;disable()\u003C\/code\u003E and \u003Ccode\u003E$mock-\u0026gt;enable()\u003C\/code\u003E,\nas well as clear the list of logged invocations with \u003Ccode\u003E$mock-\u0026gt;clearInvocations()\u003C\/code\u003E.\u003C\/p\u003E\n\u003Ch3\u003EKnown limitations\u003C\/h3\u003E\n\u003Cp\u003EFunctionMock works thanks to the fact that \u003Ccode\u003Efile_get_contents\u003C\/code\u003E inside of \u003Ccode\u003EApp\\Service\u003C\/code\u003E namespace references to the function\n\u003Ccode\u003EApp\\Service\\file_get_contents\u003C\/code\u003E and only if it\u2019s not defined it falls back to the global \u003Ccode\u003E\\file_get_contents\u003C\/code\u003E.\u003C\/p\u003E\n\u003Cp\u003EFunctionMock defines this \u003Ccode\u003EApp\\Service\\file_get_contents\u003C\/code\u003E function on the fly\nand makes it adjustable to your needs in the runtime.\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EIf you already have invoked \u003Ccode\u003Efile_get_contents\u003C\/code\u003E inside of \u003Ccode\u003EApp\\Service\u003C\/code\u003E before registering a mock,\nPHP will continue using the global function and it cannot be overwritten anymore.\u003C\/li\u003E\n\u003Cli\u003EIf you\u2019re using \u003Ccode\u003E\\file_get_contents\u003C\/code\u003E (explicitly global namespace) inside your tested class,\nthere\u2019s obviously no way to mock it.\u003C\/li\u003E\n\u003Cli\u003EAfter being registered, mock function cannot be really unset, only disabled.\u003C\/li\u003E\n\u003C\/ul\u003E","words":346,"readTime":2,"lang":"en"}}},"projects\/wtrybiedemokracji":{"key":"projects\/wtrybiedemokracji","type":"article","published":true,"meta":{"createdAt":"2017-07-21T22:45:04+02:00","publishedAt":"2017-07-21T22:42:00+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/wtrybiedemokracji.pl\/","displayUrl":null}],"category":"projects","subcategory":null,"slug":"wtrybiedemokracji"},"content":{"pl":{"slug":"wtrybiedemokracji","title":"#wtrybiedemokracji \u2022 e-protest Polak\u00f3w za granic\u0105","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/wtrybiedemokracji_small.png\u0022 alt=\u0022#wtrybiedemokracji\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022246.55921513665\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAD50lEQVRIia2Wz29bRRDHP7O77z3btZM0TkxRJKpSqeKCyoUDB\/4CDqgSB\/4P\/hXuXOmJE4gDv1TUEwWBkChSIa2oDCVpEhLHsd97uzMcHLt2aktI9HvZ57cz3\/nuzOw8i03APESE3d1dAGJMeO8wYK2zRq+3zdReRFjme3h4CEAIAVXFOcfZ2RnOOTDDh4xudxMze45D7vzx2yLjDEZKCec8CGCgqnjvl5u\/ADgRwoc\/3pnGnwR+pmfx9395t2x\/hY0gGDZbMWiEjCBLGeDaRhfDSKoE57CJD06EcawZx5qjcrQoYDnVSptpbJkoBCAs9MDc49FoSO4DQRzjukZkUrejckxwjqhpsX\/UOOn\/tVRP++UeLoQVahcRRGRByLRfgveoGRWJhKEpkXlPJy84HJ+BTU84qYFq4tI4kvlATBHvPAbUsUbriA\/ZYobsYoUnIiay5ULxBTp5Ay+CE4eakUwxMx4P\/lkkPofLAu7GVQzwz2jI50\/fbOCCJ5YVWtUsa7pZHqdJmp756egUd15bMxhUJXpuJXNUF5MrzmGqiBMkBFDDVMEJcVzis4DFuCBiniO83r3Ci4ILAZzwXBucq9V6IsRUl\/pnziNlWa6YQ\/8PVR1JqueX4RlSXSMCrVZrqd\/K1hcRkilZyHAXSVOaBE2RImSTCTwHVeWj259xv39Mt7uNIfgQ0JT45etPsL37fPzpF8sFTU8wP8ZFBDXl+OSEhijNzmWyLFsMasbw9JTKEq215\/ebRc7gwT327z2ld9pnr\/bsHpywUR\/w0rUbC7Gm8RcyNN2YrkkVvGOocDY4QQTWL7VpFo2JHRCBGsdocAKAN1jvrBGC56r1+fPnuzS04vPfH\/Le9R0ySTyOUC1poanAcPHjOEU9Ljl6sk9VVzORB86xvb3N5uYmKSX6Dx+RZRlFUVCOx7Q7HSwltra2uPvDA\/q7j+i1MtZbHX59OuAgKqd1xeWz0SwjF+OvLFleFKytr+G9J8WI8wHVNGtGJ8LOzg4hBOq6xm1s4L2n2+1iZrx28w3efvcWLY38fTxgq93hFYtkIdDsXVlZMqmqammKHu094fa3XzEqx+RZxnA8ot1sUYSMD269TxVrvrn3HeKElBLee3q9HmbGzWvXEYT+3hPawdHZ6JLnxSyw2eSfxLygWVJWXftxrDkdDoma8M6RZTntvKDZbJJSoqxrvvzpe1QVw4iq5D6QVHnnzbfwzrF\/fISand9SoZkXrLfbmBnxwnCclWy+oebXwgeiD\/i8oCiKmUNZlqSUiCnx6uY2WRbwIdAoCtp5g0ajQYqRaMbx\/gFF0cB7BwYlQ0iJTqezsmT\/ArMbB\/jCEHr8AAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/wtrybiedemokracji_small.png\u0022 alt=\u0022#wtrybiedemokracji\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022246.55921513665\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EDo\u0142\u0105cz do protestu w sieci \u2013 w 140 znakach napisz, dlaczego nie zgadzasz si\u0119 na rozmontowywanie przez PiS kolejnych instytucji pa\u0144stwa prawa.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/wtrybiedemokracji_big.png\u0022 alt=\u0022#wtrybiedemokracji\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022493.1184302733\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAASCAYAAAAzI3woAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAD50lEQVRIia2Wz29bRRDHP7O77z3btZM0TkxRJKpSqeKCyoUDB\/4CDqgSB\/4P\/hXuXOmJE4gDv1TUEwWBkChSIa2oDCVpEhLHsd97uzMcHLt2aktI9HvZ57cz3\/nuzOw8i03APESE3d1dAGJMeO8wYK2zRq+3zdReRFjme3h4CEAIAVXFOcfZ2RnOOTDDh4xudxMze45D7vzx2yLjDEZKCec8CGCgqnjvl5u\/ADgRwoc\/3pnGnwR+pmfx9395t2x\/hY0gGDZbMWiEjCBLGeDaRhfDSKoE57CJD06EcawZx5qjcrQoYDnVSptpbJkoBCAs9MDc49FoSO4DQRzjukZkUrejckxwjqhpsX\/UOOn\/tVRP++UeLoQVahcRRGRByLRfgveoGRWJhKEpkXlPJy84HJ+BTU84qYFq4tI4kvlATBHvPAbUsUbriA\/ZYobsYoUnIiay5ULxBTp5Ay+CE4eakUwxMx4P\/lkkPofLAu7GVQzwz2jI50\/fbOCCJ5YVWtUsa7pZHqdJmp756egUd15bMxhUJXpuJXNUF5MrzmGqiBMkBFDDVMEJcVzis4DFuCBiniO83r3Ci4ILAZzwXBucq9V6IsRUl\/pnziNlWa6YQ\/8PVR1JqueX4RlSXSMCrVZrqd\/K1hcRkilZyHAXSVOaBE2RImSTCTwHVeWj259xv39Mt7uNIfgQ0JT45etPsL37fPzpF8sFTU8wP8ZFBDXl+OSEhijNzmWyLFsMasbw9JTKEq215\/ebRc7gwT327z2ld9pnr\/bsHpywUR\/w0rUbC7Gm8RcyNN2YrkkVvGOocDY4QQTWL7VpFo2JHRCBGsdocAKAN1jvrBGC56r1+fPnuzS04vPfH\/Le9R0ySTyOUC1poanAcPHjOEU9Ljl6sk9VVzORB86xvb3N5uYmKSX6Dx+RZRlFUVCOx7Q7HSwltra2uPvDA\/q7j+i1MtZbHX59OuAgKqd1xeWz0SwjF+OvLFleFKytr+G9J8WI8wHVNGtGJ8LOzg4hBOq6xm1s4L2n2+1iZrx28w3efvcWLY38fTxgq93hFYtkIdDsXVlZMqmqammKHu094fa3XzEqx+RZxnA8ot1sUYSMD269TxVrvrn3HeKElBLee3q9HmbGzWvXEYT+3hPawdHZ6JLnxSyw2eSfxLygWVJWXftxrDkdDoma8M6RZTntvKDZbJJSoqxrvvzpe1QVw4iq5D6QVHnnzbfwzrF\/fISand9SoZkXrLfbmBnxwnCclWy+oebXwgeiD\/i8oCiKmUNZlqSUiCnx6uY2WRbwIdAoCtp5g0ajQYqRaMbx\/gFF0cB7BwYlQ0iJTqezsmT\/ArMbB\/jCEHr8AAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/wtrybiedemokracji_big.png\u0022 alt=\u0022#wtrybiedemokracji\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022493.1184302733\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EDo\u0142\u0105cz do protestu w sieci \u2013 w 140 znakach napisz, dlaczego nie zgadzasz si\u0119 na rozmontowywanie przez PiS kolejnych instytucji pa\u0144stwa prawa.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["demokracja","emigracja","episkopat","polska","protest","s\u0105dy","tr\u00f3jpodzia\u0142 w\u0142adzy","w\u0142adza","zamach stanu"],"hasMore":false,"image":"https:\/\/avris.it\/image\/wtrybiedemokracji_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/wtrybiedemokracji_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/wtrybiedemokracji_mini.png\u0022 alt=\u0022#wtrybiedemokracji\u0022 width=\u0022240\u0022 height=\u0022123.27960756833\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EDo\u0142\u0105cz do protestu w sieci \u2013 w 140 znakach napisz, dlaczego nie zgadzasz si\u0119 na rozmontowywanie przez PiS kolejnych instytucji pa\u0144stwa prawa.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/wtrybiedemokracji_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/wtrybiedemokracji_mini.png\u0022 alt=\u0022#wtrybiedemokracji\u0022 width=\u0022240\u0022 height=\u0022123.27960756833\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EDo\u0142\u0105cz do protestu w sieci \u2013 w 140 znakach napisz, dlaczego nie zgadzasz si\u0119 na rozmontowywanie przez PiS kolejnych instytucji pa\u0144stwa prawa.\u003C\/p\u003E","words":22,"readTime":null,"lang":"pl"}}},"projects\/naked-adventure-de":{"key":"projects\/naked-adventure-de","type":"article","published":true,"meta":{"createdAt":"2017-07-11T21:21:37+02:00","publishedAt":"2017-07-11T21:19:00+02:00","group":"nudism","links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/naked-adventure.eu\/","displayUrl":null},{"icon":"brands twitter-square","colour":"secondary","url":"https:\/\/twitter.com\/NakedAdventurEu","displayUrl":"@NakedAdventurEu"}],"category":"projects","subcategory":null,"slug":"naked-adventure-de"},"content":{"de":{"slug":"naked-adventure-de","title":"Naked Adventure","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/naked-adventure-de_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022473.46596858639\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAjCAYAAAD8BaggAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAIt0lEQVRYhcWYS48l2VHHfxHnkZn3VY\/u6u7pqW6m3bKQZYFH8g4QS74AOyTW7PgK+GPwLVghJD7ALEAyyBoBZjE202PT011dVV11q+7NPOdEsLhV5e5hhjESNiGllI+TEf\/4n3hlyvDnf+fcyOGq42jZ4dZQEao5JxcTh8vEL89G7i0SAqgKr95OHK0yp+uJxwc9F5vK6bpQmvF1oirsDZE\/+E7PP\/z4p7gmhDNO0+\/SbAfhex\/0yF\/81d+4AhFQIKkQgxJDQDQiMZNiIAShS8py0bO3PzBfDoxjI6bdWgBzIwRlfX6Fi+IupBzYjo3JQFWJUUDAHUCoBlN1YhBWMyE+HQpRlKxCUmVIgaRGoJCSk4dM7oQUA12KLJeZhw8X7B0tmca2M5ITtVS8GTEFWp0zjQVNiX7WMU0Nc0AEDYKIUB2uN42rTQURRKBZJao7QQxFSUEJKmiIqICKk6SQVBhyoB8CXRJUGt4q4k5KARGj6xQzwBqhU1LOoJGQA7GLgGDuNINxMq62jalBypEQhBBAXIirobvbqiEJOQpRFYAYhBScYAU1RVuEOnF6MnJxtWb\/cI+pXtPMyClj00irhdD1dP2c2Am1OiEpYzGm4hRzggrzITAjAI4ZTNV2W\/fD33tCwHEzMMfcKcWZqlO2G4I0YhBww61gDVSUn33+OflLJQ0Zd0es0cYtMUYM5Qcff0xMA8UVAxwhJqFTUAFzqNWZmtMcRIWUlNgno+vntGbUauQojGNlc7WFpgR3VIWgDlbBoc89Hx0dsCkjX56\/4d7Dh2xLoR96nj99QuoGFoeHOArNaebkdJNuAtYcd0cVOhEcx12oDWJiIjSQVsm2ZbU8ojuaEeIetTasGhoDtTlWK23cojgxKjlnDg6f0lImzxe4RraqzBYLHMXcQEDVbzJrVxIkOKo7ULjfAHLEG+GPH2x\/dP7zn9D1mYs3L6nTltUiYc1QrwRtJCpJKvMhsDyYI1lpGHkxQ3MmzWZo6gkxoxrYbjfkHEiqKI3wzqHednq93sRmQVtB6ojVifjs+Jir6w3\/\/s\/\/iGmPl3+ifOeY+x8+I6WAOzQJzPbuUVKPqhCj0tXGf7w4Jc9mkBSPPRYHcox89PgBcXvNVIxSG82EUg0kYO6MY2WqjakWVCM3vKFBif953aMy4+gokG\/Sfmzw8sUviEHJQYlRaWevcFFat0c3X7LcW\/G9jz4kDHNktkBSQmYHuE34+hwbC14M1QgS0Cg0b5SpEt1wq9RaKK3w9vyScSyQE3GeFXFD3aA5GDhgAhMwAqIZEqRhyaJP4E7dXlHXTgyGDj2E2c5PBzfw1jCreJlwFAfaVLFmlLFRa2Xe91RxhsM5ISqhy8SrzTW74ii7tqFCkF3vEXZV1W1imipTgVYr09CxyZHZes1ys2Fuu3fIA4iiwwIPHVqNWituhrsR0s5pHRreGmWcsGmibEc2ZSL0A\/HR93+4a5i3h4AIiOwAqexAiQiiChKQkAgp01JinPVo2iOVANdrZNpgTSDPsJCYqlBao1RH5CbtBVpwGEAHZxAQZVf13f2u2\/9\/i5kR3X23Le58+umnvHnzhqdPn7JcLjk6OuIW7+2a3+Q58D5D19fX1FpJKaGqdF33tZ6M04bWKs2F9VRZ5cBkjS5GxIXSRooVHKPTGbjTaES2IHOa76YEa4XF\/JAQ4vsM3crl5SXjOCIiqCrjOO6yYT7HzDg+PgbgzdULztcvEQ9M7YhTaRiPWKQ1hzPj6uoNpCU+\/oJ1uE9KEXMnEGjtmvXmLbN+QUqZYVihGu4wxHep61f3qRtD2xXilVXXsVwu7xi7Ba8MbPyMIErWR7y4XPCof8HFNKOXiDHgviUPH8L4JeIPCYBKwIKznO+jKtQ20byR3sEQgTtDZnC5NaJkaI1kW9brKz744BE55zsvAj0P8vdRhatpj+PVG2ZhTtLM1s+Y5T1U55g1UvcEb6c02aO1QmTD5BEncDldcfSVlIq3wQSQgjBkJaoQGygZs3iX9reSNTB5B7US2xVD7GiufPF25PHqEGtgNqIS2V78GzI7Rn3CXZCwG2GpziodEDS+pzt+NWCHLEgbCUFwV+bz+R07txlZ62uQDCjVN7t7ZtwfCspA8y+oG9iMC\/YPfgdrQoo9134CdYliiAhBM\/iv9P43QFNzTtYNtUbwhpvTlcLC2t2aLgkWF5RyyS8vDpHpFeeXhT6teHYU6XOi8SHBzhhm+5gEmld8GpmFyAYjquA0zK8QefDNDP39v2740d+eA\/CD48zJutHsmhw3fHFWMYc\/\/XjGX\/7hGeaK6jWp23AYheO9A3InmI3Y1PA4Y9ILfvpzePbgJRv\/LvviCBVCRjwjdkHzSiJ\/PaBH9074o9\/\/yd318vBXz57uMp7vPnlKjA8pm1dsq9D1iaELXJZzDtI+tWXe1hMO4px1fcXzDz4ipWf49c+Q9IRtmeiaMtmaWV7QvL2\/Ze\/WIR3+hfTwr3dbEwaWaZ8okfPpDdt2DUBY\/Qnj+Gf8+PN9Zt0F3gIP5h1DTFh9jbDHqutpzen9EbUVWmi0fIBbT1KhuqIIXVyhpDv7ZoaY2f+6l51cGmXzli5PSBjoUyBIwN1xATNn3G4REVprNHcEJcWwmyJEKXWiWOTewYqoO3amafrtNddfp5eN4\/h+c\/3ss884OztjGAbMjNYaIQSur695\/vw59+7d+0aDn3zyCYeHh4gIy+WSx48f3z17N4u+Td5j6OLigs1mc1cIVZVSCgAhBO7fv\/+Nyl+\/fs178XjTasxs93VycPCtYMZxRN+9EeOuapZSMDPMduO3u1NK4fT09BuV5ZxprVFKIYRAa7sxtbXGdrtlvV5\/KyBgF9S\/jVnn140hvWXgVn7T598m+u1L\/m\/lfwJ9N358lbrPTysHs92ny7Y4AoQb6PuDcnJliOy82ZspJ+u2mxSSMNbd34xlr7y8aCw6wXz3cwFg1StXk5FUWA36nl1V5b8ALCIORDYCKO8AAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/naked-adventure-de_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022473.46596858639\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWir erstellen zusammen eine Karte der besten FKK-Zonen!\u003C\/p\u003E\n\u003Cp\u003EHerzlich Willkommen bei Naked Adventure, deine Portalseite f\u00fcr aktuelle von der Gemeinschaft gelenkte Information rund um FKK!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/naked-adventure-de_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022946.93193717277\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAjCAYAAAD8BaggAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAIt0lEQVRYhcWYS48l2VHHfxHnkZn3VY\/u6u7pqW6m3bKQZYFH8g4QS74AOyTW7PgK+GPwLVghJD7ALEAyyBoBZjE202PT011dVV11q+7NPOdEsLhV5e5hhjESNiGllI+TEf\/4n3hlyvDnf+fcyOGq42jZ4dZQEao5JxcTh8vEL89G7i0SAqgKr95OHK0yp+uJxwc9F5vK6bpQmvF1oirsDZE\/+E7PP\/z4p7gmhDNO0+\/SbAfhex\/0yF\/81d+4AhFQIKkQgxJDQDQiMZNiIAShS8py0bO3PzBfDoxjI6bdWgBzIwRlfX6Fi+IupBzYjo3JQFWJUUDAHUCoBlN1YhBWMyE+HQpRlKxCUmVIgaRGoJCSk4dM7oQUA12KLJeZhw8X7B0tmca2M5ITtVS8GTEFWp0zjQVNiX7WMU0Nc0AEDYKIUB2uN42rTQURRKBZJao7QQxFSUEJKmiIqICKk6SQVBhyoB8CXRJUGt4q4k5KARGj6xQzwBqhU1LOoJGQA7GLgGDuNINxMq62jalBypEQhBBAXIirobvbqiEJOQpRFYAYhBScYAU1RVuEOnF6MnJxtWb\/cI+pXtPMyClj00irhdD1dP2c2Am1OiEpYzGm4hRzggrzITAjAI4ZTNV2W\/fD33tCwHEzMMfcKcWZqlO2G4I0YhBww61gDVSUn33+OflLJQ0Zd0es0cYtMUYM5Qcff0xMA8UVAxwhJqFTUAFzqNWZmtMcRIWUlNgno+vntGbUauQojGNlc7WFpgR3VIWgDlbBoc89Hx0dsCkjX56\/4d7Dh2xLoR96nj99QuoGFoeHOArNaebkdJNuAtYcd0cVOhEcx12oDWJiIjSQVsm2ZbU8ojuaEeIetTasGhoDtTlWK23cojgxKjlnDg6f0lImzxe4RraqzBYLHMXcQEDVbzJrVxIkOKo7ULjfAHLEG+GPH2x\/dP7zn9D1mYs3L6nTltUiYc1QrwRtJCpJKvMhsDyYI1lpGHkxQ3MmzWZo6gkxoxrYbjfkHEiqKI3wzqHednq93sRmQVtB6ojVifjs+Jir6w3\/\/s\/\/iGmPl3+ifOeY+x8+I6WAOzQJzPbuUVKPqhCj0tXGf7w4Jc9mkBSPPRYHcox89PgBcXvNVIxSG82EUg0kYO6MY2WqjakWVCM3vKFBif953aMy4+gokG\/Sfmzw8sUviEHJQYlRaWevcFFat0c3X7LcW\/G9jz4kDHNktkBSQmYHuE34+hwbC14M1QgS0Cg0b5SpEt1wq9RaKK3w9vyScSyQE3GeFXFD3aA5GDhgAhMwAqIZEqRhyaJP4E7dXlHXTgyGDj2E2c5PBzfw1jCreJlwFAfaVLFmlLFRa2Xe91RxhsM5ISqhy8SrzTW74ii7tqFCkF3vEXZV1W1imipTgVYr09CxyZHZes1ys2Fuu3fIA4iiwwIPHVqNWituhrsR0s5pHRreGmWcsGmibEc2ZSL0A\/HR93+4a5i3h4AIiOwAqexAiQiiChKQkAgp01JinPVo2iOVANdrZNpgTSDPsJCYqlBao1RH5CbtBVpwGEAHZxAQZVf13f2u2\/9\/i5kR3X23Le58+umnvHnzhqdPn7JcLjk6OuIW7+2a3+Q58D5D19fX1FpJKaGqdF33tZ6M04bWKs2F9VRZ5cBkjS5GxIXSRooVHKPTGbjTaES2IHOa76YEa4XF\/JAQ4vsM3crl5SXjOCIiqCrjOO6yYT7HzDg+PgbgzdULztcvEQ9M7YhTaRiPWKQ1hzPj6uoNpCU+\/oJ1uE9KEXMnEGjtmvXmLbN+QUqZYVihGu4wxHep61f3qRtD2xXilVXXsVwu7xi7Ba8MbPyMIErWR7y4XPCof8HFNKOXiDHgviUPH8L4JeIPCYBKwIKznO+jKtQ20byR3sEQgTtDZnC5NaJkaI1kW9brKz744BE55zsvAj0P8vdRhatpj+PVG2ZhTtLM1s+Y5T1U55g1UvcEb6c02aO1QmTD5BEncDldcfSVlIq3wQSQgjBkJaoQGygZs3iX9reSNTB5B7US2xVD7GiufPF25PHqEGtgNqIS2V78GzI7Rn3CXZCwG2GpziodEDS+pzt+NWCHLEgbCUFwV+bz+R07txlZ62uQDCjVN7t7ZtwfCspA8y+oG9iMC\/YPfgdrQoo9134CdYliiAhBM\/iv9P43QFNzTtYNtUbwhpvTlcLC2t2aLgkWF5RyyS8vDpHpFeeXhT6teHYU6XOi8SHBzhhm+5gEmld8GpmFyAYjquA0zK8QefDNDP39v2740d+eA\/CD48zJutHsmhw3fHFWMYc\/\/XjGX\/7hGeaK6jWp23AYheO9A3InmI3Y1PA4Y9ILfvpzePbgJRv\/LvviCBVCRjwjdkHzSiJ\/PaBH9074o9\/\/yd318vBXz57uMp7vPnlKjA8pm1dsq9D1iaELXJZzDtI+tWXe1hMO4px1fcXzDz4ipWf49c+Q9IRtmeiaMtmaWV7QvL2\/Ze\/WIR3+hfTwr3dbEwaWaZ8okfPpDdt2DUBY\/Qnj+Gf8+PN9Zt0F3gIP5h1DTFh9jbDHqutpzen9EbUVWmi0fIBbT1KhuqIIXVyhpDv7ZoaY2f+6l51cGmXzli5PSBjoUyBIwN1xATNn3G4REVprNHcEJcWwmyJEKXWiWOTewYqoO3amafrtNddfp5eN4\/h+c\/3ss884OztjGAbMjNYaIQSur695\/vw59+7d+0aDn3zyCYeHh4gIy+WSx48f3z17N4u+Td5j6OLigs1mc1cIVZVSCgAhBO7fv\/+Nyl+\/fs178XjTasxs93VycPCtYMZxRN+9EeOuapZSMDPMduO3u1NK4fT09BuV5ZxprVFKIYRAa7sxtbXGdrtlvV5\/KyBgF9S\/jVnn140hvWXgVn7T598m+u1L\/m\/lfwJ9N358lbrPTysHs92ny7Y4AoQb6PuDcnJliOy82ZspJ+u2mxSSMNbd34xlr7y8aCw6wXz3cwFg1StXk5FUWA36nl1V5b8ALCIORDYCKO8AAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/naked-adventure-de_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022946.93193717277\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWir erstellen zusammen eine Karte der besten FKK-Zonen!\u003C\/p\u003E\n\u003Cp\u003EHerzlich Willkommen bei Naked Adventure, deine Portalseite f\u00fcr aktuelle von der Gemeinschaft gelenkte Information rund um FKK!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["fkk","freiheit","karte","nackt","nacktheit","naturismus","nudismus"],"hasMore":false,"image":"https:\/\/avris.it\/image\/naked-adventure-de_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/naked-adventure-de_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/naked-adventure-de_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022236.73298429319\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWir erstellen zusammen eine Karte der besten FKK-Zonen!\u003C\/p\u003E\n\u003Cp\u003EHerzlich Willkommen bei Naked Adventure, deine Portalseite f\u00fcr aktuelle von der Gemeinschaft gelenkte Information rund um FKK!\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/naked-adventure-de_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/naked-adventure-de_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022236.73298429319\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWir erstellen zusammen eine Karte der besten FKK-Zonen!\u003C\/p\u003E\n\u003Cp\u003EHerzlich Willkommen bei Naked Adventure, deine Portalseite f\u00fcr aktuelle von der Gemeinschaft gelenkte Information rund um FKK!\u003C\/p\u003E","words":26,"readTime":null,"lang":"de"},"en":{"slug":"naked-adventure-en","title":"Naked Adventure","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/naked-adventure-en_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022473.46596858639\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAjCAYAAAD8BaggAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAIn0lEQVRYhcWYzY4cyXHHfxGZWR\/d093zwVlyd0ktKUMwVoINAzoYsH32C\/hmwGff\/Ar2SxjwW\/gkGPAD7MWwLUgL29JhJZhaacmdWQ5nuqe6KjMjfKhhi1xR0vqg1R8odFbnR\/wzMiP\/USn93\/yLc4fTdcv5qsWtoiIUcy6uJ87XDZ++2HO8SFztMmerhuuhsO4j1ZwXu8wwVX4TVIVNH\/mzb3b8+w+fYSHi00\/5Iv0h1WYKH77bIX\/79\/\/sCkRAgaRCDEoMAdGIxIYUAyEIbVJWRx2b457lqmccKzHNbQHMjRCU7dUOF8VdSE1gP1YmA1UlRgEBdwChGEzFiUFYL4T4jT4TRWlUSKr0KZDUCGRScpq+oWmFFANtiqxWDffvH7E5XzGNdTbSJEoueDViCtSyZBozmhLdomWaKuaACBoEEaE43A6V3VBABBGoVojqThBDUVJQggoaIiqg4iTJJBX6JtD1gTYJKhWvBXEnpYCI0baKGWCV0CqpaUAjoQnENgKCuVMNxsnY7StThdREQhBCAHEhrvv2sFR9EpooRFUAYhBScIJl1BStEcrE7hqqw+bkCKGCG+7g40ieJkiJ1PSzJ4oTkjJmY8pONieosOwDCwLgmMFUbF667\/7RIwKOm4E55k7OzlScvB8IUolBZqOWsQrDUHn24oLpJ3tMHRfoYmDcbTk+PkZjwwePH7Psj8muGOAIMQmtggqYQynOVJ3qICqkpMQuGW23pFajFKOJwjgWht0eqhLcURWCOlgBhzYm3j054vJl5vjsGOk7UMXMWDSJ8\/P7hL4HCVCdak6T7sJNwKrj7qhCK4LjuAulQkxMhApSC43tWa\/Oac8XhLihlIoVQ2OgVMdKoY57apn47OIXdF2L1wnLSlWl6ZcMDk8\/v+DRw0eIGgio+l1k2cwpOKozKdzvCDnilfjD7\/0jfbfgvW\/\/KeM4sd\/e5+EH71NCj4oQVAguNArpKBHONrgqugi4KBIjRQLNco2GRM6ZRd8S1BEcsLvH4c6wu81EzO4ex6xSSyU+efiQ3e3Aj7\/\/b5h2eP5P8jcfcu\/9J6QUcIcqgcXmjJw6VGU2MOzpjo7Y7o19LeyHLUcn91ktWmzcUq8LViGXSjUhFwMJmDvjWJhKZSoZ1cid39CgxF\/cdqgsOD8PNHdhP1b47OmnxKA0QYlRqS+e46LUdkO7XLHarOm7huN+iSyOkJSQxQluEy4ZGwc8G6oRJKBRqF7JUyG64VYoJZNr5uXVDeOYoUnEZaOIG+o2x7LNzjWBCRgB0QYSpH7FUZfAnbLfUbZODIb2HYTFPE8HN\/BaMSt4nnAUB+pUsGrksVJKYdl1FHH60yUhKqFtiLvhlvlwlFk2VAgya48wn6puE9NUmDLUUpj6lqGJLLZbVsPA0uY+ND2Iov0RHlq0GKWUeZ+4EdI8ae0rXit5nLBpIu9HhjwRup744DvfRe50TJnPCBEQmQmpzKREBFEFCUhIhNRQU2JcdGjakHKA2y0yDVgVaBZYSExFyLWSiyNyF\/YCNTj0oL3TC4gyn\/ruflD73zfMjOju87K48\/HHH3N1dcX5+TmPHz+m6zpe8X3V5ndZBt700O3tLbXOec1yuUTvNO3LGKeBWgvVhe1UWDWBbJU2RsSFXEeyZRyj1QW4U6lE9iBLqs9ZgtXM0fKUEOKbHnqFm5sb9vs9qnooxxhxd87OzlgulwBc7p5ytf0M8cBYz7mUivGAVdpyujB2u0tIK3z8lG24R0oRcycQqPWW7fCSRXdESg19v0Y1HDjE113Xre9RkqFli1I5O1uyXq\/vdEcP7lV6Bn9BEKXRBzy9OeJB95TraUEnEaPHfU\/Tvw\/jM8TvEwCVgAVntTxGVSh1onolvcYhAgdDZnCzN6K0qI3s91umaWK5XNL3\/WEWgY53mu+gCrtpw8P1JYuwJGnD3l+waDaoLjGrpPYRXr+gyoZaM5GBySNO4Gbacf6lkFJ5LaxTEPpG6dvIIlW6NtI0DYvFgtfbNRpQb6EEYt2xDi3iiZ+9HAmcYjVQyggO+5f\/w2QNXia8gjCnsBRnnU4IGg8b+rBkr6NvBCl7QlSEwGazOdS9ishSPgdpAKX4MP9nxr0+o\/RU\/xllgGE84vjkA6wKKXbc+gWUFYohIgRtwH857q8Qmqpzsa2oGcENM8OaN78m2iRYPCLnG35+fYpMz7m6yXRpzZPzSNckKu8T7AX94hiTQPWCTyOLEBkwogpOxXyHyDu\/3kP\/+t8D\/\/C9K45a4fFZ5Iud4f6coHC5M4bs\/NWfLPi7P3+BuaJ6S2oHTqPwcHNC0wpmIzZVPC6Y9Jof\/RSevPMZg3+LY3GEAqFBvEHsmuqFRPN2Qg\/OLviLP\/7B4f343i\/rHt\/9fuvRN4jxPnl4zr4IbZfo28BNvuIkHVNqw8tywUlcsi3P+YN3H5PSE\/z2J0h6xD5PtFWZbMuiOaJ6fXPJXj+HtP8v0v1\/AuC0vY8AjiMIl+MzAML6LxnHv+Y\/\/veYRXuN18A7y5Y+Jqx8jrBh3XbU6nT+gFIzNVRqc4JbR1KhuKIIbVyjpIN9M0PM7P+tZRc3Rh5e0jYTEnq6FAgS5mxQwMwZ93tEhFor1R1BSTHMWYQouUxki5ydrIk6e2eapq9PXL+Klo3j+Ka4fvLJJ1xcXLBcLgkh8OGHH76189vw0UcfcXp6ioiwWq147733DnWvR9FvwxseGoaBm5ubwyAxRsZxpG1bpmkipTmJPzs7I8Y3j7DLy8u7BH6eoKoe+tZaD9Jz7949fh3GceQNOX\/FbZqmQwOAnDPuTs75MPiX8cpgzhkzO4yRcz6M+VV2h5iZfx25zlfdQ\/q6Z76O8m\/D2zOw3yF+E+lD+vE2N17sjCCw7pRnN5UU5i8LEejTfNE0ZCcotFHIdb5qOVkon2+NdSdc7402Cu7z5cLJQnl+UzlbBlL4Vbuqyv8BU9cnVM3QI3wAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/naked-adventure-en_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022473.46596858639\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ELet\u2019s create a map of the best nudist places!\u003C\/p\u003E\n\u003Cp\u003EWelcome to Naked Adventure, your one stop shop for up-to-date, community driven information about naturism, nudism, FKK, whatever you want to call being natural!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/naked-adventure-en_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022946.93193717277\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAjCAYAAAD8BaggAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAIn0lEQVRYhcWYzY4cyXHHfxGZWR\/d093zwVlyd0ktKUMwVoINAzoYsH32C\/hmwGff\/Ar2SxjwW\/gkGPAD7MWwLUgL29JhJZhaacmdWQ5nuqe6KjMjfKhhi1xR0vqg1R8odFbnR\/wzMiP\/USn93\/yLc4fTdcv5qsWtoiIUcy6uJ87XDZ++2HO8SFztMmerhuuhsO4j1ZwXu8wwVX4TVIVNH\/mzb3b8+w+fYSHi00\/5Iv0h1WYKH77bIX\/79\/\/sCkRAgaRCDEoMAdGIxIYUAyEIbVJWRx2b457lqmccKzHNbQHMjRCU7dUOF8VdSE1gP1YmA1UlRgEBdwChGEzFiUFYL4T4jT4TRWlUSKr0KZDUCGRScpq+oWmFFANtiqxWDffvH7E5XzGNdTbSJEoueDViCtSyZBozmhLdomWaKuaACBoEEaE43A6V3VBABBGoVojqThBDUVJQggoaIiqg4iTJJBX6JtD1gTYJKhWvBXEnpYCI0baKGWCV0CqpaUAjoQnENgKCuVMNxsnY7StThdREQhBCAHEhrvv2sFR9EpooRFUAYhBScIJl1BStEcrE7hqqw+bkCKGCG+7g40ieJkiJ1PSzJ4oTkjJmY8pONieosOwDCwLgmMFUbF667\/7RIwKOm4E55k7OzlScvB8IUolBZqOWsQrDUHn24oLpJ3tMHRfoYmDcbTk+PkZjwwePH7Psj8muGOAIMQmtggqYQynOVJ3qICqkpMQuGW23pFajFKOJwjgWht0eqhLcURWCOlgBhzYm3j054vJl5vjsGOk7UMXMWDSJ8\/P7hL4HCVCdak6T7sJNwKrj7qhCK4LjuAulQkxMhApSC43tWa\/Oac8XhLihlIoVQ2OgVMdKoY57apn47OIXdF2L1wnLSlWl6ZcMDk8\/v+DRw0eIGgio+l1k2cwpOKozKdzvCDnilfjD7\/0jfbfgvW\/\/KeM4sd\/e5+EH71NCj4oQVAguNArpKBHONrgqugi4KBIjRQLNco2GRM6ZRd8S1BEcsLvH4c6wu81EzO4ex6xSSyU+efiQ3e3Aj7\/\/b5h2eP5P8jcfcu\/9J6QUcIcqgcXmjJw6VGU2MOzpjo7Y7o19LeyHLUcn91ktWmzcUq8LViGXSjUhFwMJmDvjWJhKZSoZ1cid39CgxF\/cdqgsOD8PNHdhP1b47OmnxKA0QYlRqS+e46LUdkO7XLHarOm7huN+iSyOkJSQxQluEy4ZGwc8G6oRJKBRqF7JUyG64VYoJZNr5uXVDeOYoUnEZaOIG+o2x7LNzjWBCRgB0QYSpH7FUZfAnbLfUbZODIb2HYTFPE8HN\/BaMSt4nnAUB+pUsGrksVJKYdl1FHH60yUhKqFtiLvhlvlwlFk2VAgya48wn6puE9NUmDLUUpj6lqGJLLZbVsPA0uY+ND2Iov0RHlq0GKWUeZ+4EdI8ae0rXit5nLBpIu9HhjwRup744DvfRe50TJnPCBEQmQmpzKREBFEFCUhIhNRQU2JcdGjakHKA2y0yDVgVaBZYSExFyLWSiyNyF\/YCNTj0oL3TC4gyn\/ruflD73zfMjOju87K48\/HHH3N1dcX5+TmPHz+m6zpe8X3V5ndZBt700O3tLbXOec1yuUTvNO3LGKeBWgvVhe1UWDWBbJU2RsSFXEeyZRyj1QW4U6lE9iBLqs9ZgtXM0fKUEOKbHnqFm5sb9vs9qnooxxhxd87OzlgulwBc7p5ytf0M8cBYz7mUivGAVdpyujB2u0tIK3z8lG24R0oRcycQqPWW7fCSRXdESg19v0Y1HDjE113Xre9RkqFli1I5O1uyXq\/vdEcP7lV6Bn9BEKXRBzy9OeJB95TraUEnEaPHfU\/Tvw\/jM8TvEwCVgAVntTxGVSh1onolvcYhAgdDZnCzN6K0qI3s91umaWK5XNL3\/WEWgY53mu+gCrtpw8P1JYuwJGnD3l+waDaoLjGrpPYRXr+gyoZaM5GBySNO4Gbacf6lkFJ5LaxTEPpG6dvIIlW6NtI0DYvFgtfbNRpQb6EEYt2xDi3iiZ+9HAmcYjVQyggO+5f\/w2QNXia8gjCnsBRnnU4IGg8b+rBkr6NvBCl7QlSEwGazOdS9ishSPgdpAKX4MP9nxr0+o\/RU\/xllgGE84vjkA6wKKXbc+gWUFYohIgRtwH857q8Qmqpzsa2oGcENM8OaN78m2iRYPCLnG35+fYpMz7m6yXRpzZPzSNckKu8T7AX94hiTQPWCTyOLEBkwogpOxXyHyDu\/3kP\/+t8D\/\/C9K45a4fFZ5Iud4f6coHC5M4bs\/NWfLPi7P3+BuaJ6S2oHTqPwcHNC0wpmIzZVPC6Y9Jof\/RSevPMZg3+LY3GEAqFBvEHsmuqFRPN2Qg\/OLviLP\/7B4f343i\/rHt\/9fuvRN4jxPnl4zr4IbZfo28BNvuIkHVNqw8tywUlcsi3P+YN3H5PSE\/z2J0h6xD5PtFWZbMuiOaJ6fXPJXj+HtP8v0v1\/AuC0vY8AjiMIl+MzAML6LxnHv+Y\/\/veYRXuN18A7y5Y+Jqx8jrBh3XbU6nT+gFIzNVRqc4JbR1KhuKIIbVyjpIN9M0PM7P+tZRc3Rh5e0jYTEnq6FAgS5mxQwMwZ93tEhFor1R1BSTHMWYQouUxki5ydrIk6e2eapq9PXL+Klo3j+Ka4fvLJJ1xcXLBcLgkh8OGHH76189vw0UcfcXp6ioiwWq147733DnWvR9FvwxseGoaBm5ubwyAxRsZxpG1bpmkipTmJPzs7I8Y3j7DLy8u7BH6eoKoe+tZaD9Jz7949fh3GceQNOX\/FbZqmQwOAnDPuTs75MPiX8cpgzhkzO4yRcz6M+VV2h5iZfx25zlfdQ\/q6Z76O8m\/D2zOw3yF+E+lD+vE2N17sjCCw7pRnN5UU5i8LEejTfNE0ZCcotFHIdb5qOVkon2+NdSdc7402Cu7z5cLJQnl+UzlbBlL4Vbuqyv8BU9cnVM3QI3wAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/naked-adventure-en_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022946.93193717277\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ELet\u2019s create a map of the best nudist places!\u003C\/p\u003E\n\u003Cp\u003EWelcome to Naked Adventure, your one stop shop for up-to-date, community driven information about naturism, nudism, FKK, whatever you want to call being natural!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["fkk","freedom","map","naked","naturism","naturist","nude","nudism","nudist","nudity"],"hasMore":false,"image":"https:\/\/avris.it\/image\/naked-adventure-en_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/naked-adventure-en_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/naked-adventure-en_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022236.73298429319\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ELet\u2019s create a map of the best nudist places!\u003C\/p\u003E\n\u003Cp\u003EWelcome to Naked Adventure, your one stop shop for up-to-date, community driven information about naturism, nudism, FKK, whatever you want to call being natural!\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/naked-adventure-en_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/naked-adventure-en_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022236.73298429319\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ELet\u2019s create a map of the best nudist places!\u003C\/p\u003E\n\u003Cp\u003EWelcome to Naked Adventure, your one stop shop for up-to-date, community driven information about naturism, nudism, FKK, whatever you want to call being natural!\u003C\/p\u003E","words":34,"readTime":null,"lang":"en"},"pl":{"slug":"naked-adventure-pl","title":"Naked Adventure","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/naked-adventure-pl_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022473.46596858639\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAjCAYAAAD8BaggAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAIsklEQVRYhcWYS4+lyVGGn4jM\/G7nUpfu6q4Zezz0WKPRYAuB5BUgVog\/wA6JJUv4B0j8Bzb8CuQNQmLDbnY2Ao0AC9EGZhh7pi\/VXVXnfJfMjGBxqosuzwxtJGxCOjqp\/OJ8+WZExhtvHun\/8K+dGzvdtpxtWtwqKkIx5+nlwtm24ZPnE2ebBnfnYl84WSV2U2HVBuZiPLlc+J9MVTjqI7\/5XsfHP7rARJj2\/8rz9AHVDhA+fKtD\/uhP\/9KjCFGEIJBUCWKkoGiIhNQRkxKDEIKyHnpO7w2sjgZKNkSEEANWK+6QmkCeFkox0EDbJ8axYA4IhKAggAhmzn4yzEEV2uTEd\/uFpIEmKG0IdEloQkQwmlDpBqPpEl0T6LuWoW+5\/2DF9t6GZarEJhJixMxwM0TA3bBScYk0fQMqBzSAA+ZwtS9c7QtmIAKigkol9imRBKIKfYIuCSKCSiQGIVIILkTtCAoqlTzPzPtESBGRigAhQK0ZLxVNEW0imhIERUSp1cnmzNnIxTEXhj4hAkEPaZ0WI7731paSKyrQBCUGRQVyNpRKm5SoEKygdcGLU5eGeaysUiSlAKp4XghlBgF3BQ0A5OLEJMzVKNURVdb9f6csFyffPAMhfvvRGauhp+TCvBiIsp8K81wYr64othCsUk0oJROj4DVDGfnBD\/6e1dGGYbNGRZj3O1ScX\/3wuxDT4WOCGcSopAghHICUajggCkmEGIVahNhEw72iQejjwjD0nG4S7olpCni1Q8XljNdKDIYy8eLZc8gTZecsUeg3W6xpuN7vKSmR2h43R3HAET0cIHfD8UP61Ynu+M18ESf+8G+\/z8nREY8+\/A28TEj3kK5NIMqqS7g5IQQkrEhNxN1xM+apo2qFGNFhoCJ0w4ajk\/s0XYdbRXBUHA0O7rjffB+Q3czZYd6chYL83Z\/\/se\/2Iz9+urC3lrZRfvd3vsf6\/H1EA6qKaEBEQARVZTHn8Wef0202jEsl9T1VIv1qQ14yKcCjd79FELmpPqeWw8LuTq12SFuplFKp5pgZqBI\/HY+pdcu9s8DbMQLO43\/5nO7fn9M2gSCOS+Do3hlNN6AxYaqsrdBZ4XjT40kJ\/QodNtRlQuc9cvmcOVdKFSpCKY6JUnJlmgpzzuzGEQkN17uRao6mQOyaRLihiqSCAEpFilFdQCAG5frpT8jSk47OWK96TodE3wfSpkfXRxATstriucUuK\/n6ilIqHhpi25O6QDWjBiXFyLoq908HcjbKUUfJBWka4jyPqDsqUEUOhw1QOZBZdXBt8BDoeqHbXaO24LnBa2GNo22DDGuIHRI7gkZkmEm1UnOhzDNeC5YzNRfyXJjnBUGZ5sJ+XFCBOPTEJWcUCAIuQlQ5kJW8Ikgh+IKXQtlnptJS556lbRn3I8u8cCyJ1oBakGXCK3joyFUYx8q8HPhIiDiJmhwPhrnR9EZ7bIATm0Q8\/+730BtijyKovgIDQZQQbkDpoZdpCIQQiCkRm5bYD7DZklcn0G1wu6COl5jMVAJLhcUjdugcpKTgMOeKud9pJ1Ej4u633f7\/28yM6O6ICO7Oxx9\/zIsXLzg7O+Pk5ISHDx\/yCu8rn1\/kGLgbof1+T60VgLZtaZrmK3cyLyO1FqoL10th2wQWq7QxIi7kOpMt4xitDuBOpRKZQFZUr6gqVjPr1SkhxLsRemVXV1fM83w4zKosy0LbtuScUVXOz8+JMfJs9wkvrn+KeGCpZzyjYPIWm3TN6WDsds8gbfD5P7kO90kpYu4EArXuuR5fMnRrUmro+y1604gB4uuh67b3KaOh5RrFaJqG1WpF3\/d3wqv0jH5BEKXRcz65WnPefcLlMtBJxOhxn2j6b8D8OeIPCYBKwIKzWR2jKpS6UL2SXsMQgduFzOBqMqK0SJ2ItpBzxt0ZhuF2F4GOB813UIXdcsQ3t88YwoqkDZNfMDRHqK4wq6T2Hbw+p8oRtWYiI4tHnMDVsuPsZ0pK5YZvRIQUhL5Rhi6xbp2uicQYed1HRGg0oN5CCcS6YxtaxBOfvpwJnGI1UMoMDtPLf2axBi8LXkE4sD\/F2aaTA4neHOjblL1ufSNonRAF0URM8TY6ryqylCcgDaAUHw9zZtzvM0pP9U8pI4zzmuOTd7EqpNix96dQNig3WlybG0nit6DuAFqq8\/S6HjRKOVTbZt2Rr+utT5sEi2tyvuKzy1Nk+YIXV5kubXl0FumaROUbBLugH44xCVQv+DIzhMiIEVVwKuY7RB58fYT+5p9G\/uyvXvCdtxIvR6MaxPCSUg9C\/LOXld\/\/9YE\/+a0LzBXVPakdOY3CN49OaFrBbMaWiseBRS\/50b\/Bowc\/ZfT3ORZHKBAaxBvELqleSDRfDej83lN++9f+AYCTn80l8B7w\/jvfIsaH5PELpiK0XaJvA1f5BSfpmFIbXpannMQV1+ULvv3Wr5DSI3z\/YyS9w5QX2qosds3QrKle76bsdR7S\/h9JD\/8CgPvdOYJgbogoT6efABC2v8c8\/wE\/\/I9jhvYSr4EHq5Y+Jqw8QThi23bU6nR+TqmZGiq1OcGtI6lQXFGENm5R0u367o6Y2f+6lz29MvL4krZZkNDTpUCQcFCEAmbOPE2ICLVWqjuCkmJAVRBRclnIFrl3siXqITrLsvzymuvP08vmeb7bXB8\/fsyTJ0\/ouu6gpUVIKfHBBx\/c+fFX2UcffcTp6Skiwmaz4e2337599noVvcnuRGi32zFNEzlnwo3uyTljZmw2G9br9de+6OLigmVZiDFS66F51loxM87OzojxS5T3JZvnGb2D7iZspRRyzpRSMDuQ2G63YxzHr32Z++HmMI4jZkYphVorIsLFxcWtinhjhMzMfxla5+c9Q\/pqd6\/v9Bc5fpPpm13+b+1NoO\/oodfHF3sjqKAC++VwTdKb\/5qOeuX5zoDDfe6oV55cV9oorFrlcjJutDy5QtSDX5+Ul5NxulKCfHldVeW\/AGh1Gtv3DDBdAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/naked-adventure-pl_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022473.46596858639\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EStw\u00f3rzmy map\u0119 najlepszych miejsc naturystycznych!\u003C\/p\u003E\n\u003Cp\u003EWitamy w Naked Adventure, tworzonej przez spo\u0142eczno\u015b\u0107 bazie informacji o nagich pla\u017cach, basenach, saunach etc.!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/naked-adventure-pl_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022946.93193717277\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAjCAYAAAD8BaggAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAIsklEQVRYhcWYS4+lyVGGn4jM\/G7nUpfu6q4Zezz0WKPRYAuB5BUgVog\/wA6JJUv4B0j8Bzb8CuQNQmLDbnY2Ao0AC9EGZhh7pi\/VXVXnfJfMjGBxqosuzwxtJGxCOjqp\/OJ8+WZExhtvHun\/8K+dGzvdtpxtWtwqKkIx5+nlwtm24ZPnE2ebBnfnYl84WSV2U2HVBuZiPLlc+J9MVTjqI7\/5XsfHP7rARJj2\/8rz9AHVDhA+fKtD\/uhP\/9KjCFGEIJBUCWKkoGiIhNQRkxKDEIKyHnpO7w2sjgZKNkSEEANWK+6QmkCeFkox0EDbJ8axYA4IhKAggAhmzn4yzEEV2uTEd\/uFpIEmKG0IdEloQkQwmlDpBqPpEl0T6LuWoW+5\/2DF9t6GZarEJhJixMxwM0TA3bBScYk0fQMqBzSAA+ZwtS9c7QtmIAKigkol9imRBKIKfYIuCSKCSiQGIVIILkTtCAoqlTzPzPtESBGRigAhQK0ZLxVNEW0imhIERUSp1cnmzNnIxTEXhj4hAkEPaZ0WI7731paSKyrQBCUGRQVyNpRKm5SoEKygdcGLU5eGeaysUiSlAKp4XghlBgF3BQ0A5OLEJMzVKNURVdb9f6csFyffPAMhfvvRGauhp+TCvBiIsp8K81wYr64othCsUk0oJROj4DVDGfnBD\/6e1dGGYbNGRZj3O1ScX\/3wuxDT4WOCGcSopAghHICUajggCkmEGIVahNhEw72iQejjwjD0nG4S7olpCni1Q8XljNdKDIYy8eLZc8gTZecsUeg3W6xpuN7vKSmR2h43R3HAET0cIHfD8UP61Ynu+M18ESf+8G+\/z8nREY8+\/A28TEj3kK5NIMqqS7g5IQQkrEhNxN1xM+apo2qFGNFhoCJ0w4ajk\/s0XYdbRXBUHA0O7rjffB+Q3czZYd6chYL83Z\/\/se\/2Iz9+urC3lrZRfvd3vsf6\/H1EA6qKaEBEQARVZTHn8Wef0202jEsl9T1VIv1qQ14yKcCjd79FELmpPqeWw8LuTq12SFuplFKp5pgZqBI\/HY+pdcu9s8DbMQLO43\/5nO7fn9M2gSCOS+Do3hlNN6AxYaqsrdBZ4XjT40kJ\/QodNtRlQuc9cvmcOVdKFSpCKY6JUnJlmgpzzuzGEQkN17uRao6mQOyaRLihiqSCAEpFilFdQCAG5frpT8jSk47OWK96TodE3wfSpkfXRxATstriucUuK\/n6ilIqHhpi25O6QDWjBiXFyLoq908HcjbKUUfJBWka4jyPqDsqUEUOhw1QOZBZdXBt8BDoeqHbXaO24LnBa2GNo22DDGuIHRI7gkZkmEm1UnOhzDNeC5YzNRfyXJjnBUGZ5sJ+XFCBOPTEJWcUCAIuQlQ5kJW8Ikgh+IKXQtlnptJS556lbRn3I8u8cCyJ1oBakGXCK3joyFUYx8q8HPhIiDiJmhwPhrnR9EZ7bIATm0Q8\/+730BtijyKovgIDQZQQbkDpoZdpCIQQiCkRm5bYD7DZklcn0G1wu6COl5jMVAJLhcUjdugcpKTgMOeKud9pJ1Ej4u633f7\/28yM6O6ICO7Oxx9\/zIsXLzg7O+Pk5ISHDx\/yCu8rn1\/kGLgbof1+T60VgLZtaZrmK3cyLyO1FqoL10th2wQWq7QxIi7kOpMt4xitDuBOpRKZQFZUr6gqVjPr1SkhxLsRemVXV1fM83w4zKosy0LbtuScUVXOz8+JMfJs9wkvrn+KeGCpZzyjYPIWm3TN6WDsds8gbfD5P7kO90kpYu4EArXuuR5fMnRrUmro+y1604gB4uuh67b3KaOh5RrFaJqG1WpF3\/d3wqv0jH5BEKXRcz65WnPefcLlMtBJxOhxn2j6b8D8OeIPCYBKwIKzWR2jKpS6UL2SXsMQgduFzOBqMqK0SJ2ItpBzxt0ZhuF2F4GOB813UIXdcsQ3t88YwoqkDZNfMDRHqK4wq6T2Hbw+p8oRtWYiI4tHnMDVsuPsZ0pK5YZvRIQUhL5Rhi6xbp2uicQYed1HRGg0oN5CCcS6YxtaxBOfvpwJnGI1UMoMDtPLf2axBi8LXkE4sD\/F2aaTA4neHOjblL1ufSNonRAF0URM8TY6ryqylCcgDaAUHw9zZtzvM0pP9U8pI4zzmuOTd7EqpNix96dQNig3WlybG0nit6DuAFqq8\/S6HjRKOVTbZt2Rr+utT5sEi2tyvuKzy1Nk+YIXV5kubXl0FumaROUbBLugH44xCVQv+DIzhMiIEVVwKuY7RB58fYT+5p9G\/uyvXvCdtxIvR6MaxPCSUg9C\/LOXld\/\/9YE\/+a0LzBXVPakdOY3CN49OaFrBbMaWiseBRS\/50b\/Bowc\/ZfT3ORZHKBAaxBvELqleSDRfDej83lN++9f+AYCTn80l8B7w\/jvfIsaH5PELpiK0XaJvA1f5BSfpmFIbXpannMQV1+ULvv3Wr5DSI3z\/YyS9w5QX2qosds3QrKle76bsdR7S\/h9JD\/8CgPvdOYJgbogoT6efABC2v8c8\/wE\/\/I9jhvYSr4EHq5Y+Jqw8QThi23bU6nR+TqmZGiq1OcGtI6lQXFGENm5R0u367o6Y2f+6lz29MvL4krZZkNDTpUCQcFCEAmbOPE2ICLVWqjuCkmJAVRBRclnIFrl3siXqITrLsvzymuvP08vmeb7bXB8\/fsyTJ0\/ouu6gpUVIKfHBBx\/c+fFX2UcffcTp6Skiwmaz4e2337599noVvcnuRGi32zFNEzlnwo3uyTljZmw2G9br9de+6OLigmVZiDFS66F51loxM87OzojxS5T3JZvnGb2D7iZspRRyzpRSMDuQ2G63YxzHr32Z++HmMI4jZkYphVorIsLFxcWtinhjhMzMfxla5+c9Q\/pqd6\/v9Bc5fpPpm13+b+1NoO\/oodfHF3sjqKAC++VwTdKb\/5qOeuX5zoDDfe6oV55cV9oorFrlcjJutDy5QtSDX5+Ul5NxulKCfHldVeW\/AGh1Gtv3DDBdAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/naked-adventure-pl_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022946.93193717277\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EStw\u00f3rzmy map\u0119 najlepszych miejsc naturystycznych!\u003C\/p\u003E\n\u003Cp\u003EWitamy w Naked Adventure, tworzonej przez spo\u0142eczno\u015b\u0107 bazie informacji o nagich pla\u017cach, basenach, saunach etc.!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["fkk","mapa","nago\u015b\u0107","naturyzm","nudyzm","wolno\u015b\u0107"],"hasMore":false,"image":"https:\/\/avris.it\/image\/naked-adventure-pl_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/naked-adventure-pl_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/naked-adventure-pl_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022236.73298429319\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EStw\u00f3rzmy map\u0119 najlepszych miejsc naturystycznych!\u003C\/p\u003E\n\u003Cp\u003EWitamy w Naked Adventure, tworzonej przez spo\u0142eczno\u015b\u0107 bazie informacji o nagich pla\u017cach, basenach, saunach etc.!\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/naked-adventure-pl_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/naked-adventure-pl_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022236.73298429319\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EStw\u00f3rzmy map\u0119 najlepszych miejsc naturystycznych!\u003C\/p\u003E\n\u003Cp\u003EWitamy w Naked Adventure, tworzonej przez spo\u0142eczno\u015b\u0107 bazie informacji o nagich pla\u017cach, basenach, saunach etc.!\u003C\/p\u003E","words":23,"readTime":null,"lang":"pl"}}},"projects\/micrus-tiny-yet-powerful-php-framework":{"key":"projects\/micrus-tiny-yet-powerful-php-framework","type":"article","published":true,"meta":{"createdAt":"2017-04-28T19:43:38+02:00","publishedAt":"2017-03-11T12:00:00+01:00","group":"micrus","links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/micrus.avris.it","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Micrus","displayUrl":null}],"category":"projects","subcategory":null,"slug":"micrus-tiny-yet-powerful-php-framework"},"content":{"en":{"slug":"micrus-tiny-yet-powerful-php-framework","title":"Micrus \u2022 Tiny, yet powerful, PHP framework","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/micrus_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022267.5\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGCUlEQVRIiU2Wy45dVxGGv6q19u2cvuC2u9NJhIkcCRSQAhKXF2DChAED3odX4Rl4A2CAxEWKlBBQiBOTqON0226f0+eyL6uqGOxj45L2YA\/W0r\/++uv\/S4DgUKKKdDXy1jH66BQi8PVA7Lakmx5dQULIIgy+R0RINJRfnOGdQwpw8PUAvRBjgSggExQHC\/S\/Ai5EBCICQEQQ4UQE+TUYAV0oehLYuMKvB\/SsI192lG9BXwgqUIkyeSEIQIhHS+qfLyk3e8KE6A3JDb4OxBNIS+wK4T2yBG0DGQJBEFE8HPeCWQBvAIpWMAIfHGol1oXYbLD6jvxOIl9m2h00wKqPw8tAukS+l4khE0XwBJ4SqYEoQuwnZKEQCT3N6EVG\/3gLIYDg4QdCBNAZkHSJyEAWIoNk5kvqhAC2Ekwm2p+1NI8z9s2AiOAXNeUE8mhIoyCQTjJ6lMCdGA0fBUkJ0QqpE\/J2xv5zBF+v8XDiAOhVZWQGQpORNkGtSJeQCkggR3mWmSurXWH\/CGTI+LogHx4RJbDbCW0zcpQAATPAASWiQTSBClILooL+6pTp93t0mnAgwl5rSaTOwf0WuoS0h29ZoccZaSCGQrihywQl8MFInRKPd\/DeKVIV6veWSFeRjjIkxfsRLEBnXNoK0iQkKZIzoAz\/2FL+dEO53mOr4bWoRe8tg+8ukEVGjzJ6kmZmMkgF2iraKbYx8CAmRxqhejtDmQgXdFEjbYO2EIMR4WiV53tUkLZC64RUig\/gm6C8HPHNRPQT9mTD9NmW8q87siwFvWzQ4wrtBO0CaQWpBEnz+Ekj5IsGUKarEXtpMMG7lxdUtzVX4wvMChDE3tB7NZIFyRldNogKYeA7JyaIcX4cEfgeLHXI+xX6dCTrsCXdTsjJEelsSXW+RLqM5ABxKDOV+IRo0H2wpP\/3yPjFlt+e\/5o7u+N29xy6gr5sqaj5g\/0Fe5CJKaNFMRuJsRBjzMD6iegN3zs+ODEEsVckZUSSRKqEtBDkoZJ\/sqT6wX2ah2dIlSAc0QB1iCAmQxcdu7+vOF59h4ePLlmvv+aoKzTpmOd75enxS8gxj73NbQsH74OwwDcTtjJsY\/jGsWeF2Bn62S0ChIigqmgSqnPQH2fSh6c033+HfHbvMLazBs6\/rGhTZlFqHq0u+d75gmfrFR\/ffEyjJ2w9UeiRSln5jqsHqxlE7\/hg2KrgeyN284D42rHribgbSFc78iv7BnALpmvl6K8JuV2zeznQfNBTvXUfbWtEMtfvBnko2Ljh0y8+5zcnP+XkvGJVNryonOtPrqgeNkRArit8PLDSF3w7EQNgc6L4OrAXE7Ebif1IhJPlVW4c3LLLFctSM3xaKN9swb9Fcqa6uEDqCrLgyxZNHT988oCPnnyF3I7Y04p7R8rZw\/f58vwlviuUYvid4bsCATEK4YFvA3tRsNVErAdivYfdNMtDZG6ZKFQ5s6xq8GDdj6BC\/Q7wy2OaH13OTFU1uqiBTJQRbQLvJ\/b\/XIGPhENYEDuIaRYtDt77bBsWxN7xreHPB\/zZFu4GohhqQRKR34mAKqQsFJz9WDCf80o3gtyO+JkhtaANs9tFgARSgy4r0ukCSQU08P0IGLE3oi\/4\/jBVdxN2M+I3A347zqz0ZbaB4oQdwlUlkWXWkIcRQK6F0KAUJ74S9M9rpM1IVlIYkgtp2RFlTn1tanRZ4\/2EZCEGA43ZMmJO8nBAAypgcMJmEPghaYJZ1HJI7lIABNFAMugicAe2wOfOeLFClw3aZGjBtk5aVERxCJujsU5om7E7A7dDDgIWiMwtwwKKHXakA9uHrSxHBCVsPgSoKqD4GPOO1AUsIHqIj0aG+2u0bcjnC0TAh5gzJhRM0LrG24K2gg2BJMF9dmjv47VTR5lBiR+MlxlUnn\/eBHNg2BUZYhZiciIFbKH8bcN0voScSYsKaUCbBFKwu4Kt9kiroDrHR5pZ8LtC7IIYHHYGQyEmP7D05vrxRv0fXCCiRAiYIAHhjlsQV4Xx8XaeNFESgk0FyQaSCRfsZgRRIBHms\/gbiBHoD9oZHSab23domTj8DzmtyTndp0MuAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/micrus_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022267.5\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EHow big does a framework need to be to provide you with a quick, easy and comfortable way of creating neatly structured MVC websites? That can easily be extended and configured?\u003C\/p\u003E\n\u003Cp\u003EWell, not big at all. Just try Micrus! Its goal is to keep it as simple as possible, while offering all the most important features, as listed here:\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/micrus_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022535\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGCUlEQVRIiU2Wy45dVxGGv6q19u2cvuC2u9NJhIkcCRSQAhKXF2DChAED3odX4Rl4A2CAxEWKlBBQiBOTqON0226f0+eyL6uqGOxj45L2YA\/W0r\/++uv\/S4DgUKKKdDXy1jH66BQi8PVA7Lakmx5dQULIIgy+R0RINJRfnOGdQwpw8PUAvRBjgSggExQHC\/S\/Ai5EBCICQEQQ4UQE+TUYAV0oehLYuMKvB\/SsI192lG9BXwgqUIkyeSEIQIhHS+qfLyk3e8KE6A3JDb4OxBNIS+wK4T2yBG0DGQJBEFE8HPeCWQBvAIpWMAIfHGol1oXYbLD6jvxOIl9m2h00wKqPw8tAukS+l4khE0XwBJ4SqYEoQuwnZKEQCT3N6EVG\/3gLIYDg4QdCBNAZkHSJyEAWIoNk5kvqhAC2Ekwm2p+1NI8z9s2AiOAXNeUE8mhIoyCQTjJ6lMCdGA0fBUkJ0QqpE\/J2xv5zBF+v8XDiAOhVZWQGQpORNkGtSJeQCkggR3mWmSurXWH\/CGTI+LogHx4RJbDbCW0zcpQAATPAASWiQTSBClILooL+6pTp93t0mnAgwl5rSaTOwf0WuoS0h29ZoccZaSCGQrihywQl8MFInRKPd\/DeKVIV6veWSFeRjjIkxfsRLEBnXNoK0iQkKZIzoAz\/2FL+dEO53mOr4bWoRe8tg+8ukEVGjzJ6kmZmMkgF2iraKbYx8CAmRxqhejtDmQgXdFEjbYO2EIMR4WiV53tUkLZC64RUig\/gm6C8HPHNRPQT9mTD9NmW8q87siwFvWzQ4wrtBO0CaQWpBEnz+Ekj5IsGUKarEXtpMMG7lxdUtzVX4wvMChDE3tB7NZIFyRldNogKYeA7JyaIcX4cEfgeLHXI+xX6dCTrsCXdTsjJEelsSXW+RLqM5ABxKDOV+IRo0H2wpP\/3yPjFlt+e\/5o7u+N29xy6gr5sqaj5g\/0Fe5CJKaNFMRuJsRBjzMD6iegN3zs+ODEEsVckZUSSRKqEtBDkoZJ\/sqT6wX2ah2dIlSAc0QB1iCAmQxcdu7+vOF59h4ePLlmvv+aoKzTpmOd75enxS8gxj73NbQsH74OwwDcTtjJsY\/jGsWeF2Bn62S0ChIigqmgSqnPQH2fSh6c033+HfHbvMLazBs6\/rGhTZlFqHq0u+d75gmfrFR\/ffEyjJ2w9UeiRSln5jqsHqxlE7\/hg2KrgeyN284D42rHribgbSFc78iv7BnALpmvl6K8JuV2zeznQfNBTvXUfbWtEMtfvBnko2Ljh0y8+5zcnP+XkvGJVNryonOtPrqgeNkRArit8PLDSF3w7EQNgc6L4OrAXE7Ebif1IhJPlVW4c3LLLFctSM3xaKN9swb9Fcqa6uEDqCrLgyxZNHT988oCPnnyF3I7Y04p7R8rZw\/f58vwlviuUYvid4bsCATEK4YFvA3tRsNVErAdivYfdNMtDZG6ZKFQ5s6xq8GDdj6BC\/Q7wy2OaH13OTFU1uqiBTJQRbQLvJ\/b\/XIGPhENYEDuIaRYtDt77bBsWxN7xreHPB\/zZFu4GohhqQRKR34mAKqQsFJz9WDCf80o3gtyO+JkhtaANs9tFgARSgy4r0ukCSQU08P0IGLE3oi\/4\/jBVdxN2M+I3A347zqz0ZbaB4oQdwlUlkWXWkIcRQK6F0KAUJ74S9M9rpM1IVlIYkgtp2RFlTn1tanRZ4\/2EZCEGA43ZMmJO8nBAAypgcMJmEPghaYJZ1HJI7lIABNFAMugicAe2wOfOeLFClw3aZGjBtk5aVERxCJujsU5om7E7A7dDDgIWiMwtwwKKHXakA9uHrSxHBCVsPgSoKqD4GPOO1AUsIHqIj0aG+2u0bcjnC0TAh5gzJhRM0LrG24K2gg2BJMF9dmjv47VTR5lBiR+MlxlUnn\/eBHNg2BUZYhZiciIFbKH8bcN0voScSYsKaUCbBFKwu4Kt9kiroDrHR5pZ8LtC7IIYHHYGQyEmP7D05vrxRv0fXCCiRAiYIAHhjlsQV4Xx8XaeNFESgk0FyQaSCRfsZgRRIBHms\/gbiBHoD9oZHSab23domTj8DzmtyTndp0MuAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/micrus_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022535\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EHow big does a framework need to be to provide you with a quick, easy and comfortable way of creating neatly structured MVC websites? That can easily be extended and configured?\u003C\/p\u003E\n\u003Cp\u003EWell, not big at all. Just try Micrus! Its goal is to keep it as simple as possible, while offering all the most important features, as listed here:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EObject oriented\u003C\/li\u003E\n\u003Cli\u003EVery clear MVC structure\u003C\/li\u003E\n\u003Cli\u003EDependency Injection Container\u003C\/li\u003E\n\u003Cli\u003EEvent dispatching\u003C\/li\u003E\n\u003Cli\u003EORM agnostic, support for Doctrine and RedBean\u003C\/li\u003E\n\u003Cli\u003EREST-ful routing\u003C\/li\u003E\n\u003Cli\u003ECRUD generator\u003C\/li\u003E\n\u003Cli\u003ETemplate engine agnostic, support for Twig and plain PHP\u003C\/li\u003E\n\u003Cli\u003EAuthentication and authorization\u003C\/li\u003E\n\u003Cli\u003EEasy configuration with YAML\u003C\/li\u003E\n\u003Cli\u003EConsole tasks using Symfony Console\u003C\/li\u003E\n\u003Cli\u003EForms\u003C\/li\u003E\n\u003Cli\u003ELocalization\u003C\/li\u003E\n\u003Cli\u003ELogging with Monolog (PSR-3 compliant)\u003C\/li\u003E\n\u003Cli\u003ECaching (PSR-6 compliant)\u003C\/li\u003E\n\u003Cli\u003EFlash messages\u003C\/li\u003E\n\u003C\/ul\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["extendable","framework","full-stack","php","plugins","programming"],"hasMore":true,"image":"https:\/\/avris.it\/image\/micrus_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/micrus_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/micrus_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022133.75\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EHow big does a framework need to be to provide you with a quick, easy and comfortable way of creating neatly structured MVC websites? That can easily be extended and configured?\u003C\/p\u003E\n\u003Cp\u003EWell, not big at all. Just try Micrus! Its goal is to keep it as simple as possible, while offering all the most important features, as listed here:\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/micrus_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/micrus_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022133.75\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EHow big does a framework need to be to provide you with a quick, easy and comfortable way of creating neatly structured MVC websites? That can easily be extended and configured?\u003C\/p\u003E\n\u003Cp\u003EWell, not big at all. Just try Micrus! Its goal is to keep it as simple as possible, while offering all the most important features, as listed here:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EObject oriented\u003C\/li\u003E\n\u003Cli\u003EVery clear MVC structure\u003C\/li\u003E\n\u003Cli\u003EDependency Injection Container\u003C\/li\u003E\n\u003Cli\u003EEvent dispatching\u003C\/li\u003E\n\u003Cli\u003EORM agnostic, support for Doctrine and RedBean\u003C\/li\u003E\n\u003Cli\u003EREST-ful routing\u003C\/li\u003E\n\u003Cli\u003ECRUD generator\u003C\/li\u003E\n\u003Cli\u003ETemplate engine agnostic, support for Twig and plain PHP\u003C\/li\u003E\n\u003Cli\u003EAuthentication and authorization\u003C\/li\u003E\n\u003Cli\u003EEasy configuration with YAML\u003C\/li\u003E\n\u003Cli\u003EConsole tasks using Symfony Console\u003C\/li\u003E\n\u003Cli\u003EForms\u003C\/li\u003E\n\u003Cli\u003ELocalization\u003C\/li\u003E\n\u003Cli\u003ELogging with Monolog (PSR-3 compliant)\u003C\/li\u003E\n\u003Cli\u003ECaching (PSR-6 compliant)\u003C\/li\u003E\n\u003Cli\u003EFlash messages\u003C\/li\u003E\n\u003C\/ul\u003E","words":114,"readTime":null,"lang":"en"},"pl":{"slug":"micrus-drobny-lecz-skuteczny-framework-dla-php","title":"Micrus \u2022 Drobny, lecz skuteczny, framework dla PHP","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/micrus_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022267.5\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGCUlEQVRIiU2Wy45dVxGGv6q19u2cvuC2u9NJhIkcCRSQAhKXF2DChAED3odX4Rl4A2CAxEWKlBBQiBOTqON0226f0+eyL6uqGOxj45L2YA\/W0r\/++uv\/S4DgUKKKdDXy1jH66BQi8PVA7Lakmx5dQULIIgy+R0RINJRfnOGdQwpw8PUAvRBjgSggExQHC\/S\/Ai5EBCICQEQQ4UQE+TUYAV0oehLYuMKvB\/SsI192lG9BXwgqUIkyeSEIQIhHS+qfLyk3e8KE6A3JDb4OxBNIS+wK4T2yBG0DGQJBEFE8HPeCWQBvAIpWMAIfHGol1oXYbLD6jvxOIl9m2h00wKqPw8tAukS+l4khE0XwBJ4SqYEoQuwnZKEQCT3N6EVG\/3gLIYDg4QdCBNAZkHSJyEAWIoNk5kvqhAC2Ekwm2p+1NI8z9s2AiOAXNeUE8mhIoyCQTjJ6lMCdGA0fBUkJ0QqpE\/J2xv5zBF+v8XDiAOhVZWQGQpORNkGtSJeQCkggR3mWmSurXWH\/CGTI+LogHx4RJbDbCW0zcpQAATPAASWiQTSBClILooL+6pTp93t0mnAgwl5rSaTOwf0WuoS0h29ZoccZaSCGQrihywQl8MFInRKPd\/DeKVIV6veWSFeRjjIkxfsRLEBnXNoK0iQkKZIzoAz\/2FL+dEO53mOr4bWoRe8tg+8ukEVGjzJ6kmZmMkgF2iraKbYx8CAmRxqhejtDmQgXdFEjbYO2EIMR4WiV53tUkLZC64RUig\/gm6C8HPHNRPQT9mTD9NmW8q87siwFvWzQ4wrtBO0CaQWpBEnz+Ekj5IsGUKarEXtpMMG7lxdUtzVX4wvMChDE3tB7NZIFyRldNogKYeA7JyaIcX4cEfgeLHXI+xX6dCTrsCXdTsjJEelsSXW+RLqM5ABxKDOV+IRo0H2wpP\/3yPjFlt+e\/5o7u+N29xy6gr5sqaj5g\/0Fe5CJKaNFMRuJsRBjzMD6iegN3zs+ODEEsVckZUSSRKqEtBDkoZJ\/sqT6wX2ah2dIlSAc0QB1iCAmQxcdu7+vOF59h4ePLlmvv+aoKzTpmOd75enxS8gxj73NbQsH74OwwDcTtjJsY\/jGsWeF2Bn62S0ChIigqmgSqnPQH2fSh6c033+HfHbvMLazBs6\/rGhTZlFqHq0u+d75gmfrFR\/ffEyjJ2w9UeiRSln5jqsHqxlE7\/hg2KrgeyN284D42rHribgbSFc78iv7BnALpmvl6K8JuV2zeznQfNBTvXUfbWtEMtfvBnko2Ljh0y8+5zcnP+XkvGJVNryonOtPrqgeNkRArit8PLDSF3w7EQNgc6L4OrAXE7Ebif1IhJPlVW4c3LLLFctSM3xaKN9swb9Fcqa6uEDqCrLgyxZNHT988oCPnnyF3I7Y04p7R8rZw\/f58vwlviuUYvid4bsCATEK4YFvA3tRsNVErAdivYfdNMtDZG6ZKFQ5s6xq8GDdj6BC\/Q7wy2OaH13OTFU1uqiBTJQRbQLvJ\/b\/XIGPhENYEDuIaRYtDt77bBsWxN7xreHPB\/zZFu4GohhqQRKR34mAKqQsFJz9WDCf80o3gtyO+JkhtaANs9tFgARSgy4r0ukCSQU08P0IGLE3oi\/4\/jBVdxN2M+I3A347zqz0ZbaB4oQdwlUlkWXWkIcRQK6F0KAUJ74S9M9rpM1IVlIYkgtp2RFlTn1tanRZ4\/2EZCEGA43ZMmJO8nBAAypgcMJmEPghaYJZ1HJI7lIABNFAMugicAe2wOfOeLFClw3aZGjBtk5aVERxCJujsU5om7E7A7dDDgIWiMwtwwKKHXakA9uHrSxHBCVsPgSoKqD4GPOO1AUsIHqIj0aG+2u0bcjnC0TAh5gzJhRM0LrG24K2gg2BJMF9dmjv47VTR5lBiR+MlxlUnn\/eBHNg2BUZYhZiciIFbKH8bcN0voScSYsKaUCbBFKwu4Kt9kiroDrHR5pZ8LtC7IIYHHYGQyEmP7D05vrxRv0fXCCiRAiYIAHhjlsQV4Xx8XaeNFESgk0FyQaSCRfsZgRRIBHms\/gbiBHoD9oZHSab23domTj8DzmtyTndp0MuAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/micrus_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022267.5\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EJak du\u017cy musi by\u0107 framework, aby umo\u017cliwia\u0142 szybkie, \u0142atwe i wygodne tworzenie \u0142adnie uporz\u0105dkowanych stron MVC? Aby by\u0142 \u0142atwo rozszerzalny i konfigurowalny?\u003C\/p\u003E\n\u003Cp\u003ENo w\u0142a\u015bnie wcale nie tak du\u017cy. Wypr\u00f3buj Micrusa! Jego celem jest bycie tak ma\u0142ym, jak to tylko mo\u017cliwe, lecz oferowa\u0107 wszytkie najwa\u017cniejsze funkcjonalno\u015bci:\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/micrus_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022535\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGCUlEQVRIiU2Wy45dVxGGv6q19u2cvuC2u9NJhIkcCRSQAhKXF2DChAED3odX4Rl4A2CAxEWKlBBQiBOTqON0226f0+eyL6uqGOxj45L2YA\/W0r\/++uv\/S4DgUKKKdDXy1jH66BQi8PVA7Lakmx5dQULIIgy+R0RINJRfnOGdQwpw8PUAvRBjgSggExQHC\/S\/Ai5EBCICQEQQ4UQE+TUYAV0oehLYuMKvB\/SsI192lG9BXwgqUIkyeSEIQIhHS+qfLyk3e8KE6A3JDb4OxBNIS+wK4T2yBG0DGQJBEFE8HPeCWQBvAIpWMAIfHGol1oXYbLD6jvxOIl9m2h00wKqPw8tAukS+l4khE0XwBJ4SqYEoQuwnZKEQCT3N6EVG\/3gLIYDg4QdCBNAZkHSJyEAWIoNk5kvqhAC2Ekwm2p+1NI8z9s2AiOAXNeUE8mhIoyCQTjJ6lMCdGA0fBUkJ0QqpE\/J2xv5zBF+v8XDiAOhVZWQGQpORNkGtSJeQCkggR3mWmSurXWH\/CGTI+LogHx4RJbDbCW0zcpQAATPAASWiQTSBClILooL+6pTp93t0mnAgwl5rSaTOwf0WuoS0h29ZoccZaSCGQrihywQl8MFInRKPd\/DeKVIV6veWSFeRjjIkxfsRLEBnXNoK0iQkKZIzoAz\/2FL+dEO53mOr4bWoRe8tg+8ukEVGjzJ6kmZmMkgF2iraKbYx8CAmRxqhejtDmQgXdFEjbYO2EIMR4WiV53tUkLZC64RUig\/gm6C8HPHNRPQT9mTD9NmW8q87siwFvWzQ4wrtBO0CaQWpBEnz+Ekj5IsGUKarEXtpMMG7lxdUtzVX4wvMChDE3tB7NZIFyRldNogKYeA7JyaIcX4cEfgeLHXI+xX6dCTrsCXdTsjJEelsSXW+RLqM5ABxKDOV+IRo0H2wpP\/3yPjFlt+e\/5o7u+N29xy6gr5sqaj5g\/0Fe5CJKaNFMRuJsRBjzMD6iegN3zs+ODEEsVckZUSSRKqEtBDkoZJ\/sqT6wX2ah2dIlSAc0QB1iCAmQxcdu7+vOF59h4ePLlmvv+aoKzTpmOd75enxS8gxj73NbQsH74OwwDcTtjJsY\/jGsWeF2Bn62S0ChIigqmgSqnPQH2fSh6c033+HfHbvMLazBs6\/rGhTZlFqHq0u+d75gmfrFR\/ffEyjJ2w9UeiRSln5jqsHqxlE7\/hg2KrgeyN284D42rHribgbSFc78iv7BnALpmvl6K8JuV2zeznQfNBTvXUfbWtEMtfvBnko2Ljh0y8+5zcnP+XkvGJVNryonOtPrqgeNkRArit8PLDSF3w7EQNgc6L4OrAXE7Ebif1IhJPlVW4c3LLLFctSM3xaKN9swb9Fcqa6uEDqCrLgyxZNHT988oCPnnyF3I7Y04p7R8rZw\/f58vwlviuUYvid4bsCATEK4YFvA3tRsNVErAdivYfdNMtDZG6ZKFQ5s6xq8GDdj6BC\/Q7wy2OaH13OTFU1uqiBTJQRbQLvJ\/b\/XIGPhENYEDuIaRYtDt77bBsWxN7xreHPB\/zZFu4GohhqQRKR34mAKqQsFJz9WDCf80o3gtyO+JkhtaANs9tFgARSgy4r0ukCSQU08P0IGLE3oi\/4\/jBVdxN2M+I3A347zqz0ZbaB4oQdwlUlkWXWkIcRQK6F0KAUJ74S9M9rpM1IVlIYkgtp2RFlTn1tanRZ4\/2EZCEGA43ZMmJO8nBAAypgcMJmEPghaYJZ1HJI7lIABNFAMugicAe2wOfOeLFClw3aZGjBtk5aVERxCJujsU5om7E7A7dDDgIWiMwtwwKKHXakA9uHrSxHBCVsPgSoKqD4GPOO1AUsIHqIj0aG+2u0bcjnC0TAh5gzJhRM0LrG24K2gg2BJMF9dmjv47VTR5lBiR+MlxlUnn\/eBHNg2BUZYhZiciIFbKH8bcN0voScSYsKaUCbBFKwu4Kt9kiroDrHR5pZ8LtC7IIYHHYGQyEmP7D05vrxRv0fXCCiRAiYIAHhjlsQV4Xx8XaeNFESgk0FyQaSCRfsZgRRIBHms\/gbiBHoD9oZHSab23domTj8DzmtyTndp0MuAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/micrus_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022535\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EJak du\u017cy musi by\u0107 framework, aby umo\u017cliwia\u0142 szybkie, \u0142atwe i wygodne tworzenie \u0142adnie uporz\u0105dkowanych stron MVC? Aby by\u0142 \u0142atwo rozszerzalny i konfigurowalny?\u003C\/p\u003E\n\u003Cp\u003ENo w\u0142a\u015bnie wcale nie tak du\u017cy. Wypr\u00f3buj Micrusa! Jego celem jest bycie tak ma\u0142ym, jak to tylko mo\u017cliwe, lecz oferowa\u0107 wszytkie najwa\u017cniejsze funkcjonalno\u015bci:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EZorientowany obiektowo\u003C\/li\u003E\n\u003Cli\u003EPrzejrzysta struktura MVC\u003C\/li\u003E\n\u003Cli\u003EKontener DI\u003C\/li\u003E\n\u003Cli\u003EEvent dispatching\u003C\/li\u003E\n\u003Cli\u003EAgnotyczny wobec ORM, wsparcie dla Doctrine i RedBean\u003C\/li\u003E\n\u003Cli\u003EREST-ful routing\u003C\/li\u003E\n\u003Cli\u003EGenerator CRUD\u003C\/li\u003E\n\u003Cli\u003EAgnostyczny wobec silnik\u00f3w szablon\u00f3w, wsparcie dla Twiga i czystego PHP\u003C\/li\u003E\n\u003Cli\u003EAutentykacja i autoryzacja\u003C\/li\u003E\n\u003Cli\u003E\u0141atwa konfiguracja w YAML-u\u003C\/li\u003E\n\u003Cli\u003ETaki konsolowe dzi\u0119ki Symfony Console\u003C\/li\u003E\n\u003Cli\u003EFormularze\u003C\/li\u003E\n\u003Cli\u003ELocalizacja\u003C\/li\u003E\n\u003Cli\u003ELogowanie z u\u017cyciem Monolog (zgodne z PSR-3)\u003C\/li\u003E\n\u003Cli\u003ECaching (zgodne z PSR-6)\u003C\/li\u003E\n\u003Cli\u003EKomunikaty flash\u003C\/li\u003E\n\u003C\/ul\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["framework","full-stack","micrus","php","plugins","programowanie"],"hasMore":true,"image":"https:\/\/avris.it\/image\/micrus_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/micrus_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/micrus_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022133.75\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EJak du\u017cy musi by\u0107 framework, aby umo\u017cliwia\u0142 szybkie, \u0142atwe i wygodne tworzenie \u0142adnie uporz\u0105dkowanych stron MVC? Aby by\u0142 \u0142atwo rozszerzalny i konfigurowalny?\u003C\/p\u003E\n\u003Cp\u003ENo w\u0142a\u015bnie wcale nie tak du\u017cy. Wypr\u00f3buj Micrusa! Jego celem jest bycie tak ma\u0142ym, jak to tylko mo\u017cliwe, lecz oferowa\u0107 wszytkie najwa\u017cniejsze funkcjonalno\u015bci:\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/micrus_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/micrus_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022133.75\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EJak du\u017cy musi by\u0107 framework, aby umo\u017cliwia\u0142 szybkie, \u0142atwe i wygodne tworzenie \u0142adnie uporz\u0105dkowanych stron MVC? Aby by\u0142 \u0142atwo rozszerzalny i konfigurowalny?\u003C\/p\u003E\n\u003Cp\u003ENo w\u0142a\u015bnie wcale nie tak du\u017cy. Wypr\u00f3buj Micrusa! Jego celem jest bycie tak ma\u0142ym, jak to tylko mo\u017cliwe, lecz oferowa\u0107 wszytkie najwa\u017cniejsze funkcjonalno\u015bci:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EZorientowany obiektowo\u003C\/li\u003E\n\u003Cli\u003EPrzejrzysta struktura MVC\u003C\/li\u003E\n\u003Cli\u003EKontener DI\u003C\/li\u003E\n\u003Cli\u003EEvent dispatching\u003C\/li\u003E\n\u003Cli\u003EAgnotyczny wobec ORM, wsparcie dla Doctrine i RedBean\u003C\/li\u003E\n\u003Cli\u003EREST-ful routing\u003C\/li\u003E\n\u003Cli\u003EGenerator CRUD\u003C\/li\u003E\n\u003Cli\u003EAgnostyczny wobec silnik\u00f3w szablon\u00f3w, wsparcie dla Twiga i czystego PHP\u003C\/li\u003E\n\u003Cli\u003EAutentykacja i autoryzacja\u003C\/li\u003E\n\u003Cli\u003E\u0141atwa konfiguracja w YAML-u\u003C\/li\u003E\n\u003Cli\u003ETaki konsolowe dzi\u0119ki Symfony Console\u003C\/li\u003E\n\u003Cli\u003EFormularze\u003C\/li\u003E\n\u003Cli\u003ELocalizacja\u003C\/li\u003E\n\u003Cli\u003ELogowanie z u\u017cyciem Monolog (zgodne z PSR-3)\u003C\/li\u003E\n\u003Cli\u003ECaching (zgodne z PSR-6)\u003C\/li\u003E\n\u003Cli\u003EKomunikaty flash\u003C\/li\u003E\n\u003C\/ul\u003E","words":118,"readTime":null,"lang":"pl"}}},"projects\/dibsy-call-dibs-on-test-servers":{"key":"projects\/dibsy-call-dibs-on-test-servers","type":"article","published":true,"meta":{"createdAt":"2017-04-28T19:44:08+02:00","publishedAt":"2017-03-09T18:10:00+01:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/dibsy.avris.it","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Dibsy","displayUrl":null}],"category":"projects","subcategory":null,"slug":"dibsy-call-dibs-on-test-servers"},"content":{"en":{"slug":"dibsy-call-dibs-on-test-servers","title":"Dibsy \u2022 Call dibs on test servers!","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/dibsy-call-dibs-on-test-servers_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022267.99007444169\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFTUlEQVRIib2WW2wc1RnHf3NmZndmZ3Z39jKOTZx1HBtEgChpGhUkRNuIWxEICQnxgvpQcZEiHoN4ASEhbpVQHxDQqJCiAhJvKFLUh6goFbQWIQWa5iYShyhOYnvtXdu7Xq\/3Mjszpw\/ubHZrV9Cq8L3M\/8x85\/v++p\/\/6DtIKWUYhjKKc+fOyUplSc7MzMhOp9N935sT4d7nf4Pr9br0PE9+PvEXGQRBX44WhiEAUkoAlpeXGRoaIggC\/CBACEEUUU4v3ujdt+EgCAjDENnTO8pRPM+7lv1vm3+oUBSlizUpJYqidIlomsbk+fNsKRQQQhCGIWEYkkgkUFW1Szra07v3f8Ge5\/WJoG3EstFsUpqfR9V1Ws0muh5jaCjWJfR9haIoaBGRXpaDDgSrl9HkKjEtTsdPUCs3mZy6yldfHqVTrDJXrDN6xy6EKrDsJGJyjNmvS+uajN65hYN\/OrQhgT+8+xK6rvYfWS+7KCZe38\/mEZUQiS7iLM63aYcSOXIXk59+hu5YFFtNLh47Q9qzSW8aY\/iSw6VjRXY8eD2nD1\/o1optTnDoj18B8KOd46w2WkxemAbgnU6Arvervs5DAFdqcS5\/WWXbtgTzxXkGC2m8mVni4x22511OFuKM13XsWZ0pf5WVpVnSqTRuts3efbcyN1Ht1kqYNsJ0Afjp3tuZm6\/wzXQ7UmHd6WyokEj4KMLg9NkSO7YPYLZ9On5Iq2Pz9Q6bxeYSNU3SWpzGCASOnSdtOrSyIbqm42bzRC1M00Y18mt1NRtFD7pruNYz4rChhzI0aKgmm4eH+eIfU5iGSj7QcP0Gwdk25uxFpmshSSfGfFBjwPJJJiw8JwQFfvbiLooTVUrHqxiGiTCyAARKHCmurSOFvtVDx8oGjUqRhWIREYTU2yFBLMGjN9eY+tsZ4nmDgqiglDvk0wa18zOcvOk4ZWOBI7\/6CN8P1gpJ2F3bw9imBRqNJr89cKJPEWQAfAcP3fPAvVSWllBCn1CC0DWshEl2fA\/Lt2xltd1CqDr4bcIQ0qkc6WWDqgnDN7h9DQo7h7h79e41dt1jkoBCPBZbdzobKvT3T97E91rkNm2j1axRqxQBsI39vDx5iqxh4RgWV2oL+GHIVmeAwuEpJv76GVtHCwC0W22mZ4rs27efD983GByyKJcaKEIhkzEolxo8\/2yIaV4bTf\/RQ\/lcmszATu566DnarRWOHz3IlW8+RyYt1Hyet37xOItegxvTLvceeh01lUFQwjIGePKJfTz8yP289usDvPP2B2jCJGPlePrpW5n4dAY7qTO8Jcnv3jiFwnf0UC6fIu3YJOwMppXCyaRoummqSRvNdVHicZKqQlMVaK6LajkILFoNnVdeOMiP9+zi3bcPo5JeI2S7fHx4gV8+sR0zofHaC2fJ2G5fzyhE79SOcC6XxnGSeM0ylfnTjIzvxHUd4raF6rqIeJyjzTJSU1FdFzWbRVUsVCWFqiQB7V84haokyFoui1fjDA6mEDKGv2KTtdyuQlFvKeXGCl0sxqmdO8+JC+8RBh7V0hmkDDDzS4wsLvHepUNMlK5w2coj6mXCdAbLFoyOZZmZnuPZZ14llHUAAllDmCfQdZXfvHySymKT5WZnjQi7gH4Pda8fvdP+z0c+oNGo4bVbgIKmaShCYI\/t5lR1mSAIWPXa3UKZhEV+2qdcWmJlpU4Q\/fbAT27bzdxVH1VV8No+nud3vz321J0oQvaJse4+FE30Tz4+woe\/P0DcMHCyOe5\/6BFuu+PnCCH+79ePvimxkYcA9t5zH4Wx66mvNrhuZBQnm+P7il4P\/RPX9wASIcw\/nwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/dibsy-call-dibs-on-test-servers_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022267.99007444169\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EDibsy helps team members to coordinate, which qa\/staging server is currently being used by whom, and which ones are free to deploy to.\u003C\/p\u003E\n\u003Cp\u003EDeveloped as a 20% project @ \u003Ca href=\u0022https:\/\/www.rocket-internet.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Rocket Internet SE\u003C\/a\u003E\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/dibsy-call-dibs-on-test-servers_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022535.98014888337\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFTUlEQVRIib2WW2wc1RnHf3NmZndmZ3Z39jKOTZx1HBtEgChpGhUkRNuIWxEICQnxgvpQcZEiHoN4ASEhbpVQHxDQqJCiAhJvKFLUh6goFbQWIQWa5iYShyhOYnvtXdu7Xq\/3Mjszpw\/ubHZrV9Cq8L3M\/8x85\/v++p\/\/6DtIKWUYhjKKc+fOyUplSc7MzMhOp9N935sT4d7nf4Pr9br0PE9+PvEXGQRBX44WhiEAUkoAlpeXGRoaIggC\/CBACEEUUU4v3ujdt+EgCAjDENnTO8pRPM+7lv1vm3+oUBSlizUpJYqidIlomsbk+fNsKRQQQhCGIWEYkkgkUFW1Szra07v3f8Ge5\/WJoG3EstFsUpqfR9V1Ws0muh5jaCjWJfR9haIoaBGRXpaDDgSrl9HkKjEtTsdPUCs3mZy6yldfHqVTrDJXrDN6xy6EKrDsJGJyjNmvS+uajN65hYN\/OrQhgT+8+xK6rvYfWS+7KCZe38\/mEZUQiS7iLM63aYcSOXIXk59+hu5YFFtNLh47Q9qzSW8aY\/iSw6VjRXY8eD2nD1\/o1optTnDoj18B8KOd46w2WkxemAbgnU6Arvervs5DAFdqcS5\/WWXbtgTzxXkGC2m8mVni4x22511OFuKM13XsWZ0pf5WVpVnSqTRuts3efbcyN1Ht1kqYNsJ0Afjp3tuZm6\/wzXQ7UmHd6WyokEj4KMLg9NkSO7YPYLZ9On5Iq2Pz9Q6bxeYSNU3SWpzGCASOnSdtOrSyIbqm42bzRC1M00Y18mt1NRtFD7pruNYz4rChhzI0aKgmm4eH+eIfU5iGSj7QcP0Gwdk25uxFpmshSSfGfFBjwPJJJiw8JwQFfvbiLooTVUrHqxiGiTCyAARKHCmurSOFvtVDx8oGjUqRhWIREYTU2yFBLMGjN9eY+tsZ4nmDgqiglDvk0wa18zOcvOk4ZWOBI7\/6CN8P1gpJ2F3bw9imBRqNJr89cKJPEWQAfAcP3fPAvVSWllBCn1CC0DWshEl2fA\/Lt2xltd1CqDr4bcIQ0qkc6WWDqgnDN7h9DQo7h7h79e41dt1jkoBCPBZbdzobKvT3T97E91rkNm2j1axRqxQBsI39vDx5iqxh4RgWV2oL+GHIVmeAwuEpJv76GVtHCwC0W22mZ4rs27efD983GByyKJcaKEIhkzEolxo8\/2yIaV4bTf\/RQ\/lcmszATu566DnarRWOHz3IlW8+RyYt1Hyet37xOItegxvTLvceeh01lUFQwjIGePKJfTz8yP289usDvPP2B2jCJGPlePrpW5n4dAY7qTO8Jcnv3jiFwnf0UC6fIu3YJOwMppXCyaRoummqSRvNdVHicZKqQlMVaK6LajkILFoNnVdeOMiP9+zi3bcPo5JeI2S7fHx4gV8+sR0zofHaC2fJ2G5fzyhE79SOcC6XxnGSeM0ylfnTjIzvxHUd4raF6rqIeJyjzTJSU1FdFzWbRVUsVCWFqiQB7V84haokyFoui1fjDA6mEDKGv2KTtdyuQlFvKeXGCl0sxqmdO8+JC+8RBh7V0hmkDDDzS4wsLvHepUNMlK5w2coj6mXCdAbLFoyOZZmZnuPZZ14llHUAAllDmCfQdZXfvHySymKT5WZnjQi7gH4Pda8fvdP+z0c+oNGo4bVbgIKmaShCYI\/t5lR1mSAIWPXa3UKZhEV+2qdcWmJlpU4Q\/fbAT27bzdxVH1VV8No+nud3vz321J0oQvaJse4+FE30Tz4+woe\/P0DcMHCyOe5\/6BFuu+PnCCH+79ePvimxkYcA9t5zH4Wx66mvNrhuZBQnm+P7il4P\/RPX9wASIcw\/nwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/dibsy-call-dibs-on-test-servers_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022535.98014888337\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EDibsy helps team members to coordinate, which qa\/staging server is currently being used by whom, and which ones are free to deploy to.\u003C\/p\u003E\n\u003Cp\u003EDeveloped as a 20% project @ \u003Ca href=\u0022https:\/\/www.rocket-internet.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Rocket Internet SE\u003C\/a\u003E\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["cooperation","coordination","dibs","micrus","php","server","social login","websockets"],"hasMore":false,"image":"https:\/\/avris.it\/image\/dibsy-call-dibs-on-test-servers_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/dibsy-call-dibs-on-test-servers_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/dibsy-call-dibs-on-test-servers_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022133.99503722084\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EDibsy helps team members to coordinate, which qa\/staging server is currently being used by whom, and which ones are free to deploy to.\u003C\/p\u003E\n\u003Cp\u003EDeveloped as a 20% project @ \u003Ca href=\u0022https:\/\/www.rocket-internet.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Rocket Internet SE\u003C\/a\u003E\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/dibsy-call-dibs-on-test-servers_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/dibsy-call-dibs-on-test-servers_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022133.99503722084\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EDibsy helps team members to coordinate, which qa\/staging server is currently being used by whom, and which ones are free to deploy to.\u003C\/p\u003E\n\u003Cp\u003EDeveloped as a 20% project @ \u003Ca href=\u0022https:\/\/www.rocket-internet.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Rocket Internet SE\u003C\/a\u003E\u003C\/p\u003E","words":31,"readTime":null,"lang":"en"}}},"projects\/avris-flags-flags-on-websites-made-easy":{"key":"projects\/avris-flags-flags-on-websites-made-easy","type":"article","published":true,"meta":{"createdAt":"2017-04-28T19:43:48+02:00","publishedAt":"2017-01-26T18:18:00+01:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/flags.avris.it","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Flags","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-flags-flags-on-websites-made-easy"},"content":{"en":{"slug":"avris-flags-flags-on-websites-made-easy","title":"Avris Flags \u2013 flags on websites made easy","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-flags-flags-on-websites-made-easy_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022274.28571428571\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADWElEQVRIicWWz24cRRDGf\/1vZpb1rL3eXQdsE8niQOAByAFxBIlX4Yl4Dm6cuPgMgkNkKRKKYxwgbLwmrO2Znu4uDrNe1n\/WThxZfFJL09PV01XfV101ynsvxhiUUqSUEBGstQCICEqp+TOAUmr+fnH9HJfXLtuklBbmAlzcb\/f29ng1HjPa2CDGgIiiqioeP\/6M+0BdV8QQUEqTUkRrg4iQUmKlLFHee7mXk+8IDaC1ng8RuTIu4\/zdxbWL9tfbXL9\/0cYC7O\/vE2NiNBrS7XZ59udvaKXJrGvzCiHEyMONTcavJ5xWp+Q2I0kCFM5aYor0yzUy696JIeW9F+fcPPnOE\/v\/QIyxZWgRSim01sDFG3M+P5f1rrfsJptrHVrE7u4u1lpCCPT7fQ4PD1ldXWWw3mewvo42hpQSxhi8r1EoXJYRmoYkiSzLCSHQW13DuTeT8opkixEdnwYyCaA1vonYzPLy5YSdrQIwpHCK6BymAbO6BpeY+I9VxWK9WcaQ9345QyLCt9\/\/gnv+B4+GGdtF4sfeQ\/afPOXLT58ykEBTjKjih2z9\/B0rX39D7+NHS6S66uidGLrP5H5rhgB8XXP44neQRBLIMkun02U4HLxzUi919DaG6qpicnxM3TQY1dacJkaiBafNrE61PWpr9D5aa2JMGLNwG4EYA9a08Wut78YQQBMC4\/GYKjV8tLND5WvyosCgaWqPwaC1wVjF5OgImfVLEcEYQ9MEUGBN27PKXo9OUdyNoZOTE14cHIDSaKVIszrUzwr0ZIrvd\/n77JSNBw8oy3KmRwKt20aOoGZ\/Em8iq\/f+ZodSStSvJpDaj5MERIhNwK68h9QeSa0DSmaHO4v\/Z4otCkwnR3c7KKXmY87EXSSrqoqDX5+1wcZIEMFpTUqCaBiYAlfkPPnpBza\/+ApjDMormtiQBwhHU+SolU5rTVXVjEZDer3e0jNvdEgphVkrKToFIURc5iAltLGcnZ3R397G5Rmff9JHuRFwNeq3vWU3OpTnOYPRkNfTKcZZ6rpGBIZGUWvN0fGkTVzf4NxfxJSIIeCynBgDoEiSMNqQUuSDzc1bS+StDGV5xvHzCWW3S1EFtLNUVuivrxNCJKVI0ekQY6QoCkIIlGVJlmVLGboJ\/wIrt158LmOnzAAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-flags-flags-on-websites-made-easy_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022274.28571428571\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003EFlags on websites made easy.\u003C\/em\u003E\u003C\/p\u003E\n\u003Cp\u003EInlude country flags in your websites using simple CSS classes.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-flags-flags-on-websites-made-easy_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022700\u0022 height=\u0022400\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADWElEQVRIicWWz24cRRDGf\/1vZpb1rL3eXQdsE8niQOAByAFxBIlX4Yl4Dm6cuPgMgkNkKRKKYxwgbLwmrO2Znu4uDrNe1n\/WThxZfFJL09PV01XfV101ynsvxhiUUqSUEBGstQCICEqp+TOAUmr+fnH9HJfXLtuklBbmAlzcb\/f29ng1HjPa2CDGgIiiqioeP\/6M+0BdV8QQUEqTUkRrg4iQUmKlLFHee7mXk+8IDaC1ng8RuTIu4\/zdxbWL9tfbXL9\/0cYC7O\/vE2NiNBrS7XZ59udvaKXJrGvzCiHEyMONTcavJ5xWp+Q2I0kCFM5aYor0yzUy696JIeW9F+fcPPnOE\/v\/QIyxZWgRSim01sDFG3M+P5f1rrfsJptrHVrE7u4u1lpCCPT7fQ4PD1ldXWWw3mewvo42hpQSxhi8r1EoXJYRmoYkiSzLCSHQW13DuTeT8opkixEdnwYyCaA1vonYzPLy5YSdrQIwpHCK6BymAbO6BpeY+I9VxWK9WcaQ9345QyLCt9\/\/gnv+B4+GGdtF4sfeQ\/afPOXLT58ykEBTjKjih2z9\/B0rX39D7+NHS6S66uidGLrP5H5rhgB8XXP44neQRBLIMkun02U4HLxzUi919DaG6qpicnxM3TQY1dacJkaiBafNrE61PWpr9D5aa2JMGLNwG4EYA9a08Wut78YQQBMC4\/GYKjV8tLND5WvyosCgaWqPwaC1wVjF5OgImfVLEcEYQ9MEUGBN27PKXo9OUdyNoZOTE14cHIDSaKVIszrUzwr0ZIrvd\/n77JSNBw8oy3KmRwKt20aOoGZ\/Em8iq\/f+ZodSStSvJpDaj5MERIhNwK68h9QeSa0DSmaHO4v\/Z4otCkwnR3c7KKXmY87EXSSrqoqDX5+1wcZIEMFpTUqCaBiYAlfkPPnpBza\/+ApjDMormtiQBwhHU+SolU5rTVXVjEZDer3e0jNvdEgphVkrKToFIURc5iAltLGcnZ3R397G5Rmff9JHuRFwNeq3vWU3OpTnOYPRkNfTKcZZ6rpGBIZGUWvN0fGkTVzf4NxfxJSIIeCynBgDoEiSMNqQUuSDzc1bS+StDGV5xvHzCWW3S1EFtLNUVuivrxNCJKVI0ekQY6QoCkIIlGVJlmVLGboJ\/wIrt158LmOnzAAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-flags-flags-on-websites-made-easy_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022700\u0022 height=\u0022400\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003EFlags on websites made easy.\u003C\/em\u003E\u003C\/p\u003E\n\u003Cp\u003EInlude country flags in your websites using simple CSS classes.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["css","flags","html","javascript","plain css"],"hasMore":false,"image":"https:\/\/avris.it\/image\/avris-flags-flags-on-websites-made-easy_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-flags-flags-on-websites-made-easy_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-flags-flags-on-websites-made-easy_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022137.14285714286\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003EFlags on websites made easy.\u003C\/em\u003E\u003C\/p\u003E\n\u003Cp\u003EInlude country flags in your websites using simple CSS classes.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-flags-flags-on-websites-made-easy_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-flags-flags-on-websites-made-easy_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022137.14285714286\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cem\u003EFlags on websites made easy.\u003C\/em\u003E\u003C\/p\u003E\n\u003Cp\u003EInlude country flags in your websites using simple CSS classes.\u003C\/p\u003E","words":15,"readTime":null,"lang":"en"}}},"projects\/avi-simple-placeholder-avatars":{"key":"projects\/avi-simple-placeholder-avatars","type":"article","published":true,"meta":{"createdAt":"2017-04-28T19:44:05+02:00","publishedAt":"2016-12-30T18:43:00+01:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/avi.avris.it","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Avi","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avi-simple-placeholder-avatars"},"content":{"en":{"slug":"avi-simple-placeholder-avatars","title":"Avi \u2022 Simple placeholder avatars","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avi-new_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022316\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACzElEQVRIib2Wu3IjVRCGvz6XmfHu4hvrMhkpkSNT1FJFsC9BxhtQvAAxAQHPCMHmrHGNR3NuTXBGkrXWSLLA+1epdGZa6v77fuT23XtlBt1JizGWh\/4BUEAmydz5v8OpzPLBWsvZ6SnOWUTM6r2qIsCwWJBzRkSQidqSYEzxOEJoVSUioKAoTAZiTAzDgDEGQRAjaCnVpBjevH6FKogIqmX6rrQ+3v1DKfPOzhJ6993tUZ68FKTscCPGyGKxIKXMxcX5ZyHkVswehXuJUgoPDwPGGj7e3eG9B11XSts0eO+3lvWfH\/4ipMjl6QVXl283ZCL116r65Lw3QilnTrru2Z7+8MuPfPnFOd9+c8OvP\/188P\/cLqG1FrZEbhuWni5xdXPD12+\/4s3F1cFkYE8NpZQopdA0zV5FOZfaoRM+3P9NLIWztuOye700hzEGa45MmaqScsa7nYGkqNL3A2MYgToCVMGYddS67gTF0rUeb+d1SQhxllCIAWtsTd1ngsulzAr7fmAYBkC5vr7+\/6zu2ECyGMN8ynJBhwhG6gdAp0rJkyPWAIqoVIWd389n2QBbCLmZ92vjY0S8Q175yTiEcaQf+2m\/Kd55mrahlAJjoWvbvaQAJh82zg42h9qnA06cnSK0Xq5ihNbXzrMIiOD2FP6hqCmbCdEh8+cooztStrPth8WCMI7kXDDGcH5+9iIEH8N9OmE3hNYQRTBGsNY8mcYvQmiXsKZMMNaDCPf396s0LmeTqmKMoZSC9w3WmjpQU6Lrumc7YdaGH5OoWN4DVetqiDFSSiGl9GRYigjjuCCEelPspoWsqrP6t51F91RuSom+7+sOshYRUBVEapRyzqtrbL09VnLee8zUmSEE2rZdPe+C++33P2aF63vy+vnQ7X8s5Pb797pt6wI452iaBkHJueC8I6WMMUIpSts0hBgJIZBz3kz3I+LPOf8L0k9\/atxDHsEAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avi-new_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022316\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EFree \u0026amp; simple API for generating nice, colorful default avatars based on a given string (like username or email). Just put your base64-encoded identifier after our URL, optionally specify the desired size and file format, et voil\u00e0!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avi-new_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022632\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACzElEQVRIib2Wu3IjVRCGvz6XmfHu4hvrMhkpkSNT1FJFsC9BxhtQvAAxAQHPCMHmrHGNR3NuTXBGkrXWSLLA+1epdGZa6v77fuT23XtlBt1JizGWh\/4BUEAmydz5v8OpzPLBWsvZ6SnOWUTM6r2qIsCwWJBzRkSQidqSYEzxOEJoVSUioKAoTAZiTAzDgDEGQRAjaCnVpBjevH6FKogIqmX6rrQ+3v1DKfPOzhJ6993tUZ68FKTscCPGyGKxIKXMxcX5ZyHkVswehXuJUgoPDwPGGj7e3eG9B11XSts0eO+3lvWfH\/4ipMjl6QVXl283ZCL116r65Lw3QilnTrru2Z7+8MuPfPnFOd9+c8OvP\/188P\/cLqG1FrZEbhuWni5xdXPD12+\/4s3F1cFkYE8NpZQopdA0zV5FOZfaoRM+3P9NLIWztuOye700hzEGa45MmaqScsa7nYGkqNL3A2MYgToCVMGYddS67gTF0rUeb+d1SQhxllCIAWtsTd1ngsulzAr7fmAYBkC5vr7+\/6zu2ECyGMN8ynJBhwhG6gdAp0rJkyPWAIqoVIWd389n2QBbCLmZ92vjY0S8Q175yTiEcaQf+2m\/Kd55mrahlAJjoWvbvaQAJh82zg42h9qnA06cnSK0Xq5ihNbXzrMIiOD2FP6hqCmbCdEh8+cooztStrPth8WCMI7kXDDGcH5+9iIEH8N9OmE3hNYQRTBGsNY8mcYvQmiXsKZMMNaDCPf396s0LmeTqmKMoZSC9w3WmjpQU6Lrumc7YdaGH5OoWN4DVetqiDFSSiGl9GRYigjjuCCEelPspoWsqrP6t51F91RuSom+7+sOshYRUBVEapRyzqtrbL09VnLee8zUmSEE2rZdPe+C++33P2aF63vy+vnQ7X8s5Pb797pt6wI452iaBkHJueC8I6WMMUIpSts0hBgJIZBz3kz3I+LPOf8L0k9\/atxDHsEAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avi-new_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022632\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EFree \u0026amp; simple API for generating nice, colorful default avatars based on a given string (like username or email). Just put your base64-encoded identifier after our URL, optionally specify the desired size and file format, et voil\u00e0!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["api","avatar","colour","free","generate","generator","image","initial","placeholder","random"],"hasMore":false,"image":"https:\/\/avris.it\/image\/avi-new_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avi-new_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avi-new_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022158\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EFree \u0026amp; simple API for generating nice, colorful default avatars based on a given string (like username or email). Just put your base64-encoded identifier after our URL, optionally specify the desired size and file format, et voil\u00e0!\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avi-new_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avi-new_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022158\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EFree \u0026amp; simple API for generating nice, colorful default avatars based on a given string (like username or email). Just put your base64-encoded identifier after our URL, optionally specify the desired size and file format, et voil\u00e0!\u003C\/p\u003E","words":38,"readTime":null,"lang":"en"}}},"projects\/volatile-die-einfachste-weise-bilder-zu-schicken":{"key":"projects\/volatile-die-einfachste-weise-bilder-zu-schicken","type":"article","published":true,"meta":{"createdAt":"2017-04-28T19:44:01+02:00","publishedAt":"2016-11-06T16:43:00+01:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/volatile.avris.it\/","displayUrl":null}],"category":"projects","subcategory":null,"slug":"volatile-die-einfachste-weise-bilder-zu-schicken"},"content":{"de":{"slug":"volatile-die-einfachste-weise-bilder-zu-schicken","title":"Volatile \u2013 Die einfachste Weise, Bilder zu schicken","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/volatile-die-einfachste-weise-bilder-zu-schicken_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320.22857142857\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGFElEQVRIiX2WS28dWRHHf1V1+r78zDsTQRBILBFIIA0SguV8CJYs2CA+CUuWfAZWsGcLw46JGDEPmAlhEic2duz76u5zqlicvtfXzoiWrk5VS+3z87+e8vsPT0JFUAFBEKH+Njb1EQCRrX\/7iZ0zoloR174DHoEHwy\/wCIpDiSB70HuQ7u9bhRkuuz6vIbZA1+47IMQOVNyECypIBaugG7gSgTvkCIoH6Xi6UeVdoA3GjrmjkOwAbbHegYGqTgQ3FQu5oVgJcIe0P+aWIsEmMCJxE+rrtfnaN7FVbSd0GzuCYDeENXzuQdqzAkPOMCh0rcptPXY82bkVuYUXN8IXQzyrOrE9fQu8AXLSTNYVZpuwW6neVeV2Au24W7bbQJugygYmtu9DYvtu46e9\/Ha4SLbnbv7sAv6\/55plR6vBjqgBI3btCkP4zukkaU9AdEgifQfu+tyF25WoXiTXMdleSDhEIHHTx32wN36pthfSR3\/5GFUFhJEZZkrnQUqJ4j5UnSBqt\/JLUbnOkVwqiIoQEbR9vWTzjXvgJeMlyKVQimMKSaCUQik9AqQ\/\/W3KWIX5Ys5ydYmpMh6PUYRHBxNmybm6POP+\/SfkdsGLN28IlNnePscHx+Qi9O2aiSkn52d8+I9nHO\/vc3j0kILy2Vf\/4uk3f0D2wriZkvslKSWa0QREmS+WLNsWj6CxhLz\/k1\/G8d6Mw70pd\/f3GZux7nquViuu5ldcXZ5xcfo5Tw+Dq9UFq6ycXMxJzYiDRvjFT3\/E+9+5w7N\/n\/LHj1\/z9Bv3+PT5CaeXS4JgsVqwXM85ny\/54fd+zAcf\/Jy\/f\/IRz798hjPhyaMnvHfvAcaYs\/NT5Le\/+UO4O7k4AGZGMqshUqUUp2vX4B2TsTB\/+5a+bUml5a71\/Oz7j\/jy1Yo\/f37O4\/fuUvpM2wWj0ZTZ3piXJ2csF+f46oTFxX\/466evWPYdyQLBeXp\/wsWix5oRufTIr379uy1Qk9IAlZiOxhzMJswmY0ZNYtwYjSkqSjLBpCayBBSg96DNTlec4lH\/kVxnlKkwGxkajpeCSM27qRUO9gwNuFw5AaRvP34MyDaxEcFEdioFyEHvhSx+a9heV5uaYmbMxiPUdPupR9D2TvFa3oWCqGAqrD1YLxwZmmIuhfTF8zcQgUfBvVBKRsKG\/rFCmCAqiAgea0ajKUJTG6kI7sNlg7LNaISZIVZDnsxomoSIEOEQ0JhUiJLJfU8M1UwU0qvnnxDu5NLzre8eEO7M5z1RhMOjEYvFCUpiPDWKdyQ7Qg1OXzoqiewFd6+tH1BNiCXEGnIEgYIamhrGozFH+1MO9yZMkpJSwkzpc6HrM10OUqwvcC\/gTmkVs4aDvdpLItZMp8H9B8e8fnnJnQcH3L13yD8\/e4GlCRJGI4qnRJ97JGIY0oGXlqQJD6dt10hvqPcsKHTrFaoyNFKnlIKXGqF05+hOlb1kVheCe2Z2OCZcaduOuw+PePnFgjRJnH6Vef3ivxzfu8Py0knNlFIyhGOaiAhEqyJ1PioqgqUEAbnvuFwv8FIongkvGKBARAHPJG2mNMMfy6Vn3V+yvnpJ0hleglcnc1btArkyRjaj8zVvzpzpbMR8LjQTYT6fM5nss1xfEGXCuHlIUPMrdkaMl0zOHeFOeME9YwKNWa0Pz6TV4vLGeBIP8pVSZAkhiDqUIMi0MccSJAfWBXOjLAoznRF9QfuGrmtp27O6lHlQvFC8bDc038ytCMDraquCiiDhpPX8rIKIbAejDZN6s1snUUQEFSX6Wl2WG9QSIrpdtBpraFNH27d4zpSS6XNPzv2NKX+9PQUSTpGoSyJB6pbniGoVNXxnja0fqggiVvuUGqYJVUMlY9JgmoYtQXERxpLoFLpk9NnoTavfryml1FyJ2G6p4XWwhheCIOXuClXbbsjbShGGBskwRgzRVPtLGOIGRXGp\/QYxVJSG2slHomQxeoWclDwa4eGIgKpiqugghHum79f0fUvquwWNJZJq3aGHvWW7+IvQ6AglYQRGoFFQFPGqDKFDrQy6itKIkVQYqVJC8Eh1ClhD04xpmqYqrUIQNbx9y\/8AxTEHhHzEX5kAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/volatile-die-einfachste-weise-bilder-zu-schicken_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320.22857142857\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ENicht alle Kommunikationsprogramme unterst\u00fctzen Bilderaussand. In diesem Fall, kannst Du sie einfach hier hochladen und dem Gespr\u00e4chspartner den generierten Link schicken. Du kannst sicher sein, dass sie pl\u00f6tzlich nach dem Zugang gel\u00f6scht werden!\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EUpdate\u003C\/strong\u003E: Dieses Projekt ist nicht mehr unterst\u00fctzt und wurde von \u003Ca href=\u0022\/projects\/showr\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-cogs\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E showr.link\u003C\/a\u003E ersetzt.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/volatile-die-einfachste-weise-bilder-zu-schicken_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022700\u0022 height=\u0022467\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGFElEQVRIiX2WS28dWRHHf1V1+r78zDsTQRBILBFIIA0SguV8CJYs2CA+CUuWfAZWsGcLw46JGDEPmAlhEic2duz76u5zqlicvtfXzoiWrk5VS+3z87+e8vsPT0JFUAFBEKH+Njb1EQCRrX\/7iZ0zoloR174DHoEHwy\/wCIpDiSB70HuQ7u9bhRkuuz6vIbZA1+47IMQOVNyECypIBaugG7gSgTvkCIoH6Xi6UeVdoA3GjrmjkOwAbbHegYGqTgQ3FQu5oVgJcIe0P+aWIsEmMCJxE+rrtfnaN7FVbSd0GzuCYDeENXzuQdqzAkPOMCh0rcptPXY82bkVuYUXN8IXQzyrOrE9fQu8AXLSTNYVZpuwW6neVeV2Au24W7bbQJugygYmtu9DYvtu46e9\/Ha4SLbnbv7sAv6\/55plR6vBjqgBI3btCkP4zukkaU9AdEgifQfu+tyF25WoXiTXMdleSDhEIHHTx32wN36pthfSR3\/5GFUFhJEZZkrnQUqJ4j5UnSBqt\/JLUbnOkVwqiIoQEbR9vWTzjXvgJeMlyKVQimMKSaCUQik9AqQ\/\/W3KWIX5Ys5ydYmpMh6PUYRHBxNmybm6POP+\/SfkdsGLN28IlNnePscHx+Qi9O2aiSkn52d8+I9nHO\/vc3j0kILy2Vf\/4uk3f0D2wriZkvslKSWa0QREmS+WLNsWj6CxhLz\/k1\/G8d6Mw70pd\/f3GZux7nquViuu5ldcXZ5xcfo5Tw+Dq9UFq6ycXMxJzYiDRvjFT3\/E+9+5w7N\/n\/LHj1\/z9Bv3+PT5CaeXS4JgsVqwXM85ny\/54fd+zAcf\/Jy\/f\/IRz798hjPhyaMnvHfvAcaYs\/NT5Le\/+UO4O7k4AGZGMqshUqUUp2vX4B2TsTB\/+5a+bUml5a71\/Oz7j\/jy1Yo\/f37O4\/fuUvpM2wWj0ZTZ3piXJ2csF+f46oTFxX\/466evWPYdyQLBeXp\/wsWix5oRufTIr379uy1Qk9IAlZiOxhzMJswmY0ZNYtwYjSkqSjLBpCayBBSg96DNTlec4lH\/kVxnlKkwGxkajpeCSM27qRUO9gwNuFw5AaRvP34MyDaxEcFEdioFyEHvhSx+a9heV5uaYmbMxiPUdPupR9D2TvFa3oWCqGAqrD1YLxwZmmIuhfTF8zcQgUfBvVBKRsKG\/rFCmCAqiAgea0ajKUJTG6kI7sNlg7LNaISZIVZDnsxomoSIEOEQ0JhUiJLJfU8M1UwU0qvnnxDu5NLzre8eEO7M5z1RhMOjEYvFCUpiPDWKdyQ7Qg1OXzoqiewFd6+tH1BNiCXEGnIEgYIamhrGozFH+1MO9yZMkpJSwkzpc6HrM10OUqwvcC\/gTmkVs4aDvdpLItZMp8H9B8e8fnnJnQcH3L13yD8\/e4GlCRJGI4qnRJ97JGIY0oGXlqQJD6dt10hvqPcsKHTrFaoyNFKnlIKXGqF05+hOlb1kVheCe2Z2OCZcaduOuw+PePnFgjRJnH6Vef3ivxzfu8Py0knNlFIyhGOaiAhEqyJ1PioqgqUEAbnvuFwv8FIongkvGKBARAHPJG2mNMMfy6Vn3V+yvnpJ0hleglcnc1btArkyRjaj8zVvzpzpbMR8LjQTYT6fM5nss1xfEGXCuHlIUPMrdkaMl0zOHeFOeME9YwKNWa0Pz6TV4vLGeBIP8pVSZAkhiDqUIMi0MccSJAfWBXOjLAoznRF9QfuGrmtp27O6lHlQvFC8bDc038ytCMDraquCiiDhpPX8rIKIbAejDZN6s1snUUQEFSX6Wl2WG9QSIrpdtBpraFNH27d4zpSS6XNPzv2NKX+9PQUSTpGoSyJB6pbniGoVNXxnja0fqggiVvuUGqYJVUMlY9JgmoYtQXERxpLoFLpk9NnoTavfryml1FyJ2G6p4XWwhheCIOXuClXbbsjbShGGBskwRgzRVPtLGOIGRXGp\/QYxVJSG2slHomQxeoWclDwa4eGIgKpiqugghHum79f0fUvquwWNJZJq3aGHvWW7+IvQ6AglYQRGoFFQFPGqDKFDrQy6itKIkVQYqVJC8Eh1ClhD04xpmqYqrUIQNbx9y\/8AxTEHhHzEX5kAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/volatile-die-einfachste-weise-bilder-zu-schicken_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022700\u0022 height=\u0022467\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ENicht alle Kommunikationsprogramme unterst\u00fctzen Bilderaussand. In diesem Fall, kannst Du sie einfach hier hochladen und dem Gespr\u00e4chspartner den generierten Link schicken. Du kannst sicher sein, dass sie pl\u00f6tzlich nach dem Zugang gel\u00f6scht werden!\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EUpdate\u003C\/strong\u003E: Dieses Projekt ist nicht mehr unterst\u00fctzt und wurde von \u003Ca href=\u0022\/projects\/showr\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-cogs\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E showr.link\u003C\/a\u003E ersetzt.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["bild","bilder","er\u00f6ffnungslimit","kurze zeit","l\u00f6schen","schicken","selbstzerst\u00f6rung","senden","teilen","ver\u00f6ffentlicht","vor\u00fcbergehend"],"hasMore":false,"image":"https:\/\/avris.it\/image\/volatile-die-einfachste-weise-bilder-zu-schicken_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/volatile-die-einfachste-weise-bilder-zu-schicken_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/volatile-die-einfachste-weise-bilder-zu-schicken_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160.11428571429\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ENicht alle Kommunikationsprogramme unterst\u00fctzen Bilderaussand. In diesem Fall, kannst Du sie einfach hier hochladen und dem Gespr\u00e4chspartner den generierten Link schicken. Du kannst sicher sein, dass sie pl\u00f6tzlich nach dem Zugang gel\u00f6scht werden!\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EUpdate\u003C\/strong\u003E: Dieses Projekt ist nicht mehr unterst\u00fctzt und wurde von \u003Ca href=\u0022\/projects\/showr.lite\u0022\u003E showr.link\u003C\/a\u003E ersetzt.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/volatile-die-einfachste-weise-bilder-zu-schicken_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/volatile-die-einfachste-weise-bilder-zu-schicken_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160.11428571429\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ENicht alle Kommunikationsprogramme unterst\u00fctzen Bilderaussand. In diesem Fall, kannst Du sie einfach hier hochladen und dem Gespr\u00e4chspartner den generierten Link schicken. Du kannst sicher sein, dass sie pl\u00f6tzlich nach dem Zugang gel\u00f6scht werden!\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EUpdate\u003C\/strong\u003E: Dieses Projekt ist nicht mehr unterst\u00fctzt und wurde von \u003Ca href=\u0022\/projects\/showr.lite\u0022\u003E showr.link\u003C\/a\u003E ersetzt.\u003C\/p\u003E","words":51,"readTime":null,"lang":"de"},"en":{"slug":"volatile-the-easiest-way-to-send-pics","title":"Volatile \u2013 The easiest way to send pics","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/volatile-the-easiest-way-to-send-pics_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320.22857142857\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGFElEQVRIiX2WS28dWRHHf1V1+r78zDsTQRBILBFIIA0SguV8CJYs2CA+CUuWfAZWsGcLw46JGDEPmAlhEic2duz76u5zqlicvtfXzoiWrk5VS+3z87+e8vsPT0JFUAFBEKH+Njb1EQCRrX\/7iZ0zoloR174DHoEHwy\/wCIpDiSB70HuQ7u9bhRkuuz6vIbZA1+47IMQOVNyECypIBaugG7gSgTvkCIoH6Xi6UeVdoA3GjrmjkOwAbbHegYGqTgQ3FQu5oVgJcIe0P+aWIsEmMCJxE+rrtfnaN7FVbSd0GzuCYDeENXzuQdqzAkPOMCh0rcptPXY82bkVuYUXN8IXQzyrOrE9fQu8AXLSTNYVZpuwW6neVeV2Au24W7bbQJugygYmtu9DYvtu46e9\/Ha4SLbnbv7sAv6\/55plR6vBjqgBI3btCkP4zukkaU9AdEgifQfu+tyF25WoXiTXMdleSDhEIHHTx32wN36pthfSR3\/5GFUFhJEZZkrnQUqJ4j5UnSBqt\/JLUbnOkVwqiIoQEbR9vWTzjXvgJeMlyKVQimMKSaCUQik9AqQ\/\/W3KWIX5Ys5ydYmpMh6PUYRHBxNmybm6POP+\/SfkdsGLN28IlNnePscHx+Qi9O2aiSkn52d8+I9nHO\/vc3j0kILy2Vf\/4uk3f0D2wriZkvslKSWa0QREmS+WLNsWj6CxhLz\/k1\/G8d6Mw70pd\/f3GZux7nquViuu5ldcXZ5xcfo5Tw+Dq9UFq6ycXMxJzYiDRvjFT3\/E+9+5w7N\/n\/LHj1\/z9Bv3+PT5CaeXS4JgsVqwXM85ny\/54fd+zAcf\/Jy\/f\/IRz798hjPhyaMnvHfvAcaYs\/NT5Le\/+UO4O7k4AGZGMqshUqUUp2vX4B2TsTB\/+5a+bUml5a71\/Oz7j\/jy1Yo\/f37O4\/fuUvpM2wWj0ZTZ3piXJ2csF+f46oTFxX\/466evWPYdyQLBeXp\/wsWix5oRufTIr379uy1Qk9IAlZiOxhzMJswmY0ZNYtwYjSkqSjLBpCayBBSg96DNTlec4lH\/kVxnlKkwGxkajpeCSM27qRUO9gwNuFw5AaRvP34MyDaxEcFEdioFyEHvhSx+a9heV5uaYmbMxiPUdPupR9D2TvFa3oWCqGAqrD1YLxwZmmIuhfTF8zcQgUfBvVBKRsKG\/rFCmCAqiAgea0ajKUJTG6kI7sNlg7LNaISZIVZDnsxomoSIEOEQ0JhUiJLJfU8M1UwU0qvnnxDu5NLzre8eEO7M5z1RhMOjEYvFCUpiPDWKdyQ7Qg1OXzoqiewFd6+tH1BNiCXEGnIEgYIamhrGozFH+1MO9yZMkpJSwkzpc6HrM10OUqwvcC\/gTmkVs4aDvdpLItZMp8H9B8e8fnnJnQcH3L13yD8\/e4GlCRJGI4qnRJ97JGIY0oGXlqQJD6dt10hvqPcsKHTrFaoyNFKnlIKXGqF05+hOlb1kVheCe2Z2OCZcaduOuw+PePnFgjRJnH6Vef3ivxzfu8Py0knNlFIyhGOaiAhEqyJ1PioqgqUEAbnvuFwv8FIongkvGKBARAHPJG2mNMMfy6Vn3V+yvnpJ0hleglcnc1btArkyRjaj8zVvzpzpbMR8LjQTYT6fM5nss1xfEGXCuHlIUPMrdkaMl0zOHeFOeME9YwKNWa0Pz6TV4vLGeBIP8pVSZAkhiDqUIMi0MccSJAfWBXOjLAoznRF9QfuGrmtp27O6lHlQvFC8bDc038ytCMDraquCiiDhpPX8rIKIbAejDZN6s1snUUQEFSX6Wl2WG9QSIrpdtBpraFNH27d4zpSS6XNPzv2NKX+9PQUSTpGoSyJB6pbniGoVNXxnja0fqggiVvuUGqYJVUMlY9JgmoYtQXERxpLoFLpk9NnoTavfryml1FyJ2G6p4XWwhheCIOXuClXbbsjbShGGBskwRgzRVPtLGOIGRXGp\/QYxVJSG2slHomQxeoWclDwa4eGIgKpiqugghHum79f0fUvquwWNJZJq3aGHvWW7+IvQ6AglYQRGoFFQFPGqDKFDrQy6itKIkVQYqVJC8Eh1ClhD04xpmqYqrUIQNbx9y\/8AxTEHhHzEX5kAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/volatile-the-easiest-way-to-send-pics_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320.22857142857\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ENot every IM app supports sending pictures. In that case you can just upload them here and send people a generated link. You can be sure your files will disappear right after they see it!\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EUpdate\u003C\/strong\u003E: This project is not supported anymore and has been replaced by \u003Ca href=\u0022\/projects\/showr\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-cogs\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E showr.link\u003C\/a\u003E\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/volatile-the-easiest-way-to-send-pics_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022700\u0022 height=\u0022467\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGFElEQVRIiX2WS28dWRHHf1V1+r78zDsTQRBILBFIIA0SguV8CJYs2CA+CUuWfAZWsGcLw46JGDEPmAlhEic2duz76u5zqlicvtfXzoiWrk5VS+3z87+e8vsPT0JFUAFBEKH+Njb1EQCRrX\/7iZ0zoloR174DHoEHwy\/wCIpDiSB70HuQ7u9bhRkuuz6vIbZA1+47IMQOVNyECypIBaugG7gSgTvkCIoH6Xi6UeVdoA3GjrmjkOwAbbHegYGqTgQ3FQu5oVgJcIe0P+aWIsEmMCJxE+rrtfnaN7FVbSd0GzuCYDeENXzuQdqzAkPOMCh0rcptPXY82bkVuYUXN8IXQzyrOrE9fQu8AXLSTNYVZpuwW6neVeV2Au24W7bbQJugygYmtu9DYvtu46e9\/Ha4SLbnbv7sAv6\/55plR6vBjqgBI3btCkP4zukkaU9AdEgifQfu+tyF25WoXiTXMdleSDhEIHHTx32wN36pthfSR3\/5GFUFhJEZZkrnQUqJ4j5UnSBqt\/JLUbnOkVwqiIoQEbR9vWTzjXvgJeMlyKVQimMKSaCUQik9AqQ\/\/W3KWIX5Ys5ydYmpMh6PUYRHBxNmybm6POP+\/SfkdsGLN28IlNnePscHx+Qi9O2aiSkn52d8+I9nHO\/vc3j0kILy2Vf\/4uk3f0D2wriZkvslKSWa0QREmS+WLNsWj6CxhLz\/k1\/G8d6Mw70pd\/f3GZux7nquViuu5ldcXZ5xcfo5Tw+Dq9UFq6ycXMxJzYiDRvjFT3\/E+9+5w7N\/n\/LHj1\/z9Bv3+PT5CaeXS4JgsVqwXM85ny\/54fd+zAcf\/Jy\/f\/IRz798hjPhyaMnvHfvAcaYs\/NT5Le\/+UO4O7k4AGZGMqshUqUUp2vX4B2TsTB\/+5a+bUml5a71\/Oz7j\/jy1Yo\/f37O4\/fuUvpM2wWj0ZTZ3piXJ2csF+f46oTFxX\/466evWPYdyQLBeXp\/wsWix5oRufTIr379uy1Qk9IAlZiOxhzMJswmY0ZNYtwYjSkqSjLBpCayBBSg96DNTlec4lH\/kVxnlKkwGxkajpeCSM27qRUO9gwNuFw5AaRvP34MyDaxEcFEdioFyEHvhSx+a9heV5uaYmbMxiPUdPupR9D2TvFa3oWCqGAqrD1YLxwZmmIuhfTF8zcQgUfBvVBKRsKG\/rFCmCAqiAgea0ajKUJTG6kI7sNlg7LNaISZIVZDnsxomoSIEOEQ0JhUiJLJfU8M1UwU0qvnnxDu5NLzre8eEO7M5z1RhMOjEYvFCUpiPDWKdyQ7Qg1OXzoqiewFd6+tH1BNiCXEGnIEgYIamhrGozFH+1MO9yZMkpJSwkzpc6HrM10OUqwvcC\/gTmkVs4aDvdpLItZMp8H9B8e8fnnJnQcH3L13yD8\/e4GlCRJGI4qnRJ97JGIY0oGXlqQJD6dt10hvqPcsKHTrFaoyNFKnlIKXGqF05+hOlb1kVheCe2Z2OCZcaduOuw+PePnFgjRJnH6Vef3ivxzfu8Py0knNlFIyhGOaiAhEqyJ1PioqgqUEAbnvuFwv8FIongkvGKBARAHPJG2mNMMfy6Vn3V+yvnpJ0hleglcnc1btArkyRjaj8zVvzpzpbMR8LjQTYT6fM5nss1xfEGXCuHlIUPMrdkaMl0zOHeFOeME9YwKNWa0Pz6TV4vLGeBIP8pVSZAkhiDqUIMi0MccSJAfWBXOjLAoznRF9QfuGrmtp27O6lHlQvFC8bDc038ytCMDraquCiiDhpPX8rIKIbAejDZN6s1snUUQEFSX6Wl2WG9QSIrpdtBpraFNH27d4zpSS6XNPzv2NKX+9PQUSTpGoSyJB6pbniGoVNXxnja0fqggiVvuUGqYJVUMlY9JgmoYtQXERxpLoFLpk9NnoTavfryml1FyJ2G6p4XWwhheCIOXuClXbbsjbShGGBskwRgzRVPtLGOIGRXGp\/QYxVJSG2slHomQxeoWclDwa4eGIgKpiqugghHum79f0fUvquwWNJZJq3aGHvWW7+IvQ6AglYQRGoFFQFPGqDKFDrQy6itKIkVQYqVJC8Eh1ClhD04xpmqYqrUIQNbx9y\/8AxTEHhHzEX5kAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/volatile-the-easiest-way-to-send-pics_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022700\u0022 height=\u0022467\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ENot every IM app supports sending pictures. In that case you can just upload them here and send people a generated link. You can be sure your files will disappear right after they see it!\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EUpdate\u003C\/strong\u003E: This project is not supported anymore and has been replaced by \u003Ca href=\u0022\/projects\/showr\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-cogs\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E showr.link\u003C\/a\u003E\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["delete","image","limit views","picture","public","remove","self-destruct","send","share","short time","volatile"],"hasMore":false,"image":"https:\/\/avris.it\/image\/volatile-the-easiest-way-to-send-pics_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/volatile-the-easiest-way-to-send-pics_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/volatile-the-easiest-way-to-send-pics_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160.11428571429\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ENot every IM app supports sending pictures. In that case you can just upload them here and send people a generated link. You can be sure your files will disappear right after they see it!\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EUpdate\u003C\/strong\u003E: This project is not supported anymore and has been replaced by \u003Ca href=\u0022\/projects\/showr.lite\u0022\u003E showr.link\u003C\/a\u003E\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/volatile-the-easiest-way-to-send-pics_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/volatile-the-easiest-way-to-send-pics_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160.11428571429\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ENot every IM app supports sending pictures. In that case you can just upload them here and send people a generated link. You can be sure your files will disappear right after they see it!\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EUpdate\u003C\/strong\u003E: This project is not supported anymore and has been replaced by \u003Ca href=\u0022\/projects\/showr.lite\u0022\u003E showr.link\u003C\/a\u003E\u003C\/p\u003E","words":49,"readTime":null,"lang":"en"},"pl":{"slug":"volatile-najprostszy-spos\u00f3b-na-wysy\u0142anie-obrazk\u00f3w","title":"Volatile \u2013 Najprostszy spos\u00f3b na wysy\u0142anie obrazk\u00f3w","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/volatile-najprostszy-spos\u00f3b-na-wysy\u0142anie-obrazk\u00f3w_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320.22857142857\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGFElEQVRIiX2WS28dWRHHf1V1+r78zDsTQRBILBFIIA0SguV8CJYs2CA+CUuWfAZWsGcLw46JGDEPmAlhEic2duz76u5zqlicvtfXzoiWrk5VS+3z87+e8vsPT0JFUAFBEKH+Njb1EQCRrX\/7iZ0zoloR174DHoEHwy\/wCIpDiSB70HuQ7u9bhRkuuz6vIbZA1+47IMQOVNyECypIBaugG7gSgTvkCIoH6Xi6UeVdoA3GjrmjkOwAbbHegYGqTgQ3FQu5oVgJcIe0P+aWIsEmMCJxE+rrtfnaN7FVbSd0GzuCYDeENXzuQdqzAkPOMCh0rcptPXY82bkVuYUXN8IXQzyrOrE9fQu8AXLSTNYVZpuwW6neVeV2Au24W7bbQJugygYmtu9DYvtu46e9\/Ha4SLbnbv7sAv6\/55plR6vBjqgBI3btCkP4zukkaU9AdEgifQfu+tyF25WoXiTXMdleSDhEIHHTx32wN36pthfSR3\/5GFUFhJEZZkrnQUqJ4j5UnSBqt\/JLUbnOkVwqiIoQEbR9vWTzjXvgJeMlyKVQimMKSaCUQik9AqQ\/\/W3KWIX5Ys5ydYmpMh6PUYRHBxNmybm6POP+\/SfkdsGLN28IlNnePscHx+Qi9O2aiSkn52d8+I9nHO\/vc3j0kILy2Vf\/4uk3f0D2wriZkvslKSWa0QREmS+WLNsWj6CxhLz\/k1\/G8d6Mw70pd\/f3GZux7nquViuu5ldcXZ5xcfo5Tw+Dq9UFq6ycXMxJzYiDRvjFT3\/E+9+5w7N\/n\/LHj1\/z9Bv3+PT5CaeXS4JgsVqwXM85ny\/54fd+zAcf\/Jy\/f\/IRz798hjPhyaMnvHfvAcaYs\/NT5Le\/+UO4O7k4AGZGMqshUqUUp2vX4B2TsTB\/+5a+bUml5a71\/Oz7j\/jy1Yo\/f37O4\/fuUvpM2wWj0ZTZ3piXJ2csF+f46oTFxX\/466evWPYdyQLBeXp\/wsWix5oRufTIr379uy1Qk9IAlZiOxhzMJswmY0ZNYtwYjSkqSjLBpCayBBSg96DNTlec4lH\/kVxnlKkwGxkajpeCSM27qRUO9gwNuFw5AaRvP34MyDaxEcFEdioFyEHvhSx+a9heV5uaYmbMxiPUdPupR9D2TvFa3oWCqGAqrD1YLxwZmmIuhfTF8zcQgUfBvVBKRsKG\/rFCmCAqiAgea0ajKUJTG6kI7sNlg7LNaISZIVZDnsxomoSIEOEQ0JhUiJLJfU8M1UwU0qvnnxDu5NLzre8eEO7M5z1RhMOjEYvFCUpiPDWKdyQ7Qg1OXzoqiewFd6+tH1BNiCXEGnIEgYIamhrGozFH+1MO9yZMkpJSwkzpc6HrM10OUqwvcC\/gTmkVs4aDvdpLItZMp8H9B8e8fnnJnQcH3L13yD8\/e4GlCRJGI4qnRJ97JGIY0oGXlqQJD6dt10hvqPcsKHTrFaoyNFKnlIKXGqF05+hOlb1kVheCe2Z2OCZcaduOuw+PePnFgjRJnH6Vef3ivxzfu8Py0knNlFIyhGOaiAhEqyJ1PioqgqUEAbnvuFwv8FIongkvGKBARAHPJG2mNMMfy6Vn3V+yvnpJ0hleglcnc1btArkyRjaj8zVvzpzpbMR8LjQTYT6fM5nss1xfEGXCuHlIUPMrdkaMl0zOHeFOeME9YwKNWa0Pz6TV4vLGeBIP8pVSZAkhiDqUIMi0MccSJAfWBXOjLAoznRF9QfuGrmtp27O6lHlQvFC8bDc038ytCMDraquCiiDhpPX8rIKIbAejDZN6s1snUUQEFSX6Wl2WG9QSIrpdtBpraFNH27d4zpSS6XNPzv2NKX+9PQUSTpGoSyJB6pbniGoVNXxnja0fqggiVvuUGqYJVUMlY9JgmoYtQXERxpLoFLpk9NnoTavfryml1FyJ2G6p4XWwhheCIOXuClXbbsjbShGGBskwRgzRVPtLGOIGRXGp\/QYxVJSG2slHomQxeoWclDwa4eGIgKpiqugghHum79f0fUvquwWNJZJq3aGHvWW7+IvQ6AglYQRGoFFQFPGqDKFDrQy6itKIkVQYqVJC8Eh1ClhD04xpmqYqrUIQNbx9y\/8AxTEHhHzEX5kAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/volatile-najprostszy-spos\u00f3b-na-wysy\u0142anie-obrazk\u00f3w_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320.22857142857\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ENie ka\u017cdy komunikator obs\u0142uguje za\u0142\u0105czanie obrazk\u00f3w. W takim przypadku wystarczy \u017ce za\u0142adujesz je tutaj i wy\u015blesz rozm\u00f3wcy wygenerowany link. Mo\u017cesz by\u0107 pewny, \u017ce pliki znikn\u0105 od razu po otwarciu!\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EUpdate\u003C\/strong\u003E: Projekt nie jest ju\u017c wspierany, jego rol\u0119 przej\u0105\u0142 \u003Ca href=\u0022\/projects\/showr\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-cogs\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E showr.link\u003C\/a\u003E\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/volatile-najprostszy-spos\u00f3b-na-wysy\u0142anie-obrazk\u00f3w_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022700\u0022 height=\u0022467\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGFElEQVRIiX2WS28dWRHHf1V1+r78zDsTQRBILBFIIA0SguV8CJYs2CA+CUuWfAZWsGcLw46JGDEPmAlhEic2duz76u5zqlicvtfXzoiWrk5VS+3z87+e8vsPT0JFUAFBEKH+Njb1EQCRrX\/7iZ0zoloR174DHoEHwy\/wCIpDiSB70HuQ7u9bhRkuuz6vIbZA1+47IMQOVNyECypIBaugG7gSgTvkCIoH6Xi6UeVdoA3GjrmjkOwAbbHegYGqTgQ3FQu5oVgJcIe0P+aWIsEmMCJxE+rrtfnaN7FVbSd0GzuCYDeENXzuQdqzAkPOMCh0rcptPXY82bkVuYUXN8IXQzyrOrE9fQu8AXLSTNYVZpuwW6neVeV2Au24W7bbQJugygYmtu9DYvtu46e9\/Ha4SLbnbv7sAv6\/55plR6vBjqgBI3btCkP4zukkaU9AdEgifQfu+tyF25WoXiTXMdleSDhEIHHTx32wN36pthfSR3\/5GFUFhJEZZkrnQUqJ4j5UnSBqt\/JLUbnOkVwqiIoQEbR9vWTzjXvgJeMlyKVQimMKSaCUQik9AqQ\/\/W3KWIX5Ys5ydYmpMh6PUYRHBxNmybm6POP+\/SfkdsGLN28IlNnePscHx+Qi9O2aiSkn52d8+I9nHO\/vc3j0kILy2Vf\/4uk3f0D2wriZkvslKSWa0QREmS+WLNsWj6CxhLz\/k1\/G8d6Mw70pd\/f3GZux7nquViuu5ldcXZ5xcfo5Tw+Dq9UFq6ycXMxJzYiDRvjFT3\/E+9+5w7N\/n\/LHj1\/z9Bv3+PT5CaeXS4JgsVqwXM85ny\/54fd+zAcf\/Jy\/f\/IRz798hjPhyaMnvHfvAcaYs\/NT5Le\/+UO4O7k4AGZGMqshUqUUp2vX4B2TsTB\/+5a+bUml5a71\/Oz7j\/jy1Yo\/f37O4\/fuUvpM2wWj0ZTZ3piXJ2csF+f46oTFxX\/466evWPYdyQLBeXp\/wsWix5oRufTIr379uy1Qk9IAlZiOxhzMJswmY0ZNYtwYjSkqSjLBpCayBBSg96DNTlec4lH\/kVxnlKkwGxkajpeCSM27qRUO9gwNuFw5AaRvP34MyDaxEcFEdioFyEHvhSx+a9heV5uaYmbMxiPUdPupR9D2TvFa3oWCqGAqrD1YLxwZmmIuhfTF8zcQgUfBvVBKRsKG\/rFCmCAqiAgea0ajKUJTG6kI7sNlg7LNaISZIVZDnsxomoSIEOEQ0JhUiJLJfU8M1UwU0qvnnxDu5NLzre8eEO7M5z1RhMOjEYvFCUpiPDWKdyQ7Qg1OXzoqiewFd6+tH1BNiCXEGnIEgYIamhrGozFH+1MO9yZMkpJSwkzpc6HrM10OUqwvcC\/gTmkVs4aDvdpLItZMp8H9B8e8fnnJnQcH3L13yD8\/e4GlCRJGI4qnRJ97JGIY0oGXlqQJD6dt10hvqPcsKHTrFaoyNFKnlIKXGqF05+hOlb1kVheCe2Z2OCZcaduOuw+PePnFgjRJnH6Vef3ivxzfu8Py0knNlFIyhGOaiAhEqyJ1PioqgqUEAbnvuFwv8FIongkvGKBARAHPJG2mNMMfy6Vn3V+yvnpJ0hleglcnc1btArkyRjaj8zVvzpzpbMR8LjQTYT6fM5nss1xfEGXCuHlIUPMrdkaMl0zOHeFOeME9YwKNWa0Pz6TV4vLGeBIP8pVSZAkhiDqUIMi0MccSJAfWBXOjLAoznRF9QfuGrmtp27O6lHlQvFC8bDc038ytCMDraquCiiDhpPX8rIKIbAejDZN6s1snUUQEFSX6Wl2WG9QSIrpdtBpraFNH27d4zpSS6XNPzv2NKX+9PQUSTpGoSyJB6pbniGoVNXxnja0fqggiVvuUGqYJVUMlY9JgmoYtQXERxpLoFLpk9NnoTavfryml1FyJ2G6p4XWwhheCIOXuClXbbsjbShGGBskwRgzRVPtLGOIGRXGp\/QYxVJSG2slHomQxeoWclDwa4eGIgKpiqugghHum79f0fUvquwWNJZJq3aGHvWW7+IvQ6AglYQRGoFFQFPGqDKFDrQy6itKIkVQYqVJC8Eh1ClhD04xpmqYqrUIQNbx9y\/8AxTEHhHzEX5kAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/volatile-najprostszy-spos\u00f3b-na-wysy\u0142anie-obrazk\u00f3w_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022700\u0022 height=\u0022467\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ENie ka\u017cdy komunikator obs\u0142uguje za\u0142\u0105czanie obrazk\u00f3w. W takim przypadku wystarczy \u017ce za\u0142adujesz je tutaj i wy\u015blesz rozm\u00f3wcy wygenerowany link. Mo\u017cesz by\u0107 pewny, \u017ce pliki znikn\u0105 od razu po otwarciu!\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EUpdate\u003C\/strong\u003E: Projekt nie jest ju\u017c wspierany, jego rol\u0119 przej\u0105\u0142 \u003Ca href=\u0022\/projects\/showr\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-cogs\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E showr.link\u003C\/a\u003E\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["kr\u00f3tkotrwa\u0142y","obrazek","ograniczenie dost\u0119pu","publiczny","samozniszczenie","udost\u0119pnia\u0107","ulotny","usuni\u0119cie","usuwanie","wysy\u0142a\u0107","zdj\u0119cie"],"hasMore":false,"image":"https:\/\/avris.it\/image\/volatile-najprostszy-spos\u00f3b-na-wysy\u0142anie-obrazk\u00f3w_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/volatile-najprostszy-spos\u00f3b-na-wysy\u0142anie-obrazk\u00f3w_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/volatile-najprostszy-spos\u00f3b-na-wysy\u0142anie-obrazk\u00f3w_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160.11428571429\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ENie ka\u017cdy komunikator obs\u0142uguje za\u0142\u0105czanie obrazk\u00f3w. W takim przypadku wystarczy \u017ce za\u0142adujesz je tutaj i wy\u015blesz rozm\u00f3wcy wygenerowany link. Mo\u017cesz by\u0107 pewny, \u017ce pliki znikn\u0105 od razu po otwarciu!\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EUpdate\u003C\/strong\u003E: Projekt nie jest ju\u017c wspierany, jego rol\u0119 przej\u0105\u0142 \u003Ca href=\u0022\/projects\/showr.lite\u0022\u003E showr.link\u003C\/a\u003E\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/volatile-najprostszy-spos\u00f3b-na-wysy\u0142anie-obrazk\u00f3w_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/volatile-najprostszy-spos\u00f3b-na-wysy\u0142anie-obrazk\u00f3w_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160.11428571429\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003ENie ka\u017cdy komunikator obs\u0142uguje za\u0142\u0105czanie obrazk\u00f3w. W takim przypadku wystarczy \u017ce za\u0142adujesz je tutaj i wy\u015blesz rozm\u00f3wcy wygenerowany link. Mo\u017cesz by\u0107 pewny, \u017ce pliki znikn\u0105 od razu po otwarciu!\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EUpdate\u003C\/strong\u003E: Projekt nie jest ju\u017c wspierany, jego rol\u0119 przej\u0105\u0142 \u003Ca href=\u0022\/projects\/showr.lite\u0022\u003E showr.link\u003C\/a\u003E\u003C\/p\u003E","words":48,"readTime":null,"lang":"pl"}}},"projects\/picco-golfy-php-framework":{"key":"projects\/picco-golfy-php-framework","type":"article","published":true,"meta":{"createdAt":"2017-04-28T19:43:56+02:00","publishedAt":"2016-07-13T21:16:00+02:00","group":"micrus","links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/picco.avris.it\/","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Picco","displayUrl":null}],"category":"projects","subcategory":null,"slug":"picco-golfy-php-framework"},"content":{"en":{"slug":"picco-golfy-php-framework","title":"Picco \u2013 Golfy PHP framework","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/picco-golfy-php-framework_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022274.28571428571\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHOklEQVRIiU2Vy2+dVxXFf\/uc8z3uw\/f6XtvXdh5OIE2TtrShDyraKqESA6RKVMyZIP4B5ogRY4ZM+BeQGDJACCQUQaXSVrQpCbiJ2sauE79i+9r33u\/7zmMzuB4w2LMjnbXXWnstKTZ+q7Zt6by0gh316T6\/ytlfHnD29VeY3GC7XWh1MZ0WJreUOTR1hRGBIoNWAWWOEWG1ZSliYGvrCB8TKo6ERb2CT5SlJcss9bhm8vUe9bN9iA0AKjlIhiMvyEYt7EIBvqH57xMWbi7jn+0TYwPWYEqHaWVIbvHqsUWGAFJk0M6hzEGEZ7VHpg0qgnEWzRxIhrqEZIm85bDOEOqIyS3GGcCRogcSAE6uX4bpEWoEaw1OEuZ4il3sISJoqDG5Q1oZJjeYBCbIOSAHZQadHASSJqgt65myPU3YpRUkK4mTU9K0ZnzmkZCQJhBjoDMYQAOz00N8iACYfLRMEwzhpMaY+UfTnWNi8Ej09F++Qb7YnbNUZhTtnEG\/xGaOvMy5OGrT6uXYToZtZ5jCceelEbZsMfj+LTbefx03WMKUGVI4kjF4nxBnSSlA8mhsEFVAcfXd\/+BeHTE7OcMfHmJJpPoUYxryjaucPfqK9XdvcTypiJMZGhQfwWSOXq\/g6qiDRNirIxoS6aTiB6+s8\/sHp6TGM50FJBdM4XBGyLs5yzeH+OM+s50DmmkkftMwPRwDigHBf7pFamakUQ9Z7CFWMEbQsyOGz22w\/2ALjCUb9bGFY7lfYl3GJAqb08CRM5h2hm1luLrm7dcuYSQx+\/IhJ5\/cB50hheXlG0v86N0NynZGnluuPL+KM4Z8oQvoXDJFEQGOqvmsL+IWu\/SXFjFNRZEL+XKP1FTQ1Jh+i71ZYnEhZ2lQcq1juVnPyDuOfq\/gjcs92q0MYw0iERGPyQTJLZ89HvPXj3ex1nD1Uo+6iaxfH5J3C0TMXDI0gAHJLIRI3NwhW1sBPcM4x\/gs0Hv924x3DzBOiaczOqq8UES+dyHjzesDPnx8zHG3wArc6Q4AEGsxmUVzi4pigjLsZAxajpPdCYeHY\/o9x3TS0Fob0BnXnG49w4kGEMAZcAaRRHi6hY76rF27xJPHTxh\/3HDnrUtc0cDbbwx5+9YFegslqoqI8JsH+6xeKJiOJ9x+YWVOvTEYZ0iZmV9kSFwedRCF5qyhPnNYASNgAFfmc4ZUAyIZZr2LvbCAaTw8ntAbH\/JOp8\/tn7\/GO6+ssbrSnW8ugupcb4Dj8YztIqPjDK2TKS9cu0lVeUQEsWY+ScEato9qhqVl\/2DGdOuIKxe7iII2gdnO03PJiMigi6x0kU5GvtFFCNRb2zzcGfPJH+7xqz9+ga50uXO5Tz6r2Nya8N6NIb\/46S3+ubnH8vURT6zhlX6JCGS55Zc\/vISUDjWCKpAUjcrJyYy\/hTEfHR6zfXCIhJqTgwOamQdZwAlpnrR5jpiMi2td9nbG1EZ4NvX43gK+20EXe2wO+nRtxq4FdQ6AneMZ7dUBK2p4a6UNQOYsP3v\/RUSEqg58+PkT7m4ecvfhMZ9uT4mhoBwOkMN9mukUjR40IaI4UJgmcAVYw9bnB7B1QKgqdnYTkgytpT7GGXZ2T1kpzDzEzmW7f9KQAuw+2uX2q6ukpNx78JS\/\/3uPfzw55aOxp+4toMmQTBtZzpHDM5wzBFU0RVLygKAoDhGQHH3mSAnC4QRzOsGkRPAeGxK1T5igIHC0P+XSc2sYO+XR4yP+1BjccUUxqfn1nx\/x2eYZTeWYJk8Y5eh6DxsgVvNqKHPLRAynkwadTQj1KaoRVM6DUQSKDix00JCjlc57LkWIEU2JGBMx6dwHIXLwaJ+ysNy9t4uUBamK+AtDPmh3mRTteXkChIRGRTn3kRiqKIjNWBwt0l8aYhA0xblkCgYxUBRwUaCdoWIgJTRGUMW1O7hegSbQqNiktGJFM6354NEx2kRSFfCTQG4dqfaE6ex8oYQmRZMCBjUZuIKlC0PeuX2NwcqIxeGF+VvS\/zHkLPSBzIAKGhPEiOAQsaw\/P5yfcYIrvYyffHfAqF9yf6\/CuYzkIdWRXqtEqwatG8LplOHGOhoBLNgMydtIawHb6fLwaUWKc9ZJ\/tyTigGdM7IPqVE0JTQmNHhidUqcTNn+dI\/URIhK1wg31rp89q+vmMwCnX6Pi99aIzXK7uM9UlWT6prUeMZ7x9iyAJtD0UW6bejkHBx4jnZOOTt6Rl563vzxe9y48yYiwvx2Q4Pugao\/BxPRGFCN+JMjzEEf6XYIKbF5eMrvvtxn7+EBfnWJ8TfHjK0j1onSlUxrj3iPW+yhRBY2hpwFi6aIMZHxUyXUgaf3t4k7X3DjO1cRsfTXV8jaOzhUwVfoeIK6iPo4BxQ8akC9J\/mICUqSxPikptof42yLMKsJO\/u4XkmxukYrKJV9grEVREjRUAfIRgaTCyfbEdOA8TW+rkih5vH9e1x6UTgZT2gmM\/4H\/a7DbmCi0BgAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/picco-golfy-php-framework_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022274.28571428571\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003ECode golf\u003C\/strong\u003E is a type of recreational computer programming competition in which participants strive to achieve the shortest possible source code that implements a certain algorithm. \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Code_golf\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E [source]\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EPicco\u003C\/strong\u003E is a tiny PHP web framework that only takes \u003Cstrong\u003E~2,5 kB\u003C\/strong\u003E of space and has no dependencies on other libraries, while still providing quite a lot of features, being extensible and reasonably easy to use.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/picco-golfy-php-framework_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022700\u0022 height=\u0022400\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHOklEQVRIiU2Vy2+dVxXFf\/uc8z3uw\/f6XtvXdh5OIE2TtrShDyraKqESA6RKVMyZIP4B5ogRY4ZM+BeQGDJACCQUQaXSVrQpCbiJ2sauE79i+9r33u\/7zmMzuB4w2LMjnbXXWnstKTZ+q7Zt6by0gh316T6\/ytlfHnD29VeY3GC7XWh1MZ0WJreUOTR1hRGBIoNWAWWOEWG1ZSliYGvrCB8TKo6ERb2CT5SlJcss9bhm8vUe9bN9iA0AKjlIhiMvyEYt7EIBvqH57xMWbi7jn+0TYwPWYEqHaWVIbvHqsUWGAFJk0M6hzEGEZ7VHpg0qgnEWzRxIhrqEZIm85bDOEOqIyS3GGcCRogcSAE6uX4bpEWoEaw1OEuZ4il3sISJoqDG5Q1oZJjeYBCbIOSAHZQadHASSJqgt65myPU3YpRUkK4mTU9K0ZnzmkZCQJhBjoDMYQAOz00N8iACYfLRMEwzhpMaY+UfTnWNi8Ej09F++Qb7YnbNUZhTtnEG\/xGaOvMy5OGrT6uXYToZtZ5jCceelEbZsMfj+LTbefx03WMKUGVI4kjF4nxBnSSlA8mhsEFVAcfXd\/+BeHTE7OcMfHmJJpPoUYxryjaucPfqK9XdvcTypiJMZGhQfwWSOXq\/g6qiDRNirIxoS6aTiB6+s8\/sHp6TGM50FJBdM4XBGyLs5yzeH+OM+s50DmmkkftMwPRwDigHBf7pFamakUQ9Z7CFWMEbQsyOGz22w\/2ALjCUb9bGFY7lfYl3GJAqb08CRM5h2hm1luLrm7dcuYSQx+\/IhJ5\/cB50hheXlG0v86N0NynZGnluuPL+KM4Z8oQvoXDJFEQGOqvmsL+IWu\/SXFjFNRZEL+XKP1FTQ1Jh+i71ZYnEhZ2lQcq1juVnPyDuOfq\/gjcs92q0MYw0iERGPyQTJLZ89HvPXj3ex1nD1Uo+6iaxfH5J3C0TMXDI0gAHJLIRI3NwhW1sBPcM4x\/gs0Hv924x3DzBOiaczOqq8UES+dyHjzesDPnx8zHG3wArc6Q4AEGsxmUVzi4pigjLsZAxajpPdCYeHY\/o9x3TS0Fob0BnXnG49w4kGEMAZcAaRRHi6hY76rF27xJPHTxh\/3HDnrUtc0cDbbwx5+9YFegslqoqI8JsH+6xeKJiOJ9x+YWVOvTEYZ0iZmV9kSFwedRCF5qyhPnNYASNgAFfmc4ZUAyIZZr2LvbCAaTw8ntAbH\/JOp8\/tn7\/GO6+ssbrSnW8ugupcb4Dj8YztIqPjDK2TKS9cu0lVeUQEsWY+ScEato9qhqVl\/2DGdOuIKxe7iII2gdnO03PJiMigi6x0kU5GvtFFCNRb2zzcGfPJH+7xqz9+ga50uXO5Tz6r2Nya8N6NIb\/46S3+ubnH8vURT6zhlX6JCGS55Zc\/vISUDjWCKpAUjcrJyYy\/hTEfHR6zfXCIhJqTgwOamQdZwAlpnrR5jpiMi2td9nbG1EZ4NvX43gK+20EXe2wO+nRtxq4FdQ6AneMZ7dUBK2p4a6UNQOYsP3v\/RUSEqg58+PkT7m4ecvfhMZ9uT4mhoBwOkMN9mukUjR40IaI4UJgmcAVYw9bnB7B1QKgqdnYTkgytpT7GGXZ2T1kpzDzEzmW7f9KQAuw+2uX2q6ukpNx78JS\/\/3uPfzw55aOxp+4toMmQTBtZzpHDM5wzBFU0RVLygKAoDhGQHH3mSAnC4QRzOsGkRPAeGxK1T5igIHC0P+XSc2sYO+XR4yP+1BjccUUxqfn1nx\/x2eYZTeWYJk8Y5eh6DxsgVvNqKHPLRAynkwadTQj1KaoRVM6DUQSKDix00JCjlc57LkWIEU2JGBMx6dwHIXLwaJ+ysNy9t4uUBamK+AtDPmh3mRTteXkChIRGRTn3kRiqKIjNWBwt0l8aYhA0xblkCgYxUBRwUaCdoWIgJTRGUMW1O7hegSbQqNiktGJFM6354NEx2kRSFfCTQG4dqfaE6ex8oYQmRZMCBjUZuIKlC0PeuX2NwcqIxeGF+VvS\/zHkLPSBzIAKGhPEiOAQsaw\/P5yfcYIrvYyffHfAqF9yf6\/CuYzkIdWRXqtEqwatG8LplOHGOhoBLNgMydtIawHb6fLwaUWKc9ZJ\/tyTigGdM7IPqVE0JTQmNHhidUqcTNn+dI\/URIhK1wg31rp89q+vmMwCnX6Pi99aIzXK7uM9UlWT6prUeMZ7x9iyAJtD0UW6bejkHBx4jnZOOTt6Rl563vzxe9y48yYiwvx2Q4Pugao\/BxPRGFCN+JMjzEEf6XYIKbF5eMrvvtxn7+EBfnWJ8TfHjK0j1onSlUxrj3iPW+yhRBY2hpwFi6aIMZHxUyXUgaf3t4k7X3DjO1cRsfTXV8jaOzhUwVfoeIK6iPo4BxQ8akC9J\/mICUqSxPikptof42yLMKsJO\/u4XkmxukYrKJV9grEVREjRUAfIRgaTCyfbEdOA8TW+rkih5vH9e1x6UTgZT2gmM\/4H\/a7DbmCi0BgAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/picco-golfy-php-framework_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022700\u0022 height=\u0022400\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003ECode golf\u003C\/strong\u003E is a type of recreational computer programming competition in which participants strive to achieve the shortest possible source code that implements a certain algorithm. \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Code_golf\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E [source]\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EPicco\u003C\/strong\u003E is a tiny PHP web framework that only takes \u003Cstrong\u003E~2,5 kB\u003C\/strong\u003E of space and has no dependencies on other libraries, while still providing quite a lot of features, being extensible and reasonably easy to use.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["code golf","framework","microframework","php","programming"],"hasMore":false,"image":"https:\/\/avris.it\/image\/picco-golfy-php-framework_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/picco-golfy-php-framework_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/picco-golfy-php-framework_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022137.14285714286\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003ECode golf\u003C\/strong\u003E is a type of recreational computer programming competition in which participants strive to achieve the shortest possible source code that implements a certain algorithm. \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Code_golf\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E [source]\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EPicco\u003C\/strong\u003E is a tiny PHP web framework that only takes \u003Cstrong\u003E~2,5 kB\u003C\/strong\u003E of space and has no dependencies on other libraries, while still providing quite a lot of features, being extensible and reasonably easy to use.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/picco-golfy-php-framework_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/picco-golfy-php-framework_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022137.14285714286\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003ECode golf\u003C\/strong\u003E is a type of recreational computer programming competition in which participants strive to achieve the shortest possible source code that implements a certain algorithm. \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Code_golf\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E [source]\u003C\/a\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EPicco\u003C\/strong\u003E is a tiny PHP web framework that only takes \u003Cstrong\u003E~2,5 kB\u003C\/strong\u003E of space and has no dependencies on other libraries, while still providing quite a lot of features, being extensible and reasonably easy to use.\u003C\/p\u003E","words":62,"readTime":null,"lang":"en"}}},"projects\/generator-de":{"key":"projects\/generator-de","type":"article","published":true,"meta":{"createdAt":"2017-04-28T19:43:25+02:00","publishedAt":"2016-03-27T20:51:00+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/generator.avris.it\/","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Generator","displayUrl":null},{"icon":"pencil","colour":"secondary","url":"https:\/\/www.npmjs.com\/package\/avris-generator","displayUrl":null}],"category":"projects","subcategory":null,"slug":"generator-de"},"content":{"de":{"slug":"generator-de","title":"Generator und Validator f\u00fcr IBAN und TIN, ISBN, EAN, Kennwortgenerator","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/generator_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320.22808267997\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGqUlEQVRIiaWXu48kVxXGf\/dRj65+TvdOj70DGK9XAmmxAG3ilNABSMb8AUjkyAkBMTEpARIBCWaRJWJAwgksEpaxRLASYAOrhdn1zqu7p7uqq+7jEFRPz4x31iBxpKu+3XXv6e9837nn3FJf\/8brYo2l6Hbp9Qd0Ol2U0vw\/JiLns813gHh5wfap2s4FBGyWJBhjcU3D7PSY3cmENC8oy4qmqcmyHO89RVGwXq8JwaOUxhgNKGKMxBjw3gPgBEJoEHcBwPiAIASjUEqRJymIUNZrksRijEG1eLBsnIcQCc4xne7ROM9Hf\/+Ifq9PVZWUZYnWmul0Slmu6PcHOOeo1hX9Xo+Dx\/+mqWuUUri4YSAGlFIoBTd2hiRJRogKEcGva4iCMmpDlkI2iNTdu18RrYQY2ohskjAc7\/DgwV\/pdgvUJkql1JZtQVAXgrSOAFGGPMtQSDuUpnENezdv8qU7rz4jZyuTtH5EAMFqo7FaIzoSY+THP\/0ZWapIVEK3W1yTIO3HbDYnSiSEwMHjx9x755d893tvMck6xBjpdrtbAIJgtMF7z+lshjEGBKJE7v\/hPu\/\/6X3YBGyNsUgMLKsKgHS4A+LIlWZvundtwiqlGI\/HeO8RIE1TvvjK51lnXTpFjnOeyWSyXbsFJkK\/329\/1xoFfPBBBy50wNokwdehTUgfGGTgPDQSeXT0hOFw+CxLG1vOTvHO45qaTifjM\/2EtXc4cTw6fIwAWZrSKS4xbaFZ19Sn5TUeBWutxddtjogItXiksNzIBhf6PMeGoxFEwTUNEgILaqa9IX1tN3vVtfuyLKPYybbsXTabZzlNVWGNwSlPz2ZgLdXsEHoDdrIeqbYXMWxkEBFUspEDeHoyZy8f4n2kbFZ0i4ydtHdFsnNTSiGJXA8oTRKKNMFojQ+Rk6czer0ukMJszSHrT2UJ4ODjp0h0rI6WaK3QQLX2VKw+dZ+IcLa8vEa1pyzGiNWKTpaD0vR7vf8K4rJTUDTOk2UZeZb+z3vrpiHKJ9h781vflLPDJ\/gYWawqvvzaXbTRNKHBakuR9xh1BiyqOZWr2ekOWIUlRhuWq4rCFDR1w8HBY1763MvU3iOxLSGyAZxazSu3bl8OY8vI8ckxq9UFSxatcSGiFMQYeev7P4CwoogJL+xNKYqrteg8h8qy5HQ2I\/jA6fyEt+\/d4\/XvfJvbWa+V3weyLGN398YlJjcwznNQKX5+7x6\/u\/\/7LUhrjcXHgKLtM+Nugc36pEbhNSxcdT3fiWI0GiJRWJwtWNeO29N9eglXDti1+2PE+E31V1fBWpNYGh\/IrMXHCDTUq8BaBK01vV4Pbcy1mOaLBcF5mqYBEVSomJcNAKPRzvWBAM45lotNHfpEZbGJTfA+bK8EK7\/GpYpJZaGf4Yg4V6O9wkWPTS3BRUxqMEXOJO9ztlxSlSvyYMG2JcIv6+cCUkDeaVNhXddXGUoSS4gRrRXr2lHYDJ2knJUzupJh5jMY9AiugsQi3rEONQM1pJwfEW3bEpzz\/PnDD7GpZTC4Wt07OmV+espqc2s4H9PplHXjrgKySUIMHowmRE+IkVlzRsg7OLcCr5lojRRdOicV9aRgnHWpQ0NnNGCY9amLBa\/eucP+Sy8wHT4r1b+eHG5yJWJMQtM02+Z73uXPpbNGKTp5ijWGQb9PHgzjbHDhbQT4zXyY0NnMUzJQ4KuGqlwRXIWuNIfrGUh7D2pLlJCTUm3++7wxdzenV0SQeImhEDyrqqbxgRd3xzw9WdBZOxaLM87OzphMJuR53gahWq8P\/\/kPbJKyv7+PQnE0XxLl+r61NQGtNU3TUNc1eZ5jjGlrVgjbE2cVQu08L+6O6XYy0sRwc3fCzd3Jc33vTy+eRRGeHDzib395wE9+9ENO5nNW5Zq6cWir2RsNGfR6IBGUxgtom6CNRSnN6ekxwTu0NqAUVmvNF26\/TGhqQgi884u36XRy0jRjNp+zWp6hNBtaFc57JApGw6DfxyQps5Njbt26zZuvfY0bX70DtGyUZcVoZ0TR6XB0dERZVkSJiAhJkqC15je\/\/hXvvvtbYowopbHl4pQ0TTmrVoyGA9584w3SNCXJMrzzxBjay5yA0np75VSAsRalFA8fPuS99\/7IZ++MWSYKHzxpalBYKnF4B+mwSzpsE1mJXBRGgRgFpdphk7wgzhcMRjuMxhMmpWB85DjWGGNIs5ymaUiShG6vS+\/8dGxACVCWFSKRj+0Obj5DRBiPJ6RpCgjeOTYvOgDUVU29WKGUwvuG4B1KG5RS\/Af3xoJXKXZWkwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/generator_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320.22808267997\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EBequemer Service f\u00fcr best\u00e4tigen und generieren von Steuer-IdNr., IBAN, TIN, ISBN, EAN, Kennw\u00f6rter...\u003C\/p\u003E\n\u003Cp\u003EAuch als API und NPM package verf\u00fcgbar.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/generator_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022640.45616535994\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGqUlEQVRIiaWXu48kVxXGf\/dRj65+TvdOj70DGK9XAmmxAG3ilNABSMb8AUjkyAkBMTEpARIBCWaRJWJAwgksEpaxRLASYAOrhdn1zqu7p7uqq+7jEFRPz4x31iBxpKu+3XXv6e9837nn3FJf\/8brYo2l6Hbp9Qd0Ol2U0vw\/JiLns813gHh5wfap2s4FBGyWJBhjcU3D7PSY3cmENC8oy4qmqcmyHO89RVGwXq8JwaOUxhgNKGKMxBjw3gPgBEJoEHcBwPiAIASjUEqRJymIUNZrksRijEG1eLBsnIcQCc4xne7ROM9Hf\/+Ifq9PVZWUZYnWmul0Slmu6PcHOOeo1hX9Xo+Dx\/+mqWuUUri4YSAGlFIoBTd2hiRJRogKEcGva4iCMmpDlkI2iNTdu18RrYQY2ohskjAc7\/DgwV\/pdgvUJkql1JZtQVAXgrSOAFGGPMtQSDuUpnENezdv8qU7rz4jZyuTtH5EAMFqo7FaIzoSY+THP\/0ZWapIVEK3W1yTIO3HbDYnSiSEwMHjx9x755d893tvMck6xBjpdrtbAIJgtMF7z+lshjEGBKJE7v\/hPu\/\/6X3YBGyNsUgMLKsKgHS4A+LIlWZvundtwiqlGI\/HeO8RIE1TvvjK51lnXTpFjnOeyWSyXbsFJkK\/329\/1xoFfPBBBy50wNokwdehTUgfGGTgPDQSeXT0hOFw+CxLG1vOTvHO45qaTifjM\/2EtXc4cTw6fIwAWZrSKS4xbaFZ19Sn5TUeBWutxddtjogItXiksNzIBhf6PMeGoxFEwTUNEgILaqa9IX1tN3vVtfuyLKPYybbsXTabZzlNVWGNwSlPz2ZgLdXsEHoDdrIeqbYXMWxkEBFUspEDeHoyZy8f4n2kbFZ0i4ydtHdFsnNTSiGJXA8oTRKKNMFojQ+Rk6czer0ukMJszSHrT2UJ4ODjp0h0rI6WaK3QQLX2VKw+dZ+IcLa8vEa1pyzGiNWKTpaD0vR7vf8K4rJTUDTOk2UZeZb+z3vrpiHKJ9h781vflLPDJ\/gYWawqvvzaXbTRNKHBakuR9xh1BiyqOZWr2ekOWIUlRhuWq4rCFDR1w8HBY1763MvU3iOxLSGyAZxazSu3bl8OY8vI8ckxq9UFSxatcSGiFMQYeev7P4CwoogJL+xNKYqrteg8h8qy5HQ2I\/jA6fyEt+\/d4\/XvfJvbWa+V3weyLGN398YlJjcwznNQKX5+7x6\/u\/\/7LUhrjcXHgKLtM+Nugc36pEbhNSxcdT3fiWI0GiJRWJwtWNeO29N9eglXDti1+2PE+E31V1fBWpNYGh\/IrMXHCDTUq8BaBK01vV4Pbcy1mOaLBcF5mqYBEVSomJcNAKPRzvWBAM45lotNHfpEZbGJTfA+bK8EK7\/GpYpJZaGf4Yg4V6O9wkWPTS3BRUxqMEXOJO9ztlxSlSvyYMG2JcIv6+cCUkDeaVNhXddXGUoSS4gRrRXr2lHYDJ2knJUzupJh5jMY9AiugsQi3rEONQM1pJwfEW3bEpzz\/PnDD7GpZTC4Wt07OmV+espqc2s4H9PplHXjrgKySUIMHowmRE+IkVlzRsg7OLcCr5lojRRdOicV9aRgnHWpQ0NnNGCY9amLBa\/eucP+Sy8wHT4r1b+eHG5yJWJMQtM02+Z73uXPpbNGKTp5ijWGQb9PHgzjbHDhbQT4zXyY0NnMUzJQ4KuGqlwRXIWuNIfrGUh7D2pLlJCTUm3++7wxdzenV0SQeImhEDyrqqbxgRd3xzw9WdBZOxaLM87OzphMJuR53gahWq8P\/\/kPbJKyv7+PQnE0XxLl+r61NQGtNU3TUNc1eZ5jjGlrVgjbE2cVQu08L+6O6XYy0sRwc3fCzd3Jc33vTy+eRRGeHDzib395wE9+9ENO5nNW5Zq6cWir2RsNGfR6IBGUxgtom6CNRSnN6ekxwTu0NqAUVmvNF26\/TGhqQgi884u36XRy0jRjNp+zWp6hNBtaFc57JApGw6DfxyQps5Njbt26zZuvfY0bX70DtGyUZcVoZ0TR6XB0dERZVkSJiAhJkqC15je\/\/hXvvvtbYowopbHl4pQ0TTmrVoyGA9584w3SNCXJMrzzxBjay5yA0np75VSAsRalFA8fPuS99\/7IZ++MWSYKHzxpalBYKnF4B+mwSzpsE1mJXBRGgRgFpdphk7wgzhcMRjuMxhMmpWB85DjWGGNIs5ymaUiShG6vS+\/8dGxACVCWFSKRj+0Obj5DRBiPJ6RpCgjeOTYvOgDUVU29WKGUwvuG4B1KG5RS\/Af3xoJXKXZWkwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/generator_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022640.45616535994\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EBequemer Service f\u00fcr best\u00e4tigen und generieren von Steuer-IdNr., IBAN, TIN, ISBN, EAN, Kennw\u00f6rter...\u003C\/p\u003E\n\u003Cp\u003EAuch als API und NPM package verf\u00fcgbar.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["best\u00e4tigen","ean","express","generator","generieren","iban","isbn","javascript","kennwort","node","nodejs","nummer","passwort","steueridentifikationsnummer","tin","validator","webpack"],"hasMore":false,"image":"https:\/\/avris.it\/image\/generator_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/generator_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/generator_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160.11404133999\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EBequemer Service f\u00fcr best\u00e4tigen und generieren von Steuer-IdNr., IBAN, TIN, ISBN, EAN, Kennw\u00f6rter...\u003C\/p\u003E\n\u003Cp\u003EAuch als API und NPM package verf\u00fcgbar.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/generator_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/generator_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160.11404133999\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EBequemer Service f\u00fcr best\u00e4tigen und generieren von Steuer-IdNr., IBAN, TIN, ISBN, EAN, Kennw\u00f6rter...\u003C\/p\u003E\n\u003Cp\u003EAuch als API und NPM package verf\u00fcgbar.\u003C\/p\u003E","words":24,"readTime":null,"lang":"de"},"en":{"slug":"generator-and-validator-of-numbers-and-identifiers","title":"Generator and validator of numbers and identifiers","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/generator_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320.22808267997\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGqUlEQVRIiaWXu48kVxXGf\/dRj65+TvdOj70DGK9XAmmxAG3ilNABSMb8AUjkyAkBMTEpARIBCWaRJWJAwgksEpaxRLASYAOrhdn1zqu7p7uqq+7jEFRPz4x31iBxpKu+3XXv6e9837nn3FJf\/8brYo2l6Hbp9Qd0Ol2U0vw\/JiLns813gHh5wfap2s4FBGyWJBhjcU3D7PSY3cmENC8oy4qmqcmyHO89RVGwXq8JwaOUxhgNKGKMxBjw3gPgBEJoEHcBwPiAIASjUEqRJymIUNZrksRijEG1eLBsnIcQCc4xne7ROM9Hf\/+Ifq9PVZWUZYnWmul0Slmu6PcHOOeo1hX9Xo+Dx\/+mqWuUUri4YSAGlFIoBTd2hiRJRogKEcGva4iCMmpDlkI2iNTdu18RrYQY2ohskjAc7\/DgwV\/pdgvUJkql1JZtQVAXgrSOAFGGPMtQSDuUpnENezdv8qU7rz4jZyuTtH5EAMFqo7FaIzoSY+THP\/0ZWapIVEK3W1yTIO3HbDYnSiSEwMHjx9x755d893tvMck6xBjpdrtbAIJgtMF7z+lshjEGBKJE7v\/hPu\/\/6X3YBGyNsUgMLKsKgHS4A+LIlWZvundtwiqlGI\/HeO8RIE1TvvjK51lnXTpFjnOeyWSyXbsFJkK\/329\/1xoFfPBBBy50wNokwdehTUgfGGTgPDQSeXT0hOFw+CxLG1vOTvHO45qaTifjM\/2EtXc4cTw6fIwAWZrSKS4xbaFZ19Sn5TUeBWutxddtjogItXiksNzIBhf6PMeGoxFEwTUNEgILaqa9IX1tN3vVtfuyLKPYybbsXTabZzlNVWGNwSlPz2ZgLdXsEHoDdrIeqbYXMWxkEBFUspEDeHoyZy8f4n2kbFZ0i4ydtHdFsnNTSiGJXA8oTRKKNMFojQ+Rk6czer0ukMJszSHrT2UJ4ODjp0h0rI6WaK3QQLX2VKw+dZ+IcLa8vEa1pyzGiNWKTpaD0vR7vf8K4rJTUDTOk2UZeZb+z3vrpiHKJ9h781vflLPDJ\/gYWawqvvzaXbTRNKHBakuR9xh1BiyqOZWr2ekOWIUlRhuWq4rCFDR1w8HBY1763MvU3iOxLSGyAZxazSu3bl8OY8vI8ckxq9UFSxatcSGiFMQYeev7P4CwoogJL+xNKYqrteg8h8qy5HQ2I\/jA6fyEt+\/d4\/XvfJvbWa+V3weyLGN398YlJjcwznNQKX5+7x6\/u\/\/7LUhrjcXHgKLtM+Nugc36pEbhNSxcdT3fiWI0GiJRWJwtWNeO29N9eglXDti1+2PE+E31V1fBWpNYGh\/IrMXHCDTUq8BaBK01vV4Pbcy1mOaLBcF5mqYBEVSomJcNAKPRzvWBAM45lotNHfpEZbGJTfA+bK8EK7\/GpYpJZaGf4Yg4V6O9wkWPTS3BRUxqMEXOJO9ztlxSlSvyYMG2JcIv6+cCUkDeaVNhXddXGUoSS4gRrRXr2lHYDJ2knJUzupJh5jMY9AiugsQi3rEONQM1pJwfEW3bEpzz\/PnDD7GpZTC4Wt07OmV+espqc2s4H9PplHXjrgKySUIMHowmRE+IkVlzRsg7OLcCr5lojRRdOicV9aRgnHWpQ0NnNGCY9amLBa\/eucP+Sy8wHT4r1b+eHG5yJWJMQtM02+Z73uXPpbNGKTp5ijWGQb9PHgzjbHDhbQT4zXyY0NnMUzJQ4KuGqlwRXIWuNIfrGUh7D2pLlJCTUm3++7wxdzenV0SQeImhEDyrqqbxgRd3xzw9WdBZOxaLM87OzphMJuR53gahWq8P\/\/kPbJKyv7+PQnE0XxLl+r61NQGtNU3TUNc1eZ5jjGlrVgjbE2cVQu08L+6O6XYy0sRwc3fCzd3Jc33vTy+eRRGeHDzib395wE9+9ENO5nNW5Zq6cWir2RsNGfR6IBGUxgtom6CNRSnN6ekxwTu0NqAUVmvNF26\/TGhqQgi884u36XRy0jRjNp+zWp6hNBtaFc57JApGw6DfxyQps5Njbt26zZuvfY0bX70DtGyUZcVoZ0TR6XB0dERZVkSJiAhJkqC15je\/\/hXvvvtbYowopbHl4pQ0TTmrVoyGA9584w3SNCXJMrzzxBjay5yA0np75VSAsRalFA8fPuS99\/7IZ++MWSYKHzxpalBYKnF4B+mwSzpsE1mJXBRGgRgFpdphk7wgzhcMRjuMxhMmpWB85DjWGGNIs5ymaUiShG6vS+\/8dGxACVCWFSKRj+0Obj5DRBiPJ6RpCgjeOTYvOgDUVU29WKGUwvuG4B1KG5RS\/Af3xoJXKXZWkwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/generator_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320.22808267997\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EGenerate and validate numbers and identifiers like IBAN, ISBN, EAN, PESEL, BSN, passwords...\u003C\/p\u003E\n\u003Cp\u003EAlso available as and API and an NPM package.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/generator_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022640.45616535994\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGqUlEQVRIiaWXu48kVxXGf\/dRj65+TvdOj70DGK9XAmmxAG3ilNABSMb8AUjkyAkBMTEpARIBCWaRJWJAwgksEpaxRLASYAOrhdn1zqu7p7uqq+7jEFRPz4x31iBxpKu+3XXv6e9837nn3FJf\/8brYo2l6Hbp9Qd0Ol2U0vw\/JiLns813gHh5wfap2s4FBGyWJBhjcU3D7PSY3cmENC8oy4qmqcmyHO89RVGwXq8JwaOUxhgNKGKMxBjw3gPgBEJoEHcBwPiAIASjUEqRJymIUNZrksRijEG1eLBsnIcQCc4xne7ROM9Hf\/+Ifq9PVZWUZYnWmul0Slmu6PcHOOeo1hX9Xo+Dx\/+mqWuUUri4YSAGlFIoBTd2hiRJRogKEcGva4iCMmpDlkI2iNTdu18RrYQY2ohskjAc7\/DgwV\/pdgvUJkql1JZtQVAXgrSOAFGGPMtQSDuUpnENezdv8qU7rz4jZyuTtH5EAMFqo7FaIzoSY+THP\/0ZWapIVEK3W1yTIO3HbDYnSiSEwMHjx9x755d893tvMck6xBjpdrtbAIJgtMF7z+lshjEGBKJE7v\/hPu\/\/6X3YBGyNsUgMLKsKgHS4A+LIlWZvundtwiqlGI\/HeO8RIE1TvvjK51lnXTpFjnOeyWSyXbsFJkK\/329\/1xoFfPBBBy50wNokwdehTUgfGGTgPDQSeXT0hOFw+CxLG1vOTvHO45qaTifjM\/2EtXc4cTw6fIwAWZrSKS4xbaFZ19Sn5TUeBWutxddtjogItXiksNzIBhf6PMeGoxFEwTUNEgILaqa9IX1tN3vVtfuyLKPYybbsXTabZzlNVWGNwSlPz2ZgLdXsEHoDdrIeqbYXMWxkEBFUspEDeHoyZy8f4n2kbFZ0i4ydtHdFsnNTSiGJXA8oTRKKNMFojQ+Rk6czer0ukMJszSHrT2UJ4ODjp0h0rI6WaK3QQLX2VKw+dZ+IcLa8vEa1pyzGiNWKTpaD0vR7vf8K4rJTUDTOk2UZeZb+z3vrpiHKJ9h781vflLPDJ\/gYWawqvvzaXbTRNKHBakuR9xh1BiyqOZWr2ekOWIUlRhuWq4rCFDR1w8HBY1763MvU3iOxLSGyAZxazSu3bl8OY8vI8ckxq9UFSxatcSGiFMQYeev7P4CwoogJL+xNKYqrteg8h8qy5HQ2I\/jA6fyEt+\/d4\/XvfJvbWa+V3weyLGN398YlJjcwznNQKX5+7x6\/u\/\/7LUhrjcXHgKLtM+Nugc36pEbhNSxcdT3fiWI0GiJRWJwtWNeO29N9eglXDti1+2PE+E31V1fBWpNYGh\/IrMXHCDTUq8BaBK01vV4Pbcy1mOaLBcF5mqYBEVSomJcNAKPRzvWBAM45lotNHfpEZbGJTfA+bK8EK7\/GpYpJZaGf4Yg4V6O9wkWPTS3BRUxqMEXOJO9ztlxSlSvyYMG2JcIv6+cCUkDeaVNhXddXGUoSS4gRrRXr2lHYDJ2knJUzupJh5jMY9AiugsQi3rEONQM1pJwfEW3bEpzz\/PnDD7GpZTC4Wt07OmV+espqc2s4H9PplHXjrgKySUIMHowmRE+IkVlzRsg7OLcCr5lojRRdOicV9aRgnHWpQ0NnNGCY9amLBa\/eucP+Sy8wHT4r1b+eHG5yJWJMQtM02+Z73uXPpbNGKTp5ijWGQb9PHgzjbHDhbQT4zXyY0NnMUzJQ4KuGqlwRXIWuNIfrGUh7D2pLlJCTUm3++7wxdzenV0SQeImhEDyrqqbxgRd3xzw9WdBZOxaLM87OzphMJuR53gahWq8P\/\/kPbJKyv7+PQnE0XxLl+r61NQGtNU3TUNc1eZ5jjGlrVgjbE2cVQu08L+6O6XYy0sRwc3fCzd3Jc33vTy+eRRGeHDzib395wE9+9ENO5nNW5Zq6cWir2RsNGfR6IBGUxgtom6CNRSnN6ekxwTu0NqAUVmvNF26\/TGhqQgi884u36XRy0jRjNp+zWp6hNBtaFc57JApGw6DfxyQps5Njbt26zZuvfY0bX70DtGyUZcVoZ0TR6XB0dERZVkSJiAhJkqC15je\/\/hXvvvtbYowopbHl4pQ0TTmrVoyGA9584w3SNCXJMrzzxBjay5yA0np75VSAsRalFA8fPuS99\/7IZ++MWSYKHzxpalBYKnF4B+mwSzpsE1mJXBRGgRgFpdphk7wgzhcMRjuMxhMmpWB85DjWGGNIs5ymaUiShG6vS+\/8dGxACVCWFSKRj+0Obj5DRBiPJ6RpCgjeOTYvOgDUVU29WKGUwvuG4B1KG5RS\/Af3xoJXKXZWkwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/generator_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022640.45616535994\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EGenerate and validate numbers and identifiers like IBAN, ISBN, EAN, PESEL, BSN, passwords...\u003C\/p\u003E\n\u003Cp\u003EAlso available as and API and an NPM package.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["checksum","express","generate","generator","iban","identifier","isbn","javascript","node","nodejs","numbers","validate","validator","webpack"],"hasMore":false,"image":"https:\/\/avris.it\/image\/generator_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/generator_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/generator_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160.11404133999\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EGenerate and validate numbers and identifiers like IBAN, ISBN, EAN, PESEL, BSN, passwords...\u003C\/p\u003E\n\u003Cp\u003EAlso available as and API and an NPM package.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/generator_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/generator_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160.11404133999\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EGenerate and validate numbers and identifiers like IBAN, ISBN, EAN, PESEL, BSN, passwords...\u003C\/p\u003E\n\u003Cp\u003EAlso available as and API and an NPM package.\u003C\/p\u003E","words":22,"readTime":null,"lang":"en"},"pl":{"slug":"generator-numer\u00f3w","title":"Generator numer\u00f3w","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/generator_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320.22808267997\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGqUlEQVRIiaWXu48kVxXGf\/dRj65+TvdOj70DGK9XAmmxAG3ilNABSMb8AUjkyAkBMTEpARIBCWaRJWJAwgksEpaxRLASYAOrhdn1zqu7p7uqq+7jEFRPz4x31iBxpKu+3XXv6e9837nn3FJf\/8brYo2l6Hbp9Qd0Ol2U0vw\/JiLns813gHh5wfap2s4FBGyWJBhjcU3D7PSY3cmENC8oy4qmqcmyHO89RVGwXq8JwaOUxhgNKGKMxBjw3gPgBEJoEHcBwPiAIASjUEqRJymIUNZrksRijEG1eLBsnIcQCc4xne7ROM9Hf\/+Ifq9PVZWUZYnWmul0Slmu6PcHOOeo1hX9Xo+Dx\/+mqWuUUri4YSAGlFIoBTd2hiRJRogKEcGva4iCMmpDlkI2iNTdu18RrYQY2ohskjAc7\/DgwV\/pdgvUJkql1JZtQVAXgrSOAFGGPMtQSDuUpnENezdv8qU7rz4jZyuTtH5EAMFqo7FaIzoSY+THP\/0ZWapIVEK3W1yTIO3HbDYnSiSEwMHjx9x755d893tvMck6xBjpdrtbAIJgtMF7z+lshjEGBKJE7v\/hPu\/\/6X3YBGyNsUgMLKsKgHS4A+LIlWZvundtwiqlGI\/HeO8RIE1TvvjK51lnXTpFjnOeyWSyXbsFJkK\/329\/1xoFfPBBBy50wNokwdehTUgfGGTgPDQSeXT0hOFw+CxLG1vOTvHO45qaTifjM\/2EtXc4cTw6fIwAWZrSKS4xbaFZ19Sn5TUeBWutxddtjogItXiksNzIBhf6PMeGoxFEwTUNEgILaqa9IX1tN3vVtfuyLKPYybbsXTabZzlNVWGNwSlPz2ZgLdXsEHoDdrIeqbYXMWxkEBFUspEDeHoyZy8f4n2kbFZ0i4ydtHdFsnNTSiGJXA8oTRKKNMFojQ+Rk6czer0ukMJszSHrT2UJ4ODjp0h0rI6WaK3QQLX2VKw+dZ+IcLa8vEa1pyzGiNWKTpaD0vR7vf8K4rJTUDTOk2UZeZb+z3vrpiHKJ9h781vflLPDJ\/gYWawqvvzaXbTRNKHBakuR9xh1BiyqOZWr2ekOWIUlRhuWq4rCFDR1w8HBY1763MvU3iOxLSGyAZxazSu3bl8OY8vI8ckxq9UFSxatcSGiFMQYeev7P4CwoogJL+xNKYqrteg8h8qy5HQ2I\/jA6fyEt+\/d4\/XvfJvbWa+V3weyLGN398YlJjcwznNQKX5+7x6\/u\/\/7LUhrjcXHgKLtM+Nugc36pEbhNSxcdT3fiWI0GiJRWJwtWNeO29N9eglXDti1+2PE+E31V1fBWpNYGh\/IrMXHCDTUq8BaBK01vV4Pbcy1mOaLBcF5mqYBEVSomJcNAKPRzvWBAM45lotNHfpEZbGJTfA+bK8EK7\/GpYpJZaGf4Yg4V6O9wkWPTS3BRUxqMEXOJO9ztlxSlSvyYMG2JcIv6+cCUkDeaVNhXddXGUoSS4gRrRXr2lHYDJ2knJUzupJh5jMY9AiugsQi3rEONQM1pJwfEW3bEpzz\/PnDD7GpZTC4Wt07OmV+espqc2s4H9PplHXjrgKySUIMHowmRE+IkVlzRsg7OLcCr5lojRRdOicV9aRgnHWpQ0NnNGCY9amLBa\/eucP+Sy8wHT4r1b+eHG5yJWJMQtM02+Z73uXPpbNGKTp5ijWGQb9PHgzjbHDhbQT4zXyY0NnMUzJQ4KuGqlwRXIWuNIfrGUh7D2pLlJCTUm3++7wxdzenV0SQeImhEDyrqqbxgRd3xzw9WdBZOxaLM87OzphMJuR53gahWq8P\/\/kPbJKyv7+PQnE0XxLl+r61NQGtNU3TUNc1eZ5jjGlrVgjbE2cVQu08L+6O6XYy0sRwc3fCzd3Jc33vTy+eRRGeHDzib395wE9+9ENO5nNW5Zq6cWir2RsNGfR6IBGUxgtom6CNRSnN6ekxwTu0NqAUVmvNF26\/TGhqQgi884u36XRy0jRjNp+zWp6hNBtaFc57JApGw6DfxyQps5Njbt26zZuvfY0bX70DtGyUZcVoZ0TR6XB0dERZVkSJiAhJkqC15je\/\/hXvvvtbYowopbHl4pQ0TTmrVoyGA9584w3SNCXJMrzzxBjay5yA0np75VSAsRalFA8fPuS99\/7IZ++MWSYKHzxpalBYKnF4B+mwSzpsE1mJXBRGgRgFpdphk7wgzhcMRjuMxhMmpWB85DjWGGNIs5ymaUiShG6vS+\/8dGxACVCWFSKRj+0Obj5DRBiPJ6RpCgjeOTYvOgDUVU29WKGUwvuG4B1KG5RS\/Af3xoJXKXZWkwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/generator_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022320.22808267997\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWygodne narz\u0119dzie do walidowania i generowania numer\u00f3w PESEL, NIP, REGON, numeru dowodu osobistego, rachunku bankowego, hase\u0142 itp.\u003C\/p\u003E\n\u003Cp\u003EDost\u0119pny r\u00f3wnie\u017c jako API oraz pakiet NPM.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/generator_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022640.45616535994\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGqUlEQVRIiaWXu48kVxXGf\/dRj65+TvdOj70DGK9XAmmxAG3ilNABSMb8AUjkyAkBMTEpARIBCWaRJWJAwgksEpaxRLASYAOrhdn1zqu7p7uqq+7jEFRPz4x31iBxpKu+3XXv6e9837nn3FJf\/8brYo2l6Hbp9Qd0Ol2U0vw\/JiLns813gHh5wfap2s4FBGyWJBhjcU3D7PSY3cmENC8oy4qmqcmyHO89RVGwXq8JwaOUxhgNKGKMxBjw3gPgBEJoEHcBwPiAIASjUEqRJymIUNZrksRijEG1eLBsnIcQCc4xne7ROM9Hf\/+Ifq9PVZWUZYnWmul0Slmu6PcHOOeo1hX9Xo+Dx\/+mqWuUUri4YSAGlFIoBTd2hiRJRogKEcGva4iCMmpDlkI2iNTdu18RrYQY2ohskjAc7\/DgwV\/pdgvUJkql1JZtQVAXgrSOAFGGPMtQSDuUpnENezdv8qU7rz4jZyuTtH5EAMFqo7FaIzoSY+THP\/0ZWapIVEK3W1yTIO3HbDYnSiSEwMHjx9x755d893tvMck6xBjpdrtbAIJgtMF7z+lshjEGBKJE7v\/hPu\/\/6X3YBGyNsUgMLKsKgHS4A+LIlWZvundtwiqlGI\/HeO8RIE1TvvjK51lnXTpFjnOeyWSyXbsFJkK\/329\/1xoFfPBBBy50wNokwdehTUgfGGTgPDQSeXT0hOFw+CxLG1vOTvHO45qaTifjM\/2EtXc4cTw6fIwAWZrSKS4xbaFZ19Sn5TUeBWutxddtjogItXiksNzIBhf6PMeGoxFEwTUNEgILaqa9IX1tN3vVtfuyLKPYybbsXTabZzlNVWGNwSlPz2ZgLdXsEHoDdrIeqbYXMWxkEBFUspEDeHoyZy8f4n2kbFZ0i4ydtHdFsnNTSiGJXA8oTRKKNMFojQ+Rk6czer0ukMJszSHrT2UJ4ODjp0h0rI6WaK3QQLX2VKw+dZ+IcLa8vEa1pyzGiNWKTpaD0vR7vf8K4rJTUDTOk2UZeZb+z3vrpiHKJ9h781vflLPDJ\/gYWawqvvzaXbTRNKHBakuR9xh1BiyqOZWr2ekOWIUlRhuWq4rCFDR1w8HBY1763MvU3iOxLSGyAZxazSu3bl8OY8vI8ckxq9UFSxatcSGiFMQYeev7P4CwoogJL+xNKYqrteg8h8qy5HQ2I\/jA6fyEt+\/d4\/XvfJvbWa+V3weyLGN398YlJjcwznNQKX5+7x6\/u\/\/7LUhrjcXHgKLtM+Nugc36pEbhNSxcdT3fiWI0GiJRWJwtWNeO29N9eglXDti1+2PE+E31V1fBWpNYGh\/IrMXHCDTUq8BaBK01vV4Pbcy1mOaLBcF5mqYBEVSomJcNAKPRzvWBAM45lotNHfpEZbGJTfA+bK8EK7\/GpYpJZaGf4Yg4V6O9wkWPTS3BRUxqMEXOJO9ztlxSlSvyYMG2JcIv6+cCUkDeaVNhXddXGUoSS4gRrRXr2lHYDJ2knJUzupJh5jMY9AiugsQi3rEONQM1pJwfEW3bEpzz\/PnDD7GpZTC4Wt07OmV+espqc2s4H9PplHXjrgKySUIMHowmRE+IkVlzRsg7OLcCr5lojRRdOicV9aRgnHWpQ0NnNGCY9amLBa\/eucP+Sy8wHT4r1b+eHG5yJWJMQtM02+Z73uXPpbNGKTp5ijWGQb9PHgzjbHDhbQT4zXyY0NnMUzJQ4KuGqlwRXIWuNIfrGUh7D2pLlJCTUm3++7wxdzenV0SQeImhEDyrqqbxgRd3xzw9WdBZOxaLM87OzphMJuR53gahWq8P\/\/kPbJKyv7+PQnE0XxLl+r61NQGtNU3TUNc1eZ5jjGlrVgjbE2cVQu08L+6O6XYy0sRwc3fCzd3Jc33vTy+eRRGeHDzib395wE9+9ENO5nNW5Zq6cWir2RsNGfR6IBGUxgtom6CNRSnN6ekxwTu0NqAUVmvNF26\/TGhqQgi884u36XRy0jRjNp+zWp6hNBtaFc57JApGw6DfxyQps5Njbt26zZuvfY0bX70DtGyUZcVoZ0TR6XB0dERZVkSJiAhJkqC15je\/\/hXvvvtbYowopbHl4pQ0TTmrVoyGA9584w3SNCXJMrzzxBjay5yA0np75VSAsRalFA8fPuS99\/7IZ++MWSYKHzxpalBYKnF4B+mwSzpsE1mJXBRGgRgFpdphk7wgzhcMRjuMxhMmpWB85DjWGGNIs5ymaUiShG6vS+\/8dGxACVCWFSKRj+0Obj5DRBiPJ6RpCgjeOTYvOgDUVU29WKGUwvuG4B1KG5RS\/Af3xoJXKXZWkwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/generator_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022640.45616535994\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWygodne narz\u0119dzie do walidowania i generowania numer\u00f3w PESEL, NIP, REGON, numeru dowodu osobistego, rachunku bankowego, hase\u0142 itp.\u003C\/p\u003E\n\u003Cp\u003EDost\u0119pny r\u00f3wnie\u017c jako API oraz pakiet NPM.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["coffeescript","dow\u00f3d osobisty","express","has\u0142o","iban","javascript","nip","node","nodejs","numer","pesel","rachunek bankowy","regon","webpack"],"hasMore":false,"image":"https:\/\/avris.it\/image\/generator_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/generator_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/generator_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160.11404133999\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWygodne narz\u0119dzie do walidowania i generowania numer\u00f3w PESEL, NIP, REGON, numeru dowodu osobistego, rachunku bankowego, hase\u0142 itp.\u003C\/p\u003E\n\u003Cp\u003EDost\u0119pny r\u00f3wnie\u017c jako API oraz pakiet NPM.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/generator_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/generator_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022160.11404133999\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWygodne narz\u0119dzie do walidowania i generowania numer\u00f3w PESEL, NIP, REGON, numeru dowodu osobistego, rachunku bankowego, hase\u0142 itp.\u003C\/p\u003E\n\u003Cp\u003EDost\u0119pny r\u00f3wnie\u017c jako API oraz pakiet NPM.\u003C\/p\u003E","words":28,"readTime":null,"lang":"pl"}}},"projects\/qc-quite-concise-programming-language":{"key":"projects\/qc-quite-concise-programming-language","type":"article","published":true,"meta":{"createdAt":"2017-04-28T19:43:45+02:00","publishedAt":"2015-12-23T00:53:00+01:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/qc.avris.it\/","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/QC","displayUrl":null}],"category":"projects","subcategory":null,"slug":"qc-quite-concise-programming-language"},"content":{"en":{"slug":"qc-quite-concise-programming-language","title":"QC \u2022 Quite Concise Programming Language","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/qc-quite-concise-programming-language_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022270.76923076923\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHaUlEQVRIiS2Vy64cZxVG13+pS1d1dZ+++PjENk5iOY6IcBKJSZiAEBEDJCaIB+AF4Bky4nV4AJCQEINMEhScxIljfD+XPqfvXd1V9V8ZnHzDNdmDvdf+xIOf\/S7KZIBIh3jnSNIeKu0T0oLx5AgrUwyaKDXDUZ+fvH\/Cn351j\/EgRyhJ4yJFqtBSIJXE+kjrAtYFAIwLNDZwMA7jA\/9+vuTxl09Zvb6kXe+w8zn4ltgswFyhPv3Dnz+z6Zh9C+geqrpBTEumb53wyS8f8mYPo35OJgUizThsWgZHBSejgl6myRNNABof2Znr4SGCC7A3gV3naU3g0bzh2abjpMq49ZMpk\/u3cbdu0lYTOJogygkkA8Rf\/vq3OF9s2TaO\/bbjeNpncmNMOqzQVUEdQWlJKRW71nE536MTRbdr+PDjO3x0e0gv0wgpCFHQhUDjAsZH9p3HW88X5zsendfcO+5xp58yzBSrxhJiYNUYVruOs7MVh0eP0aIq+PDBHZoQeXvS5\/a04mADWisSrYgIEiVxPtL5yHpv+O6ipl43nL7e8uibGTLTHN86YrE3FABlyovTLX6x4+i4Ii8SPj7pcVSmrK3n4mCZrVuEc0xKTXcwZIlG3L2NPqtbyhB4d1rRL3K01kx6iizV5KkmxIjzcDAeaT2BlPduVdTTAuMCb5YHNnvLctNQKcH2YHj5\/YxeT1P0FKE1vDlfU3rLf00gFjlOKVSe4q7WXC4X9MuEbFgiBejffvIeSmmqXkrVy0ArvJR4ITi4QKYknkiiJQiBDVBl0E81tfH0E0VPCX5YHvDG08bIw\/tj9KGl2dTcGaT849srTJ6QIvDNAYQiCInf7fH1nuXpEsweoRT6+KhkWGRordBakSca4yNaCfqZRgmBD5EQIokS1J2mNR4fIqebjidXV3xzeoXqDeg1az545x618ZxeSl4uWr56dAVKo6SiWWxI7Z7D9kAUAqklUimCc8QAuD161TlG\/ZxUSWyI5FpQZZpeqpBSEIEQr\/V1PpL\/yLeNo58IzON\/8bAoefb1K8Jb7\/N4ccykl1FWOfce3MTenbJc1jz955fI9QUH1xHTCqTAr3eIPEcojVLgjEG\/MykZlRlSSpRWZFoipcRGECHiQ8SFiPMRiNStx9hA3Xn21hNipLUWCZy\/WvL955+TFH2KG2P6gxJNZHW5JR0d4bIcZQ1aBryLMBwRtnO0FkjZI0SB+OL1ImZJgpKSALQuYkNEcB0bwLqA9YGD8bQ2EIkocc1PL2Zc\/O9b1Ml9frhc8fSZwbyakTiHcAaVJQzu3SXEgN3uiYcDyhl2sxnjk2N29YH9YolUikwZ9LpxZBb48VZ8hM5HXAQfIo0NbNYr3nz\/iLW7Xt84Txhnim1r2RjHpKoo7SWzbs9wdUq9X0C9I0sUrtXYHy4IR3d5+ME7tHXD4nyBM2MuX70mqyrSqsJ7T9d06CdXNWWaoJUkIggREilACFobeL3r+OZ8Q7ppmPYLrJB0xnJmHTsTuGojy90KrRNmy4a0zCmPMsgTknaDMzvSZsfVbMtXu5a86FHvG7I0g6RAtTuyVOCJGOnQf3+1YpAlVKlmmicsOserreGtMmWaJ+RK0DrNZX6f7zaO3emSNFFM5Bzn98gkZykUVSmZDnLODw6rBmxjRnQVYb9FRIfE0718zj7VxODpEAig83vq+TlCZoBAz2rL+daQJoq+EIQQMZ3n\/HSDaww6kaATmp2lO1\/inz7DbLdMTxyr5SVFohFHI4w3XJZ9dJkTREpoHHG3JtECLQTRB0y7xhw8SEXSH+JcQMkE9E2ynqDbzdC3BwnGRUIUTIuETeOotx2htSRS0i4O2OUOVx8I6y3oDJGXvHw1g2RCG0vePr7P+ZPvaN\/MkeUYqgyR9qBSDEYFRSKYn52jQkTIHYgItiVNJMSIyjO8rQneoN8tNKnSOAQekBH8pOQi0XSNIw4K4rXxyLJPWK2Jhw0UQ9RwTJJqRmHB8\/Ua0ZsQ2xa6+bWJeYke57x\/7yY3Jj109Lx5fcHF61O8a5EiR6U5g1HFdlaj0gydEBmnknGR8bK2nEVLS0QoiUwUItXEPIWiwC93iH0G\/SEizwlNQ7tc8J+zLWJwE5mkqGyK7ywST1873PKMemZJdE7dOm6fHLG6usQbT1ef4WvP1k7pT4\/J9BTFL\/74WVSSMlWYEAgIXi5b2sZhjMdzbRwICBFhHaQp0XkwFpwl2hZpDiQqkipIehm3TkY0reHmyQ2cSFDB4ro9aZ6z3x+QWLzURB\/x7RV33rpB2u+j68WGJz7w\/HJHL88ISvNgkpPekFztHRd7S2sjQUqs7xGEQK52iLIgFAVxn3H3+C6rFy+oFzNGpWM8SPB2A+2K+fmG3\/z651zMt7x49ozV14\/wXQMyASEoq4yurTCmBUBVg59+ZlEkVR\/\/4+\/xEeatI9EKlEBreV28VUo5KkiHJSJPkaM+cjSkPyz5\/acfEYsRtukYVBmLyyt6Gcxnc4z3HN864fTNFcEHbHdgND0hHU7pVWNQKTZK9nXN\/wECJSo73jElDwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/qc-quite-concise-programming-language_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022270.76923076923\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EThe idea is to create a \u003Cstrong\u003Esimple\u003C\/strong\u003E (in terms of complexity, not ease of use) programming language, that will have quite a \u003Cstrong\u003Econcise\u003C\/strong\u003E \u003Cstrong\u003Esyntax\u003C\/strong\u003E, that will play with the power of \u003Cstrong\u003EUnicode\u003C\/strong\u003E and most importantly \u2013 will be \u003Cstrong\u003Efun\u003C\/strong\u003E to create ;)\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/qc-quite-concise-programming-language_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022741\u0022 height=\u0022418\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHaUlEQVRIiS2Vy64cZxVG13+pS1d1dZ+++PjENk5iOY6IcBKJSZiAEBEDJCaIB+AF4Bky4nV4AJCQEINMEhScxIljfD+XPqfvXd1V9V8ZnHzDNdmDvdf+xIOf\/S7KZIBIh3jnSNIeKu0T0oLx5AgrUwyaKDXDUZ+fvH\/Cn351j\/EgRyhJ4yJFqtBSIJXE+kjrAtYFAIwLNDZwMA7jA\/9+vuTxl09Zvb6kXe+w8zn4ltgswFyhPv3Dnz+z6Zh9C+geqrpBTEumb53wyS8f8mYPo35OJgUizThsWgZHBSejgl6myRNNABof2Znr4SGCC7A3gV3naU3g0bzh2abjpMq49ZMpk\/u3cbdu0lYTOJogygkkA8Rf\/vq3OF9s2TaO\/bbjeNpncmNMOqzQVUEdQWlJKRW71nE536MTRbdr+PDjO3x0e0gv0wgpCFHQhUDjAsZH9p3HW88X5zsendfcO+5xp58yzBSrxhJiYNUYVruOs7MVh0eP0aIq+PDBHZoQeXvS5\/a04mADWisSrYgIEiVxPtL5yHpv+O6ipl43nL7e8uibGTLTHN86YrE3FABlyovTLX6x4+i4Ii8SPj7pcVSmrK3n4mCZrVuEc0xKTXcwZIlG3L2NPqtbyhB4d1rRL3K01kx6iizV5KkmxIjzcDAeaT2BlPduVdTTAuMCb5YHNnvLctNQKcH2YHj5\/YxeT1P0FKE1vDlfU3rLf00gFjlOKVSe4q7WXC4X9MuEbFgiBejffvIeSmmqXkrVy0ArvJR4ITi4QKYknkiiJQiBDVBl0E81tfH0E0VPCX5YHvDG08bIw\/tj9KGl2dTcGaT849srTJ6QIvDNAYQiCInf7fH1nuXpEsweoRT6+KhkWGRordBakSca4yNaCfqZRgmBD5EQIokS1J2mNR4fIqebjidXV3xzeoXqDeg1az545x618ZxeSl4uWr56dAVKo6SiWWxI7Z7D9kAUAqklUimCc8QAuD161TlG\/ZxUSWyI5FpQZZpeqpBSEIEQr\/V1PpL\/yLeNo58IzON\/8bAoefb1K8Jb7\/N4ccykl1FWOfce3MTenbJc1jz955fI9QUH1xHTCqTAr3eIPEcojVLgjEG\/MykZlRlSSpRWZFoipcRGECHiQ8SFiPMRiNStx9hA3Xn21hNipLUWCZy\/WvL955+TFH2KG2P6gxJNZHW5JR0d4bIcZQ1aBryLMBwRtnO0FkjZI0SB+OL1ImZJgpKSALQuYkNEcB0bwLqA9YGD8bQ2EIkocc1PL2Zc\/O9b1Ml9frhc8fSZwbyakTiHcAaVJQzu3SXEgN3uiYcDyhl2sxnjk2N29YH9YolUikwZ9LpxZBb48VZ8hM5HXAQfIo0NbNYr3nz\/iLW7Xt84Txhnim1r2RjHpKoo7SWzbs9wdUq9X0C9I0sUrtXYHy4IR3d5+ME7tHXD4nyBM2MuX70mqyrSqsJ7T9d06CdXNWWaoJUkIggREilACFobeL3r+OZ8Q7ppmPYLrJB0xnJmHTsTuGojy90KrRNmy4a0zCmPMsgTknaDMzvSZsfVbMtXu5a86FHvG7I0g6RAtTuyVOCJGOnQf3+1YpAlVKlmmicsOserreGtMmWaJ+RK0DrNZX6f7zaO3emSNFFM5Bzn98gkZykUVSmZDnLODw6rBmxjRnQVYb9FRIfE0718zj7VxODpEAig83vq+TlCZoBAz2rL+daQJoq+EIQQMZ3n\/HSDaww6kaATmp2lO1\/inz7DbLdMTxyr5SVFohFHI4w3XJZ9dJkTREpoHHG3JtECLQTRB0y7xhw8SEXSH+JcQMkE9E2ynqDbzdC3BwnGRUIUTIuETeOotx2htSRS0i4O2OUOVx8I6y3oDJGXvHw1g2RCG0vePr7P+ZPvaN\/MkeUYqgyR9qBSDEYFRSKYn52jQkTIHYgItiVNJMSIyjO8rQneoN8tNKnSOAQekBH8pOQi0XSNIw4K4rXxyLJPWK2Jhw0UQ9RwTJJqRmHB8\/Ua0ZsQ2xa6+bWJeYke57x\/7yY3Jj109Lx5fcHF61O8a5EiR6U5g1HFdlaj0gydEBmnknGR8bK2nEVLS0QoiUwUItXEPIWiwC93iH0G\/SEizwlNQ7tc8J+zLWJwE5mkqGyK7ywST1873PKMemZJdE7dOm6fHLG6usQbT1ef4WvP1k7pT4\/J9BTFL\/74WVSSMlWYEAgIXi5b2sZhjMdzbRwICBFhHaQp0XkwFpwl2hZpDiQqkipIehm3TkY0reHmyQ2cSFDB4ro9aZ6z3x+QWLzURB\/x7RV33rpB2u+j68WGJz7w\/HJHL88ISvNgkpPekFztHRd7S2sjQUqs7xGEQK52iLIgFAVxn3H3+C6rFy+oFzNGpWM8SPB2A+2K+fmG3\/z651zMt7x49ozV14\/wXQMyASEoq4yurTCmBUBVg59+ZlEkVR\/\/4+\/xEeatI9EKlEBreV28VUo5KkiHJSJPkaM+cjSkPyz5\/acfEYsRtukYVBmLyyt6Gcxnc4z3HN864fTNFcEHbHdgND0hHU7pVWNQKTZK9nXN\/wECJSo73jElDwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/qc-quite-concise-programming-language_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022741\u0022 height=\u0022418\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EThe idea is to create a \u003Cstrong\u003Esimple\u003C\/strong\u003E (in terms of complexity, not ease of use) programming language, that will have quite a \u003Cstrong\u003Econcise\u003C\/strong\u003E \u003Cstrong\u003Esyntax\u003C\/strong\u003E, that will play with the power of \u003Cstrong\u003EUnicode\u003C\/strong\u003E and most importantly \u2013 will be \u003Cstrong\u003Efun\u003C\/strong\u003E to create ;)\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["consise","esoteric","j\u0119zyk","language","php","programming","programming language","programowanie","qc"],"hasMore":false,"image":"https:\/\/avris.it\/image\/qc-quite-concise-programming-language_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/qc-quite-concise-programming-language_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/qc-quite-concise-programming-language_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022135.38461538462\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EThe idea is to create a \u003Cstrong\u003Esimple\u003C\/strong\u003E (in terms of complexity, not ease of use) programming language, that will have quite a \u003Cstrong\u003Econcise\u003C\/strong\u003E \u003Cstrong\u003Esyntax\u003C\/strong\u003E, that will play with the power of \u003Cstrong\u003EUnicode\u003C\/strong\u003E and most importantly \u2013 will be \u003Cstrong\u003Efun\u003C\/strong\u003E to create ;)\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/qc-quite-concise-programming-language_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/qc-quite-concise-programming-language_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022135.38461538462\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EThe idea is to create a \u003Cstrong\u003Esimple\u003C\/strong\u003E (in terms of complexity, not ease of use) programming language, that will have quite a \u003Cstrong\u003Econcise\u003C\/strong\u003E \u003Cstrong\u003Esyntax\u003C\/strong\u003E, that will play with the power of \u003Cstrong\u003EUnicode\u003C\/strong\u003E and most importantly \u2013 will be \u003Cstrong\u003Efun\u003C\/strong\u003E to create ;)\u003C\/p\u003E","words":40,"readTime":null,"lang":"en"}}},"projects\/can-i-go-home-now":{"key":"projects\/can-i-go-home-now","type":"article","published":true,"meta":{"createdAt":"2017-04-28T19:43:45+02:00","publishedAt":"2015-12-10T13:39:00+01:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/canigohome.avris.it\/","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/GoHome","displayUrl":null}],"category":"projects","subcategory":null,"slug":"can-i-go-home-now"},"content":{"en":{"slug":"can-i-go-home-now","title":"Can I go home now?","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/can-i-go-home-now_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022239.24882629108\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGbklEQVRIiV2WuW4TXxuHn5kzS+xxbMd2Fi8xTkgiBAWhAAmFCCgiKGhYGi6Aq6DJTXADFAiJkooOmoQKCMIgpKBAEi\/xJHa8jGc861cgRvp\/U56RzvZ7zvO+0rt37yLXdWk0Guzv73N4eEij0aBQKHDr1i10XefLly\/UajWCIKBcLjM\/P08ymcQwDCRJwjAMyuUyAJ1Oh0KhgBACgDAMiaIIWZYxDIMgCBgMBkiSxGQy4cePH+RyOXzfp9VqoaiqyqtXr+j3+xwdHXFycsLdu3fJZrO8fv2alZUV7t27R7PZxLIsjo6OODs7QwhBpVJhbm4Ox3EIw5B8Po9hGLiui6qqSJJEGIaEYUgmkwHAcZx4g0EQMB6PEUIghCAIApSPHz9Sr9dxXZd8Ps\/t27f59OkT79+\/J5\/Ps7y8jO\/7rK+vc3BwQBAEHB8fA1AsFomiCMdxME0zvi0ASZKQZZkoikgmkwghcF0Xx3Hicd\/3MQyDZDJJo9HAcRxEtVrd\/vz5M2tra2xsbPDy5Uva7TbXrl1jeXmZhYUFgiBgOBxSKpUAEEKgqipCCMIwpFQqMT09jaIoWJaFrusAFAoFoigiCAISiQTn5+eYpkkikUBRFPr9Pp1OJ57PdV2UbrfLs2fPaLVavHnzBs\/zWFpaIpfLsbu7C8DMzAySJHF2dkalUsFxHEajEZIkoaoq37594+rVqwCUSiXS6XQcSSqVQpIk\/v8bDAZ4nkcQBERRRLPZpFgsIjRN2378+DEvXrxACMFoNCKZTLK3t4dpmqytraGqKr7v4zgOtm2ztLREJpNBURT+\/PnD6ekppVIJWZYxTRMAXddRFIUgCPB9nyAIcF2XbreLpmlkMhnG4zG9Xg\/f97EsCwB5amqKTqdDLpej0+lgWRYHBwckEgkymQypVCqGLpvNIoTAtm2EEDFL09PT9Pt9PM\/D933a7Tau68ZRRFGEaZpYloUQgkwmQxiGDIdDbNtmMpkgyzKj0QhlcXGR58+f8\/TpU6Iool6vI4RgOBySy+XQdR3DMBBCkMvlkGWZbDaLJEmkUimCIIg3ValU4n+apiFJElEUoaoqxWKRTqeDruuEYYjv+zFfsiyjqiqmaSL29\/e3wzDk69ev3Lx5k3Q6TavVIpVK0e12WVlZIZ1Ok06nmZ2dpVKp\/Of1HB8fx4tOJhMGgwG9Xg9FUUgmk0wmE2zbJgxDxuMxh4eHNJtNRqMRg8EA3\/dJpVJEUfQ3CVVVt\/\/Jq16vU6vVWFlZod1uk0wmWV9fJ5PJkMlkYrgVRUFVVTzPo1QqMZlMGA6HDAYD2u02p6endLtdhBBEUYRlWfi+j+u61Ot1wjDEdV1s22ZqaoowDJmbm\/ubhKqq257nxQAeHR2haRqbm5t0Oh0uX77MhQsXmJ6exrZtHMchCAJmZmZQFOVv7opCuzuicXhAr9fDNE0cx0FRFDzPw7btWBPtdpswDAHQNC3G4t+YAqCqKqqqIssyruvy8+dPPM\/jwYMHzM\/P47oug8EAXdfxfT+ePJ\/PM5lMODw8pFKugjvC933m5uYoFAo0m02GwyGLi4sIIZBlGUVRSCQSWJaFpmn0ej263S6GYZDP51GEEExNTREEQfwioiji169f\/P79O2YhDEMKhQKzs7NIkkS328W2bTzP4\/z8HNd1WV1djQ28uroKwM7ODslkkmKxCMDe3h7VapVisYiu6\/R6PRKJBLlc7q8Yx+MxhmHgeR7pdBrf95FlmStXrnBwcMDi4iKqqsZ2\/ReX67qcnp7G9cuyLFRV5eTkBNM0GY\/HhGGI4zh0Oh16vR75fJ5yuYymaWiahq7rJJNJbNvm\/PycQqGABESqqsYykySJra0tTk5OODk5wbZtxuMxiUQCx3HQNI3JZEK5XMayLC5dukS9XscwDGq1GsPhkO\/fv8cHK5fLTE9Ps76+zo0bN5BlmX6\/T6lUiotyo9GgVqthGAayLMux0BYWFnjy5Ak7Ozvs7Ozgui6SJBEEAaPRCF3XUVWVfD4fl490Os2jR4+4ePEiHz58QJIkNjY2CMMQWZapVqtsbW3x8OFDNjc3Y5Zc1yWbzcbdwXg8\/lv579y5s22aJvfv30dRFN6+fctkMolbhX9Q+74fC83zPBzHYW5ujoWFBSqVCru7u\/T7fVqtFrlcjuvXr+N5HsvLy1SrVVZXVxmNRjHM\/3opx3GoVquxy\/4H69Nv42Fs0AsAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/can-i-go-home-now_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022239.24882629108\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EMissing your cosy home? Come in to find out, if you can stop working already and head back home!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/can-i-go-home-now_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022478.49765258216\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGbklEQVRIiV2WuW4TXxuHn5kzS+xxbMd2Fi8xTkgiBAWhAAmFCCgiKGhYGi6Aq6DJTXADFAiJkooOmoQKCMIgpKBAEi\/xJHa8jGc861cgRvp\/U56RzvZ7zvO+0rt37yLXdWk0Guzv73N4eEij0aBQKHDr1i10XefLly\/UajWCIKBcLjM\/P08ymcQwDCRJwjAMyuUyAJ1Oh0KhgBACgDAMiaIIWZYxDIMgCBgMBkiSxGQy4cePH+RyOXzfp9VqoaiqyqtXr+j3+xwdHXFycsLdu3fJZrO8fv2alZUV7t27R7PZxLIsjo6OODs7QwhBpVJhbm4Ox3EIw5B8Po9hGLiui6qqSJJEGIaEYUgmkwHAcZx4g0EQMB6PEUIghCAIApSPHz9Sr9dxXZd8Ps\/t27f59OkT79+\/J5\/Ps7y8jO\/7rK+vc3BwQBAEHB8fA1AsFomiCMdxME0zvi0ASZKQZZkoikgmkwghcF0Xx3Hicd\/3MQyDZDJJo9HAcRxEtVrd\/vz5M2tra2xsbPDy5Uva7TbXrl1jeXmZhYUFgiBgOBxSKpUAEEKgqipCCMIwpFQqMT09jaIoWJaFrusAFAoFoigiCAISiQTn5+eYpkkikUBRFPr9Pp1OJ57PdV2UbrfLs2fPaLVavHnzBs\/zWFpaIpfLsbu7C8DMzAySJHF2dkalUsFxHEajEZIkoaoq37594+rVqwCUSiXS6XQcSSqVQpIk\/v8bDAZ4nkcQBERRRLPZpFgsIjRN2378+DEvXrxACMFoNCKZTLK3t4dpmqytraGqKr7v4zgOtm2ztLREJpNBURT+\/PnD6ekppVIJWZYxTRMAXddRFIUgCPB9nyAIcF2XbreLpmlkMhnG4zG9Xg\/f97EsCwB5amqKTqdDLpej0+lgWRYHBwckEgkymQypVCqGLpvNIoTAtm2EEDFL09PT9Pt9PM\/D933a7Tau68ZRRFGEaZpYloUQgkwmQxiGDIdDbNtmMpkgyzKj0QhlcXGR58+f8\/TpU6Iool6vI4RgOBySy+XQdR3DMBBCkMvlkGWZbDaLJEmkUimCIIg3ValU4n+apiFJElEUoaoqxWKRTqeDruuEYYjv+zFfsiyjqiqmaSL29\/e3wzDk69ev3Lx5k3Q6TavVIpVK0e12WVlZIZ1Ok06nmZ2dpVKp\/Of1HB8fx4tOJhMGgwG9Xg9FUUgmk0wmE2zbJgxDxuMxh4eHNJtNRqMRg8EA3\/dJpVJEUfQ3CVVVt\/\/Jq16vU6vVWFlZod1uk0wmWV9fJ5PJkMlkYrgVRUFVVTzPo1QqMZlMGA6HDAYD2u02p6endLtdhBBEUYRlWfi+j+u61Ot1wjDEdV1s22ZqaoowDJmbm\/ubhKqq257nxQAeHR2haRqbm5t0Oh0uX77MhQsXmJ6exrZtHMchCAJmZmZQFOVv7opCuzuicXhAr9fDNE0cx0FRFDzPw7btWBPtdpswDAHQNC3G4t+YAqCqKqqqIssyruvy8+dPPM\/jwYMHzM\/P47oug8EAXdfxfT+ePJ\/PM5lMODw8pFKugjvC933m5uYoFAo0m02GwyGLi4sIIZBlGUVRSCQSWJaFpmn0ej263S6GYZDP51GEEExNTREEQfwioiji169f\/P79O2YhDEMKhQKzs7NIkkS328W2bTzP4\/z8HNd1WV1djQ28uroKwM7ODslkkmKxCMDe3h7VapVisYiu6\/R6PRKJBLlc7q8Yx+MxhmHgeR7pdBrf95FlmStXrnBwcMDi4iKqqsZ2\/ReX67qcnp7G9cuyLFRV5eTkBNM0GY\/HhGGI4zh0Oh16vR75fJ5yuYymaWiahq7rJJNJbNvm\/PycQqGABESqqsYykySJra0tTk5OODk5wbZtxuMxiUQCx3HQNI3JZEK5XMayLC5dukS9XscwDGq1GsPhkO\/fv8cHK5fLTE9Ps76+zo0bN5BlmX6\/T6lUiotyo9GgVqthGAayLMux0BYWFnjy5Ak7Ozvs7Ozgui6SJBEEAaPRCF3XUVWVfD4fl490Os2jR4+4ePEiHz58QJIkNjY2CMMQWZapVqtsbW3x8OFDNjc3Y5Zc1yWbzcbdwXg8\/lv579y5s22aJvfv30dRFN6+fctkMolbhX9Q+74fC83zPBzHYW5ujoWFBSqVCru7u\/T7fVqtFrlcjuvXr+N5HsvLy1SrVVZXVxmNRjHM\/3opx3GoVquxy\/4H69Nv42Fs0AsAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/can-i-go-home-now_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022478.49765258216\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EMissing your cosy home? Come in to find out, if you can stop working already and head back home!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["assetic","countdown","free time","javascript","job","js","micrus","php","programming","programowanie","weekend"],"hasMore":false,"image":"https:\/\/avris.it\/image\/can-i-go-home-now_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/can-i-go-home-now_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/can-i-go-home-now_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022119.62441314554\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EMissing your cosy home? Come in to find out, if you can stop working already and head back home!\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/can-i-go-home-now_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/can-i-go-home-now_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022119.62441314554\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EMissing your cosy home? Come in to find out, if you can stop working already and head back home!\u003C\/p\u003E","words":19,"readTime":null,"lang":"en"}}},"projects\/vocabus-dictionary-at-your-fingertips":{"key":"projects\/vocabus-dictionary-at-your-fingertips","type":"article","published":true,"meta":{"createdAt":"2017-04-28T19:43:42+02:00","publishedAt":"2015-08-05T18:40:00+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/vocabus.avris.it\/","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Vocabus","displayUrl":null}],"category":"projects","subcategory":null,"slug":"vocabus-dictionary-at-your-fingertips"},"content":{"en":{"slug":"vocabus-dictionary-at-your-fingertips","title":"Vocabus - Dictionary at your fingertips!","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/vocabus-dictionary-at-your-fingertips_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022228.21978021978\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEs0lEQVRIiXWWPYssxxmFn\/ejqrvna\/eufHUNBhsbjGScKFAgEMLO\/TOcODVG\/8ap\/4YzBcaRwaHBicBCV1rQzs7OTHdVvQpqdrhr2QUNnXTVwznnPdUyffZ5qDviA+IJUUdzJueJzc0bdrsbNps7bm7vSHlitx4xTwTBlA0IhhTsDyfu95Uvv97z8N0D337zLWVZAEHEERSAEBBVQPBhZL3dMQ2Jp8dHaplxUQVxUEXUCFEiFHVnqQsPhxM+Nob5xMe\/SAzDzGoMAJIVIoJzCY5D8JNd4YM3E9\/cL8zn9zkeDqgIf\/3nI7UZoCCACp4SlgZChFIbPk5MusbRDJpBBtCMaAJxShuQapgoh6Xxyxv402\/XqCqr1Yr\/Xl+f78nLHSGg3FEjiFZZ5+DDP\/6NxzkBioiibugw8t77dyR3cnLqUjA1XGxCPCM+EJIQHDTRJFNCKceFtHVO88Jf\/v7EV\/\/6N+mnH\/CHTwxVY5omAHZ2i5h0W4B\/fDnz5y\/2fP7pTFgC826fKoFQS2GeF9bbDQasViuWpeHkLWiHQB0xB0uITYhl8IFSg4XMRz\/b8Z\/bX3O3NnLOACxLe0enuL69WQu\/+9VI0hlR6\/sC4hkQ1u+9It\/ecKyVzZg414ICrn6DqCNmHUwM1GjhpGFHqLEwUNX4sX3F7eqMICyn1z+w7d114\/Cbn8N+X0Cf9wYQ8nbHtFkTBKFOQUCMBrj4BlEHlf6h9ECLGaGZiEBTAjGGwZnnBRHh\/v4eEaHWSgS8fv0jROSHYDc3aP4OZSBaw8YRHzILhpRgGoVjgdZgZYKLDaAKoogqqkqIonlFiINCiJFyYrfd4imzXW8YxuF66Ol04nQ6ERHc3r7imWt\/aoxWIQIhEM\/osO5uSKBuzEtDk+MOSwPFrHePJdScsJ6jaI1oBURo0TidzgCUZeF0PrF\/fHyhhJmhqvwPkZA8wjAi0wRUSM55rrSAYk60oLTg3EBF9ZKf7nO3zwk1Ar0EMoEnPCVyzszzDNGVucY5AhAeHh44HA4vgHSc0GFEzPBp3afaEuclqCU4FuF4FlptuF6CHKrdOrVrSWpK4E4tC+5Dz0trmBnr9QpVvR7aWkNFIQIze6mQOVINsR7cWBoigmclJUEaSAvmRXAuICLau0KeVVHUHEkZcaPUSs75Ou4RQa0VgJQSKaUXELVWVglqDaIWJGVoFVTxwSjnQi1COTdEBUI6ZMgzjIFIh\/HeG+GOegZTxJS3b9\/y9PSECETAbre7Av6\/5e5ISkg4eEIEytLQ7BAgJv02MYEal7tMtcOYg9pFoS570MjTBnRmu11h5uSc2O1210PP5zPH44nVanoBuD81krdeIcuCkC5uCOW4YNl7uwcsc0MQHDUw79MhIAKiclHJEM+0aLR4buTodrWGvZMhAezSxu+u1trlBki9p1oQKtiYgaDOELVC7dbJq99\/Ed2mDGqoaQ9zzr0gU8LXW4iZzVCxJF1m6T8JEUBAXZ7D06MS7fkJDmVNhCEEiPYSBqIEUdvVslYqLgSiBlG7VSJgCrSumBmNQIeJJ4c8dpmbgDu06ABNOgACtQUthF4EgVhADRAhWsDSiAYigVifzLZUIhrfA7dv6UObXUFjAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/vocabus-dictionary-at-your-fingertips_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022228.21978021978\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWhatever you\u2019re doing on your computer, this dictionary is always \u003Cstrong\u003Ejust two hotkeys away\u003C\/strong\u003E! In a browser, document, pdf reader, everywhere!\u003C\/p\u003E\n\u003Cp\u003EJust select a word you want to look up and press Ctrl+C to put it in the Clipboard. Now just press Ctrl+Shift+C. Vocabus will show up and look up a word for you! It\u2019s \u003Cstrong\u003Equick and comfortable\u003C\/strong\u003E, isn\u2019t it?\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/vocabus-dictionary-at-your-fingertips_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022456.43956043956\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEs0lEQVRIiXWWPYssxxmFn\/ejqrvna\/eufHUNBhsbjGScKFAgEMLO\/TOcODVG\/8ap\/4YzBcaRwaHBicBCV1rQzs7OTHdVvQpqdrhr2QUNnXTVwznnPdUyffZ5qDviA+IJUUdzJueJzc0bdrsbNps7bm7vSHlitx4xTwTBlA0IhhTsDyfu95Uvv97z8N0D337zLWVZAEHEERSAEBBVQPBhZL3dMQ2Jp8dHaplxUQVxUEXUCFEiFHVnqQsPhxM+Nob5xMe\/SAzDzGoMAJIVIoJzCY5D8JNd4YM3E9\/cL8zn9zkeDqgIf\/3nI7UZoCCACp4SlgZChFIbPk5MusbRDJpBBtCMaAJxShuQapgoh6Xxyxv402\/XqCqr1Yr\/Xl+f78nLHSGg3FEjiFZZ5+DDP\/6NxzkBioiibugw8t77dyR3cnLqUjA1XGxCPCM+EJIQHDTRJFNCKceFtHVO88Jf\/v7EV\/\/6N+mnH\/CHTwxVY5omAHZ2i5h0W4B\/fDnz5y\/2fP7pTFgC826fKoFQS2GeF9bbDQasViuWpeHkLWiHQB0xB0uITYhl8IFSg4XMRz\/b8Z\/bX3O3NnLOACxLe0enuL69WQu\/+9VI0hlR6\/sC4hkQ1u+9It\/ecKyVzZg414ICrn6DqCNmHUwM1GjhpGFHqLEwUNX4sX3F7eqMICyn1z+w7d114\/Cbn8N+X0Cf9wYQ8nbHtFkTBKFOQUCMBrj4BlEHlf6h9ECLGaGZiEBTAjGGwZnnBRHh\/v4eEaHWSgS8fv0jROSHYDc3aP4OZSBaw8YRHzILhpRgGoVjgdZgZYKLDaAKoogqqkqIonlFiINCiJFyYrfd4imzXW8YxuF66Ol04nQ6ERHc3r7imWt\/aoxWIQIhEM\/osO5uSKBuzEtDk+MOSwPFrHePJdScsJ6jaI1oBURo0TidzgCUZeF0PrF\/fHyhhJmhqvwPkZA8wjAi0wRUSM55rrSAYk60oLTg3EBF9ZKf7nO3zwk1Ar0EMoEnPCVyzszzDNGVucY5AhAeHh44HA4vgHSc0GFEzPBp3afaEuclqCU4FuF4FlptuF6CHKrdOrVrSWpK4E4tC+5Dz0trmBnr9QpVvR7aWkNFIQIze6mQOVINsR7cWBoigmclJUEaSAvmRXAuICLau0KeVVHUHEkZcaPUSs75Ou4RQa0VgJQSKaUXELVWVglqDaIWJGVoFVTxwSjnQi1COTdEBUI6ZMgzjIFIh\/HeG+GOegZTxJS3b9\/y9PSECETAbre7Av6\/5e5ISkg4eEIEytLQ7BAgJv02MYEal7tMtcOYg9pFoS570MjTBnRmu11h5uSc2O1210PP5zPH44nVanoBuD81krdeIcuCkC5uCOW4YNl7uwcsc0MQHDUw79MhIAKiclHJEM+0aLR4buTodrWGvZMhAezSxu+u1trlBki9p1oQKtiYgaDOELVC7dbJq99\/Ed2mDGqoaQ9zzr0gU8LXW4iZzVCxJF1m6T8JEUBAXZ7D06MS7fkJDmVNhCEEiPYSBqIEUdvVslYqLgSiBlG7VSJgCrSumBmNQIeJJ4c8dpmbgDu06ABNOgACtQUthF4EgVhADRAhWsDSiAYigVifzLZUIhrfA7dv6UObXUFjAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/vocabus-dictionary-at-your-fingertips_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022456.43956043956\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWhatever you\u2019re doing on your computer, this dictionary is always \u003Cstrong\u003Ejust two hotkeys away\u003C\/strong\u003E! In a browser, document, pdf reader, everywhere!\u003C\/p\u003E\n\u003Cp\u003EJust select a word you want to look up and press Ctrl+C to put it in the Clipboard. Now just press Ctrl+Shift+C. Vocabus will show up and look up a word for you! It\u2019s \u003Cstrong\u003Equick and comfortable\u003C\/strong\u003E, isn\u2019t it?\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["dictionary","javascript","node webkit","nodejs","s\u0142ownik","w\u00f6rterbuch"],"hasMore":false,"image":"https:\/\/avris.it\/image\/vocabus-dictionary-at-your-fingertips_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/vocabus-dictionary-at-your-fingertips_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/vocabus-dictionary-at-your-fingertips_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022114.10989010989\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWhatever you\u2019re doing on your computer, this dictionary is always \u003Cstrong\u003Ejust two hotkeys away\u003C\/strong\u003E! In a browser, document, pdf reader, everywhere!\u003C\/p\u003E\n\u003Cp\u003EJust select a word you want to look up and press Ctrl+C to put it in the Clipboard. Now just press Ctrl+Shift+C. Vocabus will show up and look up a word for you! It\u2019s \u003Cstrong\u003Equick and comfortable\u003C\/strong\u003E, isn\u2019t it?\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/vocabus-dictionary-at-your-fingertips_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/vocabus-dictionary-at-your-fingertips_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022114.10989010989\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWhatever you\u2019re doing on your computer, this dictionary is always \u003Cstrong\u003Ejust two hotkeys away\u003C\/strong\u003E! In a browser, document, pdf reader, everywhere!\u003C\/p\u003E\n\u003Cp\u003EJust select a word you want to look up and press Ctrl+C to put it in the Clipboard. Now just press Ctrl+Shift+C. Vocabus will show up and look up a word for you! It\u2019s \u003Cstrong\u003Equick and comfortable\u003C\/strong\u003E, isn\u2019t it?\u003C\/p\u003E","words":66,"readTime":null,"lang":"en"}}},"projects\/clavis-shared-password-storage":{"key":"projects\/clavis-shared-password-storage","type":"article","published":true,"meta":{"createdAt":"2017-04-28T19:43:38+02:00","publishedAt":"2015-07-16T11:31:00+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/clavis.avris.it\/","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Clavis","displayUrl":null}],"category":"projects","subcategory":null,"slug":"clavis-shared-password-storage"},"content":{"en":{"slug":"clavis-shared-password-storage","title":"Clavis \u2013 Shared password storage","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022267.17339667458\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEKElEQVRIiZ2Wv2\/bRhTHP3e8I0VSsiLHdl2oQeog3bIU6dr8DRnyJ3Tp2iVdAiND\/pEAyVhkDTLkr+iaIYCBoChgWxItUby714EiTVpx4uYt4o93d+99fzxRHR8fC8BkMkEpxbeE956zszMePHjAdDr9pvXv3r1Da40REQAeP36MtfZ\/b6aUYjab8fr1a46Ojrhz5weyLOf09JQ8z3HOobVum3XOAQqtFaPRDkrVBb19+xalFKaLiohQFAXWWpIkwXtPFEVbyD1\/\/pyjoyPev3\/PixcvGA6HbXH7+wcopUjTFBFhvV5jrf0i+g0oSqlLhACWyyUiwocPH7DWYoxhb2+vPbCJu3fvcnh4SFEUrNfr9nkInuVqRZamnJ+fUxQFy+WSLMvw3oMCayxVVRFCIE1TqqpiOBq1hRmlVFvhYDAghMD9+\/fRWrdJVVWhtQIUxhhevXrFcDjkyZMnVzqFal1BmpLnOSYyTCYT4jj+ohzKsrxEqLlofmuOa15FBK0jQPBeEMAYw7Nnz9om9vf36+6h1kPwLJdLjDEYaxgMBj1avhY9yrz3VFUFgKsqnA+k6QCUImwOnTvHLw8f4rxHa02WZczn801Bmt3JBAScd9g4vrYQEWkbCSG0z3qiDsFTliUhBKyJMMZQliXOeZIkBqAoCiJj8M4RRRHpIO0dcnZ6Rpql\/FOeMLs4J8\/zXiEKODB3cM7x6dMnRITd3d1LyrodaB0RgkcEsnzYc4bUJ7Y6M8bUayLd5kRRxK3JLQC+i6bspYdbyCjA6pg4jrl3717NxkYmW6JWSjEYpBhjWic0kHrvca5CKd26pqoqTEes3nuKiwvyLIMA1cohIoxGo5vbvrloYFCbjbXWKBQo2lmUJPEGxUAIAQmhtlZn49VyiTUGYyyjUXxtET3UOsX2KAsSWFcVIoK1htWqxBiD94EsS6EjRO9DjU5nM6014\/F4s8bf2FlN3paotdYbeGvHjMe3EBFqWunkXQe\/sF5XWGvRWrez7GvRaGhL1EBrexHh5OQE730NaZQQVExsI3768ftrOmVjCmlpvUn0bN9UBvXQy\/O8vX\/69E\/29m5TLBY476gqx87ODi9fvqQxQx9hRRInQK3D5WqFVqr9b7wuukiaq+rv3j969CuLxaL3\/uDgoDfZu+GdZzafE8eW2WzWUr2zM6Jcr2mykyQhjmvBf\/z4kfF43O7Xo0xE+HcBWQxB4Lff\/yDSEBuYryAxoBXMV4JWtZ6z+LKoyBhu366HXJZlLYJf0tJ0Ot2eQ1109kefX7ibX9JzlarPRRRFXFxcoLWmLEtEhDiOKcsV1sb89TcsyoAI\/Dy9RLxF6M2bN9\/8xdiIcotC73GuHo71CLFUlUMpTekiIqXQEfiN9kUEdXx8LJfW7qPQPeTqu25+k+u9v7GzrkbzefIfN0I9xLU5sOkAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022267.17339667458\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWe all have lots of lots of passwords and access keys... Keeping them in a web browser or a window application is a good idea, but only until you need to share them with somebody.\u003C\/p\u003E\n\u003Cp\u003EClavis can be installed on your PHP server (no 3rd party involved in storing your sensitive data). It lets you share your keys and be in control of what and with whom are you sharing.\u003C\/p\u003E\n\u003Cp\u003EIt\u2019s easy, safe, comfortable and totally free!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022534.34679334917\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEKElEQVRIiZ2Wv2\/bRhTHP3e8I0VSsiLHdl2oQeog3bIU6dr8DRnyJ3Tp2iVdAiND\/pEAyVhkDTLkr+iaIYCBoChgWxItUby714EiTVpx4uYt4o93d+99fzxRHR8fC8BkMkEpxbeE956zszMePHjAdDr9pvXv3r1Da40REQAeP36MtfZ\/b6aUYjab8fr1a46Ojrhz5weyLOf09JQ8z3HOobVum3XOAQqtFaPRDkrVBb19+xalFKaLiohQFAXWWpIkwXtPFEVbyD1\/\/pyjoyPev3\/PixcvGA6HbXH7+wcopUjTFBFhvV5jrf0i+g0oSqlLhACWyyUiwocPH7DWYoxhb2+vPbCJu3fvcnh4SFEUrNfr9nkInuVqRZamnJ+fUxQFy+WSLMvw3oMCayxVVRFCIE1TqqpiOBq1hRmlVFvhYDAghMD9+\/fRWrdJVVWhtQIUxhhevXrFcDjkyZMnVzqFal1BmpLnOSYyTCYT4jj+ohzKsrxEqLlofmuOa15FBK0jQPBeEMAYw7Nnz9om9vf36+6h1kPwLJdLjDEYaxgMBj1avhY9yrz3VFUFgKsqnA+k6QCUImwOnTvHLw8f4rxHa02WZczn801Bmt3JBAScd9g4vrYQEWkbCSG0z3qiDsFTliUhBKyJMMZQliXOeZIkBqAoCiJj8M4RRRHpIO0dcnZ6Rpql\/FOeMLs4J8\/zXiEKODB3cM7x6dMnRITd3d1LyrodaB0RgkcEsnzYc4bUJ7Y6M8bUayLd5kRRxK3JLQC+i6bspYdbyCjA6pg4jrl3717NxkYmW6JWSjEYpBhjWic0kHrvca5CKd26pqoqTEes3nuKiwvyLIMA1cohIoxGo5vbvrloYFCbjbXWKBQo2lmUJPEGxUAIAQmhtlZn49VyiTUGYyyjUXxtET3UOsX2KAsSWFcVIoK1htWqxBiD94EsS6EjRO9DjU5nM6014\/F4s8bf2FlN3paotdYbeGvHjMe3EBFqWunkXQe\/sF5XWGvRWrez7GvRaGhL1EBrexHh5OQE730NaZQQVExsI3768ftrOmVjCmlpvUn0bN9UBvXQy\/O8vX\/69E\/29m5TLBY476gqx87ODi9fvqQxQx9hRRInQK3D5WqFVqr9b7wuukiaq+rv3j969CuLxaL3\/uDgoDfZu+GdZzafE8eW2WzWUr2zM6Jcr2mykyQhjmvBf\/z4kfF43O7Xo0xE+HcBWQxB4Lff\/yDSEBuYryAxoBXMV4JWtZ6z+LKoyBhu366HXJZlLYJf0tJ0Ot2eQ1109kefX7ibX9JzlarPRRRFXFxcoLWmLEtEhDiOKcsV1sb89TcsyoAI\/Dy9RLxF6M2bN9\/8xdiIcotC73GuHo71CLFUlUMpTekiIqXQEfiN9kUEdXx8LJfW7qPQPeTqu25+k+u9v7GzrkbzefIfN0I9xLU5sOkAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022534.34679334917\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWe all have lots of lots of passwords and access keys... Keeping them in a web browser or a window application is a good idea, but only until you need to share them with somebody.\u003C\/p\u003E\n\u003Cp\u003EClavis can be installed on your PHP server (no 3rd party involved in storing your sensitive data). It lets you share your keys and be in control of what and with whom are you sharing.\u003C\/p\u003E\n\u003Cp\u003EIt\u2019s easy, safe, comfortable and totally free!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["company","micrus","password","php","security","share"],"hasMore":false,"image":"https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022133.58669833729\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWe all have lots of lots of passwords and access keys... Keeping them in a web browser or a window application is a good idea, but only until you need to share them with somebody.\u003C\/p\u003E\n\u003Cp\u003EClavis can be installed on your PHP server (no 3rd party involved in storing your sensitive data). It lets you share your keys and be in control of what and with whom are you sharing.\u003C\/p\u003E\n\u003Cp\u003EIt\u2019s easy, safe, comfortable and totally free!\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022133.58669833729\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWe all have lots of lots of passwords and access keys... Keeping them in a web browser or a window application is a good idea, but only until you need to share them with somebody.\u003C\/p\u003E\n\u003Cp\u003EClavis can be installed on your PHP server (no 3rd party involved in storing your sensitive data). It lets you share your keys and be in control of what and with whom are you sharing.\u003C\/p\u003E\n\u003Cp\u003EIt\u2019s easy, safe, comfortable and totally free!\u003C\/p\u003E","words":78,"readTime":null,"lang":"en"},"pl":{"slug":"clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a","title":"Clavis \u2013 wsp\u00f3\u0142dzielony schowek na has\u0142a","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022267.17339667458\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEKElEQVRIiZ2Wv2\/bRhTHP3e8I0VSsiLHdl2oQeog3bIU6dr8DRnyJ3Tp2iVdAiND\/pEAyVhkDTLkr+iaIYCBoChgWxItUby714EiTVpx4uYt4o93d+99fzxRHR8fC8BkMkEpxbeE956zszMePHjAdDr9pvXv3r1Da40REQAeP36MtfZ\/b6aUYjab8fr1a46Ojrhz5weyLOf09JQ8z3HOobVum3XOAQqtFaPRDkrVBb19+xalFKaLiohQFAXWWpIkwXtPFEVbyD1\/\/pyjoyPev3\/PixcvGA6HbXH7+wcopUjTFBFhvV5jrf0i+g0oSqlLhACWyyUiwocPH7DWYoxhb2+vPbCJu3fvcnh4SFEUrNfr9nkInuVqRZamnJ+fUxQFy+WSLMvw3oMCayxVVRFCIE1TqqpiOBq1hRmlVFvhYDAghMD9+\/fRWrdJVVWhtQIUxhhevXrFcDjkyZMnVzqFal1BmpLnOSYyTCYT4jj+ohzKsrxEqLlofmuOa15FBK0jQPBeEMAYw7Nnz9om9vf36+6h1kPwLJdLjDEYaxgMBj1avhY9yrz3VFUFgKsqnA+k6QCUImwOnTvHLw8f4rxHa02WZczn801Bmt3JBAScd9g4vrYQEWkbCSG0z3qiDsFTliUhBKyJMMZQliXOeZIkBqAoCiJj8M4RRRHpIO0dcnZ6Rpql\/FOeMLs4J8\/zXiEKODB3cM7x6dMnRITd3d1LyrodaB0RgkcEsnzYc4bUJ7Y6M8bUayLd5kRRxK3JLQC+i6bspYdbyCjA6pg4jrl3717NxkYmW6JWSjEYpBhjWic0kHrvca5CKd26pqoqTEes3nuKiwvyLIMA1cohIoxGo5vbvrloYFCbjbXWKBQo2lmUJPEGxUAIAQmhtlZn49VyiTUGYyyjUXxtET3UOsX2KAsSWFcVIoK1htWqxBiD94EsS6EjRO9DjU5nM6014\/F4s8bf2FlN3paotdYbeGvHjMe3EBFqWunkXQe\/sF5XWGvRWrez7GvRaGhL1EBrexHh5OQE730NaZQQVExsI3768ftrOmVjCmlpvUn0bN9UBvXQy\/O8vX\/69E\/29m5TLBY476gqx87ODi9fvqQxQx9hRRInQK3D5WqFVqr9b7wuukiaq+rv3j969CuLxaL3\/uDgoDfZu+GdZzafE8eW2WzWUr2zM6Jcr2mykyQhjmvBf\/z4kfF43O7Xo0xE+HcBWQxB4Lff\/yDSEBuYryAxoBXMV4JWtZ6z+LKoyBhu366HXJZlLYJf0tJ0Ot2eQ1109kefX7ibX9JzlarPRRRFXFxcoLWmLEtEhDiOKcsV1sb89TcsyoAI\/Dy9RLxF6M2bN9\/8xdiIcotC73GuHo71CLFUlUMpTekiIqXQEfiN9kUEdXx8LJfW7qPQPeTqu25+k+u9v7GzrkbzefIfN0I9xLU5sOkAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022267.17339667458\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWszyscy mamy wiele hase\u0142 i kluczy dost\u0119pu. Pami\u0119tanie ich w przegl\u0105darce internetowej albo w aplikacji okienkowej jest dobrym pomys\u0142em, ale tylko dop\u00f3ki b\u0119dziesz potrzebowa\u0142 je z kim\u015b wsp\u00f3\u0142dzieli\u0107.\u003C\/p\u003E\n\u003Cp\u003EClavis mo\u017ce by\u0107 zainstalowany na Twoim serwerze PHP (\u017cadna trzecia strona nie jest zaanga\u017cowana w przechowywanie Twoich danych wra\u017cliwych). Pozwala Ci przechowywa\u0107 Twoje klucze i kontrolowa\u0107 komu, co i kiedy udost\u0119pniasz.\u003C\/p\u003E\n\u003Cp\u003EClavis jest prosty, bezpieczny, wygodny i ca\u0142kowicie darmowy!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022534.34679334917\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEKElEQVRIiZ2Wv2\/bRhTHP3e8I0VSsiLHdl2oQeog3bIU6dr8DRnyJ3Tp2iVdAiND\/pEAyVhkDTLkr+iaIYCBoChgWxItUby714EiTVpx4uYt4o93d+99fzxRHR8fC8BkMkEpxbeE956zszMePHjAdDr9pvXv3r1Da40REQAeP36MtfZ\/b6aUYjab8fr1a46Ojrhz5weyLOf09JQ8z3HOobVum3XOAQqtFaPRDkrVBb19+xalFKaLiohQFAXWWpIkwXtPFEVbyD1\/\/pyjoyPev3\/PixcvGA6HbXH7+wcopUjTFBFhvV5jrf0i+g0oSqlLhACWyyUiwocPH7DWYoxhb2+vPbCJu3fvcnh4SFEUrNfr9nkInuVqRZamnJ+fUxQFy+WSLMvw3oMCayxVVRFCIE1TqqpiOBq1hRmlVFvhYDAghMD9+\/fRWrdJVVWhtQIUxhhevXrFcDjkyZMnVzqFal1BmpLnOSYyTCYT4jj+ohzKsrxEqLlofmuOa15FBK0jQPBeEMAYw7Nnz9om9vf36+6h1kPwLJdLjDEYaxgMBj1avhY9yrz3VFUFgKsqnA+k6QCUImwOnTvHLw8f4rxHa02WZczn801Bmt3JBAScd9g4vrYQEWkbCSG0z3qiDsFTliUhBKyJMMZQliXOeZIkBqAoCiJj8M4RRRHpIO0dcnZ6Rpql\/FOeMLs4J8\/zXiEKODB3cM7x6dMnRITd3d1LyrodaB0RgkcEsnzYc4bUJ7Y6M8bUayLd5kRRxK3JLQC+i6bspYdbyCjA6pg4jrl3717NxkYmW6JWSjEYpBhjWic0kHrvca5CKd26pqoqTEes3nuKiwvyLIMA1cohIoxGo5vbvrloYFCbjbXWKBQo2lmUJPEGxUAIAQmhtlZn49VyiTUGYyyjUXxtET3UOsX2KAsSWFcVIoK1htWqxBiD94EsS6EjRO9DjU5nM6014\/F4s8bf2FlN3paotdYbeGvHjMe3EBFqWunkXQe\/sF5XWGvRWrez7GvRaGhL1EBrexHh5OQE730NaZQQVExsI3768ftrOmVjCmlpvUn0bN9UBvXQy\/O8vX\/69E\/29m5TLBY476gqx87ODi9fvqQxQx9hRRInQK3D5WqFVqr9b7wuukiaq+rv3j969CuLxaL3\/uDgoDfZu+GdZzafE8eW2WzWUr2zM6Jcr2mykyQhjmvBf\/z4kfF43O7Xo0xE+HcBWQxB4Lff\/yDSEBuYryAxoBXMV4JWtZ6z+LKoyBhu366HXJZlLYJf0tJ0Ot2eQ1109kefX7ibX9JzlarPRRRFXFxcoLWmLEtEhDiOKcsV1sb89TcsyoAI\/Dy9RLxF6M2bN9\/8xdiIcotC73GuHo71CLFUlUMpTekiIqXQEfiN9kUEdXx8LJfW7qPQPeTqu25+k+u9v7GzrkbzefIfN0I9xLU5sOkAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022534.34679334917\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWszyscy mamy wiele hase\u0142 i kluczy dost\u0119pu. Pami\u0119tanie ich w przegl\u0105darce internetowej albo w aplikacji okienkowej jest dobrym pomys\u0142em, ale tylko dop\u00f3ki b\u0119dziesz potrzebowa\u0142 je z kim\u015b wsp\u00f3\u0142dzieli\u0107.\u003C\/p\u003E\n\u003Cp\u003EClavis mo\u017ce by\u0107 zainstalowany na Twoim serwerze PHP (\u017cadna trzecia strona nie jest zaanga\u017cowana w przechowywanie Twoich danych wra\u017cliwych). Pozwala Ci przechowywa\u0107 Twoje klucze i kontrolowa\u0107 komu, co i kiedy udost\u0119pniasz.\u003C\/p\u003E\n\u003Cp\u003EClavis jest prosty, bezpieczny, wygodny i ca\u0142kowicie darmowy!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["bezpiecze\u0144stwo","firma","has\u0142o","micrus","php","wsp\u00f3\u0142dzielenie"],"hasMore":false,"image":"https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022133.58669833729\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWszyscy mamy wiele hase\u0142 i kluczy dost\u0119pu. Pami\u0119tanie ich w przegl\u0105darce internetowej albo w aplikacji okienkowej jest dobrym pomys\u0142em, ale tylko dop\u00f3ki b\u0119dziesz potrzebowa\u0142 je z kim\u015b wsp\u00f3\u0142dzieli\u0107.\u003C\/p\u003E\n\u003Cp\u003EClavis mo\u017ce by\u0107 zainstalowany na Twoim serwerze PHP (\u017cadna trzecia strona nie jest zaanga\u017cowana w przechowywanie Twoich danych wra\u017cliwych). Pozwala Ci przechowywa\u0107 Twoje klucze i kontrolowa\u0107 komu, co i kiedy udost\u0119pniasz.\u003C\/p\u003E\n\u003Cp\u003EClavis jest prosty, bezpieczny, wygodny i ca\u0142kowicie darmowy!\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022133.58669833729\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWszyscy mamy wiele hase\u0142 i kluczy dost\u0119pu. Pami\u0119tanie ich w przegl\u0105darce internetowej albo w aplikacji okienkowej jest dobrym pomys\u0142em, ale tylko dop\u00f3ki b\u0119dziesz potrzebowa\u0142 je z kim\u015b wsp\u00f3\u0142dzieli\u0107.\u003C\/p\u003E\n\u003Cp\u003EClavis mo\u017ce by\u0107 zainstalowany na Twoim serwerze PHP (\u017cadna trzecia strona nie jest zaanga\u017cowana w przechowywanie Twoich danych wra\u017cliwych). Pozwala Ci przechowywa\u0107 Twoje klucze i kontrolowa\u0107 komu, co i kiedy udost\u0119pniasz.\u003C\/p\u003E\n\u003Cp\u003EClavis jest prosty, bezpieczny, wygodny i ca\u0142kowicie darmowy!\u003C\/p\u003E","words":79,"readTime":null,"lang":"pl"}}},"projects\/a-gdyby-tak-upro\u015bci\u0107-ortografi\u0119":{"key":"projects\/a-gdyby-tak-upro\u015bci\u0107-ortografi\u0119","type":"article","published":true,"meta":{"createdAt":"2017-04-28T19:43:34+02:00","publishedAt":"2015-05-20T00:16:00+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/futurysci.avris.it\/","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Futurus","displayUrl":null}],"category":"projects","subcategory":null,"slug":"a-gdyby-tak-upro\u015bci\u0107-ortografi\u0119"},"content":{"pl":{"slug":"a-gdyby-tak-upro\u015bci\u0107-ortografi\u0119","title":"A gdyby tak upro\u015bci\u0107 ortografi\u0119...?","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/a-gdyby-tak-upro\u015bci\u0107-ortografi\u0119_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022236.61971830986\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACWElEQVRIib2VwXLTQAyGP+2undCGkgzTMp3h0gvwILwONx6DR+LSF+DMMBwYOj3SAI1bx96VOCR2HTdp3cKgSxyt9Fv6LNlycnJiAFme8+LokGpZ4bwnxsh4NOJiPmdvbx9MqaqK6WzGslxSx0gInqIoODg4IKVEipGL+RwzY4jNZjNAKIpLqqoGQE5PT4dl\/ycTVTWAYnHJ5y9fefP6FaoJ7wOqijiHqRJCIKaEqQIwHo9xzuG93y4sci+pbTFia09VVZTLJU4E5xzIKkGTIuKQ9f+qrgnOoUAeMgzDOYemBCIbN+r+CoKatufNmZmRZRnOOcyM0FTovUdTRJG2WucdKa5EVBMhC8Q6EhuxLFHXEecd2lCMkRACmtK6ESGmiCCIE1JKeO9X\/hgxM6bTGSK2SSjFyHVZIusu1XR1bWCqqFnbhXMOoL1WNUajnCzLboj0HkfX3\/X19doZeog9dj6GxISWiCqLxYLJZNKS6HazS3CbdW\/yUI12hq6uCs7Pzzk+PgYgpcRkMiHLsjsFdxXU6A55J3WLamdIVanreruACKbaJopIuxnbTFUHU+7Gw5pQk5Tn+b3JTUGqurHa\/U4b68f0dfokwwauAd107Wye+PDxF5mHOq18798+4+X0hlyX6q7mulA2CA39BjXxRaV8OltyNPGU0fh5pRSVArcfZX\/Q++T+CaHD6yXvvn8jfxIQB+XvmsPrp0C4pdfX7pLrQhFVtWYmhhbUzlCC4ke5cbb\/fIx4bg31XYQ2Cupu2a6t2WZ3xf+NVugfPEakv2Vm9iCt7nvrD1dyq58GzesaAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/a-gdyby-tak-upro\u015bci\u0107-ortografi\u0119_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022236.61971830986\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EKt\u00f3\u017c z nas nigdy nie narzeka\u0142, jaka to ortografia jest trudna i niepotrzebna? W 1921 roku futury\u015bci postanowili co\u015b z ni\u0105 zrobi\u0107 i stworzyli co\u015b, co uznali za pisowni\u0119 \u003Cem\u003Ejedy\u0144e s\u0142uszn\u0105, uzasad\u0144on\u0105 i wygodn\u0105\u003C\/em\u003E. Czemu ich propozycja przesz\u0142a bez wi\u0119kszego echa? C\u00f3\u017c, zobaczcie jak \u003Cem\u003Eortografja fonetyczna\u003C\/em\u003E dzia\u0142a w praktyce.\u003C\/p\u003E\n\u003Cp\u003ENa stronie znajduje si\u0119 generator tekstu w futurystycznej ortografii, pe\u0142ny tekst \u003Cem\u003EMa\u0144ifestu w sprawie ortografji fonetycznej\u003C\/em\u003E oraz par\u0119 argument\u00f3w przeciw niej.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/a-gdyby-tak-upro\u015bci\u0107-ortografi\u0119_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022473.23943661972\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACWElEQVRIib2VwXLTQAyGP+2undCGkgzTMp3h0gvwILwONx6DR+LSF+DMMBwYOj3SAI1bx96VOCR2HTdp3cKgSxyt9Fv6LNlycnJiAFme8+LokGpZ4bwnxsh4NOJiPmdvbx9MqaqK6WzGslxSx0gInqIoODg4IKVEipGL+RwzY4jNZjNAKIpLqqoGQE5PT4dl\/ycTVTWAYnHJ5y9fefP6FaoJ7wOqijiHqRJCIKaEqQIwHo9xzuG93y4sci+pbTFia09VVZTLJU4E5xzIKkGTIuKQ9f+qrgnOoUAeMgzDOYemBCIbN+r+CoKatufNmZmRZRnOOcyM0FTovUdTRJG2WucdKa5EVBMhC8Q6EhuxLFHXEecd2lCMkRACmtK6ESGmiCCIE1JKeO9X\/hgxM6bTGSK2SSjFyHVZIusu1XR1bWCqqFnbhXMOoL1WNUajnCzLboj0HkfX3\/X19doZeog9dj6GxISWiCqLxYLJZNKS6HazS3CbdW\/yUI12hq6uCs7Pzzk+PgYgpcRkMiHLsjsFdxXU6A55J3WLamdIVanreruACKbaJopIuxnbTFUHU+7Gw5pQk5Tn+b3JTUGqurHa\/U4b68f0dfokwwauAd107Wye+PDxF5mHOq18798+4+X0hlyX6q7mulA2CA39BjXxRaV8OltyNPGU0fh5pRSVArcfZX\/Q++T+CaHD6yXvvn8jfxIQB+XvmsPrp0C4pdfX7pLrQhFVtWYmhhbUzlCC4ke5cbb\/fIx4bg31XYQ2Cupu2a6t2WZ3xf+NVugfPEakv2Vm9iCt7nvrD1dyq58GzesaAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/a-gdyby-tak-upro\u015bci\u0107-ortografi\u0119_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022473.23943661972\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EKt\u00f3\u017c z nas nigdy nie narzeka\u0142, jaka to ortografia jest trudna i niepotrzebna? W 1921 roku futury\u015bci postanowili co\u015b z ni\u0105 zrobi\u0107 i stworzyli co\u015b, co uznali za pisowni\u0119 \u003Cem\u003Ejedy\u0144e s\u0142uszn\u0105, uzasad\u0144on\u0105 i wygodn\u0105\u003C\/em\u003E. Czemu ich propozycja przesz\u0142a bez wi\u0119kszego echa? C\u00f3\u017c, zobaczcie jak \u003Cem\u003Eortografja fonetyczna\u003C\/em\u003E dzia\u0142a w praktyce.\u003C\/p\u003E\n\u003Cp\u003ENa stronie znajduje si\u0119 generator tekstu w futurystycznej ortografii, pe\u0142ny tekst \u003Cem\u003EMa\u0144ifestu w sprawie ortografji fonetycznej\u003C\/em\u003E oraz par\u0119 argument\u00f3w przeciw niej.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["futury\u015bci","futuryzm","j\u0119zyk","j\u0119zyk polski","ortografia","pomys\u0142","uproszczenie"],"hasMore":false,"image":"https:\/\/avris.it\/image\/a-gdyby-tak-upro\u015bci\u0107-ortografi\u0119_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/a-gdyby-tak-upro\u015bci\u0107-ortografi\u0119_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/a-gdyby-tak-upro\u015bci\u0107-ortografi\u0119_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022118.30985915493\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EKt\u00f3\u017c z nas nigdy nie narzeka\u0142, jaka to ortografia jest trudna i niepotrzebna? W 1921 roku futury\u015bci postanowili co\u015b z ni\u0105 zrobi\u0107 i stworzyli co\u015b, co uznali za pisowni\u0119 \u003Cem\u003Ejedy\u0144e s\u0142uszn\u0105, uzasad\u0144on\u0105 i wygodn\u0105\u003C\/em\u003E. Czemu ich propozycja przesz\u0142a bez wi\u0119kszego echa? C\u00f3\u017c, zobaczcie jak \u003Cem\u003Eortografja fonetyczna\u003C\/em\u003E dzia\u0142a w praktyce.\u003C\/p\u003E\n\u003Cp\u003ENa stronie znajduje si\u0119 generator tekstu w futurystycznej ortografii, pe\u0142ny tekst \u003Cem\u003EMa\u0144ifestu w sprawie ortografji fonetycznej\u003C\/em\u003E oraz par\u0119 argument\u00f3w przeciw niej.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/a-gdyby-tak-upro\u015bci\u0107-ortografi\u0119_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/a-gdyby-tak-upro\u015bci\u0107-ortografi\u0119_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022118.30985915493\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EKt\u00f3\u017c z nas nigdy nie narzeka\u0142, jaka to ortografia jest trudna i niepotrzebna? W 1921 roku futury\u015bci postanowili co\u015b z ni\u0105 zrobi\u0107 i stworzyli co\u015b, co uznali za pisowni\u0119 \u003Cem\u003Ejedy\u0144e s\u0142uszn\u0105, uzasad\u0144on\u0105 i wygodn\u0105\u003C\/em\u003E. Czemu ich propozycja przesz\u0142a bez wi\u0119kszego echa? C\u00f3\u017c, zobaczcie jak \u003Cem\u003Eortografja fonetyczna\u003C\/em\u003E dzia\u0142a w praktyce.\u003C\/p\u003E\n\u003Cp\u003ENa stronie znajduje si\u0119 generator tekstu w futurystycznej ortografii, pe\u0142ny tekst \u003Cem\u003EMa\u0144ifestu w sprawie ortografji fonetycznej\u003C\/em\u003E oraz par\u0119 argument\u00f3w przeciw niej.\u003C\/p\u003E","words":79,"readTime":null,"lang":"pl"}}},"projects\/avris-stringer-old":{"key":"projects\/avris-stringer-old","type":"article","published":true,"meta":{"createdAt":"2017-04-28T19:43:32+02:00","publishedAt":"2015-05-09T17:59:00+02:00","group":null,"links":[{"icon":"brands gitlab","colour":"primary","url":"https:\/\/gitlab.com\/Avris\/Stringer","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Stringer-Micrus","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Stringer-Symfony","displayUrl":null}],"category":"projects","subcategory":null,"slug":"avris-stringer-old"},"content":{"pl":{"slug":"avris-stringer-old","title":"Avris Stringer","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-stringer-old_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022270.42253521127\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAH1UlEQVRIiS3U249cdQHA8e\/vci5z5ro77e6WbksprQVB0FLwnmjQKGi8PRrDH2Di\/+CDz0bDm4nGB2Mwmhh50MTEKCTwooKKQC2ltLPbdi8zO3Pm3M\/5XXzQP+LzET9+6RW\/WqX8+vU3+eLVp\/je1z\/D7vYAEOA8ZdVyvMy4v1ixyHJiFZBWJfOyRnrH4TLj6CRFCMnsaIEHDpdrmrol7xoO52taZ9FBzCCJufTAFuemEwpjODrJOEgz0rLGW4+ToH7ywx99\/\/RkwEbS45V3\/sPhqubcxibjQYQUgrJuKduOZV6xv1gyO0kpOssqK0iLio1hgjGeUZKwPZ2w2QuYDAY0naG1niiOQGpaY+msozaWIOqhpSBvDZ2Hznl0FJDEPXTSCzizOebaoxc5SDNe\/fd1tIDnn36MC6fHjIcxw86AsKR1y735Ei0USgm61tA1LY2xLPOSfj\/m2atPINqGl177O8N+n3VdkxUttxdLqtZgpCKQiiQM2R4JtAoY9Ps4Y9kcD9GR1vQGCceLNR95+ByLrOTO8QnHyzUbccjOmQE6TNhe9tmMQo61om46lJN0zlNVlqbr6LyHsmaU9OgNenz2kUssioqqbbhzkjKdDMhrw1OPXOTLVx9lFGjeur3PrcWaum6xUvHMlQfRAFZJNsYJ6kDQ78VkRcfeIuXx8zussxbTGTohQUsCpWlcS+s8rXM0TUtpDAhJP4rZP1nzxIUzXLtygfcO57z53ozjrOLUZMyXLj\/EtUtnmQ4STm0M2JokXM0b8rrhoCjohyH63XsrTFVgrCcOAwKt6HxNg2OR5TRdy7qqOMpyFnnJqqioOksSSwYupzq5y+bkNF5JsoMZ13uW28cLJI778xMO1zXOCUb9hEWWcbAq+PD5HUY9RaJH9Hst1\/ePwMNsmaFv3D0mLwsqa4m1Yme6waDXw1vPe4dzgkDRdi1Hq5w7h0uWRUU\/ibj56m+oy4ydrdP85Q+\/xHvPx57+BH\/652uEcZ8zn\/gWkQqwUjAZDSnalo\/unOfTV86xcSpCSoFLYZUVZFXD3bRgmdXoVdMgHAzDgJOsZDoe89DpCcdZwb00xxuD8bAuctxqn7d\/\/ysEnjxdMj21xe264ZlvfZfOOT54\/WUwDfN7M5R\/iePjOc9+4zv40YN88zNXuXZpmyhRCCXwjWOxyrl3knJc1gzjCO1BvPjbv\/nNXsBRuqbqHGVZsbU5QYiOddHQjwKysiYrKqJAMu5J7l\/\/K+Ots\/jhDm\/NFtw6WlG1HWcmYz5+eYfq7rsczW7y7Ndf4KRoOb+9w1eevkxvECDwmNqyXGS8f7iiNIZlWXO4riiMR1sv8N7SWkNeNrTGkeYV01HCoKdQEqYjTWsd870b\/PHPLyNxHOzd5tyFixR5waXPfo0msMxe\/RmvvTHg7uw2Tz71DD9\/8Qd87mvfZvPyRbK8QgswrWGZlhykOYMkgkqwFi3Ow6qs0PfmKcMHNpj2+3QGTNmQVg1hqIijgFBrxpFiVTfUyTa7n38Bi2B681Xu3XiL3bO7\/P13P0VKySOPP8He3h6PffJZplef44xUVFHAv2YH4DwXTk8YxZLSWM5vbWCsoers\/8WCNR799uEc4x270yFhHBA7kIB3UBtDqAL6ccww1MRBiI0Ed7OSbucZLl\/+FHU65+qTz+E8NNmSh5\/8KmkF87xhGIV4IclqQ4UgCRXeeTrnmC3WOO\/ZX6TMlgWLoqV2Hj3PKoRYklU1\/UBhvEdLySiJmUQRQjhaa1i3HSdVy6Jo6DzUCG6khlBu4NYO7z3OjlCZQwO26wikZDLsE4ch67ojbQymqTha1zjnWVvDcdVRtQ68Z9jroS2eVVVhrGEQxYTCI7QCpUiigH4ckVYNN+8vWTeWqSoooxFXzm4g25LD0rOlSnIbkvRCdNhjXhoCrUjiEIdnXjQ8JGGxzunajlXd4YUiUIqe1oxGCX0nqDuDjgOFhP+tawwq0FRNS6QjtieSzjne2j\/i5qJgNyg4XdzCO8tGeJa9G2\/z5LUvkJQpeVdx6\/o9HtzeZDsImM326A8HqIc\/TS1C1pVhdxBhcbTeM+xpJoGisp6h9txdFsyWJTqIIjAWL6DpOpz3KCUJBHjn2JuvuHGcIVVAHm+RxVsYZ\/FOEl25yJ3DBqF2UQja3csstGJIhb18hTQaIqwicoa883QIgjBgQwhwlv3MkNaGm\/M1J5XDCYV+YGNMWhTUxtEYi7WOvlJ4Bau65R\/3F5TGE2pNi8BZT209EkfVWYwH2xgMAglUxpPKEKUUgTdsJAHT8YCtcZ\/pKKGrWualZVVbDvOa+2lFayRxpAgDhT496PP8Y+f54zsfcHtV4gGvNcILPlisWdUW5QXWe0IESkMiIwQeLwTOOzrncc7jBAghCZUkDkMmSY8HJkM+tDPhwWnCsmy5fphyP+9YVg15Y1FSoUKBkILGCXQrNFmn+OrjD\/GLN26yqg0OxaxsyOoWqQMAnJR4JEpKlBKAwElP50Fbi\/PgASklSRByZXvCIAwZ9yO2BxF3TjKuH+dkraVxMB4k9HuetOlonSeJQgIl0HfLmvTWfXZHMRaN1pLSOZz3oENCPAiBxGGUQgqBlYJQejQSYaFBIBUIJQmEZGsyYtCLSSLFtB\/x\/sGS\/brj1KDP7qkem9qzfWqMrAr+8EFK6SWRlhgL\/wU7BW9dIEbl2gAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-stringer-old_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022270.42253521127\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EUwaga, projekt przeniesiony: \u003Ca href=\u0022\/projects\/avris-stringer\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-cogs\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Avris Stringer\u003C\/a\u003E\u003C\/strong\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EAvris Stringer\u003C\/strong\u003E to otwarta biblioteka PHP upraszczaj\u0105ca wiele operacji na stringach zwi\u0105zanych z tworzeniem interfejsu u\u017cytkownika, a przede wszystkim z dostosowywaniem form gramatycznych \u003Cstrong\u003Ej\u0119zyka polskiego\u003C\/strong\u003E do dynamicznych danych.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-stringer-old_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022710\u0022 height=\u0022400\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAH1UlEQVRIiS3U249cdQHA8e\/vci5z5ro77e6WbksprQVB0FLwnmjQKGi8PRrDH2Di\/+CDz0bDm4nGB2Mwmhh50MTEKCTwooKKQC2ltLPbdi8zO3Pm3M\/5XXzQP+LzET9+6RW\/WqX8+vU3+eLVp\/je1z\/D7vYAEOA8ZdVyvMy4v1ixyHJiFZBWJfOyRnrH4TLj6CRFCMnsaIEHDpdrmrol7xoO52taZ9FBzCCJufTAFuemEwpjODrJOEgz0rLGW4+ToH7ywx99\/\/RkwEbS45V3\/sPhqubcxibjQYQUgrJuKduOZV6xv1gyO0kpOssqK0iLio1hgjGeUZKwPZ2w2QuYDAY0naG1niiOQGpaY+msozaWIOqhpSBvDZ2Hznl0FJDEPXTSCzizOebaoxc5SDNe\/fd1tIDnn36MC6fHjIcxw86AsKR1y735Ei0USgm61tA1LY2xLPOSfj\/m2atPINqGl177O8N+n3VdkxUttxdLqtZgpCKQiiQM2R4JtAoY9Ps4Y9kcD9GR1vQGCceLNR95+ByLrOTO8QnHyzUbccjOmQE6TNhe9tmMQo61om46lJN0zlNVlqbr6LyHsmaU9OgNenz2kUssioqqbbhzkjKdDMhrw1OPXOTLVx9lFGjeur3PrcWaum6xUvHMlQfRAFZJNsYJ6kDQ78VkRcfeIuXx8zussxbTGTohQUsCpWlcS+s8rXM0TUtpDAhJP4rZP1nzxIUzXLtygfcO57z53ozjrOLUZMyXLj\/EtUtnmQ4STm0M2JokXM0b8rrhoCjohyH63XsrTFVgrCcOAwKt6HxNg2OR5TRdy7qqOMpyFnnJqqioOksSSwYupzq5y+bkNF5JsoMZ13uW28cLJI778xMO1zXOCUb9hEWWcbAq+PD5HUY9RaJH9Hst1\/ePwMNsmaFv3D0mLwsqa4m1Yme6waDXw1vPe4dzgkDRdi1Hq5w7h0uWRUU\/ibj56m+oy4ydrdP85Q+\/xHvPx57+BH\/652uEcZ8zn\/gWkQqwUjAZDSnalo\/unOfTV86xcSpCSoFLYZUVZFXD3bRgmdXoVdMgHAzDgJOsZDoe89DpCcdZwb00xxuD8bAuctxqn7d\/\/ysEnjxdMj21xe264ZlvfZfOOT54\/WUwDfN7M5R\/iePjOc9+4zv40YN88zNXuXZpmyhRCCXwjWOxyrl3knJc1gzjCO1BvPjbv\/nNXsBRuqbqHGVZsbU5QYiOddHQjwKysiYrKqJAMu5J7l\/\/K+Ots\/jhDm\/NFtw6WlG1HWcmYz5+eYfq7rsczW7y7Ndf4KRoOb+9w1eevkxvECDwmNqyXGS8f7iiNIZlWXO4riiMR1sv8N7SWkNeNrTGkeYV01HCoKdQEqYjTWsd870b\/PHPLyNxHOzd5tyFixR5waXPfo0msMxe\/RmvvTHg7uw2Tz71DD9\/8Qd87mvfZvPyRbK8QgswrWGZlhykOYMkgkqwFi3Ow6qs0PfmKcMHNpj2+3QGTNmQVg1hqIijgFBrxpFiVTfUyTa7n38Bi2B681Xu3XiL3bO7\/P13P0VKySOPP8He3h6PffJZplef44xUVFHAv2YH4DwXTk8YxZLSWM5vbWCsoers\/8WCNR799uEc4x270yFhHBA7kIB3UBtDqAL6ccww1MRBiI0Ed7OSbucZLl\/+FHU65+qTz+E8NNmSh5\/8KmkF87xhGIV4IclqQ4UgCRXeeTrnmC3WOO\/ZX6TMlgWLoqV2Hj3PKoRYklU1\/UBhvEdLySiJmUQRQjhaa1i3HSdVy6Jo6DzUCG6khlBu4NYO7z3OjlCZQwO26wikZDLsE4ch67ojbQymqTha1zjnWVvDcdVRtQ68Z9jroS2eVVVhrGEQxYTCI7QCpUiigH4ckVYNN+8vWTeWqSoooxFXzm4g25LD0rOlSnIbkvRCdNhjXhoCrUjiEIdnXjQ8JGGxzunajlXd4YUiUIqe1oxGCX0nqDuDjgOFhP+tawwq0FRNS6QjtieSzjne2j\/i5qJgNyg4XdzCO8tGeJa9G2\/z5LUvkJQpeVdx6\/o9HtzeZDsImM326A8HqIc\/TS1C1pVhdxBhcbTeM+xpJoGisp6h9txdFsyWJTqIIjAWL6DpOpz3KCUJBHjn2JuvuHGcIVVAHm+RxVsYZ\/FOEl25yJ3DBqF2UQja3csstGJIhb18hTQaIqwicoa883QIgjBgQwhwlv3MkNaGm\/M1J5XDCYV+YGNMWhTUxtEYi7WOvlJ4Bau65R\/3F5TGE2pNi8BZT209EkfVWYwH2xgMAglUxpPKEKUUgTdsJAHT8YCtcZ\/pKKGrWualZVVbDvOa+2lFayRxpAgDhT496PP8Y+f54zsfcHtV4gGvNcILPlisWdUW5QXWe0IESkMiIwQeLwTOOzrncc7jBAghCZUkDkMmSY8HJkM+tDPhwWnCsmy5fphyP+9YVg15Y1FSoUKBkILGCXQrNFmn+OrjD\/GLN26yqg0OxaxsyOoWqQMAnJR4JEpKlBKAwElP50Fbi\/PgASklSRByZXvCIAwZ9yO2BxF3TjKuH+dkraVxMB4k9HuetOlonSeJQgIl0HfLmvTWfXZHMRaN1pLSOZz3oENCPAiBxGGUQgqBlYJQejQSYaFBIBUIJQmEZGsyYtCLSSLFtB\/x\/sGS\/brj1KDP7qkem9qzfWqMrAr+8EFK6SWRlhgL\/wU7BW9dIEbl2gAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-stringer-old_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022710\u0022 height=\u0022400\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EUwaga, projekt przeniesiony: \u003Ca href=\u0022\/projects\/avris-stringer\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-cogs\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Avris Stringer\u003C\/a\u003E\u003C\/strong\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EAvris Stringer\u003C\/strong\u003E to otwarta biblioteka PHP upraszczaj\u0105ca wiele operacji na stringach zwi\u0105zanych z tworzeniem interfejsu u\u017cytkownika, a przede wszystkim z dostosowywaniem form gramatycznych \u003Cstrong\u003Ej\u0119zyka polskiego\u003C\/strong\u003E do dynamicznych danych.\u003C\/p\u003E\n\u003Cp\u003EJe\u015bli na przyk\u0142ad u\u017cytkownik strony zdoby\u0142 X punkt\u00f3w, to w zale\u017cno\u015bci od X powinni\u015bmy mu powiedzie\u0107 np.: \u201czdoby\u0142e\u015b 1 punkt\u201d, \u201c2 punkt\u003Cstrong\u003Ey\u003C\/strong\u003E\u201d albo \u201c5 punkt\u003Cstrong\u003E\u00f3w\u003C\/strong\u003E\u201d.Albo i \u201czdoby\u0142\u003Cstrong\u003Ea\u015b\u003C\/strong\u003E\u201d, je\u015bli to kobieta. Mo\u017cemy te\u017c chcie\u0107 pokazywa\u0107 daty w jakim\u015b przyjemniejszym formacie ni\u017c liczbowe, na przyk\u0142ad zamiast \u201c2015-05-09 17:15\u201d, po prostu \u201cgodzin\u0119 temu\u201d. Stringer zatroszczy si\u0119 o to wszystko, i o wiele wi\u0119cej!\u003C\/p\u003E\n\u003Cp\u003EOpr\u00f3cz samej biblioteki stworzy\u0142em tak\u017ce bundle integruj\u0105ce j\u0105 z \u003Ca href=\u0022http:\/\/symfony.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Symfony\u003C\/a\u003E oraz z \u003Ca href=\u0022http:\/\/micrus.avris.it\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Micrusem\u003C\/a\u003E, dzi\u0119ki kt\u00f3rym wszystkie jej funkcje s\u0105 dost\u0119pne tak\u017ce jako serwisy oraz jako filtry \u003Ca href=\u0022http:\/\/twig.sensiolabs.org\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Twiga\u003C\/a\u003E. Wszystko mo\u017cna zainstalowa\u0107 jedn\u0105 linijk\u0105 w konsoli za pomoc\u0105 \u003Ca href=\u0022https:\/\/getcomposer.org\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Composera\u003C\/a\u003E.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["biblioteka","composer","framework","interfejs u\u017cytkownika","j\u0119zyk polski","micrus","odmiana","php","string","symfony2","tekst"],"hasMore":true,"image":"https:\/\/avris.it\/image\/avris-stringer-old_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-stringer-old_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-stringer-old_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022135.21126760563\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EUwaga, projekt przeniesiony: \u003Ca href=\u0022\/projects\/avris-stringer.lite\u0022\u003E Avris Stringer\u003C\/a\u003E\u003C\/strong\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EAvris Stringer\u003C\/strong\u003E to otwarta biblioteka PHP upraszczaj\u0105ca wiele operacji na stringach zwi\u0105zanych z tworzeniem interfejsu u\u017cytkownika, a przede wszystkim z dostosowywaniem form gramatycznych \u003Cstrong\u003Ej\u0119zyka polskiego\u003C\/strong\u003E do dynamicznych danych.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-stringer-old_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-stringer-old_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022135.21126760563\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EUwaga, projekt przeniesiony: \u003Ca href=\u0022\/projects\/avris-stringer.lite\u0022\u003E Avris Stringer\u003C\/a\u003E\u003C\/strong\u003E\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EAvris Stringer\u003C\/strong\u003E to otwarta biblioteka PHP upraszczaj\u0105ca wiele operacji na stringach zwi\u0105zanych z tworzeniem interfejsu u\u017cytkownika, a przede wszystkim z dostosowywaniem form gramatycznych \u003Cstrong\u003Ej\u0119zyka polskiego\u003C\/strong\u003E do dynamicznych danych.\u003C\/p\u003E\n\u003Cp\u003EJe\u015bli na przyk\u0142ad u\u017cytkownik strony zdoby\u0142 X punkt\u00f3w, to w zale\u017cno\u015bci od X powinni\u015bmy mu powiedzie\u0107 np.: \u201czdoby\u0142e\u015b 1 punkt\u201d, \u201c2 punkt\u003Cstrong\u003Ey\u003C\/strong\u003E\u201d albo \u201c5 punkt\u003Cstrong\u003E\u00f3w\u003C\/strong\u003E\u201d.Albo i \u201czdoby\u0142\u003Cstrong\u003Ea\u015b\u003C\/strong\u003E\u201d, je\u015bli to kobieta. Mo\u017cemy te\u017c chcie\u0107 pokazywa\u0107 daty w jakim\u015b przyjemniejszym formacie ni\u017c liczbowe, na przyk\u0142ad zamiast \u201c2015-05-09 17:15\u201d, po prostu \u201cgodzin\u0119 temu\u201d. Stringer zatroszczy si\u0119 o to wszystko, i o wiele wi\u0119cej!\u003C\/p\u003E\n\u003Cp\u003EOpr\u00f3cz samej biblioteki stworzy\u0142em tak\u017ce bundle integruj\u0105ce j\u0105 z \u003Ca href=\u0022http:\/\/symfony.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Symfony\u003C\/a\u003E oraz z \u003Ca href=\u0022http:\/\/micrus.avris.it\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Micrusem\u003C\/a\u003E, dzi\u0119ki kt\u00f3rym wszystkie jej funkcje s\u0105 dost\u0119pne tak\u017ce jako serwisy oraz jako filtry \u003Ca href=\u0022http:\/\/twig.sensiolabs.org\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Twiga\u003C\/a\u003E. Wszystko mo\u017cna zainstalowa\u0107 jedn\u0105 linijk\u0105 w konsoli za pomoc\u0105 \u003Ca href=\u0022https:\/\/getcomposer.org\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Composera\u003C\/a\u003E.\u003C\/p\u003E","words":155,"readTime":null,"lang":"pl"}}},"projects\/stos\u0142owia-opowiadania-na-sto-s\u0142\u00f3w":{"key":"projects\/stos\u0142owia-opowiadania-na-sto-s\u0142\u00f3w","type":"article","published":true,"meta":{"createdAt":"2017-04-28T19:43:23+02:00","publishedAt":"2014-11-11T16:56:00+01:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/stoslowia.avris.it\/","displayUrl":null},{"icon":"brands twitter-square","colour":"secondary","url":"https:\/\/twitter.com\/Stoslowia","displayUrl":null}],"category":"projects","subcategory":null,"slug":"stos\u0142owia-opowiadania-na-sto-s\u0142\u00f3w"},"content":{"pl":{"slug":"stos\u0142owia-opowiadania-na-sto-s\u0142\u00f3w","title":"Stos\u0142owia - opowiadania na sto s\u0142\u00f3w","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/stos\u0142owia-opowiadania-na-sto-s\u0142\u00f3w_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022235.33368365738\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADtElEQVRIibWVSW8cRRSAv6rqfWZsj7xNFAQmwAGEsiCQkIICgRzJlf\/GD+CAQJFyBCkWBxBIHDjhRAqZiSEhkYjjmYlxTy\/1HodZYjuT2CDxpO7qrnrV7+u3lRmNRqqqoKAoAKrjcSrGmNmlqnjveTwYkuc5WZqQJQlFWWEweKmJoojAObz3DIZDvvjyK54Mh4gIQRiSpBlZlpLEMVVVsb19F\/E1H1y8iCmKQg9CHByNMc9ATdemYDu7fR73+6RJwkq7jahiJvrOWYqi4Nsbm2zdukWj0aTZahGFIY93d7n\/xzatVoMrH1\/h3NmzJHH8FGge1FR6vR7Ly8ssLi6yubnJ3t4eIoJzjqqq+PTqVXb7A+49eEgcRXTWVgDIkhRV4f6fD\/ju+x9oNDL6\/QF3bt\/k1Y0NLl36kDdee50gCBARROQw0Dwo7z1bW1usrq7S6XQYjUaICGBmIUYVmeiPioLu3d+xztJZW2Wx1cIA169fo9vt8crGBpcvf0JnfR3nHF4E8R4RQZXjgXZ2dtje3ubMmTPoxLD3nvGyYq19qq9Q+5o4jlEMv3V7VMU+775znl63y3rnNI1GgzAMZ+EfgyhlWVLV9fyQHQXr9XosLCwQxzFVVVNWJWmaYq3FWjvTNRhEPEEQEEURXgRUuPnrFu32Au3lNcIwxHvBGEMQuLGXvEdVqb0\/WQ7Nm5unc1REPM4FVFXF7e4dWs0FWo0GokqaJpPKBmctxkBd15g8zyfen8KMQ\/EM0OEbB\/ccBgVjoBjtU5QV1oU4a3GBoyxL6toThSF5PsI6S6ORoTKuWgyYuq71JH\/7b0V0Amfhb18AkLkIh3nuHmMM5jgaUaWoxvRpaE8Eo6rk1bgG75d9Pr\/3Ewp81nmb95denulMG+2hficiLwRSVYqyxFlLEASHNv8fEhynoKrcffgA7z0vLZ8iSzIwggECFTCGUaAIiq0F9UISWMTAjb2faQYZ59NzGAyJs9iJV4CZhw4+B9OXqfGjbjTWcvrUKTAGLQPySkhlNE7qkHGiuAhjxmVvrJ0cM9B0GZlNccYcyv+DIAftnyiHVHXWmWUy51QmH5hMWHeco58x\/p9zaOQLhsUTkiSZu\/7j\/i\/kWvBR9B5ilCCYnwVfD7\/hQvImF5K3Xgx8HJCI5063R3upzcrK8nP1BoM+u\/0BUnuarRbr62vHNs+joZsBPc+N03D99ejR5IgAVZmdXyJKGAYsLS6R5\/v0B4Nxx7QGayzWjr\/rnCOOYlqt5gtDpqr8A2r8VP6cD2gXAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/stos\u0142owia-opowiadania-na-sto-s\u0142\u00f3w_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022235.33368365738\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIle tre\u015bci mo\u017cna zmie\u015bci\u0107 w stu s\u0142owach? Sam zobacz! Na tej stronie zbieramy stos\u0142owia \u2013 opowiadania na dowolny temat zawarte w jednym akapicie, nie d\u0142u\u017csze ni\u017c sto s\u0142\u00f3w, ale posiadaj\u0105ce fabu\u0142\u0119, bohater\u00f3w i puent\u0119. Sam te\u017c mo\u017cesz je stworzy\u0107 i doda\u0107 do naszego zbioru!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/stos\u0142owia-opowiadania-na-sto-s\u0142\u00f3w_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022470.66736731477\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADtElEQVRIibWVSW8cRRSAv6rqfWZsj7xNFAQmwAGEsiCQkIICgRzJlf\/GD+CAQJFyBCkWBxBIHDjhRAqZiSEhkYjjmYlxTy\/1HodZYjuT2CDxpO7qrnrV7+u3lRmNRqqqoKAoAKrjcSrGmNmlqnjveTwYkuc5WZqQJQlFWWEweKmJoojAObz3DIZDvvjyK54Mh4gIQRiSpBlZlpLEMVVVsb19F\/E1H1y8iCmKQg9CHByNMc9ATdemYDu7fR73+6RJwkq7jahiJvrOWYqi4Nsbm2zdukWj0aTZahGFIY93d7n\/xzatVoMrH1\/h3NmzJHH8FGge1FR6vR7Ly8ssLi6yubnJ3t4eIoJzjqqq+PTqVXb7A+49eEgcRXTWVgDIkhRV4f6fD\/ju+x9oNDL6\/QF3bt\/k1Y0NLl36kDdee50gCBARROQw0Dwo7z1bW1usrq7S6XQYjUaICGBmIUYVmeiPioLu3d+xztJZW2Wx1cIA169fo9vt8crGBpcvf0JnfR3nHF4E8R4RQZXjgXZ2dtje3ubMmTPoxLD3nvGyYq19qq9Q+5o4jlEMv3V7VMU+775znl63y3rnNI1GgzAMZ+EfgyhlWVLV9fyQHQXr9XosLCwQxzFVVVNWJWmaYq3FWjvTNRhEPEEQEEURXgRUuPnrFu32Au3lNcIwxHvBGEMQuLGXvEdVqb0\/WQ7Nm5unc1REPM4FVFXF7e4dWs0FWo0GokqaJpPKBmctxkBd15g8zyfen8KMQ\/EM0OEbB\/ccBgVjoBjtU5QV1oU4a3GBoyxL6toThSF5PsI6S6ORoTKuWgyYuq71JH\/7b0V0Amfhb18AkLkIh3nuHmMM5jgaUaWoxvRpaE8Eo6rk1bgG75d9Pr\/3Ewp81nmb95denulMG+2hficiLwRSVYqyxFlLEASHNv8fEhynoKrcffgA7z0vLZ8iSzIwggECFTCGUaAIiq0F9UISWMTAjb2faQYZ59NzGAyJs9iJV4CZhw4+B9OXqfGjbjTWcvrUKTAGLQPySkhlNE7qkHGiuAhjxmVvrJ0cM9B0GZlNccYcyv+DIAftnyiHVHXWmWUy51QmH5hMWHeco58x\/p9zaOQLhsUTkiSZu\/7j\/i\/kWvBR9B5ilCCYnwVfD7\/hQvImF5K3Xgx8HJCI5063R3upzcrK8nP1BoM+u\/0BUnuarRbr62vHNs+joZsBPc+N03D99ejR5IgAVZmdXyJKGAYsLS6R5\/v0B4Nxx7QGayzWjr\/rnCOOYlqt5gtDpqr8A2r8VP6cD2gXAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/stos\u0142owia-opowiadania-na-sto-s\u0142\u00f3w_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022470.66736731477\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIle tre\u015bci mo\u017cna zmie\u015bci\u0107 w stu s\u0142owach? Sam zobacz! Na tej stronie zbieramy stos\u0142owia \u2013 opowiadania na dowolny temat zawarte w jednym akapicie, nie d\u0142u\u017csze ni\u017c sto s\u0142\u00f3w, ale posiadaj\u0105ce fabu\u0142\u0119, bohater\u00f3w i puent\u0119. Sam te\u017c mo\u017cesz je stworzy\u0107 i doda\u0107 do naszego zbioru!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["literatura","opowiadanie","php","poezja","proza","zwi\u0119z\u0142o\u015b\u0107"],"hasMore":false,"image":"https:\/\/avris.it\/image\/stos\u0142owia-opowiadania-na-sto-s\u0142\u00f3w_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/stos\u0142owia-opowiadania-na-sto-s\u0142\u00f3w_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/stos\u0142owia-opowiadania-na-sto-s\u0142\u00f3w_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022117.66684182869\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIle tre\u015bci mo\u017cna zmie\u015bci\u0107 w stu s\u0142owach? Sam zobacz! Na tej stronie zbieramy stos\u0142owia \u2013 opowiadania na dowolny temat zawarte w jednym akapicie, nie d\u0142u\u017csze ni\u017c sto s\u0142\u00f3w, ale posiadaj\u0105ce fabu\u0142\u0119, bohater\u00f3w i puent\u0119. Sam te\u017c mo\u017cesz je stworzy\u0107 i doda\u0107 do naszego zbioru!\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/stos\u0142owia-opowiadania-na-sto-s\u0142\u00f3w_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/stos\u0142owia-opowiadania-na-sto-s\u0142\u00f3w_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022117.66684182869\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIle tre\u015bci mo\u017cna zmie\u015bci\u0107 w stu s\u0142owach? Sam zobacz! Na tej stronie zbieramy stos\u0142owia \u2013 opowiadania na dowolny temat zawarte w jednym akapicie, nie d\u0142u\u017csze ni\u017c sto s\u0142\u00f3w, ale posiadaj\u0105ce fabu\u0142\u0119, bohater\u00f3w i puent\u0119. Sam te\u017c mo\u017cesz je stworzy\u0107 i doda\u0107 do naszego zbioru!\u003C\/p\u003E","words":54,"readTime":null,"lang":"pl"}}},"projects\/cropper":{"key":"projects\/cropper","type":"article","published":true,"meta":{"createdAt":"2017-04-28T19:43:18+02:00","publishedAt":"2014-01-25T23:54:00+01:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/cropper.avris.it\/","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Cropper","displayUrl":null}],"category":"projects","subcategory":null,"slug":"cropper"},"content":{"pl":{"slug":"cropper","title":"Cropper","intro":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/cropper_small.jpg\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022274.03636363636\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF9UlEQVRIiXWWS3BcRxWGv+7b9zUvjUbgINnxI0Gy7IBwqIIAcZIikIeCkuAFj5RhYSpVUN6wMSs2LMiGhWELC6iiypRxJQ4FVUmFvElMEqdiJZZiJDt2ZJctRdLYo2hG87j3djeL0YxmMvLZ3L6P8\/\/n\/Pf0OS2MMZZ1u3r1KrlcFhCABSFIp9JIKQGw1iKEaK87TQjRfial7LpvmTEGay21ao1aFOMFAVhLLh22cVUngTEGrQ1R1EBrjed5YMFYg040QgiklOvfJbie1yYSCEAgJOT78gCsrVVZWf10\/R14nkdfLouQgnToAxbLRtBCCFRn1sVikeXlZTKZNLV6nUJ\/gThJqJTLhKk0caNBJptFa029XsNPNK6rUEqhtcZxFFYboijC930mPzjLuXPnuPDem2wZuZM9oyNMjD\/ERxdm+WRhgXQ6hRekGBv7SlvRtkIARmsGhwYJwxCtNUq51Ot1stkctVoNISWe5xGGIVeuXMb3QSmXfD5PJ07LXCW55XMFskN51hollGx+E1crLMy8z87deyleudQOCOhUyLJz1y4cR5IkCUq5aKNJp9PEcYRSWay1zd+4Lm8UNWg0Gty4fh3XcwmCAD8IMNrgOA5Yw\/TZSca2387vjv6JI9t2MTMzQzo\/wL77xgkCl4Fb6apJtXEjKC4vE6ZTRI0Iz1UYC41GgzAVsra2RhiESCnJ5\/O4yiWdzSCFBCxCSPr6+rqVsvDvF1+muv9eLn48x\/zlyxz8yU9545UXmT59isEdu7DaMDw83HbpKmqlnGYAQUCiNdZoUqmQWq1GoVCgUi5vcFlD6foNlKswxhKGAUIIkiTBcSRKuaxWY+aXV8lkMmijWanWAMjl+\/jCztsZ2raVlXK1rTiAMMbYVkEVl5ex67vG931yudx6+cNG3r21AnbT51PnznPi+N+4+5t3MTU1zZ69e5iYmCCKonYrAVBKdQfUehHHMUII5ubmeOW117HNVrRpwVpryWYyHPj+4yilANBao7XuIruZaa3xfb8dUDu4llydTaxUKvH3p08ipWTi4e8ilUeUGBzPJ45iXnrheRCCnbcO8fhjj7Z9jTG4rgvWYIXTzFg0G6VJYqyQgEDK3qbZDmiz7LEgrEU5kq\/u\/w5vnfgjbz5\/kiS3lZ\/96jc4QoAUWCSthFpWrlaZPDPJO88dp2x8HjhwkNHdt3Hmv2\/w9gvPkhoaYfzADxi9bXsXZQtjc20FKM\/BUw4ZT3Dp3VM8du99bLF1anMfkg58lBC4Tq+7FIKFC1MkVy4xf\/pVomvnUdLh\/Nuvkavc4IPnTpCqr2xKC3R36k5zpUQKyIUBh578Obm4hvJ8RmbP4lTKiCAg0UlT0A75BXDn17\/FHabCR0uLbCst4wi4\/6FHUB9Ps3VwlnDhKuwd6\/4prTn4WcDW2hHNCWStoZEpMHX+Iravn+DQYcj3IQCvoxjbCgFh4DPfiKi6ATOFISSG1MDnuTB\/jXK2wLXCYE8inf5dCrXW9Xodaw1rN4oMFPq548sj6OwWDh\/+JR9OT1GplLE67gGMk5ijv\/8DY18axeS38dc\/\/4XFxSWOHTvGN+65m0tLFf757D\/4LG+b366Haa1tb\/vJyUmeeuq369NXs31LPwcnHuD4y+\/yzDMnKa6WyedzjD\/yPY4ePdoeJ3Ec47pu+1SAbc7y1i7uvNbr9eaOpLsP9Wq+bjqOkY7kpdf\/w\/AXh1kox7x\/5j2WSitooymVVrBRvUf6RhSzWioS42ARSOnQl8uwtnKdhgahXFJBQCb0N+WVN+sHjnIwxtCIYpTrYgGLRBtDojWNKKKxuNTjF8Uxp946za9\/+G2efPR+Zmf\/R7Va419Pn+DIgf0cOfQEC58s9vhZa7HW3ryoa\/WYyloNrXXzCGXB9ZongNbJr+p7PcBCCEJT40cPj\/PgvlHUxWkcR5ITMb\/48RPsyfukFud6lG0r1ALpBAT4tBpTrCTN2WYtxhpyuRzGbDjXGtEmgJaRfV8jlc4xtGMHt\/QP4AjYe9c9eK7P7tFRAi\/o4uq0\/wMzwMw+S82WvgAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/cropper_small.jpg\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022274.03636363636\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EZdj\u0119cia legitymacyjne u fotografa kosztuj\u0105 kilkana\u015bcie z\u0142otych za cztery sztuki. Samo ich wywo\u0142anie jest jednak warte raptem kilkadziesi\u0105t groszy. Je\u015bli sam potrafisz wykona\u0107 i zretuszowa\u0107 zdj\u0119cie, mo\u017cesz potem u\u017cy\u0107 poni\u017cszego narz\u0119dzia, by szybko przyci\u0105\u0107 je i przeskalowa\u0107 do odpowiednich rozmiar\u00f3w (35x45 mm). Nast\u0119pnie wystarczy wywo\u0142a\u0107 je jak zwyk\u0142e zdj\u0119cie 9x13 cm i r\u0119cznie przyci\u0105\u0107 no\u017cyczkami.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n \u003Cnoscript\u003E\n \u003Cimg src=\u0022https:\/\/avris.it\/image\/cropper_big.jpg\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022550\u0022 height=\u0022314\u0022\u003E \n \u003C\/noscript\u003E\n \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF9UlEQVRIiXWWS3BcRxWGv+7b9zUvjUbgINnxI0Gy7IBwqIIAcZIikIeCkuAFj5RhYSpVUN6wMSs2LMiGhWELC6iiypRxJQ4FVUmFvElMEqdiJZZiJDt2ZJctRdLYo2hG87j3djeL0YxmMvLZ3L6P8\/\/n\/Pf0OS2MMZZ1u3r1KrlcFhCABSFIp9JIKQGw1iKEaK87TQjRfial7LpvmTEGay21ao1aFOMFAVhLLh22cVUngTEGrQ1R1EBrjed5YMFYg040QgiklOvfJbie1yYSCEAgJOT78gCsrVVZWf10\/R14nkdfLouQgnToAxbLRtBCCFRn1sVikeXlZTKZNLV6nUJ\/gThJqJTLhKk0caNBJptFa029XsNPNK6rUEqhtcZxFFYboijC930mPzjLuXPnuPDem2wZuZM9oyNMjD\/ERxdm+WRhgXQ6hRekGBv7SlvRtkIARmsGhwYJwxCtNUq51Ot1stkctVoNISWe5xGGIVeuXMb3QSmXfD5PJ07LXCW55XMFskN51hollGx+E1crLMy8z87deyleudQOCOhUyLJz1y4cR5IkCUq5aKNJp9PEcYRSWay1zd+4Lm8UNWg0Gty4fh3XcwmCAD8IMNrgOA5Yw\/TZSca2387vjv6JI9t2MTMzQzo\/wL77xgkCl4Fb6apJtXEjKC4vE6ZTRI0Iz1UYC41GgzAVsra2RhiESCnJ5\/O4yiWdzSCFBCxCSPr6+rqVsvDvF1+muv9eLn48x\/zlyxz8yU9545UXmT59isEdu7DaMDw83HbpKmqlnGYAQUCiNdZoUqmQWq1GoVCgUi5vcFlD6foNlKswxhKGAUIIkiTBcSRKuaxWY+aXV8lkMmijWanWAMjl+\/jCztsZ2raVlXK1rTiAMMbYVkEVl5ex67vG931yudx6+cNG3r21AnbT51PnznPi+N+4+5t3MTU1zZ69e5iYmCCKonYrAVBKdQfUehHHMUII5ubmeOW117HNVrRpwVpryWYyHPj+4yilANBao7XuIruZaa3xfb8dUDu4llydTaxUKvH3p08ipWTi4e8ilUeUGBzPJ45iXnrheRCCnbcO8fhjj7Z9jTG4rgvWYIXTzFg0G6VJYqyQgEDK3qbZDmiz7LEgrEU5kq\/u\/w5vnfgjbz5\/kiS3lZ\/96jc4QoAUWCSthFpWrlaZPDPJO88dp2x8HjhwkNHdt3Hmv2\/w9gvPkhoaYfzADxi9bXsXZQtjc20FKM\/BUw4ZT3Dp3VM8du99bLF1anMfkg58lBC4Tq+7FIKFC1MkVy4xf\/pVomvnUdLh\/Nuvkavc4IPnTpCqr2xKC3R36k5zpUQKyIUBh578Obm4hvJ8RmbP4lTKiCAg0UlT0A75BXDn17\/FHabCR0uLbCst4wi4\/6FHUB9Ps3VwlnDhKuwd6\/4prTn4WcDW2hHNCWStoZEpMHX+Iravn+DQYcj3IQCvoxjbCgFh4DPfiKi6ATOFISSG1MDnuTB\/jXK2wLXCYE8inf5dCrXW9Xodaw1rN4oMFPq548sj6OwWDh\/+JR9OT1GplLE67gGMk5ijv\/8DY18axeS38dc\/\/4XFxSWOHTvGN+65m0tLFf757D\/4LG+b366Haa1tb\/vJyUmeeuq369NXs31LPwcnHuD4y+\/yzDMnKa6WyedzjD\/yPY4ePdoeJ3Ec47pu+1SAbc7y1i7uvNbr9eaOpLsP9Wq+bjqOkY7kpdf\/w\/AXh1kox7x\/5j2WSitooymVVrBRvUf6RhSzWioS42ARSOnQl8uwtnKdhgahXFJBQCb0N+WVN+sHjnIwxtCIYpTrYgGLRBtDojWNKKKxuNTjF8Uxp946za9\/+G2efPR+Zmf\/R7Va419Pn+DIgf0cOfQEC58s9vhZa7HW3ryoa\/WYyloNrXXzCGXB9ZongNbJr+p7PcBCCEJT40cPj\/PgvlHUxWkcR5ITMb\/48RPsyfukFud6lG0r1ALpBAT4tBpTrCTN2WYtxhpyuRzGbDjXGtEmgJaRfV8jlc4xtGMHt\/QP4AjYe9c9eK7P7tFRAi\/o4uq0\/wMzwMw+S82WvgAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/cropper_big.jpg\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022550\u0022 height=\u0022314\u0022\u003E\u003C\/span\u003E\n \n \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EZdj\u0119cia legitymacyjne u fotografa kosztuj\u0105 kilkana\u015bcie z\u0142otych za cztery sztuki. Samo ich wywo\u0142anie jest jednak warte raptem kilkadziesi\u0105t groszy. Je\u015bli sam potrafisz wykona\u0107 i zretuszowa\u0107 zdj\u0119cie, mo\u017cesz potem u\u017cy\u0107 poni\u017cszego narz\u0119dzia, by szybko przyci\u0105\u0107 je i przeskalowa\u0107 do odpowiednich rozmiar\u00f3w (35x45 mm). Nast\u0119pnie wystarczy wywo\u0142a\u0107 je jak zwyk\u0142e zdj\u0119cie 9x13 cm i r\u0119cznie przyci\u0105\u0107 no\u017cyczkami.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["ajax","dokumenty","legitymacyjne","oszcz\u0119dno\u015b\u0107","php","przycinanie","zdj\u0119cia"],"hasMore":false,"image":"https:\/\/avris.it\/image\/cropper_small.jpg","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/cropper_big.jpg\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/cropper_mini.jpg\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022137.01818181818\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EZdj\u0119cia legitymacyjne u fotografa kosztuj\u0105 kilkana\u015bcie z\u0142otych za cztery sztuki. Samo ich wywo\u0142anie jest jednak warte raptem kilkadziesi\u0105t groszy. Je\u015bli sam potrafisz wykona\u0107 i zretuszowa\u0107 zdj\u0119cie, mo\u017cesz potem u\u017cy\u0107 poni\u017cszego narz\u0119dzia, by szybko przyci\u0105\u0107 je i przeskalowa\u0107 do odpowiednich rozmiar\u00f3w (35x45 mm). Nast\u0119pnie wystarczy wywo\u0142a\u0107 je jak zwyk\u0142e zdj\u0119cie 9x13 cm i r\u0119cznie przyci\u0105\u0107 no\u017cyczkami.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/cropper_big.jpg\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/cropper_mini.jpg\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022137.01818181818\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EZdj\u0119cia legitymacyjne u fotografa kosztuj\u0105 kilkana\u015bcie z\u0142otych za cztery sztuki. Samo ich wywo\u0142anie jest jednak warte raptem kilkadziesi\u0105t groszy. Je\u015bli sam potrafisz wykona\u0107 i zretuszowa\u0107 zdj\u0119cie, mo\u017cesz potem u\u017cy\u0107 poni\u017cszego narz\u0119dzia, by szybko przyci\u0105\u0107 je i przeskalowa\u0107 do odpowiednich rozmiar\u00f3w (35x45 mm). Nast\u0119pnie wystarczy wywo\u0142a\u0107 je jak zwyk\u0142e zdj\u0119cie 9x13 cm i r\u0119cznie przyci\u0105\u0107 no\u017cyczkami.\u003C\/p\u003E","words":73,"readTime":null,"lang":"pl"}}}}}