diff --git a/CHANGELOG.md b/CHANGELOG.md index e1b88501..fc360421 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # @vladmandic/human -Version: **1.9.1** +Version: **1.9.2** Description: **Human: AI-powered 3D Face Detection & Rotation Tracking, Face Description & Recognition, Body Pose Tracking, 3D Hand & Finger Tracking, Iris Analysis, Age & Gender & Emotion Prediction, Gesture Recognition** Author: **Vladimir Mandic ** @@ -9,7 +9,12 @@ Repository: **** ## Changelog -### **HEAD -> main** 2021/05/21 mandic00@live.com +### **1.9.2** 2021/05/22 mandic00@live.com + +- add id and boxraw on missing objects +- restructure results strong typing + +### **origin/main** 2021/05/21 mandic00@live.com ### **1.9.1** 2021/05/21 mandic00@live.com diff --git a/TODO.md b/TODO.md index 0257d05c..b3cad9b7 100644 --- a/TODO.md +++ b/TODO.md @@ -6,7 +6,7 @@ N/A ## Exploring Features -- Output interpolation for draw +- drawOptions.bufferedOutput: Output interpolation for draw ## Explore Models diff --git a/demo/icons.css b/demo/icons.css index 64cbbd15..34bb155c 100644 --- a/demo/icons.css +++ b/demo/icons.css @@ -1,13 +1,17 @@ -.icon-binoculars { width: 64px; height: 64px; margin-bottom: 4px; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZFOEYwRDAxMDM3RjExRTdBRThFOTZEM0M4RTAwRDExIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjZFOEYwRDAyMDM3RjExRTdBRThFOTZEM0M4RTAwRDExIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NkU4RjBDRkYwMzdGMTFFN0FFOEU5NkQzQzhFMDBEMTEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NkU4RjBEMDAwMzdGMTFFN0FFOEU5NkQzQzhFMDBEMTEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz55iipzAAAUKElEQVR42uxbCXhU5bl+z5kzezLJZCYLWUmAhB0MO2EVRGSvKGoRxaVqXanaXp6nj9Wqra1btbXlalUqVlv3atGqKFQ2oaxlDwRDNpJJMjOZmTNzljnL/f6ToKW37VPuFa9ec57nIyEzmfN/7/d97/d+5//DmaaJr/PF42t+9QLQC0AvAL0A9ALQC0AvAL0AfG0v4cu+QEPXYBgk100Dgp2Wy9nODgB33303Nm7c+OXxXEnBaXdg9uJLpk6au/CShs5E4v03X3v18Kb3dvA8D44/MyACgQDWrFkDj8dz+gtsGGI2d+7cL1foS0YOHvzQa88/UZ8290Z1c0ubav7ir13apDsfe4he5c7047KyshCPxz/195R9mgEul+tL43vO8AlDZq56e4tms2WtPCDDl5mBK3wyXKphK7/wpju7nEHfwZ8sv96k8vh3r/8W+S8dBwTK+3gHjx2fm+0LPnDHdSsunejLgpTEruNNuOW4Az+RyjFeS4GXQsDYhddlLrh1b/yNR1d9xUnQDn7Y1Jpz5l9+1QXz5i4aWBQMdEoGPgwlkDiYxJXlHPrl+fGkdAIrjsewXu+DEl2HJMagnHvDj7Dx1TcRbjz51QPAXxQom7nkwqnf+ObyKWNGTszzCgh1JbG7MYxjXWnIOvD7IwpqWzTcWJyEanK409uExqY46jQ/eJsPhifHjxnX3ICX7/7BVwaAQPX06nELly6fMXveRUMr8vvoqoEjHSI2nVBQF0ujPq5Bo5Y3INuOYq8NjxwzUJROYgQfRlqWsYSL4YFIFwxfBa3cCYycfRneevjHkBPylxYAhz/fN2LWN+add9HlV0+qmTg94OX4jpiKfU0xHIqoOBJVraiHZQPs4dyQHAdSaQM24vmgx47Hm3y413scmiJhgN1EpSKitoPe6fYTosX9UTp0CI5+vOvv7+v1+Z1jZsye1NHRGT+45cMdaSkFjuO+OADKqycOPm/JlcvOm7vgsqqKgjKDCLsxLGFTm2pFm1kDRTwk6YhTJjDvSzIF8LTGRNqEqptw0C81pZ1YJ/oxyxaHnNYxDARAawLoMwRwBoC8ivK/BUAQBJx3+bcu/MHK7/6gsqp8xOEI8Pp7H72/4ZmHbnZy5rGzCoArK+CumbNo9qJLl101efLk8/0+3hGNG6gPpXAinsaJhGY53ZjU0Zbqdlxknczg4HPz8No5+hlzXoemqtBVBQ5Zwp+FHAzVDyPVFUYmZQoXlWDKIuDLJ8GUTHyWbhlC4J4XnumYOe+KO1M8Zh01UC1IqBpdM0svGb7htkefmRM/vG0fZ7Pjtttuw+jRoz8fAHIrh/c7/+Jlly259LLLRw4squIomiFK6782ymhJamgmL5vJ6ZNJcljRUCBomFnKwU4p2ZJIY19UR9hwICTz4PU0zLQMjRzXxC5wsRBaHRnYwUriZCMUVzalSBflOJVA4/7t2PPeOniDboE3bNfeeOPKa5bVXBFvO4CX6yX82FaFgTmZGKuG0abZi44HJr1x6A/3ToAUbV+wYMH/EgC7Rxgwbe6MBUuvvmruzOnzyvOdXillor5dRieldYfEomxYke5SdHg4DdNyDIzNFTAqzwO/R6Aop5GSZETiIvaFoni1QcPaNhviogi72AkuGQUnxeleXhx22DAhraIxEYHJZ8jYs+5J7PvTi31v+OnP+kyYu0BOJW3O/rklhf5sjC7ORnV+I8bv2YbbI6PR5MhG/3g7lc2AisC3f/5o+NFllws22/+sBPjCquLqeZcsWbj4kmXTRg8emeUAukQVuxuSiCqGZRHFRJyctpsaKj0mxpXZUOH3wk5qs13hsL5TBt8qotqVgqwoFgiFNgnX58UxIi1iNXWGQ50iXCR8OJkA4BKwl+RGDzW1Hfr4WGuDUD1nx4AsFJ/zwyfeCQZzAwzAsOzDzoiGSa+14FejbRjpNTG+JIB7jn2M75o1qKUMc4S7IA6euRSlo56gWWPbGQBgh+Oc6VMmXbhs+cL58xaNLM32m1S/LeEk9kgaYuQ0Iy4ZNjiJxUpcBmbm2zAo20FMLuDpWhkPHVFRkWWgKkfA8ZiOV+oMjHaquKNPJ2KiBDGZRCqVQp4h4zsVBv5gpvHu4Q7YUl3QM/L0g++/TiQmHJ/ynQe/PWLitLvdHk92c0Qk7dBplZlX4JDjskEnzXDNVhnPDgrDS2AOdsi4KLodL3KDwas6DMokTFp6PbWEfwOAQFlu9pTFi6cvuvTKCyZWjy/JtKErIWF7fZfF3szxlGaCOBw2mtAqEkdR7RYxsKQAeZ4A3I5MaDoRkVfGx3ICjx7hYXM50DcTRIY66jUPyogTxnMhdElp6ER+rBWyFnhJlQ8BM4nfH3eli4r7NtXMmnLzyEnTx9npRs2RBA62duET6iTNog6VtEMlaYdOIkgnD7RTtB+us2NFRgciBO5kLYb3ZA/CZpCyiVK235iZyNHYcJD6GwB6eiRHnzBoyhh+/EVXTpk1Z/FlY8oLsnhicIZ2cxohq6YN66ZsoS76x2Hjqf0ARxUXItvexm5Ohj+/ENnZ2SgoKEC/vqW4f5CBqc4oHm7y40jMB0GKEfk78WqHFwMJIMP8bBXse4m0wNT+ueg7IIcrHDerr9ObWdFCjh8j0mygbtJI1krEmqBMLMoQKPJAkn6HKg9uKr2P4l7UqEBfyks3AVstNWIdtVFke4HMQBFFiNQUDnwGgJoimq3oj2t/+QsMGHe+wfPcQU3DYzva4KQPVOgOYppF24SLou2mlsWcZzdWDR2CRgyfWYrY6OVQdr8I/WQTDMOAJEk40dCAkuJiDHAJ+J7zE7xilmGz5oQaa0C5m3S9Q4PDLuDTbUr6RmeTHqHaL+AR5DR9RoQ6BrXQFnKaiSYmHQh3ZLt4eCj9GRAyLUal9slET1rVsBEBFJotiMTiKNKShCrBm1nMVCQHT5b79BLwF2bgmtvfLBg8ZLC+fhXEUDOkYDFs42fCVtgfLR0JpKiGqN9AsxvQqNbSBIBCZqe6t/EmeFqoQTo9PuwymLtWI1l/HP7cfOTm5uLEiROgukWW14P54n7YqU0WO9OoDnph2J3dGUCOsydANsFO6+xHxDcECXcQ7ck0OpMq4ml2X1o0Oe7gWfZRIMiDFDnOMkZVWPukQKoSnEoKB3QetakY1E6alzLzANFOLE4cIMY60BKqQ+WEzwDQhp8/O8tXOXhRYgM+qt+CEUXFaGr8GI1/fQ8j51yKq+d/E7UkW0/GFSi0Wgq4tWhWCuwrb3TXLm8o0Fw5qB84D0P2Po/29hBisRjy8/OhUUaxjPB6MzCvRITAOIKS3qRMYbM9b3cgq6gS/gpSeb5cijSJJVGxpDHjGQq05bhA+oEny6ZAsqgnFRUqzQoGOc2R83yadY8kkqqAgxEJBWHiGKYaiW+gyCfxyg+/bVZcHAX+BgC1rHrsZF5CYmc9CsorMaVmHJraOvDBR5ux763n4JQimHLFrfgLLUJU0hZZEb+B0RYDgBljYDbMyPEoiRo3ctyFKJZbrLRsamqCz5eJDLebAuSCLyubosl+KQ2OMsBBWeYtGwSPP9eSwxJpBIWxttkNrK3H6VNqnqV9ml6MJCkgyRQMKmEbGUdZyDMgaGbQTR6SzQs1pwhbTybgjHc8zW147i40H2wT3FedrgN4jy+nWG8lgpEQzMvHmKGDUFJUiOOtnRbTH9i8DlkZHgxeeB3ePU6tiW6um93O6z1gqApbTAwaKTVFYimYg2Ku1Xr0LBhpdEUJGIVH0HRAcJM4cruQzh8As7CKWl0AKsVZFGWrzCxsTGtEsL63vvYYKzmDfhhLSnQ/kWQxc54cZwAwU5LgxDC4YF/E29vv3771w8Nej7d918urP/B6/oMW40BeXt7pABByKYHq2LQJkHSO0tSNvi6n9cbDDSdhdwjYvm4t/CX9UVYxlTpCFCZ1DNUiHgVqMg6NDKTReVqASdYgK4hR2XkFE/s9VegsHYuBFWXICLqR0FREiJ2ZtDUJPSEmWVH12tlndk+GjHiZqVbJdRu7bKaOFOkGWUxaM4HNirhEzpPj9H+OtEM6rz+9nnhz7yu/vgsEfiA/FwOqBsHhdP6jYYgiGaqvjef6ESApue+TVtQ2tsGf6aVXOIoMRUTwQPBk46PXnse4W6hGbU4SLylyPIF0KgGDao45zquMbRMkYKJIkyMb+gyHu/85yC2twISAAy7KlwZqpZLmQJqlN3GCmxzPZMVNKcuqnT0QYRfrWikiG4kykP2MZYShpSlLRMt5QyIAyDhmLPLUWikNIZdVQ2mqfQSv3PN95rzlIS9QSan/DAAiovo9W48Jk81ZJYXcO9sP4897a1FMgIS6RCIZHUxAuZyZSLU34ujGd+AbuRAt7a1WzbGUE1jasQiQficqh0YRsJcORXH/IlKEAtLpNOpJObIJkGSEVcvMcZ+dt/ZnbBx7SsvaG2e1N4uY6X2M5BgAqkbZQgNSIpGERM5rKWaU/qmkRXg8Aa7b3ZD7ju7UNr14Mz58+qUzeiBir9+xbx/6Hlg6tXhYpteF9bsPobxPLhrbw9Ycnjao/TEicnhxbPsGBPtPAU+Ic6TwbOQ8WPQp9QxXJpRhM4nFg9SSEmhLyHDSMNPWpdDkp1pgM8ezSLLxVEISa5/kIFMYGjkvE+PZepiOtTyW9mpag5iSEEuIlPos65JkIpUcAUDGnE/nlEK2Z2w1frvyatT9pfaMnwgJ8XY9uWntM3VT73zs3BH98Zu1WxEmtNOEPOlmi+QkIh7eJI4ItSBdX8ceacJMdFith9UejXdQzlmEyoJMSG89iGhjHZo9fphjpqPf5Dk0CLnQEU9BJ83OdAPHZFVPB2HOK0RudvKetTuetQKzW9iwUktSpCUymb6XyWkLAJFSnghQLhoG5WTd43j1lpUQI2f0eOzTvUHOQbWx8/U1b9enWkcNG4g+eVlQxVSPOusOiUmpzfS6TmNporEWOtUVHycAxAhAc7viIdYvLcIcZSccoWOYMqIKQ7M5tK99Eo3P3oXFwQTmDwygyGtDpr27rTHnWTtjZJruIbq0JYV1ROn+nV1xxOJxiIk4kmRSIkb1T+Kmq4PWQrNI+ZiI8pc/LsVvVqw4U+dP3xxlDxmVSPTYW2vu2SeUYdnMMbQyUlVpmTEPhUixFBaLMmlcmoFDVhcAze1IdgNgUKrX5PMIN9aTsCxDzYTxmH7uDJQPGYlQ/VFsWXU3RgudGFvkQ7FXQEmGDblunniAsziGcX+SCj+cUhGKJtAZjZHzMSTIkmQpMok0hhIhsL1BJIP9tmkv3TMZHzz54ue3O7xu1dO/23Tg3eDQcbh0BoFAN4NIxCZ1tzgLhFOgsPRIhGHG2qERNyBYmsy3ydSfZWRk+zG0sh8mVg9HvwGVcBeUIRKJ4k+rHkCpQClNjM8Gq46ehyehlGENN61xGe3ROKKk3xMs8pZ1AyDFIpDJUgWDqCRSvzJWXXsuDm869Pluj+uKIa7+3vKf708dnXzBXFx8wSSKdke3EamxTUsLCH8hQOlvSCLSBVVx4oob0HToAbZ7K1A5icT2bAOzMOhHfjAA3p0Jm78AzaQI976xGhV+F8LUDtolA23MSO+HYkmEu2LWHl6CUp2ZGO/qdj7aAYkkr1hyTkzes+5KPH3TTZR10tk5H9BeF2p+6Oq5P9mj1I5dfCVW3rocxX4anztbgY6mbk6omghTlaGWjHhHP/Dn8dj2ypOo3bqng5KjMC+IkzS6HqhvQXN7xGpnrK5lzg4uOx97Nm+AVLcHbpcbMbU75cNxkdI9YdV6d8Tjn6a9Eg1BdmYhmdN3R/q1H0/Be79c060Jz+b5gJYDdU33XTz1rmt/9utvzF4y/8YHa/DJzi04UnscuwPjkQqWdupbX/4+Nv/2KSZ8rKv5wK7DbbH45aUlPlHZTlriCDpjCTR3RhGXadihPm/aHCSFBBxY9wY8Fw1CiqLaPcBIBKhEBJvqGWqYsElYWcfkshxue8p84cbb0dWW/OIOSEQaQvLDlyz43c5rl74+9eLrgyWzhiUDginVH9mKRy++HfW7j572/nBDqHbPrg+4BSMuHFCUi837atHJntfFRBpuNGvIYe3URmTZUrsfuQ21NPKzKY16+akprsd5kKZgU6JSPDyh7nxnBd5f9eznFfUz2xdgUnL9qheUDU+90JIZzLN0czzU8Y/fTKrto5f/c9uMSRfOGjUIuw7/CXvrmiyFh54nPUzZcWwvgMSMdmg3+OEzLDHVrSh7BhlSkzrJbikzf4/+x8evwf51e/7vzwjRAEKOt/9z53uufe9+uG537eb8AYMxqrIYRiJBAHA9WoKlgGbN/uxwgtxyDBppe546DHv8zYYYJDqhBsqoHZrP6s/cOvVsOn92DklRF+n6/U+/uzaeoy89f6K14wM2Jepqd/tUTmkLvbuFapr16NsSU/SaUjhElGq3X28+c/M1CDclvpqnxA5/uO2Dl164vz6vGrcsOQ+CSn5E20lLxE7XEmyzksqDj7fDICGWCpTvU955YhrefuwpC6Cv9DG51+/74a/XbnmBGzELK7+1BFl2cqjjJGVDDwjJLiacwDOW9xWwhy7Pac/dMQX7P9j1/+OcoK6a8q+uv+rBl9avDg9fgHvvWYnpNSORodPU2NVKU6ULGD0fujsrlTy2+yZj9Yrl6GyMfeGHNU6dlmKbhWftmnX7HVXPHU/csKHFvPb59ea0+9aYrh9tNnHv9gPoN2HcF3LwKifnX58SKysrQ1VV1VlAmFpg3WuPKGua3n532lXXeSpH1ZhDRtlKG/Zv5F79/v0wWiI4G/f9+x3s3Fyw84V/f3Gn/miKbWKc1T+g6mF+05XZfVKD8QCN0xDsX0ims3v+SwC+rlfvafFeAHoB6AWgF4BeAHoB6AXga3v9lwADAOj97IBiEMnoAAAAAElFTkSuQmCC); } +:root { + --icon-size: 64px; +} -.icon-brush { width: 64px; height: 64px; margin-bottom: 4px; background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjc4NzE2ODZFMDM3RjExRTdCODVBRTcwQTlBMDgwMERFIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjc4NzE2ODZGMDM3RjExRTdCODVBRTcwQTlBMDgwMERFIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6Nzg3MTY4NkMwMzdGMTFFN0I4NUFFNzBBOUEwODAwREUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6Nzg3MTY4NkQwMzdGMTFFN0I4NUFFNzBBOUEwODAwREUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz56cVqZAAAYbElEQVR42txbC3hU1bX+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); } +.icon-binoculars { width: var(--icon-size); height: var(--icon-size); margin-bottom: 4px; background-size: contain; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZFOEYwRDAxMDM3RjExRTdBRThFOTZEM0M4RTAwRDExIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjZFOEYwRDAyMDM3RjExRTdBRThFOTZEM0M4RTAwRDExIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NkU4RjBDRkYwMzdGMTFFN0FFOEU5NkQzQzhFMDBEMTEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NkU4RjBEMDAwMzdGMTFFN0FFOEU5NkQzQzhFMDBEMTEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz55iipzAAAUKElEQVR42uxbCXhU5bl+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); } -.icon-color { width: 64px; height: 64px; margin-bottom: 4px; background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIwMkQwM0ExMDM4MDExRTdBM0FEQ0Q3Q0E4NDVFMUU0IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIwMkQwM0EyMDM4MDExRTdBM0FEQ0Q3Q0E4NDVFMUU0Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjAyRDAzOUYwMzgwMTFFN0EzQURDRDdDQTg0NUUxRTQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjAyRDAzQTAwMzgwMTFFN0EzQURDRDdDQTg0NUUxRTQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5MRu9hAAAYnUlEQVR42sxbCZRcZZW+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); } +.icon-brush { width: var(--icon-size); height: var(--icon-size); margin-bottom: 4px; background-size: contain; background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjc4NzE2ODZFMDM3RjExRTdCODVBRTcwQTlBMDgwMERFIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjc4NzE2ODZGMDM3RjExRTdCODVBRTcwQTlBMDgwMERFIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6Nzg3MTY4NkMwMzdGMTFFN0I4NUFFNzBBOUEwODAwREUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6Nzg3MTY4NkQwMzdGMTFFN0I4NUFFNzBBOUEwODAwREUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz56cVqZAAAYbElEQVR42txbC3hU1bX+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); } -.icon-games { width: 64px; height: 64px; margin-bottom: 4px; background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkI4QkIxQjE4MDM3RjExRTc5NjZEQ0Q1QTExQUZENkIwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkI4QkIxQjE5MDM3RjExRTc5NjZEQ0Q1QTExQUZENkIwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjhCQjFCMTYwMzdGMTFFNzk2NkRDRDVBMTFBRkQ2QjAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjhCQjFCMTcwMzdGMTFFNzk2NkRDRDVBMTFBRkQ2QjAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5IpjO2AAAUA0lEQVR42uRba2xV15Xe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); } +.icon-color { width: var(--icon-size); height: var(--icon-size); margin-bottom: 4px; background-size: contain; background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIwMkQwM0ExMDM4MDExRTdBM0FEQ0Q3Q0E4NDVFMUU0IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIwMkQwM0EyMDM4MDExRTdBM0FEQ0Q3Q0E4NDVFMUU0Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjAyRDAzOUYwMzgwMTFFN0EzQURDRDdDQTg0NUUxRTQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjAyRDAzQTAwMzgwMTFFN0EzQURDRDdDQTg0NUUxRTQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5MRu9hAAAYnUlEQVR42sxbCZRcZZW+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); } -.icon-stats { width: 64px; height: 64px; margin-bottom: 4px; background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjFGRDU0OTAyMDM4MDExRTc5RDQzRTE1MjFGRTBCNDI2IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjFGRDU0OTAzMDM4MDExRTc5RDQzRTE1MjFGRTBCNDI2Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MUZENTQ5MDAwMzgwMTFFNzlENDNFMTUyMUZFMEI0MjYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MUZENTQ5MDEwMzgwMTFFNzlENDNFMTUyMUZFMEI0MjYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz60tKC8AAAXpklEQVR42sxbCZBdZZU+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); } +.icon-games { width: var(--icon-size); height: var(--icon-size); margin-bottom: 4px; background-size: contain; background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkI4QkIxQjE4MDM3RjExRTc5NjZEQ0Q1QTExQUZENkIwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkI4QkIxQjE5MDM3RjExRTc5NjZEQ0Q1QTExQUZENkIwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjhCQjFCMTYwMzdGMTFFNzk2NkRDRDVBMTFBRkQ2QjAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjhCQjFCMTcwMzdGMTFFNzk2NkRDRDVBMTFBRkQ2QjAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5IpjO2AAAUA0lEQVR42uRba2xV15Xe9+k3ENvgB2CHxBBjYwMlgMDYYMAUnJiEQIAISlRFkeZHO22kpL9mplLS+TFTOppppmozitTQkMlMSRMJtUMSoDwSIDxiM4FgY0ww+AHY+AF+38e5s7519jre92IiQrHJqEfa3Ovj43P2+va3vvXYB1ckElF/zYcX/wCE7u5u9U3BsCxLBQIBFRcXp3w+n7unp8fCPei78ng8yu12f2sMxVzGjx+vXC7X7QDcvHlTLViwQHV1dd214UNDQyohIUEtXrSodOvWrT9JS0/PramuPnz8+PEDdefPH29tbW3u7+/nBwsgsQ8fyyMjI0PR3FRycnLUeRdWrLOzU02bNk3dunXrrm84//HHSzdu3PhyyZIla4Gsm4yDkQCmra3tVl1dXU11Tc2hUydPHmhoaKju6++/9SAZMHHiRHXx4kWVkpIyMgAzZsxQHR0dX3sTrOAiWvFn1q17mRizFmiGiQ1CMQCAgRX308DR29urmpubW744c+bk6dOn99M43NjYWDs4OBgcSwCysrLU+fPn7w0AGF5SUlK6jgyfM3v22vj4eHYDKAZI7SLjcY2wwOP1OoB46TsA8dL3cDgMN7MuXbp0vqam5ggxZP/Zs2ePkbtcHm0xvicAYFRpaWk5VryoqKgSxsAIJUbbF7FxiYmJSn4PN8B5D67RQAAQrwEIfiYWqOvXr/fRxL4gMA4SGH+uPXeuuqOrq1PdZ0C+MQBlZWXlmzdtYsNhFNReqM6rrRWev+vVDYVCKkwDUQGGynU8NAgyHHZoQOBKrS0tqr6+/uyPX3ppEelR71gA4JUvUGwcS5cuLX9+27aX58+fX4mfBwYGVIiM49WlSYL6UatDRpJfs8AAzAkkiPPmzXMeZBodO0IEQpDuO0gLAAGGUGVnZ2fQjcYsfkoe4FqxfHnZhmef/cmqiopKrE5vXx+vqJdWxyIA2HhZZeMTRhcUFKjJ2dkMTjIZDrCEMS6tC7HG4xyuudXTw6yZNGmSGjdunGpquhIcy9SMAaDV8r3yyiu/i4uPz4EbwAjEeIgajAxrAPBp6Z8BQDAY5OEF7ckAnMfPMMjSbAFAUcZDJOkzQNf1UYSIi49TE9PT6f72fS1rbDNTr6Yp2RUe6KZECGELCRFEDUAkJSWpeAIDKwmDZOVhZEgPGBMg4cOKwmBKB1XEAE5pECQZgvjh2qSkRHaVEydPUu7Qrp7bvJkAco89AH19fSFKYwNIaPwQMJoojO0leg6SBuBcAoU+AAGBc2lmMABkvB9M8PvZKEQADBjJWSOdC2kwwI5AYIjvnUAAI5y2k+GffXZczZo1i5/jUq6xB4ANCYcDPjICNQEmBkHCyklMh3FBuk4SHRl++puwdochugb38OsBEGRAZG1QIswuv8/PBnc0XuZrH87NZTaEQsGxB4C/eL0BrG49hYoLDQ3qySefVNOnT2dKi4hJLg8dGCCDI1rlvTr5gWFxYAINAAEgIXJQeLDC7XYRaH47MQKwdL/UtFR6Tp4qKCwgloRs4XwQANBkhsbRCuTQSrS0tqrqzz9XM2fOjGIBJoywh3MiinCBPjJOEiSvZghE9CppSXPTFWaY3++jPyWwvB6OLF6f/egpk6eovEfzyMUSGCQ864EwgNQ5gIc/9thjilJTNggGu3TCAsOg4FI+u/Xv9d+qCAGCnIG0hH0cdL9y5TKzB8yyGQQhtKtDJEBer2YC/Q7uBca4XQ9ABGEQ+XFgiCaNWLxs2TJeNaSxkq3xRLWKw0C3ToVxDokQVXxcUkMsB4dsoYNv2wWSl+kvkcAHw7UbsHt5dISws8sAPWTMhICfiNVqa28PYGUQmxH6UlNTbQOlyqPJ+rXoOQ0PzQ4I5IULF9SHH37IRrg5PXbfJpbi/zYDfOwWAoLHyRPcEZrPAOZFkWHhihUrqkiQM0bdBegYMimO4dIr7pLsTdMVh/g8Jo5ewrSHHybKX2G1B2MQzmyKe5wyWRIhAAC34FwgOY7uYbPAa/9dmOqPxU888cQP1lZVbaKS293S0tJZW1dXjd4CldWHCOz/JVfrvf8AkLERrfYyBBAdKeyfdYaH38IIyt9V8ezZavyECcwSgIO/9fm8TH8bBCmR3Rwt0J25du2aenrdOs4G4fudlIVaESv3F9u3f5qRkeFioaUxderUVAJ55ZrVq1dCYy7T8eWXXx6nBOrPVEF+ermxsZY0xPrLAIhEhhzDjVAkbIDAHT58WKWlpSlaIZ22WpzkAITpeXlq8uTJnDhZukliGy/DZgFc4UbHDc7+iouLVUpysurv61dXr15l7aBI5IMYwlBhXsCoH/C7wlmzcouKi3M3bNiwkVL3EOlPLQFx5OSpU/vP19V9RlGs+RsDQIYPmTE4IisNVmgALl26pPbs2aO2bNmi8ilahDQIUhMEdQ0goHHI43LXZoJtQAKn2knEAhRQzc3N3JMEMCm6XwdNMpssZi0RxHmES+2StCDejMzMopKSkqJt27b9zfXr13tqa2u/oONAzenTB8hdauh5XXBNuN2du8I3bzIDEOcj+hxyeoXVJONAW/g6+aMi+nGShBwgFFssadraRZDHiQIAASKIn1MfSlVz5szh1ewh0eXCiwzC3wkDpeRmPdG6A5ClxxACIAS4W/cjBJCcnJwUmmfJ6tWrSygB+zsC+BpFqZNXmpr2Hzp06JNrV69+mT5x4tCaNWuiAWhraxtS0rXVKyhUxicmkp+fjw4Od1hB9aCUxro4ksrR0kDYTQ+PVno7Wty4cYMTHjQoxBhhjDLY57KrVDZM5iGFlNloYTdBToJPAAQgtLskEaMKCwszi2bNqqKCrQoMJkAu0Dz+g263/TYRFNQ5GmBSKGlxjh6I/gBi/PLlyzlHAKVk1UcEAaDpxmgwGLAbKyE71QWbpFyOMlo/X1hwknQCQin1SjrpD3TDMTwWCP1zWH4mQKQtj2oVbkY5znQK88tvA4AmMyirgLIYlR8MhmEuPUGqGhkMSww2h1EeCyBe3UlC0ROf4HEiiDRXnE8NmDAholmI54P2WHV0mrJ10yVkUP/rgAALcC+wFowFc5NTkiGwA7eJIE1sSB589NgxRb6i1j71lEqjhCikOz8RzYrY7lDYaJJwf0B3g9LS09UECo28gmiUaKMjevUtEwyDRSHtRo888gjrjoTVkK49MI+QTsddMSIpLgBw0NsQgc3KzlKJCYk8v4jRdPEK5SwAQJOJI9SBFHp8xwgISkaUpR9q6clHTTpm1cNGqwwg9lAliD4D/DGR7i1JlMMAAcK4n5TXQX1vNhjnjS6TwwQx3Fj1ILO1Vw0NUlgdl0JZbRqH2nAorBKTEm+PAvhjisNDMCCF0ILCU67B1OfV11ogk7VilD8U4wLi/5go9wHgf93ddpcJQJB7wcVEYMPauFh3kvDKvQgJtTGgxTZe4S7sqkR+1DWJiUkcag8cOKC+M2+eWrx40ch5AKmkFU++CoqBAWWlpc5kLBFEg7am2uOaAXowqCcrhhDHCZDeFOHQRfe+SUBggugbIPyBcXGaGaItAqRPOk7SbaLhMVpvpvu59bMBAJ6LdhsiD+ZH4Y+v4aiCFr4hvhxgMcmvvvrq+O7du/9IYWoQE5k8ZYqieOn09EwQTEbolprat3cva4cwQAooXAu/BCBSAzA7dMsdPoouVD/dQ5gDhiBRAmMS9EikAg1FGlwJn9x80fe0E7V+pj1SbaTWXHVSsXWr5xbfPzMzU2XRQN1htvWZAVgNAqD+Bz/8YdWjjz6a/0Rl5UZKJDY9lp9fgAdBQcOGSluGkOFA8zSF6Hb2zBlKch5i8fLoDY8TlPNTEqLKqcSGawk4vFFiNFiCWjyljS7lMkcRml8Q7TZ9T58+BzA7uzoprxjkFXaqTkm/dbUK5c+kvGPK1KkKhabZeHVLIiSFDolf3S9ff/3VZ9avn/vCCy9Uvrdr17sdnZ034zVVXTo1tvSAX6aT2sM41AmD2hUwkmml4POY/F5iCIxEq8wxziiVZQAYsIi7052dzBDcExQHE3DPcePG8306OzsoZHfz76RMH6497J2pCeMnKCqp1cKFC1kXgsFQVOP1jv0nemjg4MGDezCoyMlZuXLlulUVFVtmzpw5H3QcQCKk1R5Ch64uJg42ARjQHnR9mMpk5P7IwuD/43NyhvuMUm7rPIMbLRi6BJdOMu5v6ZCHRYC7XLzYwIxBT0G6TWi6SJdJag98nzF9Bn8fpKgAF3EZLyrcVQOO8v8rO3bs+LedO3f+cu7cuSWVlZVbFy9a9DSJZUaIaAgNgJugJ8CT1R0jCFgeMQOrCFDABklUpBVmvkUi0UUOEVSIJQCHwRDb9rY2/h230Azj8YmaQxggINhuZ5ficDeyP/yNAJCDJhc5derUpxhE+78vKyt78rurVn2PWFFG/uiBqMnmB1wAqg2az3v8cW6wgsJ2mexxOskSwzm/MIoxsKO6pkadOHFCFVP5jX4DMw6aFecnv/cbIHo0AK5h41F+6xIcPm9fQ6xysW4N3hMA5kHRov3999//7QcffPDbgoKCORXkHkuWLFmfmZExjTM3nZSg8MGEYLyTosoWmaYo+Cg1B+uLZolf+/S+/fs5DUZCZYc8j7PS5r6j3YTxDe86e3263aavcZhyFxpwtwcmTOXxaYy33nrr1YULFhApVj1fXl6+hh7ukZpeGS9SyJDMjbfXyV0s7fvMEjIAqj2Fym9s31+loiiVRFbx/oLboLnHWV1HAwgE9B1C4dBwxPG4HRBMAO5rD5ribc9HH3/83j/89KfPUMFxXTY/TMOl8jM2ZPiaiJzXMRrVGzpMeXl5KoeAQDFkGZnfsNr7dK9Bh0j6xB5DDbnPn/74J9WPrT0RSh73mQF3eCXNS8IT4N1l1wi7fTqpgpChmwyRQ/Zp6QQrovMCZIXYp8A2Ha4PalG0c4VooRM3SEiIp+rvmjpI2R/adPJGCuoAfoXH7WEQRhUArbJo30QbL4mULnnR99tP/o26Y93TT6PXF1UagwX8joJuvTvNWC12wyAMd53j4uJVff0FcoE41g0kZpiFUyrzfsYouYChCwR4OCQtNtN4ySRhKCaNFBUMgNBxxmnk95JscT2icw5Lu4jHM/xWmtl7lARoPCVAubm5nItYEcvZ2oua02gBQFlc+EZ7e8Aj+wyS6EhFqRMcpNlTqOYAxbHSYER4hD6DWTYP64DHACE6+0PXiPIUDr3IQln4DB1yj7YG6EotEHtOyl9eAb1/iLoBiRSSJdmGj+04Se8gbNQfEv9jmYADTRS89GWzyLIzTv0+k8vtHn0RVPZqjwgA7yxrbUB2h5CFFjveMsFqhY2VNhsslvF6TsQBwKWzQLcGwsu7ztJoZbF0eaJe+/u6naH7ejADtNEQLxiqdA1v+iASJRG3qPeQRgBBhk1lexdDvrt0fIfKiyuYfUbRPdnQHnUAInqnCcZ98sknqosKoeXl5dwjDGk/NvuMrA+xjVZj90l6hdL8GOGJzmf0W6eRKAaAJfQZGlUR5CZJb29Qwg5gR6jDrpIZCSzTv2MMDxktNqfvaIAAGyNRkUX6hCSwoaAjpDhv72PaqfVnx441v/tf7/7rqAPQ1tYWANtQAU6lTC6XyuAOXd+LW1gjAOG03PTKB7XhZu/RprY9LNlNcil+xcZ+cWu4USu7TRBJql0+37J167IjR47WjIUIDskL1cjIsCMEg/ltEmmoxLTIzTa5pZuxohvmC5pOMzWMFhoautfYx7OzsunyINNe6gOIIkDcu3fv7rT09OfffPPNbvQoRh0AVHxoXkDk0AGmIknNzM9XaLyGtXFmZ8mKAQLnEBJRCCFfwCpKmxyCZxvvVo2Njeqjjz7ihgwAQMcH7uHxRLhlNjgwqP79V796fdeuXS81NDSEYzdIRw2A/9mz59dUvSUvXry4IiszMwEtq3FU0CC9VToVjhVBkw0AEG+XIafHNcuWLmV1twUOgIX5lbojR44wq9COw++RW0iLr6urK/Lz7dtf3rlz57+gbYfka8wAkMYJJSUzqDx+tmLlyuco1y/EaoZ0r99Mj50aQbMB22l44SKTiqQzZ8/yjjRewpY2HK4BQIgu2dlZXExFNGsAdktLS89rP/vZ9/ft2/cH3mXW3eMR3xEazePSpUv1b7zxxj+S+HznxRdfXP2f77zzTlNTU7dH7xl6dEiLZQNWC3UC2vMwro+SJkllIX5B3q1Szp4hdpu7u7vY7+vr6xv/9kc/qhDjv7Zwk/8vgJRUFHq0D8r9p5SXlz+DJmtBYeECdHqD+l2DoN5DBEsmYRueKE2hi/8O4iWbImiLgeboQeI6r95+r62tPf7qq69tbr3a2hjzzDv/nyF0befOnctAjPYR0asLMcPWVVFRUcl3V63aunDhwqcmPPRQFgoVbKXJW+cIozAMhRLOSSWJNFhe2wUr0CA9c+bsH/7pn3/+/Rs32ntka14OsKm6unrk/zWGm7a3t0ft14/FIf/vEMfRo0fTfrdjx1o6thIoS6mM9UAw0QV2tuCMl64R86U36PfHUST4+BfrN6x/hUrgiFShUVGJzoEFsfWA69vyP0fffvtttW3bNv6OJiulzc+VlZVtoHL5EXlvSNwDb5zLOz8+n98iWfnxf//+96/jv8SgCrzX1+Qe6GGuzLlz505jvL1z52sL5s9fvWLFiu/NnjOnIiU5OUF2ivVmaPevf/PG8yR2u2XH6i95T/CBHjAq9iBR7t27b997GJMmTZpeVlq6qbS0dDOpfiFlfxcpwdlEwva5aMu9uPC3xgWwdYak5k7CiZUH/Smh8c0uLl7U1NzcQMa3SmIDBlRVVbGw/r8E4EEdbvVXfvyfAAMA5ddtQQNNnuMAAAAASUVORK5CYII=); } -.icon-webcam { width: 64px; height: 64px; margin-bottom: 4px; background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjNENDlEOERCMDM4MDExRTc4RUExQUFCRUNBMTIwQkU1IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjNENDlEOERDMDM4MDExRTc4RUExQUFCRUNBMTIwQkU1Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6M0Q0OUQ4RDkwMzgwMTFFNzhFQTFBQUJFQ0ExMjBCRTUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6M0Q0OUQ4REEwMzgwMTFFNzhFQTFBQUJFQ0ExMjBCRTUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6/4RMwAAATEUlEQVR42sxbCXRV5Xbe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); } +.icon-stats { width: var(--icon-size); height: var(--icon-size); margin-bottom: 4px; background-size: contain; background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjFGRDU0OTAyMDM4MDExRTc5RDQzRTE1MjFGRTBCNDI2IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjFGRDU0OTAzMDM4MDExRTc5RDQzRTE1MjFGRTBCNDI2Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MUZENTQ5MDAwMzgwMTFFNzlENDNFMTUyMUZFMEI0MjYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MUZENTQ5MDEwMzgwMTFFNzlENDNFMTUyMUZFMEI0MjYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz60tKC8AAAXpklEQVR42sxbCZBdZZU+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); } -.icon-play { width: 256px; height: 256px; background-image:url(data:image/png;base64,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);} +.icon-webcam { width: var(--icon-size); height: var(--icon-size); margin-bottom: 4px; background-size: contain; background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjNENDlEOERCMDM4MDExRTc4RUExQUFCRUNBMTIwQkU1IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjNENDlEOERDMDM4MDExRTc4RUExQUFCRUNBMTIwQkU1Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6M0Q0OUQ4RDkwMzgwMTFFNzhFQTFBQUJFQ0ExMjBCRTUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6M0Q0OUQ4REEwMzgwMTFFNzhFQTFBQUJFQ0ExMjBCRTUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6/4RMwAAATEUlEQVR42sxbCXRV5Xbe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); } + +.icon-play { width: 256px; height: 256px; background-size: contain; background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAACfZElEQVR4Xux9e4xc93Xed+6d9/u1O/t+8k2JlCVRlGXLsSVLtiA5tvOw3UaBLNhFi6I1XLh/JE4Tp7GNAoFau0VQC42VpkWBFmrjGnaQxEksWbJpWZYoiRRNiitK1HK5JHfJ3Zl9zey87unM/Gb1uzMHl3eXoWqKHAFH9/4e916I1Pedc75z7h10/+la17rWta51rWtd61rXbiSjLgCuXfMO/IAANppGARNmLAiYEZDRC9AAQMMA9THRboCSFDCS3OuPARQBECEgxKMhY1MPmytZWK+tA1gFeIXmS8u8buUBzhHzmwBPM3iOwG+BeQGo5mCVS7DyFYCshlXOfYS7kOoSQNfcjeQYMPx7jeYgfK+XfHcmyZMdhhHZAfLfDHgmeCQ0gqC3H1m/H37T5D6/CcDEcMgEkQnAaI5b9yO3p7IY2k8tMFsAapgr1VCuVSlXtrBUaYxLWK8s0JnVaXB1Fpx/mWurb3DljWku/vUCF18sAwZzbcECwNIAcdR23ZJIlwC6oGcNQ330ZP8sTt7xcZjxW0G+u7jXvwcJ/xCygUAd9B7EvR4kfF4AHjuMidpvviOhF3sCyi5H9SzhhovrDdPTU3nbfgnNCoq1GubXK3SmUEW+XMZcYY7m1l6DtXKIa0tHufTyqVr+mznUFmtOZOBwpOuSDLoE0AW9Z+D/JMkc3gXD/14O+O5GX+gmjISSdbB7kQ16EDD8nV6cqAFwDeyeiDoKoLsYu82zHDOAQhWYXgXWGscl4FKLKGZX1VrbfZkrOFMo0XR991xxBWdWTlJx9RBX557j0uHjtYWvLtgIwHIhhXd3dNAlgG54b6a+6DVCH5+AEX8/DN+9PBrZzzuiKQyHfOgLBAH47RemgsBoRNmeNJCxgZw2TdkKmGcLTp5fzqX9yuzrLNAnr19rkcOZpbo1jmvAuVU7iXAVc+sFnCmUaXp1mabyJ1DL/ZCrZ5+3Vp54zVr70bokA1j6ce+2NKFLAF3Qp7/qN8If3QP4HuBE4B6MRUZ4ezSOndEwgKD9oh1JYHe8bmkF+pDnckBXoC42wL0MFGvAzBpjvabWTi1JGpLBtPOa/XwgDARMNdgWI3VMAuDGuJ0MGHL82hIwU7eTdTu1pAhJbeIyTq6s0ZnVFUwtz1Ju5edcPfNXVuG7R62l/7FiIwDr3UIGXQLoAp88PX/io+DB3YDvQU4E7sXO+DDfHE+jLxAB4KHWFUNh4NYMsCvdAL6+C0mgY3YNWCwAry8zFkpAvmTb33EdCV3AnenZ6ZwBpg5wc/tGnwkMhoGBEJDyEQaiwGRM72O0n8+sAVMLdVsGji28fZsaLhSLdDS/gJO5C5RfrZPBW9+vRwZHrNW/LQCwrlky6BJAlzTN+G+bRvThYZh99yBQB/7O2A6+PTWIvkCUAALBCHmA/WlgZxy4LQuEPPJmi2Xg1DIwu8JN0L+xrBapYbZ9hg38hE4iYAl8V5p3DvcZpHWATkCrOW02OPaFgP6GBQmTCXXOkMRw9KIig6OLwNI6LAa4SQZHFi9gKnea8gtP8/qRv6vlv/EGV94qSzIA/3KIoEsAXW/f/xdR8gzdAjP8KO+I78XN8VHeGY0DMIlgNkC+Lw28p6duGempF8sK5Kfy3DzmyhrU6qhNz7Mmg05igB4MhYDgBsnova0QXp0tFhiLJSn+Fe26QSfIBRmoe1mCDPQRrCKF8WjdIoSJhCIIcPves2vA8xeAY4vNKIfBXKOTKyuYyp+jo5emuHrmSS785U9r+SdyAGodZABBBlebCLoE0AW+EbrLMJL/pp88ffchEPikdUfmZtyc6EfC66UWBg9mgVt665bqACkBx3LAm3luHvNl7dHJdiRqGRi0sQa9NhgCQh4FZAKwPdYCfRgImu7UTpuT1jUZrKnBbKElKq5wc/71ZYAdgU/KRbMyqyNK8JrAroQihN0pwG/qdWb1rBcuAC9dbGocFoo1C0dzC8bP545z7sLfc/HQ96zlb5/jykxZk4FIEYRu2bUrIYAu8MmT+lcmhT42CbPnU9wX/ggOJPfwvkQYgEmAMRAB7ukH9vc2wakvbIH++ALjF3mgVGsBndpBbYBBHfNpv8qvh2KEwZACeMq/ubwetHWWZzkBkH1R7lkoAYslRQazy9yMHBbWNQrbCIHb5y2br94WB3bFCaNxIO4DwPraY5eAFy8Cr+Vb1YSp5XV6/uJpmr7wI15/5cna8remuHS82Lp1TZl701HX3AmgC/z0H3go9KFtMDKf5bHoA/z+nnGMhPwgeBpAvykFfGgIGIq0h/fHlxToj0vQt865ea49vPLkg2Hl2RsKe8gEZMPPFgQ+2jIByGIBuxGFnCtUlXD5+gpwKsetSKGdEKwWIUgyUKS3P0XYkQL8hr62QTQvzQGvXALypaZwWKEXLp6noxd+yqVj/7229J+O8vqRgo0ELGVXQgRdAuh6/PCvboeR+RzvT32SD6QGkA14ARiJAPDBfuBgnxbzCMD5IvDyPOOlBaBsSdAbxKCN82bIrhTzbYkW4D1O4Hb36ERXid3dm4PcKwks5pskcOwSN0XOs2u2WJ11dFDrIAMGMBEF9qUI25N28gBOLAA/nQNmVsHIlav0k7lFOnL+2ToBPFHLP3aEy1MFGwnUXImgSwBd4GtF/9EdMHs+Xwf+b9Q9fg8SXj8A6g8Dv9IHHKgbkQLyek39z/jcRcZ8sR3wJgFkMAxoL39zEtiWItyUAFJ+AXDZI+wCfJDDPPid8wsMMNnOXSoKMm1Q4uerlxhHFzs6fyxCbQPoNjIIe4GbkoS9aSDm01rB+RXgZ/PAq4uAIoL5HB059ywXX3y8lvujo1ydKwGoOkQEXbGwSwCgDXHPTP7hKDx9/4THYp+pA78fo6EmRMdjwP2jwLaoDtnzFeBn5xlHckC5ZgN886hzehPATUlgb48CvY4Y2sAvPbpDCE8O4Ca66gzv7vGZ3PsJWM7b54o1pZEcu8h4NWeLAuxpgjKFWEv9fdyaJgzFGvMMZmpWUJ45C/zibSKYW6BX3vyBVfjZn9byf3wStcWyIAJluNGJgG74cL///8bJN/k57ot8lj+cncBoKACAxmLAfYPAZEIDf7pZqlKhLKCBb26E+BvhfQi4vY9wewYImhLoJMGr5gQhMMgl9L/aLM+uGy6vAzBIrrEjCWgyqCoy+PE5bqUJG+An1DbOLbWfWZHpnb3A7pQaMwi5AvDjOeD4YvMvq0LPXDiHt05/h9f+4s9rucdnAVQA1DrEQutGJgG6UYFvpr9kUvjhBykU+oL14eytuDkeA4ESfuDXxxXwFRhVb/uzs4zZgg7/DWjgN8ZhD5pe/v2DhIGQk6dn6fndSMFND7hC5uOroQ+wewQAkFzTpKDHeq4p+P3kHOPFS+o9gw3BsGaRjRhURBDyNkRDYFfdvIbSFPJF4NAccGIR3KgaGH87M2Vdmvq2tfjl73LptYIiAikW3ohEQDek1x96aid5en+HD2Tu47t7MggY3gbwPzgA3NarwTmzpv5HtAPfROvYzO9VLn/fMGFPUnt7DeAW6PXYOezfAsBpUyTA4jlboQjmzUcIzG7CoJyTkQB1jJUdvgT8WJGvQqoF1NASDhngFhEYRkMwrFtGEYHFhPlV4OnzwPlLNYteuLREz06/YBV+8s3awu+9BF7fSAuqQii8gURCuqGAn/12hAIHPsdj8Uf4w33bkfUHgyboQC9w1wAQ8ADU6sH/qQ345gb4id8mgMkocO8wYSLWurkAMQsycAr1yQ3cMjXYEpOT20aX8p9cIjEpwC3W5R77iWU7Z5B4ueiNFeDQOcaxnE4Pqkzq3NKCIZESDG/rZVggMKsXkp6aBZbny2X6yzPncPqN71jLTzxhLf/v+VY0UBVpwQ1CAnRjiHx3G2bm3+9HMPJl/kD2A3wglQZg7EgAHx0FEn4V0l8sMZ6eAc4VJfANqPHeJHBXP2E8Kj06Ecuwn/W6ALOj6NcBdtoayN37AK6cBPiy15NjyZDZNTLQR9ZEw9y+nisBP5xhvLgAFQU0rFMwtBSZvydN2JbkVqlRtRr/YgFcOrG0anz/jVc4f/jx2sLvPsO1hXUAFZeKQZcA3p1e/79GKXB7Xd2P/hY/NLAbca8v4QM9OAqMxRkGqbr9j2aBk3l1pcewh/sMkxrKM3DPMCHp06IgoIEPyHm0jyXQhddnV6GPXIH/D2d43gwJuHp8WbeQYqAzAUhCoLa0IVdWRHD4UksfsKcGlq4aRH3AgQyQjQBcJSyVgUPzwMx8rUbff2sGr53+G2v5T79lLT95AUBZEYEmgetdJKTrFfxm/B+ZRuyf7kao9/f57r77+EAyRgTjrj7gjroFPAwDyiu8kgOqVpuqr7w+qWaUe4a0x28HOutzdXR/NZekh5f7lEkikeYeHTBoK7m/q/DnvuaMFhLglikCpD7Qdk4yIjjLeMlGBFXWGgFaUUF/CKoq4yGwBZxeBX5yHlw+URcJv3/qsLX49GNW7t8d5tpC0SEtuC6jAfN6BL83+1+CFPnMb6O/52vWw+MfwGQ4nAmBfnMC2J1meAzC7ArwndOqtAcor6+ssa5aUj+1jfChAULS3wl+FqDXY6c8X1+rvbsAt9jvGMoT6+ddPYZ3vxeR85rjf4+cIDvhOD9UrlP7ScAEdicJ4zHCcglYrigiBxEM0n+Gq2XVnly1CL1BRsxH2J4AVVJ+76XdvUN0sfegUbk7htrZ17lypgIp3XA3BXgXRDLewb/vgzf7R3wg82t8X1+cAPNgVol8BjEqVkNMgqrlNxYN7fFNUvXlB0YI+9OQr+Nqby0EPvFOvlD+NycGyvydRUrgCla5d+vGW/2GIDmvOZcBAYdcXw3kdwjka8lkOwdO5IG/mmbkSlofUEeAW2JhxKve1swEqDmeXgWenwNXnrtUpL9783lr7X/929rCN6ZsKUG1Zdb1JhCa10/I/xmznu8fRKTnW9anxx7Erclo3AejkevvzSjgvrUEfG8aWCgp4Hs3rOX139sLfHobYShsBz0AYnVOMg3QY1Hjdx47kILtPpIklLkwuCCdKwS+K/jlwwQxkXN6wmIoiZD0NrIvunzzPOMH7swSCISZNf1OBulwqekE3loFShaa0V3CR5iMgfK9Ie/KRGbUmBl9r4HbF7j03FlYBUvEIN0U4NoCvyfzmN+IPfIo+uN/bD08tp+yAe9YFPj4GJAKMcoMPH0WOLLYEvnIFu633rH/xzsI+zMEryE9vgS9HdTsMC/AKACth6wWJQgcQURyTpMEuaDOTTWky5KOSwogF7gNsc6aBlMHP9jGrKlATwoyoLdJcjQG3JImXCwAy2WA3k4L9PPzJZUCxr1AxEsYDgOemIcWd2bSVj510Cge9KM2M8WVmYqmua4GcG3l+/1Pxih459d5f+ZL/JmRgUDYNO7uB+4aBDwexvQy8NczwFIFMI0W+E0F/rAXuLef8LFxQsSrcUPS47eNybnODxn6d4h8tNlIwP31XxALoF5tk8RCLrqDIDjBM47iBbv8N8u8Se7ndn1gX4aQDBDOrALMG8Sm1pnU3MwqUGs1dSX9hJ4o0eK2RLjEyduM+X2jwMoxLp0oXhPpdJcANLa8g38zDN/kn/HHhn+T785EkwHQR4aBkTijUlFdZC/XjTtFPgImIircn0wARkeeD+oAvIvyLz291AEkAUigkGOuz1IYlNdJEF6BuaNb79Fb9b8FmN1wK8hRCoRqXnIEOeREnWJKNgjcmiEsrgO5khYzjdb9iNT8bBFI+ICYl9AfAhWHwp6VdHqHMbv3NkLkVV4/vKTUBND1QgLmu1Xs84w8v58ifd+2Hpn4FUyG/cNR4P4hIOpl5NeBpy8AFwoAqTxfgZ+4ebx/kPDRUULQtIHcJc+XtX77uSQHCfbOMctIQOxrn3dOL6TRlbOrJBqyrcnNzuVO+0DMb7JtkTtB714Hlesq8tuTIsQD1PT4Fm8QKoFJbavWgPNF5SjiPkJvEDB7/HRxMNVHMyN3Um3kDBefOQ/UuJsC/BJf3fX0f+du9Kf/hH9j5HZk/d59aeD9WeXdT6+qRo9yqz/cSwr4XgMYCKnS3vZEu7eWnl56fPv3+yBLexoINvBIonARCtvuL+9FjmU3aRIGLvvcrtEDAUKW7CC9utivZ0nk/g5hv9AGRFnRMRVhUjt6g4oIZpu/cqS1AbsGMV8E1mpKIEz6CImUh+Z3ZFKYTr/HqO5fsYrPToPXLRd9tEsAV13pT33RYya//GnuT3yVf2tsnz/l9dyRVe25BjGev6R+hEIIfa0XRX51nBD3OXt9glyDfU3m92IeojrQAXwX3UCE7xL4eizvDTh5aAcjbc6MIJEnm54c0hqn6AXcMSYCkWNqIBZcSaWjc4dsyZTfAG7JEIgJs4UNYqfWNWpcqADzJUUCES8hGyXKbUvHy6vJm4yVW8Drh16Htfr/65sCXQLwpL/uM6KfepT39/4Of2Jotz9kmPcMAYMhRhXAD8+jmeMR2UJ+gxHxAB8ZJbyvj+rjdoAbAvy6FEcutX4BepESsFiXlQS55txIwwLMBEk22ly9vLxe3MM95dA7BKlJ4JNclxzj5OkF9MXItWGJ2lWVkSgwHCW8oTL79pQAqjt0rqi+SBTyEHoiRMsTyVgpH91tLN8WQeXkCa5eqL6zJNAlAPJk/mOAIvf/S97f8yV+cGA8ESbjnkEg7uOmuv/UeaBSs+f7yusPBIGPTxDGI9KzG6RBIz26AL+MCqQOIKsDJNchicD+TPkxEHkfcf93tAogowSpg0hxwLGxicklReCNMQnSYJn/y3kCeAvvSMa8wK6kSgkKNVvPgKGh3CABrwlEvEoXWKtXCIpr0e2U25flytSrqM6WuxHAOwX+vv8ZoeAdX+H9mX/ODw0MJPygDw4AQQ9jpgAcXgDAOt83Wyr/zhia5b2Erz1XN8gh1ycWYHTp+W+fI5bVAOnppRhoJx+H3F8Cf7Ma2lZsKz1CLqTUto0cBU04EKNsApKaALm848yb/Lgig+A3gX1pwkpJ/eoxSD9XpQSqSlCoAgk/NcuFpYlYoBBKThgze/pRPfUKV86WuxHAVQf/k1EK7GnU+B+tgz+dDQF3ZQGfqb5BfyynAGHaQn4vAbdlgPtHSIb8Lrm+IUN+5/ZfOzmI6xw0AVk1kIQgCUKq+9eSySqAnBP5uUgDJDEKYZAcAa5XZNQAsSZJiFsXTMYJfkN1EEoSUJ8tW6lbzKsci2cg5FsKJydoevcoqqdf4sqZ0rstAvBc2+Df9XXel/ksP9QfGYyot7kMYryyCFwsKq9vNowU+E2oEt/ejACwBLa9FNeGSkkMMtQXtXnX1EC2+15ufWvf7KOr/z3wrW+zA551fZ3tG4mheY/0bxGQfY8+J3WuhvYNpG4lns/qjmKt9WziFu2KdEN/6vjWHiAWIPxgmlHYuJ8BVC3lZNYqwNQyYzJK6AkA/L6kfwa33W989ysEfOVrVuHQOYd4SguG3QjABfzZ/xam4M0N8H++Dv7wQBi4tQX+Y3ng4rrK9z0bgh8xwh7gE5OEbXENeLvIZzjk94a9jOfQ8WcAgJMuoK8XgHYRATXRXPGLPOQ6s3VicE8NeNO6gdQJpPhJMmrQ5zJKkFUDmRaQjAZYmZRWO8VBApI+YDRGONUUB7UuYLWixJoF5CvUFAcjHsDoDxgrkdQkTe8aQvXUy1yZWe/gSe6mAJsFf89/DlLw4Jd4f+Zf1MEf6g8Dt6SBGivwL5YAaivzKfD/2iShL9gCuQS/AL4ey9wfek2AXqxrwLrslZqCLG275eMEEsj8ZRpvjhwEGZLM/UVp0OGcyHGPfV1usrO3S2sxAWEPYTQGzBdU7o8NElC3USRQBgIe2iABWo000oEdfai+XieBs53pAHcJwLXU95ifwh9sqP3/ug7+WF9I/cKuxYyXc7pxw7Sp/QlfQ+xDMxwz3D0/QNrrk5OgB3YQAyF1ARLE4TAvGoZcgCJc8TXXiM6uKqLM5aWHJ0A0UDkzAAkPLveyY3egbPph8QDtskMeYHscOLuqSEAROOn0hoHlCiHoAcItElirRsfowo4Ml557EbVcdXMfGe0SAJnpP/AakQc/Xwf/79YFv0w2BNyUUuA/mlOdfQr8ursvGwR+fZIQ83V4WQ04PXb2+s4NQHT5dmCpgotzESU4YEQW4kFXG+Ty+qvtnjR1CuQ7q/Sybs+yKgAp4MnuP7tnZ5AjHzFICoksf/CEofSlbQlgxkYC6CCBlQrg91CTMMyxsFlYDI4aS7tMLv74OKzV6uWDpC4BkBF6n2EmvvBR7k98jT89MtgbAvYkAasV9lccwN/o7AuYbPP62gwwJLhdwS+A7dIZ6BDqO3zqi1w96ZZzefplBv68aTHBeTt1ApjkPOuhWCaXPxBZPdBE4EA6QAcJGIoEztrbh23pgMXAaosEAh7A2BnzFhej243c9oq1/sxJ8LrDR0a7BEDN39xPf+N9GMg8Vm/v3REJEu1KKVgcXwKqtZbg1wZ+VeP3C/Ar4OuxALE+l/MC/Ebn578EyCWRwL7fSSAT4HDx1MIbXiNG2tw+GsouaQKL9ECkBhLv+qjFRBYYVmv2gES2B8uUhUhGAnGohqGqFAYZqkLgMwkBE8CueKB80jdBxcw5Xj90VtUR9OM7jG4UApCeP/mHYxTJPs4Pj90SSXiMPWnAZzCmllu/u2fYBD/iZifWQw3wG6yBKLy0RpLhAPDNvg8g22Kd7wO3UJ+2rN7Ldbo2dABmh/mtpAnyAj1FMjVQpxL8JIU+Z11Am0YfEdgxMtOoNQxg0kYCECSg5n2mai6q7k5Hqm+ldqPkf53Xfz4PWJaTJnBDEoCZ+Q9pim77c+vh8fd6Mj7P3rT6PNf0mmJTw7ALfgr8D47JsN8QXX7uXl9dJ1V+Q4p8IPeWYZADBIg2CXjabBRAV9WB8z/I+/Nm0n3HFEAzt1hz/zOUaYGYEE1FpEAtuUDPC+GS2knAJGCiRQLFmn6ApbdivUECHoLPR7AG43Hrtd7dqFw6zKXjyzIN0McbiQDIk/lmmEJ3fJMfGHrI3Bb27kigCeyZNWBlA/y0EfpzU2n98AgQ9QIgm+IvXuy5vA5g2PNzage04VgqVM+BvB8I7JKXyxEILnMCaboESNdGBQAsvLleurLvDco1klzBbWkBbY4wZLogowDHKEH3B9jTgfEEcE6RgLqO9H0sVtGraRI8MQ8q/Yk0n+gfQfnVF7h6YV2kADdYBECe9O97KfLQF/iO3n/Gd6WDozEg5lOvXy6pD3bq0N9k9aXeUSAT0CDWOTkL4IvaPxiGzVMZtmvRAXwJcPkcdS4dGVyMRE7ablIMo2u3FZiUsXhF0AlEW2wsYmdCkNgmuUZOZCpzfDUW0UrHUc8ztUggDkzlgJomCUEC3gYJJL0o++MDNLs9xcWnXmxVBljYdUoAUvRLfPEBHk99lT8xmO4LAekAsFRhLKwDHjv4DW6OHxojpP3tSrvRMLvnlqG9MnIuBcrIwH0fgV0+uEmiuiwHLOdADko3vWPunmT4vnVjMRRksPUIQF7OcMr5nUsjRE5phzzXz5Xz2vtLYXAwCpxe1iSgOVvNWRZgEMEzFDQq+eAQ5YYLVvGpk+CK+B3C654A6qKfaaa+tgvhzOP8yPhkIkTIhoD/x92Xx9h1nff9vnPufe/Nm5VDcoYcLkNJ3LTRkkxqM2VZcmzLjddatuGmdtDAqREXgY06DtqiSZC0/atAW6AoCrT/1EDzR9ugDZwYaR2nsCPXS6NYthzbkheJ1EpZJMVttvfePV+H55w3H877cHQ5no2qgE/nvnvPuW8wnN+3Lx3HeHkOKK3U84eqvtDpZ8+ogNRoyQ9kw38Mk8SN81oDEmagTQOt7rPCAeeGYGoMa+AT5TWKfHE/6DqLBFDe6fcLpRbz6+0nvRJI7SPSUl6WnKOQMv+WBJaGot403dkGnomNaJgpOdPj8F5LAGZHG9Wzw4dpkX7Mi4/3nYIuownw/2/FQMaOfmoMxdS/db9y4JbWsPG/uC4H8BdG5vIF8IcU4Ju21YkxlrBOf2XIfcGOAm6m/18qx+RM8n9wKuuJGSzn4RhSzKIkE4E4dU7JZzlDRMrlTkT14KG1RQmYf0EFgDKIVj3+eJXfrYHPAwVDiKuLH+JntYoHkVQBEoGFCfgryiQ7E0gSgbBrKAiqx84AbBhwhJ4RcPVcOGOHDIoP3Lij+k+/8lu88Phn3fxjpzKjyd1mtSAvNtHub6J1x+f5gem3ml1Nmm5L/zUiKe6xkQ6OhVnv2ncjkjivanPO8hNJIX8o+qzsicDU4Ae4vwAB/HHlFEjMAnzxYK1UwBEZvzIxaDC2xaxAz+wPvT6geaOy/ertdq6LNpCIYmGpqxhCyqzuCcgpXLKAFJlgOzNn7ISUExMRmBM+od5G8ILK16n84DVhAp3oK2ACeswwIJhdTVTvOniT+ePf/S3u/r3f5e4LogWkjMDI5zc2A6Crgzpp+L0P84HxT/MDO+yOoSDpzy8xKhdLeqW4x093efNUTmUW8HMipTXIQVryix2vIZGaCakGwZLOAh6cWskuPGfOirH0/STMh0QakTEg2Re/TZgIyeeMerx6M0H/ycvF6t4CVaZbPyqM1IM6ZsCiVkF/N0s4jwW88nMpjSABM4sKqZiU8AQCQTQNeR1wfDowgZfmA0MvDKEX7Wx2XhMI5980Dj5980nz7d/7UHX2c38Id0mPJAeqhBO9MRlAxNPwR/eiPfbP+UN7x8caocjicpexVAXQU2QAhhgtCzywh1BaDaIISt3xFarKTkt+rR3IvqyZINJCWIBIfUTQc8jvCPvYhXvyGh0xIPIUHhCMMQIWIqlPj1tYwZOyvsF8Ys0qJTop0Vt/hldrIuSf61dpxsH6RSCS3x0z61FjrGsC+mreylEW8cKyOVwnwNeK+oN7gC+dCoNo2EmURDSBuPEduy2duvejpvPh77mLX3gC3KsAKEbwRmcAKLb/sxY1bvo99549xxpt48N9XceY60LsfhK7/56dhOGCddgoGbahQCzSGRDprWL6WjvQY7s5OQ9WEkpA3l+d89fjDbtMJUYL8a2emV/CxcUOuo4l/EcG1GcExqBiF67BfcYQGQGl9qwYvaBM7H2tjkJei81AStrngJ5FONeOHlcvUkAkYjBLuJUFSmrwKrNwBkTfjBNhAcTnqfUS7hMYjtN/n9JcFWDAn50GHDGYCGwExQwGOwJaBvy+G6fNFz7293nhL3+Hl37SUwxgE/wBxcar/u/+EB+e+DAdHjGjjcDaLncAa/o5/mICHBkHZkZ1IIkSGci6vTTxSkzaJIwiV2yeKS4h1vYiWLRC5gT4YIcCjEPjLewfbaJdGIW4I5Ntv56d7+D7r170ax/kZAjkzAojIGa57jOBuE/UAfE+ZjSB9bP9aQ0JPZQBrbKQ6jQA/R6tDbA6QwJU+VWxPk/wIE3MgZxjkLVTV5iI3POtxO/aDjx+FmATAO9ECwBHxuBm28B9t91j/vIfPVq9+tkvwF3uAVCawEaaAsVGqv5m5ON70B75LL9nZni0DDP55rqSfGMjFcQ+zv+mnfk0EkYqwUnpvFmQyzlkWl2T/g5G6nJ2zIBzK2o+uwq72yVO7BxBaagWNDvaDTw0uxOvzi3iyVcu4NX5pRWwGzKBGRjrPwciEMVrpoQhqKi72DIJuAi08Y0+9L5rLgNmvvb5pczZLYndH/cIUKNzlXWqhoCYU72RCGBVK0yv7zkhkuxoz/iDg/u5OYApUM8AVsR6UCQf2Anz1N3v56UP/V938T9/b7NNAbtxXv9/2qKh+/+F+8D+d5a7m7bdALoVo+K+3S/JPq0CeOseQtNASnbNYHYeQ1KABcwmafqZTQdO94Lls5AWXuLoE+Aze/DvH27g3ulRWFodyIbLAjduG8G2VomfX55Hp9cTUwISTQBn8w109xuQOAnzmXIZygf3uWYjX2OmIEFLdM6fqfdJaOahE3V0WTA4Z7KQPi9Zf2LvM+v3Myg+E1HTp+lh4JlLQMXp98tKYEvArpER+tH4Dl587K9QXVjKMYCNILtRVX5m4jNv5yM7foce2DnSz9/vOloBfxnTfAu6qi4RptoMXa8vJABOawBACvyZVmCeNPjhSTzHicRhzQCcw77hBu6eGllTEs5Ys4GjOyfQMIRXL8+hV3kmkDocmZXo0+WrAnrFHNS+PFjzlN9Iv2CvAK7LQKTc+1hlCmolor49uOzR1wJieb8whjTvXzslUwZgCNhWei1Anqezi8K9sRLotHfTmdHzvPC1n4QieDjNBK5/BkCxym8Hjez99/zo/kOtYYvCesdfbOohVBhgbxuhiy9BCKl0Bg0whxTs+qzaKwxDnocV2c40feAjAD+Cf8gAJ3ePoVinqrwdwy0c2jEBC+Dc3AKqquoDX0UTdK4Chb26lViu9DhTUFTnuKvnHHkNIP89vArGobr8cA7I+h4PNgel5KaczTMJ2RsPsA5PCvipLzcIQ2WA8/kl6MIiFqaAPcPGfL+1D0s/+Svunr4MuBpT4PpkAMaO/53CDL/3M3z/7g+bo6Nl0yLYzwiANzZV/d8yA1gjoBXAJveU6i/EOmdf1QYkkj++SwtH3TUiSuPo6Xeuwl07hrG9Va4vFzaE6dE2DmwbxWK3i/Nzi6k9mwQhJdeAVIKBAFzXF+iRPJTHM3g1nYE5OVwbmeCs6ZFhGqxSi5UGobZmzA41apz1dCEWkCbfw8qrFMEu94RYtIWJVigf7saaYZ2UROCCgJH2KD2zvc3zX/5r8EJ3M0wBu97Sv9j5r49gcurf8KN7Jxs2gM0xYC1gxOvvmcDxHYTxlga6GZD8Bsl1An6jwZ5KfvWMc7nrSRhRcnokvj9kCPdMj2Kj/mtYi/0To7hpcgxn5xZwZWlJ/AFgcFxFFdahKVbqLoF1rHP1YoQoYQxZxgHUlQfXMwLO8JaBw7xax6P+LOBNX63veSLlO+CkZoAE/CRnDAFjBfD8vDAYpzsSgadahBebe+nSwtO88PjLALskVVjW65MBWO/4u/tfukdn7zPbSrIeuRzVfWEApWFMt4Cj2wXsxgi4E8qq/px7LowE8tyITyDiIysNBXBgIILfOYeZdol9I03Zt4GMYHkQLaaHWzh7eR4Lnc6KCSIMiSFuQwazMALODstUxTJqqi7WmF4sYK2T0PUJQYw6QJM6x6gNPYqiFwm65l9WHtQKSM5qv4w8XzknpkDVA17rRHNhINnQ9c9Nt0t6cmgnL3z1m3AXF4UBCK2nGVCsq+Nv6B0neXbsEexvm75QMoZgiYG+/U+MpgVun0wRp9U3zreSDO9TzynfclM7jVhU5sSeZFnZ9cEW1u3NzR2kND06jPfecgN+dvYCvnfmHOa6HRhXLJMDWwvDDmQM2BQwNjAGYyxgVhQCUFJlRFJzoIDm7+eDsFTPEHiVagVT9j36mnPnCQyu9y2Q5AqEVUwmjoglFvVcTTYayBCE+lsluMQk0JGKQ5Pw3a5cj+GIgmYMgA3gYj4BTTeBO4/ear7xGw9V53//i9EU6EWq1js3wK6b42/8s6PUuv0/uuXGnmbIxqYe3Lf7Jdc/FvpMj0Tpb/QkHyLOOgWROgeVw1D5D6RHgB4P51+iM4RFqvbJgasKt0y2MVxufg+VyXYLN09NAq7C2bl59Fz8maK3KSycSH8aHK2l/B5U2zgjHybQH9Uog9WGC9UB7cRDdo+y4183RKguU+meglhHCFKnoNZIUi0BqSnQIuCVBbnnVmAsmgEOjFjz5PAszz/+DfRevKK1ALDQ1psAxjRvNTTxmQ/gjqlfw7GJpu2n9hpERiBNPUdK4M4pfy8cJiFV36/DeLrBh/gC8j4AYj2KOgG/PGewgKaf/OOCCXDj+JBnAFtVh79rdBhHdk6gW/V8DkFEd2QGnIYtweCEsyWMQOfGaoClVYjaU6fQXhMFqE8T1jZ/VsUH5ZqQ5CUwg/R9kvOc7wOggc8pyAHtD4BmIBhpAucXpZWYUjw55gZUxbB5cXjBzX/lh0DPS3/lD9hiH4BI/8k/mKDmof/Aj+6bNS0rob6+11+q/XzMv11GqW5YO+tMYq9HSvalo77Frtfef5MMB1HSQDsAORlW6dj1s/483Tg2hJHG+psBVLtByBqDveMjODg5hgUfMZiPuOdUMRTfgHaeKaRDRQvy00o1D8iHCpS01UBeVSnw6xc4sXqu3qUNS5bCIDmjpwexdhCCtT9A3gPSRf7x2WgBPD+XOgQhqA7MZdeQoe+V+7DwvW+GsCBqwoJb5APw0n/o+N/iB6ZuovEySnMWBkCAJSnz3dZgrY6KKAYjySDLVGBzelZ19tH5/1L+TbWxYw7/8+Q46l3MWwD8/KORZgMPHJjBock5PPHyWbwytwhrLYwrQnrx1WtjQNYCbEDOxFRjB3BMMyaSGnqxGZR3mphznY31cE2FrGvN++eMip/3GTDnU4bzr5ROHvLONGWYlb4TiJHvHUAqaX3Ap0IyhXisBewbBp67AjgDuFj9bxlwFHwCVdOA75mZNBc/8S63+Ncvw80tAegA6PsEnJB8/SYygCiwxz49hvbYP+YT24ZNotJLGaSNKvrN2wgolHWVgM/UMrQkTVYLPZP6ZZl1jzhdXCfHSa4DMa8QwBsPfFqlWTA2jHcv05nLc/j6qZcw11ny4GdXwBnjHYbOMwPrgUwc6wuIEyYAQ9IoJy2t0+O5gVqwihRVDzNnBr5HHHD5M6Sfy2X6nFmn4WrM6Bp/jpTe9BdyHZ8x8vUCKYXCtzMLiUMw4oZgKNzjkzuIvnvvL5vLd37ZzX9zAag6kQmISSBo4M02AWhZ+lsz8ekP8v17fpVuGi4sRcefTWx/T3vawO52uCeqvFwjuRZzgCDPZL+YCCZXDyCgr+2xT7p//UDYrfJOwIPj7TWZAOSp7mEd5TWCW6a3Y7Qs8OLFK+hJRmFYEddBAU0KfJne5ZTnVJQL/+na6/p0YMqHDqmmnoCgioGyeQAi0fV5kOwZNAXEPJBrqHMS6vOrdggSAa6KYUGQfA+n5gKGmi36aTnv5v/XD5QvQGhzw4Ai/X9jFGbknyxL/2bw4Oel/+woicQG51xLOvxHqjefpppwYGZalNj8QLIiae7ZB9H6S/2N8CbetGMC+7aN4kevnMff/Pw19FwF47xGEDUDhrHOmwPMBsQWFJkyyAhejaBCTc7JaARZyZ0U0nA2FMhadKcglke6NJfrQ4xcV2nI2rwhVTzIinHImWhGyGHIy3Xn530jMSzIDGcIzokWYCkggY+MgsZP/DJdvuvLPP+NBQDNAVOg2gofAJnmbYaG7n6Ej00cpZaJwOeQ0EMpHRgJ03zkF1g/OwakwKpr9OvDSsj1iFRanWxXff04XF3n4BcclNbi2MxOHJmaxGOnXsYTz7+KoixhGhZkC5jCen8BLZOxRfANWIN2YaN5YFAa8u8hiqXQsUGJ7sgjJcmcZwQiXZUhrwHOnG8fpH0CdYDXB5nz0QfmCHKS0Jzu+p62IFP5mcIBkjODIqcsgf3DwE8vARaMKjYPscxh3NiKL2DPhL34iXf0Fr7zMnixA2BpwBRw6he2QQxAFMSRjwzBDP/2VTtFpD9gB6R/wwAz7fzMFQGddvxBrnUSkCfZEz9rEy0H/v4NzZLACfCVD2BLgc85FVcTCmvx0E17ccfMDvzpU6fw9CvnYIoWbFHAXKVmAVuWkQmY4CcQ52HsR0BoWAN7dfWSyaBlQky7EWO59U0/dFNQVo5CBTJtq2ttQTMdzuQJEIM5219AN/rQIIdfnPQHUD+20sfrHZR7h0O1oKsCZhygfQEnJkHfvucRujD7JV56Oq8FSB9B3lAN4Kr0N+233cfHth3DRAnKS3/sCg1A66UoMbRYZxm5lNPtKWEWEuvOhL2EMaRfR3IaLM8lL2DV8M/bqLRKoK/V/bhtqIWP33kUz56/iK88/RxOX7gEUzRhuwVc2YNtFp4JcFHAVDZmGfa7E1ksVc5rCAtEIHISZoHzDL4RmINfW+IPyNrqnD7TTCDjsFPg1WaALCpikDcrZH96j9IsySRErAzH5D2pFsBKy6WV3oUFhYjAzy4FBlAREi2ACOCWAS9zcXPuV++vOn/wJ+DFRc8AhAkYFQ3YUAbQfrABu+03+fZxQ9r2hxHbH7vblHfriMqunxErFV69h7RmwP4ybeYAaG1A1Fa5l0gll5gA6+r6z4cfN7YD5A2T4/j1+27H4y/+HP97mRFcWpqDdUNwVQVbVDDNCtYW3mcADn4CYxkgk3RgIb+Gex0XqtzmwCvjthoENA2hFZlDoSR3TZ9AJS21psbqXE15MAkTyE82Tlftc8hIfJIHosYKo8gioBeuZ9rA81cAV7GX/BWnQtQBwIltMN96+P3u0r/7GndfnI9mQEOFBVcZFbCrz/k/aczYp27hmV2/j7dNNY1Js/6kxXeQ/lNDEA2hhKTqmghs0o07YMIeMmrEdyCTeP0j6dJeApCfHE0grVEI6FnKgPulwIe3DWO0Ua4B/Arwmz4bigDsGRvGyRtm0CgKPHfuArrdnkccVwx24SfiumA6p2aYMGlCBaDDwLwDLvd4eWV0OYCl1FOOhClks/4y2XXqTBbI2tbPmiqc7FMNP5TmMejlp6QcOJvsg2Dvs6MVRnJRCoVUWTE3LfBzHqNzF57mxSdeCqVFUBmCG60BEJX7SxTTH8eJyVHJuycBcUwDNr7HQaIhBT5VsDj1VAxfHIUgSUKBURxZaQ2cxPkV2CRkS6oRhHq3vFN+VtT8dil/U4N+gwGOayOfSHRizxQeO/0yvvqT0zBVC9ZV4KoISSnWeX8BWxcLj4KT0LCJKqwBG0rmHEhRkWTWdR3QcX3TgX1ZddvAr2ZQ0tbE/DlecEZT4NqJQ6kmoVV/ealGk0yJYUpuZb3OrGNfWh4ghMhPXwEMM4wRLcDGa3/4xHaiH7zznXTxD5/g6txC1ADKiOPepvgAqPWOSQw1H+Vj4xgM/RGkEGe8ATSMaERZVOZnwaVVXvFdRjr4KtVfMEwgTpN9WNY6v5OQUstXA/7NAT2t8XyrLPCOg/s8I/jznz2P777wCmzZCiaALYBmBS6KGEZ0IGvBbEMaN0IFHYwkFAXShTYE6V606EIufGQGywQMWZLipch4iSlfL6ABXLdXPrM2J2TV6n4yHkqAX9cwVDEDrWtE52T0BUwPhaEihhNzWpyBs23QjpveRBdP7OErf34ZqPpMYAmAFV/AxmgAZEbeZal52yN8+7Z9BIhqT2kUwES7hgTIymHHAwCBET6ZcHQjKptRE3ZSyc6cAo90AlcSp82YAEmASzXqrAcgmK5X0OdpYqiJD992ECdnd/uIwfOvzcGUJbjq+dX7B7iEcQ5kHRAjBkTkpRbIiH+ATGTMlDJlIqlbiNcLjr2pgC5j2BJaQTMIABko4ZUlEw6kTIgva8VkMgVJGISWEuIQFKRxvb1HnNQLQJ/AnnbIDjQIvgAnNS+eKgb47ukh8/L73uLmv34a7so8gEUAZRIREEbA68sAmnc0Qa2P8rFxEtBrbtWywEgpmFdVYcQwtTYyR4BnOuPqtFGR/mqvHkunZ0MKl+BM8UkNEKVEi6930Odp9+gwfv3ErT5i8Kc/eBavLCzA9rqwnQKu0YBt+IhBSC+2Ia+A+2HDfo2BEQcBEQ2kWyHcY1Z9CuccY64KDuS2IbQtUOTAzfnQI2eHiQqJKZFhGCo3IPX2Z4MXuSgBqzCh2tO0wHgJvMZA5foFc4BhGSGH28dBX37zW6mY+RJ3fnxZzADYSCb/I2oyq8pibb31IO8avhfTTQAi/QdpaigBe1Jyq4iV6yVVIXXSj1yTrsSSRp6qXCqSyHW5hqbk/Ymap0HPgTu7DZy+jU0jiRj85gN34AO33oARArpLi6iWltBbWFymJVTdq9SBu0pVD663TFUF5yq/cuVW5igQOK2fY1bzDZjjsyjpLlWMM0uMsx32JgPXlANzvo5fUxIaTN8tJH9LAlUGacGjuRDVtSXLY3JHCyDEKJpJu1uZGBLE0ZndZvjBQ6CyBaCpmEDE63qaAGRH3luQnfold2xijNJkhUT6GwCTzfyLmFjF7NUeZhDJHqP3SeWgpny2n5hs6YRoPcpb56dDf5+T/euOUtrMl3H+0fE9U7htahJfP/0SvnX6Fd+LwBTOhwpto4KzFYxbJhtSjWW4CcPAAIl5IOxcjVenZGJvNK2jv8A5lASMeK1A9erLS/KsH6d+D8sPlQlXyqg3x0lYUAufsDebgciSvYbtrVglWAXQV32sGYKp4vtvnzD05MP3g/7Ld8Hd+QFnYHedTYDImJv3tmHaH/MqCNK+fBDnnwe/oWy2X+pPUaV8mRoUQW/K25TNz6oNtAA4rw8RsU4sAcdwIGlNQl5y/YGf1vEMi6Pwlw7ux8kDe/CVnz2Hb596yScSuV4RogTNBrhwYGdXsgrJxIQiCo4uChEDVZ1FIlPFj8OcMAFiQpcZr1XsNYNRS2gbYQTZyEANAljv1UJA1mTqsANS5CcdhsVm4fwvN00yEAR4JvDSfB/44YEMuCHw4RHQ6JE76fzMBC/NXQGqckAD6KkctzWbAK07j/LhsSNomYFGm4AxEgUYayQqum7DQEolUk6WNAswjwymnJovF6mJIGfk3dl3JFdz3Z7PiNPg32J1nwYI60X6va3C4j1HbsDnHjyOQ9tHgkmwTNXC4jJ5kyBQrwvnqefnHDjumwViGoCdFFolpgEAIL1PwigqBi70GK90HeYrFtAO/jHIperTx3GF/rvINgblvD9JiDjPWMHXODI9ClEAVnxlup390V3bzcgH3wQyDQCBRAuwkIAZ1uIDIFH/p9/Oh0eHxftPUdLHbyNGg4DRBvL212DDT1agzeZOs4r7S6lrMq1bgZ3Cmkpv2Q9ZdUyZsOScn/D72lwXjnnjwH+9OwdIaKLVxN+94yh+7cTN2DvWQtczgkX05paps4iqE/0DvQ44MgJX9RImwM4JyOO/o8w7YJWeLZwAwggqxs87DvOOdTkuZ5gApYAXBqJ9QwzWESu5Sn9OzTV05AucySlJTd4hG0boE9JSeSIB7DIWiZr33AdqDUU/QOkpAb9oAWvRAKL63/oIDo/Gt4oDECQ/6EQTAGupD87E12lA3pK2t9JRDLKy0iLyjiAhLRmQcH9hJksOOLdUeaqiY4e21MlXJ+k3nxkc2DaGTx6/FR+7/Qa0uUJ3cQHdK5HmFtBbXAyMwTOEbtAMqm50Glae4KrABFJIJODqM3pCygQoMoKLPcbZrkPH6Ww/QZsSRgJsEozIPkX1bcsoAXyaDFSTdMycHMFkK0p9iIZtxewOZsDI7CFqHt4O2IwGUC8mzLWr/6OzPkgLcfZRXv1P1SzKuGly3V2Ir3nkE4PyajyTMOOsqieEfkpmz+F8p0InCVWtv+pP68Iltp4R3Dy9A59/6Djed8usDxl60PuIQaCq00GvuwTnmUDPmwehz2LUBnohegBOsi9EpSPRBgQpaXp3l4HzXYfXukDFStoroDFH0tqq7GPICqkIBWkNRUgXLGlfWM70kIdjJSRNPmBITci62iHWDN17I8gE6a8ZgFmzCUCNGw3Z6Yd4dmRspWcEEWhA/W8aoGVF+9Fqe6qGa5agGYFWA1nbaAw4zqj2GVMkx1zmKsbZpQqLFaeYoy0GP65zokDH90zj8297Mx64YRpF1fVMwEt/zwSWr7sdzwyqXi+GEIM2wFUFBLNARrB7ctGBKIADicougJNnS47xaodxpcdwnAntyhpoZR+p56oluGiv+QEmkkJeOzchtUmF9ZUGaNuI4qQWS0Q7Hxk31Hrb/aBGC4BiAmvTAOLBZfu/BTQewaERNXUXkv4bE384kMT+hQvnEDCo/skZpSEkCXkcT+ZU+0HbP5/5ha4L0mOuN1D7rZjAJoKfIuENRNRPLZ7FP3jLMdw2NeaZgM8hmF9Cb3557XXQ63TELxCZgPPaQHAWIvoH+sRJdF71cUgNXRJmfq7r0HU1nn0h+UqkpLXOa59JJiamaA8sD0VI6tA1xpsR9Kxa34U9+9ug4sDNZHeMAlb5ASKR0OrDgITGyb28rXUTJkqgD37d/BOtIvkWzS0BUMH9zwLIZJ9O+wVYAYGz7Zp0CjfLAxkJJTFb70leqFyCuWykgmjzwI83KJH0IPjw7YeWmcEi/uhvforTF+Zho7Q3RQHXLGFjdyLDXvLHPAIDdhzrCyDln4IMKeX2xEmhh2wjOGa81nNoGfJpxsQaxHJAlwzn8wNECyBBcCbjcKA4iDU+kNFQR4u+mc0gR2k0wADeJD8wOUoXTx7gS//1LLhqeExrM8CtMg9A8EDl3uN8eHSnqvuX6TshSaNgVRCl5rX1ACoAncqrO/4y6VxqAaQGs4SPAWI93ZUozQ/oMHCl5+BkW8JCNN43Gvxbn0/A6/3lDEwMtfDJE7dJavH8ZRjbRNFrwNnQlcgYA1OUYFuArA3EBtzvWmw4ApzCGoCf/jszgzP/kouOvVk3WhAalPiFZFNWO9CVgpwrHJLwf9gXmJJufuJSiLAcBBHFkXSE0sCb1hXHpKCVaADJ2SPbmvTD40eAP3oy4wegSLwaE4D8w+G3FzBD78LscCkcIRBI3jxUCAAFpJwfAKmkPw9mBqpqPijnDKnQ3zU5DqPUv9RzcIlyQfkZmUQguv7BTwO05SkFpFOL33/rQYwYSOhwfnld6MRIQQwfehOhC14xDVwgFtOAOHESphED0QkTjfRSj3GlSgSJDgf6hXSkIBNlktJ11nq8vBichgPTNW5Hogmzfz5ciplNFAksSXj726DWrXeQabci8IU0E6BVaQDUemAYVL6Z97fFoIDOT24X2paSX5ao/ZmJLUKZX65KwxWNSkt5UPq7F36ECsBcz/lVwJ6vMxCNYevAv5UWA61ZO9Cy58TeaU9f+elz+OapV9DpOBhjYaoeuPBVh0ETcBYUsgrDSgSw8UAiMhEJg3o3pUM8B2dCxOrDJccYLQxsTmDw62UFkqofyUezknelPa+5xscQbwwVYvcbJjBSR6CbbsK0p2ZQ3rAN1cWLgMvlA9SbADr9965Znh2e8LZGVPfljZKY0LL1s9gZaYpt5IiyKpMgb7tzoubJiqSja7qh64B5p2YEaunPm+zwo80APa3NAFjrKFpSB0Nq8ewMpBlJ00t5430EVTANXGxCEleYMNQE4KQHAQvwk78PseHT0mTHwIWu836BpqFV1Akk+/KNSklHukBSC6D6nAqpHoPDlkPS3aDmTVK/ggPjTfPq8b3V0pMvgl2Z1wDAq9MA7PhRnmpNCuBjM0NI8U9hwuoA4ajMOgSYywliFStNwWvkiXbuqSEXsmdA5e+GPSm4a5yIKgGNro8aX9qUggBeV0YgQNHNSI7v2blcY/ACvvvCOVhXwfQZQbPy0t9yATIR9IGij8CCAjKkyQeRmJBEYUXSgyAyixAp6Dh4RqDBL52EQdA5A4noThtS6JkImZ6IvdT+B0ifiwK2J42xtB9gdryJJ265EbDfAXq5fIAqowFk7P/WXRY09jBmhxtIxnanalVT9KhEmktMs25Yo4Arvc8CEFVIxEkjkGTWOwkzcBykfuX3ZSGipH/aoJjk+RaOAKs/QptqAND6MAGJGNx2EMdnAiM4de5KaF3eK0DLK7dKkK2SQiP4NuYMZgsQyZzDWH3IIrLD/ZX27kgGnXQd4yIzhg3Bpg69vIquU4B0NCE7qITBK/0QVKKa8qUxhwjbXM/jTQi8IpS9id689Y6Kyi+ClxIfQCTVq7nWBKCh402YxkM+1khyOp3mKwyAKJdoI+W9zCojSvVPYIqXgnrZp2CQl9w9Ufk12LXnX5VOKdRft+CnzYvtgTN318oExFH4yclxHzH4b0/8GBcXroSqwyqC31qYhgwzYb+6EDqMfgHyJHYep1I6Cup0mIljeOdgy5D3uovUF3DmIwMCbk58D6oPoTgXdZ1CmqE48N0twyBQzMAVPwD1hdV0Eyim9pDdPsJu/hLgirRBSL4wyGTDf80Hp3i80fLVf0jtf0Ni/zeMJFAgUzabAFx5QUWH1wVBNdV6mRZPHRfUO50plh9zp1e6LpxyFGnrM4Xy30nryB0pMoLffvsJfPD2gyiqpZWagspXHnbQSyoPQ8QgZhSGqIFzgaTiMNMbTOQ5r+SEDIJTEpGYhQBAmwGprq9TfCPV1atwerdpReBSWn8jqN4/UlDrzmmQUZGAXygKQMXUUZ5ujojkT+1m6VXGKjtK1PeaOnqlDSj1Xw1klUcDjT2i7r8YWlDnJX5ClPcBKIax+XY/Xa9ZQiLG9Z11pON7p3Hb9HY8dvolfPOZM+j0KpDXBuyKj8BURaIJ4CpZBsFAGpEYsPpDIg04kP/7cQy0LCnhokHLuoRJ9QlLz2qnokQHXNrVQupZoqDtuYFx+JBGqjw9VFLjlr3An/0I6KlkoJwfoMjKQho9gumhIZGgOv5fGGXv60p6WdX9xNbJsAauBay8t+MYPXdtGCE9BgrCbSh9xSrCgbQ54H/DMwG9WT8SR+F+PDA7gy8+9SyeeO4MTNHyDMA6B2ccTDNGC6z1a0ioMfGawMTSn1Cl3hJSRZ28BtljRtsSFJ7VGikDeCbZIB0O4hr1fS0YdZiwYUMnZSJASDpgYrptqHH7LQB9NZH++VwAzmoAV8d+w7Tuxv62JACRXksDXZgDwCY5+Jyu2vmXt62UhMk3Y1ysVKZgrfpP9dAC0eZDj7YqXshr8A1sGBMQRvARn1q8H3/yo2fxozNnwa4FsiVM4iMowOxgyIJs5OjWgtDvSAQQGYkYyICPRDw7Jsz3OLQrB6c1KDXDSZQ5HL4rZ/vLyoOMQ3BVmExFeGQCPN2CLWb2gxoleNEDPxMKrI8CUOt4E9R4C0+3wqkMEyiMIJlVL3xW3lCpkEpX8RFkCoByTCCeWaoALfjr1X9sppeeNhH8tNmZP7Q6JrCmOYdNfOKuMOfwy08/j1OvXQwaQRG7FVchh4CtBbnYo5A5dC5mGwDq4UApGjQjQAVgvhdt8KwpoGP4suY7FXO2T4G0ooPshSWGDOAhIMVldARu30V2fIjdpZwJQFknYOoAPDHOLdOAtP8KD4SkS2lNwsRgBxb0wqpHPedGc6cr0oqtaLOtFh9aO5AHpEOGb4QmfyS0Nf3JaN3Lnamma/Gn7rsNHzx2ECNUoTN/Cd2FBXQXF3zVYXcupBlX3VCK7EKbstiRKDoMe5V0JoITCLKwAseMhR6jYq3BMnL9IjPdixXgBReU8y/EF5akpT9RimieahpqHtkOGA/+nAlQ7wS0u3ZiuhWfpQlAgOQDGJHe2hZKNYF0nJLeJzcotf91oC61+ZVLZy3qv3IFyM3N8PzTGsC/ORHA1R/ldd2o6e69056+9swL+IunTmFpicBuyJsDtnBwlQ3aAbvgIPepxSamExswIFONkjFeEg/um5hNE/fmTVUdPtSAB1gEYdggYULBjRaoBUm3zzQjUOqHqTywLcRInWIC124C2O0383jZSoFFAGQKUJHa+YJiClyTVBEFh7UAeDDeSZnQiC4uTBI45OwGdNlQr95gAV5zZ6MsA15PNMumTacHb9yLe/btwlefeRF/8ePTMLYFrioxC6rSOwthLAzHtGKK5kFkBpERaIkcMCpMwANZVPz6xjZyzRyAzgUDXRpI/mEZBgotVI0B4ESQpZPYfCTAkNk7BdgC6BmVB5ASZxkAqLUH43EMLmXCgJT8crIDNZjSGfvoMbhMAZKe01oBDYQKuyzDQKnGaq651iKfWHkf1xAL3FLw0xrM/rUzgbVrAfXndWrxI0dmcc/+afzPp57Dd1444xmBLYow4bkKswt4mahhQ+jQ2gh+AzZGRlJTKv6YJUzY7GcW9tHHOotPdFMRgGLXiwaQesRImdRO3g9Lgl5DggdhAC0yjaMHAbJK+nuqNwGIih0G1LgT0y0rUpDDSgkeFPiV6iI/PBwFR4YAPJM/kDr/BOgi+dcn1Z1Wsb9mM216md7GmyD8htQEJLX4Y3ccxoM3zOCPv/8MTl246CMFVJQw9ipZUGVXogawdkUbADGwohEAIB3iW2KgNBRM4ME5giShPU9Qsw2FMr6uJInIyWdDAwimgUhA0wB2dBwwRsC/uigAUfPOElTM9sukNPDFCcjXRGmEJTURWJgI0iaKLgF+NJscZ7Bc4+BTe+qnCCG9v5nSfwvAX/9OXgO+M9s39jwBM+Mj+PTJY3jm3EX8jyefwZm5OdiiBVcUK3MNnWOYhgOZfsWhBRnulx17gnbUoesCE5DZBlQ/tZjjvbA/rgAnIUI9t8DFzwYci4AC4ElFAlpAeeAITKuBat4Dv04LKHQG4EwBKo/6EOCAEUwQElDLmpRnU6oRMEFn/Amp0GAKQkLl+PVxQOtQf0vptGfabP/b1oO/HoT1qMxv2CLF4cbt4/iHD92Jb51+GV956nlcXFjwNQamKEJmYS8wBCwTFVEzsAWYDAxJnUHSMDSmnBeGklp/Jc0HTWPWZb+ptqDPRYahHFIqEtDyGLdEZckCfqPBnw8DguxYw29qmVT9H8QYA04DGQ4J2FWIUN3PhvyEC1auRiVdi/3v1/yLSNZ1d/7RG2Ni8Npbo18nowzund2Nzz18Fx4+uAeFW0Jvac4PMgnU8bML3FKgqisdifp1Bcyc/GE6ZvRcdk5FWkMgK6DwkdoYDBbgy5MEwZRTacdLpuat2/12TfUmAIpj2zFR2hzYpCSYU0/+YFVU3kcQYhml7NOoSPv0c0bi00Znx13Hqj9tIZB4Dbu3mobKAu+++Qa87eC+5az5Z/F/nn0ZzjZhin5dQRm0AOfApoApXcgodAYwDjCF9COOJee9aJ/rseM0AHDBgHj9ya8OBMfyXPbK6lhp4WIK9PE2XhLMUEOr/6CEsgzAjo7xeGkoyQEIkJSTAl4HFsmvKJcYVEeqinBtjXmvJf6/peCvP1B/7rrnCGLWbWA0QB/KM4K/feyQZwT//bs/ww9fPe+7EhlbgaoCpmCwdWBXghocTAIYEKroJBQHdRVVfxOlvGOTGY3H0skYpO192QthBnItwYkak9dMDmc1gPpEoMYQAMP+RN7MTueqiUbgiEHCIKDVeqiWXXIvEqV+Bfp/7F3NqyVHFf/96t7bfd97GRISjMZBFyoqCsGFgii4duHf4ErcibjXlQhustGFcSfjF6IkCz+iUQgjiDjGSIaoMyY45GU+dWTeZGau73718fZ08YriUF091e/e7rm8gjP9uoru283U75zfOV11TgrIUoDjXk67AcOE6P+WCuGatNo01L08vjvGFz71Ubzxn4MVI9jHpYM7MEVu65LYfQUyAgYCZgNArE0VAxqfqTqEuCAfhHrr8EJH+6VBSTIRH4M6DmCThL72/ifD4PchZaAXAX0QT47p8CAgRYFJP50bVxU3leWOTx6RJD8zHZl0o+wm4Ub/rf8WK7wPvOMxfOkzT+Pzn/gwhstDLA4nNgfBDEsbH1gezl2R02LpF4sVYAmpLYxbhMZEG0n4/SisgA5joOMRPlSyXIG/8UpAFnsYG8MQXuikJnYGBuEuKvZG7f+DTIBO6jUC1UhAeoAVdrCyN4kwbYl87Kkn8KHPfhLf/v15XL07gcgOBhaJxAiYESYnhIChDZEbB47Cz+mla09q8JdNudGFOyrF4NbhBPDGPPeQGosB+GJ2ATLqM0cG43tK5NjSV4Jtr+FWG0rGaXx7JaA0QduFA12sJ3DxgZINfPPFv+D2bAIUO4AAxjrhnBLMCREDSAGKQdWoVgBCrLgAuN7U5uUh1HtjRAKuPnQQHY+OgNHppwAwJQZAgGMClBqw0xO1Zz58Heui2lKLVB4X4Njq+vRn2bDGYLpPnw6urWAOTgl88dMfWSmBc0eUVEjQEAUMeJ8JGNAu4nGBcmf1Kd7LuljS3OGBUuMXi6csGjUpFQBPPRKw+g0UAHdOSz4wjQNpkgYArimnPo+Z0rbfZ5T2EkR6Y/8pvcNFj5/v9GOn8PHVBqOX37pu0UoUgwFgljCFgRRLl5EYxln/GmiwJU7oJBj7IgeZxwD0ZWEXQDB6D96ZE4RqZJjSM/ElNejkJIa1qcKjcrxxAtJR3W1pn3v6ffjTvy6DZg6sxAxtRmJjIHMDmIGfsx46es1NzEUKUNirWWopMCSxrMCZw2Ga9WNtTEA3SZrEXB9YmDDEeEB0nVXBmXJjbvpZtLDn2v2JvR28+9QYi/kMMj+svgYcfQkogGIJ2JqFqrEdG2ZoTjDGUFkD/nhGoCyBsrhjKgrZX0tKJ71kFmwDAnYPOgY6owDamCvwKMR9/oPcP8pKCpcmXEQbTasU5AHnPlt/MhKqqRvQJyZSLSgqXc697jNqdW+suCUuEnvstj1+aoxC1Ryw4F8IAAmkCk+g0kwHVpxAxBmA7lsjgAXdN64JYOwe/N0DdDukAvtyWUkxL8+BQtSqHbUMqNvGJhzbtMG1oP8N0u47+YmcKI3JvZml+gWkAr5jAJBuop6SoAgaBgGLFHzJA+JPnHTfGA/acBMTn2vKAyp9dlH6L/v/veml6xFvJY8EgBmpjBUFTHtwpDKAhark21QaglpqXlbWOaFZD366YyVNy4Kz/6CKT7g+lj7vXrlMpjNcuHyjxZRkFB8icaMqzaxqHPxxBbA44O25dzOVtCMCTAmA+3i9I2mnCwmQepgRxfCQWbw4s2D/FBZ7RCFeeOWCSxtOeAt/YPsVviTdkEuzPo3NtMmnFQDl3j9xe94cblTjLaHMdRinYJ4veh3hET7MgT+JjG07rWe69f/tq38DjXHiUohXYi0DyfX+d8SqYwuTAGOg2wyAxJx8caLGmjy4xOEQn6ES76L/LygA1ah/xlL8njVOe9lMVFUC0lsMdq+MvvvrszicL6oEoqYSY0auCjF9GknQQoHBKjiy8FiyxkHcXYg3WS7TFYAspwCKIPYj9fm1K6D6axUKJEEzSoLjryx8PFFX/61/jwAt6uShUhjP/uol/PXS5RL8nuCICbA6Dv0VJGR1HqhmFTwXHyf+GKxIHBPcnwCLq9cU2pozAE7db6m7RPJ3xcooa3srESynslaGwe/t1GLNFWySg4zH6Jyza/Cf7LmYTKd45rkX8IeLl2CGI5hRBg6z8m9XgdgMQMsA7FGFAiRmydsQRJ1E12/FnbsB+MYVgBSTq9i/5zQR6PkXkhyMpBtPYAjNDY2GMhWwA8lH7JFe4E/UeCtwujSO2w1ott9VwA0rll++fB5f/s4PVpb/Cgaj0UoyDIajUqpNQMO8VAIVG7BMADSgj37N/lVhkPr5L02wwDArF5kvQkNWahhAces6gKIxdQnSFCrfRb185L7JwX4hJDCmah1Etlk6ptCdDWSf11itWfkR61+jfe71Syvgn8GPX/ojZiBG4zGG2UryHINSsgyD0c6RQuDAVRUiCdLP1klhI+YqD4gthyPXKaAV28oAvhzcBSBJDACQQy8GIFJK4IEjlt5JAOWBugGSSvmVKq1l26yxT1zLfgZJArNsJaVna23TlmP8Y/8Kvv7D5/Ct53+DW/+bYZjlK7GAz/JKRmVfqQAqN8AWDamqCNGxAKcDHE4E9JEnmgVr/z/sQkPqmK9TALJ4498hRz2mAATzi9e4PynqfBmneQAR6ofXL6g1X2K8SGJBc1U6OeQiABL4W5cUB7gJ0yxb5P9LDPqCtNY+Fnzz9tt45qc/xzd+9Dxev36zBHgF/nyMQTbGKB9bRZBb8O/CuQLWBciHnv8vNZkwtaEjoOoGNDOWWmGIRkIxXUQ+wEk4BrC8eg9S9xWA0A8Kv0+DXwcsFkH/KN6oEQNF731ge0OiLQYh3j30rdoLk0zYSWCPxxjgO/PiWXzl2e/j1TevlIA/Ar4Tez4uFcEeBtkezCizbsCwsv75EICl/jT+ojKhyvVf4y7rNLlev8aQZ5lF34tvTiCzi7dUnlEFr6ACuM8hbuDG1AKYqlSXVw9A/woQ+dXA6sJQoNHvYav8BLrwJ90ANxJ8kq2y/pKk0DZbam1yOMXPzp5bAf8Mfnf+73AWPy/9fSs7JehXfTuV/5/tVgygBP/IBgGt5QcM3NqAQFyDdBgIBPj0/FfmyJ4GTLjDpd+Kg6mXYNhJNAgoKO6UCuAaDpf6e6S6ixr3tVKIwgRdA9p7ELr53RJCudhTZeV980+G/XxKYFN1BzvdBP1ubPzw3awLOPvaBXz1ez/BL/78CuYwyMa7GO3sIrMy2tmzslvJ7iMYjkspFUEOk1XW3wxXxzwrGYBNC2bAQClqCUX/FzG3WBvGQrz8HgrwHh5Ko13cfRsyW8aKdQUVgCyvLyDza7wxVQ8TyGHuxiTw4oFgH8D6RRASz6nAGHS0lY8nWFT90grRjAEg/Wf6Tw06SkZ08a2r+Nr/ufuyGEvSKr1z4q6Z1YBhwMDYTI+XAYOZESN5ZoTlRfJ4ebAlW34ZyfjFfuDBkuUX25L9YEuWjezRePzqGQuYMQ2DoWEMNO5uqKKhi+7aeq2aru5auvals9asyuVuEf/xjTj/uV/990TkVVKZUFWpPv1H/BFxs6+yv7N8Z4kvfpW++OxztDocVdbepKMufgXyTt9c/z2Vy6/sv8b+WSeSf70OZf22sf9g/m3FeyrBBTQZQmfJnRfg0Jq+IgyGEsJ6MCxIitt3RIrcYLooDPBDQcdnJyTrZ2lUGIxgmUmSUADHCohmQoPjs0zCEv+DpZ5LYHxhB9i4R7puO6ZmwrOsqyOmmrQA80MYXz+Q031lV3/PhWs36Im9z9PJyyuUtVtqxVttarVLQHfMgkdGvxP3+uV5dT+32irtqXRaNN2sCn+E2foBkNJk9nkdA+fiNLgn+bCf7AVXBGTCUBqzKsBLl0hG8x5AWKwAUEUUpLh5nC5sFkTUwltMnRvfyMwb0CmuALQDOo51dZS8EwdmfZAT0G6vMZoZK0lKHJLszsvC/Jf0p/LIKIHd/yU3767RN/cfpBePn6oA3u6bu96ppNU2sHcqcLemwu1+5dpnWQV4WPhOuVrNf8uKfeJq4FZhoErjfmnKhnFTyrt+v5H9B3ZSLJoHcPM2yaRwHkCDEmjXquewcY1XxxMhakHjNKUCFS4iQsLRsrP/EqR7BnRkAjpQAoTrDh624/c9uBlWHuA2wQ016EIFd/AJh91Hp/NKHg2PHyI7qAPA7D975Cjte/X1qnGn0+sRt2Hl1fprSa/tcbunqymIrE1UAT/T/H6mnoACPtP/r00i7OHqi7Pg4kBemz53vqc0k+Np6S9u0nNDwLWRyOSVCwB+MwG4lQIQGb1whu/8+piI+i6dEV2PwPAKAHhIzT5A08hMQKmIKIKbgOaxmzL8GRDlhnpExWAr7gLK4d6hznsXkCmLzf4j4wHI/XoOjpR+9pWj9J0XDpXAr4Dc7imwFeQGfMvfR1e/04abn7X1vNqrLL2Cv1whxBq2uthQ/MskvUW343xRBoCRdSOnPFKRBrJ9ZVNocv4OkcDqQxZ4ABCp0giSX6Hzm++mX1wGKBcFFvHdBJlz8Wvje3xxlvoQoCZsyADadGIPlsUjtvCAAnyOFxDh+cexbgOk/BOZ/QcJ/w9S6gJe3ctvn6P/84P9dHtjUFn17lIJ/BZcfq3aq9x8dfvL611iLeKJ4J+uXbj6Cn6AHsl9JnHAR6YoMCwaLLMn+MiDGhuGJTs2T0FgbUI8x9YcBzcMxMMgMjl/lyTUegC2LvIAguRXhxSGb9OdyV8SxOgq1LDWxvI4Fl3qiUDnLWDPgRAbCUvPwtjnKB6QtZ3+4u5LtTfLbtN8j4ITAJ3tzbrsCH9w8tIV+tYLh+nklXdKIFfuvlbmKdD1WJt41BMwV79VkoDVyj1t6xVGj7+CnisFIBSPweonXBA8WQUFpwU9cMmb3fnmdHmzxVcx/NQpmJUhSX7xEoWhZQCKn9QDIJlcGJPcPc4rw78v9B4SxPsJaUcAPIiPRiJQeYKIOHyO8QDkswnSAA24+KliEMY+JTwAWnuxwJpjtUdla9eUd5HbB2/x8IrsFEUIgu+rU4t/9OyFCsSdbgX8hNhTy28KYMni/di+29Y0XhXra5yvVr8Fq0+sTL+BlxluuXmdCnz3FReDHNYc+3jGA98OHGqRDsRnIwMwuXxVZDQhCgb+QmW7HMDkYj6Vl+naRzUTQD4TIDNXxcSIQAAdlt0pDB//J4oF5KJLzW1rvB1cCF4APOYUgMJJKLFrk4EfERcAIjv3DuLBaDwF/vN08M3I7Hfvtfia2mt1qnSe7qvVVw+gtPbTc+7E5p0yxVcBHr38cPuZBEM8YO2ZkQB3bpk0ufae+MvnrzMIQcLqPWsIiccLFIh5ACcukbYChwaRhSGAieRvns7O/8ZIiJbn2ccgsPBBwPwHg6yL8wF+8goBYYG7z+HBbTBjE6glN6rJ0wJAOz9QAN0++B81ynAwGtH3XzpGz732Gg3zAq5+u5O4/O0qrre9nrbqdowHaGlqLyulPJ4j9zKOIHcsT+L2CyyE46c4ATqTbCP+F9tI7kMIEXAZyBU9plRBmAIQGR27TFSY1YcsDAG8BJqcvUMyOUfnNz9REYFi7Ly3/hCfq/QW3wAPpj9REo5ArE8HMvZ9pzkgr6t4oMOqA9AMrQ3as5YD2D3zzo8wtCHS+NwLx0/Q/3vxkBJ8GudrEQ8UQKzN11ifK+BXrL7e01XlUILehKqV1eVnrkTiyilw1VzACMGoLGjcd2k+gNsrhAV72GdbFW9NhUN3JsSrw1xGf3IzBbweb6sQCB7A1QEVd16la6NPyOPLFFiZyEBitTeIRUSPM1juhTyA4F5/PxSHKQkw9ci4AOTzrP5W46U9gWicApQAL0Al76oSaL78CBcFnZoSfH/w7L4K+K12i7r9vgJa3fzSujtmv9XtKvB7MaXXzsrVWH68JRskXzznaIS8CjKQMTOcfFBXuNM2OLH0W4HYN9fVjvfyFYAwujwVXBOzlCujkre7QGFzHDMADV4AfuViBTA5O5Rw4xU+v/EZ+bX3KiChzhJPIEQAiaiCyKiZB/AEIjSvkC8uMu0r5rXpqSkbMH8OPLYkZGB6HesW1cSySx2C8uj5+oaXbVj/S9dv0Nee20+nr66UIFeLn1j7LvL41b5eZ6vu62lIYHl8Bb4165i7TyTlipjbjIZTAhlScsTYRtGpPrWFU5DiQ3LXPQvF4BUC1pDu+WP0A0wxWrYAnwUB6MEPWeABYKzYlZzG596gC58sCBWBFERPAiw2BSMA6wFv3gGuY1UQ5ELSaWqYAMa9ZWcHXm6sDxDc78IHvdbYMrxb9ID7vY+6/y8Js//UgcN0+C0l+EpmX+fwgdBrRcm65dpH/K89+VbpB1a/JP5UCUStrlZDjwF8DS3ZMWtMHMtSxKy1q3/HWm/lxQEd4oGOY5r/DBDtKXJnWQDl37QBYpNkcuQslQoArn/+k2UBIEHGB85ng988IyujX5IP9mp4AGjLAKDbdVcAVJctEKcYPG9As1ACLj6QP5/qawAV1zcVMVZiuf/UH99HOPCQOwh+4pK7qATf3peP0TNHjlCrAr416bRg7W0gZ4zrW90ltOF2dc0yZfnV4pu1VwHLf6//BuCz079M5PrxxWu1qBwCrlDwoEZGDP6jt+IGZqcYbI8jvlj3RFey5+x4GIhXNnPZfPEKkdRaf1u3wwEovotbm1SsHp5qmEoBhGoz5QFETHBOsy8glBnQUfFX7ymkcX+SfIUiYcoWvFTTVRJmi1CVFgYwNDJkh4nAxWh/eMGPU3+277Wj9MyBw8rsI6Wnlr9cVRmo5Vd338g+HcBp8/mV3Y9uvxF8WbUKYv60GLwmh88c952hF93ihpZ0dux/o4vu03/+Gi1QDAGrAhMKhfjkWtnBe55kMCIpzPJDfPzvPYBGHmD8tucBUA+A/yBJLXsQUc6F6kMC3wKsYQB1sI37CZafcS1baCJdNSDoQpCJ3m8VvUt+qpO6mPhh9wAAFgf8F4+/VQF/ddOY/T6IPVUAOm7LxnB3eijrhauPKTz2gg5GTp/53kKezMCr3BRz+vc1w7LgO7AdqBGrvU3c3exuqInjQQjC2ntvAgIlEKYikhQAyejoCQmDsfMAfsIQAKn84sZEhgcOZCf/ciHaGuy+SAhMoSUULAyY12oMlyVLCD8B4efCgwSSrrswA26wJFkCAaRm4QEUCFxUeBTsOwKBxV2zzOzw/tAqAfFYOnXpKn334CE6c3VF4/x+3+J6BX1XC3bM7e90lqqVuy1TDNXKU4GrH8FPXJ0TuvWQwRGOxHFK0ZdPBYSlLqc/V+Wb/EBpAN20KL7PEdMjbPaWHc+xGsjAJOa7V9hxngJCgGoG4MFzJMNJrfVXke3VAdgDYaOgyalbFDaP0sn1X6WPPjYLAUTIQO+HhBBEgY8wQFwYYCun+nV2rz6bgJldaTD2PcbcBVdODNz74kPGugiUvD3gL36WH87Kv1t31+jrP3qe3jh/iVqlxe8vVau698bsq2VX69+fXtdj7pftuerm20qznH4WST62tF5SwYeQkQHsudQPV8ATSndRYMOKsi3d/xAw4EaByYv7ZIix+pZhHIeIWLlXEXDibQeMACO+dfO2DF+7RpLfa/Enifu/zRBA0saglU0p3tnLJz/8q/LRx3QzJJY9TQcKIQyoYnYAHtcB/kQpNGYK9DOlWqW2zp+TOnp2ORxOAC4aNzqOx5d4sp3I7hXv8UOcKYRiVILvyR/upyMnTyvwu71o8RX8bRTyEJSBEnytfgdNPermq2St6pzg6tuADsTgav11jV4lrDoUA8g7Tvs9DNi+KMwUiYsNRNiz/Y18gF/D7F64/67eH6B3ioRm8f9bb1PYHBFxTiQ5wK+yzRAANg6ZgNMDGr35Ap38i/+G6MOan2xZOhBfJrDM1kKB7sIAfAEh4gVFQUBnfCbNKmQNAbq4isCGd/4LVnEpHtkRpD/6NQAA/g9ePkrPHztK46Ik+CyWbwP4FcnXmTXxtK1hp9dJ0nt6rIDPLMafkXyZT+mx1e1H6x5XZgagAfsZqPEAvodeB6hZ19qgH0bK+dUK0lygEHQFFkJ9l58Cvdn9D6UEfK4qgBdPSNgYEYW8kQBcPBbcC3iAm7mM9p/mzcFFPr8JwFcrxIUBBv7m/KYvmczBwHsyxLnmeNBjFO6cKiDsQ60srBRkPAunQnbUd37o5cCbb9Fvf+VrtPfVVyknqgp5utWY7XJdol5PR253l8spvNO199hU9lB7z3R/uV/d3+mqlMftmBFoT6UKG1qZMv+W40+zM1gFSR/1EoDz5jfW8pbz4wUP2pZXAphk7ev6GaAnYAHeg8eAItbcf2AtHmOl1QnxO3dHYePZM0T5BO4/wN9cBeg9gGYeQMOADSmuPU3H/vRny7JgkbkwgKJUX4ApE6FgYQDFISF+MlBKBiI5nzYDmTDuxeA+R9TUpga5Eedi7iMAb6uqHx8C8A7adP02D2VZ8NuXr9ATz+6j1c3NCrS9JbXopdU3oq+tpbrV9awTw4EevAAuQwOeSlstPfrz1dXHgA4FPKzxXPmWoHRXUpCnrjzOPfkDLwFVgB4QcP9tx6XxuA7YvsVX0ly/rs3uf8D9iotT6ySjY29QsTYkCQr8baQAF5OAWAuZnBnQ8LWn+eTjnxX6cErw6WruP4qCEuY/bfMNlHADIFLSgiG4/3P3BtbwgwF6WGdXFuw6ipylr7UO22wF5l0JCR488F+5cZO+MY3zz7yzUlnqrr08s20xfUelpe27HEt3s56C3tz8co9B7lWSzbn7Mt+hx6Jr0mXKgLB4XOOaQXaODwo4FEoqBL3GcLE8u3cA4jrG59nqeQCcK8ihEIpZyg9edQio/uOjd0hGL7wpYXCv+z9RqXf/t6sAGETgtbGMnn+bB3/vCp9c/3mJ2QCLSdgAD4lgjoC3HoFmog/eQS0pyJbe8bPBm5GCXbaI0WNOD3wKyMGet1mz88hUBILZf/rAIXr51GnKFPiI5yvQqyDNp4oh61ZgRwlvq5W8XEMJPiZOrb4fwQWgqYU2gyJApid1wQlIU/BlVICkRWDNjQ2w8D69x1uV/qJ8Hivc+qQPwCwv237iIdA7o8r9L9afPkM0VsCrTCD35wH4suD8yprkF75BJz/wL1UBWEEC3Bp1ZZC6qyvrxR4Kh4gE+8ACCMPacWHskJK2CeI0W4AlBjHonEIXAjzyAwD8UI7nXjtK3z9kpbsAfssUQO/ejr3o6vdVMWQR8Nxu4zjL4qoAxxt22RQ+OvKSgFxsHxhNcvauTx9+pCvOsVWS6j5e8Pp6P1mDXdgheVoK3JwidOSfAX0+JEju4WOl9T96nML6gCQ48N8/CQgBIZlfHNLwxadL14OGwbcnBpcSTAjCADKwcWwyhF1bZEOqxfnx7Gy33ZteY8bD4gM9wJIhu1MIxA8sX/jc60fpP//Bl2jfS69Qp9dVcq/Xr9buUilLKv1SHpvKHuruWZrK9FoPb9lV6ep79lrmEWRJvp9nsX5m3oCf7cCMM2kO6QSn7k2bi6ZL+ToQ/H5JLJkCH+hiXwRnK3oCfCFQQv6h5r8QYACKwIYjrlHYePKIVv85BeDAv0MewPVxGL50sbXnH7/GJ9c+Rb/ynhjrs4YBMTVYWPmlwP0XATeQSd3QDwb4tTMw3uM6950nkKT06t4TyCZc48qzJwdR9gmRnXbJ+YG2+wenzP73Dx6h1Y3NEqwV+NtVX37bLH2ytrtL1NIYX70DHcGl5600zmeOFt+sPuh6xPPAIPL7dgG1Gp7RJ7EoMVmpQQcI13f6zfPMAeNh3Iw/ey7pgXGGCoC3awb2RCFIuhbBjqEY+MQ68e3bd2X4yjvq/gP8O8YBNHsBV9dlfPpJOvL+T8lUAahWUlKvJZKQgfZlM6wAPqWVgQosz9BITWggPEcYiuisgEWvDpGkyBDkYSMfDMDjnp2I/5HFflCCCgGzT89MXf2zV98pwVtZ97YV7Gg+v8rlQwH0Ffha2VcKLHpLJcsyKICojUHwMdx8BpGGFC7IW/GBuy/wMsLNQd338Is1tG3VB8Aaj5MD9LzgmuT4AKS/4QFTzfOFoOOvUG+gXJEaFCCZj61S2Pj+QSpz/5LfC/pxI/jxs20FIKkCuDSQja/vy1Z++d/JynBP+GA/egA0q7EOJrFgCHlPocApo+8Vg4o7B2yqiwHaHX/W2oKfWsQ2g4/TSRBQ8rtZQ8u7QhHINh6/vbZGf/yjH9PxcxdKAKvrnlh6BXm709Zjs/gtKAcU8yClp8dMjCIeH1fNNeqAu/GuvtznTAKmeo+AF7yOXkJT77/Uufq25ycFe4UAC5/k+RleAPCkuf+T6xQ2v3lMwuYQ1n+hEiAvngNYrASK1Ynkl25LfuUpPnKbiAzwUq1QAEwF3JaGnmlfJUXip6X4lkt2ZI6zDvdB3LFr/d3tjkD5mRJ8X/nePvovf/hleuviZS3i0UIejes11lfpl/uPqSzHGL/fqwhAe5uuZgIsK9DWEuBYzMMZl2KlOuYRuNDKd3B6q+wR7re4QS+A6E3nSooKbnCgbbD8iNU9T4XCH1/LD9c+2S+EPK9mOKjIv9ffkMmFuySJ+z+Oku+4B+DCgMmFDRk890fZ0Y/8lvztD5L0M7D/SFeoIO6vrH+WDAJpbBVWaeoZoPqMgMBmQJg9gMUQzk1YxGc93K/q2nLq7g9fP0b7X32dJkXQmv1YxJNVaT2w/e1qxHavutbuxyaeEtwxrYf+fHP3TVCzT3iLbgJ6cQ07Lgz31lnEUTlAOFz9INjCnH88W3vk0/4Asa/kw74zWv4ee45wjUIijDVC13Bl5F925BYVg2delrAxIAoGfKwquQP/tknAZh4gl+LOSIaHztLyPzzAR259Wv76+5MvwwStVYhQK5KBcHUQryPOT4eG6stCUPnnAY80C7HAM3CvDvescBOycTMaQxiUxG6Bc7F22eFXkR1868SU4DtMd3T4phJ8nW4EOybudnU2n47i6qmrb3wAV6CfSoZ4nzMG+AF8oBPHSd0dseu5b0jD+zMv4v+W6aV0aI3Uhwhcb+1xf/21Bvef08o+FYQBipdUsAfyr8y+bVy9Lht7z5GMYO1h/bfh/m+XBIQEkkEu4zN3ZXjkS3z0/Z+Wv/b+RINlQZTEiJZfBwkgMxDqvQBoTkf+eS8A92HP7uMMQGD9Xel8QF9i4oEjuie7apl5Gw/dx2UQfFN3f68x+wB4t0NtkHiqDCoPYImyroI+TuMF+EvR/nxdrYqvAr+P7wWWH002rotrYS/WfSoH3MZJ0RfXfZKz9AZ+dPF5klpyb6xwzFgB8rhyEjqTILtmCqAMucPm3kNSrA0i+TduBL+K3H8IAJHEC8jfGYTN7xxurf7Vc9O45BfDr7xH038iNrwTSoGkYjmzmBlomSdgJKABPnX7ARJ3DeSLCx+8tcRwEFk4BdjXiTPWh7Xw58qNGxXBd27lWuWy95aWqZ3W68e43ax8yewb+deKr9fKIuFXgt1ieiP4AP603VIFbrUgzZp67HjEXGQWYuyjyE89RAB4CyLP/y3FPZQ2+Usal3j0wOjgQYDcNQiJt/4CKYRxbEKEPYC/GvrJV6+tFXefeJ1kU8GuMvIKwMf+90sC+kIoGU5kcv6OjE48ke2/YQQIXJZgZIaX1NLbc354QnApl+YyS0/S+LgQP+kNaRYJbqn3KHkHYSy7pytQulsRfL/71Sfp/LUb1OmC4Ov0jOBbol4pvX4s4nmMOnuWrKOvXPU5LeRJMwHtlhb1WJ4/pvQyRiEPODWKe1ljipUTpLHP87Mt3PS3rFXeYOi20MEiODdPNSHwAFbU7AP0DV2vENT4pwVy1BD7Cyf38I9vkAwOv0bh7oBkMp5z/Ucu/78LCkAgMU05ObcR1r/0XVrduF6yk/gSgs7A+S8IchAKwwEY7hRcJjs2wf2haeLKQiCxfz+ApKkn54fwTtp92RFdwTXM/tNHXp4y+0/Qq6fPlFV4CmQw+9TDcdWa2116TCv4+pWSUHa/a9KhdgR+u91S8M/CgAyAV/ETmOK+aeP0UoJ596dpDBGI3b0I5nwfiK6+S3CLQMLH9MS4Ni/C9RWr4j5HZT72R/9/Yv2D6MgvPrc6CmufPyRhbQDSz8nEsf/3zwE01wSQjCYyOXtbRm98Mdu/59+GX34PKgHFCoPAAXhiQ4jiGg9jlyBtVf+PcAHtoW5PUNgPcdWCkIV9RYZ92bl2n8W1ANu+VNXs7z18hMb6Pr2kQ68dBe5+X0OApW4EdkeJPa3ei916rEBndtV8iPEBPDTn2CkKc2qdMakPv1ik1mAH58HjvI7ZRwpZ3AdJfZGBH9rpO/b8WPxScmgZkdQwpSx/+llFGvsjbE6s/49fksnFOyTFfNpvlIBfJajgZ2cVALyAXMZn12X9y9/m3sf/GR+784GSCwiC1AVF8BeqEKq1ENG0oKQcQCD23YJ+hiAIRIwYI+I6XgA0sCEf8WFiNlRQd4pHnOGA8I5F/rwjpbvfmzL7dzcHJXB1sAaKeEr33ar4AP7I7HdiZR+3Whrza4yvqT1Omf2MMW8/6bZieF0otLJzVNyhEMcz9YF9R19zIQ8uyoJEl9oCZBigLcRpkhCMnYfHuqDQxymJIIuyAzzjAApKOQCpVqEQmATWf1zc/cIhCeuW+psY+FUa43/ZaQUAHgBewDhMzt3KRm/+Ie9/178W8wICUYtZMwJsSkDBaq8ZCpRmAih5i1DK7AvXr2TpOjQCUsCxko7bQKQzUQzhB6kDEMx+1aJ7Vnvzq3gd1h4luuW5KoE+tfoKfBXM5M8yTN7heGz5fIvfRShJ7wlzbfOM4BwAXeABpHbam3gB4mv5u6SJAKfwHLi2DxjW3nNPzWy/sOeh5hXGXJwvUC4AfoD1pxCJwSBp7L/5wssyObdKMlHge/CPm1J/u6AAoATgBZxeC+tf+XbW+/g/nXoBH1IvAJaeDPxBMwFt8xDAB6TzAhjkSJYL6gGQ8tNr+OMhO6DmJNXYDPed07HhUBwCoPv4HzXrxDvVE8T3ddvtiuDbC2a/rzX7mb5pJ3X5q/Hafeos6X42i+NVsllnHsBPzJbaU+bdSDwMaAXgRc+9LgVCfb++y7k3du2k2QAx3Dr+TuZiCcH1pBOgzmHw7+j3oPaFPt4zAEEotpeW+hJH4PMs3s+rc8z7K0ivcWX9b4/ztc8fmLP+o2brv/sKQLCqAlAv4MzNbPDS7029gP8oH3sXhX5WuTFFCWq2mgB4Ai1TAjXDP8hVCALcsPy6F5TgwduKAWoK91aEsYo0VQPy1t+Wa27jXc3/N1fw/fFz++mVU6e0Yq/bs/RdXDulArBS3MTiVyy+9uRbS66ft5epeODD4gOUotcz9oYZwAbCnCmvq+TT3xqgJPxnSJKiczc5boAxQCTotwKXoErHEXYO6Ol1rLFPIOQYCJJ0BCZVfxH8CenHKKGPRjPYg3uvUdjY+yLB+jvwq2w79++zAPfpBUxkcnG92PzmPrp94w0+fDvGMviSquHsOF6LK6aesBu2gDjMNVGA4CmFGkszVQSWgv3Mf0/y4ToOmOnuKP/p1f5zCvynD71U1ey/duaM9uT3esrmT6WnjL6m9JansqQ1+5095fVSqkwABm/2Zq29YPWtbp/xCm2O4i252LXFNGbCp+jB1h2YbBbeeewoJfYOG458Zg+cjuDcM/g+OyWEa4jpISno8Ry8gRqW37wAXbEn0UPQgR989fpauPt7B6P1h+ufSH3l3y6HAL4wiMLaUMYnbsjgwBf5yPt+J/z6eysvoAg6+6/F6uq0StAzgJ8FSecHCiPON8TmTNJJ3xakll5TSrDyGPsceQEUZDCOEw5Lg1pwWTAbqS1hJcFWx5OfeifgweNv0Xeef6Eat63vzV+qVm3P7VJbSbxo5Zeo08E0nvI+tfQdZ/EzZfMR6xMD+AC8H7aSJTF+s0pjP50H/96a2fev5nEegcse+Aumq+y61KXxUktNllHy7D8GgEDUQDVPxQ6pEUzdfl1j7C9qJEN82ef+GyQbX9tHxc11LftNrP/Qu//e+u+mByAQjCKWyeX1sPmtA7J+4bns+yskQrD6scghb9CKBYERhfbl+tpoN3EFP4mrBq2NrkRch0ubepAGgCS3nbFePH3zDv20fk5fukz/6fP/m76+74eUk1guP0pp5asx2+oNLKnV75WjtveYxe/GiTz9mMuPZCDy+NRKp/Fo2m8qHIVQ1psW9yyYiQCvCihNVCrXPyu43V1L08L+A+ChYAvFXeI4m9SSpzG8+DoVAF2vo3AhhyIgpLrTQiKBwsiR9gP/ZQRgLPmVm2evFGvfeFPCmgLdgd+l/wD8XfYAIKkSmJCMRjI6fp0G3/1fdPSDvzGdGLRcPL5MbCXClRYUyjMQgkzVquEAa6oQ4EWKkEDwwcITmowYmQDP3sY9CDtXUOkAjJaG+wspgXJjuEl3R2N6d6+7a1mAt69coWcOHp4y+9cqgPaWl0HoxVr9trL3Zb2+egJg9tW1byHWr7P6ltYDoGH5BUDCTEWaV5Qu1kbc7y5grcsMeMMvIAdrPQCstJXlpznLz85wJMRcaB5L58m+pKIPiicpbAuw8gWIPxW9pvcEmYFf7kwo23+diru//z3JS+s/MTd/DPDTsCH3Lz/tEIAMi6YEpLgzCJv7T2Xdv/l/ee+efxL++Z+zeMde2KBKIJKCmbpHqiCCkYUqjJRfRbJwR+MkThqEwOymwE8nD+HcSr5txBSMHIjo+foABYylxp47d5X+0cce30HwYyjH01Pgv3zytOXyFfBK7KGAx6x4u0edpR5i+VZWhgSay0+AH3P49h00pYfv1tQgweYN+dQaGFVZNI/Dj1nzN2FLXETvUM9u4k8N0YhHofARn6MpzVfqeS+AvJeANQrKfOH5mutv53OKIAS7LrN7sqeuUhgcelUGL1yksDFMwA8Zqfiy359EWjsw0ZJxXmQSNoVp5Tznn/4btLT0p+TPLGmswTIjgbJKuFpVMWCPs3JPpTxWL0GP1RrHVZ9DHRr20vCVGee4juf198Z4yJ4Bk8Ni440CSVHQzTsb9IE9fXrfcv8+239Rurv31dfoi999hlburFXuur4pp0vdXik91OZ3u1NZrmr5O8vlXk/vj4U+7U4a+5sCaGX3egBZI8EH3LPKFiwFu9beRSqOvTVfrCL98BeWuhvB4wgakHAdQAWxzG4qj8AjiMc+JC0IiiHkthdXCOXCEfB6nAeiia1VvB+NofID1aQffvHqKNz6D0/K+MJtorEBfnMqGxAa6D7Sf1CBu68AFisDGSroWu+/xTf+7N+hj7+bqN+K1kYU5AZ4AzfrqqJA1n0TUwx6TLgP1wlrCnRYfF3jMZRA+kxCMEm0SrpKCOURvb1yi/78+95Fe7qd+0kBVjX7X3p27zTev6JA7pUA1/gdx1NZ6lfA73aXqtLdThXjq6IoAd9pd9CkgxhfV8vxJ0M5GSBHu7SdL/RXENcvvpFdWgWLF/aKgbFC3XgBr+Nq+p3rjlJe22MHftewg1p/dPMV1R4sfeL2cwr+cj/ocbBwOOiejAJlXz5PYfULT8nGc2epYv5lqGBPwL/pQoCfoQcA4KfHGYX1QLS5ztnHP8Q3ln+prBC0EtEsAyBNMoJHUIE/Y9vHPS17BoBN/+fFnh1TAux7PQE8x015fmYCL0zqAQSp1jwv6I3L1+nn9vSnsrRth//QiVOVxX/z/EWSLNO4vmvWXq2/putsb7ly99tT6VaKQaVlVl8tfiUAPdJ6mbn+kNTqM9erqcbXrMnWdRNbaw5XgpteYs/y6+q8CP8jaf4fSiCdwpOAP3H7cQ4S2RPR5V6ue66kl+DmTwJH4JcCRRDicW7E3w+vE506ejas/o8fSXH9LlHRaP1BAPrY/2fqAaTHBZGMQ0ajyzz81N/i5d4y/fwS3H9MgSZOga/XYY3gJUh5PXHf66w+wMvx3CkDE8bKIAazFAQIA0wViFRrkRf0J5ev0a3BJn3oXXuo32kvBP/bV9+hP9r3I3rhjTcpD1IB3wDfrUDfN/AD+MvLpgz0/ul1zN9TwAP4qOe3eN9Z+wT4VF6HAnWYb8BpU300L5rTJ1tPVha343lEaCKfOsCpm8ALQCcufdrYg/ZfHAfsG5NvBF4w8FcAT2J8WHzzAgqAvxCprhVW7//0xVFY/dw3ZHTiOslgMAM/FMD6nPVH/I+fn6kC8PYirAtRnnP2rut8/SO/KZ94N0mvFUEHPgBKIAUszuEdcMvIRA94HM+9Gpy92w9wzltBUXZ89mzqvrIIvIaWxpvX76zTwdNn6erdNVobDCkUBfXLtFurRVdvr9KN6f5LZ87Rd148Qj86dpzWxxOz4Np+a/G99ufHwp09FfC7S30r+lF3X8FvKT0VHcWtiiDG+WD7cUwAfuoNuHqn5jSd32e/V3O/x+728yPMzTdzqgfSfD+AHUHPrn0XFj/uiz8ONJfCLhh5/cAay8c03yQqgkmgKKwKIsy5/oNA/LWLFG5++3lZ/+ZxKlY34Pp78KfFPz7vv2tpwO3ODYyGdBwml1Z586kD1Pvk9/ip/t+Vz/wCFQGAzmM6EKSgVGvBGh8xxopVK+dEoYMiIEa2gAIjxRQwWhrnaCWeSXA9JJwUBKEHoASSELXinPO22hJUEOZ05votOnV5hUKRRwkkoZh5DBlRVbGXwUU3sm4mnY6O27Y0n+63SoIP1h0g189hgD2Sma6YB4e8EHjianGa9j0dKFsx/Eiz+P1EpMG7b54LJtgDKgy01V4d4LEauN2beZHPhyj5h+cCmy8OEtAAb6CPgA8B1ytbsneF5Prxs9OKv8NS3N1ExR8NowzSvL9n/h9MD8BWGTJRETLeuJRNQwHq95YtK8CkYCe463DxCUQhViZGNgCeAFpQHYNNc2Sg7uI4tSopmUjmqbiJswYjkJMkJSDbSlS2I+uu4FYway0+pNNN4/zuclWw013WcEDv65SCKTzq7qvFzzK1+Flq8bM0xk/CHbPWTqjxx3EpzQQfFmm42ROBrqEKl2QBdeAvgQRM3Xs7xjlCAIDcjsmFAylnAHJPwRzBb2DPZ94ALL+ucP0nsQSYStb/B5dH4ea//6pMLtxS4s9AD8sfZQjm38f+D4QHAEGn4FRGkl9bD4OXznH2rc/x3t/67/L4MoUP9SiPpcDMTHm0/q2C4RGEcp9iKTEGjYRciDs6ZpwFXX1a9MPW/IPGD0lbQs0yMLoLvVcAuxb/yYgzqYAuibsMUIWRAr20/pKPKVTWP5i5hGIqwVtKq6v1913E8O2Ohg5ZyuTDawDYbYXAzOuxO982mVNv0d2e+EtNG+I3xT/kz/EsTsRdcm26rrdEJW3QsWtuPB3bngmeD2D+keePSsAkgj9Hym/mBcjqhLKnrlBYf+IZGZ+6SeWgT1T8DSE0QNzf3PH3IIUAPhSQ8TCMz9/m1r5Xpy3DX6an+p8pQ4GwlFEeU4N0b2qwVAJkSoCqe7JMiKN7xcJTUWBnzIjzEBJA03PS/aWa147BAyA0iIAPoh9khGCmDGUkL7kS4yZCBGNolW5/u3L7w7hDEgJeKQPCcgbiVhehQKzT1xx+lpkCgJtfWXsDfLnis8BfeLPMi6CP9FoTnr3b7wZ7MJ5vxLDvEmwe2eg/Dbf4h/1LLKO4oR2C46QHAIJzVwiEdGCu4LffAbferD/IP7j+adtv9o3LJKuHXi/WnjwuxZ0NogLgR/w/qK/6A84eLAWQgp/gBdCYwsYgjE5ep7UvfDW78vhfob29j4V/8GEFdIz1c2Zq3csHFGj2yYwrMG2bM2UdUwLRalt7sMB1lYaGIMT+pgjS0ECI8OpyK0uO1huFaW0SWPUKpFIUlQKQDhTAXF+Nue8ozJmdZ2r9VQB+xqo4j8y+Bz5gzwsbkJsBy81KAPhbgOwtRBZ4DA0qxT8gjuirRPwwWU/wSWrtURAkuD/xJAD+IJSm/QD4CH4TDQGkOpZZ9x/vvUZ05cKNYvW/7pX8xhrJaFQLfpXRgmk/D5gCgIgPBVbWwujEFV77n5/LXv9Xvysf7P9c8WvvNchV/56wegRsZaiFKoQWqYJQ4k+mghbKQgAuxnwBWH0uV72XiaAEOGWNoQzgWYgRamK97xIBz9UHi0Tgh5ykCCQSFPhBj7OZ+w+cZJkV5jAUACy9c/MR3zO4jpqcHTe4+7yQ8BN3r7Bj1N09ntPDiesG9Hn6Zmw3foCbB+BcfOTsRVdwAZ7gI1h1KIx57kCS1F9ICnwA8mpF3E/jQtdQrkVM+QUiOrFOfPidUbH6O9+SycpqLPcdA/wQ1/DjZv09uApA5riAScwKjGRy+W4YvPI2t77121M+4L+FjyxT8aGegioIcQElkM1CAl3ZsgKkIUIR+wNYJO6joINJ96DBoxJgghIQcp6B0LzlEHP741cIKckWQrVKVopafNHSYesiSYg0s+IAN0cPAK25LsZHs44964CPHRwv1ACuuMYrhOYGHx8ecApvLPgcB//Fisnd7uftSQ3YE1CTt+i4T69LU+Uf41qO8t64B8tv6b6Cp0KEDIDMFIasjDTuX/vKs2Fw5IoUq0OigJhfLb/J0DH/AL886AqgWQnIZBDGp2/S5jOvtNqP/372ldZn5V/8BSqWsllnIBVMbEogrq0iEgrZdAUPoClCPVaQmyfKsPilCGYHQoXOlIK44XNMeKeh2HF1N9KE1k2ncb4qAZJspnWEUEDESYVjJTierllq7SFQAM7qo00ZIG489OKZdYCY2DnrLvbHuY8EvHcgzck/ceCWBdYFoGx6X4Rn8+f7AMTA7Zp6kBHA8xhcg9r+CZh/JfsKTgjAohCU/g4DcQn+2z84GNa+9obkt9eJCrj+cPsB/m2M+X6w0oAQrj2WyVQGBYWrK9z65ON8rv0LUvYLtCMwOJnwbpWAINIyeAJ6jry3S/kZcAgA4kRAlSE16CwrPjuZaIMqO6wZMVx7dfPx+qyU1Z+5/ijZ5UQ4EeL5Ih6z9/z/2buyHjmu63xOdfdMz5CzkBRJiVoiyVpsRBTiQPISB0EeEsB5ykNe8i/yAwIocQIDcRLDWV6CLE5e4jixLS8yLcd2LFm2IiuSTJGSRUqkxHXIIWc4nO5Zuqvq3ntyq+pWn7r35PYIgmwzZBM4OreWGYoP33f2U9FmGXwPTd2+N4HR+h/GY/t45S/GSjvfY0DLhB8L8HMZGqCY9vP7+32Lrw1rrdBP9FmdNyTTCNnoGsE0m30IIPnaJYDTx98xa5962qjlPtBgGMT8m6LdN97xd+MTwM5dggMqSADVmZOgP/ZrsJ3M00Nz7oWKBIjB6O4xuD3wEpOAaPNtgBdEH4A7sPDPgrC8Yh0Vkwpb87rvHlvlPU7kubi/7Wf2S2nVmf1Y264/rBP597x38OP4G1ESIPneDtu55dvxJp+gjVdYadYM9DDrz2cjVnvJaT8mBb+sZxTyTL+z/J5oF/OX4jL+hluC8chlgNdOr5rrf/JVys66er/s9nNaZP4j1v8GDwHioYBy7JaQWuvr9M2lVv9v/sgmBT8F3dZd5rcPVC6+tgJVTIWuJIj2DEg1yJkQ3A4xrMOBurKQcC4AvF6AKrZnt1cmARH964RKQuHSIyLbPORVY7X/m9STa0SiAuCNLruXmWxEP3N9Ldufd5zAk+9JwI3HIBDFqwAk8wD1xCdFf7+8pkhmP1zTZUiClzh777fsQnDmcl6QLyDh9mticb3+dabfAb5JANg4O/BrGnX/wfEewLGVMuln0hMrpHvbjbh/e3zcz+D/f+0BxBPTBsFsaaBhhkSXcfX+T8DidIf2d7lrjcESWmCOq2sSaLkzY0iOBzMafLefrwV4+GeRb4qOQ+RrdNfNRSLofTabn3mWnq8Z5GK6UVh/MezkdUB6N1nQk9hYp/hh8n//WFsfexxnn3Add9ipx7387K4zEYQLO40sDcpVc/Xf44Gewa+UP8lnha29wUrrKgTQ2pX73LtQLPb85rnUrH/2S2b7uQuk1zYBTDjlt+lkOzLnL4F/43sAcS8gwNUQKEeTnb0G+K2XWpB8Onnq9/+QAGb0owsA2tlY7eCJBKjZXCAGgM0RsMP3taN0bDlPgMLhEWb9sPpciwnZ0gMDuecIripYaqAGOPychCQnMe8ut+eCBL+HWoFvfv/dSyyxh0659WqyMhc5I/Ln3Sg2sMuABwxr99LF5zNbfn5PiiSDpkcRtPfWZGKIp/nykdVnUQBZHfNrKCW1Z6XBCo1KgrScAtq9mKb/9R/oze+fI2XBT6Ok34Ct/ruv+d8sOQAQH+QiBWC2FUBvE5L5DVy+46N0/26AXe0alPw6Blt+GFCVkOvNd2AULbExwDgJEwcI6I8Ho5+XQL7wk4TuBnortllbkaBH9GYjxP+vmHng+4IX4sY+7hBgKTvH7RjxScXPvnv7JddpB3H92IYfKRwCcKsvhwRiY6/r6+f5fFVn9etzbentOVUO/MaKA3/d5qtr8P/reaCVL3/PbHz+ZVJXN4Ay0efPwpY/1ut/sxEASkrIAEyqgK6sotmX4anFX/FIoE4KMmLcfZQASZohAwNcjr7GrCV6IGPwgh80IDCogXfkMyl4Fl5uIUIQWX4mEJHYY4Lh+3LvfWwkV0hkECjyewgj7j3GFpwT35R32fuS67cZsJGzE7mkI+zs8waDkEHvTwCy6w/Ac/wKQTfi/WwkDP5cY/nMNCy/KWr9X7DgX33y+3rjn192GX9n3R34ZcZ/MC7pd7MRQDwVRQMCs12UBy+j2ZMnpxYfNZYEyCMB9qkTHxkMMLKSMFBkPB3ZDNQQYPFpIfQWBJkwoBNmniZReKzEFl5k+FmHABf7+4TlFwQSkTgRoDgKhhifV4ybLrmHH/3VXITiHbbaWEiwude7jqz1Dtd58Zgut/M6yUurzqDXtWCpU3fOrTbKgb84Dwwknz8Lpnf8pF7/7LOklntuwi+V5T6O+yM1f2C5uQhgvJAyYDYU0qXLSBUJkCMBbJJAIQGwnX3kOLwlPQEGRVDqY8smRZKDBD4G1wwuYf2B78mXImvKGKQorL+sCghSiIrENGvCGBGQ5ANxF6Mf4JDbdhvZ/CAJyJN7DHRO5MlkngFgEfE/u/ye5W8QQF6AvwH8vBKO+ZUEf+7Aj4Xlv/rqSb32xDcpX+6R3oiX+6z44JdZ/1uKADgvYAgoJzKDDMzSMuiFDJkEHByYBIIlkD45mAZ6+ShMJR9RIN89i8bLQUTil+qipOAzCBMB7EAAKIAqySDWfSWQH3/Oyhf5TLr26IE+ukrbQFPzGUi8K+J27g+I9QCI2r7fzUfgWf5cu24+tvwjS58qtBp9L0ABaM2Wnwrw24WedOGVE3rtj49QdmmddH/gZfwl+OtnmUj63WIeAIIkAQBKDZjtHApPQM9nyek9JQnAbHv0AUlyKCOQwEFA/sZcIjPwGInJw6lATvrF1mUFzyL1NJm7CLwYUX9jHZBFnABkOTAe1yCL/GvkNUaYgIBFAJ0tdmQjr9jMI8mBBBHIib6oIC/t5CEe79uUqm7rzTjb74AeZPrrhh9O+CnX34/W7aerR0/oa08cofxyT4BfdPrFZ/ydwC0aArAx8UjAXFxGs5jCKUcCu9tA5MKB0DkNAMokUIEhYQBwzB1rgfWvfWpA9MDtRILcK/dhw+LHPQTp3wvWEe210vLzz2BMZJPRzpV7UYaLSbh5B/1JPEEOYxKAEcCTyO572f8g4fd/x/t5CX6X1AuAn6pG/K+cq2/IagSlXcLPZvuLmN+Bny2/cPvHgl8L8N+KHoAc+HIkQNs5mouXwcwP8fTeR2FXB8zB6RqYPLfPEJUmbNQuHOKLrSoFgAIh7A0wsIN7DHLONUTAzlqEJIKVhOZ3xTptjC7qjLtfJBp+WFPk2mu+ARDa1Np7xj/jSECcg/o+32Ogi1XeLAz8cFOPi/vdEI8Dv7Y6t2IC4LN2E37kGn0421+W+laf/qHp/cUz7wX8saTfrewBkLw2BJQZ0hs5WBJAvXuAZxYfpsXpNu3vujHUSF5ALMMUXw4KavbCwxUSaRX0ASeSf8G74r78FDlGAO/rwIrzzXdtSkicHUCRn7FmMYE3YEQ2PtLD75EBJ/v8rbzInX9s0f3Pc4VWnpOCLMDg19TY1EM4avDJMh7kyWrgaz8MUBX4ucmnmOn/ykWglS99T2/848su4edafBn8kYx/Fun0owkBjPMEzLa2koM+VyxSO5ecu+dxwFab7p51rFGPBCN/r92LU3kHIGAkzg0sJ0RKgkwiceDDThUBGfvLZKB8h8lN1h/jMTvGJAA4XzORxoTCkp58x8hr1uSf5VZep72dffweg5yFE30+8N0AjwOxk8yKKgFeAV5BQAIu3tcEqvQAXJNP0d77tXMpXf/qM3rjX45StrxOZjOS8IsP+Oyc9JsQgIyJzECB3syAVvugt96B5XsexT7MmAfnwDR202lAP/ss9sSj36KK/AxFYdwRSjRGlmTAYfvO4EcMmCZWqWAy858L0hqb0JPWP27p2Rvg+1IovEaZHyBBFHFCiBFEZPKPR3d5TZfYz6eLM3D3XlYBPFVQynCU8XeawT9a8KHdKq9ii6/ufe4rZuPJE8Za/mqjD3mWX4BffM1nx3LfhACiISilRHozBbPcR/P2a3j9lw/j6Xyu2CdALayTg44QfLcUmmRgHEkkMqHGkTuKmJyfC4D54OdrmdmXk3+s4gnBeP+AfIct+s6uf5wAZLNNVIwgBeQx3KjFl/cJJPBl3O9be2OCQR6D3sy+amb3cwa4lTDm5xq/pvKsjKvxf/0S0NFTq2b9z79itp47b/KrfaDhEAAC8LNEJvyE5Z8QwHghIZRTlRPYHKI6ehSyB27H43iI7qt6BYjqzT0cEgReAJ8NCneYAShALmbz3cEHuV8+lFl57gXg90JMx+9J0pDhgazbR4QkGUjWpUj8HwrFXH6UjT7Swsvynvectea4vwS78b7Hh/5STs0NPWkmSnts+RW61t4q3s+cy2+WU8Anl4CKZR7XP/MNu85u2aiVTaDMA7+TzfcZ/BMCCDHLWhsyBQlkGaiTbwHto+TU/AehIIAD3dGWYKhDAsC4W0EIJKdgXIJR1ueJUcmPuAwo5wZKhYHll94B/1jE6u9cHZDeR9zMyDyJaKryz4biWf943I8C7NzyK4mCz8GHOVjc8I6r7QPH+fXa7dzr4Xc6QxgWQBfAdx6B1cq4eN8g6FGybwnM8gvHzPVPP23SU2ukr20CKQb/eLc/K+R9iPknBBBo45Qhs6XIbGSo3rmISl3GM3cchr4pkoMcEgDJmfGKATg5aGBEAjI3EImrBWd4/5UzAyhBLr2NmPV3Xg0/E2ECjQsHdmZW1kKi96O1fFkSZE8g2MjrE8u4rL4DujZ++652ouquPlM37lTAz3IcAX5YWX8GvpW0LvHVwz1W4IergN++kJq1L3zH9P/hRZNfWid1fUss85Bu/6Bh+dX7EPNPCGB8NcoQUKrIbKWgL66ifvNVXLvvA3gO9phDM1VIAAjgVjwToZNGXgCcuC+4UIJRADDwJODiEqsORBqCBMhjFl+861l9kQCM1frdgQErrgOpQRsb2WUdJQcKLD5ZLYHPvfsB8LUJGnoalj+t5/UzK9qBnpN99sx5AAd+HuhZzwGevAT0qo33e3/3lNk8coryK73GJp+BP9gTz/a/b+CfEIA0ZL7hMaaqEGxl5QcW81eOwfD2Lr41ez+1EzB3zAAR+/W6OTxiQLqYGkoS4A626gyAYyhctsbKggJLdHCoEJFj4EYlWaZseDGCJOIf+ia5vy8CaJ7XBwnqeBKPzyKeF919Ir73RHbwWZ03t/OUmoGdplZygKFykrNOFdozWk1uxh+5s++tzepLvUv/fYzWP/dtvf3CpfLDHfUOP57n34xt8+F4//2P+ScEMD5ZbcqGIdPLgNIc1FtnMUuX8Pz+B+Gq6ZbDRK0K9EiFJqBSh+6nA4V21yWyxpTGUJTTBEgpMl8v3X7+edkQNN76y0Qgnyk6rY+htefzu2/xjQLfULTvX07oNcFvwiYeBj5bex/4uXbgz5y1V80Yv9Kc/XdW32X59cAAPrsC+N2LqVn7N+vy/9OLJn17jfRaneyLdPcJ8Oc/szr/hAAYIuPDUDJkBjnpzSHopWug3jgO/XvuSo7Rfto3DbR3CqiBEk0EhFyyEm2opnxV1rGZOOIbc9npYO9AegWy8YgtfzzmF2PJ0gMgTlhKEEdIYHwYIC09AxzHl/PctSjjAZ+JQLj5ijzguw6+Ulz87nRmJec43yMA5d5Ro1ifu/rObQP++wWgN99cMmtPfNHu7jtH+XLfufwe+AN3fzsCfvOzAP+EACRc4mTgQgLS/RRMbwDZT14HlazhqdsexpW8bWy50LQceAlB85dl/C/FAIcEphCUICBA4VIbNvHRjbsUgBf9g3T1d/QCuElIdvZhbOIiDnqI7uiTzwiZBERM719rYOE4X7j5cminBr4Gv4yXWsldfM+W37n/WIFfkRvhdaU+Z/XBWn14+kJKa999QV//s/+0Vv865SsbYLa2ubnH2+Ijavxinl9WSWFCAD8bEtg5OU3KkNnMSRcJwvNXQb32KvTuPZQcp9uKcqHZP83usQmIQEyTVa4pJUH8KptfmBhq7YSQuw0D4vDRzGFFpBdB6CAckQNCFBWSRBDXkhBEWBD28QebdkMxDHjP0pMDvbPWKYOem3bSkbVniz+6RtfWy1Y/c9UCeqsq78GbJy+Z3me/pje/cYKyy/0qyy9LfLFMv1ziKXv7JwTw8yEB8IDPUjnxZUjQG4LZGGD+yuuQbl+CM/sfwIuqW3yb0Ey1RlbbjKwTBhlpDgmM5rDAxaoMArlt2GkOG2SX3rgEowgD3Hm8JtHnH+mDkODnPn+h+XkstueYnst2xons3kNQrpmHv6XPk3l1LZ8z9w7gQyuZFd1I8HGcb3UhVLXwOvdfGZfhP7IM8NzllFa+8B3d+9tnzfDkqsmu9MFsDQAoFeAXbr8Av/65g39CADIkCLAmiYCUJt3PSG8OQF+4BvlPj0NvVyt5tXsvAILe3wXTctar8gZcfRlrcZaKt8TqWkpQcFsqx7RyTbWOW1VBAF5CTYQPIuaP9QSINt5Io45M5sXadv17DGqQll57wmBX5ABfAJeB7+L1Guxs2QcF0NMK+INGnL89yvAz8DNVLfVUo55+APjRNYCnLgOde/64Wf/MN/Tgh+cpu9Qr1nU7q59FEn0c74stPr/oZN+EACQJxAfQrJAuvQG1PgS9vg3qxBnIz7wBlw7ejcfUAu3qAB2YdmCtrLICcqUoVzYU8+aOBJDj2EKTCeNfBgjImDpoTpIlDgwAqgOAoiSRYKRXEoEBclrM8IuYX3NmXuzb0wAS8MDuPTfr8DnXTtw5c+LV6gvRDvh509VnndbA1w74GkvJtXP3j/erVt43Tl42a39/xGx88ScmPX2dil5+s13H+vEsPxNA/R7H+7IzGiYE8IsOCeLj64YZW2syRc/A+qBo7cTsf45BtnXZhgX34+uDLh3sAi10aiIoRQG58hTWPed+bNv0CJCJwB9TdcQgSUGC0Ik/MBOQSKn5LIEcuuHgi/9v8M5+fwQThA4y+MofyGHhQRw+a3/ZZuo0x/W+DLNKUuWsfkNSxRY/rVx9B35HVucGlbv/4/MbZvXI82b9r/7LDI5fsVbfze5r2cvPFn8zYvVvxHh/QgDSE4iTABMBaaBMk94YWhmUXYTZ8y/DoLONb3TvgCXVpfkpMPMVEYAjAk3EwGEi8AGkXIiADiSGn+UMLJkUk1Nw0pWJ9N/r0F2vdbAWi4mEKjYM3feG1qE2MkOvneTkwiJiq+6263Jffq0Vg3/IwC/Pg+KcOvCr0Oqjv6RT0cjVz00D+N9aBvzBpYyWnztqrv/pU2bwo7PF6G7Z1ENZ6jf17JzoC5p7KLLFZ0IANx4RSPwEUtlss51VJcOtIam3lkC9/jr2diV4Yup2vJC2jSUCckRQ1/6VcTkCtrB+44oVoxwZAAPGWFH8Hp+FJWZwmYaFlZ4Dn8kDcTNkwXCoxkvO2bMcqWVhsIPTgWXXzrrnxK59cxIvdWc/mReU7NLQ4vMz173nvAQqtdEISjWAf7YCPjxngX/5uaO699ffMltHTphsqU/5at9188XdfZaBSPRF4v2bCjA3mWCgEyct9y3EjpUpK9NOZqx0AVuz9tFM0tm7mHT270mmHzgIM7/7G9j98Efx3vkufOI2wF+aBUwAWgjQbgEkCVkB6Ngb7aS61yk1lbrTqsQ+Yz3F51ZSaid8L8FCO0G+bmoszo0howTc3kNoXO+wy5vYkEX7+Tkk8UlI+x17TCINrYzUqiaIzArf4yk+Xb+D/K4hMNr/mIepG3meXwU600tp+OIx2vryT0x2tmfy1e0y4Ut5DmAyAKiFSaCpWTKvl5+FbmSXf0IA8c9dIosjASaCqQgRzCBO78L23vmks28Bpz9wMOn+zkew+6sfw32LC/SJfQCHF0rgtxpAxRZBuyCGJhkUkpAjBiaCVnHdkcBvt5yufzdr/vsQHAk5ZnP/shYvOR27tISNFwbDQMRn3sjIPRBh2BIO5xgJfga+k7yRE1BWh6Sgka+JSk0O9Mrw3wmv9az0Ac6upzR48Zipga/WCuAPwaQZgMkD4KcMdGHpGfiivMfgnxDATegNBB5BtxAmgllLBPNz1iNYwJbVu37v4zjzkY/grn0H6bG9gIfnARc7HhlgQiXA2wkTAQOdLAHwPc8L6Djd8omFSQAdCVBFODgiAfYCSpEfEOHDmI5Ah35h/ZtEIEISB/BmU08tLiTQOUgyqC09FWcGePm+C6+onvl3uQUaGoCXrpfgp7W1vtl+5iXa+tJrpPppAPwSyMLqS0lZ2NVn8Zs7PZkQwM3gDciwIEIEXcTpWWwvzGP7trmkvTCXdH/zQzjz+Idh6uFH4KHdiNYjwId2A7K7zmRQghpHYQOTAjEBON1xutURnoDvcTTAnnBIwGQANCIFiuCfvAODnq0/ij4AZYjLf8Lld5Jb4V18whvQGkez+5xYJNBs7a2wpwHWzafX+hXw09NnaPvZV83wmbOk+0OTrw3JbBfAT53FF1ZfgN7pILOvxlh9mhDAzecNsDgScHrKkcE0S4MQku4MtuZ3J+09lgwWrWdwaA/OfPKxpPvY47B3cQEemgN4bBFwoVMBtBHTQ0Js9VvI4B8RBnnWv90AfduRQiJzAg78kgSAddz4ewQQ9CQEJUpOSAZ7+PIaxEEYUFl4jts9D4FGpAAGwZig/NjLAR3oYW1twwyPnzTD7/yUis491R+SLmQzbcT4SgKfwc6a3f0A+Prmd/cnBBD3BljaQWgw3fQKmBCSriWAXdiasySwbw5bu2eT7q8/iDMf/TB27nsIbp+bhsIreHA3QEEGzQSeFSyvaw8AR8/awu0nmRBsegAdnwDYA/AIYCcSkIlAktN7pHzLrP1efiYFBnQQEtDoDOTeacb1vbzs06cC9FdSoPSnJ2F47G0zePqU0dspqfWyZEtmOwNSylnvqNXncwT4oqZ/C4B/QgCS/OJhgcwRsGYiAOx0k/a8JYPF3dhe2I2t7jR2P/lI0j38wYIMyJIBPrIAcO8swIHpkdVOEtZQaKQG0JkUGPBOnLeA4H4H8H1k0HvnseLPBUgiCFqbmQQQKCxjmloTX1sBXr7C2gqt5wAW9PB6D/BK4cm//Q6lr71Nw++fInVly+iNlFRp7YdAuQIwNfBVkLgbMgH4wu+Ikp6+lYE/IQAWjIQFoUcwJckAunydTGMy0y28AWzvnbOkMItJtwszv/WhZOrwB2Hq/gdxz65puGcWoPAMipJiNxmV7xJkgfKafKJA9N7xYv/gI6dcASDB8uNDAWTgh5t7jdOiEkCeR0CEAN57Xmt0CXg6vw14yurrWyllp96h7K2LNHz2NOVXtsouTdUrQU9mmDvQO2GLHwgTgAS9TPBFOq75ekIAt2xYwNWCeGggkobinExbIrBkMLcL2wuzSWuuJAPsHD4EM489jJ177sH2obvhoH3dTiRaUigJIekmDshs0RNX9gN0103rz180shLzAN6bF2D4u0yVJmoSAC9EqcFNgQaXub8yLOv1cGEAaIFP6uoq5Rcu0uCVtyl74QKZVJEuQL+eWj0sXXww2gM960wKpA2dR5J7kam9GPAnBDAJC+I5gpaVDvcSCDLosC7JYApbu7pWZrAggtb8TNLePQutPbuw8/i9OPWAJYPbDkL7zrvgYLcME9ASgyMHAW4v2y8+PBJcIr0rpqem5q8qiYdygMmbTSgtO1xNixje6WEN+CVr6S9C/tJFUmuDAvCmasPOoIjvzbB27xn4wuI7HZGAKLRI7rEWvBeVCQFMiGB8M5HMFQR6mp8l1RnbHUsElhDKcKGbtHZbYrChASYtnPr4fdi525LBoQPQ3nsAW/v3FxUFsFJ6CQvt8owHugDdRGT5mQDeA8UTK1khaHgDhVW/OgRYz4F6qjr38hL0pK+ugt7sk7q8AtnJpcrCa1MA3IK9sPAF2HOrc5fIM658p9lac4wvXX559slCWnunBc9NZEIA76GRSCQLRdKQxScFKUkHsNVGbE9BMjuNyXTtKdjzzFR5jZhA+5HbsXNwEdp3WUI4cABsKGEJ4k4EKMmAFjuA063Scyj/TCd8RkY/7Z8uSYP/VGDGlaEggdJ6p6a6XkmBhhrQCtn75T21dAkoHRq1vAL62gaolR5lP75IpA2YXFG5km0zr/YzDrIqltcayLjkm2fttXD1WbLINb8fWnsWev+BPyGACVEyCUBNAhHPoBPoKdbyuSOEFgB2EDttKAggmepg0u1Y0E8hTtvzVBuKe4AIiIXHcDcAIbQsQbT2LiACULJnHpK5edEC0LrzzkIJ0UtLwhEw/T7o6/3q+Zo9X1kvHliQ23e1oeKPyTRQpsikugR4oUkpq5XVmgFvGJwMVCXES9hJsPNZxvY3UDlvQgCTPAF7BaxFuCC1lBZA0i5IAbFdtQHZA+CUvU4K3cak0wJst60kCK3iXLybAJbvukIixRaHS3i4PD6RJiBlCiEyTucGSlGaTAnw+nl1ZrBbDUL7oGXQy7O8F3gKRrr5chfE/7Z3BisIAzEQbdT//2Hd1uOAL2XYg6XVOQxJS8GDvEfiFgzaRwggpwZLc3pQ3WQAKdjo+Y9o/VAKtcvce0H+X8FUFUG+ckQXyNjdVQW86mp2+9Mc50UAWQ8KQCp3TgjsFchD8KPqc2ck4OEn9Pvgqwf46Ak69nlmu8yYHwFEBkYIANmGz94QMwm4CQCV8K9GAIO9wlG+Bx7CyY96EcDFUqpeCBQDQVdv4VedF4DA8gJgCPToqgE+0EcAP5ViTzg7gE2K1xTAvow8/OqNBHQ91HvQu33+317YiQAigzJiKA84e4K+PwUY+CGBrrf3mEU1O30EEAEXKqDt45/z0vciILyIAZ010EcACeH0pwybejPiTwvAnwz4e4Q9wJ8vjzB3kngoNsBPqGtOKIyH1UsisGcCSL6fOu575Us2AT0CSCLyQH/xvAEXjFQOmDUPtAAAAABJRU5ErkJggg==);} diff --git a/demo/index.js b/demo/index.js index c4cf54a3..b0d4ca51 100644 --- a/demo/index.js +++ b/demo/index.js @@ -9,7 +9,7 @@ import webRTC from './helpers/webrtc.js'; let human; const userConfig = { - warmup: 'full', + warmup: 'none', /* backend: 'webgl', async: false, @@ -47,6 +47,7 @@ const ui = { modelsPreload: true, // preload human models on startup modelsWarmup: true, // warmup human models on startup buffered: true, // should output be buffered between frames + iconSize: '48px', // ui icon sizes // internal variables busy: false, // internal camera busy flag @@ -222,11 +223,14 @@ async function drawResults(input) { } // draw all results + human.draw.all(canvas, result); + /* use individual functions human.draw.face(canvas, result.face); human.draw.body(canvas, result.body); human.draw.hand(canvas, result.hand); human.draw.object(canvas, result.object); human.draw.gesture(canvas, result.gesture); + */ await calcSimmilariry(result); // update log @@ -653,6 +657,8 @@ async function main() { log('demo starting ...'); + document.documentElement.style.setProperty('--icon-size', ui.iconSize); + // parse url search params const params = new URLSearchParams(location.search); log('url options:', params.toString()); diff --git a/dist/human.esm-nobundle.js b/dist/human.esm-nobundle.js index ffbefdaa..6b1f6b13 100644 --- a/dist/human.esm-nobundle.js +++ b/dist/human.esm-nobundle.js @@ -5,18843 +5,14 @@ author: ' */ -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all2) => { - for (var name in all2) - __defProp(target, name, { get: all2[name], enumerable: true }); -}; -var __reExport = (target, module, desc) => { - if (module && typeof module === "object" || typeof module === "function") { - for (let key of __getOwnPropNames(module)) - if (!__hasOwnProp.call(target, key) && key !== "default") - __defProp(target, key, { get: () => module[key], enumerable: !(desc = __getOwnPropDesc(module, key)) || desc.enumerable }); - } - return target; -}; -var __accessCheck = (obj, member, msg) => { - if (!member.has(obj)) - throw TypeError("Cannot " + msg); -}; -var __privateGet = (obj, member, getter) => { - __accessCheck(obj, member, "read from private field"); - return getter ? getter.call(obj) : member.get(obj); -}; -var __privateAdd = (obj, member, value) => { - if (member.has(obj)) - throw TypeError("Cannot add the same private member more than once"); - member instanceof WeakSet ? member.add(obj) : member.set(obj, value); -}; -var __privateSet = (obj, member, value, setter) => { - __accessCheck(obj, member, "write to private field"); - setter ? setter.call(obj, value) : member.set(obj, value); - return value; -}; - -// src/helpers.ts -function join(folder, file) { - const separator = folder.endsWith("/") ? "" : "/"; - const skipJoin = file.startsWith(".") || file.startsWith("/") || file.startsWith("http:") || file.startsWith("https:") || file.startsWith("file:"); - const path = skipJoin ? `${file}` : `${folder}${separator}${file}`; - if (!path.toLocaleLowerCase().includes(".json")) - throw new Error(`Human: ModelPath Error: ${path} Expecting JSON file`); - return path; -} -function log(...msg) { - const dt = new Date(); - const ts = `${dt.getHours().toString().padStart(2, "0")}:${dt.getMinutes().toString().padStart(2, "0")}:${dt.getSeconds().toString().padStart(2, "0")}.${dt.getMilliseconds().toString().padStart(3, "0")}`; - if (msg) - console.log(ts, "Human:", ...msg); -} -var now = () => { - if (typeof performance !== "undefined") - return performance.now(); - return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString()); -}; -function mergeDeep(...objects) { - const isObject = (obj) => obj && typeof obj === "object"; - return objects.reduce((prev, obj) => { - Object.keys(obj || {}).forEach((key) => { - const pVal = prev[key]; - const oVal = obj[key]; - if (Array.isArray(pVal) && Array.isArray(oVal)) - prev[key] = pVal.concat(...oVal); - else if (isObject(pVal) && isObject(oVal)) - prev[key] = mergeDeep(pVal, oVal); - else - prev[key] = oVal; - }); - return prev; - }, {}); -} - -// src/config.ts -var config = { - backend: "webgl", - modelBasePath: "../models/", - wasmPath: "../node_modules/@tensorflow/tfjs-backend-wasm/dist//", - debug: true, - async: true, - warmup: "full", - cacheSensitivity: 0.01, - filter: { - enabled: true, - width: 0, - height: 0, - flip: false, - return: true, - brightness: 0, - contrast: 0, - sharpness: 0, - blur: 0, - saturation: 0, - hue: 0, - negative: false, - sepia: false, - vintage: false, - kodachrome: false, - technicolor: false, - polaroid: false, - pixelate: 0 - }, - gesture: { - enabled: true - }, - face: { - enabled: true, - detector: { - modelPath: "blazeface.json", - rotation: false, - maxDetected: 10, - skipFrames: 21, - minConfidence: 0.2, - iouThreshold: 0.1, - return: false - }, - mesh: { - enabled: true, - modelPath: "facemesh.json" - }, - iris: { - enabled: true, - modelPath: "iris.json" - }, - description: { - enabled: true, - modelPath: "faceres.json", - skipFrames: 31, - minConfidence: 0.1 - }, - emotion: { - enabled: true, - minConfidence: 0.1, - skipFrames: 32, - modelPath: "emotion.json" - } - }, - body: { - enabled: true, - modelPath: "posenet.json", - maxDetected: 1, - minConfidence: 0.1 - }, - hand: { - enabled: true, - rotation: false, - skipFrames: 32, - minConfidence: 0.1, - iouThreshold: 0.1, - maxDetected: 2, - landmarks: true, - detector: { - modelPath: "handdetect.json" - }, - skeleton: { - modelPath: "handskeleton.json" - } - }, - object: { - enabled: false, - modelPath: "mb3-centernet.json", - minConfidence: 0.2, - iouThreshold: 0.4, - maxDetected: 10, - skipFrames: 41 - } -}; - -// src/sysinfo.ts -function info() { - let platform; - let agent; - if (typeof navigator !== "undefined") { - const raw = navigator.userAgent.match(/\(([^()]+)\)/g); - if (raw && raw[0]) { - const platformMatch = raw[0].match(/\(([^()]+)\)/g); - platform = platformMatch ? platformMatch[0].replace(/\(|\)/g, "") : ""; - agent = navigator.userAgent.replace(raw[0], ""); - if (platform[1]) - agent = agent.replace(raw[1], ""); - agent = agent.replace(/ /g, " "); - } - } else if (typeof process !== "undefined") { - platform = `${process.platform} ${process.arch}`; - agent = `NodeJS ${process.version}`; - } - return { platform, agent }; -} - -// dist/tfjs.esm.js -var tfjs_esm_exports = {}; -__export(tfjs_esm_exports, { - data: () => data, - version: () => version -}); -__reExport(tfjs_esm_exports, dist_star); -__reExport(tfjs_esm_exports, dist_star2); -__reExport(tfjs_esm_exports, dist_star3); -__reExport(tfjs_esm_exports, dist_star4); -__reExport(tfjs_esm_exports, dist_star5); -__reExport(tfjs_esm_exports, dist_star6); -import * as packageBundle from "@tensorflow/tfjs/package.json"; -import * as packageCore from "@tensorflow/tfjs-core/package.json"; -import * as packageData from "@tensorflow/tfjs-data/package.json"; -import * as packageLayers from "@tensorflow/tfjs-layers/package.json"; -import * as packageConverter from "@tensorflow/tfjs-converter/package.json"; -import { version_cpu } from "@tensorflow/tfjs-backend-cpu/dist/index.js"; -import { version_webgl } from "@tensorflow/tfjs-backend-webgl/dist/index.js"; -import { version_wasm } from "@tensorflow/tfjs-backend-wasm/dist/index.js"; -import * as dist_star from "@tensorflow/tfjs-core/dist/index.js"; -import * as dist_star2 from "@tensorflow/tfjs-layers/dist/index.js"; -import * as dist_star3 from "@tensorflow/tfjs-converter/dist/index.js"; -import * as data from "@tensorflow/tfjs-data/dist/index.js"; -import * as dist_star4 from "@tensorflow/tfjs-backend-cpu/dist/index.js"; -import * as dist_star5 from "@tensorflow/tfjs-backend-webgl/dist/index.js"; -import * as dist_star6 from "@tensorflow/tfjs-backend-wasm/dist/index.js"; -var version = { - tfjs: (packageBundle == null ? void 0 : packageBundle.version) || void 0, - "tfjs-core": (packageCore == null ? void 0 : packageCore.version) || void 0, - "tfjs-data": (packageData == null ? void 0 : packageData.version) || void 0, - "tfjs-layers": (packageLayers == null ? void 0 : packageLayers.version) || void 0, - "tfjs-converter": (packageConverter == null ? void 0 : packageConverter.version) || void 0, - "tfjs-backend-cpu": version_cpu || void 0, - "tfjs-backend-webgl": version_webgl || void 0, - "tfjs-backend-wasm": version_wasm || void 0 -}; - -// src/tfjs/backend.ts -var config2 = { - name: "humangl", - priority: 99, - canvas: null, - gl: null, - width: 1024, - height: 1024, - webGLattr: { - alpha: false, - antialias: false, - premultipliedAlpha: false, - preserveDrawingBuffer: false, - depth: false, - stencil: false, - failIfMajorPerformanceCaveat: false, - desynchronized: true - } -}; -function register() { - if (!tfjs_esm_exports.findBackend(config2.name)) { - log("backend registration:", config2.name); - try { - config2.canvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(config2.width, config2.height) : document.createElement("canvas"); - } catch (err) { - log("error: cannot create canvas:", err); - return; - } - try { - config2.gl = config2.canvas.getContext("webgl2", config2.webGLattr); - } catch (err) { - log("error: cannot get WebGL2 context:", err); - return; - } - try { - tfjs_esm_exports.setWebGLContext(2, config2.gl); - } catch (err) { - log("error: cannot set WebGL2 context:", err); - return; - } - try { - const ctx = new tfjs_esm_exports.GPGPUContext(config2.gl); - tfjs_esm_exports.registerBackend(config2.name, () => new tfjs_esm_exports.MathBackendWebGL(ctx), config2.priority); - } catch (err) { - log("error: cannot register WebGL backend:", err); - return; - } - try { - const kernels = tfjs_esm_exports.getKernelsForBackend("webgl"); - kernels.forEach((kernelConfig) => { - const newKernelConfig = { ...kernelConfig, backendName: config2.name }; - tfjs_esm_exports.registerKernel(newKernelConfig); - }); - } catch (err) { - log("error: cannot update WebGL backend registration:", err); - return; - } - try { - tfjs_esm_exports.ENV.set("WEBGL_VERSION", 2); - } catch (err) { - log("error: cannot set WebGL backend flags:", err); - return; - } - log("backend registered:", config2.name); - } -} - -// src/blazeface/facemesh.ts -var facemesh_exports = {}; -__export(facemesh_exports, { - load: () => load2, - predict: () => predict, - triangulation: () => triangulation, - uvmap: () => uvmap -}); - -// src/blazeface/box.ts -function scaleBoxCoordinates(box4, factor) { - const startPoint = [box4.startPoint[0] * factor[0], box4.startPoint[1] * factor[1]]; - const endPoint = [box4.endPoint[0] * factor[0], box4.endPoint[1] * factor[1]]; - return { startPoint, endPoint }; -} -function getBoxSize(box4) { - return [ - Math.abs(box4.endPoint[0] - box4.startPoint[0]), - Math.abs(box4.endPoint[1] - box4.startPoint[1]) - ]; -} -function getBoxCenter(box4) { - return [ - box4.startPoint[0] + (box4.endPoint[0] - box4.startPoint[0]) / 2, - box4.startPoint[1] + (box4.endPoint[1] - box4.startPoint[1]) / 2 - ]; -} -function cutBoxFromImageAndResize(box4, image13, cropSize) { - const h = image13.shape[1]; - const w = image13.shape[2]; - const boxes = [[ - box4.startPoint[1] / h, - box4.startPoint[0] / w, - box4.endPoint[1] / h, - box4.endPoint[0] / w - ]]; - return tfjs_esm_exports.image.cropAndResize(image13, boxes, [0], cropSize); -} -function enlargeBox(box4, factor = 1.5) { - const center = getBoxCenter(box4); - const size = getBoxSize(box4); - const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2]; - const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]]; - const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]]; - return { startPoint, endPoint, landmarks: box4.landmarks }; -} -function squarifyBox(box4) { - const centers = getBoxCenter(box4); - const size = getBoxSize(box4); - const maxEdge = Math.max(...size); - const halfSize = maxEdge / 2; - const startPoint = [Math.round(centers[0] - halfSize), Math.round(centers[1] - halfSize)]; - const endPoint = [Math.round(centers[0] + halfSize), Math.round(centers[1] + halfSize)]; - return { startPoint, endPoint, landmarks: box4.landmarks }; -} -function calculateLandmarksBoundingBox(landmarks) { - const xs = landmarks.map((d) => d[0]); - const ys = landmarks.map((d) => d[1]); - const startPoint = [Math.min(...xs), Math.min(...ys)]; - const endPoint = [Math.max(...xs), Math.max(...ys)]; - return { startPoint, endPoint, landmarks }; -} -var createBox = (startEndTensor) => ({ - startPoint: tfjs_esm_exports.slice(startEndTensor, [0, 0], [-1, 2]), - endPoint: tfjs_esm_exports.slice(startEndTensor, [0, 2], [-1, 2]) -}); - -// src/blazeface/util.ts -var IDENTITY_MATRIX = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]; -function normalizeRadians(angle) { - return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI)); -} -function computeRotation(point1, point2) { - const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]); - return normalizeRadians(radians); -} -function buildTranslationMatrix(x, y) { - return [[1, 0, x], [0, 1, y], [0, 0, 1]]; -} -function dot(v1, v2) { - let product = 0; - for (let i = 0; i < v1.length; i++) { - product += v1[i] * v2[i]; - } - return product; -} -function getColumnFrom2DArr(arr, columnIndex) { - const column = []; - for (let i = 0; i < arr.length; i++) { - column.push(arr[i][columnIndex]); - } - return column; -} -function multiplyTransformMatrices(mat1, mat2) { - const product = []; - const size = mat1.length; - for (let row = 0; row < size; row++) { - product.push([]); - for (let col = 0; col < size; col++) { - product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col))); - } - } - return product; -} -function buildRotationMatrix(rotation, center) { - const cosA = Math.cos(rotation); - const sinA = Math.sin(rotation); - const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]]; - const translationMatrix = buildTranslationMatrix(center[0], center[1]); - const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix); - const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]); - return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix); -} -function invertTransformMatrix(matrix) { - const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]]; - const translationComponent = [matrix[0][2], matrix[1][2]]; - const invertedTranslation = [ - -dot(rotationComponent[0], translationComponent), - -dot(rotationComponent[1], translationComponent) - ]; - return [ - rotationComponent[0].concat(invertedTranslation[0]), - rotationComponent[1].concat(invertedTranslation[1]), - [0, 0, 1] - ]; -} -function rotatePoint(homogeneousCoordinate, rotationMatrix) { - return [ - dot(homogeneousCoordinate, rotationMatrix[0]), - dot(homogeneousCoordinate, rotationMatrix[1]) - ]; -} -function generateAnchors(inputSize) { - const spec = { strides: [inputSize / 16, inputSize / 8], anchors: [2, 6] }; - const anchors3 = []; - for (let i = 0; i < spec.strides.length; i++) { - const stride = spec.strides[i]; - const gridRows = Math.floor((inputSize + stride - 1) / stride); - const gridCols = Math.floor((inputSize + stride - 1) / stride); - const anchorsNum = spec.anchors[i]; - for (let gridY = 0; gridY < gridRows; gridY++) { - const anchorY = stride * (gridY + 0.5); - for (let gridX = 0; gridX < gridCols; gridX++) { - const anchorX = stride * (gridX + 0.5); - for (let n = 0; n < anchorsNum; n++) { - anchors3.push([anchorX, anchorY]); - } - } - } - } - return anchors3; -} - -// src/blazeface/blazeface.ts -var keypointsCount = 6; -function decodeBounds(boxOutputs, anchors3, inputSize) { - const boxStarts = tfjs_esm_exports.slice(boxOutputs, [0, 1], [-1, 2]); - const centers = tfjs_esm_exports.add(boxStarts, anchors3); - const boxSizes = tfjs_esm_exports.slice(boxOutputs, [0, 3], [-1, 2]); - const boxSizesNormalized = tfjs_esm_exports.div(boxSizes, inputSize); - const centersNormalized = tfjs_esm_exports.div(centers, inputSize); - const halfBoxSize = tfjs_esm_exports.div(boxSizesNormalized, 2); - const starts = tfjs_esm_exports.sub(centersNormalized, halfBoxSize); - const ends = tfjs_esm_exports.add(centersNormalized, halfBoxSize); - const startNormalized = tfjs_esm_exports.mul(starts, inputSize); - const endNormalized = tfjs_esm_exports.mul(ends, inputSize); - const concatAxis = 1; - return tfjs_esm_exports.concat2d([startNormalized, endNormalized], concatAxis); -} -var BlazeFaceModel = class { - constructor(model7, config3) { - this.model = model7; - this.anchorsData = generateAnchors(model7.inputs[0].shape[1]); - this.anchors = tfjs_esm_exports.tensor2d(this.anchorsData); - this.inputSize = model7.inputs[0].shape[2]; - this.config = config3; - } - async getBoundingBoxes(inputImage) { - if (!inputImage || inputImage.isDisposedInternal || inputImage.shape.length !== 4 || inputImage.shape[1] < 1 || inputImage.shape[2] < 1) - return null; - const [batch, boxes, scores] = tfjs_esm_exports.tidy(() => { - const resizedImage = inputImage.resizeBilinear([this.inputSize, this.inputSize]); - const normalizedImage = resizedImage.div(127.5).sub(0.5); - const res = this.model.execute(normalizedImage); - let batchOut; - if (Array.isArray(res)) { - const sorted = res.sort((a, b) => a.size - b.size); - const concat384 = tfjs_esm_exports.concat([sorted[0], sorted[2]], 2); - const concat512 = tfjs_esm_exports.concat([sorted[1], sorted[3]], 2); - const concat3 = tfjs_esm_exports.concat([concat512, concat384], 1); - batchOut = concat3.squeeze(0); - } else { - batchOut = res.squeeze(); - } - const boxesOut = decodeBounds(batchOut, this.anchors, [this.inputSize, this.inputSize]); - const logits = tfjs_esm_exports.slice(batchOut, [0, 0], [-1, 1]); - const scoresOut = tfjs_esm_exports.sigmoid(logits).squeeze().dataSync(); - return [batchOut, boxesOut, scoresOut]; - }); - const nmsTensor = await tfjs_esm_exports.image.nonMaxSuppressionAsync(boxes, scores, this.config.face.detector.maxDetected, this.config.face.detector.iouThreshold, this.config.face.detector.minConfidence); - const nms = nmsTensor.arraySync(); - nmsTensor.dispose(); - const annotatedBoxes = []; - for (let i = 0; i < nms.length; i++) { - const confidence = scores[nms[i]]; - if (confidence > this.config.face.detector.minConfidence) { - const boundingBox = tfjs_esm_exports.slice(boxes, [nms[i], 0], [1, -1]); - const localBox = createBox(boundingBox); - boundingBox.dispose(); - const anchor = this.anchorsData[nms[i]]; - const landmarks = tfjs_esm_exports.tidy(() => tfjs_esm_exports.slice(batch, [nms[i], keypointsCount - 1], [1, -1]).squeeze().reshape([keypointsCount, -1])); - annotatedBoxes.push({ box: localBox, landmarks, anchor, confidence }); - } - } - batch.dispose(); - boxes.dispose(); - return { - boxes: annotatedBoxes, - scaleFactor: [inputImage.shape[2] / this.inputSize, inputImage.shape[1] / this.inputSize] - }; - } -}; -async function load(config3) { - const model7 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.face.detector.modelPath), { fromTFHub: config3.face.detector.modelPath.includes("tfhub.dev") }); - const blazeFace = new BlazeFaceModel(model7, config3); - if (!model7 || !model7.modelUrl) - log("load model failed:", config3.face.detector.modelPath); - else if (config3.debug) - log("load model:", model7.modelUrl); - return blazeFace; -} - -// src/blazeface/coords.ts -var MESH_ANNOTATIONS = { - silhouette: [ - 10, - 338, - 297, - 332, - 284, - 251, - 389, - 356, - 454, - 323, - 361, - 288, - 397, - 365, - 379, - 378, - 400, - 377, - 152, - 148, - 176, - 149, - 150, - 136, - 172, - 58, - 132, - 93, - 234, - 127, - 162, - 21, - 54, - 103, - 67, - 109 - ], - lipsUpperOuter: [61, 185, 40, 39, 37, 0, 267, 269, 270, 409, 291], - lipsLowerOuter: [146, 91, 181, 84, 17, 314, 405, 321, 375, 291], - lipsUpperInner: [78, 191, 80, 81, 82, 13, 312, 311, 310, 415, 308], - lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308], - rightEyeUpper0: [246, 161, 160, 159, 158, 157, 173], - rightEyeLower0: [33, 7, 163, 144, 145, 153, 154, 155, 133], - rightEyeUpper1: [247, 30, 29, 27, 28, 56, 190], - rightEyeLower1: [130, 25, 110, 24, 23, 22, 26, 112, 243], - rightEyeUpper2: [113, 225, 224, 223, 222, 221, 189], - rightEyeLower2: [226, 31, 228, 229, 230, 231, 232, 233, 244], - rightEyeLower3: [143, 111, 117, 118, 119, 120, 121, 128, 245], - rightEyebrowUpper: [156, 70, 63, 105, 66, 107, 55, 193], - rightEyebrowLower: [35, 124, 46, 53, 52, 65], - rightEyeIris: [473, 474, 475, 476, 477], - leftEyeUpper0: [466, 388, 387, 386, 385, 384, 398], - leftEyeLower0: [263, 249, 390, 373, 374, 380, 381, 382, 362], - leftEyeUpper1: [467, 260, 259, 257, 258, 286, 414], - leftEyeLower1: [359, 255, 339, 254, 253, 252, 256, 341, 463], - leftEyeUpper2: [342, 445, 444, 443, 442, 441, 413], - leftEyeLower2: [446, 261, 448, 449, 450, 451, 452, 453, 464], - leftEyeLower3: [372, 340, 346, 347, 348, 349, 350, 357, 465], - leftEyebrowUpper: [383, 300, 293, 334, 296, 336, 285, 417], - leftEyebrowLower: [265, 353, 276, 283, 282, 295], - leftEyeIris: [468, 469, 470, 471, 472], - midwayBetweenEyes: [168], - noseTip: [1], - noseBottom: [2], - noseRightCorner: [98], - noseLeftCorner: [327], - rightCheek: [205], - leftCheek: [425] -}; -var MESH_TO_IRIS_INDICES_MAP = [ - { key: "EyeUpper0", indices: [9, 10, 11, 12, 13, 14, 15] }, - { key: "EyeUpper1", indices: [25, 26, 27, 28, 29, 30, 31] }, - { key: "EyeUpper2", indices: [41, 42, 43, 44, 45, 46, 47] }, - { key: "EyeLower0", indices: [0, 1, 2, 3, 4, 5, 6, 7, 8] }, - { key: "EyeLower1", indices: [16, 17, 18, 19, 20, 21, 22, 23, 24] }, - { key: "EyeLower2", indices: [32, 33, 34, 35, 36, 37, 38, 39, 40] }, - { key: "EyeLower3", indices: [54, 55, 56, 57, 58, 59, 60, 61, 62] } -]; -var UV468 = [ - [0.499976992607117, 0.652534008026123], - [0.500025987625122, 0.547487020492554], - [0.499974012374878, 0.602371990680695], - [0.482113003730774, 0.471979022026062], - [0.500150978565216, 0.527155995368958], - [0.499909996986389, 0.498252987861633], - [0.499523013830185, 0.40106201171875], - [0.289712011814117, 0.380764007568359], - [0.499954998493195, 0.312398016452789], - [0.499987006187439, 0.269918978214264], - [0.500023007392883, 0.107050001621246], - [0.500023007392883, 0.666234016418457], - [0.5000159740448, 0.679224014282227], - [0.500023007392883, 0.692348003387451], - [0.499976992607117, 0.695277988910675], - [0.499976992607117, 0.70593398809433], - [0.499976992607117, 0.719385027885437], - [0.499976992607117, 0.737019002437592], - [0.499967992305756, 0.781370997428894], - [0.499816000461578, 0.562981009483337], - [0.473773002624512, 0.573909997940063], - [0.104906998574734, 0.254140973091125], - [0.365929991006851, 0.409575998783112], - [0.338757991790771, 0.41302502155304], - [0.311120003461838, 0.409460008144379], - [0.274657994508743, 0.389131009578705], - [0.393361985683441, 0.403706014156342], - [0.345234006643295, 0.344011008739471], - [0.370094001293182, 0.346076011657715], - [0.319321990013123, 0.347265005111694], - [0.297903001308441, 0.353591024875641], - [0.24779200553894, 0.410809993743896], - [0.396889001131058, 0.842755019664764], - [0.280097991228104, 0.375599980354309], - [0.106310002505779, 0.399955987930298], - [0.2099249958992, 0.391353011131287], - [0.355807989835739, 0.534406006336212], - [0.471751004457474, 0.65040397644043], - [0.474155008792877, 0.680191993713379], - [0.439785003662109, 0.657229006290436], - [0.414617002010345, 0.66654098033905], - [0.450374007225037, 0.680860996246338], - [0.428770989179611, 0.682690978050232], - [0.374971002340317, 0.727805018424988], - [0.486716985702515, 0.547628998756409], - [0.485300987958908, 0.527395009994507], - [0.257764995098114, 0.314490020275116], - [0.401223003864288, 0.455172002315521], - [0.429818987846375, 0.548614978790283], - [0.421351999044418, 0.533740997314453], - [0.276895999908447, 0.532056987285614], - [0.483370006084442, 0.499586999416351], - [0.33721199631691, 0.282882988452911], - [0.296391993761063, 0.293242990970612], - [0.169294998049736, 0.193813979625702], - [0.447580009698868, 0.302609980106354], - [0.392390012741089, 0.353887975215912], - [0.354490011930466, 0.696784019470215], - [0.067304998636246, 0.730105042457581], - [0.442739009857178, 0.572826027870178], - [0.457098007202148, 0.584792017936707], - [0.381974011659622, 0.694710969924927], - [0.392388999462128, 0.694203019142151], - [0.277076005935669, 0.271932005882263], - [0.422551989555359, 0.563233017921448], - [0.385919004678726, 0.281364023685455], - [0.383103013038635, 0.255840003490448], - [0.331431001424789, 0.119714021682739], - [0.229923993349075, 0.232002973556519], - [0.364500999450684, 0.189113974571228], - [0.229622006416321, 0.299540996551514], - [0.173287004232407, 0.278747975826263], - [0.472878992557526, 0.666198015213013], - [0.446828007698059, 0.668527007102966], - [0.422762006521225, 0.673889994621277], - [0.445307999849319, 0.580065965652466], - [0.388103008270264, 0.693961024284363], - [0.403039008378983, 0.706539988517761], - [0.403629004955292, 0.693953037261963], - [0.460041999816895, 0.557139039039612], - [0.431158006191254, 0.692366003990173], - [0.452181994915009, 0.692366003990173], - [0.475387006998062, 0.692366003990173], - [0.465828001499176, 0.779190003871918], - [0.472328990697861, 0.736225962638855], - [0.473087012767792, 0.717857003211975], - [0.473122000694275, 0.704625964164734], - [0.473033010959625, 0.695277988910675], - [0.427942007780075, 0.695277988910675], - [0.426479011774063, 0.703539967536926], - [0.423162013292313, 0.711845993995667], - [0.4183090031147, 0.720062971115112], - [0.390094995498657, 0.639572978019714], - [0.013953999616206, 0.560034036636353], - [0.499913990497589, 0.58014702796936], - [0.413199990987778, 0.69539999961853], - [0.409626007080078, 0.701822996139526], - [0.468080013990402, 0.601534962654114], - [0.422728985548019, 0.585985004901886], - [0.463079988956451, 0.593783974647522], - [0.37211999297142, 0.47341400384903], - [0.334562003612518, 0.496073007583618], - [0.411671012639999, 0.546965003013611], - [0.242175996303558, 0.14767599105835], - [0.290776997804642, 0.201445996761322], - [0.327338010072708, 0.256527006626129], - [0.399509996175766, 0.748921036720276], - [0.441727995872498, 0.261676013469696], - [0.429764986038208, 0.187834024429321], - [0.412198007106781, 0.108901023864746], - [0.288955003023148, 0.398952007293701], - [0.218936994671822, 0.435410976409912], - [0.41278201341629, 0.398970007896423], - [0.257135003805161, 0.355440020561218], - [0.427684992551804, 0.437960982322693], - [0.448339998722076, 0.536936044692993], - [0.178560003638268, 0.45755398273468], - [0.247308000922203, 0.457193970680237], - [0.286267012357712, 0.467674970626831], - [0.332827985286713, 0.460712015628815], - [0.368755996227264, 0.447206974029541], - [0.398963987827301, 0.432654976844788], - [0.476410001516342, 0.405806005001068], - [0.189241006970406, 0.523923993110657], - [0.228962004184723, 0.348950982093811], - [0.490725994110107, 0.562400996685028], - [0.404670000076294, 0.485132992267609], - [0.019469000399113, 0.401564002037048], - [0.426243007183075, 0.420431017875671], - [0.396993011236191, 0.548797011375427], - [0.266469985246658, 0.376977026462555], - [0.439121007919312, 0.51895797252655], - [0.032313998788595, 0.644356966018677], - [0.419054001569748, 0.387154996395111], - [0.462783008813858, 0.505746960639954], - [0.238978996872902, 0.779744982719421], - [0.198220998048782, 0.831938028335571], - [0.107550002634525, 0.540755033493042], - [0.183610007166862, 0.740257024765015], - [0.134409993886948, 0.333683013916016], - [0.385764002799988, 0.883153975009918], - [0.490967005491257, 0.579378008842468], - [0.382384985685349, 0.508572995662689], - [0.174399003386497, 0.397670984268188], - [0.318785011768341, 0.39623498916626], - [0.343364000320435, 0.400596976280212], - [0.396100014448166, 0.710216999053955], - [0.187885001301765, 0.588537991046906], - [0.430987000465393, 0.944064974784851], - [0.318993002176285, 0.898285031318665], - [0.266247987747192, 0.869701027870178], - [0.500023007392883, 0.190576016902924], - [0.499976992607117, 0.954452991485596], - [0.366169989109039, 0.398822009563446], - [0.393207013607025, 0.39553701877594], - [0.410373002290726, 0.391080021858215], - [0.194993004202843, 0.342101991176605], - [0.388664990663528, 0.362284004688263], - [0.365961998701096, 0.355970978736877], - [0.343364000320435, 0.355356991291046], - [0.318785011768341, 0.35834002494812], - [0.301414996385574, 0.363156020641327], - [0.058132998645306, 0.319076001644135], - [0.301414996385574, 0.387449026107788], - [0.499987989664078, 0.618434011936188], - [0.415838003158569, 0.624195992946625], - [0.445681989192963, 0.566076993942261], - [0.465844005346298, 0.620640993118286], - [0.49992299079895, 0.351523995399475], - [0.288718998432159, 0.819945991039276], - [0.335278987884521, 0.852819979190826], - [0.440512001514435, 0.902418971061707], - [0.128294005990028, 0.791940987110138], - [0.408771991729736, 0.373893976211548], - [0.455606997013092, 0.451801002025604], - [0.499877005815506, 0.908990025520325], - [0.375436991453171, 0.924192011356354], - [0.11421000212431, 0.615022003650665], - [0.448662012815475, 0.695277988910675], - [0.4480200111866, 0.704632043838501], - [0.447111994028091, 0.715808033943176], - [0.444831997156143, 0.730794012546539], - [0.430011987686157, 0.766808986663818], - [0.406787008047104, 0.685672998428345], - [0.400738000869751, 0.681069016456604], - [0.392399996519089, 0.677703022956848], - [0.367855995893478, 0.663918972015381], - [0.247923001646996, 0.601333022117615], - [0.452769994735718, 0.420849978923798], - [0.43639200925827, 0.359887003898621], - [0.416164010763168, 0.368713974952698], - [0.413385987281799, 0.692366003990173], - [0.228018000721931, 0.683571994304657], - [0.468268007040024, 0.352671027183533], - [0.411361992359161, 0.804327011108398], - [0.499989002943039, 0.469825029373169], - [0.479153990745544, 0.442654013633728], - [0.499974012374878, 0.439637005329132], - [0.432112008333206, 0.493588984012604], - [0.499886006116867, 0.866917014122009], - [0.49991300702095, 0.821729004383087], - [0.456548988819122, 0.819200992584229], - [0.344549000263214, 0.745438992977142], - [0.37890899181366, 0.574010014533997], - [0.374292999505997, 0.780184984207153], - [0.319687992334366, 0.570737957954407], - [0.357154995203018, 0.604269981384277], - [0.295284003019333, 0.621580958366394], - [0.447750002145767, 0.862477004528046], - [0.410986006259918, 0.508723020553589], - [0.31395098567009, 0.775308012962341], - [0.354128003120422, 0.812552988529205], - [0.324548006057739, 0.703992962837219], - [0.189096003770828, 0.646299958229065], - [0.279776990413666, 0.71465802192688], - [0.1338230073452, 0.682700991630554], - [0.336768001317978, 0.644733011722565], - [0.429883986711502, 0.466521978378296], - [0.455527991056442, 0.548622965812683], - [0.437114000320435, 0.558896005153656], - [0.467287987470627, 0.529924988746643], - [0.414712011814117, 0.335219979286194], - [0.37704598903656, 0.322777986526489], - [0.344107985496521, 0.320150971412659], - [0.312875986099243, 0.32233202457428], - [0.283526003360748, 0.333190023899078], - [0.241245999932289, 0.382785975933075], - [0.102986000478268, 0.468762993812561], - [0.267612010240555, 0.424560010433197], - [0.297879010438919, 0.433175981044769], - [0.333433985710144, 0.433878004550934], - [0.366427004337311, 0.426115989685059], - [0.396012008190155, 0.416696012020111], - [0.420121014118195, 0.41022801399231], - [0.007561000064015, 0.480777025222778], - [0.432949006557465, 0.569517970085144], - [0.458638995885849, 0.479089021682739], - [0.473466008901596, 0.545744001865387], - [0.476087987422943, 0.563830018043518], - [0.468472003936768, 0.555056989192963], - [0.433990985155106, 0.582361996173859], - [0.483518004417419, 0.562983989715576], - [0.482482999563217, 0.57784903049469], - [0.42645001411438, 0.389798998832703], - [0.438998997211456, 0.39649498462677], - [0.450067013502121, 0.400434017181396], - [0.289712011814117, 0.368252992630005], - [0.276670008897781, 0.363372981548309], - [0.517862021923065, 0.471948027610779], - [0.710287988185883, 0.380764007568359], - [0.526226997375488, 0.573909997940063], - [0.895093023777008, 0.254140973091125], - [0.634069979190826, 0.409575998783112], - [0.661242008209229, 0.41302502155304], - [0.688880026340485, 0.409460008144379], - [0.725341975688934, 0.389131009578705], - [0.606630027294159, 0.40370500087738], - [0.654766023159027, 0.344011008739471], - [0.629905998706818, 0.346076011657715], - [0.680678009986877, 0.347265005111694], - [0.702096998691559, 0.353591024875641], - [0.75221198797226, 0.410804986953735], - [0.602918028831482, 0.842862963676453], - [0.719901978969574, 0.375599980354309], - [0.893692970275879, 0.399959981441498], - [0.790081977844238, 0.391354024410248], - [0.643998026847839, 0.534487962722778], - [0.528249025344849, 0.65040397644043], - [0.525849997997284, 0.680191040039062], - [0.560214996337891, 0.657229006290436], - [0.585384011268616, 0.66654098033905], - [0.549625992774963, 0.680860996246338], - [0.57122802734375, 0.682691991329193], - [0.624852001667023, 0.72809898853302], - [0.513050019741058, 0.547281980514526], - [0.51509702205658, 0.527251958847046], - [0.742246985435486, 0.314507007598877], - [0.598631024360657, 0.454979002475739], - [0.570338010787964, 0.548575043678284], - [0.578631997108459, 0.533622980117798], - [0.723087012767792, 0.532054007053375], - [0.516445994377136, 0.499638974666595], - [0.662801027297974, 0.282917976379395], - [0.70362401008606, 0.293271005153656], - [0.830704987049103, 0.193813979625702], - [0.552385985851288, 0.302568018436432], - [0.607609987258911, 0.353887975215912], - [0.645429015159607, 0.696707010269165], - [0.932694971561432, 0.730105042457581], - [0.557260990142822, 0.572826027870178], - [0.542901992797852, 0.584792017936707], - [0.6180260181427, 0.694710969924927], - [0.607590973377228, 0.694203019142151], - [0.722943007946014, 0.271963000297546], - [0.577413976192474, 0.563166975975037], - [0.614082992076874, 0.281386971473694], - [0.616907000541687, 0.255886018276215], - [0.668509006500244, 0.119913995265961], - [0.770092010498047, 0.232020974159241], - [0.635536015033722, 0.189248979091644], - [0.77039098739624, 0.299556016921997], - [0.826722025871277, 0.278755009174347], - [0.527121007442474, 0.666198015213013], - [0.553171992301941, 0.668527007102966], - [0.577238023281097, 0.673889994621277], - [0.554691970348358, 0.580065965652466], - [0.611896991729736, 0.693961024284363], - [0.59696102142334, 0.706539988517761], - [0.596370995044708, 0.693953037261963], - [0.539958000183105, 0.557139039039612], - [0.568841993808746, 0.692366003990173], - [0.547818005084991, 0.692366003990173], - [0.52461302280426, 0.692366003990173], - [0.534089982509613, 0.779141008853912], - [0.527670979499817, 0.736225962638855], - [0.526912987232208, 0.717857003211975], - [0.526877999305725, 0.704625964164734], - [0.526966989040375, 0.695277988910675], - [0.572058022022247, 0.695277988910675], - [0.573521018028259, 0.703539967536926], - [0.57683801651001, 0.711845993995667], - [0.581691026687622, 0.720062971115112], - [0.609944999217987, 0.639909982681274], - [0.986046016216278, 0.560034036636353], - [0.5867999792099, 0.69539999961853], - [0.590372025966644, 0.701822996139526], - [0.531915009021759, 0.601536989212036], - [0.577268004417419, 0.585934996604919], - [0.536915004253387, 0.593786001205444], - [0.627542972564697, 0.473352015018463], - [0.665585994720459, 0.495950996875763], - [0.588353991508484, 0.546862006187439], - [0.757824003696442, 0.14767599105835], - [0.709249973297119, 0.201507985591888], - [0.672684013843536, 0.256581008434296], - [0.600408971309662, 0.74900496006012], - [0.55826598405838, 0.261672019958496], - [0.570303976535797, 0.187870979309082], - [0.588165998458862, 0.109044015407562], - [0.711045026779175, 0.398952007293701], - [0.781069993972778, 0.435405015945435], - [0.587247014045715, 0.398931980133057], - [0.742869973182678, 0.355445981025696], - [0.572156012058258, 0.437651991844177], - [0.55186802148819, 0.536570012569427], - [0.821442008018494, 0.457556009292603], - [0.752701997756958, 0.457181990146637], - [0.71375697851181, 0.467626988887787], - [0.66711300611496, 0.460672974586487], - [0.631101012229919, 0.447153985500336], - [0.6008620262146, 0.432473003864288], - [0.523481011390686, 0.405627012252808], - [0.810747981071472, 0.523926019668579], - [0.771045982837677, 0.348959028720856], - [0.509127020835876, 0.562718033790588], - [0.595292985439301, 0.485023975372314], - [0.980530977249146, 0.401564002037048], - [0.573499977588654, 0.420000016689301], - [0.602994978427887, 0.548687994480133], - [0.733529984951019, 0.376977026462555], - [0.560611009597778, 0.519016981124878], - [0.967685997486115, 0.644356966018677], - [0.580985009670258, 0.387160003185272], - [0.537728011608124, 0.505385041236877], - [0.760966002941132, 0.779752969741821], - [0.801778972148895, 0.831938028335571], - [0.892440974712372, 0.54076099395752], - [0.816350996494293, 0.740260004997253], - [0.865594983100891, 0.333687007427216], - [0.614073991775513, 0.883246004581451], - [0.508952975273132, 0.579437971115112], - [0.617941975593567, 0.508316040039062], - [0.825608015060425, 0.397674977779388], - [0.681214988231659, 0.39623498916626], - [0.656635999679565, 0.400596976280212], - [0.603900015354156, 0.710216999053955], - [0.81208598613739, 0.588539004325867], - [0.56801301240921, 0.944564998149872], - [0.681007981300354, 0.898285031318665], - [0.733752012252808, 0.869701027870178], - [0.633830010890961, 0.398822009563446], - [0.606792986392975, 0.39553701877594], - [0.589659988880157, 0.391062021255493], - [0.805015981197357, 0.342108011245728], - [0.611334979534149, 0.362284004688263], - [0.634037971496582, 0.355970978736877], - [0.656635999679565, 0.355356991291046], - [0.681214988231659, 0.35834002494812], - [0.698584973812103, 0.363156020641327], - [0.941866993904114, 0.319076001644135], - [0.698584973812103, 0.387449026107788], - [0.584177017211914, 0.624107003211975], - [0.554318010807037, 0.566076993942261], - [0.534153997898102, 0.62064003944397], - [0.711217999458313, 0.819975018501282], - [0.664629995822906, 0.852871000766754], - [0.559099972248077, 0.902631998062134], - [0.871706008911133, 0.791940987110138], - [0.591234028339386, 0.373893976211548], - [0.544341027736664, 0.451583981513977], - [0.624562978744507, 0.924192011356354], - [0.88577002286911, 0.615028977394104], - [0.551338016986847, 0.695277988910675], - [0.551980018615723, 0.704632043838501], - [0.552887976169586, 0.715808033943176], - [0.555167973041534, 0.730794012546539], - [0.569944024085999, 0.767035007476807], - [0.593203008174896, 0.685675978660583], - [0.599261999130249, 0.681069016456604], - [0.607599973678589, 0.677703022956848], - [0.631937980651855, 0.663500010967255], - [0.752032995223999, 0.601315021514893], - [0.547226011753082, 0.420395016670227], - [0.563543975353241, 0.359827995300293], - [0.583841025829315, 0.368713974952698], - [0.586614012718201, 0.692366003990173], - [0.771915018558502, 0.683578014373779], - [0.531597018241882, 0.352482974529266], - [0.588370978832245, 0.804440975189209], - [0.52079701423645, 0.442565023899078], - [0.567984998226166, 0.493479013442993], - [0.543282985687256, 0.819254994392395], - [0.655317008495331, 0.745514988899231], - [0.621008992195129, 0.574018001556396], - [0.625559985637665, 0.78031200170517], - [0.680198013782501, 0.570719003677368], - [0.64276397228241, 0.604337990283966], - [0.704662978649139, 0.621529996395111], - [0.552012026309967, 0.862591981887817], - [0.589071989059448, 0.508637011051178], - [0.685944974422455, 0.775357007980347], - [0.645735025405884, 0.812640011310577], - [0.675342977046967, 0.703978002071381], - [0.810858011245728, 0.646304965019226], - [0.72012197971344, 0.714666962623596], - [0.866151988506317, 0.682704985141754], - [0.663187026977539, 0.644596993923187], - [0.570082008838654, 0.466325998306274], - [0.544561982154846, 0.548375964164734], - [0.562758982181549, 0.558784961700439], - [0.531987011432648, 0.530140042304993], - [0.585271000862122, 0.335177004337311], - [0.622952997684479, 0.32277899980545], - [0.655896008014679, 0.320163011550903], - [0.687132000923157, 0.322345972061157], - [0.716481983661652, 0.333200991153717], - [0.758756995201111, 0.382786989212036], - [0.897013008594513, 0.468769013881683], - [0.732392013072968, 0.424547016620636], - [0.70211398601532, 0.433162987232208], - [0.66652500629425, 0.433866024017334], - [0.633504986763, 0.426087975502014], - [0.603875994682312, 0.416586995124817], - [0.579657971858978, 0.409945011138916], - [0.992439985275269, 0.480777025222778], - [0.567192018032074, 0.569419980049133], - [0.54136598110199, 0.478899002075195], - [0.526564002037048, 0.546118021011353], - [0.523913025856018, 0.563830018043518], - [0.531529009342194, 0.555056989192963], - [0.566035985946655, 0.582329034805298], - [0.51631098985672, 0.563053965568542], - [0.5174720287323, 0.577877044677734], - [0.573594987392426, 0.389806985855103], - [0.560697972774506, 0.395331978797913], - [0.549755990505219, 0.399751007556915], - [0.710287988185883, 0.368252992630005], - [0.723330020904541, 0.363372981548309] -]; -var TRI468 = [ - 127, - 34, - 139, - 11, - 0, - 37, - 232, - 231, - 120, - 72, - 37, - 39, - 128, - 121, - 47, - 232, - 121, - 128, - 104, - 69, - 67, - 175, - 171, - 148, - 157, - 154, - 155, - 118, - 50, - 101, - 73, - 39, - 40, - 9, - 151, - 108, - 48, - 115, - 131, - 194, - 204, - 211, - 74, - 40, - 185, - 80, - 42, - 183, - 40, - 92, - 186, - 230, - 229, - 118, - 202, - 212, - 214, - 83, - 18, - 17, - 76, - 61, - 146, - 160, - 29, - 30, - 56, - 157, - 173, - 106, - 204, - 194, - 135, - 214, - 192, - 203, - 165, - 98, - 21, - 71, - 68, - 51, - 45, - 4, - 144, - 24, - 23, - 77, - 146, - 91, - 205, - 50, - 187, - 201, - 200, - 18, - 91, - 106, - 182, - 90, - 91, - 181, - 85, - 84, - 17, - 206, - 203, - 36, - 148, - 171, - 140, - 92, - 40, - 39, - 193, - 189, - 244, - 159, - 158, - 28, - 247, - 246, - 161, - 236, - 3, - 196, - 54, - 68, - 104, - 193, - 168, - 8, - 117, - 228, - 31, - 189, - 193, - 55, - 98, - 97, - 99, - 126, - 47, - 100, - 166, - 79, - 218, - 155, - 154, - 26, - 209, - 49, - 131, - 135, - 136, - 150, - 47, - 126, - 217, - 223, - 52, - 53, - 45, - 51, - 134, - 211, - 170, - 140, - 67, - 69, - 108, - 43, - 106, - 91, - 230, - 119, - 120, - 226, - 130, - 247, - 63, - 53, - 52, - 238, - 20, - 242, - 46, - 70, - 156, - 78, - 62, - 96, - 46, - 53, - 63, - 143, - 34, - 227, - 173, - 155, - 133, - 123, - 117, - 111, - 44, - 125, - 19, - 236, - 134, - 51, - 216, - 206, - 205, - 154, - 153, - 22, - 39, - 37, - 167, - 200, - 201, - 208, - 36, - 142, - 100, - 57, - 212, - 202, - 20, - 60, - 99, - 28, - 158, - 157, - 35, - 226, - 113, - 160, - 159, - 27, - 204, - 202, - 210, - 113, - 225, - 46, - 43, - 202, - 204, - 62, - 76, - 77, - 137, - 123, - 116, - 41, - 38, - 72, - 203, - 129, - 142, - 64, - 98, - 240, - 49, - 102, - 64, - 41, - 73, - 74, - 212, - 216, - 207, - 42, - 74, - 184, - 169, - 170, - 211, - 170, - 149, - 176, - 105, - 66, - 69, - 122, - 6, - 168, - 123, - 147, - 187, - 96, - 77, - 90, - 65, - 55, - 107, - 89, - 90, - 180, - 101, - 100, - 120, - 63, - 105, - 104, - 93, - 137, - 227, - 15, - 86, - 85, - 129, - 102, - 49, - 14, - 87, - 86, - 55, - 8, - 9, - 100, - 47, - 121, - 145, - 23, - 22, - 88, - 89, - 179, - 6, - 122, - 196, - 88, - 95, - 96, - 138, - 172, - 136, - 215, - 58, - 172, - 115, - 48, - 219, - 42, - 80, - 81, - 195, - 3, - 51, - 43, - 146, - 61, - 171, - 175, - 199, - 81, - 82, - 38, - 53, - 46, - 225, - 144, - 163, - 110, - 246, - 33, - 7, - 52, - 65, - 66, - 229, - 228, - 117, - 34, - 127, - 234, - 107, - 108, - 69, - 109, - 108, - 151, - 48, - 64, - 235, - 62, - 78, - 191, - 129, - 209, - 126, - 111, - 35, - 143, - 163, - 161, - 246, - 117, - 123, - 50, - 222, - 65, - 52, - 19, - 125, - 141, - 221, - 55, - 65, - 3, - 195, - 197, - 25, - 7, - 33, - 220, - 237, - 44, - 70, - 71, - 139, - 122, - 193, - 245, - 247, - 130, - 33, - 71, - 21, - 162, - 153, - 158, - 159, - 170, - 169, - 150, - 188, - 174, - 196, - 216, - 186, - 92, - 144, - 160, - 161, - 2, - 97, - 167, - 141, - 125, - 241, - 164, - 167, - 37, - 72, - 38, - 12, - 145, - 159, - 160, - 38, - 82, - 13, - 63, - 68, - 71, - 226, - 35, - 111, - 158, - 153, - 154, - 101, - 50, - 205, - 206, - 92, - 165, - 209, - 198, - 217, - 165, - 167, - 97, - 220, - 115, - 218, - 133, - 112, - 243, - 239, - 238, - 241, - 214, - 135, - 169, - 190, - 173, - 133, - 171, - 208, - 32, - 125, - 44, - 237, - 86, - 87, - 178, - 85, - 86, - 179, - 84, - 85, - 180, - 83, - 84, - 181, - 201, - 83, - 182, - 137, - 93, - 132, - 76, - 62, - 183, - 61, - 76, - 184, - 57, - 61, - 185, - 212, - 57, - 186, - 214, - 207, - 187, - 34, - 143, - 156, - 79, - 239, - 237, - 123, - 137, - 177, - 44, - 1, - 4, - 201, - 194, - 32, - 64, - 102, - 129, - 213, - 215, - 138, - 59, - 166, - 219, - 242, - 99, - 97, - 2, - 94, - 141, - 75, - 59, - 235, - 24, - 110, - 228, - 25, - 130, - 226, - 23, - 24, - 229, - 22, - 23, - 230, - 26, - 22, - 231, - 112, - 26, - 232, - 189, - 190, - 243, - 221, - 56, - 190, - 28, - 56, - 221, - 27, - 28, - 222, - 29, - 27, - 223, - 30, - 29, - 224, - 247, - 30, - 225, - 238, - 79, - 20, - 166, - 59, - 75, - 60, - 75, - 240, - 147, - 177, - 215, - 20, - 79, - 166, - 187, - 147, - 213, - 112, - 233, - 244, - 233, - 128, - 245, - 128, - 114, - 188, - 114, - 217, - 174, - 131, - 115, - 220, - 217, - 198, - 236, - 198, - 131, - 134, - 177, - 132, - 58, - 143, - 35, - 124, - 110, - 163, - 7, - 228, - 110, - 25, - 356, - 389, - 368, - 11, - 302, - 267, - 452, - 350, - 349, - 302, - 303, - 269, - 357, - 343, - 277, - 452, - 453, - 357, - 333, - 332, - 297, - 175, - 152, - 377, - 384, - 398, - 382, - 347, - 348, - 330, - 303, - 304, - 270, - 9, - 336, - 337, - 278, - 279, - 360, - 418, - 262, - 431, - 304, - 408, - 409, - 310, - 415, - 407, - 270, - 409, - 410, - 450, - 348, - 347, - 422, - 430, - 434, - 313, - 314, - 17, - 306, - 307, - 375, - 387, - 388, - 260, - 286, - 414, - 398, - 335, - 406, - 418, - 364, - 367, - 416, - 423, - 358, - 327, - 251, - 284, - 298, - 281, - 5, - 4, - 373, - 374, - 253, - 307, - 320, - 321, - 425, - 427, - 411, - 421, - 313, - 18, - 321, - 405, - 406, - 320, - 404, - 405, - 315, - 16, - 17, - 426, - 425, - 266, - 377, - 400, - 369, - 322, - 391, - 269, - 417, - 465, - 464, - 386, - 257, - 258, - 466, - 260, - 388, - 456, - 399, - 419, - 284, - 332, - 333, - 417, - 285, - 8, - 346, - 340, - 261, - 413, - 441, - 285, - 327, - 460, - 328, - 355, - 371, - 329, - 392, - 439, - 438, - 382, - 341, - 256, - 429, - 420, - 360, - 364, - 394, - 379, - 277, - 343, - 437, - 443, - 444, - 283, - 275, - 440, - 363, - 431, - 262, - 369, - 297, - 338, - 337, - 273, - 375, - 321, - 450, - 451, - 349, - 446, - 342, - 467, - 293, - 334, - 282, - 458, - 461, - 462, - 276, - 353, - 383, - 308, - 324, - 325, - 276, - 300, - 293, - 372, - 345, - 447, - 382, - 398, - 362, - 352, - 345, - 340, - 274, - 1, - 19, - 456, - 248, - 281, - 436, - 427, - 425, - 381, - 256, - 252, - 269, - 391, - 393, - 200, - 199, - 428, - 266, - 330, - 329, - 287, - 273, - 422, - 250, - 462, - 328, - 258, - 286, - 384, - 265, - 353, - 342, - 387, - 259, - 257, - 424, - 431, - 430, - 342, - 353, - 276, - 273, - 335, - 424, - 292, - 325, - 307, - 366, - 447, - 345, - 271, - 303, - 302, - 423, - 266, - 371, - 294, - 455, - 460, - 279, - 278, - 294, - 271, - 272, - 304, - 432, - 434, - 427, - 272, - 407, - 408, - 394, - 430, - 431, - 395, - 369, - 400, - 334, - 333, - 299, - 351, - 417, - 168, - 352, - 280, - 411, - 325, - 319, - 320, - 295, - 296, - 336, - 319, - 403, - 404, - 330, - 348, - 349, - 293, - 298, - 333, - 323, - 454, - 447, - 15, - 16, - 315, - 358, - 429, - 279, - 14, - 15, - 316, - 285, - 336, - 9, - 329, - 349, - 350, - 374, - 380, - 252, - 318, - 402, - 403, - 6, - 197, - 419, - 318, - 319, - 325, - 367, - 364, - 365, - 435, - 367, - 397, - 344, - 438, - 439, - 272, - 271, - 311, - 195, - 5, - 281, - 273, - 287, - 291, - 396, - 428, - 199, - 311, - 271, - 268, - 283, - 444, - 445, - 373, - 254, - 339, - 263, - 466, - 249, - 282, - 334, - 296, - 449, - 347, - 346, - 264, - 447, - 454, - 336, - 296, - 299, - 338, - 10, - 151, - 278, - 439, - 455, - 292, - 407, - 415, - 358, - 371, - 355, - 340, - 345, - 372, - 390, - 249, - 466, - 346, - 347, - 280, - 442, - 443, - 282, - 19, - 94, - 370, - 441, - 442, - 295, - 248, - 419, - 197, - 263, - 255, - 359, - 440, - 275, - 274, - 300, - 383, - 368, - 351, - 412, - 465, - 263, - 467, - 466, - 301, - 368, - 389, - 380, - 374, - 386, - 395, - 378, - 379, - 412, - 351, - 419, - 436, - 426, - 322, - 373, - 390, - 388, - 2, - 164, - 393, - 370, - 462, - 461, - 164, - 0, - 267, - 302, - 11, - 12, - 374, - 373, - 387, - 268, - 12, - 13, - 293, - 300, - 301, - 446, - 261, - 340, - 385, - 384, - 381, - 330, - 266, - 425, - 426, - 423, - 391, - 429, - 355, - 437, - 391, - 327, - 326, - 440, - 457, - 438, - 341, - 382, - 362, - 459, - 457, - 461, - 434, - 430, - 394, - 414, - 463, - 362, - 396, - 369, - 262, - 354, - 461, - 457, - 316, - 403, - 402, - 315, - 404, - 403, - 314, - 405, - 404, - 313, - 406, - 405, - 421, - 418, - 406, - 366, - 401, - 361, - 306, - 408, - 407, - 291, - 409, - 408, - 287, - 410, - 409, - 432, - 436, - 410, - 434, - 416, - 411, - 264, - 368, - 383, - 309, - 438, - 457, - 352, - 376, - 401, - 274, - 275, - 4, - 421, - 428, - 262, - 294, - 327, - 358, - 433, - 416, - 367, - 289, - 455, - 439, - 462, - 370, - 326, - 2, - 326, - 370, - 305, - 460, - 455, - 254, - 449, - 448, - 255, - 261, - 446, - 253, - 450, - 449, - 252, - 451, - 450, - 256, - 452, - 451, - 341, - 453, - 452, - 413, - 464, - 463, - 441, - 413, - 414, - 258, - 442, - 441, - 257, - 443, - 442, - 259, - 444, - 443, - 260, - 445, - 444, - 467, - 342, - 445, - 459, - 458, - 250, - 289, - 392, - 290, - 290, - 328, - 460, - 376, - 433, - 435, - 250, - 290, - 392, - 411, - 416, - 433, - 341, - 463, - 464, - 453, - 464, - 465, - 357, - 465, - 412, - 343, - 412, - 399, - 360, - 363, - 440, - 437, - 399, - 456, - 420, - 456, - 363, - 401, - 435, - 288, - 372, - 383, - 353, - 339, - 255, - 249, - 448, - 261, - 255, - 133, - 243, - 190, - 133, - 155, - 112, - 33, - 246, - 247, - 33, - 130, - 25, - 398, - 384, - 286, - 362, - 398, - 414, - 362, - 463, - 341, - 263, - 359, - 467, - 263, - 249, - 255, - 466, - 467, - 260, - 75, - 60, - 166, - 238, - 239, - 79, - 162, - 127, - 139, - 72, - 11, - 37, - 121, - 232, - 120, - 73, - 72, - 39, - 114, - 128, - 47, - 233, - 232, - 128, - 103, - 104, - 67, - 152, - 175, - 148, - 173, - 157, - 155, - 119, - 118, - 101, - 74, - 73, - 40, - 107, - 9, - 108, - 49, - 48, - 131, - 32, - 194, - 211, - 184, - 74, - 185, - 191, - 80, - 183, - 185, - 40, - 186, - 119, - 230, - 118, - 210, - 202, - 214, - 84, - 83, - 17, - 77, - 76, - 146, - 161, - 160, - 30, - 190, - 56, - 173, - 182, - 106, - 194, - 138, - 135, - 192, - 129, - 203, - 98, - 54, - 21, - 68, - 5, - 51, - 4, - 145, - 144, - 23, - 90, - 77, - 91, - 207, - 205, - 187, - 83, - 201, - 18, - 181, - 91, - 182, - 180, - 90, - 181, - 16, - 85, - 17, - 205, - 206, - 36, - 176, - 148, - 140, - 165, - 92, - 39, - 245, - 193, - 244, - 27, - 159, - 28, - 30, - 247, - 161, - 174, - 236, - 196, - 103, - 54, - 104, - 55, - 193, - 8, - 111, - 117, - 31, - 221, - 189, - 55, - 240, - 98, - 99, - 142, - 126, - 100, - 219, - 166, - 218, - 112, - 155, - 26, - 198, - 209, - 131, - 169, - 135, - 150, - 114, - 47, - 217, - 224, - 223, - 53, - 220, - 45, - 134, - 32, - 211, - 140, - 109, - 67, - 108, - 146, - 43, - 91, - 231, - 230, - 120, - 113, - 226, - 247, - 105, - 63, - 52, - 241, - 238, - 242, - 124, - 46, - 156, - 95, - 78, - 96, - 70, - 46, - 63, - 116, - 143, - 227, - 116, - 123, - 111, - 1, - 44, - 19, - 3, - 236, - 51, - 207, - 216, - 205, - 26, - 154, - 22, - 165, - 39, - 167, - 199, - 200, - 208, - 101, - 36, - 100, - 43, - 57, - 202, - 242, - 20, - 99, - 56, - 28, - 157, - 124, - 35, - 113, - 29, - 160, - 27, - 211, - 204, - 210, - 124, - 113, - 46, - 106, - 43, - 204, - 96, - 62, - 77, - 227, - 137, - 116, - 73, - 41, - 72, - 36, - 203, - 142, - 235, - 64, - 240, - 48, - 49, - 64, - 42, - 41, - 74, - 214, - 212, - 207, - 183, - 42, - 184, - 210, - 169, - 211, - 140, - 170, - 176, - 104, - 105, - 69, - 193, - 122, - 168, - 50, - 123, - 187, - 89, - 96, - 90, - 66, - 65, - 107, - 179, - 89, - 180, - 119, - 101, - 120, - 68, - 63, - 104, - 234, - 93, - 227, - 16, - 15, - 85, - 209, - 129, - 49, - 15, - 14, - 86, - 107, - 55, - 9, - 120, - 100, - 121, - 153, - 145, - 22, - 178, - 88, - 179, - 197, - 6, - 196, - 89, - 88, - 96, - 135, - 138, - 136, - 138, - 215, - 172, - 218, - 115, - 219, - 41, - 42, - 81, - 5, - 195, - 51, - 57, - 43, - 61, - 208, - 171, - 199, - 41, - 81, - 38, - 224, - 53, - 225, - 24, - 144, - 110, - 105, - 52, - 66, - 118, - 229, - 117, - 227, - 34, - 234, - 66, - 107, - 69, - 10, - 109, - 151, - 219, - 48, - 235, - 183, - 62, - 191, - 142, - 129, - 126, - 116, - 111, - 143, - 7, - 163, - 246, - 118, - 117, - 50, - 223, - 222, - 52, - 94, - 19, - 141, - 222, - 221, - 65, - 196, - 3, - 197, - 45, - 220, - 44, - 156, - 70, - 139, - 188, - 122, - 245, - 139, - 71, - 162, - 145, - 153, - 159, - 149, - 170, - 150, - 122, - 188, - 196, - 206, - 216, - 92, - 163, - 144, - 161, - 164, - 2, - 167, - 242, - 141, - 241, - 0, - 164, - 37, - 11, - 72, - 12, - 144, - 145, - 160, - 12, - 38, - 13, - 70, - 63, - 71, - 31, - 226, - 111, - 157, - 158, - 154, - 36, - 101, - 205, - 203, - 206, - 165, - 126, - 209, - 217, - 98, - 165, - 97, - 237, - 220, - 218, - 237, - 239, - 241, - 210, - 214, - 169, - 140, - 171, - 32, - 241, - 125, - 237, - 179, - 86, - 178, - 180, - 85, - 179, - 181, - 84, - 180, - 182, - 83, - 181, - 194, - 201, - 182, - 177, - 137, - 132, - 184, - 76, - 183, - 185, - 61, - 184, - 186, - 57, - 185, - 216, - 212, - 186, - 192, - 214, - 187, - 139, - 34, - 156, - 218, - 79, - 237, - 147, - 123, - 177, - 45, - 44, - 4, - 208, - 201, - 32, - 98, - 64, - 129, - 192, - 213, - 138, - 235, - 59, - 219, - 141, - 242, - 97, - 97, - 2, - 141, - 240, - 75, - 235, - 229, - 24, - 228, - 31, - 25, - 226, - 230, - 23, - 229, - 231, - 22, - 230, - 232, - 26, - 231, - 233, - 112, - 232, - 244, - 189, - 243, - 189, - 221, - 190, - 222, - 28, - 221, - 223, - 27, - 222, - 224, - 29, - 223, - 225, - 30, - 224, - 113, - 247, - 225, - 99, - 60, - 240, - 213, - 147, - 215, - 60, - 20, - 166, - 192, - 187, - 213, - 243, - 112, - 244, - 244, - 233, - 245, - 245, - 128, - 188, - 188, - 114, - 174, - 134, - 131, - 220, - 174, - 217, - 236, - 236, - 198, - 134, - 215, - 177, - 58, - 156, - 143, - 124, - 25, - 110, - 7, - 31, - 228, - 25, - 264, - 356, - 368, - 0, - 11, - 267, - 451, - 452, - 349, - 267, - 302, - 269, - 350, - 357, - 277, - 350, - 452, - 357, - 299, - 333, - 297, - 396, - 175, - 377, - 381, - 384, - 382, - 280, - 347, - 330, - 269, - 303, - 270, - 151, - 9, - 337, - 344, - 278, - 360, - 424, - 418, - 431, - 270, - 304, - 409, - 272, - 310, - 407, - 322, - 270, - 410, - 449, - 450, - 347, - 432, - 422, - 434, - 18, - 313, - 17, - 291, - 306, - 375, - 259, - 387, - 260, - 424, - 335, - 418, - 434, - 364, - 416, - 391, - 423, - 327, - 301, - 251, - 298, - 275, - 281, - 4, - 254, - 373, - 253, - 375, - 307, - 321, - 280, - 425, - 411, - 200, - 421, - 18, - 335, - 321, - 406, - 321, - 320, - 405, - 314, - 315, - 17, - 423, - 426, - 266, - 396, - 377, - 369, - 270, - 322, - 269, - 413, - 417, - 464, - 385, - 386, - 258, - 248, - 456, - 419, - 298, - 284, - 333, - 168, - 417, - 8, - 448, - 346, - 261, - 417, - 413, - 285, - 326, - 327, - 328, - 277, - 355, - 329, - 309, - 392, - 438, - 381, - 382, - 256, - 279, - 429, - 360, - 365, - 364, - 379, - 355, - 277, - 437, - 282, - 443, - 283, - 281, - 275, - 363, - 395, - 431, - 369, - 299, - 297, - 337, - 335, - 273, - 321, - 348, - 450, - 349, - 359, - 446, - 467, - 283, - 293, - 282, - 250, - 458, - 462, - 300, - 276, - 383, - 292, - 308, - 325, - 283, - 276, - 293, - 264, - 372, - 447, - 346, - 352, - 340, - 354, - 274, - 19, - 363, - 456, - 281, - 426, - 436, - 425, - 380, - 381, - 252, - 267, - 269, - 393, - 421, - 200, - 428, - 371, - 266, - 329, - 432, - 287, - 422, - 290, - 250, - 328, - 385, - 258, - 384, - 446, - 265, - 342, - 386, - 387, - 257, - 422, - 424, - 430, - 445, - 342, - 276, - 422, - 273, - 424, - 306, - 292, - 307, - 352, - 366, - 345, - 268, - 271, - 302, - 358, - 423, - 371, - 327, - 294, - 460, - 331, - 279, - 294, - 303, - 271, - 304, - 436, - 432, - 427, - 304, - 272, - 408, - 395, - 394, - 431, - 378, - 395, - 400, - 296, - 334, - 299, - 6, - 351, - 168, - 376, - 352, - 411, - 307, - 325, - 320, - 285, - 295, - 336, - 320, - 319, - 404, - 329, - 330, - 349, - 334, - 293, - 333, - 366, - 323, - 447, - 316, - 15, - 315, - 331, - 358, - 279, - 317, - 14, - 316, - 8, - 285, - 9, - 277, - 329, - 350, - 253, - 374, - 252, - 319, - 318, - 403, - 351, - 6, - 419, - 324, - 318, - 325, - 397, - 367, - 365, - 288, - 435, - 397, - 278, - 344, - 439, - 310, - 272, - 311, - 248, - 195, - 281, - 375, - 273, - 291, - 175, - 396, - 199, - 312, - 311, - 268, - 276, - 283, - 445, - 390, - 373, - 339, - 295, - 282, - 296, - 448, - 449, - 346, - 356, - 264, - 454, - 337, - 336, - 299, - 337, - 338, - 151, - 294, - 278, - 455, - 308, - 292, - 415, - 429, - 358, - 355, - 265, - 340, - 372, - 388, - 390, - 466, - 352, - 346, - 280, - 295, - 442, - 282, - 354, - 19, - 370, - 285, - 441, - 295, - 195, - 248, - 197, - 457, - 440, - 274, - 301, - 300, - 368, - 417, - 351, - 465, - 251, - 301, - 389, - 385, - 380, - 386, - 394, - 395, - 379, - 399, - 412, - 419, - 410, - 436, - 322, - 387, - 373, - 388, - 326, - 2, - 393, - 354, - 370, - 461, - 393, - 164, - 267, - 268, - 302, - 12, - 386, - 374, - 387, - 312, - 268, - 13, - 298, - 293, - 301, - 265, - 446, - 340, - 380, - 385, - 381, - 280, - 330, - 425, - 322, - 426, - 391, - 420, - 429, - 437, - 393, - 391, - 326, - 344, - 440, - 438, - 458, - 459, - 461, - 364, - 434, - 394, - 428, - 396, - 262, - 274, - 354, - 457, - 317, - 316, - 402, - 316, - 315, - 403, - 315, - 314, - 404, - 314, - 313, - 405, - 313, - 421, - 406, - 323, - 366, - 361, - 292, - 306, - 407, - 306, - 291, - 408, - 291, - 287, - 409, - 287, - 432, - 410, - 427, - 434, - 411, - 372, - 264, - 383, - 459, - 309, - 457, - 366, - 352, - 401, - 1, - 274, - 4, - 418, - 421, - 262, - 331, - 294, - 358, - 435, - 433, - 367, - 392, - 289, - 439, - 328, - 462, - 326, - 94, - 2, - 370, - 289, - 305, - 455, - 339, - 254, - 448, - 359, - 255, - 446, - 254, - 253, - 449, - 253, - 252, - 450, - 252, - 256, - 451, - 256, - 341, - 452, - 414, - 413, - 463, - 286, - 441, - 414, - 286, - 258, - 441, - 258, - 257, - 442, - 257, - 259, - 443, - 259, - 260, - 444, - 260, - 467, - 445, - 309, - 459, - 250, - 305, - 289, - 290, - 305, - 290, - 460, - 401, - 376, - 435, - 309, - 250, - 392, - 376, - 411, - 433, - 453, - 341, - 464, - 357, - 453, - 465, - 343, - 357, - 412, - 437, - 343, - 399, - 344, - 360, - 440, - 420, - 437, - 456, - 360, - 420, - 363, - 361, - 401, - 288, - 265, - 372, - 353, - 390, - 339, - 249, - 339, - 448, - 255 -]; -var VTX68 = [ - 127, - 234, - 132, - 58, - 172, - 150, - 149, - 148, - 152, - 377, - 378, - 379, - 397, - 288, - 361, - 454, - 356, - 70, - 63, - 105, - 66, - 107, - 336, - 296, - 334, - 293, - 300, - 168, - 6, - 195, - 4, - 98, - 97, - 2, - 326, - 327, - 33, - 160, - 158, - 133, - 153, - 144, - 362, - 385, - 387, - 263, - 373, - 380, - 57, - 40, - 37, - 0, - 267, - 270, - 287, - 321, - 314, - 17, - 84, - 91, - 78, - 81, - 13, - 311, - 308, - 402, - 14, - 178 -]; -var VTX33 = [33, 133, 362, 263, 1, 62, 308, 159, 145, 386, 374, 6, 102, 331, 2, 13, 14, 70, 105, 107, 336, 334, 300, 54, 10, 284, 50, 280, 234, 454, 58, 288, 152]; -var VTX7 = [33, 133, 362, 263, 1, 78, 308]; -var UV68 = VTX68.map((x) => UV468[x]); -var UV33 = VTX33.map((x) => UV468[x]); -var UV7 = VTX7.map((x) => UV468[x]); - -// src/blazeface/facepipeline.ts -var leftOutline = MESH_ANNOTATIONS["leftEyeLower0"]; -var rightOutline = MESH_ANNOTATIONS["rightEyeLower0"]; -var eyeLandmarks = { - leftBounds: [leftOutline[0], leftOutline[leftOutline.length - 1]], - rightBounds: [rightOutline[0], rightOutline[rightOutline.length - 1]] -}; -var meshLandmarks = { - count: 468, - mouth: 13, - symmetryLine: [13, MESH_ANNOTATIONS["midwayBetweenEyes"][0]] -}; -var blazeFaceLandmarks = { - leftEye: 0, - rightEye: 1, - nose: 2, - mouth: 3, - leftEar: 4, - rightEar: 5, - symmetryLine: [3, 2] -}; -var irisLandmarks = { - upperCenter: 3, - lowerCenter: 4, - index: 71, - numCoordinates: 76 -}; -function replaceRawCoordinates(rawCoords, newCoords, prefix, keys) { - for (let i = 0; i < MESH_TO_IRIS_INDICES_MAP.length; i++) { - const { key, indices } = MESH_TO_IRIS_INDICES_MAP[i]; - const originalIndices = MESH_ANNOTATIONS[`${prefix}${key}`]; - if (!keys || keys.includes(key)) { - for (let j = 0; j < indices.length; j++) { - const index = indices[j]; - rawCoords[originalIndices[j]] = [ - newCoords[index][0], - newCoords[index][1], - (newCoords[index][2] + rawCoords[originalIndices[j]][2]) / 2 - ]; - } - } - } -} -var Pipeline = class { - constructor(boundingBoxDetector, meshDetector, irisModel) { - var _a, _b; - this.storedBoxes = []; - this.boundingBoxDetector = boundingBoxDetector; - this.meshDetector = meshDetector; - this.irisModel = irisModel; - this.boxSize = ((_a = boundingBoxDetector == null ? void 0 : boundingBoxDetector.model) == null ? void 0 : _a.inputs[0].shape[2]) || 0; - this.meshSize = (meshDetector == null ? void 0 : meshDetector.inputs[0].shape[2]) || ((_b = boundingBoxDetector == null ? void 0 : boundingBoxDetector.model) == null ? void 0 : _b.inputs[0].shape[2]); - this.irisSize = (irisModel == null ? void 0 : irisModel.inputs[0].shape[1]) || 0; - this.irisEnlarge = 2.3; - this.skipped = 0; - this.detectedFaces = 0; - } - transformRawCoords(rawCoords, box4, angle, rotationMatrix) { - const boxSize = getBoxSize({ startPoint: box4.startPoint, endPoint: box4.endPoint }); - const coordsScaled = rawCoords.map((coord) => [ - boxSize[0] / this.meshSize * (coord[0] - this.meshSize / 2), - boxSize[1] / this.meshSize * (coord[1] - this.meshSize / 2), - coord[2] - ]); - const coordsRotationMatrix = angle !== 0 ? buildRotationMatrix(angle, [0, 0]) : IDENTITY_MATRIX; - const coordsRotated = angle !== 0 ? coordsScaled.map((coord) => [...rotatePoint(coord, coordsRotationMatrix), coord[2]]) : coordsScaled; - const inverseRotationMatrix = angle !== 0 ? invertTransformMatrix(rotationMatrix) : IDENTITY_MATRIX; - const boxCenter = [...getBoxCenter({ startPoint: box4.startPoint, endPoint: box4.endPoint }), 1]; - return coordsRotated.map((coord) => [ - Math.round(coord[0] + dot(boxCenter, inverseRotationMatrix[0])), - Math.round(coord[1] + dot(boxCenter, inverseRotationMatrix[1])), - Math.round(coord[2]) - ]); - } - getLeftToRightEyeDepthDifference(rawCoords) { - const leftEyeZ = rawCoords[eyeLandmarks.leftBounds[0]][2]; - const rightEyeZ = rawCoords[eyeLandmarks.rightBounds[0]][2]; - return leftEyeZ - rightEyeZ; - } - getEyeBox(rawCoords, face5, eyeInnerCornerIndex, eyeOuterCornerIndex, flip = false) { - const box4 = squarifyBox(enlargeBox(calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), this.irisEnlarge)); - const boxSize = getBoxSize(box4); - let crop = tfjs_esm_exports.image.cropAndResize(face5, [[ - box4.startPoint[1] / this.meshSize, - box4.startPoint[0] / this.meshSize, - box4.endPoint[1] / this.meshSize, - box4.endPoint[0] / this.meshSize - ]], [0], [this.irisSize, this.irisSize]); - if (flip && tfjs_esm_exports.ENV.flags.IS_BROWSER) { - crop = tfjs_esm_exports.image.flipLeftRight(crop); - } - return { box: box4, boxSize, crop }; - } - getEyeCoords(eyeData, eyeBox, eyeBoxSize, flip = false) { - const eyeRawCoords = []; - for (let i = 0; i < irisLandmarks.numCoordinates; i++) { - const x = eyeData[i * 3]; - const y = eyeData[i * 3 + 1]; - const z = eyeData[i * 3 + 2]; - eyeRawCoords.push([ - (flip ? 1 - x / this.irisSize : x / this.irisSize) * eyeBoxSize[0] + eyeBox.startPoint[0], - y / this.irisSize * eyeBoxSize[1] + eyeBox.startPoint[1], - z - ]); - } - return { rawCoords: eyeRawCoords, iris: eyeRawCoords.slice(irisLandmarks.index) }; - } - getAdjustedIrisCoords(rawCoords, irisCoords, direction) { - const upperCenterZ = rawCoords[MESH_ANNOTATIONS[`${direction}EyeUpper0`][irisLandmarks.upperCenter]][2]; - const lowerCenterZ = rawCoords[MESH_ANNOTATIONS[`${direction}EyeLower0`][irisLandmarks.lowerCenter]][2]; - const averageZ = (upperCenterZ + lowerCenterZ) / 2; - return irisCoords.map((coord, i) => { - let z = averageZ; - if (i === 2) { - z = upperCenterZ; - } else if (i === 4) { - z = lowerCenterZ; - } - return [coord[0], coord[1], z]; - }); - } - async predict(input, config3) { - let useFreshBox = false; - let detector; - if (this.skipped === 0 || this.skipped > config3.face.detector.skipFrames || !config3.face.mesh.enabled || !config3.skipFrame) { - detector = await this.boundingBoxDetector.getBoundingBoxes(input); - this.skipped = 0; - } - if (config3.skipFrame) - this.skipped++; - if (!config3.skipFrame || detector && detector.boxes && (!config3.face.mesh.enabled || detector.boxes.length !== this.detectedFaces && this.detectedFaces !== config3.face.detector.maxDetected)) { - this.storedBoxes = []; - this.detectedFaces = 0; - for (const possible of detector.boxes) { - this.storedBoxes.push({ startPoint: possible.box.startPoint.dataSync(), endPoint: possible.box.endPoint.dataSync(), landmarks: possible.landmarks, confidence: possible.confidence }); - } - if (this.storedBoxes.length > 0) - useFreshBox = true; - } - if (useFreshBox) { - if (!detector || !detector.boxes || detector.boxes.length === 0) { - this.storedBoxes = []; - this.detectedFaces = 0; - return null; - } - for (let i = 0; i < this.storedBoxes.length; i++) { - const scaledBox = scaleBoxCoordinates({ startPoint: this.storedBoxes[i].startPoint, endPoint: this.storedBoxes[i].endPoint }, detector.scaleFactor); - const enlargedBox = enlargeBox(scaledBox); - const squarifiedBox = squarifyBox(enlargedBox); - const landmarks = this.storedBoxes[i].landmarks.arraySync(); - const confidence = this.storedBoxes[i].confidence; - this.storedBoxes[i] = { ...squarifiedBox, confidence, landmarks }; - } - } - if (detector && detector.boxes) { - detector.boxes.forEach((prediction) => { - prediction.box.startPoint.dispose(); - prediction.box.endPoint.dispose(); - prediction.landmarks.dispose(); - }); - } - const results = tfjs_esm_exports.tidy(() => this.storedBoxes.map((box4, i) => { - let face5; - let angle = 0; - let rotationMatrix; - if (config3.face.detector.rotation && config3.face.mesh.enabled && tfjs_esm_exports.ENV.flags.IS_BROWSER) { - const [indexOfMouth, indexOfForehead] = box4.landmarks.length >= meshLandmarks.count ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine; - angle = computeRotation(box4.landmarks[indexOfMouth], box4.landmarks[indexOfForehead]); - const faceCenter = getBoxCenter({ startPoint: box4.startPoint, endPoint: box4.endPoint }); - const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]]; - const rotatedImage = tfjs_esm_exports.image.rotateWithOffset(input, angle, 0, faceCenterNormalized); - rotationMatrix = buildRotationMatrix(-angle, faceCenter); - if (config3.face.mesh.enabled) - face5 = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, rotatedImage, [this.meshSize, this.meshSize]).div(255); - else - face5 = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, rotatedImage, [this.boxSize, this.boxSize]).div(255); - } else { - rotationMatrix = IDENTITY_MATRIX; - const clonedImage = input.clone(); - if (config3.face.mesh.enabled) - face5 = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, clonedImage, [this.meshSize, this.meshSize]).div(255); - else - face5 = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, clonedImage, [this.boxSize, this.boxSize]).div(255); - } - if (!config3.face.mesh.enabled) { - const prediction2 = { - mesh: [], - box: box4, - faceConfidence: null, - boxConfidence: box4.confidence, - confidence: box4.confidence, - image: face5 - }; - return prediction2; - } - const [, confidence, contourCoords] = this.meshDetector.execute(face5); - const faceConfidence = confidence.dataSync()[0]; - if (faceConfidence < config3.face.detector.minConfidence) { - this.storedBoxes[i].confidence = faceConfidence; - return null; - } - const coordsReshaped = tfjs_esm_exports.reshape(contourCoords, [-1, 3]); - let rawCoords = coordsReshaped.arraySync(); - if (config3.face.iris.enabled) { - const { box: leftEyeBox, boxSize: leftEyeBoxSize, crop: leftEyeCrop } = this.getEyeBox(rawCoords, face5, eyeLandmarks.leftBounds[0], eyeLandmarks.leftBounds[1], true); - const { box: rightEyeBox, boxSize: rightEyeBoxSize, crop: rightEyeCrop } = this.getEyeBox(rawCoords, face5, eyeLandmarks.rightBounds[0], eyeLandmarks.rightBounds[1]); - const eyePredictions = this.irisModel.predict(tfjs_esm_exports.concat([leftEyeCrop, rightEyeCrop])); - const eyePredictionsData = eyePredictions.dataSync(); - const leftEyeData = eyePredictionsData.slice(0, irisLandmarks.numCoordinates * 3); - const { rawCoords: leftEyeRawCoords, iris: leftIrisRawCoords } = this.getEyeCoords(leftEyeData, leftEyeBox, leftEyeBoxSize, true); - const rightEyeData = eyePredictionsData.slice(irisLandmarks.numCoordinates * 3); - const { rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords } = this.getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize); - const leftToRightEyeDepthDifference = this.getLeftToRightEyeDepthDifference(rawCoords); - if (Math.abs(leftToRightEyeDepthDifference) < 30) { - replaceRawCoordinates(rawCoords, leftEyeRawCoords, "left", null); - replaceRawCoordinates(rawCoords, rightEyeRawCoords, "right", null); - } else if (leftToRightEyeDepthDifference < 1) { - replaceRawCoordinates(rawCoords, leftEyeRawCoords, "left", ["EyeUpper0", "EyeLower0"]); - } else { - replaceRawCoordinates(rawCoords, rightEyeRawCoords, "right", ["EyeUpper0", "EyeLower0"]); - } - const adjustedLeftIrisCoords = this.getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, "left"); - const adjustedRightIrisCoords = this.getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, "right"); - rawCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords); - } - const mesh = this.transformRawCoords(rawCoords, box4, angle, rotationMatrix); - const storeConfidence = box4.confidence; - box4 = enlargeBox(calculateLandmarksBoundingBox(mesh), 1.5); - box4.confidence = storeConfidence; - if (config3.face.detector.rotation && config3.face.mesh.enabled && config3.face.description.enabled && tfjs_esm_exports.ENV.flags.IS_BROWSER) { - const [indexOfMouth, indexOfForehead] = box4.landmarks.length >= meshLandmarks.count ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine; - angle = computeRotation(box4.landmarks[indexOfMouth], box4.landmarks[indexOfForehead]); - const faceCenter = getBoxCenter({ startPoint: box4.startPoint, endPoint: box4.endPoint }); - const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]]; - const rotatedImage = tfjs_esm_exports.image.rotateWithOffset(input.toFloat(), angle, 0, faceCenterNormalized); - rotationMatrix = buildRotationMatrix(-angle, faceCenter); - face5 = cutBoxFromImageAndResize({ startPoint: box4.startPoint, endPoint: box4.endPoint }, rotatedImage, [this.meshSize, this.meshSize]).div(255); - } - const prediction = { - mesh, - box: box4, - faceConfidence, - boxConfidence: box4.confidence, - image: face5 - }; - const storedBox = squarifyBox(box4); - storedBox.confidence = box4.confidence; - storedBox.faceConfidence = faceConfidence; - this.storedBoxes[i] = storedBox; - return prediction; - })); - if (config3.face.mesh.enabled) - this.storedBoxes = this.storedBoxes.filter((a) => a.confidence > config3.face.detector.minConfidence); - this.detectedFaces = results.length; - return results; - } -}; - -// src/blazeface/facemesh.ts -var faceModels = [null, null, null]; -var facePipeline; -async function predict(input, config3) { - const predictions = await facePipeline.predict(input, config3); - const results = []; - for (const prediction of predictions || []) { - if (!prediction || prediction.isDisposedInternal) - continue; - const meshRaw = prediction.mesh.map((pt) => [ - pt[0] / input.shape[2], - pt[1] / input.shape[1], - pt[2] / facePipeline.meshSize - ]); - const annotations3 = {}; - if (prediction.mesh && prediction.mesh.length > 0) { - for (const key of Object.keys(MESH_ANNOTATIONS)) - annotations3[key] = MESH_ANNOTATIONS[key].map((index) => prediction.mesh[index]); - } - const clampedBox = prediction.box ? [ - Math.max(0, prediction.box.startPoint[0]), - Math.max(0, prediction.box.startPoint[1]), - Math.min(input.shape[2], prediction.box.endPoint[0]) - Math.max(0, prediction.box.startPoint[0]), - Math.min(input.shape[1], prediction.box.endPoint[1]) - Math.max(0, prediction.box.startPoint[1]) - ] : 0; - const boxRaw = prediction.box ? [ - prediction.box.startPoint[0] / input.shape[2], - prediction.box.startPoint[1] / input.shape[1], - (prediction.box.endPoint[0] - prediction.box.startPoint[0]) / input.shape[2], - (prediction.box.endPoint[1] - prediction.box.startPoint[1]) / input.shape[1] - ] : []; - results.push({ - confidence: Math.round(100 * prediction.faceConfidence || 100 * prediction.boxConfidence || 0) / 100, - boxConfidence: Math.round(100 * prediction.boxConfidence) / 100, - faceConfidence: Math.round(100 * prediction.faceConfidence) / 100, - box: clampedBox, - boxRaw, - mesh: prediction.mesh, - meshRaw, - annotations: annotations3, - image: prediction.image - }); - if (prediction.coords) - prediction.coords.dispose(); - } - return results; -} -async function load2(config3) { - if (!faceModels[0] && config3.face.enabled || !faceModels[1] && config3.face.mesh.enabled || !faceModels[2] && config3.face.iris.enabled) { - faceModels = await Promise.all([ - !faceModels[0] && config3.face.enabled ? load(config3) : null, - !faceModels[1] && config3.face.mesh.enabled ? tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.face.mesh.modelPath), { fromTFHub: config3.face.mesh.modelPath.includes("tfhub.dev") }) : null, - !faceModels[2] && config3.face.iris.enabled ? tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.face.iris.modelPath), { fromTFHub: config3.face.iris.modelPath.includes("tfhub.dev") }) : null - ]); - if (config3.face.mesh.enabled) { - if (!faceModels[1] || !faceModels[1].modelUrl) - log("load model failed:", config3.face.mesh.modelPath); - else if (config3.debug) - log("load model:", faceModels[1].modelUrl); - } - if (config3.face.iris.enabled) { - if (!faceModels[2] || !faceModels[1].modelUrl) - log("load model failed:", config3.face.iris.modelPath); - else if (config3.debug) - log("load model:", faceModels[2].modelUrl); - } - } else if (config3.debug) { - log("cached model:", faceModels[0].model.modelUrl); - log("cached model:", faceModels[1].modelUrl); - log("cached model:", faceModels[2].modelUrl); - } - facePipeline = new Pipeline(faceModels[0], faceModels[1], faceModels[2]); - return faceModels; -} -var triangulation = TRI468; -var uvmap = UV468; - -// src/emotion/emotion.ts -var emotion_exports = {}; -__export(emotion_exports, { - load: () => load3, - predict: () => predict2 -}); -var annotations = ["angry", "disgust", "fear", "happy", "sad", "surprise", "neutral"]; -var model; -var last = []; -var lastCount = 0; -var skipped = Number.MAX_SAFE_INTEGER; -var rgb = [0.2989, 0.587, 0.114]; -async function load3(config3) { - if (!model) { - model = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.face.emotion.modelPath)); - if (!model || !model.modelUrl) - log("load model failed:", config3.face.emotion.modelPath); - else if (config3.debug) - log("load model:", model.modelUrl); - } else if (config3.debug) - log("cached model:", model.modelUrl); - return model; -} -async function predict2(image13, config3, idx, count2) { - if (!model) - return null; - if (skipped < config3.face.emotion.skipFrames && config3.skipFrame && lastCount === count2 && last[idx] && last[idx].length > 0) { - skipped++; - return last[idx]; - } - skipped = 0; - return new Promise(async (resolve) => { - const resize = tfjs_esm_exports.image.resizeBilinear(image13, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false); - const [red, green, blue] = tfjs_esm_exports.split(resize, 3, 3); - resize.dispose(); - const redNorm = tfjs_esm_exports.mul(red, rgb[0]); - const greenNorm = tfjs_esm_exports.mul(green, rgb[1]); - const blueNorm = tfjs_esm_exports.mul(blue, rgb[2]); - red.dispose(); - green.dispose(); - blue.dispose(); - const grayscale = tfjs_esm_exports.addN([redNorm, greenNorm, blueNorm]); - redNorm.dispose(); - greenNorm.dispose(); - blueNorm.dispose(); - const normalize = tfjs_esm_exports.tidy(() => grayscale.sub(0.5).mul(2)); - grayscale.dispose(); - const obj = []; - if (config3.face.emotion.enabled) { - const emotionT = await model.predict(normalize); - const data2 = emotionT.dataSync(); - tfjs_esm_exports.dispose(emotionT); - for (let i = 0; i < data2.length; i++) { - if (data2[i] > config3.face.emotion.minConfidence) - obj.push({ score: Math.min(0.99, Math.trunc(100 * data2[i]) / 100), emotion: annotations[i] }); - } - obj.sort((a, b) => b.score - a.score); - } - normalize.dispose(); - last[idx] = obj; - lastCount = count2; - resolve(obj); - }); -} - -// src/faceres/faceres.ts -var faceres_exports = {}; -__export(faceres_exports, { - enhance: () => enhance, - load: () => load4, - match: () => match, - predict: () => predict3, - similarity: () => similarity -}); -var model2; -var last2 = []; -var lastCount2 = 0; -var skipped2 = Number.MAX_SAFE_INTEGER; -async function load4(config3) { - if (!model2) { - model2 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.face.description.modelPath)); - if (!model2 || !model2.modelUrl) - log("load model failed:", config3.face.description.modelPath); - else if (config3.debug) - log("load model:", model2.modelUrl); - } else if (config3.debug) - log("cached model:", model2.modelUrl); - return model2; -} -function similarity(embedding1, embedding2, order = 2) { - if (!embedding1 || !embedding2) - return 0; - if ((embedding1 == null ? void 0 : embedding1.length) === 0 || (embedding2 == null ? void 0 : embedding2.length) === 0) - return 0; - if ((embedding1 == null ? void 0 : embedding1.length) !== (embedding2 == null ? void 0 : embedding2.length)) - return 0; - const distance = 5 * embedding1.map((val, i) => Math.abs(embedding1[i] - embedding2[i]) ** order).reduce((sum, now2) => sum + now2, 0) ** (1 / order); - const res = Math.max(0, 100 - distance) / 100; - return res; -} -function match(embedding, db, threshold = 0) { - let best = { similarity: 0, name: "", source: "", embedding: [] }; - if (!embedding || !db || !Array.isArray(embedding) || !Array.isArray(db)) - return best; - for (const f of db) { - if (f.embedding && f.name) { - const perc = similarity(embedding, f.embedding); - if (perc > threshold && perc > best.similarity) - best = { ...f, similarity: perc }; - } - } - return best; -} -function enhance(input) { - const image13 = tfjs_esm_exports.tidy(() => { - const tensor = input.image || input.tensor || input; - if (!(tensor instanceof tfjs_esm_exports.Tensor)) - return null; - const box4 = [[0.05, 0.15, 0.85, 0.85]]; - const crop = tensor.shape.length === 3 ? tfjs_esm_exports.image.cropAndResize(tfjs_esm_exports.expandDims(tensor, 0), box4, [0], [model2.inputs[0].shape[2], model2.inputs[0].shape[1]]) : tfjs_esm_exports.image.cropAndResize(tensor, box4, [0], [model2.inputs[0].shape[2], model2.inputs[0].shape[1]]); - const norm = crop.mul(255); - return norm; - }); - return image13; -} -async function predict3(image13, config3, idx, count2) { - var _a, _b; - if (!model2) - return null; - if (skipped2 < config3.face.description.skipFrames && config3.skipFrame && lastCount2 === count2 && ((_a = last2[idx]) == null ? void 0 : _a.age) && ((_b = last2[idx]) == null ? void 0 : _b.age) > 0) { - skipped2++; - return last2; - } - skipped2 = 0; - return new Promise(async (resolve) => { - const enhanced = enhance(image13); - let resT; - const obj = { - age: 0, - gender: "unknown", - genderConfidence: 0, - descriptor: [] - }; - if (config3.face.description.enabled) - resT = await model2.predict(enhanced); - tfjs_esm_exports.dispose(enhanced); - if (resT) { - tfjs_esm_exports.tidy(() => { - const gender = resT.find((t) => t.shape[1] === 1).dataSync(); - const confidence = Math.trunc(200 * Math.abs(gender[0] - 0.5)) / 100; - if (confidence > config3.face.description.minConfidence) { - obj.gender = gender[0] <= 0.5 ? "female" : "male"; - obj.genderConfidence = Math.min(0.99, confidence); - } - const age = resT.find((t) => t.shape[1] === 100).argMax(1).dataSync()[0]; - const all2 = resT.find((t) => t.shape[1] === 100).dataSync(); - obj.age = Math.round(all2[age - 1] > all2[age + 1] ? 10 * age - 100 * all2[age - 1] : 10 * age + 100 * all2[age + 1]) / 10; - const desc = resT.find((t) => t.shape[1] === 1024); - obj.descriptor = [...desc.dataSync()]; - }); - resT.forEach((t) => tfjs_esm_exports.dispose(t)); - } - last2[idx] = obj; - lastCount2 = count2; - resolve(obj); - }); -} - -// src/face.ts -var calculateFaceAngle = (face5, image_size) => { - const degrees = (theta) => theta * 180 / Math.PI; - const normalize = (v) => { - const length = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); - v[0] /= length; - v[1] /= length; - v[2] /= length; - return v; - }; - const subVectors = (a, b) => { - const x = a[0] - b[0]; - const y = a[1] - b[1]; - const z = a[2] - b[2]; - return [x, y, z]; - }; - const crossVectors = (a, b) => { - const x = a[1] * b[2] - a[2] * b[1]; - const y = a[2] * b[0] - a[0] * b[2]; - const z = a[0] * b[1] - a[1] * b[0]; - return [x, y, z]; - }; - const rotationMatrixToEulerAngle = (r) => { - const [r00, r01, r02, r10, r11, r12, r20, r21, r22] = r; - let thetaX; - let thetaY; - let thetaZ; - if (r10 < 1) { - if (r10 > -1) { - thetaZ = Math.asin(r10); - thetaY = Math.atan2(-r20, r00); - thetaX = Math.atan2(-r12, r11); - } else { - thetaZ = -Math.PI / 2; - thetaY = -Math.atan2(r21, r22); - thetaX = 0; - } - } else { - thetaZ = Math.PI / 2; - thetaY = Math.atan2(r21, r22); - thetaX = 0; - } - return { pitch: 2 * -thetaX, yaw: 2 * -thetaY, roll: 2 * -thetaZ }; - }; - const meshToEulerAngle = (mesh2) => { - const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1); - const angle2 = { - pitch: radians(mesh2[10][1], mesh2[10][2], mesh2[152][1], mesh2[152][2]), - yaw: radians(mesh2[33][0], mesh2[33][2], mesh2[263][0], mesh2[263][2]), - roll: radians(mesh2[33][0], mesh2[33][1], mesh2[263][0], mesh2[263][1]) - }; - return angle2; - }; - const mesh = face5.meshRaw; - if (!mesh || mesh.length < 300) - return { angle: { pitch: 0, yaw: 0, roll: 0 }, matrix: [1, 0, 0, 0, 1, 0, 0, 0, 1] }; - const size = Math.max(face5.boxRaw[2] * image_size[0], face5.boxRaw[3] * image_size[1]) / 1.5; - const pts = [mesh[10], mesh[152], mesh[234], mesh[454]].map((pt) => [ - pt[0] * image_size[0] / size, - pt[1] * image_size[1] / size, - pt[2] - ]); - const y_axis = normalize(subVectors(pts[1], pts[0])); - let x_axis = normalize(subVectors(pts[3], pts[2])); - const z_axis = normalize(crossVectors(x_axis, y_axis)); - x_axis = crossVectors(y_axis, z_axis); - const matrix = [ - x_axis[0], - x_axis[1], - x_axis[2], - y_axis[0], - y_axis[1], - y_axis[2], - z_axis[0], - z_axis[1], - z_axis[2] - ]; - const angle = rotationMatrixToEulerAngle(matrix); - return { angle, matrix }; -}; -var detectFace = async (parent, input) => { - var _a, _b, _c, _d, _e, _f, _g, _h; - let timeStamp; - let ageRes; - let genderRes; - let emotionRes; - let embeddingRes; - let descRes; - const faceRes = []; - parent.state = "run:face"; - timeStamp = now(); - const faces = await predict(input, parent.config); - parent.perf.face = Math.trunc(now() - timeStamp); - if (!faces) - return []; - for (let i = 0; i < faces.length; i++) { - parent.analyze("Get Face"); - if (!faces[i].image || faces[i].image.isDisposedInternal) { - log("Face object is disposed:", faces[i].image); - continue; - } - const rotation = calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]); - parent.analyze("Start Emotion:"); - if (parent.config.async) { - emotionRes = parent.config.face.emotion.enabled ? predict2(faces[i].image, parent.config, i, faces.length) : {}; - } else { - parent.state = "run:emotion"; - timeStamp = now(); - emotionRes = parent.config.face.emotion.enabled ? await predict2(faces[i].image, parent.config, i, faces.length) : {}; - parent.perf.emotion = Math.trunc(now() - timeStamp); - } - parent.analyze("End Emotion:"); - parent.analyze("Start Description:"); - if (parent.config.async) { - descRes = parent.config.face.description.enabled ? predict3(faces[i], parent.config, i, faces.length) : []; - } else { - parent.state = "run:description"; - timeStamp = now(); - descRes = parent.config.face.description.enabled ? await predict3(faces[i].image, parent.config, i, faces.length) : []; - parent.perf.embedding = Math.trunc(now() - timeStamp); - } - parent.analyze("End Description:"); - if (parent.config.async) { - [ageRes, genderRes, emotionRes, embeddingRes, descRes] = await Promise.all([ageRes, genderRes, emotionRes, embeddingRes, descRes]); - } - parent.analyze("Finish Face:"); - if (!parent.config.face.iris.enabled && ((_b = (_a = faces[i]) == null ? void 0 : _a.annotations) == null ? void 0 : _b.leftEyeIris) && ((_d = (_c = faces[i]) == null ? void 0 : _c.annotations) == null ? void 0 : _d.rightEyeIris)) { - delete faces[i].annotations.leftEyeIris; - delete faces[i].annotations.rightEyeIris; - } - const irisSize = ((_e = faces[i].annotations) == null ? void 0 : _e.leftEyeIris) && ((_f = faces[i].annotations) == null ? void 0 : _f.rightEyeIris) ? 11.7 * Math.max(Math.abs(faces[i].annotations.leftEyeIris[3][0] - faces[i].annotations.leftEyeIris[1][0]), Math.abs(faces[i].annotations.rightEyeIris[4][1] - faces[i].annotations.rightEyeIris[2][1])) : 0; - faceRes.push({ - id: i, - ...faces[i], - age: descRes.age, - gender: descRes.gender, - genderConfidence: descRes.genderConfidence, - embedding: descRes.descriptor, - emotion: emotionRes, - iris: irisSize !== 0 ? Math.trunc(irisSize) / 100 : 0, - rotation, - tensor: parent.config.face.detector.return ? (_g = faces[i].image) == null ? void 0 : _g.squeeze() : null - }); - (_h = faces[i].image) == null ? void 0 : _h.dispose(); - parent.analyze("End Face"); - } - parent.analyze("End FaceMesh:"); - if (parent.config.async) { - if (parent.perf.face) - delete parent.perf.face; - if (parent.perf.age) - delete parent.perf.age; - if (parent.perf.gender) - delete parent.perf.gender; - if (parent.perf.emotion) - delete parent.perf.emotion; - } - return faceRes; -}; - -// src/posenet/posenet.ts -var posenet_exports = {}; -__export(posenet_exports, { - load: () => load5, - predict: () => predict4 -}); - -// src/posenet/keypoints.ts -var partNames = [ - "nose", - "leftEye", - "rightEye", - "leftEar", - "rightEar", - "leftShoulder", - "rightShoulder", - "leftElbow", - "rightElbow", - "leftWrist", - "rightWrist", - "leftHip", - "rightHip", - "leftKnee", - "rightKnee", - "leftAnkle", - "rightAnkle" -]; -var count = partNames.length; -var partIds = partNames.reduce((result, jointName, i) => { - result[jointName] = i; - return result; -}, {}); -var connectedPartNames = [ - ["leftHip", "leftShoulder"], - ["leftElbow", "leftShoulder"], - ["leftElbow", "leftWrist"], - ["leftHip", "leftKnee"], - ["leftKnee", "leftAnkle"], - ["rightHip", "rightShoulder"], - ["rightElbow", "rightShoulder"], - ["rightElbow", "rightWrist"], - ["rightHip", "rightKnee"], - ["rightKnee", "rightAnkle"], - ["leftShoulder", "rightShoulder"], - ["leftHip", "rightHip"] -]; -var connectedPartIndices = connectedPartNames.map(([jointNameA, jointNameB]) => [partIds[jointNameA], partIds[jointNameB]]); -var poseChain = [ - ["nose", "leftEye"], - ["leftEye", "leftEar"], - ["nose", "rightEye"], - ["rightEye", "rightEar"], - ["nose", "leftShoulder"], - ["leftShoulder", "leftElbow"], - ["leftElbow", "leftWrist"], - ["leftShoulder", "leftHip"], - ["leftHip", "leftKnee"], - ["leftKnee", "leftAnkle"], - ["nose", "rightShoulder"], - ["rightShoulder", "rightElbow"], - ["rightElbow", "rightWrist"], - ["rightShoulder", "rightHip"], - ["rightHip", "rightKnee"], - ["rightKnee", "rightAnkle"] -]; - -// src/posenet/utils.ts -function getBoundingBox(keypoints) { - const coord = keypoints.reduce(({ maxX, maxY, minX, minY }, { position: { x, y } }) => ({ - maxX: Math.max(maxX, x), - maxY: Math.max(maxY, y), - minX: Math.min(minX, x), - minY: Math.min(minY, y) - }), { - maxX: Number.NEGATIVE_INFINITY, - maxY: Number.NEGATIVE_INFINITY, - minX: Number.POSITIVE_INFINITY, - minY: Number.POSITIVE_INFINITY - }); - return [coord.minX, coord.minY, coord.maxX - coord.minX, coord.maxY - coord.minY]; -} -function scalePoses(poses2, [height, width], [inputResolutionHeight, inputResolutionWidth]) { - const scaleY = height / inputResolutionHeight; - const scaleX = width / inputResolutionWidth; - const scalePose = (pose, i) => ({ - id: i, - score: pose.score, - bowRaw: [pose.box[0] / inputResolutionWidth, pose.box[1] / inputResolutionHeight, pose.box[2] / inputResolutionWidth, pose.box[3] / inputResolutionHeight], - box: [Math.trunc(pose.box[0] * scaleX), Math.trunc(pose.box[1] * scaleY), Math.trunc(pose.box[2] * scaleX), Math.trunc(pose.box[3] * scaleY)], - keypoints: pose.keypoints.map(({ score, part, position }) => ({ - score, - part, - position: { x: Math.trunc(position.x * scaleX), y: Math.trunc(position.y * scaleY) } - })) - }); - const scaledPoses = poses2.map((pose, i) => scalePose(pose, i)); - return scaledPoses; -} -var MaxHeap = class { - constructor(maxSize2, getElementValue) { - this.priorityQueue = new Array(maxSize2); - this.numberOfElements = -1; - this.getElementValue = getElementValue; - } - enqueue(x) { - this.priorityQueue[++this.numberOfElements] = x; - this.swim(this.numberOfElements); - } - dequeue() { - const max = this.priorityQueue[0]; - this.exchange(0, this.numberOfElements--); - this.sink(0); - this.priorityQueue[this.numberOfElements + 1] = null; - return max; - } - empty() { - return this.numberOfElements === -1; - } - size() { - return this.numberOfElements + 1; - } - all() { - return this.priorityQueue.slice(0, this.numberOfElements + 1); - } - max() { - return this.priorityQueue[0]; - } - swim(k) { - while (k > 0 && this.less(Math.floor(k / 2), k)) { - this.exchange(k, Math.floor(k / 2)); - k = Math.floor(k / 2); - } - } - sink(k) { - while (2 * k <= this.numberOfElements) { - let j = 2 * k; - if (j < this.numberOfElements && this.less(j, j + 1)) - j++; - if (!this.less(k, j)) - break; - this.exchange(k, j); - k = j; - } - } - getValueAt(i) { - return this.getElementValue(this.priorityQueue[i]); - } - less(i, j) { - return this.getValueAt(i) < this.getValueAt(j); - } - exchange(i, j) { - const t = this.priorityQueue[i]; - this.priorityQueue[i] = this.priorityQueue[j]; - this.priorityQueue[j] = t; - } -}; -function getOffsetPoint(y, x, keypoint, offsets) { - return { - y: offsets.get(y, x, keypoint), - x: offsets.get(y, x, keypoint + count) - }; -} -function getImageCoords(part, outputStride2, offsets) { - const { heatmapY, heatmapX, id: keypoint } = part; - const { y, x } = getOffsetPoint(heatmapY, heatmapX, keypoint, offsets); - return { - x: part.heatmapX * outputStride2 + x, - y: part.heatmapY * outputStride2 + y - }; -} -function clamp(a, min, max) { - if (a < min) - return min; - if (a > max) - return max; - return a; -} -function squaredDistance(y1, x1, y2, x2) { - const dy = y2 - y1; - const dx = x2 - x1; - return dy * dy + dx * dx; -} -function addVectors(a, b) { - return { x: a.x + b.x, y: a.y + b.y }; -} - -// src/posenet/poses.ts -var localMaximumRadius = 1; -var outputStride = 16; -var squaredNmsRadius = 50 ** 2; -function traverse(edgeId, sourceKeypoint, targetId, scores, offsets, displacements, offsetRefineStep = 2) { - const getDisplacement = (point2) => ({ - y: displacements.get(point2.y, point2.x, edgeId), - x: displacements.get(point2.y, point2.x, displacements.shape[2] / 2 + edgeId) - }); - const getStridedIndexNearPoint = (point2, height2, width2) => ({ - y: clamp(Math.round(point2.y / outputStride), 0, height2 - 1), - x: clamp(Math.round(point2.x / outputStride), 0, width2 - 1) - }); - const [height, width] = scores.shape; - const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width); - const displacement = getDisplacement(sourceKeypointIndices); - const displacedPoint = addVectors(sourceKeypoint.position, displacement); - let targetKeypoint = displacedPoint; - for (let i = 0; i < offsetRefineStep; i++) { - const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width); - const offsetPoint = getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetId, offsets); - targetKeypoint = addVectors({ x: targetKeypointIndices.x * outputStride, y: targetKeypointIndices.y * outputStride }, { x: offsetPoint.x, y: offsetPoint.y }); - } - const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width); - const score = scores.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetId); - return { position: targetKeypoint, part: partNames[targetId], score }; -} -function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) { - const tuples = poseChain.map(([parentJoinName, childJoinName]) => [partIds[parentJoinName], partIds[childJoinName]]); - const edgesFwd = tuples.map(([, childJointId]) => childJointId); - const edgesBwd = tuples.map(([parentJointId]) => parentJointId); - const numParts = scores.shape[2]; - const numEdges = edgesFwd.length; - const keypoints = new Array(numParts); - const rootPoint = getImageCoords(root.part, outputStride, offsets); - keypoints[root.part.id] = { - score: root.score, - part: partNames[root.part.id], - position: rootPoint - }; - for (let edge = numEdges - 1; edge >= 0; --edge) { - const sourceId = edgesFwd[edge]; - const targetId = edgesBwd[edge]; - if (keypoints[sourceId] && !keypoints[targetId]) { - keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsBwd); - } - } - for (let edge = 0; edge < numEdges; ++edge) { - const sourceId = edgesBwd[edge]; - const targetId = edgesFwd[edge]; - if (keypoints[sourceId] && !keypoints[targetId]) { - keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsFwd); - } - } - return keypoints; -} -function scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores) { - const [height, width] = scores.shape; - let localMaximum = true; - const yStart = Math.max(heatmapY - localMaximumRadius, 0); - const yEnd = Math.min(heatmapY + localMaximumRadius + 1, height); - for (let yCurrent = yStart; yCurrent < yEnd; ++yCurrent) { - const xStart = Math.max(heatmapX - localMaximumRadius, 0); - const xEnd = Math.min(heatmapX + localMaximumRadius + 1, width); - for (let xCurrent = xStart; xCurrent < xEnd; ++xCurrent) { - if (scores.get(yCurrent, xCurrent, keypointId) > score) { - localMaximum = false; - break; - } - } - if (!localMaximum) - break; - } - return localMaximum; -} -function buildPartWithScoreQueue(minConfidence, scores) { - const [height, width, numKeypoints] = scores.shape; - const queue = new MaxHeap(height * width * numKeypoints, ({ score }) => score); - for (let heatmapY = 0; heatmapY < height; ++heatmapY) { - for (let heatmapX = 0; heatmapX < width; ++heatmapX) { - for (let keypointId = 0; keypointId < numKeypoints; ++keypointId) { - const score = scores.get(heatmapY, heatmapX, keypointId); - if (score < minConfidence) - continue; - if (scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores)) - queue.enqueue({ score, part: { heatmapY, heatmapX, id: keypointId } }); - } - } - } - return queue; -} -function withinRadius(poses2, { x, y }, keypointId) { - return poses2.some(({ keypoints }) => { - var _a; - const correspondingKeypoint = (_a = keypoints[keypointId]) == null ? void 0 : _a.position; - if (!correspondingKeypoint) - return false; - return squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius; - }); -} -function getInstanceScore(existingPoses, keypoints) { - const notOverlappedKeypointScores = keypoints.reduce((result, { position, score }, keypointId) => { - if (!withinRadius(existingPoses, position, keypointId)) - result += score; - return result; - }, 0); - return notOverlappedKeypointScores / keypoints.length; -} -function decode(offsets, scores, displacementsFwd, displacementsBwd, maxDetected, minConfidence) { - const poses2 = []; - const queue = buildPartWithScoreQueue(minConfidence, scores); - while (poses2.length < maxDetected && !queue.empty()) { - const root = queue.dequeue(); - const rootImageCoords = getImageCoords(root.part, outputStride, offsets); - if (withinRadius(poses2, rootImageCoords, root.part.id)) - continue; - let keypoints = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd); - keypoints = keypoints.filter((a) => a.score > minConfidence); - const score = getInstanceScore(poses2, keypoints); - const box4 = getBoundingBox(keypoints); - if (score > minConfidence) - poses2.push({ keypoints, box: box4, score: Math.round(100 * score) / 100 }); - } - return poses2; -} - -// src/posenet/posenet.ts -var model3; -var poseNetOutputs = ["MobilenetV1/offset_2/BiasAdd", "MobilenetV1/heatmap_2/BiasAdd", "MobilenetV1/displacement_fwd_2/BiasAdd", "MobilenetV1/displacement_bwd_2/BiasAdd"]; -async function predict4(input, config3) { - const res = tfjs_esm_exports.tidy(() => { - const resized = input.resizeBilinear([model3.inputs[0].shape[2], model3.inputs[0].shape[1]]); - const normalized = resized.toFloat().div(127.5).sub(1); - const results = model3.execute(normalized, poseNetOutputs); - const results3d = results.map((y) => y.squeeze([0])); - results3d[1] = results3d[1].sigmoid(); - return results3d; - }); - const buffers = await Promise.all(res.map((tensor) => tensor.buffer())); - for (const t of res) - t.dispose(); - const decoded = await decode(buffers[0], buffers[1], buffers[2], buffers[3], config3.body.maxDetected, config3.body.minConfidence); - const scaled = scalePoses(decoded, [input.shape[1], input.shape[2]], [model3.inputs[0].shape[2], model3.inputs[0].shape[1]]); - return scaled; -} -async function load5(config3) { - if (!model3) { - model3 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.body.modelPath)); - if (!model3 || !model3.modelUrl) - log("load model failed:", config3.body.modelPath); - else if (config3.debug) - log("load model:", model3.modelUrl); - } else if (config3.debug) - log("cached model:", model3.modelUrl); - return model3; -} - -// src/handpose/handpose.ts -var handpose_exports = {}; -__export(handpose_exports, { - load: () => load6, - predict: () => predict5 -}); - -// src/handpose/box.ts -function getBoxSize2(box4) { - return [ - Math.abs(box4.endPoint[0] - box4.startPoint[0]), - Math.abs(box4.endPoint[1] - box4.startPoint[1]) - ]; -} -function getBoxCenter2(box4) { - return [ - box4.startPoint[0] + (box4.endPoint[0] - box4.startPoint[0]) / 2, - box4.startPoint[1] + (box4.endPoint[1] - box4.startPoint[1]) / 2 - ]; -} -function cutBoxFromImageAndResize2(box4, image13, cropSize) { - const h = image13.shape[1]; - const w = image13.shape[2]; - const boxes = [[ - box4.startPoint[1] / h, - box4.startPoint[0] / w, - box4.endPoint[1] / h, - box4.endPoint[0] / w - ]]; - return tfjs_esm_exports.image.cropAndResize(image13, boxes, [0], cropSize); -} -function scaleBoxCoordinates2(box4, factor) { - const startPoint = [box4.startPoint[0] * factor[0], box4.startPoint[1] * factor[1]]; - const endPoint = [box4.endPoint[0] * factor[0], box4.endPoint[1] * factor[1]]; - const palmLandmarks = box4.palmLandmarks.map((coord) => { - const scaledCoord = [coord[0] * factor[0], coord[1] * factor[1]]; - return scaledCoord; - }); - return { startPoint, endPoint, palmLandmarks, confidence: box4.confidence }; -} -function enlargeBox2(box4, factor = 1.5) { - const center = getBoxCenter2(box4); - const size = getBoxSize2(box4); - const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2]; - const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]]; - const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]]; - return { startPoint, endPoint, palmLandmarks: box4.palmLandmarks }; -} -function squarifyBox2(box4) { - const centers = getBoxCenter2(box4); - const size = getBoxSize2(box4); - const maxEdge = Math.max(...size); - const halfSize = maxEdge / 2; - const startPoint = [centers[0] - halfSize, centers[1] - halfSize]; - const endPoint = [centers[0] + halfSize, centers[1] + halfSize]; - return { startPoint, endPoint, palmLandmarks: box4.palmLandmarks }; -} - -// src/handpose/anchors.ts -var anchors = [ - { - x: 0.015625, - y: 0.015625 - }, - { - x: 0.015625, - y: 0.015625 - }, - { - x: 0.046875, - y: 0.015625 - }, - { - x: 0.046875, - y: 0.015625 - }, - { - x: 0.078125, - y: 0.015625 - }, - { - x: 0.078125, - y: 0.015625 - }, - { - x: 0.109375, - y: 0.015625 - }, - { - x: 0.109375, - y: 0.015625 - }, - { - x: 0.140625, - y: 0.015625 - }, - { - x: 0.140625, - y: 0.015625 - }, - { - x: 0.171875, - y: 0.015625 - }, - { - x: 0.171875, - y: 0.015625 - }, - { - x: 0.203125, - y: 0.015625 - }, - { - x: 0.203125, - y: 0.015625 - }, - { - x: 0.234375, - y: 0.015625 - }, - { - x: 0.234375, - y: 0.015625 - }, - { - x: 0.265625, - y: 0.015625 - }, - { - x: 0.265625, - y: 0.015625 - }, - { - x: 0.296875, - y: 0.015625 - }, - { - x: 0.296875, - y: 0.015625 - }, - { - x: 0.328125, - y: 0.015625 - }, - { - x: 0.328125, - y: 0.015625 - }, - { - x: 0.359375, - y: 0.015625 - }, - { - x: 0.359375, - y: 0.015625 - }, - { - x: 0.390625, - y: 0.015625 - }, - { - x: 0.390625, - y: 0.015625 - }, - { - x: 0.421875, - y: 0.015625 - }, - { - x: 0.421875, - y: 0.015625 - }, - { - x: 0.453125, - y: 0.015625 - }, - { - x: 0.453125, - y: 0.015625 - }, - { - x: 0.484375, - y: 0.015625 - }, - { - x: 0.484375, - y: 0.015625 - }, - { - x: 0.515625, - y: 0.015625 - }, - { - x: 0.515625, - y: 0.015625 - }, - { - x: 0.546875, - y: 0.015625 - }, - { - x: 0.546875, - y: 0.015625 - }, - { - x: 0.578125, - y: 0.015625 - }, - { - x: 0.578125, - y: 0.015625 - }, - { - x: 0.609375, - y: 0.015625 - }, - { - x: 0.609375, - y: 0.015625 - }, - { - x: 0.640625, - y: 0.015625 - }, - { - x: 0.640625, - y: 0.015625 - }, - { - x: 0.671875, - y: 0.015625 - }, - { - x: 0.671875, - y: 0.015625 - }, - { - x: 0.703125, - y: 0.015625 - }, - { - x: 0.703125, - y: 0.015625 - }, - { - x: 0.734375, - y: 0.015625 - }, - { - x: 0.734375, - y: 0.015625 - }, - { - x: 0.765625, - y: 0.015625 - }, - { - x: 0.765625, - y: 0.015625 - }, - { - x: 0.796875, - y: 0.015625 - }, - { - x: 0.796875, - y: 0.015625 - }, - { - x: 0.828125, - y: 0.015625 - }, - { - x: 0.828125, - y: 0.015625 - }, - { - x: 0.859375, - y: 0.015625 - }, - { - x: 0.859375, - y: 0.015625 - }, - { - x: 0.890625, - y: 0.015625 - }, - { - x: 0.890625, - y: 0.015625 - }, - { - x: 0.921875, - y: 0.015625 - }, - { - x: 0.921875, - y: 0.015625 - }, - { - x: 0.953125, - y: 0.015625 - }, - { - x: 0.953125, - y: 0.015625 - }, - { - x: 0.984375, - y: 0.015625 - }, - { - x: 0.984375, - y: 0.015625 - }, - { - x: 0.015625, - y: 0.046875 - }, - { - x: 0.015625, - y: 0.046875 - }, - { - x: 0.046875, - y: 0.046875 - }, - { - x: 0.046875, - y: 0.046875 - }, - { - x: 0.078125, - y: 0.046875 - }, - { - x: 0.078125, - y: 0.046875 - }, - { - x: 0.109375, - y: 0.046875 - }, - { - x: 0.109375, - y: 0.046875 - }, - { - x: 0.140625, - y: 0.046875 - }, - { - x: 0.140625, - y: 0.046875 - }, - { - x: 0.171875, - y: 0.046875 - }, - { - x: 0.171875, - y: 0.046875 - }, - { - x: 0.203125, - y: 0.046875 - }, - { - x: 0.203125, - y: 0.046875 - }, - { - x: 0.234375, - y: 0.046875 - }, - { - x: 0.234375, - y: 0.046875 - }, - { - x: 0.265625, - y: 0.046875 - }, - { - x: 0.265625, - y: 0.046875 - }, - { - x: 0.296875, - y: 0.046875 - }, - { - x: 0.296875, - y: 0.046875 - }, - { - x: 0.328125, - y: 0.046875 - }, - { - x: 0.328125, - y: 0.046875 - }, - { - x: 0.359375, - y: 0.046875 - }, - { - x: 0.359375, - y: 0.046875 - }, - { - x: 0.390625, - y: 0.046875 - }, - { - x: 0.390625, - y: 0.046875 - }, - { - x: 0.421875, - y: 0.046875 - }, - { - x: 0.421875, - y: 0.046875 - }, - { - x: 0.453125, - y: 0.046875 - }, - { - x: 0.453125, - y: 0.046875 - }, - { - x: 0.484375, - y: 0.046875 - }, - { - x: 0.484375, - y: 0.046875 - }, - { - x: 0.515625, - y: 0.046875 - }, - { - x: 0.515625, - y: 0.046875 - }, - { - x: 0.546875, - y: 0.046875 - }, - { - x: 0.546875, - y: 0.046875 - }, - { - x: 0.578125, - y: 0.046875 - }, - { - x: 0.578125, - y: 0.046875 - }, - { - x: 0.609375, - y: 0.046875 - }, - { - x: 0.609375, - y: 0.046875 - }, - { - x: 0.640625, - y: 0.046875 - }, - { - x: 0.640625, - y: 0.046875 - }, - { - x: 0.671875, - y: 0.046875 - }, - { - x: 0.671875, - y: 0.046875 - }, - { - x: 0.703125, - y: 0.046875 - }, - { - x: 0.703125, - y: 0.046875 - }, - { - x: 0.734375, - y: 0.046875 - }, - { - x: 0.734375, - y: 0.046875 - }, - { - x: 0.765625, - y: 0.046875 - }, - { - x: 0.765625, - y: 0.046875 - }, - { - x: 0.796875, - y: 0.046875 - }, - { - x: 0.796875, - y: 0.046875 - }, - { - x: 0.828125, - y: 0.046875 - }, - { - x: 0.828125, - y: 0.046875 - }, - { - x: 0.859375, - y: 0.046875 - }, - { - x: 0.859375, - y: 0.046875 - }, - { - x: 0.890625, - y: 0.046875 - }, - { - x: 0.890625, - y: 0.046875 - }, - { - x: 0.921875, - y: 0.046875 - }, - { - x: 0.921875, - y: 0.046875 - }, - { - x: 0.953125, - y: 0.046875 - }, - { - x: 0.953125, - y: 0.046875 - }, - { - x: 0.984375, - y: 0.046875 - }, - { - x: 0.984375, - y: 0.046875 - }, - { - x: 0.015625, - y: 0.078125 - }, - { - x: 0.015625, - y: 0.078125 - }, - { - x: 0.046875, - y: 0.078125 - }, - { - x: 0.046875, - y: 0.078125 - }, - { - x: 0.078125, - y: 0.078125 - }, - { - x: 0.078125, - y: 0.078125 - }, - { - x: 0.109375, - y: 0.078125 - }, - { - x: 0.109375, - y: 0.078125 - }, - { - x: 0.140625, - y: 0.078125 - }, - { - x: 0.140625, - y: 0.078125 - }, - { - x: 0.171875, - y: 0.078125 - }, - { - x: 0.171875, - y: 0.078125 - }, - { - x: 0.203125, - y: 0.078125 - }, - { - x: 0.203125, - y: 0.078125 - }, - { - x: 0.234375, - y: 0.078125 - }, - { - x: 0.234375, - y: 0.078125 - }, - { - x: 0.265625, - y: 0.078125 - }, - { - x: 0.265625, - y: 0.078125 - }, - { - x: 0.296875, - y: 0.078125 - }, - { - x: 0.296875, - y: 0.078125 - }, - { - x: 0.328125, - y: 0.078125 - }, - { - x: 0.328125, - y: 0.078125 - }, - { - x: 0.359375, - y: 0.078125 - }, - { - x: 0.359375, - y: 0.078125 - }, - { - x: 0.390625, - y: 0.078125 - }, - { - x: 0.390625, - y: 0.078125 - }, - { - x: 0.421875, - y: 0.078125 - }, - { - x: 0.421875, - y: 0.078125 - }, - { - x: 0.453125, - y: 0.078125 - }, - { - x: 0.453125, - y: 0.078125 - }, - { - x: 0.484375, - y: 0.078125 - }, - { - x: 0.484375, - y: 0.078125 - }, - { - x: 0.515625, - y: 0.078125 - }, - { - x: 0.515625, - y: 0.078125 - }, - { - x: 0.546875, - y: 0.078125 - }, - { - x: 0.546875, - y: 0.078125 - }, - { - x: 0.578125, - y: 0.078125 - }, - { - x: 0.578125, - y: 0.078125 - }, - { - x: 0.609375, - y: 0.078125 - }, - { - x: 0.609375, - y: 0.078125 - }, - { - x: 0.640625, - y: 0.078125 - }, - { - x: 0.640625, - y: 0.078125 - }, - { - x: 0.671875, - y: 0.078125 - }, - { - x: 0.671875, - y: 0.078125 - }, - { - x: 0.703125, - y: 0.078125 - }, - { - x: 0.703125, - y: 0.078125 - }, - { - x: 0.734375, - y: 0.078125 - }, - { - x: 0.734375, - y: 0.078125 - }, - { - x: 0.765625, - y: 0.078125 - }, - { - x: 0.765625, - y: 0.078125 - }, - { - x: 0.796875, - y: 0.078125 - }, - { - x: 0.796875, - y: 0.078125 - }, - { - x: 0.828125, - y: 0.078125 - }, - { - x: 0.828125, - y: 0.078125 - }, - { - x: 0.859375, - y: 0.078125 - }, - { - x: 0.859375, - y: 0.078125 - }, - { - x: 0.890625, - y: 0.078125 - }, - { - x: 0.890625, - y: 0.078125 - }, - { - x: 0.921875, - y: 0.078125 - }, - { - x: 0.921875, - y: 0.078125 - }, - { - x: 0.953125, - y: 0.078125 - }, - { - x: 0.953125, - y: 0.078125 - }, - { - x: 0.984375, - y: 0.078125 - }, - { - x: 0.984375, - y: 0.078125 - }, - { - x: 0.015625, - y: 0.109375 - }, - { - x: 0.015625, - y: 0.109375 - }, - { - x: 0.046875, - y: 0.109375 - }, - { - x: 0.046875, - y: 0.109375 - }, - { - x: 0.078125, - y: 0.109375 - }, - { - x: 0.078125, - y: 0.109375 - }, - { - x: 0.109375, - y: 0.109375 - }, - { - x: 0.109375, - y: 0.109375 - }, - { - x: 0.140625, - y: 0.109375 - }, - { - x: 0.140625, - y: 0.109375 - }, - { - x: 0.171875, - y: 0.109375 - }, - { - x: 0.171875, - y: 0.109375 - }, - { - x: 0.203125, - y: 0.109375 - }, - { - x: 0.203125, - y: 0.109375 - }, - { - x: 0.234375, - y: 0.109375 - }, - { - x: 0.234375, - y: 0.109375 - }, - { - x: 0.265625, - y: 0.109375 - }, - { - x: 0.265625, - y: 0.109375 - }, - { - x: 0.296875, - y: 0.109375 - }, - { - x: 0.296875, - y: 0.109375 - }, - { - x: 0.328125, - y: 0.109375 - }, - { - x: 0.328125, - y: 0.109375 - }, - { - x: 0.359375, - y: 0.109375 - }, - { - x: 0.359375, - y: 0.109375 - }, - { - x: 0.390625, - y: 0.109375 - }, - { - x: 0.390625, - y: 0.109375 - }, - { - x: 0.421875, - y: 0.109375 - }, - { - x: 0.421875, - y: 0.109375 - }, - { - x: 0.453125, - y: 0.109375 - }, - { - x: 0.453125, - y: 0.109375 - }, - { - x: 0.484375, - y: 0.109375 - }, - { - x: 0.484375, - y: 0.109375 - }, - { - x: 0.515625, - y: 0.109375 - }, - { - x: 0.515625, - y: 0.109375 - }, - { - x: 0.546875, - y: 0.109375 - }, - { - x: 0.546875, - y: 0.109375 - }, - { - x: 0.578125, - y: 0.109375 - }, - { - x: 0.578125, - y: 0.109375 - }, - { - x: 0.609375, - y: 0.109375 - }, - { - x: 0.609375, - y: 0.109375 - }, - { - x: 0.640625, - y: 0.109375 - }, - { - x: 0.640625, - y: 0.109375 - }, - { - x: 0.671875, - y: 0.109375 - }, - { - x: 0.671875, - y: 0.109375 - }, - { - x: 0.703125, - y: 0.109375 - }, - { - x: 0.703125, - y: 0.109375 - }, - { - x: 0.734375, - y: 0.109375 - }, - { - x: 0.734375, - y: 0.109375 - }, - { - x: 0.765625, - y: 0.109375 - }, - { - x: 0.765625, - y: 0.109375 - }, - { - x: 0.796875, - y: 0.109375 - }, - { - x: 0.796875, - y: 0.109375 - }, - { - x: 0.828125, - y: 0.109375 - }, - { - x: 0.828125, - y: 0.109375 - }, - { - x: 0.859375, - y: 0.109375 - }, - { - x: 0.859375, - y: 0.109375 - }, - { - x: 0.890625, - y: 0.109375 - }, - { - x: 0.890625, - y: 0.109375 - }, - { - x: 0.921875, - y: 0.109375 - }, - { - x: 0.921875, - y: 0.109375 - }, - { - x: 0.953125, - y: 0.109375 - }, - { - x: 0.953125, - y: 0.109375 - }, - { - x: 0.984375, - y: 0.109375 - }, - { - x: 0.984375, - y: 0.109375 - }, - { - x: 0.015625, - y: 0.140625 - }, - { - x: 0.015625, - y: 0.140625 - }, - { - x: 0.046875, - y: 0.140625 - }, - { - x: 0.046875, - y: 0.140625 - }, - { - x: 0.078125, - y: 0.140625 - }, - { - x: 0.078125, - y: 0.140625 - }, - { - x: 0.109375, - y: 0.140625 - }, - { - x: 0.109375, - y: 0.140625 - }, - { - x: 0.140625, - y: 0.140625 - }, - { - x: 0.140625, - y: 0.140625 - }, - { - x: 0.171875, - y: 0.140625 - }, - { - x: 0.171875, - y: 0.140625 - }, - { - x: 0.203125, - y: 0.140625 - }, - { - x: 0.203125, - y: 0.140625 - }, - { - x: 0.234375, - y: 0.140625 - }, - { - x: 0.234375, - y: 0.140625 - }, - { - x: 0.265625, - y: 0.140625 - }, - { - x: 0.265625, - y: 0.140625 - }, - { - x: 0.296875, - y: 0.140625 - }, - { - x: 0.296875, - y: 0.140625 - }, - { - x: 0.328125, - y: 0.140625 - }, - { - x: 0.328125, - y: 0.140625 - }, - { - x: 0.359375, - y: 0.140625 - }, - { - x: 0.359375, - y: 0.140625 - }, - { - x: 0.390625, - y: 0.140625 - }, - { - x: 0.390625, - y: 0.140625 - }, - { - x: 0.421875, - y: 0.140625 - }, - { - x: 0.421875, - y: 0.140625 - }, - { - x: 0.453125, - y: 0.140625 - }, - { - x: 0.453125, - y: 0.140625 - }, - { - x: 0.484375, - y: 0.140625 - }, - { - x: 0.484375, - y: 0.140625 - }, - { - x: 0.515625, - y: 0.140625 - }, - { - x: 0.515625, - y: 0.140625 - }, - { - x: 0.546875, - y: 0.140625 - }, - { - x: 0.546875, - y: 0.140625 - }, - { - x: 0.578125, - y: 0.140625 - }, - { - x: 0.578125, - y: 0.140625 - }, - { - x: 0.609375, - y: 0.140625 - }, - { - x: 0.609375, - y: 0.140625 - }, - { - x: 0.640625, - y: 0.140625 - }, - { - x: 0.640625, - y: 0.140625 - }, - { - x: 0.671875, - y: 0.140625 - }, - { - x: 0.671875, - y: 0.140625 - }, - { - x: 0.703125, - y: 0.140625 - }, - { - x: 0.703125, - y: 0.140625 - }, - { - x: 0.734375, - y: 0.140625 - }, - { - x: 0.734375, - y: 0.140625 - }, - { - x: 0.765625, - y: 0.140625 - }, - { - x: 0.765625, - y: 0.140625 - }, - { - x: 0.796875, - y: 0.140625 - }, - { - x: 0.796875, - y: 0.140625 - }, - { - x: 0.828125, - y: 0.140625 - }, - { - x: 0.828125, - y: 0.140625 - }, - { - x: 0.859375, - y: 0.140625 - }, - { - x: 0.859375, - y: 0.140625 - }, - { - x: 0.890625, - y: 0.140625 - }, - { - x: 0.890625, - y: 0.140625 - }, - { - x: 0.921875, - y: 0.140625 - }, - { - x: 0.921875, - y: 0.140625 - }, - { - x: 0.953125, - y: 0.140625 - }, - { - x: 0.953125, - y: 0.140625 - }, - { - x: 0.984375, - y: 0.140625 - }, - { - x: 0.984375, - y: 0.140625 - }, - { - x: 0.015625, - y: 0.171875 - }, - { - x: 0.015625, - y: 0.171875 - }, - { - x: 0.046875, - y: 0.171875 - }, - { - x: 0.046875, - y: 0.171875 - }, - { - x: 0.078125, - y: 0.171875 - }, - { - x: 0.078125, - y: 0.171875 - }, - { - x: 0.109375, - y: 0.171875 - }, - { - x: 0.109375, - y: 0.171875 - }, - { - x: 0.140625, - y: 0.171875 - }, - { - x: 0.140625, - y: 0.171875 - }, - { - x: 0.171875, - y: 0.171875 - }, - { - x: 0.171875, - y: 0.171875 - }, - { - x: 0.203125, - y: 0.171875 - }, - { - x: 0.203125, - y: 0.171875 - }, - { - x: 0.234375, - y: 0.171875 - }, - { - x: 0.234375, - y: 0.171875 - }, - { - x: 0.265625, - y: 0.171875 - }, - { - x: 0.265625, - y: 0.171875 - }, - { - x: 0.296875, - y: 0.171875 - }, - { - x: 0.296875, - y: 0.171875 - }, - { - x: 0.328125, - y: 0.171875 - }, - { - x: 0.328125, - y: 0.171875 - }, - { - x: 0.359375, - y: 0.171875 - }, - { - x: 0.359375, - y: 0.171875 - }, - { - x: 0.390625, - y: 0.171875 - }, - { - x: 0.390625, - y: 0.171875 - }, - { - x: 0.421875, - y: 0.171875 - }, - { - x: 0.421875, - y: 0.171875 - }, - { - x: 0.453125, - y: 0.171875 - }, - { - x: 0.453125, - y: 0.171875 - }, - { - x: 0.484375, - y: 0.171875 - }, - { - x: 0.484375, - y: 0.171875 - }, - { - x: 0.515625, - y: 0.171875 - }, - { - x: 0.515625, - y: 0.171875 - }, - { - x: 0.546875, - y: 0.171875 - }, - { - x: 0.546875, - y: 0.171875 - }, - { - x: 0.578125, - y: 0.171875 - }, - { - x: 0.578125, - y: 0.171875 - }, - { - x: 0.609375, - y: 0.171875 - }, - { - x: 0.609375, - y: 0.171875 - }, - { - x: 0.640625, - y: 0.171875 - }, - { - x: 0.640625, - y: 0.171875 - }, - { - x: 0.671875, - y: 0.171875 - }, - { - x: 0.671875, - y: 0.171875 - }, - { - x: 0.703125, - y: 0.171875 - }, - { - x: 0.703125, - y: 0.171875 - }, - { - x: 0.734375, - y: 0.171875 - }, - { - x: 0.734375, - y: 0.171875 - }, - { - x: 0.765625, - y: 0.171875 - }, - { - x: 0.765625, - y: 0.171875 - }, - { - x: 0.796875, - y: 0.171875 - }, - { - x: 0.796875, - y: 0.171875 - }, - { - x: 0.828125, - y: 0.171875 - }, - { - x: 0.828125, - y: 0.171875 - }, - { - x: 0.859375, - y: 0.171875 - }, - { - x: 0.859375, - y: 0.171875 - }, - { - x: 0.890625, - y: 0.171875 - }, - { - x: 0.890625, - y: 0.171875 - }, - { - x: 0.921875, - y: 0.171875 - }, - { - x: 0.921875, - y: 0.171875 - }, - { - x: 0.953125, - y: 0.171875 - }, - { - x: 0.953125, - y: 0.171875 - }, - { - x: 0.984375, - y: 0.171875 - }, - { - x: 0.984375, - y: 0.171875 - }, - { - x: 0.015625, - y: 0.203125 - }, - { - x: 0.015625, - y: 0.203125 - }, - { - x: 0.046875, - y: 0.203125 - }, - { - x: 0.046875, - y: 0.203125 - }, - { - x: 0.078125, - y: 0.203125 - }, - { - x: 0.078125, - y: 0.203125 - }, - { - x: 0.109375, - y: 0.203125 - }, - { - x: 0.109375, - y: 0.203125 - }, - { - x: 0.140625, - y: 0.203125 - }, - { - x: 0.140625, - y: 0.203125 - }, - { - x: 0.171875, - y: 0.203125 - }, - { - x: 0.171875, - y: 0.203125 - }, - { - x: 0.203125, - y: 0.203125 - }, - { - x: 0.203125, - y: 0.203125 - }, - { - x: 0.234375, - y: 0.203125 - }, - { - x: 0.234375, - y: 0.203125 - }, - { - x: 0.265625, - y: 0.203125 - }, - { - x: 0.265625, - y: 0.203125 - }, - { - x: 0.296875, - y: 0.203125 - }, - { - x: 0.296875, - y: 0.203125 - }, - { - x: 0.328125, - y: 0.203125 - }, - { - x: 0.328125, - y: 0.203125 - }, - { - x: 0.359375, - y: 0.203125 - }, - { - x: 0.359375, - y: 0.203125 - }, - { - x: 0.390625, - y: 0.203125 - }, - { - x: 0.390625, - y: 0.203125 - }, - { - x: 0.421875, - y: 0.203125 - }, - { - x: 0.421875, - y: 0.203125 - }, - { - x: 0.453125, - y: 0.203125 - }, - { - x: 0.453125, - y: 0.203125 - }, - { - x: 0.484375, - y: 0.203125 - }, - { - x: 0.484375, - y: 0.203125 - }, - { - x: 0.515625, - y: 0.203125 - }, - { - x: 0.515625, - y: 0.203125 - }, - { - x: 0.546875, - y: 0.203125 - }, - { - x: 0.546875, - y: 0.203125 - }, - { - x: 0.578125, - y: 0.203125 - }, - { - x: 0.578125, - y: 0.203125 - }, - { - x: 0.609375, - y: 0.203125 - }, - { - x: 0.609375, - y: 0.203125 - }, - { - x: 0.640625, - y: 0.203125 - }, - { - x: 0.640625, - y: 0.203125 - }, - { - x: 0.671875, - y: 0.203125 - }, - { - x: 0.671875, - y: 0.203125 - }, - { - x: 0.703125, - y: 0.203125 - }, - { - x: 0.703125, - y: 0.203125 - }, - { - x: 0.734375, - y: 0.203125 - }, - { - x: 0.734375, - y: 0.203125 - }, - { - x: 0.765625, - y: 0.203125 - }, - { - x: 0.765625, - y: 0.203125 - }, - { - x: 0.796875, - y: 0.203125 - }, - { - x: 0.796875, - y: 0.203125 - }, - { - x: 0.828125, - y: 0.203125 - }, - { - x: 0.828125, - y: 0.203125 - }, - { - x: 0.859375, - y: 0.203125 - }, - { - x: 0.859375, - y: 0.203125 - }, - { - x: 0.890625, - y: 0.203125 - }, - { - x: 0.890625, - y: 0.203125 - }, - { - x: 0.921875, - y: 0.203125 - }, - { - x: 0.921875, - y: 0.203125 - }, - { - x: 0.953125, - y: 0.203125 - }, - { - x: 0.953125, - y: 0.203125 - }, - { - x: 0.984375, - y: 0.203125 - }, - { - x: 0.984375, - y: 0.203125 - }, - { - x: 0.015625, - y: 0.234375 - }, - { - x: 0.015625, - y: 0.234375 - }, - { - x: 0.046875, - y: 0.234375 - }, - { - x: 0.046875, - y: 0.234375 - }, - { - x: 0.078125, - y: 0.234375 - }, - { - x: 0.078125, - y: 0.234375 - }, - { - x: 0.109375, - y: 0.234375 - }, - { - x: 0.109375, - y: 0.234375 - }, - { - x: 0.140625, - y: 0.234375 - }, - { - x: 0.140625, - y: 0.234375 - }, - { - x: 0.171875, - y: 0.234375 - }, - { - x: 0.171875, - y: 0.234375 - }, - { - x: 0.203125, - y: 0.234375 - }, - { - x: 0.203125, - y: 0.234375 - }, - { - x: 0.234375, - y: 0.234375 - }, - { - x: 0.234375, - y: 0.234375 - }, - { - x: 0.265625, - y: 0.234375 - }, - { - x: 0.265625, - y: 0.234375 - }, - { - x: 0.296875, - y: 0.234375 - }, - { - x: 0.296875, - y: 0.234375 - }, - { - x: 0.328125, - y: 0.234375 - }, - { - x: 0.328125, - y: 0.234375 - }, - { - x: 0.359375, - y: 0.234375 - }, - { - x: 0.359375, - y: 0.234375 - }, - { - x: 0.390625, - y: 0.234375 - }, - { - x: 0.390625, - y: 0.234375 - }, - { - x: 0.421875, - y: 0.234375 - }, - { - x: 0.421875, - y: 0.234375 - }, - { - x: 0.453125, - y: 0.234375 - }, - { - x: 0.453125, - y: 0.234375 - }, - { - x: 0.484375, - y: 0.234375 - }, - { - x: 0.484375, - y: 0.234375 - }, - { - x: 0.515625, - y: 0.234375 - }, - { - x: 0.515625, - y: 0.234375 - }, - { - x: 0.546875, - y: 0.234375 - }, - { - x: 0.546875, - y: 0.234375 - }, - { - x: 0.578125, - y: 0.234375 - }, - { - x: 0.578125, - y: 0.234375 - }, - { - x: 0.609375, - y: 0.234375 - }, - { - x: 0.609375, - y: 0.234375 - }, - { - x: 0.640625, - y: 0.234375 - }, - { - x: 0.640625, - y: 0.234375 - }, - { - x: 0.671875, - y: 0.234375 - }, - { - x: 0.671875, - y: 0.234375 - }, - { - x: 0.703125, - y: 0.234375 - }, - { - x: 0.703125, - y: 0.234375 - }, - { - x: 0.734375, - y: 0.234375 - }, - { - x: 0.734375, - y: 0.234375 - }, - { - x: 0.765625, - y: 0.234375 - }, - { - x: 0.765625, - y: 0.234375 - }, - { - x: 0.796875, - y: 0.234375 - }, - { - x: 0.796875, - y: 0.234375 - }, - { - x: 0.828125, - y: 0.234375 - }, - { - x: 0.828125, - y: 0.234375 - }, - { - x: 0.859375, - y: 0.234375 - }, - { - x: 0.859375, - y: 0.234375 - }, - { - x: 0.890625, - y: 0.234375 - }, - { - x: 0.890625, - y: 0.234375 - }, - { - x: 0.921875, - y: 0.234375 - }, - { - x: 0.921875, - y: 0.234375 - }, - { - x: 0.953125, - y: 0.234375 - }, - { - x: 0.953125, - y: 0.234375 - }, - { - x: 0.984375, - y: 0.234375 - }, - { - x: 0.984375, - y: 0.234375 - }, - { - x: 0.015625, - y: 0.265625 - }, - { - x: 0.015625, - y: 0.265625 - }, - { - x: 0.046875, - y: 0.265625 - }, - { - x: 0.046875, - y: 0.265625 - }, - { - x: 0.078125, - y: 0.265625 - }, - { - x: 0.078125, - y: 0.265625 - }, - { - x: 0.109375, - y: 0.265625 - }, - { - x: 0.109375, - y: 0.265625 - }, - { - x: 0.140625, - y: 0.265625 - }, - { - x: 0.140625, - y: 0.265625 - }, - { - x: 0.171875, - y: 0.265625 - }, - { - x: 0.171875, - y: 0.265625 - }, - { - x: 0.203125, - y: 0.265625 - }, - { - x: 0.203125, - y: 0.265625 - }, - { - x: 0.234375, - y: 0.265625 - }, - { - x: 0.234375, - y: 0.265625 - }, - { - x: 0.265625, - y: 0.265625 - }, - { - x: 0.265625, - y: 0.265625 - }, - { - x: 0.296875, - y: 0.265625 - }, - { - x: 0.296875, - y: 0.265625 - }, - { - x: 0.328125, - y: 0.265625 - }, - { - x: 0.328125, - y: 0.265625 - }, - { - x: 0.359375, - y: 0.265625 - }, - { - x: 0.359375, - y: 0.265625 - }, - { - x: 0.390625, - y: 0.265625 - }, - { - x: 0.390625, - y: 0.265625 - }, - { - x: 0.421875, - y: 0.265625 - }, - { - x: 0.421875, - y: 0.265625 - }, - { - x: 0.453125, - y: 0.265625 - }, - { - x: 0.453125, - y: 0.265625 - }, - { - x: 0.484375, - y: 0.265625 - }, - { - x: 0.484375, - y: 0.265625 - }, - { - x: 0.515625, - y: 0.265625 - }, - { - x: 0.515625, - y: 0.265625 - }, - { - x: 0.546875, - y: 0.265625 - }, - { - x: 0.546875, - y: 0.265625 - }, - { - x: 0.578125, - y: 0.265625 - }, - { - x: 0.578125, - y: 0.265625 - }, - { - x: 0.609375, - y: 0.265625 - }, - { - x: 0.609375, - y: 0.265625 - }, - { - x: 0.640625, - y: 0.265625 - }, - { - x: 0.640625, - y: 0.265625 - }, - { - x: 0.671875, - y: 0.265625 - }, - { - x: 0.671875, - y: 0.265625 - }, - { - x: 0.703125, - y: 0.265625 - }, - { - x: 0.703125, - y: 0.265625 - }, - { - x: 0.734375, - y: 0.265625 - }, - { - x: 0.734375, - y: 0.265625 - }, - { - x: 0.765625, - y: 0.265625 - }, - { - x: 0.765625, - y: 0.265625 - }, - { - x: 0.796875, - y: 0.265625 - }, - { - x: 0.796875, - y: 0.265625 - }, - { - x: 0.828125, - y: 0.265625 - }, - { - x: 0.828125, - y: 0.265625 - }, - { - x: 0.859375, - y: 0.265625 - }, - { - x: 0.859375, - y: 0.265625 - }, - { - x: 0.890625, - y: 0.265625 - }, - { - x: 0.890625, - y: 0.265625 - }, - { - x: 0.921875, - y: 0.265625 - }, - { - x: 0.921875, - y: 0.265625 - }, - { - x: 0.953125, - y: 0.265625 - }, - { - x: 0.953125, - y: 0.265625 - }, - { - x: 0.984375, - y: 0.265625 - }, - { - x: 0.984375, - y: 0.265625 - }, - { - x: 0.015625, - y: 0.296875 - }, - { - x: 0.015625, - y: 0.296875 - }, - { - x: 0.046875, - y: 0.296875 - }, - { - x: 0.046875, - y: 0.296875 - }, - { - x: 0.078125, - y: 0.296875 - }, - { - x: 0.078125, - y: 0.296875 - }, - { - x: 0.109375, - y: 0.296875 - }, - { - x: 0.109375, - y: 0.296875 - }, - { - x: 0.140625, - y: 0.296875 - }, - { - x: 0.140625, - y: 0.296875 - }, - { - x: 0.171875, - y: 0.296875 - }, - { - x: 0.171875, - y: 0.296875 - }, - { - x: 0.203125, - y: 0.296875 - }, - { - x: 0.203125, - y: 0.296875 - }, - { - x: 0.234375, - y: 0.296875 - }, - { - x: 0.234375, - y: 0.296875 - }, - { - x: 0.265625, - y: 0.296875 - }, - { - x: 0.265625, - y: 0.296875 - }, - { - x: 0.296875, - y: 0.296875 - }, - { - x: 0.296875, - y: 0.296875 - }, - { - x: 0.328125, - y: 0.296875 - }, - { - x: 0.328125, - y: 0.296875 - }, - { - x: 0.359375, - y: 0.296875 - }, - { - x: 0.359375, - y: 0.296875 - }, - { - x: 0.390625, - y: 0.296875 - }, - { - x: 0.390625, - y: 0.296875 - }, - { - x: 0.421875, - y: 0.296875 - }, - { - x: 0.421875, - y: 0.296875 - }, - { - x: 0.453125, - y: 0.296875 - }, - { - x: 0.453125, - y: 0.296875 - }, - { - x: 0.484375, - y: 0.296875 - }, - { - x: 0.484375, - y: 0.296875 - }, - { - x: 0.515625, - y: 0.296875 - }, - { - x: 0.515625, - y: 0.296875 - }, - { - x: 0.546875, - y: 0.296875 - }, - { - x: 0.546875, - y: 0.296875 - }, - { - x: 0.578125, - y: 0.296875 - }, - { - x: 0.578125, - y: 0.296875 - }, - { - x: 0.609375, - y: 0.296875 - }, - { - x: 0.609375, - y: 0.296875 - }, - { - x: 0.640625, - y: 0.296875 - }, - { - x: 0.640625, - y: 0.296875 - }, - { - x: 0.671875, - y: 0.296875 - }, - { - x: 0.671875, - y: 0.296875 - }, - { - x: 0.703125, - y: 0.296875 - }, - { - x: 0.703125, - y: 0.296875 - }, - { - x: 0.734375, - y: 0.296875 - }, - { - x: 0.734375, - y: 0.296875 - }, - { - x: 0.765625, - y: 0.296875 - }, - { - x: 0.765625, - y: 0.296875 - }, - { - x: 0.796875, - y: 0.296875 - }, - { - x: 0.796875, - y: 0.296875 - }, - { - x: 0.828125, - y: 0.296875 - }, - { - x: 0.828125, - y: 0.296875 - }, - { - x: 0.859375, - y: 0.296875 - }, - { - x: 0.859375, - y: 0.296875 - }, - { - x: 0.890625, - y: 0.296875 - }, - { - x: 0.890625, - y: 0.296875 - }, - { - x: 0.921875, - y: 0.296875 - }, - { - x: 0.921875, - y: 0.296875 - }, - { - x: 0.953125, - y: 0.296875 - }, - { - x: 0.953125, - y: 0.296875 - }, - { - x: 0.984375, - y: 0.296875 - }, - { - x: 0.984375, - y: 0.296875 - }, - { - x: 0.015625, - y: 0.328125 - }, - { - x: 0.015625, - y: 0.328125 - }, - { - x: 0.046875, - y: 0.328125 - }, - { - x: 0.046875, - y: 0.328125 - }, - { - x: 0.078125, - y: 0.328125 - }, - { - x: 0.078125, - y: 0.328125 - }, - { - x: 0.109375, - y: 0.328125 - }, - { - x: 0.109375, - y: 0.328125 - }, - { - x: 0.140625, - y: 0.328125 - }, - { - x: 0.140625, - y: 0.328125 - }, - { - x: 0.171875, - y: 0.328125 - }, - { - x: 0.171875, - y: 0.328125 - }, - { - x: 0.203125, - y: 0.328125 - }, - { - x: 0.203125, - y: 0.328125 - }, - { - x: 0.234375, - y: 0.328125 - }, - { - x: 0.234375, - y: 0.328125 - }, - { - x: 0.265625, - y: 0.328125 - }, - { - x: 0.265625, - y: 0.328125 - }, - { - x: 0.296875, - y: 0.328125 - }, - { - x: 0.296875, - y: 0.328125 - }, - { - x: 0.328125, - y: 0.328125 - }, - { - x: 0.328125, - y: 0.328125 - }, - { - x: 0.359375, - y: 0.328125 - }, - { - x: 0.359375, - y: 0.328125 - }, - { - x: 0.390625, - y: 0.328125 - }, - { - x: 0.390625, - y: 0.328125 - }, - { - x: 0.421875, - y: 0.328125 - }, - { - x: 0.421875, - y: 0.328125 - }, - { - x: 0.453125, - y: 0.328125 - }, - { - x: 0.453125, - y: 0.328125 - }, - { - x: 0.484375, - y: 0.328125 - }, - { - x: 0.484375, - y: 0.328125 - }, - { - x: 0.515625, - y: 0.328125 - }, - { - x: 0.515625, - y: 0.328125 - }, - { - x: 0.546875, - y: 0.328125 - }, - { - x: 0.546875, - y: 0.328125 - }, - { - x: 0.578125, - y: 0.328125 - }, - { - x: 0.578125, - y: 0.328125 - }, - { - x: 0.609375, - y: 0.328125 - }, - { - x: 0.609375, - y: 0.328125 - }, - { - x: 0.640625, - y: 0.328125 - }, - { - x: 0.640625, - y: 0.328125 - }, - { - x: 0.671875, - y: 0.328125 - }, - { - x: 0.671875, - y: 0.328125 - }, - { - x: 0.703125, - y: 0.328125 - }, - { - x: 0.703125, - y: 0.328125 - }, - { - x: 0.734375, - y: 0.328125 - }, - { - x: 0.734375, - y: 0.328125 - }, - { - x: 0.765625, - y: 0.328125 - }, - { - x: 0.765625, - y: 0.328125 - }, - { - x: 0.796875, - y: 0.328125 - }, - { - x: 0.796875, - y: 0.328125 - }, - { - x: 0.828125, - y: 0.328125 - }, - { - x: 0.828125, - y: 0.328125 - }, - { - x: 0.859375, - y: 0.328125 - }, - { - x: 0.859375, - y: 0.328125 - }, - { - x: 0.890625, - y: 0.328125 - }, - { - x: 0.890625, - y: 0.328125 - }, - { - x: 0.921875, - y: 0.328125 - }, - { - x: 0.921875, - y: 0.328125 - }, - { - x: 0.953125, - y: 0.328125 - }, - { - x: 0.953125, - y: 0.328125 - }, - { - x: 0.984375, - y: 0.328125 - }, - { - x: 0.984375, - y: 0.328125 - }, - { - x: 0.015625, - y: 0.359375 - }, - { - x: 0.015625, - y: 0.359375 - }, - { - x: 0.046875, - y: 0.359375 - }, - { - x: 0.046875, - y: 0.359375 - }, - { - x: 0.078125, - y: 0.359375 - }, - { - x: 0.078125, - y: 0.359375 - }, - { - x: 0.109375, - y: 0.359375 - }, - { - x: 0.109375, - y: 0.359375 - }, - { - x: 0.140625, - y: 0.359375 - }, - { - x: 0.140625, - y: 0.359375 - }, - { - x: 0.171875, - y: 0.359375 - }, - { - x: 0.171875, - y: 0.359375 - }, - { - x: 0.203125, - y: 0.359375 - }, - { - x: 0.203125, - y: 0.359375 - }, - { - x: 0.234375, - y: 0.359375 - }, - { - x: 0.234375, - y: 0.359375 - }, - { - x: 0.265625, - y: 0.359375 - }, - { - x: 0.265625, - y: 0.359375 - }, - { - x: 0.296875, - y: 0.359375 - }, - { - x: 0.296875, - y: 0.359375 - }, - { - x: 0.328125, - y: 0.359375 - }, - { - x: 0.328125, - y: 0.359375 - }, - { - x: 0.359375, - y: 0.359375 - }, - { - x: 0.359375, - y: 0.359375 - }, - { - x: 0.390625, - y: 0.359375 - }, - { - x: 0.390625, - y: 0.359375 - }, - { - x: 0.421875, - y: 0.359375 - }, - { - x: 0.421875, - y: 0.359375 - }, - { - x: 0.453125, - y: 0.359375 - }, - { - x: 0.453125, - y: 0.359375 - }, - { - x: 0.484375, - y: 0.359375 - }, - { - x: 0.484375, - y: 0.359375 - }, - { - x: 0.515625, - y: 0.359375 - }, - { - x: 0.515625, - y: 0.359375 - }, - { - x: 0.546875, - y: 0.359375 - }, - { - x: 0.546875, - y: 0.359375 - }, - { - x: 0.578125, - y: 0.359375 - }, - { - x: 0.578125, - y: 0.359375 - }, - { - x: 0.609375, - y: 0.359375 - }, - { - x: 0.609375, - y: 0.359375 - }, - { - x: 0.640625, - y: 0.359375 - }, - { - x: 0.640625, - y: 0.359375 - }, - { - x: 0.671875, - y: 0.359375 - }, - { - x: 0.671875, - y: 0.359375 - }, - { - x: 0.703125, - y: 0.359375 - }, - { - x: 0.703125, - y: 0.359375 - }, - { - x: 0.734375, - y: 0.359375 - }, - { - x: 0.734375, - y: 0.359375 - }, - { - x: 0.765625, - y: 0.359375 - }, - { - x: 0.765625, - y: 0.359375 - }, - { - x: 0.796875, - y: 0.359375 - }, - { - x: 0.796875, - y: 0.359375 - }, - { - x: 0.828125, - y: 0.359375 - }, - { - x: 0.828125, - y: 0.359375 - }, - { - x: 0.859375, - y: 0.359375 - }, - { - x: 0.859375, - y: 0.359375 - }, - { - x: 0.890625, - y: 0.359375 - }, - { - x: 0.890625, - y: 0.359375 - }, - { - x: 0.921875, - y: 0.359375 - }, - { - x: 0.921875, - y: 0.359375 - }, - { - x: 0.953125, - y: 0.359375 - }, - { - x: 0.953125, - y: 0.359375 - }, - { - x: 0.984375, - y: 0.359375 - }, - { - x: 0.984375, - y: 0.359375 - }, - { - x: 0.015625, - y: 0.390625 - }, - { - x: 0.015625, - y: 0.390625 - }, - { - x: 0.046875, - y: 0.390625 - }, - { - x: 0.046875, - y: 0.390625 - }, - { - x: 0.078125, - y: 0.390625 - }, - { - x: 0.078125, - y: 0.390625 - }, - { - x: 0.109375, - y: 0.390625 - }, - { - x: 0.109375, - y: 0.390625 - }, - { - x: 0.140625, - y: 0.390625 - }, - { - x: 0.140625, - y: 0.390625 - }, - { - x: 0.171875, - y: 0.390625 - }, - { - x: 0.171875, - y: 0.390625 - }, - { - x: 0.203125, - y: 0.390625 - }, - { - x: 0.203125, - y: 0.390625 - }, - { - x: 0.234375, - y: 0.390625 - }, - { - x: 0.234375, - y: 0.390625 - }, - { - x: 0.265625, - y: 0.390625 - }, - { - x: 0.265625, - y: 0.390625 - }, - { - x: 0.296875, - y: 0.390625 - }, - { - x: 0.296875, - y: 0.390625 - }, - { - x: 0.328125, - y: 0.390625 - }, - { - x: 0.328125, - y: 0.390625 - }, - { - x: 0.359375, - y: 0.390625 - }, - { - x: 0.359375, - y: 0.390625 - }, - { - x: 0.390625, - y: 0.390625 - }, - { - x: 0.390625, - y: 0.390625 - }, - { - x: 0.421875, - y: 0.390625 - }, - { - x: 0.421875, - y: 0.390625 - }, - { - x: 0.453125, - y: 0.390625 - }, - { - x: 0.453125, - y: 0.390625 - }, - { - x: 0.484375, - y: 0.390625 - }, - { - x: 0.484375, - y: 0.390625 - }, - { - x: 0.515625, - y: 0.390625 - }, - { - x: 0.515625, - y: 0.390625 - }, - { - x: 0.546875, - y: 0.390625 - }, - { - x: 0.546875, - y: 0.390625 - }, - { - x: 0.578125, - y: 0.390625 - }, - { - x: 0.578125, - y: 0.390625 - }, - { - x: 0.609375, - y: 0.390625 - }, - { - x: 0.609375, - y: 0.390625 - }, - { - x: 0.640625, - y: 0.390625 - }, - { - x: 0.640625, - y: 0.390625 - }, - { - x: 0.671875, - y: 0.390625 - }, - { - x: 0.671875, - y: 0.390625 - }, - { - x: 0.703125, - y: 0.390625 - }, - { - x: 0.703125, - y: 0.390625 - }, - { - x: 0.734375, - y: 0.390625 - }, - { - x: 0.734375, - y: 0.390625 - }, - { - x: 0.765625, - y: 0.390625 - }, - { - x: 0.765625, - y: 0.390625 - }, - { - x: 0.796875, - y: 0.390625 - }, - { - x: 0.796875, - y: 0.390625 - }, - { - x: 0.828125, - y: 0.390625 - }, - { - x: 0.828125, - y: 0.390625 - }, - { - x: 0.859375, - y: 0.390625 - }, - { - x: 0.859375, - y: 0.390625 - }, - { - x: 0.890625, - y: 0.390625 - }, - { - x: 0.890625, - y: 0.390625 - }, - { - x: 0.921875, - y: 0.390625 - }, - { - x: 0.921875, - y: 0.390625 - }, - { - x: 0.953125, - y: 0.390625 - }, - { - x: 0.953125, - y: 0.390625 - }, - { - x: 0.984375, - y: 0.390625 - }, - { - x: 0.984375, - y: 0.390625 - }, - { - x: 0.015625, - y: 0.421875 - }, - { - x: 0.015625, - y: 0.421875 - }, - { - x: 0.046875, - y: 0.421875 - }, - { - x: 0.046875, - y: 0.421875 - }, - { - x: 0.078125, - y: 0.421875 - }, - { - x: 0.078125, - y: 0.421875 - }, - { - x: 0.109375, - y: 0.421875 - }, - { - x: 0.109375, - y: 0.421875 - }, - { - x: 0.140625, - y: 0.421875 - }, - { - x: 0.140625, - y: 0.421875 - }, - { - x: 0.171875, - y: 0.421875 - }, - { - x: 0.171875, - y: 0.421875 - }, - { - x: 0.203125, - y: 0.421875 - }, - { - x: 0.203125, - y: 0.421875 - }, - { - x: 0.234375, - y: 0.421875 - }, - { - x: 0.234375, - y: 0.421875 - }, - { - x: 0.265625, - y: 0.421875 - }, - { - x: 0.265625, - y: 0.421875 - }, - { - x: 0.296875, - y: 0.421875 - }, - { - x: 0.296875, - y: 0.421875 - }, - { - x: 0.328125, - y: 0.421875 - }, - { - x: 0.328125, - y: 0.421875 - }, - { - x: 0.359375, - y: 0.421875 - }, - { - x: 0.359375, - y: 0.421875 - }, - { - x: 0.390625, - y: 0.421875 - }, - { - x: 0.390625, - y: 0.421875 - }, - { - x: 0.421875, - y: 0.421875 - }, - { - x: 0.421875, - y: 0.421875 - }, - { - x: 0.453125, - y: 0.421875 - }, - { - x: 0.453125, - y: 0.421875 - }, - { - x: 0.484375, - y: 0.421875 - }, - { - x: 0.484375, - y: 0.421875 - }, - { - x: 0.515625, - y: 0.421875 - }, - { - x: 0.515625, - y: 0.421875 - }, - { - x: 0.546875, - y: 0.421875 - }, - { - x: 0.546875, - y: 0.421875 - }, - { - x: 0.578125, - y: 0.421875 - }, - { - x: 0.578125, - y: 0.421875 - }, - { - x: 0.609375, - y: 0.421875 - }, - { - x: 0.609375, - y: 0.421875 - }, - { - x: 0.640625, - y: 0.421875 - }, - { - x: 0.640625, - y: 0.421875 - }, - { - x: 0.671875, - y: 0.421875 - }, - { - x: 0.671875, - y: 0.421875 - }, - { - x: 0.703125, - y: 0.421875 - }, - { - x: 0.703125, - y: 0.421875 - }, - { - x: 0.734375, - y: 0.421875 - }, - { - x: 0.734375, - y: 0.421875 - }, - { - x: 0.765625, - y: 0.421875 - }, - { - x: 0.765625, - y: 0.421875 - }, - { - x: 0.796875, - y: 0.421875 - }, - { - x: 0.796875, - y: 0.421875 - }, - { - x: 0.828125, - y: 0.421875 - }, - { - x: 0.828125, - y: 0.421875 - }, - { - x: 0.859375, - y: 0.421875 - }, - { - x: 0.859375, - y: 0.421875 - }, - { - x: 0.890625, - y: 0.421875 - }, - { - x: 0.890625, - y: 0.421875 - }, - { - x: 0.921875, - y: 0.421875 - }, - { - x: 0.921875, - y: 0.421875 - }, - { - x: 0.953125, - y: 0.421875 - }, - { - x: 0.953125, - y: 0.421875 - }, - { - x: 0.984375, - y: 0.421875 - }, - { - x: 0.984375, - y: 0.421875 - }, - { - x: 0.015625, - y: 0.453125 - }, - { - x: 0.015625, - y: 0.453125 - }, - { - x: 0.046875, - y: 0.453125 - }, - { - x: 0.046875, - y: 0.453125 - }, - { - x: 0.078125, - y: 0.453125 - }, - { - x: 0.078125, - y: 0.453125 - }, - { - x: 0.109375, - y: 0.453125 - }, - { - x: 0.109375, - y: 0.453125 - }, - { - x: 0.140625, - y: 0.453125 - }, - { - x: 0.140625, - y: 0.453125 - }, - { - x: 0.171875, - y: 0.453125 - }, - { - x: 0.171875, - y: 0.453125 - }, - { - x: 0.203125, - y: 0.453125 - }, - { - x: 0.203125, - y: 0.453125 - }, - { - x: 0.234375, - y: 0.453125 - }, - { - x: 0.234375, - y: 0.453125 - }, - { - x: 0.265625, - y: 0.453125 - }, - { - x: 0.265625, - y: 0.453125 - }, - { - x: 0.296875, - y: 0.453125 - }, - { - x: 0.296875, - y: 0.453125 - }, - { - x: 0.328125, - y: 0.453125 - }, - { - x: 0.328125, - y: 0.453125 - }, - { - x: 0.359375, - y: 0.453125 - }, - { - x: 0.359375, - y: 0.453125 - }, - { - x: 0.390625, - y: 0.453125 - }, - { - x: 0.390625, - y: 0.453125 - }, - { - x: 0.421875, - y: 0.453125 - }, - { - x: 0.421875, - y: 0.453125 - }, - { - x: 0.453125, - y: 0.453125 - }, - { - x: 0.453125, - y: 0.453125 - }, - { - x: 0.484375, - y: 0.453125 - }, - { - x: 0.484375, - y: 0.453125 - }, - { - x: 0.515625, - y: 0.453125 - }, - { - x: 0.515625, - y: 0.453125 - }, - { - x: 0.546875, - y: 0.453125 - }, - { - x: 0.546875, - y: 0.453125 - }, - { - x: 0.578125, - y: 0.453125 - }, - { - x: 0.578125, - y: 0.453125 - }, - { - x: 0.609375, - y: 0.453125 - }, - { - x: 0.609375, - y: 0.453125 - }, - { - x: 0.640625, - y: 0.453125 - }, - { - x: 0.640625, - y: 0.453125 - }, - { - x: 0.671875, - y: 0.453125 - }, - { - x: 0.671875, - y: 0.453125 - }, - { - x: 0.703125, - y: 0.453125 - }, - { - x: 0.703125, - y: 0.453125 - }, - { - x: 0.734375, - y: 0.453125 - }, - { - x: 0.734375, - y: 0.453125 - }, - { - x: 0.765625, - y: 0.453125 - }, - { - x: 0.765625, - y: 0.453125 - }, - { - x: 0.796875, - y: 0.453125 - }, - { - x: 0.796875, - y: 0.453125 - }, - { - x: 0.828125, - y: 0.453125 - }, - { - x: 0.828125, - y: 0.453125 - }, - { - x: 0.859375, - y: 0.453125 - }, - { - x: 0.859375, - y: 0.453125 - }, - { - x: 0.890625, - y: 0.453125 - }, - { - x: 0.890625, - y: 0.453125 - }, - { - x: 0.921875, - y: 0.453125 - }, - { - x: 0.921875, - y: 0.453125 - }, - { - x: 0.953125, - y: 0.453125 - }, - { - x: 0.953125, - y: 0.453125 - }, - { - x: 0.984375, - y: 0.453125 - }, - { - x: 0.984375, - y: 0.453125 - }, - { - x: 0.015625, - y: 0.484375 - }, - { - x: 0.015625, - y: 0.484375 - }, - { - x: 0.046875, - y: 0.484375 - }, - { - x: 0.046875, - y: 0.484375 - }, - { - x: 0.078125, - y: 0.484375 - }, - { - x: 0.078125, - y: 0.484375 - }, - { - x: 0.109375, - y: 0.484375 - }, - { - x: 0.109375, - y: 0.484375 - }, - { - x: 0.140625, - y: 0.484375 - }, - { - x: 0.140625, - y: 0.484375 - }, - { - x: 0.171875, - y: 0.484375 - }, - { - x: 0.171875, - y: 0.484375 - }, - { - x: 0.203125, - y: 0.484375 - }, - { - x: 0.203125, - y: 0.484375 - }, - { - x: 0.234375, - y: 0.484375 - }, - { - x: 0.234375, - y: 0.484375 - }, - { - x: 0.265625, - y: 0.484375 - }, - { - x: 0.265625, - y: 0.484375 - }, - { - x: 0.296875, - y: 0.484375 - }, - { - x: 0.296875, - y: 0.484375 - }, - { - x: 0.328125, - y: 0.484375 - }, - { - x: 0.328125, - y: 0.484375 - }, - { - x: 0.359375, - y: 0.484375 - }, - { - x: 0.359375, - y: 0.484375 - }, - { - x: 0.390625, - y: 0.484375 - }, - { - x: 0.390625, - y: 0.484375 - }, - { - x: 0.421875, - y: 0.484375 - }, - { - x: 0.421875, - y: 0.484375 - }, - { - x: 0.453125, - y: 0.484375 - }, - { - x: 0.453125, - y: 0.484375 - }, - { - x: 0.484375, - y: 0.484375 - }, - { - x: 0.484375, - y: 0.484375 - }, - { - x: 0.515625, - y: 0.484375 - }, - { - x: 0.515625, - y: 0.484375 - }, - { - x: 0.546875, - y: 0.484375 - }, - { - x: 0.546875, - y: 0.484375 - }, - { - x: 0.578125, - y: 0.484375 - }, - { - x: 0.578125, - y: 0.484375 - }, - { - x: 0.609375, - y: 0.484375 - }, - { - x: 0.609375, - y: 0.484375 - }, - { - x: 0.640625, - y: 0.484375 - }, - { - x: 0.640625, - y: 0.484375 - }, - { - x: 0.671875, - y: 0.484375 - }, - { - x: 0.671875, - y: 0.484375 - }, - { - x: 0.703125, - y: 0.484375 - }, - { - x: 0.703125, - y: 0.484375 - }, - { - x: 0.734375, - y: 0.484375 - }, - { - x: 0.734375, - y: 0.484375 - }, - { - x: 0.765625, - y: 0.484375 - }, - { - x: 0.765625, - y: 0.484375 - }, - { - x: 0.796875, - y: 0.484375 - }, - { - x: 0.796875, - y: 0.484375 - }, - { - x: 0.828125, - y: 0.484375 - }, - { - x: 0.828125, - y: 0.484375 - }, - { - x: 0.859375, - y: 0.484375 - }, - { - x: 0.859375, - y: 0.484375 - }, - { - x: 0.890625, - y: 0.484375 - }, - { - x: 0.890625, - y: 0.484375 - }, - { - x: 0.921875, - y: 0.484375 - }, - { - x: 0.921875, - y: 0.484375 - }, - { - x: 0.953125, - y: 0.484375 - }, - { - x: 0.953125, - y: 0.484375 - }, - { - x: 0.984375, - y: 0.484375 - }, - { - x: 0.984375, - y: 0.484375 - }, - { - x: 0.015625, - y: 0.515625 - }, - { - x: 0.015625, - y: 0.515625 - }, - { - x: 0.046875, - y: 0.515625 - }, - { - x: 0.046875, - y: 0.515625 - }, - { - x: 0.078125, - y: 0.515625 - }, - { - x: 0.078125, - y: 0.515625 - }, - { - x: 0.109375, - y: 0.515625 - }, - { - x: 0.109375, - y: 0.515625 - }, - { - x: 0.140625, - y: 0.515625 - }, - { - x: 0.140625, - y: 0.515625 - }, - { - x: 0.171875, - y: 0.515625 - }, - { - x: 0.171875, - y: 0.515625 - }, - { - x: 0.203125, - y: 0.515625 - }, - { - x: 0.203125, - y: 0.515625 - }, - { - x: 0.234375, - y: 0.515625 - }, - { - x: 0.234375, - y: 0.515625 - }, - { - x: 0.265625, - y: 0.515625 - }, - { - x: 0.265625, - y: 0.515625 - }, - { - x: 0.296875, - y: 0.515625 - }, - { - x: 0.296875, - y: 0.515625 - }, - { - x: 0.328125, - y: 0.515625 - }, - { - x: 0.328125, - y: 0.515625 - }, - { - x: 0.359375, - y: 0.515625 - }, - { - x: 0.359375, - y: 0.515625 - }, - { - x: 0.390625, - y: 0.515625 - }, - { - x: 0.390625, - y: 0.515625 - }, - { - x: 0.421875, - y: 0.515625 - }, - { - x: 0.421875, - y: 0.515625 - }, - { - x: 0.453125, - y: 0.515625 - }, - { - x: 0.453125, - y: 0.515625 - }, - { - x: 0.484375, - y: 0.515625 - }, - { - x: 0.484375, - y: 0.515625 - }, - { - x: 0.515625, - y: 0.515625 - }, - { - x: 0.515625, - y: 0.515625 - }, - { - x: 0.546875, - y: 0.515625 - }, - { - x: 0.546875, - y: 0.515625 - }, - { - x: 0.578125, - y: 0.515625 - }, - { - x: 0.578125, - y: 0.515625 - }, - { - x: 0.609375, - y: 0.515625 - }, - { - x: 0.609375, - y: 0.515625 - }, - { - x: 0.640625, - y: 0.515625 - }, - { - x: 0.640625, - y: 0.515625 - }, - { - x: 0.671875, - y: 0.515625 - }, - { - x: 0.671875, - y: 0.515625 - }, - { - x: 0.703125, - y: 0.515625 - }, - { - x: 0.703125, - y: 0.515625 - }, - { - x: 0.734375, - y: 0.515625 - }, - { - x: 0.734375, - y: 0.515625 - }, - { - x: 0.765625, - y: 0.515625 - }, - { - x: 0.765625, - y: 0.515625 - }, - { - x: 0.796875, - y: 0.515625 - }, - { - x: 0.796875, - y: 0.515625 - }, - { - x: 0.828125, - y: 0.515625 - }, - { - x: 0.828125, - y: 0.515625 - }, - { - x: 0.859375, - y: 0.515625 - }, - { - x: 0.859375, - y: 0.515625 - }, - { - x: 0.890625, - y: 0.515625 - }, - { - x: 0.890625, - y: 0.515625 - }, - { - x: 0.921875, - y: 0.515625 - }, - { - x: 0.921875, - y: 0.515625 - }, - { - x: 0.953125, - y: 0.515625 - }, - { - x: 0.953125, - y: 0.515625 - }, - { - x: 0.984375, - y: 0.515625 - }, - { - x: 0.984375, - y: 0.515625 - }, - { - x: 0.015625, - y: 0.546875 - }, - { - x: 0.015625, - y: 0.546875 - }, - { - x: 0.046875, - y: 0.546875 - }, - { - x: 0.046875, - y: 0.546875 - }, - { - x: 0.078125, - y: 0.546875 - }, - { - x: 0.078125, - y: 0.546875 - }, - { - x: 0.109375, - y: 0.546875 - }, - { - x: 0.109375, - y: 0.546875 - }, - { - x: 0.140625, - y: 0.546875 - }, - { - x: 0.140625, - y: 0.546875 - }, - { - x: 0.171875, - y: 0.546875 - }, - { - x: 0.171875, - y: 0.546875 - }, - { - x: 0.203125, - y: 0.546875 - }, - { - x: 0.203125, - y: 0.546875 - }, - { - x: 0.234375, - y: 0.546875 - }, - { - x: 0.234375, - y: 0.546875 - }, - { - x: 0.265625, - y: 0.546875 - }, - { - x: 0.265625, - y: 0.546875 - }, - { - x: 0.296875, - y: 0.546875 - }, - { - x: 0.296875, - y: 0.546875 - }, - { - x: 0.328125, - y: 0.546875 - }, - { - x: 0.328125, - y: 0.546875 - }, - { - x: 0.359375, - y: 0.546875 - }, - { - x: 0.359375, - y: 0.546875 - }, - { - x: 0.390625, - y: 0.546875 - }, - { - x: 0.390625, - y: 0.546875 - }, - { - x: 0.421875, - y: 0.546875 - }, - { - x: 0.421875, - y: 0.546875 - }, - { - x: 0.453125, - y: 0.546875 - }, - { - x: 0.453125, - y: 0.546875 - }, - { - x: 0.484375, - y: 0.546875 - }, - { - x: 0.484375, - y: 0.546875 - }, - { - x: 0.515625, - y: 0.546875 - }, - { - x: 0.515625, - y: 0.546875 - }, - { - x: 0.546875, - y: 0.546875 - }, - { - x: 0.546875, - y: 0.546875 - }, - { - x: 0.578125, - y: 0.546875 - }, - { - x: 0.578125, - y: 0.546875 - }, - { - x: 0.609375, - y: 0.546875 - }, - { - x: 0.609375, - y: 0.546875 - }, - { - x: 0.640625, - y: 0.546875 - }, - { - x: 0.640625, - y: 0.546875 - }, - { - x: 0.671875, - y: 0.546875 - }, - { - x: 0.671875, - y: 0.546875 - }, - { - x: 0.703125, - y: 0.546875 - }, - { - x: 0.703125, - y: 0.546875 - }, - { - x: 0.734375, - y: 0.546875 - }, - { - x: 0.734375, - y: 0.546875 - }, - { - x: 0.765625, - y: 0.546875 - }, - { - x: 0.765625, - y: 0.546875 - }, - { - x: 0.796875, - y: 0.546875 - }, - { - x: 0.796875, - y: 0.546875 - }, - { - x: 0.828125, - y: 0.546875 - }, - { - x: 0.828125, - y: 0.546875 - }, - { - x: 0.859375, - y: 0.546875 - }, - { - x: 0.859375, - y: 0.546875 - }, - { - x: 0.890625, - y: 0.546875 - }, - { - x: 0.890625, - y: 0.546875 - }, - { - x: 0.921875, - y: 0.546875 - }, - { - x: 0.921875, - y: 0.546875 - }, - { - x: 0.953125, - y: 0.546875 - }, - { - x: 0.953125, - y: 0.546875 - }, - { - x: 0.984375, - y: 0.546875 - }, - { - x: 0.984375, - y: 0.546875 - }, - { - x: 0.015625, - y: 0.578125 - }, - { - x: 0.015625, - y: 0.578125 - }, - { - x: 0.046875, - y: 0.578125 - }, - { - x: 0.046875, - y: 0.578125 - }, - { - x: 0.078125, - y: 0.578125 - }, - { - x: 0.078125, - y: 0.578125 - }, - { - x: 0.109375, - y: 0.578125 - }, - { - x: 0.109375, - y: 0.578125 - }, - { - x: 0.140625, - y: 0.578125 - }, - { - x: 0.140625, - y: 0.578125 - }, - { - x: 0.171875, - y: 0.578125 - }, - { - x: 0.171875, - y: 0.578125 - }, - { - x: 0.203125, - y: 0.578125 - }, - { - x: 0.203125, - y: 0.578125 - }, - { - x: 0.234375, - y: 0.578125 - }, - { - x: 0.234375, - y: 0.578125 - }, - { - x: 0.265625, - y: 0.578125 - }, - { - x: 0.265625, - y: 0.578125 - }, - { - x: 0.296875, - y: 0.578125 - }, - { - x: 0.296875, - y: 0.578125 - }, - { - x: 0.328125, - y: 0.578125 - }, - { - x: 0.328125, - y: 0.578125 - }, - { - x: 0.359375, - y: 0.578125 - }, - { - x: 0.359375, - y: 0.578125 - }, - { - x: 0.390625, - y: 0.578125 - }, - { - x: 0.390625, - y: 0.578125 - }, - { - x: 0.421875, - y: 0.578125 - }, - { - x: 0.421875, - y: 0.578125 - }, - { - x: 0.453125, - y: 0.578125 - }, - { - x: 0.453125, - y: 0.578125 - }, - { - x: 0.484375, - y: 0.578125 - }, - { - x: 0.484375, - y: 0.578125 - }, - { - x: 0.515625, - y: 0.578125 - }, - { - x: 0.515625, - y: 0.578125 - }, - { - x: 0.546875, - y: 0.578125 - }, - { - x: 0.546875, - y: 0.578125 - }, - { - x: 0.578125, - y: 0.578125 - }, - { - x: 0.578125, - y: 0.578125 - }, - { - x: 0.609375, - y: 0.578125 - }, - { - x: 0.609375, - y: 0.578125 - }, - { - x: 0.640625, - y: 0.578125 - }, - { - x: 0.640625, - y: 0.578125 - }, - { - x: 0.671875, - y: 0.578125 - }, - { - x: 0.671875, - y: 0.578125 - }, - { - x: 0.703125, - y: 0.578125 - }, - { - x: 0.703125, - y: 0.578125 - }, - { - x: 0.734375, - y: 0.578125 - }, - { - x: 0.734375, - y: 0.578125 - }, - { - x: 0.765625, - y: 0.578125 - }, - { - x: 0.765625, - y: 0.578125 - }, - { - x: 0.796875, - y: 0.578125 - }, - { - x: 0.796875, - y: 0.578125 - }, - { - x: 0.828125, - y: 0.578125 - }, - { - x: 0.828125, - y: 0.578125 - }, - { - x: 0.859375, - y: 0.578125 - }, - { - x: 0.859375, - y: 0.578125 - }, - { - x: 0.890625, - y: 0.578125 - }, - { - x: 0.890625, - y: 0.578125 - }, - { - x: 0.921875, - y: 0.578125 - }, - { - x: 0.921875, - y: 0.578125 - }, - { - x: 0.953125, - y: 0.578125 - }, - { - x: 0.953125, - y: 0.578125 - }, - { - x: 0.984375, - y: 0.578125 - }, - { - x: 0.984375, - y: 0.578125 - }, - { - x: 0.015625, - y: 0.609375 - }, - { - x: 0.015625, - y: 0.609375 - }, - { - x: 0.046875, - y: 0.609375 - }, - { - x: 0.046875, - y: 0.609375 - }, - { - x: 0.078125, - y: 0.609375 - }, - { - x: 0.078125, - y: 0.609375 - }, - { - x: 0.109375, - y: 0.609375 - }, - { - x: 0.109375, - y: 0.609375 - }, - { - x: 0.140625, - y: 0.609375 - }, - { - x: 0.140625, - y: 0.609375 - }, - { - x: 0.171875, - y: 0.609375 - }, - { - x: 0.171875, - y: 0.609375 - }, - { - x: 0.203125, - y: 0.609375 - }, - { - x: 0.203125, - y: 0.609375 - }, - { - x: 0.234375, - y: 0.609375 - }, - { - x: 0.234375, - y: 0.609375 - }, - { - x: 0.265625, - y: 0.609375 - }, - { - x: 0.265625, - y: 0.609375 - }, - { - x: 0.296875, - y: 0.609375 - }, - { - x: 0.296875, - y: 0.609375 - }, - { - x: 0.328125, - y: 0.609375 - }, - { - x: 0.328125, - y: 0.609375 - }, - { - x: 0.359375, - y: 0.609375 - }, - { - x: 0.359375, - y: 0.609375 - }, - { - x: 0.390625, - y: 0.609375 - }, - { - x: 0.390625, - y: 0.609375 - }, - { - x: 0.421875, - y: 0.609375 - }, - { - x: 0.421875, - y: 0.609375 - }, - { - x: 0.453125, - y: 0.609375 - }, - { - x: 0.453125, - y: 0.609375 - }, - { - x: 0.484375, - y: 0.609375 - }, - { - x: 0.484375, - y: 0.609375 - }, - { - x: 0.515625, - y: 0.609375 - }, - { - x: 0.515625, - y: 0.609375 - }, - { - x: 0.546875, - y: 0.609375 - }, - { - x: 0.546875, - y: 0.609375 - }, - { - x: 0.578125, - y: 0.609375 - }, - { - x: 0.578125, - y: 0.609375 - }, - { - x: 0.609375, - y: 0.609375 - }, - { - x: 0.609375, - y: 0.609375 - }, - { - x: 0.640625, - y: 0.609375 - }, - { - x: 0.640625, - y: 0.609375 - }, - { - x: 0.671875, - y: 0.609375 - }, - { - x: 0.671875, - y: 0.609375 - }, - { - x: 0.703125, - y: 0.609375 - }, - { - x: 0.703125, - y: 0.609375 - }, - { - x: 0.734375, - y: 0.609375 - }, - { - x: 0.734375, - y: 0.609375 - }, - { - x: 0.765625, - y: 0.609375 - }, - { - x: 0.765625, - y: 0.609375 - }, - { - x: 0.796875, - y: 0.609375 - }, - { - x: 0.796875, - y: 0.609375 - }, - { - x: 0.828125, - y: 0.609375 - }, - { - x: 0.828125, - y: 0.609375 - }, - { - x: 0.859375, - y: 0.609375 - }, - { - x: 0.859375, - y: 0.609375 - }, - { - x: 0.890625, - y: 0.609375 - }, - { - x: 0.890625, - y: 0.609375 - }, - { - x: 0.921875, - y: 0.609375 - }, - { - x: 0.921875, - y: 0.609375 - }, - { - x: 0.953125, - y: 0.609375 - }, - { - x: 0.953125, - y: 0.609375 - }, - { - x: 0.984375, - y: 0.609375 - }, - { - x: 0.984375, - y: 0.609375 - }, - { - x: 0.015625, - y: 0.640625 - }, - { - x: 0.015625, - y: 0.640625 - }, - { - x: 0.046875, - y: 0.640625 - }, - { - x: 0.046875, - y: 0.640625 - }, - { - x: 0.078125, - y: 0.640625 - }, - { - x: 0.078125, - y: 0.640625 - }, - { - x: 0.109375, - y: 0.640625 - }, - { - x: 0.109375, - y: 0.640625 - }, - { - x: 0.140625, - y: 0.640625 - }, - { - x: 0.140625, - y: 0.640625 - }, - { - x: 0.171875, - y: 0.640625 - }, - { - x: 0.171875, - y: 0.640625 - }, - { - x: 0.203125, - y: 0.640625 - }, - { - x: 0.203125, - y: 0.640625 - }, - { - x: 0.234375, - y: 0.640625 - }, - { - x: 0.234375, - y: 0.640625 - }, - { - x: 0.265625, - y: 0.640625 - }, - { - x: 0.265625, - y: 0.640625 - }, - { - x: 0.296875, - y: 0.640625 - }, - { - x: 0.296875, - y: 0.640625 - }, - { - x: 0.328125, - y: 0.640625 - }, - { - x: 0.328125, - y: 0.640625 - }, - { - x: 0.359375, - y: 0.640625 - }, - { - x: 0.359375, - y: 0.640625 - }, - { - x: 0.390625, - y: 0.640625 - }, - { - x: 0.390625, - y: 0.640625 - }, - { - x: 0.421875, - y: 0.640625 - }, - { - x: 0.421875, - y: 0.640625 - }, - { - x: 0.453125, - y: 0.640625 - }, - { - x: 0.453125, - y: 0.640625 - }, - { - x: 0.484375, - y: 0.640625 - }, - { - x: 0.484375, - y: 0.640625 - }, - { - x: 0.515625, - y: 0.640625 - }, - { - x: 0.515625, - y: 0.640625 - }, - { - x: 0.546875, - y: 0.640625 - }, - { - x: 0.546875, - y: 0.640625 - }, - { - x: 0.578125, - y: 0.640625 - }, - { - x: 0.578125, - y: 0.640625 - }, - { - x: 0.609375, - y: 0.640625 - }, - { - x: 0.609375, - y: 0.640625 - }, - { - x: 0.640625, - y: 0.640625 - }, - { - x: 0.640625, - y: 0.640625 - }, - { - x: 0.671875, - y: 0.640625 - }, - { - x: 0.671875, - y: 0.640625 - }, - { - x: 0.703125, - y: 0.640625 - }, - { - x: 0.703125, - y: 0.640625 - }, - { - x: 0.734375, - y: 0.640625 - }, - { - x: 0.734375, - y: 0.640625 - }, - { - x: 0.765625, - y: 0.640625 - }, - { - x: 0.765625, - y: 0.640625 - }, - { - x: 0.796875, - y: 0.640625 - }, - { - x: 0.796875, - y: 0.640625 - }, - { - x: 0.828125, - y: 0.640625 - }, - { - x: 0.828125, - y: 0.640625 - }, - { - x: 0.859375, - y: 0.640625 - }, - { - x: 0.859375, - y: 0.640625 - }, - { - x: 0.890625, - y: 0.640625 - }, - { - x: 0.890625, - y: 0.640625 - }, - { - x: 0.921875, - y: 0.640625 - }, - { - x: 0.921875, - y: 0.640625 - }, - { - x: 0.953125, - y: 0.640625 - }, - { - x: 0.953125, - y: 0.640625 - }, - { - x: 0.984375, - y: 0.640625 - }, - { - x: 0.984375, - y: 0.640625 - }, - { - x: 0.015625, - y: 0.671875 - }, - { - x: 0.015625, - y: 0.671875 - }, - { - x: 0.046875, - y: 0.671875 - }, - { - x: 0.046875, - y: 0.671875 - }, - { - x: 0.078125, - y: 0.671875 - }, - { - x: 0.078125, - y: 0.671875 - }, - { - x: 0.109375, - y: 0.671875 - }, - { - x: 0.109375, - y: 0.671875 - }, - { - x: 0.140625, - y: 0.671875 - }, - { - x: 0.140625, - y: 0.671875 - }, - { - x: 0.171875, - y: 0.671875 - }, - { - x: 0.171875, - y: 0.671875 - }, - { - x: 0.203125, - y: 0.671875 - }, - { - x: 0.203125, - y: 0.671875 - }, - { - x: 0.234375, - y: 0.671875 - }, - { - x: 0.234375, - y: 0.671875 - }, - { - x: 0.265625, - y: 0.671875 - }, - { - x: 0.265625, - y: 0.671875 - }, - { - x: 0.296875, - y: 0.671875 - }, - { - x: 0.296875, - y: 0.671875 - }, - { - x: 0.328125, - y: 0.671875 - }, - { - x: 0.328125, - y: 0.671875 - }, - { - x: 0.359375, - y: 0.671875 - }, - { - x: 0.359375, - y: 0.671875 - }, - { - x: 0.390625, - y: 0.671875 - }, - { - x: 0.390625, - y: 0.671875 - }, - { - x: 0.421875, - y: 0.671875 - }, - { - x: 0.421875, - y: 0.671875 - }, - { - x: 0.453125, - y: 0.671875 - }, - { - x: 0.453125, - y: 0.671875 - }, - { - x: 0.484375, - y: 0.671875 - }, - { - x: 0.484375, - y: 0.671875 - }, - { - x: 0.515625, - y: 0.671875 - }, - { - x: 0.515625, - y: 0.671875 - }, - { - x: 0.546875, - y: 0.671875 - }, - { - x: 0.546875, - y: 0.671875 - }, - { - x: 0.578125, - y: 0.671875 - }, - { - x: 0.578125, - y: 0.671875 - }, - { - x: 0.609375, - y: 0.671875 - }, - { - x: 0.609375, - y: 0.671875 - }, - { - x: 0.640625, - y: 0.671875 - }, - { - x: 0.640625, - y: 0.671875 - }, - { - x: 0.671875, - y: 0.671875 - }, - { - x: 0.671875, - y: 0.671875 - }, - { - x: 0.703125, - y: 0.671875 - }, - { - x: 0.703125, - y: 0.671875 - }, - { - x: 0.734375, - y: 0.671875 - }, - { - x: 0.734375, - y: 0.671875 - }, - { - x: 0.765625, - y: 0.671875 - }, - { - x: 0.765625, - y: 0.671875 - }, - { - x: 0.796875, - y: 0.671875 - }, - { - x: 0.796875, - y: 0.671875 - }, - { - x: 0.828125, - y: 0.671875 - }, - { - x: 0.828125, - y: 0.671875 - }, - { - x: 0.859375, - y: 0.671875 - }, - { - x: 0.859375, - y: 0.671875 - }, - { - x: 0.890625, - y: 0.671875 - }, - { - x: 0.890625, - y: 0.671875 - }, - { - x: 0.921875, - y: 0.671875 - }, - { - x: 0.921875, - y: 0.671875 - }, - { - x: 0.953125, - y: 0.671875 - }, - { - x: 0.953125, - y: 0.671875 - }, - { - x: 0.984375, - y: 0.671875 - }, - { - x: 0.984375, - y: 0.671875 - }, - { - x: 0.015625, - y: 0.703125 - }, - { - x: 0.015625, - y: 0.703125 - }, - { - x: 0.046875, - y: 0.703125 - }, - { - x: 0.046875, - y: 0.703125 - }, - { - x: 0.078125, - y: 0.703125 - }, - { - x: 0.078125, - y: 0.703125 - }, - { - x: 0.109375, - y: 0.703125 - }, - { - x: 0.109375, - y: 0.703125 - }, - { - x: 0.140625, - y: 0.703125 - }, - { - x: 0.140625, - y: 0.703125 - }, - { - x: 0.171875, - y: 0.703125 - }, - { - x: 0.171875, - y: 0.703125 - }, - { - x: 0.203125, - y: 0.703125 - }, - { - x: 0.203125, - y: 0.703125 - }, - { - x: 0.234375, - y: 0.703125 - }, - { - x: 0.234375, - y: 0.703125 - }, - { - x: 0.265625, - y: 0.703125 - }, - { - x: 0.265625, - y: 0.703125 - }, - { - x: 0.296875, - y: 0.703125 - }, - { - x: 0.296875, - y: 0.703125 - }, - { - x: 0.328125, - y: 0.703125 - }, - { - x: 0.328125, - y: 0.703125 - }, - { - x: 0.359375, - y: 0.703125 - }, - { - x: 0.359375, - y: 0.703125 - }, - { - x: 0.390625, - y: 0.703125 - }, - { - x: 0.390625, - y: 0.703125 - }, - { - x: 0.421875, - y: 0.703125 - }, - { - x: 0.421875, - y: 0.703125 - }, - { - x: 0.453125, - y: 0.703125 - }, - { - x: 0.453125, - y: 0.703125 - }, - { - x: 0.484375, - y: 0.703125 - }, - { - x: 0.484375, - y: 0.703125 - }, - { - x: 0.515625, - y: 0.703125 - }, - { - x: 0.515625, - y: 0.703125 - }, - { - x: 0.546875, - y: 0.703125 - }, - { - x: 0.546875, - y: 0.703125 - }, - { - x: 0.578125, - y: 0.703125 - }, - { - x: 0.578125, - y: 0.703125 - }, - { - x: 0.609375, - y: 0.703125 - }, - { - x: 0.609375, - y: 0.703125 - }, - { - x: 0.640625, - y: 0.703125 - }, - { - x: 0.640625, - y: 0.703125 - }, - { - x: 0.671875, - y: 0.703125 - }, - { - x: 0.671875, - y: 0.703125 - }, - { - x: 0.703125, - y: 0.703125 - }, - { - x: 0.703125, - y: 0.703125 - }, - { - x: 0.734375, - y: 0.703125 - }, - { - x: 0.734375, - y: 0.703125 - }, - { - x: 0.765625, - y: 0.703125 - }, - { - x: 0.765625, - y: 0.703125 - }, - { - x: 0.796875, - y: 0.703125 - }, - { - x: 0.796875, - y: 0.703125 - }, - { - x: 0.828125, - y: 0.703125 - }, - { - x: 0.828125, - y: 0.703125 - }, - { - x: 0.859375, - y: 0.703125 - }, - { - x: 0.859375, - y: 0.703125 - }, - { - x: 0.890625, - y: 0.703125 - }, - { - x: 0.890625, - y: 0.703125 - }, - { - x: 0.921875, - y: 0.703125 - }, - { - x: 0.921875, - y: 0.703125 - }, - { - x: 0.953125, - y: 0.703125 - }, - { - x: 0.953125, - y: 0.703125 - }, - { - x: 0.984375, - y: 0.703125 - }, - { - x: 0.984375, - y: 0.703125 - }, - { - x: 0.015625, - y: 0.734375 - }, - { - x: 0.015625, - y: 0.734375 - }, - { - x: 0.046875, - y: 0.734375 - }, - { - x: 0.046875, - y: 0.734375 - }, - { - x: 0.078125, - y: 0.734375 - }, - { - x: 0.078125, - y: 0.734375 - }, - { - x: 0.109375, - y: 0.734375 - }, - { - x: 0.109375, - y: 0.734375 - }, - { - x: 0.140625, - y: 0.734375 - }, - { - x: 0.140625, - y: 0.734375 - }, - { - x: 0.171875, - y: 0.734375 - }, - { - x: 0.171875, - y: 0.734375 - }, - { - x: 0.203125, - y: 0.734375 - }, - { - x: 0.203125, - y: 0.734375 - }, - { - x: 0.234375, - y: 0.734375 - }, - { - x: 0.234375, - y: 0.734375 - }, - { - x: 0.265625, - y: 0.734375 - }, - { - x: 0.265625, - y: 0.734375 - }, - { - x: 0.296875, - y: 0.734375 - }, - { - x: 0.296875, - y: 0.734375 - }, - { - x: 0.328125, - y: 0.734375 - }, - { - x: 0.328125, - y: 0.734375 - }, - { - x: 0.359375, - y: 0.734375 - }, - { - x: 0.359375, - y: 0.734375 - }, - { - x: 0.390625, - y: 0.734375 - }, - { - x: 0.390625, - y: 0.734375 - }, - { - x: 0.421875, - y: 0.734375 - }, - { - x: 0.421875, - y: 0.734375 - }, - { - x: 0.453125, - y: 0.734375 - }, - { - x: 0.453125, - y: 0.734375 - }, - { - x: 0.484375, - y: 0.734375 - }, - { - x: 0.484375, - y: 0.734375 - }, - { - x: 0.515625, - y: 0.734375 - }, - { - x: 0.515625, - y: 0.734375 - }, - { - x: 0.546875, - y: 0.734375 - }, - { - x: 0.546875, - y: 0.734375 - }, - { - x: 0.578125, - y: 0.734375 - }, - { - x: 0.578125, - y: 0.734375 - }, - { - x: 0.609375, - y: 0.734375 - }, - { - x: 0.609375, - y: 0.734375 - }, - { - x: 0.640625, - y: 0.734375 - }, - { - x: 0.640625, - y: 0.734375 - }, - { - x: 0.671875, - y: 0.734375 - }, - { - x: 0.671875, - y: 0.734375 - }, - { - x: 0.703125, - y: 0.734375 - }, - { - x: 0.703125, - y: 0.734375 - }, - { - x: 0.734375, - y: 0.734375 - }, - { - x: 0.734375, - y: 0.734375 - }, - { - x: 0.765625, - y: 0.734375 - }, - { - x: 0.765625, - y: 0.734375 - }, - { - x: 0.796875, - y: 0.734375 - }, - { - x: 0.796875, - y: 0.734375 - }, - { - x: 0.828125, - y: 0.734375 - }, - { - x: 0.828125, - y: 0.734375 - }, - { - x: 0.859375, - y: 0.734375 - }, - { - x: 0.859375, - y: 0.734375 - }, - { - x: 0.890625, - y: 0.734375 - }, - { - x: 0.890625, - y: 0.734375 - }, - { - x: 0.921875, - y: 0.734375 - }, - { - x: 0.921875, - y: 0.734375 - }, - { - x: 0.953125, - y: 0.734375 - }, - { - x: 0.953125, - y: 0.734375 - }, - { - x: 0.984375, - y: 0.734375 - }, - { - x: 0.984375, - y: 0.734375 - }, - { - x: 0.015625, - y: 0.765625 - }, - { - x: 0.015625, - y: 0.765625 - }, - { - x: 0.046875, - y: 0.765625 - }, - { - x: 0.046875, - y: 0.765625 - }, - { - x: 0.078125, - y: 0.765625 - }, - { - x: 0.078125, - y: 0.765625 - }, - { - x: 0.109375, - y: 0.765625 - }, - { - x: 0.109375, - y: 0.765625 - }, - { - x: 0.140625, - y: 0.765625 - }, - { - x: 0.140625, - y: 0.765625 - }, - { - x: 0.171875, - y: 0.765625 - }, - { - x: 0.171875, - y: 0.765625 - }, - { - x: 0.203125, - y: 0.765625 - }, - { - x: 0.203125, - y: 0.765625 - }, - { - x: 0.234375, - y: 0.765625 - }, - { - x: 0.234375, - y: 0.765625 - }, - { - x: 0.265625, - y: 0.765625 - }, - { - x: 0.265625, - y: 0.765625 - }, - { - x: 0.296875, - y: 0.765625 - }, - { - x: 0.296875, - y: 0.765625 - }, - { - x: 0.328125, - y: 0.765625 - }, - { - x: 0.328125, - y: 0.765625 - }, - { - x: 0.359375, - y: 0.765625 - }, - { - x: 0.359375, - y: 0.765625 - }, - { - x: 0.390625, - y: 0.765625 - }, - { - x: 0.390625, - y: 0.765625 - }, - { - x: 0.421875, - y: 0.765625 - }, - { - x: 0.421875, - y: 0.765625 - }, - { - x: 0.453125, - y: 0.765625 - }, - { - x: 0.453125, - y: 0.765625 - }, - { - x: 0.484375, - y: 0.765625 - }, - { - x: 0.484375, - y: 0.765625 - }, - { - x: 0.515625, - y: 0.765625 - }, - { - x: 0.515625, - y: 0.765625 - }, - { - x: 0.546875, - y: 0.765625 - }, - { - x: 0.546875, - y: 0.765625 - }, - { - x: 0.578125, - y: 0.765625 - }, - { - x: 0.578125, - y: 0.765625 - }, - { - x: 0.609375, - y: 0.765625 - }, - { - x: 0.609375, - y: 0.765625 - }, - { - x: 0.640625, - y: 0.765625 - }, - { - x: 0.640625, - y: 0.765625 - }, - { - x: 0.671875, - y: 0.765625 - }, - { - x: 0.671875, - y: 0.765625 - }, - { - x: 0.703125, - y: 0.765625 - }, - { - x: 0.703125, - y: 0.765625 - }, - { - x: 0.734375, - y: 0.765625 - }, - { - x: 0.734375, - y: 0.765625 - }, - { - x: 0.765625, - y: 0.765625 - }, - { - x: 0.765625, - y: 0.765625 - }, - { - x: 0.796875, - y: 0.765625 - }, - { - x: 0.796875, - y: 0.765625 - }, - { - x: 0.828125, - y: 0.765625 - }, - { - x: 0.828125, - y: 0.765625 - }, - { - x: 0.859375, - y: 0.765625 - }, - { - x: 0.859375, - y: 0.765625 - }, - { - x: 0.890625, - y: 0.765625 - }, - { - x: 0.890625, - y: 0.765625 - }, - { - x: 0.921875, - y: 0.765625 - }, - { - x: 0.921875, - y: 0.765625 - }, - { - x: 0.953125, - y: 0.765625 - }, - { - x: 0.953125, - y: 0.765625 - }, - { - x: 0.984375, - y: 0.765625 - }, - { - x: 0.984375, - y: 0.765625 - }, - { - x: 0.015625, - y: 0.796875 - }, - { - x: 0.015625, - y: 0.796875 - }, - { - x: 0.046875, - y: 0.796875 - }, - { - x: 0.046875, - y: 0.796875 - }, - { - x: 0.078125, - y: 0.796875 - }, - { - x: 0.078125, - y: 0.796875 - }, - { - x: 0.109375, - y: 0.796875 - }, - { - x: 0.109375, - y: 0.796875 - }, - { - x: 0.140625, - y: 0.796875 - }, - { - x: 0.140625, - y: 0.796875 - }, - { - x: 0.171875, - y: 0.796875 - }, - { - x: 0.171875, - y: 0.796875 - }, - { - x: 0.203125, - y: 0.796875 - }, - { - x: 0.203125, - y: 0.796875 - }, - { - x: 0.234375, - y: 0.796875 - }, - { - x: 0.234375, - y: 0.796875 - }, - { - x: 0.265625, - y: 0.796875 - }, - { - x: 0.265625, - y: 0.796875 - }, - { - x: 0.296875, - y: 0.796875 - }, - { - x: 0.296875, - y: 0.796875 - }, - { - x: 0.328125, - y: 0.796875 - }, - { - x: 0.328125, - y: 0.796875 - }, - { - x: 0.359375, - y: 0.796875 - }, - { - x: 0.359375, - y: 0.796875 - }, - { - x: 0.390625, - y: 0.796875 - }, - { - x: 0.390625, - y: 0.796875 - }, - { - x: 0.421875, - y: 0.796875 - }, - { - x: 0.421875, - y: 0.796875 - }, - { - x: 0.453125, - y: 0.796875 - }, - { - x: 0.453125, - y: 0.796875 - }, - { - x: 0.484375, - y: 0.796875 - }, - { - x: 0.484375, - y: 0.796875 - }, - { - x: 0.515625, - y: 0.796875 - }, - { - x: 0.515625, - y: 0.796875 - }, - { - x: 0.546875, - y: 0.796875 - }, - { - x: 0.546875, - y: 0.796875 - }, - { - x: 0.578125, - y: 0.796875 - }, - { - x: 0.578125, - y: 0.796875 - }, - { - x: 0.609375, - y: 0.796875 - }, - { - x: 0.609375, - y: 0.796875 - }, - { - x: 0.640625, - y: 0.796875 - }, - { - x: 0.640625, - y: 0.796875 - }, - { - x: 0.671875, - y: 0.796875 - }, - { - x: 0.671875, - y: 0.796875 - }, - { - x: 0.703125, - y: 0.796875 - }, - { - x: 0.703125, - y: 0.796875 - }, - { - x: 0.734375, - y: 0.796875 - }, - { - x: 0.734375, - y: 0.796875 - }, - { - x: 0.765625, - y: 0.796875 - }, - { - x: 0.765625, - y: 0.796875 - }, - { - x: 0.796875, - y: 0.796875 - }, - { - x: 0.796875, - y: 0.796875 - }, - { - x: 0.828125, - y: 0.796875 - }, - { - x: 0.828125, - y: 0.796875 - }, - { - x: 0.859375, - y: 0.796875 - }, - { - x: 0.859375, - y: 0.796875 - }, - { - x: 0.890625, - y: 0.796875 - }, - { - x: 0.890625, - y: 0.796875 - }, - { - x: 0.921875, - y: 0.796875 - }, - { - x: 0.921875, - y: 0.796875 - }, - { - x: 0.953125, - y: 0.796875 - }, - { - x: 0.953125, - y: 0.796875 - }, - { - x: 0.984375, - y: 0.796875 - }, - { - x: 0.984375, - y: 0.796875 - }, - { - x: 0.015625, - y: 0.828125 - }, - { - x: 0.015625, - y: 0.828125 - }, - { - x: 0.046875, - y: 0.828125 - }, - { - x: 0.046875, - y: 0.828125 - }, - { - x: 0.078125, - y: 0.828125 - }, - { - x: 0.078125, - y: 0.828125 - }, - { - x: 0.109375, - y: 0.828125 - }, - { - x: 0.109375, - y: 0.828125 - }, - { - x: 0.140625, - y: 0.828125 - }, - { - x: 0.140625, - y: 0.828125 - }, - { - x: 0.171875, - y: 0.828125 - }, - { - x: 0.171875, - y: 0.828125 - }, - { - x: 0.203125, - y: 0.828125 - }, - { - x: 0.203125, - y: 0.828125 - }, - { - x: 0.234375, - y: 0.828125 - }, - { - x: 0.234375, - y: 0.828125 - }, - { - x: 0.265625, - y: 0.828125 - }, - { - x: 0.265625, - y: 0.828125 - }, - { - x: 0.296875, - y: 0.828125 - }, - { - x: 0.296875, - y: 0.828125 - }, - { - x: 0.328125, - y: 0.828125 - }, - { - x: 0.328125, - y: 0.828125 - }, - { - x: 0.359375, - y: 0.828125 - }, - { - x: 0.359375, - y: 0.828125 - }, - { - x: 0.390625, - y: 0.828125 - }, - { - x: 0.390625, - y: 0.828125 - }, - { - x: 0.421875, - y: 0.828125 - }, - { - x: 0.421875, - y: 0.828125 - }, - { - x: 0.453125, - y: 0.828125 - }, - { - x: 0.453125, - y: 0.828125 - }, - { - x: 0.484375, - y: 0.828125 - }, - { - x: 0.484375, - y: 0.828125 - }, - { - x: 0.515625, - y: 0.828125 - }, - { - x: 0.515625, - y: 0.828125 - }, - { - x: 0.546875, - y: 0.828125 - }, - { - x: 0.546875, - y: 0.828125 - }, - { - x: 0.578125, - y: 0.828125 - }, - { - x: 0.578125, - y: 0.828125 - }, - { - x: 0.609375, - y: 0.828125 - }, - { - x: 0.609375, - y: 0.828125 - }, - { - x: 0.640625, - y: 0.828125 - }, - { - x: 0.640625, - y: 0.828125 - }, - { - x: 0.671875, - y: 0.828125 - }, - { - x: 0.671875, - y: 0.828125 - }, - { - x: 0.703125, - y: 0.828125 - }, - { - x: 0.703125, - y: 0.828125 - }, - { - x: 0.734375, - y: 0.828125 - }, - { - x: 0.734375, - y: 0.828125 - }, - { - x: 0.765625, - y: 0.828125 - }, - { - x: 0.765625, - y: 0.828125 - }, - { - x: 0.796875, - y: 0.828125 - }, - { - x: 0.796875, - y: 0.828125 - }, - { - x: 0.828125, - y: 0.828125 - }, - { - x: 0.828125, - y: 0.828125 - }, - { - x: 0.859375, - y: 0.828125 - }, - { - x: 0.859375, - y: 0.828125 - }, - { - x: 0.890625, - y: 0.828125 - }, - { - x: 0.890625, - y: 0.828125 - }, - { - x: 0.921875, - y: 0.828125 - }, - { - x: 0.921875, - y: 0.828125 - }, - { - x: 0.953125, - y: 0.828125 - }, - { - x: 0.953125, - y: 0.828125 - }, - { - x: 0.984375, - y: 0.828125 - }, - { - x: 0.984375, - y: 0.828125 - }, - { - x: 0.015625, - y: 0.859375 - }, - { - x: 0.015625, - y: 0.859375 - }, - { - x: 0.046875, - y: 0.859375 - }, - { - x: 0.046875, - y: 0.859375 - }, - { - x: 0.078125, - y: 0.859375 - }, - { - x: 0.078125, - y: 0.859375 - }, - { - x: 0.109375, - y: 0.859375 - }, - { - x: 0.109375, - y: 0.859375 - }, - { - x: 0.140625, - y: 0.859375 - }, - { - x: 0.140625, - y: 0.859375 - }, - { - x: 0.171875, - y: 0.859375 - }, - { - x: 0.171875, - y: 0.859375 - }, - { - x: 0.203125, - y: 0.859375 - }, - { - x: 0.203125, - y: 0.859375 - }, - { - x: 0.234375, - y: 0.859375 - }, - { - x: 0.234375, - y: 0.859375 - }, - { - x: 0.265625, - y: 0.859375 - }, - { - x: 0.265625, - y: 0.859375 - }, - { - x: 0.296875, - y: 0.859375 - }, - { - x: 0.296875, - y: 0.859375 - }, - { - x: 0.328125, - y: 0.859375 - }, - { - x: 0.328125, - y: 0.859375 - }, - { - x: 0.359375, - y: 0.859375 - }, - { - x: 0.359375, - y: 0.859375 - }, - { - x: 0.390625, - y: 0.859375 - }, - { - x: 0.390625, - y: 0.859375 - }, - { - x: 0.421875, - y: 0.859375 - }, - { - x: 0.421875, - y: 0.859375 - }, - { - x: 0.453125, - y: 0.859375 - }, - { - x: 0.453125, - y: 0.859375 - }, - { - x: 0.484375, - y: 0.859375 - }, - { - x: 0.484375, - y: 0.859375 - }, - { - x: 0.515625, - y: 0.859375 - }, - { - x: 0.515625, - y: 0.859375 - }, - { - x: 0.546875, - y: 0.859375 - }, - { - x: 0.546875, - y: 0.859375 - }, - { - x: 0.578125, - y: 0.859375 - }, - { - x: 0.578125, - y: 0.859375 - }, - { - x: 0.609375, - y: 0.859375 - }, - { - x: 0.609375, - y: 0.859375 - }, - { - x: 0.640625, - y: 0.859375 - }, - { - x: 0.640625, - y: 0.859375 - }, - { - x: 0.671875, - y: 0.859375 - }, - { - x: 0.671875, - y: 0.859375 - }, - { - x: 0.703125, - y: 0.859375 - }, - { - x: 0.703125, - y: 0.859375 - }, - { - x: 0.734375, - y: 0.859375 - }, - { - x: 0.734375, - y: 0.859375 - }, - { - x: 0.765625, - y: 0.859375 - }, - { - x: 0.765625, - y: 0.859375 - }, - { - x: 0.796875, - y: 0.859375 - }, - { - x: 0.796875, - y: 0.859375 - }, - { - x: 0.828125, - y: 0.859375 - }, - { - x: 0.828125, - y: 0.859375 - }, - { - x: 0.859375, - y: 0.859375 - }, - { - x: 0.859375, - y: 0.859375 - }, - { - x: 0.890625, - y: 0.859375 - }, - { - x: 0.890625, - y: 0.859375 - }, - { - x: 0.921875, - y: 0.859375 - }, - { - x: 0.921875, - y: 0.859375 - }, - { - x: 0.953125, - y: 0.859375 - }, - { - x: 0.953125, - y: 0.859375 - }, - { - x: 0.984375, - y: 0.859375 - }, - { - x: 0.984375, - y: 0.859375 - }, - { - x: 0.015625, - y: 0.890625 - }, - { - x: 0.015625, - y: 0.890625 - }, - { - x: 0.046875, - y: 0.890625 - }, - { - x: 0.046875, - y: 0.890625 - }, - { - x: 0.078125, - y: 0.890625 - }, - { - x: 0.078125, - y: 0.890625 - }, - { - x: 0.109375, - y: 0.890625 - }, - { - x: 0.109375, - y: 0.890625 - }, - { - x: 0.140625, - y: 0.890625 - }, - { - x: 0.140625, - y: 0.890625 - }, - { - x: 0.171875, - y: 0.890625 - }, - { - x: 0.171875, - y: 0.890625 - }, - { - x: 0.203125, - y: 0.890625 - }, - { - x: 0.203125, - y: 0.890625 - }, - { - x: 0.234375, - y: 0.890625 - }, - { - x: 0.234375, - y: 0.890625 - }, - { - x: 0.265625, - y: 0.890625 - }, - { - x: 0.265625, - y: 0.890625 - }, - { - x: 0.296875, - y: 0.890625 - }, - { - x: 0.296875, - y: 0.890625 - }, - { - x: 0.328125, - y: 0.890625 - }, - { - x: 0.328125, - y: 0.890625 - }, - { - x: 0.359375, - y: 0.890625 - }, - { - x: 0.359375, - y: 0.890625 - }, - { - x: 0.390625, - y: 0.890625 - }, - { - x: 0.390625, - y: 0.890625 - }, - { - x: 0.421875, - y: 0.890625 - }, - { - x: 0.421875, - y: 0.890625 - }, - { - x: 0.453125, - y: 0.890625 - }, - { - x: 0.453125, - y: 0.890625 - }, - { - x: 0.484375, - y: 0.890625 - }, - { - x: 0.484375, - y: 0.890625 - }, - { - x: 0.515625, - y: 0.890625 - }, - { - x: 0.515625, - y: 0.890625 - }, - { - x: 0.546875, - y: 0.890625 - }, - { - x: 0.546875, - y: 0.890625 - }, - { - x: 0.578125, - y: 0.890625 - }, - { - x: 0.578125, - y: 0.890625 - }, - { - x: 0.609375, - y: 0.890625 - }, - { - x: 0.609375, - y: 0.890625 - }, - { - x: 0.640625, - y: 0.890625 - }, - { - x: 0.640625, - y: 0.890625 - }, - { - x: 0.671875, - y: 0.890625 - }, - { - x: 0.671875, - y: 0.890625 - }, - { - x: 0.703125, - y: 0.890625 - }, - { - x: 0.703125, - y: 0.890625 - }, - { - x: 0.734375, - y: 0.890625 - }, - { - x: 0.734375, - y: 0.890625 - }, - { - x: 0.765625, - y: 0.890625 - }, - { - x: 0.765625, - y: 0.890625 - }, - { - x: 0.796875, - y: 0.890625 - }, - { - x: 0.796875, - y: 0.890625 - }, - { - x: 0.828125, - y: 0.890625 - }, - { - x: 0.828125, - y: 0.890625 - }, - { - x: 0.859375, - y: 0.890625 - }, - { - x: 0.859375, - y: 0.890625 - }, - { - x: 0.890625, - y: 0.890625 - }, - { - x: 0.890625, - y: 0.890625 - }, - { - x: 0.921875, - y: 0.890625 - }, - { - x: 0.921875, - y: 0.890625 - }, - { - x: 0.953125, - y: 0.890625 - }, - { - x: 0.953125, - y: 0.890625 - }, - { - x: 0.984375, - y: 0.890625 - }, - { - x: 0.984375, - y: 0.890625 - }, - { - x: 0.015625, - y: 0.921875 - }, - { - x: 0.015625, - y: 0.921875 - }, - { - x: 0.046875, - y: 0.921875 - }, - { - x: 0.046875, - y: 0.921875 - }, - { - x: 0.078125, - y: 0.921875 - }, - { - x: 0.078125, - y: 0.921875 - }, - { - x: 0.109375, - y: 0.921875 - }, - { - x: 0.109375, - y: 0.921875 - }, - { - x: 0.140625, - y: 0.921875 - }, - { - x: 0.140625, - y: 0.921875 - }, - { - x: 0.171875, - y: 0.921875 - }, - { - x: 0.171875, - y: 0.921875 - }, - { - x: 0.203125, - y: 0.921875 - }, - { - x: 0.203125, - y: 0.921875 - }, - { - x: 0.234375, - y: 0.921875 - }, - { - x: 0.234375, - y: 0.921875 - }, - { - x: 0.265625, - y: 0.921875 - }, - { - x: 0.265625, - y: 0.921875 - }, - { - x: 0.296875, - y: 0.921875 - }, - { - x: 0.296875, - y: 0.921875 - }, - { - x: 0.328125, - y: 0.921875 - }, - { - x: 0.328125, - y: 0.921875 - }, - { - x: 0.359375, - y: 0.921875 - }, - { - x: 0.359375, - y: 0.921875 - }, - { - x: 0.390625, - y: 0.921875 - }, - { - x: 0.390625, - y: 0.921875 - }, - { - x: 0.421875, - y: 0.921875 - }, - { - x: 0.421875, - y: 0.921875 - }, - { - x: 0.453125, - y: 0.921875 - }, - { - x: 0.453125, - y: 0.921875 - }, - { - x: 0.484375, - y: 0.921875 - }, - { - x: 0.484375, - y: 0.921875 - }, - { - x: 0.515625, - y: 0.921875 - }, - { - x: 0.515625, - y: 0.921875 - }, - { - x: 0.546875, - y: 0.921875 - }, - { - x: 0.546875, - y: 0.921875 - }, - { - x: 0.578125, - y: 0.921875 - }, - { - x: 0.578125, - y: 0.921875 - }, - { - x: 0.609375, - y: 0.921875 - }, - { - x: 0.609375, - y: 0.921875 - }, - { - x: 0.640625, - y: 0.921875 - }, - { - x: 0.640625, - y: 0.921875 - }, - { - x: 0.671875, - y: 0.921875 - }, - { - x: 0.671875, - y: 0.921875 - }, - { - x: 0.703125, - y: 0.921875 - }, - { - x: 0.703125, - y: 0.921875 - }, - { - x: 0.734375, - y: 0.921875 - }, - { - x: 0.734375, - y: 0.921875 - }, - { - x: 0.765625, - y: 0.921875 - }, - { - x: 0.765625, - y: 0.921875 - }, - { - x: 0.796875, - y: 0.921875 - }, - { - x: 0.796875, - y: 0.921875 - }, - { - x: 0.828125, - y: 0.921875 - }, - { - x: 0.828125, - y: 0.921875 - }, - { - x: 0.859375, - y: 0.921875 - }, - { - x: 0.859375, - y: 0.921875 - }, - { - x: 0.890625, - y: 0.921875 - }, - { - x: 0.890625, - y: 0.921875 - }, - { - x: 0.921875, - y: 0.921875 - }, - { - x: 0.921875, - y: 0.921875 - }, - { - x: 0.953125, - y: 0.921875 - }, - { - x: 0.953125, - y: 0.921875 - }, - { - x: 0.984375, - y: 0.921875 - }, - { - x: 0.984375, - y: 0.921875 - }, - { - x: 0.015625, - y: 0.953125 - }, - { - x: 0.015625, - y: 0.953125 - }, - { - x: 0.046875, - y: 0.953125 - }, - { - x: 0.046875, - y: 0.953125 - }, - { - x: 0.078125, - y: 0.953125 - }, - { - x: 0.078125, - y: 0.953125 - }, - { - x: 0.109375, - y: 0.953125 - }, - { - x: 0.109375, - y: 0.953125 - }, - { - x: 0.140625, - y: 0.953125 - }, - { - x: 0.140625, - y: 0.953125 - }, - { - x: 0.171875, - y: 0.953125 - }, - { - x: 0.171875, - y: 0.953125 - }, - { - x: 0.203125, - y: 0.953125 - }, - { - x: 0.203125, - y: 0.953125 - }, - { - x: 0.234375, - y: 0.953125 - }, - { - x: 0.234375, - y: 0.953125 - }, - { - x: 0.265625, - y: 0.953125 - }, - { - x: 0.265625, - y: 0.953125 - }, - { - x: 0.296875, - y: 0.953125 - }, - { - x: 0.296875, - y: 0.953125 - }, - { - x: 0.328125, - y: 0.953125 - }, - { - x: 0.328125, - y: 0.953125 - }, - { - x: 0.359375, - y: 0.953125 - }, - { - x: 0.359375, - y: 0.953125 - }, - { - x: 0.390625, - y: 0.953125 - }, - { - x: 0.390625, - y: 0.953125 - }, - { - x: 0.421875, - y: 0.953125 - }, - { - x: 0.421875, - y: 0.953125 - }, - { - x: 0.453125, - y: 0.953125 - }, - { - x: 0.453125, - y: 0.953125 - }, - { - x: 0.484375, - y: 0.953125 - }, - { - x: 0.484375, - y: 0.953125 - }, - { - x: 0.515625, - y: 0.953125 - }, - { - x: 0.515625, - y: 0.953125 - }, - { - x: 0.546875, - y: 0.953125 - }, - { - x: 0.546875, - y: 0.953125 - }, - { - x: 0.578125, - y: 0.953125 - }, - { - x: 0.578125, - y: 0.953125 - }, - { - x: 0.609375, - y: 0.953125 - }, - { - x: 0.609375, - y: 0.953125 - }, - { - x: 0.640625, - y: 0.953125 - }, - { - x: 0.640625, - y: 0.953125 - }, - { - x: 0.671875, - y: 0.953125 - }, - { - x: 0.671875, - y: 0.953125 - }, - { - x: 0.703125, - y: 0.953125 - }, - { - x: 0.703125, - y: 0.953125 - }, - { - x: 0.734375, - y: 0.953125 - }, - { - x: 0.734375, - y: 0.953125 - }, - { - x: 0.765625, - y: 0.953125 - }, - { - x: 0.765625, - y: 0.953125 - }, - { - x: 0.796875, - y: 0.953125 - }, - { - x: 0.796875, - y: 0.953125 - }, - { - x: 0.828125, - y: 0.953125 - }, - { - x: 0.828125, - y: 0.953125 - }, - { - x: 0.859375, - y: 0.953125 - }, - { - x: 0.859375, - y: 0.953125 - }, - { - x: 0.890625, - y: 0.953125 - }, - { - x: 0.890625, - y: 0.953125 - }, - { - x: 0.921875, - y: 0.953125 - }, - { - x: 0.921875, - y: 0.953125 - }, - { - x: 0.953125, - y: 0.953125 - }, - { - x: 0.953125, - y: 0.953125 - }, - { - x: 0.984375, - y: 0.953125 - }, - { - x: 0.984375, - y: 0.953125 - }, - { - x: 0.015625, - y: 0.984375 - }, - { - x: 0.015625, - y: 0.984375 - }, - { - x: 0.046875, - y: 0.984375 - }, - { - x: 0.046875, - y: 0.984375 - }, - { - x: 0.078125, - y: 0.984375 - }, - { - x: 0.078125, - y: 0.984375 - }, - { - x: 0.109375, - y: 0.984375 - }, - { - x: 0.109375, - y: 0.984375 - }, - { - x: 0.140625, - y: 0.984375 - }, - { - x: 0.140625, - y: 0.984375 - }, - { - x: 0.171875, - y: 0.984375 - }, - { - x: 0.171875, - y: 0.984375 - }, - { - x: 0.203125, - y: 0.984375 - }, - { - x: 0.203125, - y: 0.984375 - }, - { - x: 0.234375, - y: 0.984375 - }, - { - x: 0.234375, - y: 0.984375 - }, - { - x: 0.265625, - y: 0.984375 - }, - { - x: 0.265625, - y: 0.984375 - }, - { - x: 0.296875, - y: 0.984375 - }, - { - x: 0.296875, - y: 0.984375 - }, - { - x: 0.328125, - y: 0.984375 - }, - { - x: 0.328125, - y: 0.984375 - }, - { - x: 0.359375, - y: 0.984375 - }, - { - x: 0.359375, - y: 0.984375 - }, - { - x: 0.390625, - y: 0.984375 - }, - { - x: 0.390625, - y: 0.984375 - }, - { - x: 0.421875, - y: 0.984375 - }, - { - x: 0.421875, - y: 0.984375 - }, - { - x: 0.453125, - y: 0.984375 - }, - { - x: 0.453125, - y: 0.984375 - }, - { - x: 0.484375, - y: 0.984375 - }, - { - x: 0.484375, - y: 0.984375 - }, - { - x: 0.515625, - y: 0.984375 - }, - { - x: 0.515625, - y: 0.984375 - }, - { - x: 0.546875, - y: 0.984375 - }, - { - x: 0.546875, - y: 0.984375 - }, - { - x: 0.578125, - y: 0.984375 - }, - { - x: 0.578125, - y: 0.984375 - }, - { - x: 0.609375, - y: 0.984375 - }, - { - x: 0.609375, - y: 0.984375 - }, - { - x: 0.640625, - y: 0.984375 - }, - { - x: 0.640625, - y: 0.984375 - }, - { - x: 0.671875, - y: 0.984375 - }, - { - x: 0.671875, - y: 0.984375 - }, - { - x: 0.703125, - y: 0.984375 - }, - { - x: 0.703125, - y: 0.984375 - }, - { - x: 0.734375, - y: 0.984375 - }, - { - x: 0.734375, - y: 0.984375 - }, - { - x: 0.765625, - y: 0.984375 - }, - { - x: 0.765625, - y: 0.984375 - }, - { - x: 0.796875, - y: 0.984375 - }, - { - x: 0.796875, - y: 0.984375 - }, - { - x: 0.828125, - y: 0.984375 - }, - { - x: 0.828125, - y: 0.984375 - }, - { - x: 0.859375, - y: 0.984375 - }, - { - x: 0.859375, - y: 0.984375 - }, - { - x: 0.890625, - y: 0.984375 - }, - { - x: 0.890625, - y: 0.984375 - }, - { - x: 0.921875, - y: 0.984375 - }, - { - x: 0.921875, - y: 0.984375 - }, - { - x: 0.953125, - y: 0.984375 - }, - { - x: 0.953125, - y: 0.984375 - }, - { - x: 0.984375, - y: 0.984375 - }, - { - x: 0.984375, - y: 0.984375 - }, - { - x: 0.03125, - y: 0.03125 - }, - { - x: 0.03125, - y: 0.03125 - }, - { - x: 0.09375, - y: 0.03125 - }, - { - x: 0.09375, - y: 0.03125 - }, - { - x: 0.15625, - y: 0.03125 - }, - { - x: 0.15625, - y: 0.03125 - }, - { - x: 0.21875, - y: 0.03125 - }, - { - x: 0.21875, - y: 0.03125 - }, - { - x: 0.28125, - y: 0.03125 - }, - { - x: 0.28125, - y: 0.03125 - }, - { - x: 0.34375, - y: 0.03125 - }, - { - x: 0.34375, - y: 0.03125 - }, - { - x: 0.40625, - y: 0.03125 - }, - { - x: 0.40625, - y: 0.03125 - }, - { - x: 0.46875, - y: 0.03125 - }, - { - x: 0.46875, - y: 0.03125 - }, - { - x: 0.53125, - y: 0.03125 - }, - { - x: 0.53125, - y: 0.03125 - }, - { - x: 0.59375, - y: 0.03125 - }, - { - x: 0.59375, - y: 0.03125 - }, - { - x: 0.65625, - y: 0.03125 - }, - { - x: 0.65625, - y: 0.03125 - }, - { - x: 0.71875, - y: 0.03125 - }, - { - x: 0.71875, - y: 0.03125 - }, - { - x: 0.78125, - y: 0.03125 - }, - { - x: 0.78125, - y: 0.03125 - }, - { - x: 0.84375, - y: 0.03125 - }, - { - x: 0.84375, - y: 0.03125 - }, - { - x: 0.90625, - y: 0.03125 - }, - { - x: 0.90625, - y: 0.03125 - }, - { - x: 0.96875, - y: 0.03125 - }, - { - x: 0.96875, - y: 0.03125 - }, - { - x: 0.03125, - y: 0.09375 - }, - { - x: 0.03125, - y: 0.09375 - }, - { - x: 0.09375, - y: 0.09375 - }, - { - x: 0.09375, - y: 0.09375 - }, - { - x: 0.15625, - y: 0.09375 - }, - { - x: 0.15625, - y: 0.09375 - }, - { - x: 0.21875, - y: 0.09375 - }, - { - x: 0.21875, - y: 0.09375 - }, - { - x: 0.28125, - y: 0.09375 - }, - { - x: 0.28125, - y: 0.09375 - }, - { - x: 0.34375, - y: 0.09375 - }, - { - x: 0.34375, - y: 0.09375 - }, - { - x: 0.40625, - y: 0.09375 - }, - { - x: 0.40625, - y: 0.09375 - }, - { - x: 0.46875, - y: 0.09375 - }, - { - x: 0.46875, - y: 0.09375 - }, - { - x: 0.53125, - y: 0.09375 - }, - { - x: 0.53125, - y: 0.09375 - }, - { - x: 0.59375, - y: 0.09375 - }, - { - x: 0.59375, - y: 0.09375 - }, - { - x: 0.65625, - y: 0.09375 - }, - { - x: 0.65625, - y: 0.09375 - }, - { - x: 0.71875, - y: 0.09375 - }, - { - x: 0.71875, - y: 0.09375 - }, - { - x: 0.78125, - y: 0.09375 - }, - { - x: 0.78125, - y: 0.09375 - }, - { - x: 0.84375, - y: 0.09375 - }, - { - x: 0.84375, - y: 0.09375 - }, - { - x: 0.90625, - y: 0.09375 - }, - { - x: 0.90625, - y: 0.09375 - }, - { - x: 0.96875, - y: 0.09375 - }, - { - x: 0.96875, - y: 0.09375 - }, - { - x: 0.03125, - y: 0.15625 - }, - { - x: 0.03125, - y: 0.15625 - }, - { - x: 0.09375, - y: 0.15625 - }, - { - x: 0.09375, - y: 0.15625 - }, - { - x: 0.15625, - y: 0.15625 - }, - { - x: 0.15625, - y: 0.15625 - }, - { - x: 0.21875, - y: 0.15625 - }, - { - x: 0.21875, - y: 0.15625 - }, - { - x: 0.28125, - y: 0.15625 - }, - { - x: 0.28125, - y: 0.15625 - }, - { - x: 0.34375, - y: 0.15625 - }, - { - x: 0.34375, - y: 0.15625 - }, - { - x: 0.40625, - y: 0.15625 - }, - { - x: 0.40625, - y: 0.15625 - }, - { - x: 0.46875, - y: 0.15625 - }, - { - x: 0.46875, - y: 0.15625 - }, - { - x: 0.53125, - y: 0.15625 - }, - { - x: 0.53125, - y: 0.15625 - }, - { - x: 0.59375, - y: 0.15625 - }, - { - x: 0.59375, - y: 0.15625 - }, - { - x: 0.65625, - y: 0.15625 - }, - { - x: 0.65625, - y: 0.15625 - }, - { - x: 0.71875, - y: 0.15625 - }, - { - x: 0.71875, - y: 0.15625 - }, - { - x: 0.78125, - y: 0.15625 - }, - { - x: 0.78125, - y: 0.15625 - }, - { - x: 0.84375, - y: 0.15625 - }, - { - x: 0.84375, - y: 0.15625 - }, - { - x: 0.90625, - y: 0.15625 - }, - { - x: 0.90625, - y: 0.15625 - }, - { - x: 0.96875, - y: 0.15625 - }, - { - x: 0.96875, - y: 0.15625 - }, - { - x: 0.03125, - y: 0.21875 - }, - { - x: 0.03125, - y: 0.21875 - }, - { - x: 0.09375, - y: 0.21875 - }, - { - x: 0.09375, - y: 0.21875 - }, - { - x: 0.15625, - y: 0.21875 - }, - { - x: 0.15625, - y: 0.21875 - }, - { - x: 0.21875, - y: 0.21875 - }, - { - x: 0.21875, - y: 0.21875 - }, - { - x: 0.28125, - y: 0.21875 - }, - { - x: 0.28125, - y: 0.21875 - }, - { - x: 0.34375, - y: 0.21875 - }, - { - x: 0.34375, - y: 0.21875 - }, - { - x: 0.40625, - y: 0.21875 - }, - { - x: 0.40625, - y: 0.21875 - }, - { - x: 0.46875, - y: 0.21875 - }, - { - x: 0.46875, - y: 0.21875 - }, - { - x: 0.53125, - y: 0.21875 - }, - { - x: 0.53125, - y: 0.21875 - }, - { - x: 0.59375, - y: 0.21875 - }, - { - x: 0.59375, - y: 0.21875 - }, - { - x: 0.65625, - y: 0.21875 - }, - { - x: 0.65625, - y: 0.21875 - }, - { - x: 0.71875, - y: 0.21875 - }, - { - x: 0.71875, - y: 0.21875 - }, - { - x: 0.78125, - y: 0.21875 - }, - { - x: 0.78125, - y: 0.21875 - }, - { - x: 0.84375, - y: 0.21875 - }, - { - x: 0.84375, - y: 0.21875 - }, - { - x: 0.90625, - y: 0.21875 - }, - { - x: 0.90625, - y: 0.21875 - }, - { - x: 0.96875, - y: 0.21875 - }, - { - x: 0.96875, - y: 0.21875 - }, - { - x: 0.03125, - y: 0.28125 - }, - { - x: 0.03125, - y: 0.28125 - }, - { - x: 0.09375, - y: 0.28125 - }, - { - x: 0.09375, - y: 0.28125 - }, - { - x: 0.15625, - y: 0.28125 - }, - { - x: 0.15625, - y: 0.28125 - }, - { - x: 0.21875, - y: 0.28125 - }, - { - x: 0.21875, - y: 0.28125 - }, - { - x: 0.28125, - y: 0.28125 - }, - { - x: 0.28125, - y: 0.28125 - }, - { - x: 0.34375, - y: 0.28125 - }, - { - x: 0.34375, - y: 0.28125 - }, - { - x: 0.40625, - y: 0.28125 - }, - { - x: 0.40625, - y: 0.28125 - }, - { - x: 0.46875, - y: 0.28125 - }, - { - x: 0.46875, - y: 0.28125 - }, - { - x: 0.53125, - y: 0.28125 - }, - { - x: 0.53125, - y: 0.28125 - }, - { - x: 0.59375, - y: 0.28125 - }, - { - x: 0.59375, - y: 0.28125 - }, - { - x: 0.65625, - y: 0.28125 - }, - { - x: 0.65625, - y: 0.28125 - }, - { - x: 0.71875, - y: 0.28125 - }, - { - x: 0.71875, - y: 0.28125 - }, - { - x: 0.78125, - y: 0.28125 - }, - { - x: 0.78125, - y: 0.28125 - }, - { - x: 0.84375, - y: 0.28125 - }, - { - x: 0.84375, - y: 0.28125 - }, - { - x: 0.90625, - y: 0.28125 - }, - { - x: 0.90625, - y: 0.28125 - }, - { - x: 0.96875, - y: 0.28125 - }, - { - x: 0.96875, - y: 0.28125 - }, - { - x: 0.03125, - y: 0.34375 - }, - { - x: 0.03125, - y: 0.34375 - }, - { - x: 0.09375, - y: 0.34375 - }, - { - x: 0.09375, - y: 0.34375 - }, - { - x: 0.15625, - y: 0.34375 - }, - { - x: 0.15625, - y: 0.34375 - }, - { - x: 0.21875, - y: 0.34375 - }, - { - x: 0.21875, - y: 0.34375 - }, - { - x: 0.28125, - y: 0.34375 - }, - { - x: 0.28125, - y: 0.34375 - }, - { - x: 0.34375, - y: 0.34375 - }, - { - x: 0.34375, - y: 0.34375 - }, - { - x: 0.40625, - y: 0.34375 - }, - { - x: 0.40625, - y: 0.34375 - }, - { - x: 0.46875, - y: 0.34375 - }, - { - x: 0.46875, - y: 0.34375 - }, - { - x: 0.53125, - y: 0.34375 - }, - { - x: 0.53125, - y: 0.34375 - }, - { - x: 0.59375, - y: 0.34375 - }, - { - x: 0.59375, - y: 0.34375 - }, - { - x: 0.65625, - y: 0.34375 - }, - { - x: 0.65625, - y: 0.34375 - }, - { - x: 0.71875, - y: 0.34375 - }, - { - x: 0.71875, - y: 0.34375 - }, - { - x: 0.78125, - y: 0.34375 - }, - { - x: 0.78125, - y: 0.34375 - }, - { - x: 0.84375, - y: 0.34375 - }, - { - x: 0.84375, - y: 0.34375 - }, - { - x: 0.90625, - y: 0.34375 - }, - { - x: 0.90625, - y: 0.34375 - }, - { - x: 0.96875, - y: 0.34375 - }, - { - x: 0.96875, - y: 0.34375 - }, - { - x: 0.03125, - y: 0.40625 - }, - { - x: 0.03125, - y: 0.40625 - }, - { - x: 0.09375, - y: 0.40625 - }, - { - x: 0.09375, - y: 0.40625 - }, - { - x: 0.15625, - y: 0.40625 - }, - { - x: 0.15625, - y: 0.40625 - }, - { - x: 0.21875, - y: 0.40625 - }, - { - x: 0.21875, - y: 0.40625 - }, - { - x: 0.28125, - y: 0.40625 - }, - { - x: 0.28125, - y: 0.40625 - }, - { - x: 0.34375, - y: 0.40625 - }, - { - x: 0.34375, - y: 0.40625 - }, - { - x: 0.40625, - y: 0.40625 - }, - { - x: 0.40625, - y: 0.40625 - }, - { - x: 0.46875, - y: 0.40625 - }, - { - x: 0.46875, - y: 0.40625 - }, - { - x: 0.53125, - y: 0.40625 - }, - { - x: 0.53125, - y: 0.40625 - }, - { - x: 0.59375, - y: 0.40625 - }, - { - x: 0.59375, - y: 0.40625 - }, - { - x: 0.65625, - y: 0.40625 - }, - { - x: 0.65625, - y: 0.40625 - }, - { - x: 0.71875, - y: 0.40625 - }, - { - x: 0.71875, - y: 0.40625 - }, - { - x: 0.78125, - y: 0.40625 - }, - { - x: 0.78125, - y: 0.40625 - }, - { - x: 0.84375, - y: 0.40625 - }, - { - x: 0.84375, - y: 0.40625 - }, - { - x: 0.90625, - y: 0.40625 - }, - { - x: 0.90625, - y: 0.40625 - }, - { - x: 0.96875, - y: 0.40625 - }, - { - x: 0.96875, - y: 0.40625 - }, - { - x: 0.03125, - y: 0.46875 - }, - { - x: 0.03125, - y: 0.46875 - }, - { - x: 0.09375, - y: 0.46875 - }, - { - x: 0.09375, - y: 0.46875 - }, - { - x: 0.15625, - y: 0.46875 - }, - { - x: 0.15625, - y: 0.46875 - }, - { - x: 0.21875, - y: 0.46875 - }, - { - x: 0.21875, - y: 0.46875 - }, - { - x: 0.28125, - y: 0.46875 - }, - { - x: 0.28125, - y: 0.46875 - }, - { - x: 0.34375, - y: 0.46875 - }, - { - x: 0.34375, - y: 0.46875 - }, - { - x: 0.40625, - y: 0.46875 - }, - { - x: 0.40625, - y: 0.46875 - }, - { - x: 0.46875, - y: 0.46875 - }, - { - x: 0.46875, - y: 0.46875 - }, - { - x: 0.53125, - y: 0.46875 - }, - { - x: 0.53125, - y: 0.46875 - }, - { - x: 0.59375, - y: 0.46875 - }, - { - x: 0.59375, - y: 0.46875 - }, - { - x: 0.65625, - y: 0.46875 - }, - { - x: 0.65625, - y: 0.46875 - }, - { - x: 0.71875, - y: 0.46875 - }, - { - x: 0.71875, - y: 0.46875 - }, - { - x: 0.78125, - y: 0.46875 - }, - { - x: 0.78125, - y: 0.46875 - }, - { - x: 0.84375, - y: 0.46875 - }, - { - x: 0.84375, - y: 0.46875 - }, - { - x: 0.90625, - y: 0.46875 - }, - { - x: 0.90625, - y: 0.46875 - }, - { - x: 0.96875, - y: 0.46875 - }, - { - x: 0.96875, - y: 0.46875 - }, - { - x: 0.03125, - y: 0.53125 - }, - { - x: 0.03125, - y: 0.53125 - }, - { - x: 0.09375, - y: 0.53125 - }, - { - x: 0.09375, - y: 0.53125 - }, - { - x: 0.15625, - y: 0.53125 - }, - { - x: 0.15625, - y: 0.53125 - }, - { - x: 0.21875, - y: 0.53125 - }, - { - x: 0.21875, - y: 0.53125 - }, - { - x: 0.28125, - y: 0.53125 - }, - { - x: 0.28125, - y: 0.53125 - }, - { - x: 0.34375, - y: 0.53125 - }, - { - x: 0.34375, - y: 0.53125 - }, - { - x: 0.40625, - y: 0.53125 - }, - { - x: 0.40625, - y: 0.53125 - }, - { - x: 0.46875, - y: 0.53125 - }, - { - x: 0.46875, - y: 0.53125 - }, - { - x: 0.53125, - y: 0.53125 - }, - { - x: 0.53125, - y: 0.53125 - }, - { - x: 0.59375, - y: 0.53125 - }, - { - x: 0.59375, - y: 0.53125 - }, - { - x: 0.65625, - y: 0.53125 - }, - { - x: 0.65625, - y: 0.53125 - }, - { - x: 0.71875, - y: 0.53125 - }, - { - x: 0.71875, - y: 0.53125 - }, - { - x: 0.78125, - y: 0.53125 - }, - { - x: 0.78125, - y: 0.53125 - }, - { - x: 0.84375, - y: 0.53125 - }, - { - x: 0.84375, - y: 0.53125 - }, - { - x: 0.90625, - y: 0.53125 - }, - { - x: 0.90625, - y: 0.53125 - }, - { - x: 0.96875, - y: 0.53125 - }, - { - x: 0.96875, - y: 0.53125 - }, - { - x: 0.03125, - y: 0.59375 - }, - { - x: 0.03125, - y: 0.59375 - }, - { - x: 0.09375, - y: 0.59375 - }, - { - x: 0.09375, - y: 0.59375 - }, - { - x: 0.15625, - y: 0.59375 - }, - { - x: 0.15625, - y: 0.59375 - }, - { - x: 0.21875, - y: 0.59375 - }, - { - x: 0.21875, - y: 0.59375 - }, - { - x: 0.28125, - y: 0.59375 - }, - { - x: 0.28125, - y: 0.59375 - }, - { - x: 0.34375, - y: 0.59375 - }, - { - x: 0.34375, - y: 0.59375 - }, - { - x: 0.40625, - y: 0.59375 - }, - { - x: 0.40625, - y: 0.59375 - }, - { - x: 0.46875, - y: 0.59375 - }, - { - x: 0.46875, - y: 0.59375 - }, - { - x: 0.53125, - y: 0.59375 - }, - { - x: 0.53125, - y: 0.59375 - }, - { - x: 0.59375, - y: 0.59375 - }, - { - x: 0.59375, - y: 0.59375 - }, - { - x: 0.65625, - y: 0.59375 - }, - { - x: 0.65625, - y: 0.59375 - }, - { - x: 0.71875, - y: 0.59375 - }, - { - x: 0.71875, - y: 0.59375 - }, - { - x: 0.78125, - y: 0.59375 - }, - { - x: 0.78125, - y: 0.59375 - }, - { - x: 0.84375, - y: 0.59375 - }, - { - x: 0.84375, - y: 0.59375 - }, - { - x: 0.90625, - y: 0.59375 - }, - { - x: 0.90625, - y: 0.59375 - }, - { - x: 0.96875, - y: 0.59375 - }, - { - x: 0.96875, - y: 0.59375 - }, - { - x: 0.03125, - y: 0.65625 - }, - { - x: 0.03125, - y: 0.65625 - }, - { - x: 0.09375, - y: 0.65625 - }, - { - x: 0.09375, - y: 0.65625 - }, - { - x: 0.15625, - y: 0.65625 - }, - { - x: 0.15625, - y: 0.65625 - }, - { - x: 0.21875, - y: 0.65625 - }, - { - x: 0.21875, - y: 0.65625 - }, - { - x: 0.28125, - y: 0.65625 - }, - { - x: 0.28125, - y: 0.65625 - }, - { - x: 0.34375, - y: 0.65625 - }, - { - x: 0.34375, - y: 0.65625 - }, - { - x: 0.40625, - y: 0.65625 - }, - { - x: 0.40625, - y: 0.65625 - }, - { - x: 0.46875, - y: 0.65625 - }, - { - x: 0.46875, - y: 0.65625 - }, - { - x: 0.53125, - y: 0.65625 - }, - { - x: 0.53125, - y: 0.65625 - }, - { - x: 0.59375, - y: 0.65625 - }, - { - x: 0.59375, - y: 0.65625 - }, - { - x: 0.65625, - y: 0.65625 - }, - { - x: 0.65625, - y: 0.65625 - }, - { - x: 0.71875, - y: 0.65625 - }, - { - x: 0.71875, - y: 0.65625 - }, - { - x: 0.78125, - y: 0.65625 - }, - { - x: 0.78125, - y: 0.65625 - }, - { - x: 0.84375, - y: 0.65625 - }, - { - x: 0.84375, - y: 0.65625 - }, - { - x: 0.90625, - y: 0.65625 - }, - { - x: 0.90625, - y: 0.65625 - }, - { - x: 0.96875, - y: 0.65625 - }, - { - x: 0.96875, - y: 0.65625 - }, - { - x: 0.03125, - y: 0.71875 - }, - { - x: 0.03125, - y: 0.71875 - }, - { - x: 0.09375, - y: 0.71875 - }, - { - x: 0.09375, - y: 0.71875 - }, - { - x: 0.15625, - y: 0.71875 - }, - { - x: 0.15625, - y: 0.71875 - }, - { - x: 0.21875, - y: 0.71875 - }, - { - x: 0.21875, - y: 0.71875 - }, - { - x: 0.28125, - y: 0.71875 - }, - { - x: 0.28125, - y: 0.71875 - }, - { - x: 0.34375, - y: 0.71875 - }, - { - x: 0.34375, - y: 0.71875 - }, - { - x: 0.40625, - y: 0.71875 - }, - { - x: 0.40625, - y: 0.71875 - }, - { - x: 0.46875, - y: 0.71875 - }, - { - x: 0.46875, - y: 0.71875 - }, - { - x: 0.53125, - y: 0.71875 - }, - { - x: 0.53125, - y: 0.71875 - }, - { - x: 0.59375, - y: 0.71875 - }, - { - x: 0.59375, - y: 0.71875 - }, - { - x: 0.65625, - y: 0.71875 - }, - { - x: 0.65625, - y: 0.71875 - }, - { - x: 0.71875, - y: 0.71875 - }, - { - x: 0.71875, - y: 0.71875 - }, - { - x: 0.78125, - y: 0.71875 - }, - { - x: 0.78125, - y: 0.71875 - }, - { - x: 0.84375, - y: 0.71875 - }, - { - x: 0.84375, - y: 0.71875 - }, - { - x: 0.90625, - y: 0.71875 - }, - { - x: 0.90625, - y: 0.71875 - }, - { - x: 0.96875, - y: 0.71875 - }, - { - x: 0.96875, - y: 0.71875 - }, - { - x: 0.03125, - y: 0.78125 - }, - { - x: 0.03125, - y: 0.78125 - }, - { - x: 0.09375, - y: 0.78125 - }, - { - x: 0.09375, - y: 0.78125 - }, - { - x: 0.15625, - y: 0.78125 - }, - { - x: 0.15625, - y: 0.78125 - }, - { - x: 0.21875, - y: 0.78125 - }, - { - x: 0.21875, - y: 0.78125 - }, - { - x: 0.28125, - y: 0.78125 - }, - { - x: 0.28125, - y: 0.78125 - }, - { - x: 0.34375, - y: 0.78125 - }, - { - x: 0.34375, - y: 0.78125 - }, - { - x: 0.40625, - y: 0.78125 - }, - { - x: 0.40625, - y: 0.78125 - }, - { - x: 0.46875, - y: 0.78125 - }, - { - x: 0.46875, - y: 0.78125 - }, - { - x: 0.53125, - y: 0.78125 - }, - { - x: 0.53125, - y: 0.78125 - }, - { - x: 0.59375, - y: 0.78125 - }, - { - x: 0.59375, - y: 0.78125 - }, - { - x: 0.65625, - y: 0.78125 - }, - { - x: 0.65625, - y: 0.78125 - }, - { - x: 0.71875, - y: 0.78125 - }, - { - x: 0.71875, - y: 0.78125 - }, - { - x: 0.78125, - y: 0.78125 - }, - { - x: 0.78125, - y: 0.78125 - }, - { - x: 0.84375, - y: 0.78125 - }, - { - x: 0.84375, - y: 0.78125 - }, - { - x: 0.90625, - y: 0.78125 - }, - { - x: 0.90625, - y: 0.78125 - }, - { - x: 0.96875, - y: 0.78125 - }, - { - x: 0.96875, - y: 0.78125 - }, - { - x: 0.03125, - y: 0.84375 - }, - { - x: 0.03125, - y: 0.84375 - }, - { - x: 0.09375, - y: 0.84375 - }, - { - x: 0.09375, - y: 0.84375 - }, - { - x: 0.15625, - y: 0.84375 - }, - { - x: 0.15625, - y: 0.84375 - }, - { - x: 0.21875, - y: 0.84375 - }, - { - x: 0.21875, - y: 0.84375 - }, - { - x: 0.28125, - y: 0.84375 - }, - { - x: 0.28125, - y: 0.84375 - }, - { - x: 0.34375, - y: 0.84375 - }, - { - x: 0.34375, - y: 0.84375 - }, - { - x: 0.40625, - y: 0.84375 - }, - { - x: 0.40625, - y: 0.84375 - }, - { - x: 0.46875, - y: 0.84375 - }, - { - x: 0.46875, - y: 0.84375 - }, - { - x: 0.53125, - y: 0.84375 - }, - { - x: 0.53125, - y: 0.84375 - }, - { - x: 0.59375, - y: 0.84375 - }, - { - x: 0.59375, - y: 0.84375 - }, - { - x: 0.65625, - y: 0.84375 - }, - { - x: 0.65625, - y: 0.84375 - }, - { - x: 0.71875, - y: 0.84375 - }, - { - x: 0.71875, - y: 0.84375 - }, - { - x: 0.78125, - y: 0.84375 - }, - { - x: 0.78125, - y: 0.84375 - }, - { - x: 0.84375, - y: 0.84375 - }, - { - x: 0.84375, - y: 0.84375 - }, - { - x: 0.90625, - y: 0.84375 - }, - { - x: 0.90625, - y: 0.84375 - }, - { - x: 0.96875, - y: 0.84375 - }, - { - x: 0.96875, - y: 0.84375 - }, - { - x: 0.03125, - y: 0.90625 - }, - { - x: 0.03125, - y: 0.90625 - }, - { - x: 0.09375, - y: 0.90625 - }, - { - x: 0.09375, - y: 0.90625 - }, - { - x: 0.15625, - y: 0.90625 - }, - { - x: 0.15625, - y: 0.90625 - }, - { - x: 0.21875, - y: 0.90625 - }, - { - x: 0.21875, - y: 0.90625 - }, - { - x: 0.28125, - y: 0.90625 - }, - { - x: 0.28125, - y: 0.90625 - }, - { - x: 0.34375, - y: 0.90625 - }, - { - x: 0.34375, - y: 0.90625 - }, - { - x: 0.40625, - y: 0.90625 - }, - { - x: 0.40625, - y: 0.90625 - }, - { - x: 0.46875, - y: 0.90625 - }, - { - x: 0.46875, - y: 0.90625 - }, - { - x: 0.53125, - y: 0.90625 - }, - { - x: 0.53125, - y: 0.90625 - }, - { - x: 0.59375, - y: 0.90625 - }, - { - x: 0.59375, - y: 0.90625 - }, - { - x: 0.65625, - y: 0.90625 - }, - { - x: 0.65625, - y: 0.90625 - }, - { - x: 0.71875, - y: 0.90625 - }, - { - x: 0.71875, - y: 0.90625 - }, - { - x: 0.78125, - y: 0.90625 - }, - { - x: 0.78125, - y: 0.90625 - }, - { - x: 0.84375, - y: 0.90625 - }, - { - x: 0.84375, - y: 0.90625 - }, - { - x: 0.90625, - y: 0.90625 - }, - { - x: 0.90625, - y: 0.90625 - }, - { - x: 0.96875, - y: 0.90625 - }, - { - x: 0.96875, - y: 0.90625 - }, - { - x: 0.03125, - y: 0.96875 - }, - { - x: 0.03125, - y: 0.96875 - }, - { - x: 0.09375, - y: 0.96875 - }, - { - x: 0.09375, - y: 0.96875 - }, - { - x: 0.15625, - y: 0.96875 - }, - { - x: 0.15625, - y: 0.96875 - }, - { - x: 0.21875, - y: 0.96875 - }, - { - x: 0.21875, - y: 0.96875 - }, - { - x: 0.28125, - y: 0.96875 - }, - { - x: 0.28125, - y: 0.96875 - }, - { - x: 0.34375, - y: 0.96875 - }, - { - x: 0.34375, - y: 0.96875 - }, - { - x: 0.40625, - y: 0.96875 - }, - { - x: 0.40625, - y: 0.96875 - }, - { - x: 0.46875, - y: 0.96875 - }, - { - x: 0.46875, - y: 0.96875 - }, - { - x: 0.53125, - y: 0.96875 - }, - { - x: 0.53125, - y: 0.96875 - }, - { - x: 0.59375, - y: 0.96875 - }, - { - x: 0.59375, - y: 0.96875 - }, - { - x: 0.65625, - y: 0.96875 - }, - { - x: 0.65625, - y: 0.96875 - }, - { - x: 0.71875, - y: 0.96875 - }, - { - x: 0.71875, - y: 0.96875 - }, - { - x: 0.78125, - y: 0.96875 - }, - { - x: 0.78125, - y: 0.96875 - }, - { - x: 0.84375, - y: 0.96875 - }, - { - x: 0.84375, - y: 0.96875 - }, - { - x: 0.90625, - y: 0.96875 - }, - { - x: 0.90625, - y: 0.96875 - }, - { - x: 0.96875, - y: 0.96875 - }, - { - x: 0.96875, - y: 0.96875 - }, - { - x: 0.0625, - y: 0.0625 - }, - { - x: 0.0625, - y: 0.0625 - }, - { - x: 0.0625, - y: 0.0625 - }, - { - x: 0.0625, - y: 0.0625 - }, - { - x: 0.0625, - y: 0.0625 - }, - { - x: 0.0625, - y: 0.0625 - }, - { - x: 0.1875, - y: 0.0625 - }, - { - x: 0.1875, - y: 0.0625 - }, - { - x: 0.1875, - y: 0.0625 - }, - { - x: 0.1875, - y: 0.0625 - }, - { - x: 0.1875, - y: 0.0625 - }, - { - x: 0.1875, - y: 0.0625 - }, - { - x: 0.3125, - y: 0.0625 - }, - { - x: 0.3125, - y: 0.0625 - }, - { - x: 0.3125, - y: 0.0625 - }, - { - x: 0.3125, - y: 0.0625 - }, - { - x: 0.3125, - y: 0.0625 - }, - { - x: 0.3125, - y: 0.0625 - }, - { - x: 0.4375, - y: 0.0625 - }, - { - x: 0.4375, - y: 0.0625 - }, - { - x: 0.4375, - y: 0.0625 - }, - { - x: 0.4375, - y: 0.0625 - }, - { - x: 0.4375, - y: 0.0625 - }, - { - x: 0.4375, - y: 0.0625 - }, - { - x: 0.5625, - y: 0.0625 - }, - { - x: 0.5625, - y: 0.0625 - }, - { - x: 0.5625, - y: 0.0625 - }, - { - x: 0.5625, - y: 0.0625 - }, - { - x: 0.5625, - y: 0.0625 - }, - { - x: 0.5625, - y: 0.0625 - }, - { - x: 0.6875, - y: 0.0625 - }, - { - x: 0.6875, - y: 0.0625 - }, - { - x: 0.6875, - y: 0.0625 - }, - { - x: 0.6875, - y: 0.0625 - }, - { - x: 0.6875, - y: 0.0625 - }, - { - x: 0.6875, - y: 0.0625 - }, - { - x: 0.8125, - y: 0.0625 - }, - { - x: 0.8125, - y: 0.0625 - }, - { - x: 0.8125, - y: 0.0625 - }, - { - x: 0.8125, - y: 0.0625 - }, - { - x: 0.8125, - y: 0.0625 - }, - { - x: 0.8125, - y: 0.0625 - }, - { - x: 0.9375, - y: 0.0625 - }, - { - x: 0.9375, - y: 0.0625 - }, - { - x: 0.9375, - y: 0.0625 - }, - { - x: 0.9375, - y: 0.0625 - }, - { - x: 0.9375, - y: 0.0625 - }, - { - x: 0.9375, - y: 0.0625 - }, - { - x: 0.0625, - y: 0.1875 - }, - { - x: 0.0625, - y: 0.1875 - }, - { - x: 0.0625, - y: 0.1875 - }, - { - x: 0.0625, - y: 0.1875 - }, - { - x: 0.0625, - y: 0.1875 - }, - { - x: 0.0625, - y: 0.1875 - }, - { - x: 0.1875, - y: 0.1875 - }, - { - x: 0.1875, - y: 0.1875 - }, - { - x: 0.1875, - y: 0.1875 - }, - { - x: 0.1875, - y: 0.1875 - }, - { - x: 0.1875, - y: 0.1875 - }, - { - x: 0.1875, - y: 0.1875 - }, - { - x: 0.3125, - y: 0.1875 - }, - { - x: 0.3125, - y: 0.1875 - }, - { - x: 0.3125, - y: 0.1875 - }, - { - x: 0.3125, - y: 0.1875 - }, - { - x: 0.3125, - y: 0.1875 - }, - { - x: 0.3125, - y: 0.1875 - }, - { - x: 0.4375, - y: 0.1875 - }, - { - x: 0.4375, - y: 0.1875 - }, - { - x: 0.4375, - y: 0.1875 - }, - { - x: 0.4375, - y: 0.1875 - }, - { - x: 0.4375, - y: 0.1875 - }, - { - x: 0.4375, - y: 0.1875 - }, - { - x: 0.5625, - y: 0.1875 - }, - { - x: 0.5625, - y: 0.1875 - }, - { - x: 0.5625, - y: 0.1875 - }, - { - x: 0.5625, - y: 0.1875 - }, - { - x: 0.5625, - y: 0.1875 - }, - { - x: 0.5625, - y: 0.1875 - }, - { - x: 0.6875, - y: 0.1875 - }, - { - x: 0.6875, - y: 0.1875 - }, - { - x: 0.6875, - y: 0.1875 - }, - { - x: 0.6875, - y: 0.1875 - }, - { - x: 0.6875, - y: 0.1875 - }, - { - x: 0.6875, - y: 0.1875 - }, - { - x: 0.8125, - y: 0.1875 - }, - { - x: 0.8125, - y: 0.1875 - }, - { - x: 0.8125, - y: 0.1875 - }, - { - x: 0.8125, - y: 0.1875 - }, - { - x: 0.8125, - y: 0.1875 - }, - { - x: 0.8125, - y: 0.1875 - }, - { - x: 0.9375, - y: 0.1875 - }, - { - x: 0.9375, - y: 0.1875 - }, - { - x: 0.9375, - y: 0.1875 - }, - { - x: 0.9375, - y: 0.1875 - }, - { - x: 0.9375, - y: 0.1875 - }, - { - x: 0.9375, - y: 0.1875 - }, - { - x: 0.0625, - y: 0.3125 - }, - { - x: 0.0625, - y: 0.3125 - }, - { - x: 0.0625, - y: 0.3125 - }, - { - x: 0.0625, - y: 0.3125 - }, - { - x: 0.0625, - y: 0.3125 - }, - { - x: 0.0625, - y: 0.3125 - }, - { - x: 0.1875, - y: 0.3125 - }, - { - x: 0.1875, - y: 0.3125 - }, - { - x: 0.1875, - y: 0.3125 - }, - { - x: 0.1875, - y: 0.3125 - }, - { - x: 0.1875, - y: 0.3125 - }, - { - x: 0.1875, - y: 0.3125 - }, - { - x: 0.3125, - y: 0.3125 - }, - { - x: 0.3125, - y: 0.3125 - }, - { - x: 0.3125, - y: 0.3125 - }, - { - x: 0.3125, - y: 0.3125 - }, - { - x: 0.3125, - y: 0.3125 - }, - { - x: 0.3125, - y: 0.3125 - }, - { - x: 0.4375, - y: 0.3125 - }, - { - x: 0.4375, - y: 0.3125 - }, - { - x: 0.4375, - y: 0.3125 - }, - { - x: 0.4375, - y: 0.3125 - }, - { - x: 0.4375, - y: 0.3125 - }, - { - x: 0.4375, - y: 0.3125 - }, - { - x: 0.5625, - y: 0.3125 - }, - { - x: 0.5625, - y: 0.3125 - }, - { - x: 0.5625, - y: 0.3125 - }, - { - x: 0.5625, - y: 0.3125 - }, - { - x: 0.5625, - y: 0.3125 - }, - { - x: 0.5625, - y: 0.3125 - }, - { - x: 0.6875, - y: 0.3125 - }, - { - x: 0.6875, - y: 0.3125 - }, - { - x: 0.6875, - y: 0.3125 - }, - { - x: 0.6875, - y: 0.3125 - }, - { - x: 0.6875, - y: 0.3125 - }, - { - x: 0.6875, - y: 0.3125 - }, - { - x: 0.8125, - y: 0.3125 - }, - { - x: 0.8125, - y: 0.3125 - }, - { - x: 0.8125, - y: 0.3125 - }, - { - x: 0.8125, - y: 0.3125 - }, - { - x: 0.8125, - y: 0.3125 - }, - { - x: 0.8125, - y: 0.3125 - }, - { - x: 0.9375, - y: 0.3125 - }, - { - x: 0.9375, - y: 0.3125 - }, - { - x: 0.9375, - y: 0.3125 - }, - { - x: 0.9375, - y: 0.3125 - }, - { - x: 0.9375, - y: 0.3125 - }, - { - x: 0.9375, - y: 0.3125 - }, - { - x: 0.0625, - y: 0.4375 - }, - { - x: 0.0625, - y: 0.4375 - }, - { - x: 0.0625, - y: 0.4375 - }, - { - x: 0.0625, - y: 0.4375 - }, - { - x: 0.0625, - y: 0.4375 - }, - { - x: 0.0625, - y: 0.4375 - }, - { - x: 0.1875, - y: 0.4375 - }, - { - x: 0.1875, - y: 0.4375 - }, - { - x: 0.1875, - y: 0.4375 - }, - { - x: 0.1875, - y: 0.4375 - }, - { - x: 0.1875, - y: 0.4375 - }, - { - x: 0.1875, - y: 0.4375 - }, - { - x: 0.3125, - y: 0.4375 - }, - { - x: 0.3125, - y: 0.4375 - }, - { - x: 0.3125, - y: 0.4375 - }, - { - x: 0.3125, - y: 0.4375 - }, - { - x: 0.3125, - y: 0.4375 - }, - { - x: 0.3125, - y: 0.4375 - }, - { - x: 0.4375, - y: 0.4375 - }, - { - x: 0.4375, - y: 0.4375 - }, - { - x: 0.4375, - y: 0.4375 - }, - { - x: 0.4375, - y: 0.4375 - }, - { - x: 0.4375, - y: 0.4375 - }, - { - x: 0.4375, - y: 0.4375 - }, - { - x: 0.5625, - y: 0.4375 - }, - { - x: 0.5625, - y: 0.4375 - }, - { - x: 0.5625, - y: 0.4375 - }, - { - x: 0.5625, - y: 0.4375 - }, - { - x: 0.5625, - y: 0.4375 - }, - { - x: 0.5625, - y: 0.4375 - }, - { - x: 0.6875, - y: 0.4375 - }, - { - x: 0.6875, - y: 0.4375 - }, - { - x: 0.6875, - y: 0.4375 - }, - { - x: 0.6875, - y: 0.4375 - }, - { - x: 0.6875, - y: 0.4375 - }, - { - x: 0.6875, - y: 0.4375 - }, - { - x: 0.8125, - y: 0.4375 - }, - { - x: 0.8125, - y: 0.4375 - }, - { - x: 0.8125, - y: 0.4375 - }, - { - x: 0.8125, - y: 0.4375 - }, - { - x: 0.8125, - y: 0.4375 - }, - { - x: 0.8125, - y: 0.4375 - }, - { - x: 0.9375, - y: 0.4375 - }, - { - x: 0.9375, - y: 0.4375 - }, - { - x: 0.9375, - y: 0.4375 - }, - { - x: 0.9375, - y: 0.4375 - }, - { - x: 0.9375, - y: 0.4375 - }, - { - x: 0.9375, - y: 0.4375 - }, - { - x: 0.0625, - y: 0.5625 - }, - { - x: 0.0625, - y: 0.5625 - }, - { - x: 0.0625, - y: 0.5625 - }, - { - x: 0.0625, - y: 0.5625 - }, - { - x: 0.0625, - y: 0.5625 - }, - { - x: 0.0625, - y: 0.5625 - }, - { - x: 0.1875, - y: 0.5625 - }, - { - x: 0.1875, - y: 0.5625 - }, - { - x: 0.1875, - y: 0.5625 - }, - { - x: 0.1875, - y: 0.5625 - }, - { - x: 0.1875, - y: 0.5625 - }, - { - x: 0.1875, - y: 0.5625 - }, - { - x: 0.3125, - y: 0.5625 - }, - { - x: 0.3125, - y: 0.5625 - }, - { - x: 0.3125, - y: 0.5625 - }, - { - x: 0.3125, - y: 0.5625 - }, - { - x: 0.3125, - y: 0.5625 - }, - { - x: 0.3125, - y: 0.5625 - }, - { - x: 0.4375, - y: 0.5625 - }, - { - x: 0.4375, - y: 0.5625 - }, - { - x: 0.4375, - y: 0.5625 - }, - { - x: 0.4375, - y: 0.5625 - }, - { - x: 0.4375, - y: 0.5625 - }, - { - x: 0.4375, - y: 0.5625 - }, - { - x: 0.5625, - y: 0.5625 - }, - { - x: 0.5625, - y: 0.5625 - }, - { - x: 0.5625, - y: 0.5625 - }, - { - x: 0.5625, - y: 0.5625 - }, - { - x: 0.5625, - y: 0.5625 - }, - { - x: 0.5625, - y: 0.5625 - }, - { - x: 0.6875, - y: 0.5625 - }, - { - x: 0.6875, - y: 0.5625 - }, - { - x: 0.6875, - y: 0.5625 - }, - { - x: 0.6875, - y: 0.5625 - }, - { - x: 0.6875, - y: 0.5625 - }, - { - x: 0.6875, - y: 0.5625 - }, - { - x: 0.8125, - y: 0.5625 - }, - { - x: 0.8125, - y: 0.5625 - }, - { - x: 0.8125, - y: 0.5625 - }, - { - x: 0.8125, - y: 0.5625 - }, - { - x: 0.8125, - y: 0.5625 - }, - { - x: 0.8125, - y: 0.5625 - }, - { - x: 0.9375, - y: 0.5625 - }, - { - x: 0.9375, - y: 0.5625 - }, - { - x: 0.9375, - y: 0.5625 - }, - { - x: 0.9375, - y: 0.5625 - }, - { - x: 0.9375, - y: 0.5625 - }, - { - x: 0.9375, - y: 0.5625 - }, - { - x: 0.0625, - y: 0.6875 - }, - { - x: 0.0625, - y: 0.6875 - }, - { - x: 0.0625, - y: 0.6875 - }, - { - x: 0.0625, - y: 0.6875 - }, - { - x: 0.0625, - y: 0.6875 - }, - { - x: 0.0625, - y: 0.6875 - }, - { - x: 0.1875, - y: 0.6875 - }, - { - x: 0.1875, - y: 0.6875 - }, - { - x: 0.1875, - y: 0.6875 - }, - { - x: 0.1875, - y: 0.6875 - }, - { - x: 0.1875, - y: 0.6875 - }, - { - x: 0.1875, - y: 0.6875 - }, - { - x: 0.3125, - y: 0.6875 - }, - { - x: 0.3125, - y: 0.6875 - }, - { - x: 0.3125, - y: 0.6875 - }, - { - x: 0.3125, - y: 0.6875 - }, - { - x: 0.3125, - y: 0.6875 - }, - { - x: 0.3125, - y: 0.6875 - }, - { - x: 0.4375, - y: 0.6875 - }, - { - x: 0.4375, - y: 0.6875 - }, - { - x: 0.4375, - y: 0.6875 - }, - { - x: 0.4375, - y: 0.6875 - }, - { - x: 0.4375, - y: 0.6875 - }, - { - x: 0.4375, - y: 0.6875 - }, - { - x: 0.5625, - y: 0.6875 - }, - { - x: 0.5625, - y: 0.6875 - }, - { - x: 0.5625, - y: 0.6875 - }, - { - x: 0.5625, - y: 0.6875 - }, - { - x: 0.5625, - y: 0.6875 - }, - { - x: 0.5625, - y: 0.6875 - }, - { - x: 0.6875, - y: 0.6875 - }, - { - x: 0.6875, - y: 0.6875 - }, - { - x: 0.6875, - y: 0.6875 - }, - { - x: 0.6875, - y: 0.6875 - }, - { - x: 0.6875, - y: 0.6875 - }, - { - x: 0.6875, - y: 0.6875 - }, - { - x: 0.8125, - y: 0.6875 - }, - { - x: 0.8125, - y: 0.6875 - }, - { - x: 0.8125, - y: 0.6875 - }, - { - x: 0.8125, - y: 0.6875 - }, - { - x: 0.8125, - y: 0.6875 - }, - { - x: 0.8125, - y: 0.6875 - }, - { - x: 0.9375, - y: 0.6875 - }, - { - x: 0.9375, - y: 0.6875 - }, - { - x: 0.9375, - y: 0.6875 - }, - { - x: 0.9375, - y: 0.6875 - }, - { - x: 0.9375, - y: 0.6875 - }, - { - x: 0.9375, - y: 0.6875 - }, - { - x: 0.0625, - y: 0.8125 - }, - { - x: 0.0625, - y: 0.8125 - }, - { - x: 0.0625, - y: 0.8125 - }, - { - x: 0.0625, - y: 0.8125 - }, - { - x: 0.0625, - y: 0.8125 - }, - { - x: 0.0625, - y: 0.8125 - }, - { - x: 0.1875, - y: 0.8125 - }, - { - x: 0.1875, - y: 0.8125 - }, - { - x: 0.1875, - y: 0.8125 - }, - { - x: 0.1875, - y: 0.8125 - }, - { - x: 0.1875, - y: 0.8125 - }, - { - x: 0.1875, - y: 0.8125 - }, - { - x: 0.3125, - y: 0.8125 - }, - { - x: 0.3125, - y: 0.8125 - }, - { - x: 0.3125, - y: 0.8125 - }, - { - x: 0.3125, - y: 0.8125 - }, - { - x: 0.3125, - y: 0.8125 - }, - { - x: 0.3125, - y: 0.8125 - }, - { - x: 0.4375, - y: 0.8125 - }, - { - x: 0.4375, - y: 0.8125 - }, - { - x: 0.4375, - y: 0.8125 - }, - { - x: 0.4375, - y: 0.8125 - }, - { - x: 0.4375, - y: 0.8125 - }, - { - x: 0.4375, - y: 0.8125 - }, - { - x: 0.5625, - y: 0.8125 - }, - { - x: 0.5625, - y: 0.8125 - }, - { - x: 0.5625, - y: 0.8125 - }, - { - x: 0.5625, - y: 0.8125 - }, - { - x: 0.5625, - y: 0.8125 - }, - { - x: 0.5625, - y: 0.8125 - }, - { - x: 0.6875, - y: 0.8125 - }, - { - x: 0.6875, - y: 0.8125 - }, - { - x: 0.6875, - y: 0.8125 - }, - { - x: 0.6875, - y: 0.8125 - }, - { - x: 0.6875, - y: 0.8125 - }, - { - x: 0.6875, - y: 0.8125 - }, - { - x: 0.8125, - y: 0.8125 - }, - { - x: 0.8125, - y: 0.8125 - }, - { - x: 0.8125, - y: 0.8125 - }, - { - x: 0.8125, - y: 0.8125 - }, - { - x: 0.8125, - y: 0.8125 - }, - { - x: 0.8125, - y: 0.8125 - }, - { - x: 0.9375, - y: 0.8125 - }, - { - x: 0.9375, - y: 0.8125 - }, - { - x: 0.9375, - y: 0.8125 - }, - { - x: 0.9375, - y: 0.8125 - }, - { - x: 0.9375, - y: 0.8125 - }, - { - x: 0.9375, - y: 0.8125 - }, - { - x: 0.0625, - y: 0.9375 - }, - { - x: 0.0625, - y: 0.9375 - }, - { - x: 0.0625, - y: 0.9375 - }, - { - x: 0.0625, - y: 0.9375 - }, - { - x: 0.0625, - y: 0.9375 - }, - { - x: 0.0625, - y: 0.9375 - }, - { - x: 0.1875, - y: 0.9375 - }, - { - x: 0.1875, - y: 0.9375 - }, - { - x: 0.1875, - y: 0.9375 - }, - { - x: 0.1875, - y: 0.9375 - }, - { - x: 0.1875, - y: 0.9375 - }, - { - x: 0.1875, - y: 0.9375 - }, - { - x: 0.3125, - y: 0.9375 - }, - { - x: 0.3125, - y: 0.9375 - }, - { - x: 0.3125, - y: 0.9375 - }, - { - x: 0.3125, - y: 0.9375 - }, - { - x: 0.3125, - y: 0.9375 - }, - { - x: 0.3125, - y: 0.9375 - }, - { - x: 0.4375, - y: 0.9375 - }, - { - x: 0.4375, - y: 0.9375 - }, - { - x: 0.4375, - y: 0.9375 - }, - { - x: 0.4375, - y: 0.9375 - }, - { - x: 0.4375, - y: 0.9375 - }, - { - x: 0.4375, - y: 0.9375 - }, - { - x: 0.5625, - y: 0.9375 - }, - { - x: 0.5625, - y: 0.9375 - }, - { - x: 0.5625, - y: 0.9375 - }, - { - x: 0.5625, - y: 0.9375 - }, - { - x: 0.5625, - y: 0.9375 - }, - { - x: 0.5625, - y: 0.9375 - }, - { - x: 0.6875, - y: 0.9375 - }, - { - x: 0.6875, - y: 0.9375 - }, - { - x: 0.6875, - y: 0.9375 - }, - { - x: 0.6875, - y: 0.9375 - }, - { - x: 0.6875, - y: 0.9375 - }, - { - x: 0.6875, - y: 0.9375 - }, - { - x: 0.8125, - y: 0.9375 - }, - { - x: 0.8125, - y: 0.9375 - }, - { - x: 0.8125, - y: 0.9375 - }, - { - x: 0.8125, - y: 0.9375 - }, - { - x: 0.8125, - y: 0.9375 - }, - { - x: 0.8125, - y: 0.9375 - }, - { - x: 0.9375, - y: 0.9375 - }, - { - x: 0.9375, - y: 0.9375 - }, - { - x: 0.9375, - y: 0.9375 - }, - { - x: 0.9375, - y: 0.9375 - }, - { - x: 0.9375, - y: 0.9375 - }, - { - x: 0.9375, - y: 0.9375 - } -]; - -// src/handpose/handdetector.ts -var HandDetector = class { - constructor(model7) { - var _a; - this.model = model7; - this.anchors = anchors.map((anchor) => [anchor.x, anchor.y]); - this.anchorsTensor = tfjs_esm_exports.tensor2d(this.anchors); - this.inputSize = (_a = this.model) == null ? void 0 : _a.inputs[0].shape[2]; - this.inputSizeTensor = tfjs_esm_exports.tensor1d([this.inputSize, this.inputSize]); - this.doubleInputSizeTensor = tfjs_esm_exports.tensor1d([this.inputSize * 2, this.inputSize * 2]); - } - normalizeBoxes(boxes) { - return tfjs_esm_exports.tidy(() => { - const boxOffsets = tfjs_esm_exports.slice(boxes, [0, 0], [-1, 2]); - const boxSizes = tfjs_esm_exports.slice(boxes, [0, 2], [-1, 2]); - const boxCenterPoints = tfjs_esm_exports.add(tfjs_esm_exports.div(boxOffsets, this.inputSizeTensor), this.anchorsTensor); - const halfBoxSizes = tfjs_esm_exports.div(boxSizes, this.doubleInputSizeTensor); - const startPoints = tfjs_esm_exports.mul(tfjs_esm_exports.sub(boxCenterPoints, halfBoxSizes), this.inputSizeTensor); - const endPoints = tfjs_esm_exports.mul(tfjs_esm_exports.add(boxCenterPoints, halfBoxSizes), this.inputSizeTensor); - return tfjs_esm_exports.concat2d([startPoints, endPoints], 1); - }); - } - normalizeLandmarks(rawPalmLandmarks, index) { - return tfjs_esm_exports.tidy(() => { - const landmarks = tfjs_esm_exports.add(tfjs_esm_exports.div(rawPalmLandmarks.reshape([-1, 7, 2]), this.inputSizeTensor), this.anchors[index]); - return tfjs_esm_exports.mul(landmarks, this.inputSizeTensor); - }); - } - async getBoxes(input, config3) { - const batched = this.model.predict(input); - const predictions = batched.squeeze(); - batched.dispose(); - const scoresT = tfjs_esm_exports.tidy(() => tfjs_esm_exports.sigmoid(tfjs_esm_exports.slice(predictions, [0, 0], [-1, 1])).squeeze()); - const scores = scoresT.dataSync(); - const rawBoxes = tfjs_esm_exports.slice(predictions, [0, 1], [-1, 4]); - const boxes = this.normalizeBoxes(rawBoxes); - rawBoxes.dispose(); - const filteredT = await tfjs_esm_exports.image.nonMaxSuppressionAsync(boxes, scores, config3.hand.maxDetected, config3.hand.iouThreshold, config3.hand.minConfidence); - const filtered = filteredT.arraySync(); - scoresT.dispose(); - filteredT.dispose(); - const hands = []; - for (const index of filtered) { - if (scores[index] >= config3.hand.minConfidence) { - const matchingBox = tfjs_esm_exports.slice(boxes, [index, 0], [1, -1]); - const rawPalmLandmarks = tfjs_esm_exports.slice(predictions, [index, 5], [1, 14]); - const palmLandmarks = tfjs_esm_exports.tidy(() => this.normalizeLandmarks(rawPalmLandmarks, index).reshape([-1, 2])); - rawPalmLandmarks.dispose(); - hands.push({ box: matchingBox, palmLandmarks, confidence: scores[index] }); - } - } - predictions.dispose(); - boxes.dispose(); - return hands; - } - async estimateHandBounds(input, config3) { - const inputHeight = input.shape[1]; - const inputWidth = input.shape[2]; - const image13 = tfjs_esm_exports.tidy(() => input.resizeBilinear([this.inputSize, this.inputSize]).div(127.5).sub(1)); - const predictions = await this.getBoxes(image13, config3); - image13.dispose(); - const hands = []; - if (!predictions || predictions.length === 0) - return hands; - for (const prediction of predictions) { - const boxes = prediction.box.dataSync(); - const startPoint = boxes.slice(0, 2); - const endPoint = boxes.slice(2, 4); - const palmLandmarks = prediction.palmLandmarks.arraySync(); - prediction.box.dispose(); - prediction.palmLandmarks.dispose(); - hands.push(scaleBoxCoordinates2({ startPoint, endPoint, palmLandmarks, confidence: prediction.confidence }, [inputWidth / this.inputSize, inputHeight / this.inputSize])); - } - return hands; - } -}; - -// src/handpose/util.ts -function normalizeRadians2(angle) { - return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI)); -} -function computeRotation2(point1, point2) { - const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]); - return normalizeRadians2(radians); -} -var buildTranslationMatrix2 = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]]; -function dot2(v1, v2) { - let product = 0; - for (let i = 0; i < v1.length; i++) { - product += v1[i] * v2[i]; - } - return product; -} -function getColumnFrom2DArr2(arr, columnIndex) { - const column = []; - for (let i = 0; i < arr.length; i++) { - column.push(arr[i][columnIndex]); - } - return column; -} -function multiplyTransformMatrices2(mat1, mat2) { - const product = []; - const size = mat1.length; - for (let row = 0; row < size; row++) { - product.push([]); - for (let col = 0; col < size; col++) { - product[row].push(dot2(mat1[row], getColumnFrom2DArr2(mat2, col))); - } - } - return product; -} -function buildRotationMatrix2(rotation, center) { - const cosA = Math.cos(rotation); - const sinA = Math.sin(rotation); - const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]]; - const translationMatrix = buildTranslationMatrix2(center[0], center[1]); - const translationTimesRotation = multiplyTransformMatrices2(translationMatrix, rotationMatrix); - const negativeTranslationMatrix = buildTranslationMatrix2(-center[0], -center[1]); - return multiplyTransformMatrices2(translationTimesRotation, negativeTranslationMatrix); -} -function invertTransformMatrix2(matrix) { - const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]]; - const translationComponent = [matrix[0][2], matrix[1][2]]; - const invertedTranslation = [ - -dot2(rotationComponent[0], translationComponent), - -dot2(rotationComponent[1], translationComponent) - ]; - return [ - rotationComponent[0].concat(invertedTranslation[0]), - rotationComponent[1].concat(invertedTranslation[1]), - [0, 0, 1] - ]; -} -function rotatePoint2(homogeneousCoordinate, rotationMatrix) { - return [ - dot2(homogeneousCoordinate, rotationMatrix[0]), - dot2(homogeneousCoordinate, rotationMatrix[1]) - ]; -} - -// src/handpose/handpipeline.ts -var palmBoxEnlargeFactor = 5; -var handBoxEnlargeFactor = 1.65; -var palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2]; -var palmLandmarksPalmBase = 0; -var palmLandmarksMiddleFingerBase = 2; -var HandPipeline = class { - constructor(handDetector, landmarkDetector) { - var _a; - this.handDetector = handDetector; - this.landmarkDetector = landmarkDetector; - this.inputSize = (_a = this.landmarkDetector) == null ? void 0 : _a.inputs[0].shape[2]; - this.storedBoxes = []; - this.skipped = 0; - this.detectedHands = 0; - } - calculateLandmarksBoundingBox(landmarks) { - const xs = landmarks.map((d) => d[0]); - const ys = landmarks.map((d) => d[1]); - const startPoint = [Math.min(...xs), Math.min(...ys)]; - const endPoint = [Math.max(...xs), Math.max(...ys)]; - return { startPoint, endPoint }; - } - getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) { - const rotatedPalmLandmarks = palmLandmarks.map((coord) => rotatePoint2([...coord, 1], rotationMatrix)); - const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks); - return enlargeBox2(squarifyBox2(boxAroundPalm), palmBoxEnlargeFactor); - } - getBoxForHandLandmarks(landmarks) { - const boundingBox = this.calculateLandmarksBoundingBox(landmarks); - const boxAroundHand = enlargeBox2(squarifyBox2(boundingBox), handBoxEnlargeFactor); - boxAroundHand.palmLandmarks = []; - for (let i = 0; i < palmLandmarkIds.length; i++) { - boxAroundHand.palmLandmarks.push(landmarks[palmLandmarkIds[i]].slice(0, 2)); - } - return boxAroundHand; - } - transformRawCoords(rawCoords, box22, angle, rotationMatrix) { - const boxSize = getBoxSize2(box22); - const scaleFactor = [boxSize[0] / this.inputSize, boxSize[1] / this.inputSize, (boxSize[0] + boxSize[1]) / this.inputSize / 2]; - const coordsScaled = rawCoords.map((coord) => [ - scaleFactor[0] * (coord[0] - this.inputSize / 2), - scaleFactor[1] * (coord[1] - this.inputSize / 2), - scaleFactor[2] * coord[2] - ]); - const coordsRotationMatrix = buildRotationMatrix2(angle, [0, 0]); - const coordsRotated = coordsScaled.map((coord) => { - const rotated = rotatePoint2(coord, coordsRotationMatrix); - return [...rotated, coord[2]]; - }); - const inverseRotationMatrix = invertTransformMatrix2(rotationMatrix); - const boxCenter = [...getBoxCenter2(box22), 1]; - const originalBoxCenter = [ - dot2(boxCenter, inverseRotationMatrix[0]), - dot2(boxCenter, inverseRotationMatrix[1]) - ]; - return coordsRotated.map((coord) => [ - coord[0] + originalBoxCenter[0], - coord[1] + originalBoxCenter[1], - coord[2] - ]); - } - async estimateHands(image13, config3) { - let useFreshBox = false; - let boxes; - if (this.skipped === 0 || this.skipped > config3.hand.skipFrames || !config3.hand.landmarks || !config3.skipFrame) { - boxes = await this.handDetector.estimateHandBounds(image13, config3); - this.skipped = 0; - } - if (config3.skipFrame) - this.skipped++; - if (boxes && boxes.length > 0 && (boxes.length !== this.detectedHands && this.detectedHands !== config3.hand.maxDetected || !config3.hand.landmarks)) { - this.detectedHands = 0; - this.storedBoxes = [...boxes]; - if (this.storedBoxes.length > 0) - useFreshBox = true; - } - const hands = []; - for (let i = 0; i < this.storedBoxes.length; i++) { - const currentBox = this.storedBoxes[i]; - if (!currentBox) - continue; - if (config3.hand.landmarks) { - const angle = config3.hand.rotation ? computeRotation2(currentBox.palmLandmarks[palmLandmarksPalmBase], currentBox.palmLandmarks[palmLandmarksMiddleFingerBase]) : 0; - const palmCenter = getBoxCenter2(currentBox); - const palmCenterNormalized = [palmCenter[0] / image13.shape[2], palmCenter[1] / image13.shape[1]]; - const rotatedImage = config3.hand.rotation ? tfjs_esm_exports.image.rotateWithOffset(image13, angle, 0, palmCenterNormalized) : image13.clone(); - const rotationMatrix = buildRotationMatrix2(-angle, palmCenter); - const newBox = useFreshBox ? this.getBoxForPalmLandmarks(currentBox.palmLandmarks, rotationMatrix) : currentBox; - const croppedInput = cutBoxFromImageAndResize2(newBox, rotatedImage, [this.inputSize, this.inputSize]); - const handImage = croppedInput.div(255); - croppedInput.dispose(); - rotatedImage.dispose(); - const [confidenceT, keypoints] = await this.landmarkDetector.predict(handImage); - handImage.dispose(); - const confidence = confidenceT.dataSync()[0]; - confidenceT.dispose(); - if (confidence >= config3.hand.minConfidence) { - const keypointsReshaped = tfjs_esm_exports.reshape(keypoints, [-1, 3]); - const rawCoords = keypointsReshaped.arraySync(); - keypoints.dispose(); - keypointsReshaped.dispose(); - const coords3 = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix); - const nextBoundingBox = this.getBoxForHandLandmarks(coords3); - this.storedBoxes[i] = nextBoundingBox; - const result = { - landmarks: coords3, - confidence, - box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint } - }; - hands.push(result); - } else { - this.storedBoxes[i] = null; - } - keypoints.dispose(); - } else { - const enlarged = enlargeBox2(squarifyBox2(currentBox), handBoxEnlargeFactor); - const result = { - confidence: currentBox.confidence, - box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint } - }; - hands.push(result); - } - } - this.storedBoxes = this.storedBoxes.filter((a) => a !== null); - this.detectedHands = hands.length; - return hands; - } -}; - -// src/handpose/handpose.ts -var meshAnnotations = { - thumb: [1, 2, 3, 4], - indexFinger: [5, 6, 7, 8], - middleFinger: [9, 10, 11, 12], - ringFinger: [13, 14, 15, 16], - pinky: [17, 18, 19, 20], - palmBase: [0] -}; -var handDetectorModel; -var handPoseModel; -var handPipeline; -async function predict5(input, config3) { - const predictions = await handPipeline.estimateHands(input, config3); - if (!predictions) - return []; - const hands = []; - for (let i = 0; i < predictions.length; i++) { - const annotations3 = {}; - if (predictions[i].landmarks) { - for (const key of Object.keys(meshAnnotations)) { - annotations3[key] = meshAnnotations[key].map((index) => predictions[i].landmarks[index]); - } - } - const box4 = predictions[i].box ? [ - Math.max(0, predictions[i].box.topLeft[0]), - Math.max(0, predictions[i].box.topLeft[1]), - Math.min(input.shape[2], predictions[i].box.bottomRight[0]) - Math.max(0, predictions[i].box.topLeft[0]), - Math.min(input.shape[1], predictions[i].box.bottomRight[1]) - Math.max(0, predictions[i].box.topLeft[1]) - ] : [0, 0, 0, 0]; - const boxRaw = [ - predictions[i].box.topLeft[0] / input.shape[2], - predictions[i].box.topLeft[1] / input.shape[1], - (predictions[i].box.bottomRight[0] - predictions[i].box.topLeft[0]) / input.shape[2], - (predictions[i].box.bottomRight[1] - predictions[i].box.topLeft[1]) / input.shape[1] - ]; - hands.push({ id: i, confidence: Math.round(100 * predictions[i].confidence) / 100, box: box4, boxRaw, landmarks: predictions[i].landmarks, annotations: annotations3 }); - } - return hands; -} -async function load6(config3) { - if (!handDetectorModel || !handPoseModel) { - [handDetectorModel, handPoseModel] = await Promise.all([ - config3.hand.enabled ? tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.hand.detector.modelPath), { fromTFHub: config3.hand.detector.modelPath.includes("tfhub.dev") }) : null, - config3.hand.landmarks ? tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.hand.skeleton.modelPath), { fromTFHub: config3.hand.skeleton.modelPath.includes("tfhub.dev") }) : null - ]); - if (config3.hand.enabled) { - if (!handDetectorModel || !handDetectorModel.modelUrl) - log("load model failed:", config3.hand.detector.modelPath); - else if (config3.debug) - log("load model:", handDetectorModel.modelUrl); - if (!handPoseModel || !handPoseModel.modelUrl) - log("load model failed:", config3.hand.skeleton.modelPath); - else if (config3.debug) - log("load model:", handPoseModel.modelUrl); - } - } else { - if (config3.debug) - log("cached model:", handDetectorModel.modelUrl); - if (config3.debug) - log("cached model:", handPoseModel.modelUrl); - } - const handDetector = new HandDetector(handDetectorModel); - handPipeline = new HandPipeline(handDetector, handPoseModel); - return [handDetectorModel, handPoseModel]; -} - -// src/blazepose/blazepose.ts -var blazepose_exports = {}; -__export(blazepose_exports, { - load: () => load7, - predict: () => predict6 -}); - -// src/blazepose/annotations.ts -var full = [ - "nose", - "leftEyeInside", - "leftEye", - "leftEyeOutside", - "rightEyeInside", - "rightEye", - "rightEyeOutside", - "leftEar", - "rightEar", - "leftMouth", - "rightMouth", - "leftShoulder", - "rightShoulder", - "leftElbow", - "rightElbow", - "leftWrist", - "rightWrist", - "leftPalm", - "rightPalm", - "leftIndex", - "rightIndex", - "leftPinky", - "rightPinky", - "leftHip", - "rightHip", - "leftKnee", - "rightKnee", - "leftAnkle", - "rightAnkle", - "leftHeel", - "rightHeel", - "leftFoot", - "rightFoot", - "midHip", - "forehead", - "leftThumb", - "leftHand", - "rightThumb", - "rightHand" -]; -var upper = [ - "nose", - "leftEyeInside", - "leftEye", - "leftEyeOutside", - "rightEyeInside", - "rightEye", - "rightEyeOutside", - "leftEar", - "rightEar", - "leftMouth", - "rightMouth", - "leftShoulder", - "rightShoulder", - "leftElbow", - "rightElbow", - "left:15", - "right:16", - "left:17", - "right:18", - "left:19", - "right:20", - "left:21", - "right:22", - "leftChest", - "rightChest", - "neck", - "forehead", - "left:27", - "right:28", - "left:29", - "right:30" -]; - -// src/blazepose/blazepose.ts -var model4; -async function load7(config3) { - if (!model4) { - model4 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.body.modelPath)); - model4.width = parseInt(model4.signature.inputs["input_1:0"].tensorShape.dim[2].size); - model4.height = parseInt(model4.signature.inputs["input_1:0"].tensorShape.dim[1].size); - if (!model4 || !model4.modelUrl) - log("load model failed:", config3.body.modelPath); - else if (config3.debug) - log("load model:", model4.modelUrl); - } else if (config3.debug) - log("cached model:", model4.modelUrl); - return model4; -} -async function predict6(image13, config3) { - if (!model4) - return null; - if (!config3.body.enabled) - return null; - const imgSize = { width: image13.shape[2], height: image13.shape[1] }; - const resize = tfjs_esm_exports.image.resizeBilinear(image13, [model4.width, model4.height], false); - const normalize = tfjs_esm_exports.div(resize, [255]); - resize.dispose(); - const resT = await model4.predict(normalize); - const points = resT.find((t) => t.size === 195 || t.size === 155).dataSync(); - resT.forEach((t) => t.dispose()); - normalize.dispose(); - const keypoints = []; - const labels2 = points.length === 195 ? full : upper; - const depth = 5; - for (let i = 0; i < points.length / depth; i++) { - keypoints.push({ - id: i, - part: labels2[i], - position: { - x: Math.trunc(imgSize.width * points[depth * i + 0] / 255), - y: Math.trunc(imgSize.height * points[depth * i + 1] / 255), - z: Math.trunc(points[depth * i + 2]) + 0 - }, - score: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100, - presence: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 4])))) / 100 - }); - } - const score = keypoints.reduce((prev, curr) => curr.score > prev ? curr.score : prev, 0); - return [{ score, keypoints }]; -} - -// src/object/nanodet.ts -var nanodet_exports = {}; -__export(nanodet_exports, { - load: () => load8, - predict: () => predict7 -}); - -// src/object/labels.ts -var labels = [ - { class: 1, label: "person" }, - { class: 2, label: "bicycle" }, - { class: 3, label: "car" }, - { class: 4, label: "motorcycle" }, - { class: 5, label: "airplane" }, - { class: 6, label: "bus" }, - { class: 7, label: "train" }, - { class: 8, label: "truck" }, - { class: 9, label: "boat" }, - { class: 10, label: "traffic light" }, - { class: 11, label: "fire hydrant" }, - { class: 12, label: "stop sign" }, - { class: 13, label: "parking meter" }, - { class: 14, label: "bench" }, - { class: 15, label: "bird" }, - { class: 16, label: "cat" }, - { class: 17, label: "dog" }, - { class: 18, label: "horse" }, - { class: 19, label: "sheep" }, - { class: 20, label: "cow" }, - { class: 21, label: "elephant" }, - { class: 22, label: "bear" }, - { class: 23, label: "zebra" }, - { class: 24, label: "giraffe" }, - { class: 25, label: "backpack" }, - { class: 26, label: "umbrella" }, - { class: 27, label: "handbag" }, - { class: 28, label: "tie" }, - { class: 29, label: "suitcase" }, - { class: 30, label: "frisbee" }, - { class: 31, label: "skis" }, - { class: 32, label: "snowboard" }, - { class: 33, label: "sports ball" }, - { class: 34, label: "kite" }, - { class: 35, label: "baseball bat" }, - { class: 36, label: "baseball glove" }, - { class: 37, label: "skateboard" }, - { class: 38, label: "surfboard" }, - { class: 39, label: "tennis racket" }, - { class: 40, label: "bottle" }, - { class: 41, label: "wine glass" }, - { class: 42, label: "cup" }, - { class: 43, label: "fork" }, - { class: 44, label: "knife" }, - { class: 45, label: "spoon" }, - { class: 46, label: "bowl" }, - { class: 47, label: "banana" }, - { class: 48, label: "apple" }, - { class: 49, label: "sandwich" }, - { class: 50, label: "orange" }, - { class: 51, label: "broccoli" }, - { class: 52, label: "carrot" }, - { class: 53, label: "hot dog" }, - { class: 54, label: "pizza" }, - { class: 55, label: "donut" }, - { class: 56, label: "cake" }, - { class: 57, label: "chair" }, - { class: 58, label: "couch" }, - { class: 59, label: "potted plant" }, - { class: 60, label: "bed" }, - { class: 61, label: "dining table" }, - { class: 62, label: "toilet" }, - { class: 63, label: "tv" }, - { class: 64, label: "laptop" }, - { class: 65, label: "mouse" }, - { class: 66, label: "remote" }, - { class: 67, label: "keyboard" }, - { class: 68, label: "cell phone" }, - { class: 69, label: "microwave" }, - { class: 70, label: "oven" }, - { class: 71, label: "toaster" }, - { class: 72, label: "sink" }, - { class: 73, label: "refrigerator" }, - { class: 74, label: "book" }, - { class: 75, label: "clock" }, - { class: 76, label: "vase" }, - { class: 77, label: "scissors" }, - { class: 78, label: "teddy bear" }, - { class: 79, label: "hair drier" }, - { class: 80, label: "toothbrush" } -]; - -// src/object/nanodet.ts -var model5; -var last3 = []; -var skipped3 = Number.MAX_SAFE_INTEGER; -var scaleBox = 2.5; -async function load8(config3) { - if (!model5) { - model5 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.object.modelPath)); - const inputs = Object.values(model5.modelSignature["inputs"]); - model5.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null; - if (!model5.inputSize) - throw new Error(`Human: Cannot determine model inputSize: ${config3.object.modelPath}`); - if (!model5 || !model5.modelUrl) - log("load model failed:", config3.object.modelPath); - else if (config3.debug) - log("load model:", model5.modelUrl); - } else if (config3.debug) - log("cached model:", model5.modelUrl); - return model5; -} -async function process2(res, inputSize, outputShape, config3) { - let id = 0; - let results = []; - for (const strideSize of [1, 2, 4]) { - tfjs_esm_exports.tidy(() => { - var _a, _b; - const baseSize = strideSize * 13; - const scoresT = (_a = res.find((a) => a.shape[1] === baseSize ** 2 && a.shape[2] === labels.length)) == null ? void 0 : _a.squeeze(); - const featuresT = (_b = res.find((a) => a.shape[1] === baseSize ** 2 && a.shape[2] < labels.length)) == null ? void 0 : _b.squeeze(); - const boxesMax = featuresT.reshape([-1, 4, featuresT.shape[1] / 4]); - const boxIdx = boxesMax.argMax(2).arraySync(); - const scores = scoresT.arraySync(); - for (let i = 0; i < scoresT.shape[0]; i++) { - for (let j = 0; j < scoresT.shape[1]; j++) { - const score = scores[i][j]; - if (score > config3.object.minConfidence && j !== 61) { - const cx = (0.5 + Math.trunc(i % baseSize)) / baseSize; - const cy = (0.5 + Math.trunc(i / baseSize)) / baseSize; - const boxOffset = boxIdx[i].map((a) => a * (baseSize / strideSize / inputSize)); - const [x, y] = [ - cx - scaleBox / strideSize * boxOffset[0], - cy - scaleBox / strideSize * boxOffset[1] - ]; - const [w, h] = [ - cx + scaleBox / strideSize * boxOffset[2] - x, - cy + scaleBox / strideSize * boxOffset[3] - y - ]; - let boxRaw = [x, y, w, h]; - boxRaw = boxRaw.map((a) => Math.max(0, Math.min(a, 1))); - const box4 = [ - boxRaw[0] * outputShape[0], - boxRaw[1] * outputShape[1], - boxRaw[2] * outputShape[0], - boxRaw[3] * outputShape[1] - ]; - const result = { - id: id++, - strideSize, - score: Math.round(100 * score) / 100, - class: j + 1, - label: labels[j].label, - center: [Math.trunc(outputShape[0] * cx), Math.trunc(outputShape[1] * cy)], - centerRaw: [cx, cy], - box: box4.map((a) => Math.trunc(a)), - boxRaw - }; - results.push(result); - } - } - } - }); - } - res.forEach((t) => tfjs_esm_exports.dispose(t)); - const nmsBoxes = results.map((a) => [a.boxRaw[1], a.boxRaw[0], a.boxRaw[3], a.boxRaw[2]]); - const nmsScores = results.map((a) => a.score); - let nmsIdx = []; - if (nmsBoxes && nmsBoxes.length > 0) { - const nms = await tfjs_esm_exports.image.nonMaxSuppressionAsync(nmsBoxes, nmsScores, config3.object.maxDetected, config3.object.iouThreshold, config3.object.minConfidence); - nmsIdx = nms.dataSync(); - tfjs_esm_exports.dispose(nms); - } - results = results.filter((a, idx) => nmsIdx.includes(idx)).sort((a, b) => b.score - a.score); - return results; -} -async function predict7(image13, config3) { - if (skipped3 < config3.object.skipFrames && config3.skipFrame && last3.length > 0) { - skipped3++; - return last3; - } - skipped3 = 0; - return new Promise(async (resolve) => { - const outputSize = [image13.shape[2], image13.shape[1]]; - const resize = tfjs_esm_exports.image.resizeBilinear(image13, [model5.inputSize, model5.inputSize], false); - const norm = resize.div(255); - const transpose = norm.transpose([0, 3, 1, 2]); - norm.dispose(); - resize.dispose(); - let objectT; - if (config3.object.enabled) - objectT = await model5.predict(transpose); - transpose.dispose(); - const obj = await process2(objectT, model5.inputSize, outputSize, config3); - last3 = obj; - resolve(obj); - }); -} - -// src/object/centernet.ts -var centernet_exports = {}; -__export(centernet_exports, { - load: () => load9, - predict: () => predict8 -}); -var model6; -var last4 = []; -var skipped4 = Number.MAX_SAFE_INTEGER; -async function load9(config3) { - if (!model6) { - model6 = await tfjs_esm_exports.loadGraphModel(join(config3.modelBasePath, config3.object.modelPath)); - const inputs = Object.values(model6.modelSignature["inputs"]); - model6.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null; - if (!model6.inputSize) - throw new Error(`Human: Cannot determine model inputSize: ${config3.object.modelPath}`); - if (!model6 || !model6.modelUrl) - log("load model failed:", config3.object.modelPath); - else if (config3.debug) - log("load model:", model6.modelUrl); - } else if (config3.debug) - log("cached model:", model6.modelUrl); - return model6; -} -async function process3(res, inputSize, outputShape, config3) { - const results = []; - const detections = res.arraySync(); - const squeezeT = tfjs_esm_exports.squeeze(res); - res.dispose(); - const arr = tfjs_esm_exports.split(squeezeT, 6, 1); - squeezeT.dispose(); - const stackT = tfjs_esm_exports.stack([arr[1], arr[0], arr[3], arr[2]], 1); - const boxesT = stackT.squeeze(); - const scoresT = arr[4].squeeze(); - const classesT = arr[5].squeeze(); - arr.forEach((t) => t.dispose()); - const nmsT = await tfjs_esm_exports.image.nonMaxSuppressionAsync(boxesT, scoresT, config3.object.maxDetected, config3.object.iouThreshold, config3.object.minConfidence); - boxesT.dispose(); - scoresT.dispose(); - classesT.dispose(); - const nms = nmsT.dataSync(); - nmsT.dispose(); - for (const id of nms) { - const score = detections[0][id][4]; - const classVal = detections[0][id][5]; - const label = labels[classVal].label; - const boxRaw = [ - detections[0][id][0] / inputSize, - detections[0][id][1] / inputSize, - detections[0][id][2] / inputSize, - detections[0][id][3] / inputSize - ]; - const box4 = [ - Math.trunc(boxRaw[0] * outputShape[0]), - Math.trunc(boxRaw[1] * outputShape[1]), - Math.trunc(boxRaw[2] * outputShape[0]), - Math.trunc(boxRaw[3] * outputShape[1]) - ]; - results.push({ score, class: classVal, label, box: box4, boxRaw }); - } - return results; -} -async function predict8(image13, config3) { - if (skipped4 < config3.object.skipFrames && config3.skipFrame && last4.length > 0) { - skipped4++; - return last4; - } - skipped4 = 0; - return new Promise(async (resolve) => { - const outputSize = [image13.shape[2], image13.shape[1]]; - const resize = tfjs_esm_exports.image.resizeBilinear(image13, [model6.inputSize, model6.inputSize], false); - let objectT; - if (config3.object.enabled) - objectT = model6.execute(resize, "tower_0/detections"); - resize.dispose(); - const obj = await process3(objectT, model6.inputSize, outputSize, config3); - last4 = obj; - resolve(obj); - }); -} - -// src/gesture/gesture.ts -var body = (res) => { - if (!res) - return []; - const gestures = []; - for (let i = 0; i < res.length; i++) { - const leftWrist = res[i].keypoints.find((a) => a.part === "leftWrist"); - const rightWrist = res[i].keypoints.find((a) => a.part === "rightWrist"); - const nose = res[i].keypoints.find((a) => a.part === "nose"); - if (nose && leftWrist && rightWrist && leftWrist.position.y < nose.position.y && rightWrist.position.y < nose.position.y) - gestures.push({ body: i, gesture: "i give up" }); - else if (nose && leftWrist && leftWrist.position.y < nose.position.y) - gestures.push({ body: i, gesture: "raise left hand" }); - else if (nose && rightWrist && rightWrist.position.y < nose.position.y) - gestures.push({ body: i, gesture: "raise right hand" }); - const leftShoulder = res[i].keypoints.find((a) => a.part === "leftShoulder"); - const rightShoulder = res[i].keypoints.find((a) => a.part === "rightShoulder"); - if (leftShoulder && rightShoulder) - gestures.push({ body: i, gesture: `leaning ${leftShoulder.position.y > rightShoulder.position.y ? "left" : "right"}` }); - } - return gestures; -}; -var face = (res) => { - if (!res) - return []; - const gestures = []; - for (let i = 0; i < res.length; i++) { - if (res[i].mesh && res[i].mesh.length > 0) { - const eyeFacing = res[i].mesh[33][2] - res[i].mesh[263][2]; - if (Math.abs(eyeFacing) < 10) - gestures.push({ face: i, gesture: "facing center" }); - else - gestures.push({ face: i, gesture: `facing ${eyeFacing < 0 ? "left" : "right"}` }); - const openLeft = Math.abs(res[i].mesh[374][1] - res[i].mesh[386][1]) / Math.abs(res[i].mesh[443][1] - res[i].mesh[450][1]); - if (openLeft < 0.2) - gestures.push({ face: i, gesture: "blink left eye" }); - const openRight = Math.abs(res[i].mesh[145][1] - res[i].mesh[159][1]) / Math.abs(res[i].mesh[223][1] - res[i].mesh[230][1]); - if (openRight < 0.2) - gestures.push({ face: i, gesture: "blink right eye" }); - const mouthOpen = Math.min(100, 500 * Math.abs(res[i].mesh[13][1] - res[i].mesh[14][1]) / Math.abs(res[i].mesh[10][1] - res[i].mesh[152][1])); - if (mouthOpen > 10) - gestures.push({ face: i, gesture: `mouth ${Math.trunc(mouthOpen)}% open` }); - const chinDepth = res[i].mesh[152][2]; - if (Math.abs(chinDepth) > 10) - gestures.push({ face: i, gesture: `head ${chinDepth < 0 ? "up" : "down"}` }); - } - } - return gestures; -}; -var iris = (res) => { - if (!res) - return []; - const gestures = []; - for (let i = 0; i < res.length; i++) { - if (!res[i].annotations || !res[i].annotations.leftEyeIris || !res[i].annotations.rightEyeIris) - continue; - const sizeXLeft = res[i].annotations.leftEyeIris[3][0] - res[i].annotations.leftEyeIris[1][0]; - const sizeYLeft = res[i].annotations.leftEyeIris[4][1] - res[i].annotations.leftEyeIris[2][1]; - const areaLeft = Math.abs(sizeXLeft * sizeYLeft); - const sizeXRight = res[i].annotations.rightEyeIris[3][0] - res[i].annotations.rightEyeIris[1][0]; - const sizeYRight = res[i].annotations.rightEyeIris[4][1] - res[i].annotations.rightEyeIris[2][1]; - const areaRight = Math.abs(sizeXRight * sizeYRight); - let center = false; - const difference = Math.abs(areaLeft - areaRight) / Math.max(areaLeft, areaRight); - if (difference < 0.25) { - center = true; - gestures.push({ iris: i, gesture: "facing center" }); - } - const rightIrisCenterX = Math.abs(res[i].mesh[33][0] - res[i].annotations.rightEyeIris[0][0]) / res[i].annotations.rightEyeIris[0][0]; - const leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].annotations.leftEyeIris[0][0]; - if (leftIrisCenterX > 0.033 || rightIrisCenterX > 0.033) - center = false; - if (leftIrisCenterX > 0.033) - gestures.push({ iris: i, gesture: "looking right" }); - if (rightIrisCenterX > 0.033) - gestures.push({ iris: i, gesture: "looking left" }); - const rightIrisCenterY = Math.abs(res[i].mesh[145][1] - res[i].annotations.rightEyeIris[0][1]) / res[i].annotations.rightEyeIris[0][1]; - const leftIrisCenterY = Math.abs(res[i].mesh[374][1] - res[i].annotations.leftEyeIris[0][1]) / res[i].annotations.leftEyeIris[0][1]; - if (leftIrisCenterY < 0.015 || rightIrisCenterY < 0.015 || leftIrisCenterY > 0.03 || rightIrisCenterY > 0.03) - center = false; - if (leftIrisCenterY < 0.015 || rightIrisCenterY < 0.015) - gestures.push({ iris: i, gesture: "looking down" }); - if (leftIrisCenterY > 0.03 || rightIrisCenterY > 0.03) - gestures.push({ iris: i, gesture: "looking up" }); - if (center) - gestures.push({ iris: i, gesture: "looking center" }); - } - return gestures; -}; -var hand = (res) => { - if (!res) - return []; - const gestures = []; - for (let i = 0; i < res.length; i++) { - const fingers = []; - for (const [finger, pos] of Object.entries(res[i]["annotations"])) { - if (finger !== "palmBase" && Array.isArray(pos)) - fingers.push({ name: finger.toLowerCase(), position: pos[0] }); - } - if (fingers && fingers.length > 0) { - const closest = fingers.reduce((best, a) => best.position[2] < a.position[2] ? best : a); - const highest = fingers.reduce((best, a) => best.position[1] < a.position[1] ? best : a); - gestures.push({ hand: i, gesture: `${closest.name} forward ${highest.name} up` }); - } - } - return gestures; -}; - -// src/image/imagefx.js -function GLProgram(gl, vertexSource, fragmentSource) { - const _collect = function(source, prefix, collection) { - const r = new RegExp("\\b" + prefix + " \\w+ (\\w+)", "ig"); - source.replace(r, (match2, name) => { - collection[name] = 0; - return match2; - }); - }; - const _compile = function(source, type) { - const shader = gl.createShader(type); - gl.shaderSource(shader, source); - gl.compileShader(shader); - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) - throw new Error("Filter: GL compile failed", gl.getShaderInfoLog(shader)); - return shader; - }; - this.uniform = {}; - this.attribute = {}; - const _vsh = _compile(vertexSource, gl.VERTEX_SHADER); - const _fsh = _compile(fragmentSource, gl.FRAGMENT_SHADER); - this.id = gl.createProgram(); - gl.attachShader(this.id, _vsh); - gl.attachShader(this.id, _fsh); - gl.linkProgram(this.id); - if (!gl.getProgramParameter(this.id, gl.LINK_STATUS)) - throw new Error("Filter: GL link failed", gl.getProgramInfoLog(this.id)); - gl.useProgram(this.id); - _collect(vertexSource, "attribute", this.attribute); - for (const a in this.attribute) - this.attribute[a] = gl.getAttribLocation(this.id, a); - _collect(vertexSource, "uniform", this.uniform); - _collect(fragmentSource, "uniform", this.uniform); - for (const u in this.uniform) - this.uniform[u] = gl.getUniformLocation(this.id, u); -} -function GLImageFilter(params) { - if (!params) - params = {}; - let _drawCount = 0; - let _sourceTexture = null; - let _lastInChain = false; - let _currentFramebufferIndex = -1; - let _tempFramebuffers = [null, null]; - let _filterChain = []; - let _width = -1; - let _height = -1; - let _vertexBuffer = null; - let _currentProgram = null; - const _filter = {}; - const _canvas = params.canvas || document.createElement("canvas"); - const _shaderProgramCache = {}; - const DRAW = { INTERMEDIATE: 1 }; - const gl = _canvas.getContext("webgl"); - if (!gl) - throw new Error("Filter: getContext() failed"); - this.addFilter = function(name) { - const args = Array.prototype.slice.call(arguments, 1); - const filter = _filter[name]; - _filterChain.push({ func: filter, args }); - }; - this.reset = function() { - _filterChain = []; - }; - const _resize = function(width, height) { - if (width === _width && height === _height) { - return; - } - _canvas.width = width; - _width = width; - _canvas.height = height; - _height = height; - if (!_vertexBuffer) { - const vertices = new Float32Array([ - -1, - -1, - 0, - 1, - 1, - -1, - 1, - 1, - -1, - 1, - 0, - 0, - -1, - 1, - 0, - 0, - 1, - -1, - 1, - 1, - 1, - 1, - 1, - 0 - ]); - _vertexBuffer = gl.createBuffer(), gl.bindBuffer(gl.ARRAY_BUFFER, _vertexBuffer); - gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); - } - gl.viewport(0, 0, _width, _height); - _tempFramebuffers = [null, null]; - }; - const _createFramebufferTexture = function(width, height) { - const fbo = gl.createFramebuffer(); - gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); - const renderbuffer = gl.createRenderbuffer(); - gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer); - const texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); - gl.bindTexture(gl.TEXTURE_2D, null); - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - return { fbo, texture }; - }; - const _getTempFramebuffer = function(index) { - _tempFramebuffers[index] = _tempFramebuffers[index] || _createFramebufferTexture(_width, _height); - return _tempFramebuffers[index]; - }; - const _draw = function(flags = null) { - var _a, _b; - let source = null; - let target = null; - let flipY = false; - if (_drawCount === 0) { - source = _sourceTexture; - } else { - source = (_a = _getTempFramebuffer(_currentFramebufferIndex)) == null ? void 0 : _a.texture; - } - _drawCount++; - if (_lastInChain && !(flags & DRAW.INTERMEDIATE)) { - target = null; - flipY = _drawCount % 2 === 0; - } else { - _currentFramebufferIndex = (_currentFramebufferIndex + 1) % 2; - target = (_b = _getTempFramebuffer(_currentFramebufferIndex)) == null ? void 0 : _b.fbo; - } - gl.bindTexture(gl.TEXTURE_2D, source); - gl.bindFramebuffer(gl.FRAMEBUFFER, target); - gl.uniform1f(_currentProgram.uniform.flipY, flipY ? -1 : 1); - gl.drawArrays(gl.TRIANGLES, 0, 6); - }; - this.apply = function(image13) { - _resize(image13.width, image13.height); - _drawCount = 0; - if (!_sourceTexture) - _sourceTexture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, _sourceTexture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image13); - if (_filterChain.length === 0) { - _draw(); - return _canvas; - } - for (let i = 0; i < _filterChain.length; i++) { - _lastInChain = i === _filterChain.length - 1; - const f = _filterChain[i]; - f.func.apply(this, f.args || []); - } - return _canvas; - }; - const _compileShader = function(fragmentSource) { - if (_shaderProgramCache[fragmentSource]) { - _currentProgram = _shaderProgramCache[fragmentSource]; - gl.useProgram(_currentProgram.id); - return _currentProgram; - } - const SHADER = {}; - SHADER.VERTEX_IDENTITY = [ - "precision highp float;", - "attribute vec2 pos;", - "attribute vec2 uv;", - "varying vec2 vUv;", - "uniform float flipY;", - "void main(void) {", - "vUv = uv;", - "gl_Position = vec4(pos.x, pos.y*flipY, 0.0, 1.);", - "}" - ].join("\n"); - SHADER.FRAGMENT_IDENTITY = [ - "precision highp float;", - "varying vec2 vUv;", - "uniform sampler2D texture;", - "void main(void) {", - "gl_FragColor = texture2D(texture, vUv);", - "}" - ].join("\n"); - _currentProgram = new GLProgram(gl, SHADER.VERTEX_IDENTITY, fragmentSource); - const floatSize = Float32Array.BYTES_PER_ELEMENT; - const vertSize = 4 * floatSize; - gl.enableVertexAttribArray(_currentProgram.attribute.pos); - gl.vertexAttribPointer(_currentProgram.attribute.pos, 2, gl.FLOAT, false, vertSize, 0 * floatSize); - gl.enableVertexAttribArray(_currentProgram.attribute.uv); - gl.vertexAttribPointer(_currentProgram.attribute.uv, 2, gl.FLOAT, false, vertSize, 2 * floatSize); - _shaderProgramCache[fragmentSource] = _currentProgram; - return _currentProgram; - }; - _filter.colorMatrix = function(matrix) { - const m = new Float32Array(matrix); - m[4] /= 255; - m[9] /= 255; - m[14] /= 255; - m[19] /= 255; - const shader = m[18] === 1 && m[3] === 0 && m[8] === 0 && m[13] === 0 && m[15] === 0 && m[16] === 0 && m[17] === 0 && m[19] === 0 ? _filter.colorMatrix.SHADER.WITHOUT_ALPHA : _filter.colorMatrix.SHADER.WITH_ALPHA; - const program = _compileShader(shader); - gl.uniform1fv(program.uniform.m, m); - _draw(); - }; - _filter.colorMatrix.SHADER = {}; - _filter.colorMatrix.SHADER.WITH_ALPHA = [ - "precision highp float;", - "varying vec2 vUv;", - "uniform sampler2D texture;", - "uniform float m[20];", - "void main(void) {", - "vec4 c = texture2D(texture, vUv);", - "gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[3] * c.a + m[4];", - "gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[8] * c.a + m[9];", - "gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[13] * c.a + m[14];", - "gl_FragColor.a = m[15] * c.r + m[16] * c.g + m[17] * c.b + m[18] * c.a + m[19];", - "}" - ].join("\n"); - _filter.colorMatrix.SHADER.WITHOUT_ALPHA = [ - "precision highp float;", - "varying vec2 vUv;", - "uniform sampler2D texture;", - "uniform float m[20];", - "void main(void) {", - "vec4 c = texture2D(texture, vUv);", - "gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[4];", - "gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[9];", - "gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[14];", - "gl_FragColor.a = c.a;", - "}" - ].join("\n"); - _filter.brightness = function(brightness) { - const b = (brightness || 0) + 1; - _filter.colorMatrix([ - b, - 0, - 0, - 0, - 0, - 0, - b, - 0, - 0, - 0, - 0, - 0, - b, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ]); - }; - _filter.saturation = function(amount) { - const x = (amount || 0) * 2 / 3 + 1; - const y = (x - 1) * -0.5; - _filter.colorMatrix([ - x, - y, - y, - 0, - 0, - y, - x, - y, - 0, - 0, - y, - y, - x, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ]); - }; - _filter.desaturate = function() { - _filter.saturation(-1); - }; - _filter.contrast = function(amount) { - const v = (amount || 0) + 1; - const o = -128 * (v - 1); - _filter.colorMatrix([ - v, - 0, - 0, - 0, - o, - 0, - v, - 0, - 0, - o, - 0, - 0, - v, - 0, - o, - 0, - 0, - 0, - 1, - 0 - ]); - }; - _filter.negative = function() { - _filter.contrast(-2); - }; - _filter.hue = function(rotation) { - rotation = (rotation || 0) / 180 * Math.PI; - const cos = Math.cos(rotation); - const sin = Math.sin(rotation); - const lumR = 0.213; - const lumG = 0.715; - const lumB = 0.072; - _filter.colorMatrix([ - lumR + cos * (1 - lumR) + sin * -lumR, - lumG + cos * -lumG + sin * -lumG, - lumB + cos * -lumB + sin * (1 - lumB), - 0, - 0, - lumR + cos * -lumR + sin * 0.143, - lumG + cos * (1 - lumG) + sin * 0.14, - lumB + cos * -lumB + sin * -0.283, - 0, - 0, - lumR + cos * -lumR + sin * -(1 - lumR), - lumG + cos * -lumG + sin * lumG, - lumB + cos * (1 - lumB) + sin * lumB, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ]); - }; - _filter.desaturateLuminance = function() { - _filter.colorMatrix([ - 0.2764723, - 0.929708, - 0.0938197, - 0, - -37.1, - 0.2764723, - 0.929708, - 0.0938197, - 0, - -37.1, - 0.2764723, - 0.929708, - 0.0938197, - 0, - -37.1, - 0, - 0, - 0, - 1, - 0 - ]); - }; - _filter.sepia = function() { - _filter.colorMatrix([ - 0.393, - 0.7689999, - 0.18899999, - 0, - 0, - 0.349, - 0.6859999, - 0.16799999, - 0, - 0, - 0.272, - 0.5339999, - 0.13099999, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ]); - }; - _filter.brownie = function() { - _filter.colorMatrix([ - 0.5997023498159715, - 0.34553243048391263, - -0.2708298674538042, - 0, - 47.43192855600873, - -0.037703249837783157, - 0.8609577587992641, - 0.15059552388459913, - 0, - -36.96841498319127, - 0.24113635128153335, - -0.07441037908422492, - 0.44972182064877153, - 0, - -7.562075277591283, - 0, - 0, - 0, - 1, - 0 - ]); - }; - _filter.vintagePinhole = function() { - _filter.colorMatrix([ - 0.6279345635605994, - 0.3202183420819367, - -0.03965408211312453, - 0, - 9.651285835294123, - 0.02578397704808868, - 0.6441188644374771, - 0.03259127616149294, - 0, - 7.462829176470591, - 0.0466055556782719, - -0.0851232987247891, - 0.5241648018700465, - 0, - 5.159190588235296, - 0, - 0, - 0, - 1, - 0 - ]); - }; - _filter.kodachrome = function() { - _filter.colorMatrix([ - 1.1285582396593525, - -0.3967382283601348, - -0.03992559172921793, - 0, - 63.72958762196502, - -0.16404339962244616, - 1.0835251566291304, - -0.05498805115633132, - 0, - 24.732407896706203, - -0.16786010706155763, - -0.5603416277695248, - 1.6014850761964943, - 0, - 35.62982807460946, - 0, - 0, - 0, - 1, - 0 - ]); - }; - _filter.technicolor = function() { - _filter.colorMatrix([ - 1.9125277891456083, - -0.8545344976951645, - -0.09155508482755585, - 0, - 11.793603434377337, - -0.3087833385928097, - 1.7658908555458428, - -0.10601743074722245, - 0, - -70.35205161461398, - -0.231103377548616, - -0.7501899197440212, - 1.847597816108189, - 0, - 30.950940869491138, - 0, - 0, - 0, - 1, - 0 - ]); - }; - _filter.polaroid = function() { - _filter.colorMatrix([ - 1.438, - -0.062, - -0.062, - 0, - 0, - -0.122, - 1.378, - -0.122, - 0, - 0, - -0.016, - -0.016, - 1.483, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ]); - }; - _filter.shiftToBGR = function() { - _filter.colorMatrix([ - 0, - 0, - 1, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0 - ]); - }; - _filter.convolution = function(matrix) { - const m = new Float32Array(matrix); - const pixelSizeX = 1 / _width; - const pixelSizeY = 1 / _height; - const program = _compileShader(_filter.convolution.SHADER); - gl.uniform1fv(program.uniform.m, m); - gl.uniform2f(program.uniform.px, pixelSizeX, pixelSizeY); - _draw(); - }; - _filter.convolution.SHADER = [ - "precision highp float;", - "varying vec2 vUv;", - "uniform sampler2D texture;", - "uniform vec2 px;", - "uniform float m[9];", - "void main(void) {", - "vec4 c11 = texture2D(texture, vUv - px);", - "vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y));", - "vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y));", - "vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) );", - "vec4 c22 = texture2D(texture, vUv);", - "vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) );", - "vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) );", - "vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) );", - "vec4 c33 = texture2D(texture, vUv + px );", - "gl_FragColor = ", - "c11 * m[0] + c12 * m[1] + c22 * m[2] +", - "c21 * m[3] + c22 * m[4] + c23 * m[5] +", - "c31 * m[6] + c32 * m[7] + c33 * m[8];", - "gl_FragColor.a = c22.a;", - "}" - ].join("\n"); - _filter.detectEdges = function() { - _filter.convolution.call(this, [ - 0, - 1, - 0, - 1, - -4, - 1, - 0, - 1, - 0 - ]); - }; - _filter.sobelX = function() { - _filter.convolution.call(this, [ - -1, - 0, - 1, - -2, - 0, - 2, - -1, - 0, - 1 - ]); - }; - _filter.sobelY = function() { - _filter.convolution.call(this, [ - -1, - -2, - -1, - 0, - 0, - 0, - 1, - 2, - 1 - ]); - }; - _filter.sharpen = function(amount) { - const a = amount || 1; - _filter.convolution.call(this, [ - 0, - -1 * a, - 0, - -1 * a, - 1 + 4 * a, - -1 * a, - 0, - -1 * a, - 0 - ]); - }; - _filter.emboss = function(size) { - const s = size || 1; - _filter.convolution.call(this, [ - -2 * s, - -1 * s, - 0, - -1 * s, - 1, - 1 * s, - 0, - 1 * s, - 2 * s - ]); - }; - _filter.blur = function(size) { - const blurSizeX = size / 7 / _width; - const blurSizeY = size / 7 / _height; - const program = _compileShader(_filter.blur.SHADER); - gl.uniform2f(program.uniform.px, 0, blurSizeY); - _draw(DRAW.INTERMEDIATE); - gl.uniform2f(program.uniform.px, blurSizeX, 0); - _draw(); - }; - _filter.blur.SHADER = [ - "precision highp float;", - "varying vec2 vUv;", - "uniform sampler2D texture;", - "uniform vec2 px;", - "void main(void) {", - "gl_FragColor = vec4(0.0);", - "gl_FragColor += texture2D(texture, vUv + vec2(-7.0*px.x, -7.0*px.y))*0.0044299121055113265;", - "gl_FragColor += texture2D(texture, vUv + vec2(-6.0*px.x, -6.0*px.y))*0.00895781211794;", - "gl_FragColor += texture2D(texture, vUv + vec2(-5.0*px.x, -5.0*px.y))*0.0215963866053;", - "gl_FragColor += texture2D(texture, vUv + vec2(-4.0*px.x, -4.0*px.y))*0.0443683338718;", - "gl_FragColor += texture2D(texture, vUv + vec2(-3.0*px.x, -3.0*px.y))*0.0776744219933;", - "gl_FragColor += texture2D(texture, vUv + vec2(-2.0*px.x, -2.0*px.y))*0.115876621105;", - "gl_FragColor += texture2D(texture, vUv + vec2(-1.0*px.x, -1.0*px.y))*0.147308056121;", - "gl_FragColor += texture2D(texture, vUv )*0.159576912161;", - "gl_FragColor += texture2D(texture, vUv + vec2( 1.0*px.x, 1.0*px.y))*0.147308056121;", - "gl_FragColor += texture2D(texture, vUv + vec2( 2.0*px.x, 2.0*px.y))*0.115876621105;", - "gl_FragColor += texture2D(texture, vUv + vec2( 3.0*px.x, 3.0*px.y))*0.0776744219933;", - "gl_FragColor += texture2D(texture, vUv + vec2( 4.0*px.x, 4.0*px.y))*0.0443683338718;", - "gl_FragColor += texture2D(texture, vUv + vec2( 5.0*px.x, 5.0*px.y))*0.0215963866053;", - "gl_FragColor += texture2D(texture, vUv + vec2( 6.0*px.x, 6.0*px.y))*0.00895781211794;", - "gl_FragColor += texture2D(texture, vUv + vec2( 7.0*px.x, 7.0*px.y))*0.0044299121055113265;", - "}" - ].join("\n"); - _filter.pixelate = function(size) { - const blurSizeX = size / _width; - const blurSizeY = size / _height; - const program = _compileShader(_filter.pixelate.SHADER); - gl.uniform2f(program.uniform.size, blurSizeX, blurSizeY); - _draw(); - }; - _filter.pixelate.SHADER = [ - "precision highp float;", - "varying vec2 vUv;", - "uniform vec2 size;", - "uniform sampler2D texture;", - "vec2 pixelate(vec2 coord, vec2 size) {", - "return floor( coord / size ) * size;", - "}", - "void main(void) {", - "gl_FragColor = vec4(0.0);", - "vec2 coord = pixelate(vUv, size);", - "gl_FragColor += texture2D(texture, coord);", - "}" - ].join("\n"); -} - -// src/image/image.ts -var maxSize = 2048; -var inCanvas; -var outCanvas; -var fx; -function process4(input, config3) { - let tensor; - if (!input) - throw new Error("Human: Input is missing"); - if (!(input instanceof tfjs_esm_exports.Tensor) && !(typeof Image !== "undefined" && input instanceof Image) && !(typeof ImageData !== "undefined" && input instanceof ImageData) && !(typeof ImageBitmap !== "undefined" && input instanceof ImageBitmap) && !(typeof HTMLImageElement !== "undefined" && input instanceof HTMLImageElement) && !(typeof HTMLMediaElement !== "undefined" && input instanceof HTMLMediaElement) && !(typeof HTMLVideoElement !== "undefined" && input instanceof HTMLVideoElement) && !(typeof HTMLCanvasElement !== "undefined" && input instanceof HTMLCanvasElement) && !(typeof OffscreenCanvas !== "undefined" && input instanceof OffscreenCanvas)) { - throw new Error("Human: Input type is not recognized"); - } - if (input instanceof tfjs_esm_exports.Tensor) { - if (input.shape && input.shape.length === 4 && input.shape[0] === 1 && input.shape[3] === 3) - tensor = tfjs_esm_exports.clone(input); - else - throw new Error(`Human: Input tensor shape must be [1, height, width, 3] and instead was ${input.shape}`); - } else { - const originalWidth = input["naturalWidth"] || input["videoWidth"] || input["width"] || input["shape"] && input["shape"][1] > 0; - const originalHeight = input["naturalHeight"] || input["videoHeight"] || input["height"] || input["shape"] && input["shape"][2] > 0; - let targetWidth = originalWidth; - let targetHeight = originalHeight; - if (targetWidth > maxSize) { - targetWidth = maxSize; - targetHeight = targetWidth * originalHeight / originalWidth; - } - if (targetHeight > maxSize) { - targetHeight = maxSize; - targetWidth = targetHeight * originalWidth / originalHeight; - } - if (config3.filter.width > 0) - targetWidth = config3.filter.width; - else if (config3.filter.height > 0) - targetWidth = originalWidth * (config3.filter.height / originalHeight); - if (config3.filter.height > 0) - targetHeight = config3.filter.height; - else if (config3.filter.width > 0) - targetHeight = originalHeight * (config3.filter.width / originalWidth); - if (!targetWidth || !targetHeight) - throw new Error("Human: Input cannot determine dimension"); - if (!inCanvas || (inCanvas == null ? void 0 : inCanvas.width) !== targetWidth || (inCanvas == null ? void 0 : inCanvas.height) !== targetHeight) { - inCanvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement("canvas"); - if ((inCanvas == null ? void 0 : inCanvas.width) !== targetWidth) - inCanvas.width = targetWidth; - if ((inCanvas == null ? void 0 : inCanvas.height) !== targetHeight) - inCanvas.height = targetHeight; - } - const ctx = inCanvas.getContext("2d"); - if (input instanceof ImageData) { - ctx.putImageData(input, 0, 0); - } else { - if (config3.filter.flip && typeof ctx.translate !== "undefined") { - ctx.translate(originalWidth, 0); - ctx.scale(-1, 1); - ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas == null ? void 0 : inCanvas.width, inCanvas == null ? void 0 : inCanvas.height); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } else { - ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas == null ? void 0 : inCanvas.width, inCanvas == null ? void 0 : inCanvas.height); - } - } - if (config3.filter.enabled) { - if (!fx || !outCanvas || inCanvas.width !== outCanvas.width || (inCanvas == null ? void 0 : inCanvas.height) !== (outCanvas == null ? void 0 : outCanvas.height)) { - outCanvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(inCanvas == null ? void 0 : inCanvas.width, inCanvas == null ? void 0 : inCanvas.height) : document.createElement("canvas"); - if ((outCanvas == null ? void 0 : outCanvas.width) !== (inCanvas == null ? void 0 : inCanvas.width)) - outCanvas.width = inCanvas == null ? void 0 : inCanvas.width; - if ((outCanvas == null ? void 0 : outCanvas.height) !== (inCanvas == null ? void 0 : inCanvas.height)) - outCanvas.height = inCanvas == null ? void 0 : inCanvas.height; - fx = tfjs_esm_exports.ENV.flags.IS_BROWSER ? new GLImageFilter({ canvas: outCanvas }) : null; - } - if (!fx) - return { tensor: null, canvas: inCanvas }; - fx.reset(); - fx.addFilter("brightness", config3.filter.brightness); - if (config3.filter.contrast !== 0) - fx.addFilter("contrast", config3.filter.contrast); - if (config3.filter.sharpness !== 0) - fx.addFilter("sharpen", config3.filter.sharpness); - if (config3.filter.blur !== 0) - fx.addFilter("blur", config3.filter.blur); - if (config3.filter.saturation !== 0) - fx.addFilter("saturation", config3.filter.saturation); - if (config3.filter.hue !== 0) - fx.addFilter("hue", config3.filter.hue); - if (config3.filter.negative) - fx.addFilter("negative"); - if (config3.filter.sepia) - fx.addFilter("sepia"); - if (config3.filter.vintage) - fx.addFilter("brownie"); - if (config3.filter.sepia) - fx.addFilter("sepia"); - if (config3.filter.kodachrome) - fx.addFilter("kodachrome"); - if (config3.filter.technicolor) - fx.addFilter("technicolor"); - if (config3.filter.polaroid) - fx.addFilter("polaroid"); - if (config3.filter.pixelate !== 0) - fx.addFilter("pixelate", config3.filter.pixelate); - fx.apply(inCanvas); - } else { - outCanvas = inCanvas; - if (fx) - fx = null; - } - let pixels; - if (outCanvas.data) { - const shape = [outCanvas.height, outCanvas.width, 3]; - pixels = tfjs_esm_exports.tensor3d(outCanvas.data, shape, "int32"); - } else if (outCanvas instanceof ImageData) { - pixels = tfjs_esm_exports.browser.fromPixels(outCanvas); - } else if (config3.backend === "webgl" || config3.backend === "humangl") { - const tempCanvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement("canvas"); - tempCanvas.width = targetWidth; - tempCanvas.height = targetHeight; - const tempCtx = tempCanvas.getContext("2d"); - tempCtx == null ? void 0 : tempCtx.drawImage(outCanvas, 0, 0); - pixels = tfjs_esm_exports.browser.fromPixels(tempCanvas); - } else { - const tempCanvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement("canvas"); - tempCanvas.width = targetWidth; - tempCanvas.height = targetHeight; - const tempCtx = tempCanvas.getContext("2d"); - tempCtx == null ? void 0 : tempCtx.drawImage(outCanvas, 0, 0); - const data2 = tempCtx == null ? void 0 : tempCtx.getImageData(0, 0, targetWidth, targetHeight); - pixels = tfjs_esm_exports.browser.fromPixels(data2); - } - const casted = pixels.toFloat(); - tensor = casted.expandDims(0); - pixels.dispose(); - casted.dispose(); - } - const canvas2 = config3.filter.return ? outCanvas : null; - return { tensor, canvas: canvas2 }; -} - -// src/draw/draw.ts -var draw_exports = {}; -__export(draw_exports, { - all: () => all, - body: () => body2, - canvas: () => canvas, - face: () => face2, - gesture: () => gesture, - hand: () => hand2, - object: () => object, - options: () => options -}); -var options = { - color: "rgba(173, 216, 230, 0.3)", - labelColor: "rgba(173, 216, 230, 1)", - shadowColor: "black", - font: 'small-caps 16px "Segoe UI"', - lineHeight: 24, - lineWidth: 6, - pointSize: 2, - roundRect: 28, - drawPoints: false, - drawLabels: true, - drawBoxes: true, - drawPolygons: true, - fillPolygons: false, - useDepth: true, - useCurves: false, - bufferedOutput: true, - useRawBoxes: false, - calculateHandBox: true -}; -function point(ctx, x, y, z = 0, localOptions) { - ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + 2 * z}, ${127.5 - 2 * z}, 255, 0.3)` : localOptions.color; - ctx.beginPath(); - ctx.arc(x, y, localOptions.pointSize, 0, 2 * Math.PI); - ctx.fill(); -} -function rect(ctx, x, y, width, height, localOptions) { - ctx.beginPath(); - if (localOptions.useCurves) { - const cx = (x + x + width) / 2; - const cy = (y + y + height) / 2; - ctx.ellipse(cx, cy, width / 2, height / 2, 0, 0, 2 * Math.PI); - } else { - ctx.lineWidth = localOptions.lineWidth; - ctx.moveTo(x + localOptions.roundRect, y); - ctx.lineTo(x + width - localOptions.roundRect, y); - ctx.quadraticCurveTo(x + width, y, x + width, y + localOptions.roundRect); - ctx.lineTo(x + width, y + height - localOptions.roundRect); - ctx.quadraticCurveTo(x + width, y + height, x + width - localOptions.roundRect, y + height); - ctx.lineTo(x + localOptions.roundRect, y + height); - ctx.quadraticCurveTo(x, y + height, x, y + height - localOptions.roundRect); - ctx.lineTo(x, y + localOptions.roundRect); - ctx.quadraticCurveTo(x, y, x + localOptions.roundRect, y); - ctx.closePath(); - } - ctx.stroke(); -} -function lines(ctx, points = [], localOptions) { - if (points === void 0 || points.length === 0) - return; - ctx.beginPath(); - ctx.moveTo(points[0][0], points[0][1]); - for (const pt of points) { - ctx.strokeStyle = localOptions.useDepth && pt[2] ? `rgba(${127.5 + 2 * pt[2]}, ${127.5 - 2 * pt[2]}, 255, 0.3)` : localOptions.color; - ctx.fillStyle = localOptions.useDepth && pt[2] ? `rgba(${127.5 + 2 * pt[2]}, ${127.5 - 2 * pt[2]}, 255, 0.3)` : localOptions.color; - ctx.lineTo(pt[0], Math.round(pt[1])); - } - ctx.stroke(); - if (localOptions.fillPolygons) { - ctx.closePath(); - ctx.fill(); - } -} -function curves(ctx, points = [], localOptions) { - if (points === void 0 || points.length === 0) - return; - if (!localOptions.useCurves || points.length <= 2) { - lines(ctx, points, localOptions); - return; - } - ctx.moveTo(points[0][0], points[0][1]); - for (let i = 0; i < points.length - 2; i++) { - const xc = (points[i][0] + points[i + 1][0]) / 2; - const yc = (points[i][1] + points[i + 1][1]) / 2; - ctx.quadraticCurveTo(points[i][0], points[i][1], xc, yc); - } - ctx.quadraticCurveTo(points[points.length - 2][0], points[points.length - 2][1], points[points.length - 1][0], points[points.length - 1][1]); - ctx.stroke(); - if (localOptions.fillPolygons) { - ctx.closePath(); - ctx.fill(); - } -} -async function gesture(inCanvas2, result, drawOptions) { - const localOptions = mergeDeep(options, drawOptions); - if (!result || !inCanvas2) - return; - if (!(inCanvas2 instanceof HTMLCanvasElement)) - return; - const ctx = inCanvas2.getContext("2d"); - if (!ctx) - return; - ctx.font = localOptions.font; - ctx.fillStyle = localOptions.color; - let i = 1; - for (let j = 0; j < result.length; j++) { - let where = []; - let what = []; - [where, what] = Object.entries(result[j]); - if (what.length > 1 && what[1].length > 0) { - const person = where[1] > 0 ? `#${where[1]}` : ""; - const label = `${where[0]} ${person}: ${what[1]}`; - if (localOptions.shadowColor && localOptions.shadowColor !== "") { - ctx.fillStyle = localOptions.shadowColor; - ctx.fillText(label, 8, 2 + i * localOptions.lineHeight); - } - ctx.fillStyle = localOptions.labelColor; - ctx.fillText(label, 6, 0 + i * localOptions.lineHeight); - i += 1; - } - } -} -async function face2(inCanvas2, result, drawOptions) { - const localOptions = mergeDeep(options, drawOptions); - if (!result || !inCanvas2) - return; - if (!(inCanvas2 instanceof HTMLCanvasElement)) - return; - const ctx = inCanvas2.getContext("2d"); - if (!ctx) - return; - for (const f of result) { - ctx.font = localOptions.font; - ctx.strokeStyle = localOptions.color; - ctx.fillStyle = localOptions.color; - if (localOptions.drawBoxes) { - if (localOptions.useRawBoxes) - rect(ctx, inCanvas2.width * f.boxRaw[0], inCanvas2.height * f.boxRaw[1], inCanvas2.width * f.boxRaw[2], inCanvas2.height * f.boxRaw[3], localOptions); - else - rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions); - } - const labels2 = []; - labels2.push(`face confidence: ${Math.trunc(100 * f.confidence)}%`); - if (f.genderConfidence) - labels2.push(`${f.gender || ""} ${Math.trunc(100 * f.genderConfidence)}% confident`); - if (f.age) - labels2.push(`age: ${f.age || ""}`); - if (f.iris) - labels2.push(`iris distance: ${f.iris}`); - if (f.emotion && f.emotion.length > 0) { - const emotion2 = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`); - labels2.push(emotion2.join(" ")); - } - if (f.rotation && f.rotation.angle && f.rotation.angle.roll) - labels2.push(`roll: ${Math.trunc(100 * f.rotation.angle.roll) / 100} yaw:${Math.trunc(100 * f.rotation.angle.yaw) / 100} pitch:${Math.trunc(100 * f.rotation.angle.pitch) / 100}`); - if (labels2.length === 0) - labels2.push("face"); - ctx.fillStyle = localOptions.color; - for (let i = labels2.length - 1; i >= 0; i--) { - const x = Math.max(f.box[0], 0); - const y = i * localOptions.lineHeight + f.box[1]; - if (localOptions.shadowColor && localOptions.shadowColor !== "") { - ctx.fillStyle = localOptions.shadowColor; - ctx.fillText(labels2[i], x + 5, y + 16); - } - ctx.fillStyle = localOptions.labelColor; - ctx.fillText(labels2[i], x + 4, y + 15); - } - ctx.lineWidth = 1; - if (f.mesh && f.mesh.length > 0) { - if (localOptions.drawPoints) { - for (const pt of f.mesh) - point(ctx, pt[0], pt[1], pt[2], localOptions); - } - if (localOptions.drawPolygons) { - ctx.lineWidth = 1; - for (let i = 0; i < TRI468.length / 3; i++) { - const points = [ - TRI468[i * 3 + 0], - TRI468[i * 3 + 1], - TRI468[i * 3 + 2] - ].map((index) => f.mesh[index]); - lines(ctx, points, localOptions); - } - if (f.annotations && f.annotations["leftEyeIris"]) { - ctx.strokeStyle = localOptions.useDepth ? "rgba(255, 200, 255, 0.3)" : localOptions.color; - ctx.beginPath(); - const sizeX = Math.abs(f.annotations["leftEyeIris"][3][0] - f.annotations["leftEyeIris"][1][0]) / 2; - const sizeY = Math.abs(f.annotations["leftEyeIris"][4][1] - f.annotations["leftEyeIris"][2][1]) / 2; - ctx.ellipse(f.annotations["leftEyeIris"][0][0], f.annotations["leftEyeIris"][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI); - ctx.stroke(); - if (localOptions.fillPolygons) { - ctx.fillStyle = localOptions.useDepth ? "rgba(255, 255, 200, 0.3)" : localOptions.color; - ctx.fill(); - } - } - if (f.annotations && f.annotations["rightEyeIris"]) { - ctx.strokeStyle = localOptions.useDepth ? "rgba(255, 200, 255, 0.3)" : localOptions.color; - ctx.beginPath(); - const sizeX = Math.abs(f.annotations["rightEyeIris"][3][0] - f.annotations["rightEyeIris"][1][0]) / 2; - const sizeY = Math.abs(f.annotations["rightEyeIris"][4][1] - f.annotations["rightEyeIris"][2][1]) / 2; - ctx.ellipse(f.annotations["rightEyeIris"][0][0], f.annotations["rightEyeIris"][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI); - ctx.stroke(); - if (localOptions.fillPolygons) { - ctx.fillStyle = localOptions.useDepth ? "rgba(255, 255, 200, 0.3)" : localOptions.color; - ctx.fill(); - } - } - } - } - } -} -var lastDrawnPose = []; -async function body2(inCanvas2, result, drawOptions) { - var _a; - const localOptions = mergeDeep(options, drawOptions); - if (!result || !inCanvas2) - return; - if (!(inCanvas2 instanceof HTMLCanvasElement)) - return; - const ctx = inCanvas2.getContext("2d"); - if (!ctx) - return; - ctx.lineJoin = "round"; - for (let i = 0; i < result.length; i++) { - if (!lastDrawnPose[i] && localOptions.bufferedOutput) - lastDrawnPose[i] = { ...result[i] }; - ctx.strokeStyle = localOptions.color; - ctx.fillStyle = localOptions.color; - ctx.lineWidth = localOptions.lineWidth; - ctx.font = localOptions.font; - if (localOptions.drawBoxes && result[i].box && ((_a = result[i].box) == null ? void 0 : _a.length) === 4) { - rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions); - if (localOptions.drawLabels) { - if (localOptions.shadowColor && localOptions.shadowColor !== "") { - ctx.fillStyle = localOptions.shadowColor; - ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]); - } - ctx.fillStyle = localOptions.labelColor; - ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]); - } - } - if (localOptions.drawPoints) { - for (let pt = 0; pt < result[i].keypoints.length; pt++) { - ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position.z ? `rgba(${127.5 + 2 * result[i].keypoints[pt].position.z}, ${127.5 - 2 * result[i].keypoints[pt].position.z}, 255, 0.5)` : localOptions.color; - if (localOptions.bufferedOutput) { - lastDrawnPose[i].keypoints[pt][0] = (lastDrawnPose[i].keypoints[pt][0] + result[i].keypoints[pt].position.x) / 2; - lastDrawnPose[i].keypoints[pt][1] = (lastDrawnPose[i].keypoints[pt][1] + result[i].keypoints[pt].position.y) / 2; - point(ctx, lastDrawnPose[i].keypoints[pt][0], lastDrawnPose[i].keypoints[pt][1], 0, localOptions); - } else { - point(ctx, result[i].keypoints[pt].position.x, result[i].keypoints[pt].position.y, 0, localOptions); - } - } - } - if (localOptions.drawLabels) { - ctx.font = localOptions.font; - if (result[i].keypoints) { - for (const pt of result[i].keypoints) { - ctx.fillStyle = localOptions.useDepth && pt.position.z ? `rgba(${127.5 + 2 * pt.position.z}, ${127.5 - 2 * pt.position.z}, 255, 0.5)` : localOptions.color; - ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position.x + 4, pt.position.y + 4); - } - } - } - if (localOptions.drawPolygons && result[i].keypoints) { - let part; - const points = []; - points.length = 0; - part = result[i].keypoints.find((a) => a.part === "leftShoulder"); - if (part) - points.push([part.position.x, part.position.y]); - part = result[i].keypoints.find((a) => a.part === "rightShoulder"); - if (part) - points.push([part.position.x, part.position.y]); - curves(ctx, points, localOptions); - points.length = 0; - part = result[i].keypoints.find((a) => a.part === "rightShoulder"); - if (part) - points.push([part.position.x, part.position.y]); - part = result[i].keypoints.find((a) => a.part === "rightHip"); - if (part) - points.push([part.position.x, part.position.y]); - part = result[i].keypoints.find((a) => a.part === "leftHip"); - if (part) - points.push([part.position.x, part.position.y]); - part = result[i].keypoints.find((a) => a.part === "leftShoulder"); - if (part) - points.push([part.position.x, part.position.y]); - if (points.length === 4) - lines(ctx, points, localOptions); - points.length = 0; - part = result[i].keypoints.find((a) => a.part === "leftHip"); - if (part) - points.push([part.position.x, part.position.y]); - part = result[i].keypoints.find((a) => a.part === "leftKnee"); - if (part) - points.push([part.position.x, part.position.y]); - part = result[i].keypoints.find((a) => a.part === "leftAnkle"); - if (part) - points.push([part.position.x, part.position.y]); - part = result[i].keypoints.find((a) => a.part === "leftHeel"); - if (part) - points.push([part.position.x, part.position.y]); - part = result[i].keypoints.find((a) => a.part === "leftFoot"); - if (part) - points.push([part.position.x, part.position.y]); - curves(ctx, points, localOptions); - points.length = 0; - part = result[i].keypoints.find((a) => a.part === "rightHip"); - if (part) - points.push([part.position.x, part.position.y]); - part = result[i].keypoints.find((a) => a.part === "rightKnee"); - if (part) - points.push([part.position.x, part.position.y]); - part = result[i].keypoints.find((a) => a.part === "rightAnkle"); - if (part) - points.push([part.position.x, part.position.y]); - part = result[i].keypoints.find((a) => a.part === "rightHeel"); - if (part) - points.push([part.position.x, part.position.y]); - part = result[i].keypoints.find((a) => a.part === "rightFoot"); - if (part) - points.push([part.position.x, part.position.y]); - curves(ctx, points, localOptions); - points.length = 0; - part = result[i].keypoints.find((a) => a.part === "leftShoulder"); - if (part) - points.push([part.position.x, part.position.y]); - part = result[i].keypoints.find((a) => a.part === "leftElbow"); - if (part) - points.push([part.position.x, part.position.y]); - part = result[i].keypoints.find((a) => a.part === "leftWrist"); - if (part) - points.push([part.position.x, part.position.y]); - part = result[i].keypoints.find((a) => a.part === "leftPalm"); - if (part) - points.push([part.position.x, part.position.y]); - curves(ctx, points, localOptions); - points.length = 0; - part = result[i].keypoints.find((a) => a.part === "rightShoulder"); - if (part) - points.push([part.position.x, part.position.y]); - part = result[i].keypoints.find((a) => a.part === "rightElbow"); - if (part) - points.push([part.position.x, part.position.y]); - part = result[i].keypoints.find((a) => a.part === "rightWrist"); - if (part) - points.push([part.position.x, part.position.y]); - part = result[i].keypoints.find((a) => a.part === "rightPalm"); - if (part) - points.push([part.position.x, part.position.y]); - curves(ctx, points, localOptions); - } - } -} -async function hand2(inCanvas2, result, drawOptions) { - const localOptions = mergeDeep(options, drawOptions); - if (!result || !inCanvas2) - return; - if (!(inCanvas2 instanceof HTMLCanvasElement)) - return; - const ctx = inCanvas2.getContext("2d"); - if (!ctx) - return; - ctx.lineJoin = "round"; - ctx.font = localOptions.font; - for (const h of result) { - if (localOptions.drawBoxes) { - ctx.strokeStyle = localOptions.color; - ctx.fillStyle = localOptions.color; - let box4; - if (!localOptions.calculateHandBox) { - box4 = localOptions.useRawBoxes ? h.boxRaw : h.box; - } else { - box4 = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0]; - if (h.landmarks && h.landmarks.length > 0) { - for (const pt of h.landmarks) { - if (pt[0] < box4[0]) - box4[0] = pt[0]; - if (pt[1] < box4[1]) - box4[1] = pt[1]; - if (pt[0] > box4[2]) - box4[2] = pt[0]; - if (pt[1] > box4[3]) - box4[3] = pt[1]; - } - box4[2] -= box4[0]; - box4[3] -= box4[1]; - } - } - if (localOptions.useRawBoxes) - rect(ctx, inCanvas2.width * box4[0], inCanvas2.height * box4[1], inCanvas2.width * box4[2], inCanvas2.height * box4[3], localOptions); - else - rect(ctx, box4[0], box4[1], box4[2], box4[3], localOptions); - if (localOptions.drawLabels) { - if (localOptions.shadowColor && localOptions.shadowColor !== "") { - ctx.fillStyle = localOptions.shadowColor; - ctx.fillText("hand", box4[0] + 3, 1 + box4[1] + localOptions.lineHeight, box4[2]); - } - ctx.fillStyle = localOptions.labelColor; - ctx.fillText("hand", box4[0] + 2, 0 + box4[1] + localOptions.lineHeight, box4[2]); - } - ctx.stroke(); - } - if (localOptions.drawPoints) { - if (h.landmarks && h.landmarks.length > 0) { - for (const pt of h.landmarks) { - ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + 2 * pt[2]}, ${127.5 - 2 * pt[2]}, 255, 0.5)` : localOptions.color; - point(ctx, pt[0], pt[1], 0, localOptions); - } - } - } - if (localOptions.drawLabels) { - const addHandLabel = (part, title) => { - ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + 2 * part[part.length - 1][2]}, ${127.5 - 2 * part[part.length - 1][2]}, 255, 0.5)` : localOptions.color; - ctx.fillText(title, part[part.length - 1][0] + 4, part[part.length - 1][1] + 4); - }; - ctx.font = localOptions.font; - addHandLabel(h.annotations["indexFinger"], "index"); - addHandLabel(h.annotations["middleFinger"], "middle"); - addHandLabel(h.annotations["ringFinger"], "ring"); - addHandLabel(h.annotations["pinky"], "pinky"); - addHandLabel(h.annotations["thumb"], "thumb"); - addHandLabel(h.annotations["palmBase"], "palm"); - } - if (localOptions.drawPolygons) { - const addHandLine = (part) => { - if (!part) - return; - for (let i = 0; i < part.length; i++) { - ctx.beginPath(); - ctx.strokeStyle = localOptions.useDepth ? `rgba(${127.5 + 2 * part[i][2]}, ${127.5 - 2 * part[i][2]}, 255, 0.5)` : localOptions.color; - ctx.moveTo(part[i > 0 ? i - 1 : 0][0], part[i > 0 ? i - 1 : 0][1]); - ctx.lineTo(part[i][0], part[i][1]); - ctx.stroke(); - } - }; - ctx.lineWidth = localOptions.lineWidth; - addHandLine(h.annotations["indexFinger"]); - addHandLine(h.annotations["middleFinger"]); - addHandLine(h.annotations["ringFinger"]); - addHandLine(h.annotations["pinky"]); - addHandLine(h.annotations["thumb"]); - } - } -} -async function object(inCanvas2, result, drawOptions) { - const localOptions = mergeDeep(options, drawOptions); - if (!result || !inCanvas2) - return; - if (!(inCanvas2 instanceof HTMLCanvasElement)) - return; - const ctx = inCanvas2.getContext("2d"); - if (!ctx) - return; - ctx.lineJoin = "round"; - ctx.font = localOptions.font; - for (const h of result) { - if (localOptions.drawBoxes) { - ctx.strokeStyle = localOptions.color; - ctx.fillStyle = localOptions.color; - if (localOptions.useRawBoxes) - rect(ctx, inCanvas2.width * h.boxRaw[0], inCanvas2.height * h.boxRaw[1], inCanvas2.width * h.boxRaw[2], inCanvas2.height * h.boxRaw[3], localOptions); - else - rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions); - if (localOptions.drawLabels) { - const label = `${Math.round(100 * h.score)}% ${h.label}`; - if (localOptions.shadowColor && localOptions.shadowColor !== "") { - ctx.fillStyle = localOptions.shadowColor; - ctx.fillText(label, h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]); - } - ctx.fillStyle = localOptions.labelColor; - ctx.fillText(label, h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]); - } - ctx.stroke(); - } - } -} -async function canvas(inCanvas2, outCanvas2) { - if (!inCanvas2 || !outCanvas2) - return; - if (!(inCanvas2 instanceof HTMLCanvasElement) || !(outCanvas2 instanceof HTMLCanvasElement)) - return; - const outCtx = inCanvas2.getContext("2d"); - outCtx == null ? void 0 : outCtx.drawImage(inCanvas2, 0, 0); -} -async function all(inCanvas2, result, drawOptions) { - const localOptions = mergeDeep(options, drawOptions); - if (!result || !inCanvas2) - return; - if (!(inCanvas2 instanceof HTMLCanvasElement)) - return; - face2(inCanvas2, result.face, localOptions); - body2(inCanvas2, result.body, localOptions); - hand2(inCanvas2, result.hand, localOptions); - gesture(inCanvas2, result.gesture, localOptions); - object(inCanvas2, result.object, localOptions); -} - -// src/sample.ts -var face3 = ` +var G5=Object.defineProperty;var n2=Object.getOwnPropertyDescriptor;var o2=Object.getOwnPropertyNames;var s2=Object.prototype.hasOwnProperty;var K=(A,e)=>{for(var t in e)G5(A,t,{get:e[t],enumerable:!0})},m=(A,e,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of o2(e))!s2.call(A,n)&&n!=="default"&&G5(A,n,{get:()=>e[n],enumerable:!(t=n2(e,n))||t.enumerable});return A};var Q5=(A,e,t)=>{if(!e.has(A))throw TypeError("Cannot "+t)};var Z=(A,e,t)=>(Q5(A,e,"read from private field"),t?t.call(A):e.get(A)),q=(A,e,t)=>{if(e.has(A))throw TypeError("Cannot add the same private member more than once");e instanceof WeakSet?e.add(A):e.set(A,t)},C=(A,e,t,n)=>(Q5(A,e,"write to private field"),n?n.call(A,t):e.set(A,t),t);function k(A,e){let t=A.endsWith("/")?"":"/",o=e.startsWith(".")||e.startsWith("/")||e.startsWith("http:")||e.startsWith("https:")||e.startsWith("file:")?`${e}`:`${A}${t}${e}`;if(!o.toLocaleLowerCase().includes(".json"))throw new Error(`Human: ModelPath Error: ${o} Expecting JSON file`);return o}function p(...A){let e=new Date,t=`${e.getHours().toString().padStart(2,"0")}:${e.getMinutes().toString().padStart(2,"0")}:${e.getSeconds().toString().padStart(2,"0")}.${e.getMilliseconds().toString().padStart(3,"0")}`;A&&console.log(t,"Human:",...A)}var S=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function B(...A){let e=t=>t&&typeof t=="object";return A.reduce((t,n)=>(Object.keys(n||{}).forEach(o=>{let i=t[o],s=n[o];Array.isArray(i)&&Array.isArray(s)?t[o]=i.concat(...s):e(i)&&e(s)?t[o]=B(i,s):t[o]=s}),t),{})}var _5={backend:"webgl",modelBasePath:"../models/",wasmPath:"../node_modules/@tensorflow/tfjs-backend-wasm/dist//",debug:!0,async:!0,warmup:"full",cacheSensitivity:.01,filter:{enabled:!0,width:0,height:0,flip:!1,return:!0,brightness:0,contrast:0,sharpness:0,blur:0,saturation:0,hue:0,negative:!1,sepia:!1,vintage:!1,kodachrome:!1,technicolor:!1,polaroid:!1,pixelate:0},gesture:{enabled:!0},face:{enabled:!0,detector:{modelPath:"blazeface.json",rotation:!1,maxDetected:10,skipFrames:21,minConfidence:.2,iouThreshold:.1,return:!1},mesh:{enabled:!0,modelPath:"facemesh.json"},iris:{enabled:!0,modelPath:"iris.json"},description:{enabled:!0,modelPath:"faceres.json",skipFrames:31,minConfidence:.1},emotion:{enabled:!0,minConfidence:.1,skipFrames:32,modelPath:"emotion.json"}},body:{enabled:!0,modelPath:"posenet.json",maxDetected:1,minConfidence:.1},hand:{enabled:!0,rotation:!1,skipFrames:32,minConfidence:.1,iouThreshold:.1,maxDetected:2,landmarks:!0,detector:{modelPath:"handdetect.json"},skeleton:{modelPath:"handskeleton.json"}},object:{enabled:!1,modelPath:"mb3-centernet.json",minConfidence:.2,iouThreshold:.4,maxDetected:10,skipFrames:41}};function $5(){let A,e;if(typeof navigator!="undefined"){let t=navigator.userAgent.match(/\(([^()]+)\)/g);if(t&&t[0]){let n=t[0].match(/\(([^()]+)\)/g);A=n?n[0].replace(/\(|\)/g,""):"",e=navigator.userAgent.replace(t[0],""),A[1]&&(e=e.replace(t[1],"")),e=e.replace(/ /g," ")}}else typeof process!="undefined"&&(A=`${process.platform} ${process.arch}`,e=`NodeJS ${process.version}`);return{platform:A,agent:e}}var a={};K(a,{data:()=>x2,version:()=>y2});m(a,C2);m(a,J2);m(a,K2);m(a,D2);m(a,G2);m(a,Q2);import*as AA from"@tensorflow/tfjs/package.json";import*as eA from"@tensorflow/tfjs-core/package.json";import*as tA from"@tensorflow/tfjs-data/package.json";import*as nA from"@tensorflow/tfjs-layers/package.json";import*as oA from"@tensorflow/tfjs-converter/package.json";import{version_cpu as r2}from"@tensorflow/tfjs-backend-cpu/dist/index.js";import{version_webgl as i2}from"@tensorflow/tfjs-backend-webgl/dist/index.js";import{version_wasm as a2}from"@tensorflow/tfjs-backend-wasm/dist/index.js";import*as C2 from"@tensorflow/tfjs-core/dist/index.js";import*as J2 from"@tensorflow/tfjs-layers/dist/index.js";import*as K2 from"@tensorflow/tfjs-converter/dist/index.js";import*as x2 from"@tensorflow/tfjs-data/dist/index.js";import*as D2 from"@tensorflow/tfjs-backend-cpu/dist/index.js";import*as G2 from"@tensorflow/tfjs-backend-webgl/dist/index.js";import*as Q2 from"@tensorflow/tfjs-backend-wasm/dist/index.js";var y2={tfjs:(AA==null?void 0:AA.version)||void 0,"tfjs-core":(eA==null?void 0:eA.version)||void 0,"tfjs-data":(tA==null?void 0:tA.version)||void 0,"tfjs-layers":(nA==null?void 0:nA.version)||void 0,"tfjs-converter":(oA==null?void 0:oA.version)||void 0,"tfjs-backend-cpu":r2||void 0,"tfjs-backend-webgl":i2||void 0,"tfjs-backend-wasm":a2||void 0};var H={name:"humangl",priority:99,canvas:null,gl:null,width:1024,height:1024,webGLattr:{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!1,desynchronized:!0}};function sA(){if(!a.findBackend(H.name)){p("backend registration:",H.name);try{H.canvas=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(H.width,H.height):document.createElement("canvas")}catch(A){p("error: cannot create canvas:",A);return}try{H.gl=H.canvas.getContext("webgl2",H.webGLattr)}catch(A){p("error: cannot get WebGL2 context:",A);return}try{a.setWebGLContext(2,H.gl)}catch(A){p("error: cannot set WebGL2 context:",A);return}try{let A=new a.GPGPUContext(H.gl);a.registerBackend(H.name,()=>new a.MathBackendWebGL(A),H.priority)}catch(A){p("error: cannot register WebGL backend:",A);return}try{a.getKernelsForBackend("webgl").forEach(e=>{let t={...e,backendName:H.name};a.registerKernel(t)})}catch(A){p("error: cannot update WebGL backend registration:",A);return}try{a.ENV.set("WEBGL_VERSION",2)}catch(A){p("error: cannot set WebGL backend flags:",A);return}p("backend registered:",H.name)}}var s5={};K(s5,{load:()=>o5,predict:()=>n5,triangulation:()=>uA,uvmap:()=>pA});function rA(A,e){let t=[A.startPoint[0]*e[0],A.startPoint[1]*e[1]],n=[A.endPoint[0]*e[0],A.endPoint[1]*e[1]];return{startPoint:t,endPoint:n}}function h0(A){return[Math.abs(A.endPoint[0]-A.startPoint[0]),Math.abs(A.endPoint[1]-A.startPoint[1])]}function a0(A){return[A.startPoint[0]+(A.endPoint[0]-A.startPoint[0])/2,A.startPoint[1]+(A.endPoint[1]-A.startPoint[1])/2]}function x0(A,e,t){let n=e.shape[1],o=e.shape[2],i=[[A.startPoint[1]/n,A.startPoint[0]/o,A.endPoint[1]/n,A.endPoint[0]/o]];return a.image.cropAndResize(e,i,[0],t)}function v0(A,e=1.5){let t=a0(A),n=h0(A),o=[e*n[0]/2,e*n[1]/2],i=[t[0]-o[0],t[1]-o[1]],s=[t[0]+o[0],t[1]+o[1]];return{startPoint:i,endPoint:s,landmarks:A.landmarks}}function R0(A){let e=a0(A),t=h0(A),o=Math.max(...t)/2,i=[Math.round(e[0]-o),Math.round(e[1]-o)],s=[Math.round(e[0]+o),Math.round(e[1]+o)];return{startPoint:i,endPoint:s,landmarks:A.landmarks}}function G0(A){let e=A.map(i=>i[0]),t=A.map(i=>i[1]),n=[Math.min(...e),Math.min(...t)],o=[Math.max(...e),Math.max(...t)];return{startPoint:n,endPoint:o,landmarks:A}}var iA=A=>({startPoint:a.slice(A,[0,0],[-1,2]),endPoint:a.slice(A,[0,2],[-1,2])});var j0=[[1,0,0],[0,1,0],[0,0,1]];function l2(A){return A-2*Math.PI*Math.floor((A+Math.PI)/(2*Math.PI))}function Q0(A,e){let t=Math.PI/2-Math.atan2(-(e[1]-A[1]),e[0]-A[0]);return l2(t)}function aA(A,e){return[[1,0,A],[0,1,e],[0,0,1]]}function _(A,e){let t=0;for(let n=0;n{let x=e.resizeBilinear([this.inputSize,this.inputSize]).div(127.5).sub(.5),d=this.model.execute(x),l;if(Array.isArray(d)){let c=d.sort((v,j)=>v.size-j.size),g=a.concat([c[0],c[2]],2),M=a.concat([c[1],c[3]],2);l=a.concat([M,g],1).squeeze(0)}else l=d.squeeze();let f=d2(l,this.anchors,[this.inputSize,this.inputSize]),u=a.slice(l,[0,0],[-1,1]),z=a.sigmoid(u).squeeze().dataSync();return[l,f,z]}),i=await a.image.nonMaxSuppressionAsync(n,o,this.config.face.detector.maxDetected,this.config.face.detector.iouThreshold,this.config.face.detector.minConfidence),s=i.arraySync();i.dispose();let r=[];for(let y=0;ythis.config.face.detector.minConfidence){let d=a.slice(n,[s[y],0],[1,-1]),l=iA(d);d.dispose();let f=this.anchorsData[s[y]],u=a.tidy(()=>a.slice(t,[s[y],dA-1],[1,-1]).squeeze().reshape([dA,-1]));r.push({box:l,landmarks:u,anchor:f,confidence:x})}}return t.dispose(),n.dispose(),{boxes:r,scaleFactor:[e.shape[2]/this.inputSize,e.shape[1]/this.inputSize]}}};async function mA(A){let e=await a.loadGraphModel(k(A.modelBasePath,A.face.detector.modelPath),{fromTFHub:A.face.detector.modelPath.includes("tfhub.dev")}),t=new fA(e,A);return!e||!e.modelUrl?p("load model failed:",A.face.detector.modelPath):A.debug&&p("load model:",e.modelUrl),t}var D={silhouette:[10,338,297,332,284,251,389,356,454,323,361,288,397,365,379,378,400,377,152,148,176,149,150,136,172,58,132,93,234,127,162,21,54,103,67,109],lipsUpperOuter:[61,185,40,39,37,0,267,269,270,409,291],lipsLowerOuter:[146,91,181,84,17,314,405,321,375,291],lipsUpperInner:[78,191,80,81,82,13,312,311,310,415,308],lipsLowerInner:[78,95,88,178,87,14,317,402,318,324,308],rightEyeUpper0:[246,161,160,159,158,157,173],rightEyeLower0:[33,7,163,144,145,153,154,155,133],rightEyeUpper1:[247,30,29,27,28,56,190],rightEyeLower1:[130,25,110,24,23,22,26,112,243],rightEyeUpper2:[113,225,224,223,222,221,189],rightEyeLower2:[226,31,228,229,230,231,232,233,244],rightEyeLower3:[143,111,117,118,119,120,121,128,245],rightEyebrowUpper:[156,70,63,105,66,107,55,193],rightEyebrowLower:[35,124,46,53,52,65],rightEyeIris:[473,474,475,476,477],leftEyeUpper0:[466,388,387,386,385,384,398],leftEyeLower0:[263,249,390,373,374,380,381,382,362],leftEyeUpper1:[467,260,259,257,258,286,414],leftEyeLower1:[359,255,339,254,253,252,256,341,463],leftEyeUpper2:[342,445,444,443,442,441,413],leftEyeLower2:[446,261,448,449,450,451,452,453,464],leftEyeLower3:[372,340,346,347,348,349,350,357,465],leftEyebrowUpper:[383,300,293,334,296,336,285,417],leftEyebrowLower:[265,353,276,283,282,295],leftEyeIris:[468,469,470,471,472],midwayBetweenEyes:[168],noseTip:[1],noseBottom:[2],noseRightCorner:[98],noseLeftCorner:[327],rightCheek:[205],leftCheek:[425]},_0=[{key:"EyeUpper0",indices:[9,10,11,12,13,14,15]},{key:"EyeUpper1",indices:[25,26,27,28,29,30,31]},{key:"EyeUpper2",indices:[41,42,43,44,45,46,47]},{key:"EyeLower0",indices:[0,1,2,3,4,5,6,7,8]},{key:"EyeLower1",indices:[16,17,18,19,20,21,22,23,24]},{key:"EyeLower2",indices:[32,33,34,35,36,37,38,39,40]},{key:"EyeLower3",indices:[54,55,56,57,58,59,60,61,62]}],u0=[[.499976992607117,.652534008026123],[.500025987625122,.547487020492554],[.499974012374878,.602371990680695],[.482113003730774,.471979022026062],[.500150978565216,.527155995368958],[.499909996986389,.498252987861633],[.499523013830185,.40106201171875],[.289712011814117,.380764007568359],[.499954998493195,.312398016452789],[.499987006187439,.269918978214264],[.500023007392883,.107050001621246],[.500023007392883,.666234016418457],[.5000159740448,.679224014282227],[.500023007392883,.692348003387451],[.499976992607117,.695277988910675],[.499976992607117,.70593398809433],[.499976992607117,.719385027885437],[.499976992607117,.737019002437592],[.499967992305756,.781370997428894],[.499816000461578,.562981009483337],[.473773002624512,.573909997940063],[.104906998574734,.254140973091125],[.365929991006851,.409575998783112],[.338757991790771,.41302502155304],[.311120003461838,.409460008144379],[.274657994508743,.389131009578705],[.393361985683441,.403706014156342],[.345234006643295,.344011008739471],[.370094001293182,.346076011657715],[.319321990013123,.347265005111694],[.297903001308441,.353591024875641],[.24779200553894,.410809993743896],[.396889001131058,.842755019664764],[.280097991228104,.375599980354309],[.106310002505779,.399955987930298],[.2099249958992,.391353011131287],[.355807989835739,.534406006336212],[.471751004457474,.65040397644043],[.474155008792877,.680191993713379],[.439785003662109,.657229006290436],[.414617002010345,.66654098033905],[.450374007225037,.680860996246338],[.428770989179611,.682690978050232],[.374971002340317,.727805018424988],[.486716985702515,.547628998756409],[.485300987958908,.527395009994507],[.257764995098114,.314490020275116],[.401223003864288,.455172002315521],[.429818987846375,.548614978790283],[.421351999044418,.533740997314453],[.276895999908447,.532056987285614],[.483370006084442,.499586999416351],[.33721199631691,.282882988452911],[.296391993761063,.293242990970612],[.169294998049736,.193813979625702],[.447580009698868,.302609980106354],[.392390012741089,.353887975215912],[.354490011930466,.696784019470215],[.067304998636246,.730105042457581],[.442739009857178,.572826027870178],[.457098007202148,.584792017936707],[.381974011659622,.694710969924927],[.392388999462128,.694203019142151],[.277076005935669,.271932005882263],[.422551989555359,.563233017921448],[.385919004678726,.281364023685455],[.383103013038635,.255840003490448],[.331431001424789,.119714021682739],[.229923993349075,.232002973556519],[.364500999450684,.189113974571228],[.229622006416321,.299540996551514],[.173287004232407,.278747975826263],[.472878992557526,.666198015213013],[.446828007698059,.668527007102966],[.422762006521225,.673889994621277],[.445307999849319,.580065965652466],[.388103008270264,.693961024284363],[.403039008378983,.706539988517761],[.403629004955292,.693953037261963],[.460041999816895,.557139039039612],[.431158006191254,.692366003990173],[.452181994915009,.692366003990173],[.475387006998062,.692366003990173],[.465828001499176,.779190003871918],[.472328990697861,.736225962638855],[.473087012767792,.717857003211975],[.473122000694275,.704625964164734],[.473033010959625,.695277988910675],[.427942007780075,.695277988910675],[.426479011774063,.703539967536926],[.423162013292313,.711845993995667],[.4183090031147,.720062971115112],[.390094995498657,.639572978019714],[.013953999616206,.560034036636353],[.499913990497589,.58014702796936],[.413199990987778,.69539999961853],[.409626007080078,.701822996139526],[.468080013990402,.601534962654114],[.422728985548019,.585985004901886],[.463079988956451,.593783974647522],[.37211999297142,.47341400384903],[.334562003612518,.496073007583618],[.411671012639999,.546965003013611],[.242175996303558,.14767599105835],[.290776997804642,.201445996761322],[.327338010072708,.256527006626129],[.399509996175766,.748921036720276],[.441727995872498,.261676013469696],[.429764986038208,.187834024429321],[.412198007106781,.108901023864746],[.288955003023148,.398952007293701],[.218936994671822,.435410976409912],[.41278201341629,.398970007896423],[.257135003805161,.355440020561218],[.427684992551804,.437960982322693],[.448339998722076,.536936044692993],[.178560003638268,.45755398273468],[.247308000922203,.457193970680237],[.286267012357712,.467674970626831],[.332827985286713,.460712015628815],[.368755996227264,.447206974029541],[.398963987827301,.432654976844788],[.476410001516342,.405806005001068],[.189241006970406,.523923993110657],[.228962004184723,.348950982093811],[.490725994110107,.562400996685028],[.404670000076294,.485132992267609],[.019469000399113,.401564002037048],[.426243007183075,.420431017875671],[.396993011236191,.548797011375427],[.266469985246658,.376977026462555],[.439121007919312,.51895797252655],[.032313998788595,.644356966018677],[.419054001569748,.387154996395111],[.462783008813858,.505746960639954],[.238978996872902,.779744982719421],[.198220998048782,.831938028335571],[.107550002634525,.540755033493042],[.183610007166862,.740257024765015],[.134409993886948,.333683013916016],[.385764002799988,.883153975009918],[.490967005491257,.579378008842468],[.382384985685349,.508572995662689],[.174399003386497,.397670984268188],[.318785011768341,.39623498916626],[.343364000320435,.400596976280212],[.396100014448166,.710216999053955],[.187885001301765,.588537991046906],[.430987000465393,.944064974784851],[.318993002176285,.898285031318665],[.266247987747192,.869701027870178],[.500023007392883,.190576016902924],[.499976992607117,.954452991485596],[.366169989109039,.398822009563446],[.393207013607025,.39553701877594],[.410373002290726,.391080021858215],[.194993004202843,.342101991176605],[.388664990663528,.362284004688263],[.365961998701096,.355970978736877],[.343364000320435,.355356991291046],[.318785011768341,.35834002494812],[.301414996385574,.363156020641327],[.058132998645306,.319076001644135],[.301414996385574,.387449026107788],[.499987989664078,.618434011936188],[.415838003158569,.624195992946625],[.445681989192963,.566076993942261],[.465844005346298,.620640993118286],[.49992299079895,.351523995399475],[.288718998432159,.819945991039276],[.335278987884521,.852819979190826],[.440512001514435,.902418971061707],[.128294005990028,.791940987110138],[.408771991729736,.373893976211548],[.455606997013092,.451801002025604],[.499877005815506,.908990025520325],[.375436991453171,.924192011356354],[.11421000212431,.615022003650665],[.448662012815475,.695277988910675],[.4480200111866,.704632043838501],[.447111994028091,.715808033943176],[.444831997156143,.730794012546539],[.430011987686157,.766808986663818],[.406787008047104,.685672998428345],[.400738000869751,.681069016456604],[.392399996519089,.677703022956848],[.367855995893478,.663918972015381],[.247923001646996,.601333022117615],[.452769994735718,.420849978923798],[.43639200925827,.359887003898621],[.416164010763168,.368713974952698],[.413385987281799,.692366003990173],[.228018000721931,.683571994304657],[.468268007040024,.352671027183533],[.411361992359161,.804327011108398],[.499989002943039,.469825029373169],[.479153990745544,.442654013633728],[.499974012374878,.439637005329132],[.432112008333206,.493588984012604],[.499886006116867,.866917014122009],[.49991300702095,.821729004383087],[.456548988819122,.819200992584229],[.344549000263214,.745438992977142],[.37890899181366,.574010014533997],[.374292999505997,.780184984207153],[.319687992334366,.570737957954407],[.357154995203018,.604269981384277],[.295284003019333,.621580958366394],[.447750002145767,.862477004528046],[.410986006259918,.508723020553589],[.31395098567009,.775308012962341],[.354128003120422,.812552988529205],[.324548006057739,.703992962837219],[.189096003770828,.646299958229065],[.279776990413666,.71465802192688],[.1338230073452,.682700991630554],[.336768001317978,.644733011722565],[.429883986711502,.466521978378296],[.455527991056442,.548622965812683],[.437114000320435,.558896005153656],[.467287987470627,.529924988746643],[.414712011814117,.335219979286194],[.37704598903656,.322777986526489],[.344107985496521,.320150971412659],[.312875986099243,.32233202457428],[.283526003360748,.333190023899078],[.241245999932289,.382785975933075],[.102986000478268,.468762993812561],[.267612010240555,.424560010433197],[.297879010438919,.433175981044769],[.333433985710144,.433878004550934],[.366427004337311,.426115989685059],[.396012008190155,.416696012020111],[.420121014118195,.41022801399231],[.007561000064015,.480777025222778],[.432949006557465,.569517970085144],[.458638995885849,.479089021682739],[.473466008901596,.545744001865387],[.476087987422943,.563830018043518],[.468472003936768,.555056989192963],[.433990985155106,.582361996173859],[.483518004417419,.562983989715576],[.482482999563217,.57784903049469],[.42645001411438,.389798998832703],[.438998997211456,.39649498462677],[.450067013502121,.400434017181396],[.289712011814117,.368252992630005],[.276670008897781,.363372981548309],[.517862021923065,.471948027610779],[.710287988185883,.380764007568359],[.526226997375488,.573909997940063],[.895093023777008,.254140973091125],[.634069979190826,.409575998783112],[.661242008209229,.41302502155304],[.688880026340485,.409460008144379],[.725341975688934,.389131009578705],[.606630027294159,.40370500087738],[.654766023159027,.344011008739471],[.629905998706818,.346076011657715],[.680678009986877,.347265005111694],[.702096998691559,.353591024875641],[.75221198797226,.410804986953735],[.602918028831482,.842862963676453],[.719901978969574,.375599980354309],[.893692970275879,.399959981441498],[.790081977844238,.391354024410248],[.643998026847839,.534487962722778],[.528249025344849,.65040397644043],[.525849997997284,.680191040039062],[.560214996337891,.657229006290436],[.585384011268616,.66654098033905],[.549625992774963,.680860996246338],[.57122802734375,.682691991329193],[.624852001667023,.72809898853302],[.513050019741058,.547281980514526],[.51509702205658,.527251958847046],[.742246985435486,.314507007598877],[.598631024360657,.454979002475739],[.570338010787964,.548575043678284],[.578631997108459,.533622980117798],[.723087012767792,.532054007053375],[.516445994377136,.499638974666595],[.662801027297974,.282917976379395],[.70362401008606,.293271005153656],[.830704987049103,.193813979625702],[.552385985851288,.302568018436432],[.607609987258911,.353887975215912],[.645429015159607,.696707010269165],[.932694971561432,.730105042457581],[.557260990142822,.572826027870178],[.542901992797852,.584792017936707],[.6180260181427,.694710969924927],[.607590973377228,.694203019142151],[.722943007946014,.271963000297546],[.577413976192474,.563166975975037],[.614082992076874,.281386971473694],[.616907000541687,.255886018276215],[.668509006500244,.119913995265961],[.770092010498047,.232020974159241],[.635536015033722,.189248979091644],[.77039098739624,.299556016921997],[.826722025871277,.278755009174347],[.527121007442474,.666198015213013],[.553171992301941,.668527007102966],[.577238023281097,.673889994621277],[.554691970348358,.580065965652466],[.611896991729736,.693961024284363],[.59696102142334,.706539988517761],[.596370995044708,.693953037261963],[.539958000183105,.557139039039612],[.568841993808746,.692366003990173],[.547818005084991,.692366003990173],[.52461302280426,.692366003990173],[.534089982509613,.779141008853912],[.527670979499817,.736225962638855],[.526912987232208,.717857003211975],[.526877999305725,.704625964164734],[.526966989040375,.695277988910675],[.572058022022247,.695277988910675],[.573521018028259,.703539967536926],[.57683801651001,.711845993995667],[.581691026687622,.720062971115112],[.609944999217987,.639909982681274],[.986046016216278,.560034036636353],[.5867999792099,.69539999961853],[.590372025966644,.701822996139526],[.531915009021759,.601536989212036],[.577268004417419,.585934996604919],[.536915004253387,.593786001205444],[.627542972564697,.473352015018463],[.665585994720459,.495950996875763],[.588353991508484,.546862006187439],[.757824003696442,.14767599105835],[.709249973297119,.201507985591888],[.672684013843536,.256581008434296],[.600408971309662,.74900496006012],[.55826598405838,.261672019958496],[.570303976535797,.187870979309082],[.588165998458862,.109044015407562],[.711045026779175,.398952007293701],[.781069993972778,.435405015945435],[.587247014045715,.398931980133057],[.742869973182678,.355445981025696],[.572156012058258,.437651991844177],[.55186802148819,.536570012569427],[.821442008018494,.457556009292603],[.752701997756958,.457181990146637],[.71375697851181,.467626988887787],[.66711300611496,.460672974586487],[.631101012229919,.447153985500336],[.6008620262146,.432473003864288],[.523481011390686,.405627012252808],[.810747981071472,.523926019668579],[.771045982837677,.348959028720856],[.509127020835876,.562718033790588],[.595292985439301,.485023975372314],[.980530977249146,.401564002037048],[.573499977588654,.420000016689301],[.602994978427887,.548687994480133],[.733529984951019,.376977026462555],[.560611009597778,.519016981124878],[.967685997486115,.644356966018677],[.580985009670258,.387160003185272],[.537728011608124,.505385041236877],[.760966002941132,.779752969741821],[.801778972148895,.831938028335571],[.892440974712372,.54076099395752],[.816350996494293,.740260004997253],[.865594983100891,.333687007427216],[.614073991775513,.883246004581451],[.508952975273132,.579437971115112],[.617941975593567,.508316040039062],[.825608015060425,.397674977779388],[.681214988231659,.39623498916626],[.656635999679565,.400596976280212],[.603900015354156,.710216999053955],[.81208598613739,.588539004325867],[.56801301240921,.944564998149872],[.681007981300354,.898285031318665],[.733752012252808,.869701027870178],[.633830010890961,.398822009563446],[.606792986392975,.39553701877594],[.589659988880157,.391062021255493],[.805015981197357,.342108011245728],[.611334979534149,.362284004688263],[.634037971496582,.355970978736877],[.656635999679565,.355356991291046],[.681214988231659,.35834002494812],[.698584973812103,.363156020641327],[.941866993904114,.319076001644135],[.698584973812103,.387449026107788],[.584177017211914,.624107003211975],[.554318010807037,.566076993942261],[.534153997898102,.62064003944397],[.711217999458313,.819975018501282],[.664629995822906,.852871000766754],[.559099972248077,.902631998062134],[.871706008911133,.791940987110138],[.591234028339386,.373893976211548],[.544341027736664,.451583981513977],[.624562978744507,.924192011356354],[.88577002286911,.615028977394104],[.551338016986847,.695277988910675],[.551980018615723,.704632043838501],[.552887976169586,.715808033943176],[.555167973041534,.730794012546539],[.569944024085999,.767035007476807],[.593203008174896,.685675978660583],[.599261999130249,.681069016456604],[.607599973678589,.677703022956848],[.631937980651855,.663500010967255],[.752032995223999,.601315021514893],[.547226011753082,.420395016670227],[.563543975353241,.359827995300293],[.583841025829315,.368713974952698],[.586614012718201,.692366003990173],[.771915018558502,.683578014373779],[.531597018241882,.352482974529266],[.588370978832245,.804440975189209],[.52079701423645,.442565023899078],[.567984998226166,.493479013442993],[.543282985687256,.819254994392395],[.655317008495331,.745514988899231],[.621008992195129,.574018001556396],[.625559985637665,.78031200170517],[.680198013782501,.570719003677368],[.64276397228241,.604337990283966],[.704662978649139,.621529996395111],[.552012026309967,.862591981887817],[.589071989059448,.508637011051178],[.685944974422455,.775357007980347],[.645735025405884,.812640011310577],[.675342977046967,.703978002071381],[.810858011245728,.646304965019226],[.72012197971344,.714666962623596],[.866151988506317,.682704985141754],[.663187026977539,.644596993923187],[.570082008838654,.466325998306274],[.544561982154846,.548375964164734],[.562758982181549,.558784961700439],[.531987011432648,.530140042304993],[.585271000862122,.335177004337311],[.622952997684479,.32277899980545],[.655896008014679,.320163011550903],[.687132000923157,.322345972061157],[.716481983661652,.333200991153717],[.758756995201111,.382786989212036],[.897013008594513,.468769013881683],[.732392013072968,.424547016620636],[.70211398601532,.433162987232208],[.66652500629425,.433866024017334],[.633504986763,.426087975502014],[.603875994682312,.416586995124817],[.579657971858978,.409945011138916],[.992439985275269,.480777025222778],[.567192018032074,.569419980049133],[.54136598110199,.478899002075195],[.526564002037048,.546118021011353],[.523913025856018,.563830018043518],[.531529009342194,.555056989192963],[.566035985946655,.582329034805298],[.51631098985672,.563053965568542],[.5174720287323,.577877044677734],[.573594987392426,.389806985855103],[.560697972774506,.395331978797913],[.549755990505219,.399751007556915],[.710287988185883,.368252992630005],[.723330020904541,.363372981548309]],n0=[127,34,139,11,0,37,232,231,120,72,37,39,128,121,47,232,121,128,104,69,67,175,171,148,157,154,155,118,50,101,73,39,40,9,151,108,48,115,131,194,204,211,74,40,185,80,42,183,40,92,186,230,229,118,202,212,214,83,18,17,76,61,146,160,29,30,56,157,173,106,204,194,135,214,192,203,165,98,21,71,68,51,45,4,144,24,23,77,146,91,205,50,187,201,200,18,91,106,182,90,91,181,85,84,17,206,203,36,148,171,140,92,40,39,193,189,244,159,158,28,247,246,161,236,3,196,54,68,104,193,168,8,117,228,31,189,193,55,98,97,99,126,47,100,166,79,218,155,154,26,209,49,131,135,136,150,47,126,217,223,52,53,45,51,134,211,170,140,67,69,108,43,106,91,230,119,120,226,130,247,63,53,52,238,20,242,46,70,156,78,62,96,46,53,63,143,34,227,173,155,133,123,117,111,44,125,19,236,134,51,216,206,205,154,153,22,39,37,167,200,201,208,36,142,100,57,212,202,20,60,99,28,158,157,35,226,113,160,159,27,204,202,210,113,225,46,43,202,204,62,76,77,137,123,116,41,38,72,203,129,142,64,98,240,49,102,64,41,73,74,212,216,207,42,74,184,169,170,211,170,149,176,105,66,69,122,6,168,123,147,187,96,77,90,65,55,107,89,90,180,101,100,120,63,105,104,93,137,227,15,86,85,129,102,49,14,87,86,55,8,9,100,47,121,145,23,22,88,89,179,6,122,196,88,95,96,138,172,136,215,58,172,115,48,219,42,80,81,195,3,51,43,146,61,171,175,199,81,82,38,53,46,225,144,163,110,246,33,7,52,65,66,229,228,117,34,127,234,107,108,69,109,108,151,48,64,235,62,78,191,129,209,126,111,35,143,163,161,246,117,123,50,222,65,52,19,125,141,221,55,65,3,195,197,25,7,33,220,237,44,70,71,139,122,193,245,247,130,33,71,21,162,153,158,159,170,169,150,188,174,196,216,186,92,144,160,161,2,97,167,141,125,241,164,167,37,72,38,12,145,159,160,38,82,13,63,68,71,226,35,111,158,153,154,101,50,205,206,92,165,209,198,217,165,167,97,220,115,218,133,112,243,239,238,241,214,135,169,190,173,133,171,208,32,125,44,237,86,87,178,85,86,179,84,85,180,83,84,181,201,83,182,137,93,132,76,62,183,61,76,184,57,61,185,212,57,186,214,207,187,34,143,156,79,239,237,123,137,177,44,1,4,201,194,32,64,102,129,213,215,138,59,166,219,242,99,97,2,94,141,75,59,235,24,110,228,25,130,226,23,24,229,22,23,230,26,22,231,112,26,232,189,190,243,221,56,190,28,56,221,27,28,222,29,27,223,30,29,224,247,30,225,238,79,20,166,59,75,60,75,240,147,177,215,20,79,166,187,147,213,112,233,244,233,128,245,128,114,188,114,217,174,131,115,220,217,198,236,198,131,134,177,132,58,143,35,124,110,163,7,228,110,25,356,389,368,11,302,267,452,350,349,302,303,269,357,343,277,452,453,357,333,332,297,175,152,377,384,398,382,347,348,330,303,304,270,9,336,337,278,279,360,418,262,431,304,408,409,310,415,407,270,409,410,450,348,347,422,430,434,313,314,17,306,307,375,387,388,260,286,414,398,335,406,418,364,367,416,423,358,327,251,284,298,281,5,4,373,374,253,307,320,321,425,427,411,421,313,18,321,405,406,320,404,405,315,16,17,426,425,266,377,400,369,322,391,269,417,465,464,386,257,258,466,260,388,456,399,419,284,332,333,417,285,8,346,340,261,413,441,285,327,460,328,355,371,329,392,439,438,382,341,256,429,420,360,364,394,379,277,343,437,443,444,283,275,440,363,431,262,369,297,338,337,273,375,321,450,451,349,446,342,467,293,334,282,458,461,462,276,353,383,308,324,325,276,300,293,372,345,447,382,398,362,352,345,340,274,1,19,456,248,281,436,427,425,381,256,252,269,391,393,200,199,428,266,330,329,287,273,422,250,462,328,258,286,384,265,353,342,387,259,257,424,431,430,342,353,276,273,335,424,292,325,307,366,447,345,271,303,302,423,266,371,294,455,460,279,278,294,271,272,304,432,434,427,272,407,408,394,430,431,395,369,400,334,333,299,351,417,168,352,280,411,325,319,320,295,296,336,319,403,404,330,348,349,293,298,333,323,454,447,15,16,315,358,429,279,14,15,316,285,336,9,329,349,350,374,380,252,318,402,403,6,197,419,318,319,325,367,364,365,435,367,397,344,438,439,272,271,311,195,5,281,273,287,291,396,428,199,311,271,268,283,444,445,373,254,339,263,466,249,282,334,296,449,347,346,264,447,454,336,296,299,338,10,151,278,439,455,292,407,415,358,371,355,340,345,372,390,249,466,346,347,280,442,443,282,19,94,370,441,442,295,248,419,197,263,255,359,440,275,274,300,383,368,351,412,465,263,467,466,301,368,389,380,374,386,395,378,379,412,351,419,436,426,322,373,390,388,2,164,393,370,462,461,164,0,267,302,11,12,374,373,387,268,12,13,293,300,301,446,261,340,385,384,381,330,266,425,426,423,391,429,355,437,391,327,326,440,457,438,341,382,362,459,457,461,434,430,394,414,463,362,396,369,262,354,461,457,316,403,402,315,404,403,314,405,404,313,406,405,421,418,406,366,401,361,306,408,407,291,409,408,287,410,409,432,436,410,434,416,411,264,368,383,309,438,457,352,376,401,274,275,4,421,428,262,294,327,358,433,416,367,289,455,439,462,370,326,2,326,370,305,460,455,254,449,448,255,261,446,253,450,449,252,451,450,256,452,451,341,453,452,413,464,463,441,413,414,258,442,441,257,443,442,259,444,443,260,445,444,467,342,445,459,458,250,289,392,290,290,328,460,376,433,435,250,290,392,411,416,433,341,463,464,453,464,465,357,465,412,343,412,399,360,363,440,437,399,456,420,456,363,401,435,288,372,383,353,339,255,249,448,261,255,133,243,190,133,155,112,33,246,247,33,130,25,398,384,286,362,398,414,362,463,341,263,359,467,263,249,255,466,467,260,75,60,166,238,239,79,162,127,139,72,11,37,121,232,120,73,72,39,114,128,47,233,232,128,103,104,67,152,175,148,173,157,155,119,118,101,74,73,40,107,9,108,49,48,131,32,194,211,184,74,185,191,80,183,185,40,186,119,230,118,210,202,214,84,83,17,77,76,146,161,160,30,190,56,173,182,106,194,138,135,192,129,203,98,54,21,68,5,51,4,145,144,23,90,77,91,207,205,187,83,201,18,181,91,182,180,90,181,16,85,17,205,206,36,176,148,140,165,92,39,245,193,244,27,159,28,30,247,161,174,236,196,103,54,104,55,193,8,111,117,31,221,189,55,240,98,99,142,126,100,219,166,218,112,155,26,198,209,131,169,135,150,114,47,217,224,223,53,220,45,134,32,211,140,109,67,108,146,43,91,231,230,120,113,226,247,105,63,52,241,238,242,124,46,156,95,78,96,70,46,63,116,143,227,116,123,111,1,44,19,3,236,51,207,216,205,26,154,22,165,39,167,199,200,208,101,36,100,43,57,202,242,20,99,56,28,157,124,35,113,29,160,27,211,204,210,124,113,46,106,43,204,96,62,77,227,137,116,73,41,72,36,203,142,235,64,240,48,49,64,42,41,74,214,212,207,183,42,184,210,169,211,140,170,176,104,105,69,193,122,168,50,123,187,89,96,90,66,65,107,179,89,180,119,101,120,68,63,104,234,93,227,16,15,85,209,129,49,15,14,86,107,55,9,120,100,121,153,145,22,178,88,179,197,6,196,89,88,96,135,138,136,138,215,172,218,115,219,41,42,81,5,195,51,57,43,61,208,171,199,41,81,38,224,53,225,24,144,110,105,52,66,118,229,117,227,34,234,66,107,69,10,109,151,219,48,235,183,62,191,142,129,126,116,111,143,7,163,246,118,117,50,223,222,52,94,19,141,222,221,65,196,3,197,45,220,44,156,70,139,188,122,245,139,71,162,145,153,159,149,170,150,122,188,196,206,216,92,163,144,161,164,2,167,242,141,241,0,164,37,11,72,12,144,145,160,12,38,13,70,63,71,31,226,111,157,158,154,36,101,205,203,206,165,126,209,217,98,165,97,237,220,218,237,239,241,210,214,169,140,171,32,241,125,237,179,86,178,180,85,179,181,84,180,182,83,181,194,201,182,177,137,132,184,76,183,185,61,184,186,57,185,216,212,186,192,214,187,139,34,156,218,79,237,147,123,177,45,44,4,208,201,32,98,64,129,192,213,138,235,59,219,141,242,97,97,2,141,240,75,235,229,24,228,31,25,226,230,23,229,231,22,230,232,26,231,233,112,232,244,189,243,189,221,190,222,28,221,223,27,222,224,29,223,225,30,224,113,247,225,99,60,240,213,147,215,60,20,166,192,187,213,243,112,244,244,233,245,245,128,188,188,114,174,134,131,220,174,217,236,236,198,134,215,177,58,156,143,124,25,110,7,31,228,25,264,356,368,0,11,267,451,452,349,267,302,269,350,357,277,350,452,357,299,333,297,396,175,377,381,384,382,280,347,330,269,303,270,151,9,337,344,278,360,424,418,431,270,304,409,272,310,407,322,270,410,449,450,347,432,422,434,18,313,17,291,306,375,259,387,260,424,335,418,434,364,416,391,423,327,301,251,298,275,281,4,254,373,253,375,307,321,280,425,411,200,421,18,335,321,406,321,320,405,314,315,17,423,426,266,396,377,369,270,322,269,413,417,464,385,386,258,248,456,419,298,284,333,168,417,8,448,346,261,417,413,285,326,327,328,277,355,329,309,392,438,381,382,256,279,429,360,365,364,379,355,277,437,282,443,283,281,275,363,395,431,369,299,297,337,335,273,321,348,450,349,359,446,467,283,293,282,250,458,462,300,276,383,292,308,325,283,276,293,264,372,447,346,352,340,354,274,19,363,456,281,426,436,425,380,381,252,267,269,393,421,200,428,371,266,329,432,287,422,290,250,328,385,258,384,446,265,342,386,387,257,422,424,430,445,342,276,422,273,424,306,292,307,352,366,345,268,271,302,358,423,371,327,294,460,331,279,294,303,271,304,436,432,427,304,272,408,395,394,431,378,395,400,296,334,299,6,351,168,376,352,411,307,325,320,285,295,336,320,319,404,329,330,349,334,293,333,366,323,447,316,15,315,331,358,279,317,14,316,8,285,9,277,329,350,253,374,252,319,318,403,351,6,419,324,318,325,397,367,365,288,435,397,278,344,439,310,272,311,248,195,281,375,273,291,175,396,199,312,311,268,276,283,445,390,373,339,295,282,296,448,449,346,356,264,454,337,336,299,337,338,151,294,278,455,308,292,415,429,358,355,265,340,372,388,390,466,352,346,280,295,442,282,354,19,370,285,441,295,195,248,197,457,440,274,301,300,368,417,351,465,251,301,389,385,380,386,394,395,379,399,412,419,410,436,322,387,373,388,326,2,393,354,370,461,393,164,267,268,302,12,386,374,387,312,268,13,298,293,301,265,446,340,380,385,381,280,330,425,322,426,391,420,429,437,393,391,326,344,440,438,458,459,461,364,434,394,428,396,262,274,354,457,317,316,402,316,315,403,315,314,404,314,313,405,313,421,406,323,366,361,292,306,407,306,291,408,291,287,409,287,432,410,427,434,411,372,264,383,459,309,457,366,352,401,1,274,4,418,421,262,331,294,358,435,433,367,392,289,439,328,462,326,94,2,370,289,305,455,339,254,448,359,255,446,254,253,449,253,252,450,252,256,451,256,341,452,414,413,463,286,441,414,286,258,441,258,257,442,257,259,443,259,260,444,260,467,445,309,459,250,305,289,290,305,290,460,401,376,435,309,250,392,376,411,433,453,341,464,357,453,465,343,357,412,437,343,399,344,360,440,420,437,456,360,420,363,361,401,288,265,372,353,390,339,249,339,448,255];var f2=[127,234,132,58,172,150,149,148,152,377,378,379,397,288,361,454,356,70,63,105,66,107,336,296,334,293,300,168,6,195,4,98,97,2,326,327,33,160,158,133,153,144,362,385,387,263,373,380,57,40,37,0,267,270,287,321,314,17,84,91,78,81,13,311,308,402,14,178],m2=[33,133,362,263,1,62,308,159,145,386,374,6,102,331,2,13,14,70,105,107,336,334,300,54,10,284,50,280,234,454,58,288,152],h2=[33,133,362,263,1,78,308],xe=f2.map(A=>u0[A]),ye=m2.map(A=>u0[A]),le=h2.map(A=>u0[A]);var $0=D.leftEyeLower0,A5=D.rightEyeLower0,y0={leftBounds:[$0[0],$0[$0.length-1]],rightBounds:[A5[0],A5[A5.length-1]]},w0={count:468,mouth:13,symmetryLine:[13,D.midwayBetweenEyes[0]]},hA={leftEye:0,rightEye:1,nose:2,mouth:3,leftEar:4,rightEar:5,symmetryLine:[3,2]},l0={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};function W0(A,e,t,n){for(let o=0;o<_0.length;o++){let{key:i,indices:s}=_0[o],r=D[`${t}${i}`];if(!n||n.includes(i))for(let y=0;y[i[0]/this.meshSize*(l[0]-this.meshSize/2),i[1]/this.meshSize*(l[1]-this.meshSize/2),l[2]]),r=n!==0?S0(n,[0,0]):j0,y=n!==0?s.map(l=>[...lA(l,r),l[2]]):s,x=n!==0?yA(o):j0,d=[...a0({startPoint:t.startPoint,endPoint:t.endPoint}),1];return y.map(l=>[Math.round(l[0]+_(d,x[0])),Math.round(l[1]+_(d,x[1])),Math.round(l[2])])}getLeftToRightEyeDepthDifference(e){let t=e[y0.leftBounds[0]][2],n=e[y0.rightBounds[0]][2];return t-n}getEyeBox(e,t,n,o,i=!1){let s=R0(v0(G0([e[n],e[o]]),this.irisEnlarge)),r=h0(s),y=a.image.cropAndResize(t,[[s.startPoint[1]/this.meshSize,s.startPoint[0]/this.meshSize,s.endPoint[1]/this.meshSize,s.endPoint[0]/this.meshSize]],[0],[this.irisSize,this.irisSize]);return i&&a.ENV.flags.IS_BROWSER&&(y=a.image.flipLeftRight(y)),{box:s,boxSize:r,crop:y}}getEyeCoords(e,t,n,o=!1){let i=[];for(let s=0;s{let x=s;return y===2?x=o:y===4&&(x=i),[r[0],r[1],x]})}async predict(e,t){let n=!1,o;if((this.skipped===0||this.skipped>t.face.detector.skipFrames||!t.face.mesh.enabled||!t.skipFrame)&&(o=await this.boundingBoxDetector.getBoundingBoxes(e),this.skipped=0),t.skipFrame&&this.skipped++,!t.skipFrame||o&&o.boxes&&(!t.face.mesh.enabled||o.boxes.length!==this.detectedFaces&&this.detectedFaces!==t.face.detector.maxDetected)){this.storedBoxes=[],this.detectedFaces=0;for(let s of o.boxes)this.storedBoxes.push({startPoint:s.box.startPoint.dataSync(),endPoint:s.box.endPoint.dataSync(),landmarks:s.landmarks,confidence:s.confidence});this.storedBoxes.length>0&&(n=!0)}if(n){if(!o||!o.boxes||o.boxes.length===0)return this.storedBoxes=[],this.detectedFaces=0,null;for(let s=0;s{s.box.startPoint.dispose(),s.box.endPoint.dispose(),s.landmarks.dispose()});let i=a.tidy(()=>this.storedBoxes.map((s,r)=>{let y,x=0,d;if(t.face.detector.rotation&&t.face.mesh.enabled&&a.ENV.flags.IS_BROWSER){let[j,T]=s.landmarks.length>=w0.count?w0.symmetryLine:hA.symmetryLine;x=Q0(s.landmarks[j],s.landmarks[T]);let h=a0({startPoint:s.startPoint,endPoint:s.endPoint}),P=[h[0]/e.shape[2],h[1]/e.shape[1]],R=a.image.rotateWithOffset(e,x,0,P);d=S0(-x,h),t.face.mesh.enabled?y=x0({startPoint:s.startPoint,endPoint:s.endPoint},R,[this.meshSize,this.meshSize]).div(255):y=x0({startPoint:s.startPoint,endPoint:s.endPoint},R,[this.boxSize,this.boxSize]).div(255)}else{d=j0;let j=e.clone();t.face.mesh.enabled?y=x0({startPoint:s.startPoint,endPoint:s.endPoint},j,[this.meshSize,this.meshSize]).div(255):y=x0({startPoint:s.startPoint,endPoint:s.endPoint},j,[this.boxSize,this.boxSize]).div(255)}if(!t.face.mesh.enabled)return{mesh:[],box:s,faceConfidence:null,boxConfidence:s.confidence,confidence:s.confidence,image:y};let[,l,f]=this.meshDetector.execute(y),u=l.dataSync()[0];if(u=w0.count?w0.symmetryLine:hA.symmetryLine;x=Q0(s.landmarks[j],s.landmarks[T]);let h=a0({startPoint:s.startPoint,endPoint:s.endPoint}),P=[h[0]/e.shape[2],h[1]/e.shape[1]],R=a.image.rotateWithOffset(e.toFloat(),x,0,P);d=S0(-x,h),y=x0({startPoint:s.startPoint,endPoint:s.endPoint},R,[this.meshSize,this.meshSize]).div(255)}let b={mesh:g,box:s,faceConfidence:u,boxConfidence:s.confidence,image:y},v=R0(s);return v.confidence=s.confidence,v.faceConfidence=u,this.storedBoxes[r]=v,b}));return t.face.mesh.enabled&&(this.storedBoxes=this.storedBoxes.filter(s=>s.confidence>t.face.detector.minConfidence)),this.detectedFaces=i.length,i}};var I=[null,null,null],t5;async function n5(A,e){let t=await t5.predict(A,e),n=[];for(let o of t||[]){if(!o||o.isDisposedInternal)continue;let i=o.mesh.map(x=>[x[0]/A.shape[2],x[1]/A.shape[1],x[2]/t5.meshSize]),s={};if(o.mesh&&o.mesh.length>0)for(let x of Object.keys(D))s[x]=D[x].map(d=>o.mesh[d]);let r=o.box?[Math.max(0,o.box.startPoint[0]),Math.max(0,o.box.startPoint[1]),Math.min(A.shape[2],o.box.endPoint[0])-Math.max(0,o.box.startPoint[0]),Math.min(A.shape[1],o.box.endPoint[1])-Math.max(0,o.box.startPoint[1])]:0,y=o.box?[o.box.startPoint[0]/A.shape[2],o.box.startPoint[1]/A.shape[1],(o.box.endPoint[0]-o.box.startPoint[0])/A.shape[2],(o.box.endPoint[1]-o.box.startPoint[1])/A.shape[1]]:[];n.push({confidence:Math.round(100*o.faceConfidence||100*o.boxConfidence||0)/100,boxConfidence:Math.round(100*o.boxConfidence)/100,faceConfidence:Math.round(100*o.faceConfidence)/100,box:r,boxRaw:y,mesh:o.mesh,meshRaw:i,annotations:s,image:o.image}),o.coords&&o.coords.dispose()}return n}async function o5(A){return!I[0]&&A.face.enabled||!I[1]&&A.face.mesh.enabled||!I[2]&&A.face.iris.enabled?(I=await Promise.all([!I[0]&&A.face.enabled?mA(A):null,!I[1]&&A.face.mesh.enabled?a.loadGraphModel(k(A.modelBasePath,A.face.mesh.modelPath),{fromTFHub:A.face.mesh.modelPath.includes("tfhub.dev")}):null,!I[2]&&A.face.iris.enabled?a.loadGraphModel(k(A.modelBasePath,A.face.iris.modelPath),{fromTFHub:A.face.iris.modelPath.includes("tfhub.dev")}):null]),A.face.mesh.enabled&&(!I[1]||!I[1].modelUrl?p("load model failed:",A.face.mesh.modelPath):A.debug&&p("load model:",I[1].modelUrl)),A.face.iris.enabled&&(!I[2]||!I[1].modelUrl?p("load model failed:",A.face.iris.modelPath):A.debug&&p("load model:",I[2].modelUrl))):A.debug&&(p("cached model:",I[0].model.modelUrl),p("cached model:",I[1].modelUrl),p("cached model:",I[2].modelUrl)),t5=new e5(I[0],I[1],I[2]),I}var uA=n0,pA=u0;var x5={};K(x5,{load:()=>a5,predict:()=>k0});var u2=["angry","disgust","fear","happy","sad","surprise","neutral"],J,N0=[],bA=0,r5=Number.MAX_SAFE_INTEGER,i5=[.2989,.587,.114];async function a5(A){return J?A.debug&&p("cached model:",J.modelUrl):(J=await a.loadGraphModel(k(A.modelBasePath,A.face.emotion.modelPath)),!J||!J.modelUrl?p("load model failed:",A.face.emotion.modelPath):A.debug&&p("load model:",J.modelUrl)),J}async function k0(A,e,t,n){return J?r50?(r5++,N0[t]):(r5=0,new Promise(async o=>{let i=a.image.resizeBilinear(A,[J.inputs[0].shape[2],J.inputs[0].shape[1]],!1),[s,r,y]=a.split(i,3,3);i.dispose();let x=a.mul(s,i5[0]),d=a.mul(r,i5[1]),l=a.mul(y,i5[2]);s.dispose(),r.dispose(),y.dispose();let f=a.addN([x,d,l]);x.dispose(),d.dispose(),l.dispose();let u=a.tidy(()=>f.sub(.5).mul(2));f.dispose();let z=[];if(e.face.emotion.enabled){let c=await J.predict(u),g=c.dataSync();a.dispose(c);for(let M=0;Me.face.emotion.minConfidence&&z.push({score:Math.min(.99,Math.trunc(100*g[M])/100),emotion:u2[M]});z.sort((M,b)=>b.score-M.score)}u.dispose(),N0[t]=z,bA=n,o(z)})):null}var f5={};K(f5,{enhance:()=>d5,load:()=>l5,match:()=>TA,predict:()=>O0,similarity:()=>c5});var U,I0=[],gA=0,y5=Number.MAX_SAFE_INTEGER;async function l5(A){return U?A.debug&&p("cached model:",U.modelUrl):(U=await a.loadGraphModel(k(A.modelBasePath,A.face.description.modelPath)),!U||!U.modelUrl?p("load model failed:",A.face.description.modelPath):A.debug&&p("load model:",U.modelUrl)),U}function c5(A,e,t=2){if(!A||!e||(A==null?void 0:A.length)===0||(e==null?void 0:e.length)===0||(A==null?void 0:A.length)!==(e==null?void 0:e.length))return 0;let n=5*A.map((i,s)=>Math.abs(A[s]-e[s])**t).reduce((i,s)=>i+s,0)**(1/t);return Math.max(0,100-n)/100}function TA(A,e,t=0){let n={similarity:0,name:"",source:"",embedding:[]};if(!A||!e||!Array.isArray(A)||!Array.isArray(e))return n;for(let o of e)if(o.embedding&&o.name){let i=c5(A,o.embedding);i>t&&i>n.similarity&&(n={...o,similarity:i})}return n}function d5(A){return a.tidy(()=>{let t=A.image||A.tensor||A;if(!(t instanceof a.Tensor))return null;let n=[[.05,.15,.85,.85]];return(t.shape.length===3?a.image.cropAndResize(a.expandDims(t,0),n,[0],[U.inputs[0].shape[2],U.inputs[0].shape[1]]):a.image.cropAndResize(t,n,[0],[U.inputs[0].shape[2],U.inputs[0].shape[1]])).mul(255)})}async function O0(A,e,t,n){var o,i;return U?y50?(y5++,I0):(y5=0,new Promise(async s=>{let r=d5(A),y,x={age:0,gender:"unknown",genderConfidence:0,descriptor:[]};e.face.description.enabled&&(y=await U.predict(r)),a.dispose(r),y&&(a.tidy(()=>{let d=y.find(c=>c.shape[1]===1).dataSync(),l=Math.trunc(200*Math.abs(d[0]-.5))/100;l>e.face.description.minConfidence&&(x.gender=d[0]<=.5?"female":"male",x.genderConfidence=Math.min(.99,l));let f=y.find(c=>c.shape[1]===100).argMax(1).dataSync()[0],u=y.find(c=>c.shape[1]===100).dataSync();x.age=Math.round(u[f-1]>u[f+1]?10*f-100*u[f-1]:10*f+100*u[f+1])/10;let z=y.find(c=>c.shape[1]===1024);x.descriptor=[...z.dataSync()]}),y.forEach(d=>a.dispose(d))),I0[t]=x,gA=n,s(x)})):null}var p2=(A,e)=>{let t=g=>g*180/Math.PI,n=g=>{let M=Math.sqrt(g[0]*g[0]+g[1]*g[1]+g[2]*g[2]);return g[0]/=M,g[1]/=M,g[2]/=M,g},o=(g,M)=>{let b=g[0]-M[0],v=g[1]-M[1],j=g[2]-M[2];return[b,v,j]},i=(g,M)=>{let b=g[1]*M[2]-g[2]*M[1],v=g[2]*M[0]-g[0]*M[2],j=g[0]*M[1]-g[1]*M[0];return[b,v,j]},s=g=>{let[M,b,v,j,T,h,P,R,w]=g,O,Q,L;return j<1?j>-1?(L=Math.asin(j),Q=Math.atan2(-P,M),O=Math.atan2(-h,T)):(L=-Math.PI/2,Q=-Math.atan2(R,w),O=0):(L=Math.PI/2,Q=Math.atan2(R,w),O=0),{pitch:2*-O,yaw:2*-Q,roll:2*-L}},r=g=>{let M=(v,j,T,h)=>Math.atan2(h-j,T-v);return{pitch:M(g[10][1],g[10][2],g[152][1],g[152][2]),yaw:M(g[33][0],g[33][2],g[263][0],g[263][2]),roll:M(g[33][0],g[33][1],g[263][0],g[263][1])}},y=A.meshRaw;if(!y||y.length<300)return{angle:{pitch:0,yaw:0,roll:0},matrix:[1,0,0,0,1,0,0,0,1]};let x=Math.max(A.boxRaw[2]*e[0],A.boxRaw[3]*e[1])/1.5,d=[y[10],y[152],y[234],y[454]].map(g=>[g[0]*e[0]/x,g[1]*e[1]/x,g[2]]),l=n(o(d[1],d[0])),f=n(o(d[3],d[2])),u=n(i(f,l));f=i(l,u);let z=[f[0],f[1],f[2],l[0],l[1],l[2],u[0],u[1],u[2]];return{angle:s(z),matrix:z}},m5=async(A,e)=>{var d,l,f,u,z,c,g,M;let t,n,o,i,s,r,y=[];A.state="run:face",t=S();let x=await n5(e,A.config);if(A.perf.face=Math.trunc(S()-t),!x)return[];for(let b=0;bP5,predict:()=>T5});var p0=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],PA=p0.length,b0=p0.reduce((A,e,t)=>(A[e]=t,A),{}),b2=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],g2=b2.map(([A,e])=>[b0[A],b0[e]]),MA=[["nose","leftEye"],["leftEye","leftEar"],["nose","rightEye"],["rightEye","rightEar"],["nose","leftShoulder"],["leftShoulder","leftElbow"],["leftElbow","leftWrist"],["leftShoulder","leftHip"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["nose","rightShoulder"],["rightShoulder","rightElbow"],["rightElbow","rightWrist"],["rightShoulder","rightHip"],["rightHip","rightKnee"],["rightKnee","rightAnkle"]];function zA(A){let e=A.reduce(({maxX:t,maxY:n,minX:o,minY:i},{position:{x:s,y:r}})=>({maxX:Math.max(t,s),maxY:Math.max(n,r),minX:Math.min(o,s),minY:Math.min(i,r)}),{maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY});return[e.minX,e.minY,e.maxX-e.minX,e.maxY-e.minY]}function EA(A,[e,t],[n,o]){let i=e/n,s=t/o,r=(x,d)=>({id:d,score:x.score,bowRaw:[x.box[0]/o,x.box[1]/n,x.box[2]/o,x.box[3]/n],box:[Math.trunc(x.box[0]*s),Math.trunc(x.box[1]*i),Math.trunc(x.box[2]*s),Math.trunc(x.box[3]*i)],keypoints:x.keypoints.map(({score:l,part:f,position:u})=>({score:l,part:f,position:{x:Math.trunc(u.x*s),y:Math.trunc(u.y*i)}}))});return A.map((x,d)=>r(x,d))}var h5=class{constructor(e,t){this.priorityQueue=new Array(e),this.numberOfElements=-1,this.getElementValue=t}enqueue(e){this.priorityQueue[++this.numberOfElements]=e,this.swim(this.numberOfElements)}dequeue(){let e=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,e}empty(){return this.numberOfElements===-1}size(){return this.numberOfElements+1}all(){return this.priorityQueue.slice(0,this.numberOfElements+1)}max(){return this.priorityQueue[0]}swim(e){for(;e>0&&this.less(Math.floor(e/2),e);)this.exchange(e,Math.floor(e/2)),e=Math.floor(e/2)}sink(e){for(;2*e<=this.numberOfElements;){let t=2*e;if(tt?t:A}function vA(A,e,t,n){let o=t-A,i=n-e;return o*o+i*i}function g5(A,e){return{x:A.x+e.x,y:A.y+e.y}}var Z0=1,c0=16,T2=50**2;function RA(A,e,t,n,o,i,s=2){let r=M=>({y:i.get(M.y,M.x,A),x:i.get(M.y,M.x,i.shape[2]/2+A)}),y=(M,b,v)=>({y:b5(Math.round(M.y/c0),0,b-1),x:b5(Math.round(M.x/c0),0,v-1)}),[x,d]=n.shape,l=y(e.position,x,d),f=r(l),z=g5(e.position,f);for(let M=0;M[b0[f],b0[u]]),s=i.map(([,f])=>f),r=i.map(([f])=>f),y=e.shape[2],x=s.length,d=new Array(y),l=p5(A.part,c0,t);d[A.part.id]={score:A.score,part:p0[A.part.id],position:l};for(let f=x-1;f>=0;--f){let u=s[f],z=r[f];d[u]&&!d[z]&&(d[z]=RA(f,d[u],z,e,t,o))}for(let f=0;fe){r=!1;break}if(!r)break}return r}function z2(A,e){let[t,n,o]=e.shape,i=new h5(t*n*o,({score:s})=>s);for(let s=0;s{var s;let i=(s=o[n])==null?void 0:s.position;return i?vA(t,e,i.y,i.x)<=T2:!1})}function E2(A,e){return e.reduce((n,{position:o,score:i},s)=>(jA(A,o,s)||(n+=i),n),0)/e.length}function SA(A,e,t,n,o,i){let s=[],r=z2(i,e);for(;s.lengthu.score>i);let l=E2(s,d),f=zA(d);l>i&&s.push({keypoints:d,box:f,score:Math.round(100*l)/100})}return s}var Y,v2=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"];async function T5(A,e){let t=a.tidy(()=>{let r=A.resizeBilinear([Y.inputs[0].shape[2],Y.inputs[0].shape[1]]).toFloat().div(127.5).sub(1),x=Y.execute(r,v2).map(d=>d.squeeze([0]));return x[1]=x[1].sigmoid(),x}),n=await Promise.all(t.map(s=>s.buffer()));for(let s of t)s.dispose();let o=await SA(n[0],n[1],n[2],n[3],e.body.maxDetected,e.body.minConfidence);return EA(o,[A.shape[1],A.shape[2]],[Y.inputs[0].shape[2],Y.inputs[0].shape[1]])}async function P5(A){return Y?A.debug&&p("cached model:",Y.modelUrl):(Y=await a.loadGraphModel(k(A.modelBasePath,A.body.modelPath)),!Y||!Y.modelUrl?p("load model failed:",A.body.modelPath):A.debug&&p("load model:",Y.modelUrl)),Y}var w5={};K(w5,{load:()=>S5,predict:()=>j5});function V0(A){return[Math.abs(A.endPoint[0]-A.startPoint[0]),Math.abs(A.endPoint[1]-A.startPoint[1])]}function g0(A){return[A.startPoint[0]+(A.endPoint[0]-A.startPoint[0])/2,A.startPoint[1]+(A.endPoint[1]-A.startPoint[1])/2]}function wA(A,e,t){let n=e.shape[1],o=e.shape[2],i=[[A.startPoint[1]/n,A.startPoint[0]/o,A.endPoint[1]/n,A.endPoint[0]/o]];return a.image.cropAndResize(e,i,[0],t)}function WA(A,e){let t=[A.startPoint[0]*e[0],A.startPoint[1]*e[1]],n=[A.endPoint[0]*e[0],A.endPoint[1]*e[1]],o=A.palmLandmarks.map(i=>[i[0]*e[0],i[1]*e[1]]);return{startPoint:t,endPoint:n,palmLandmarks:o,confidence:A.confidence}}function L0(A,e=1.5){let t=g0(A),n=V0(A),o=[e*n[0]/2,e*n[1]/2],i=[t[0]-o[0],t[1]-o[1]],s=[t[0]+o[0],t[1]+o[1]];return{startPoint:i,endPoint:s,palmLandmarks:A.palmLandmarks}}function H0(A){let e=g0(A),t=V0(A),o=Math.max(...t)/2,i=[e[0]-o,e[1]-o],s=[e[0]+o,e[1]+o];return{startPoint:i,endPoint:s,palmLandmarks:A.palmLandmarks}}var NA=[{x:.015625,y:.015625},{x:.015625,y:.015625},{x:.046875,y:.015625},{x:.046875,y:.015625},{x:.078125,y:.015625},{x:.078125,y:.015625},{x:.109375,y:.015625},{x:.109375,y:.015625},{x:.140625,y:.015625},{x:.140625,y:.015625},{x:.171875,y:.015625},{x:.171875,y:.015625},{x:.203125,y:.015625},{x:.203125,y:.015625},{x:.234375,y:.015625},{x:.234375,y:.015625},{x:.265625,y:.015625},{x:.265625,y:.015625},{x:.296875,y:.015625},{x:.296875,y:.015625},{x:.328125,y:.015625},{x:.328125,y:.015625},{x:.359375,y:.015625},{x:.359375,y:.015625},{x:.390625,y:.015625},{x:.390625,y:.015625},{x:.421875,y:.015625},{x:.421875,y:.015625},{x:.453125,y:.015625},{x:.453125,y:.015625},{x:.484375,y:.015625},{x:.484375,y:.015625},{x:.515625,y:.015625},{x:.515625,y:.015625},{x:.546875,y:.015625},{x:.546875,y:.015625},{x:.578125,y:.015625},{x:.578125,y:.015625},{x:.609375,y:.015625},{x:.609375,y:.015625},{x:.640625,y:.015625},{x:.640625,y:.015625},{x:.671875,y:.015625},{x:.671875,y:.015625},{x:.703125,y:.015625},{x:.703125,y:.015625},{x:.734375,y:.015625},{x:.734375,y:.015625},{x:.765625,y:.015625},{x:.765625,y:.015625},{x:.796875,y:.015625},{x:.796875,y:.015625},{x:.828125,y:.015625},{x:.828125,y:.015625},{x:.859375,y:.015625},{x:.859375,y:.015625},{x:.890625,y:.015625},{x:.890625,y:.015625},{x:.921875,y:.015625},{x:.921875,y:.015625},{x:.953125,y:.015625},{x:.953125,y:.015625},{x:.984375,y:.015625},{x:.984375,y:.015625},{x:.015625,y:.046875},{x:.015625,y:.046875},{x:.046875,y:.046875},{x:.046875,y:.046875},{x:.078125,y:.046875},{x:.078125,y:.046875},{x:.109375,y:.046875},{x:.109375,y:.046875},{x:.140625,y:.046875},{x:.140625,y:.046875},{x:.171875,y:.046875},{x:.171875,y:.046875},{x:.203125,y:.046875},{x:.203125,y:.046875},{x:.234375,y:.046875},{x:.234375,y:.046875},{x:.265625,y:.046875},{x:.265625,y:.046875},{x:.296875,y:.046875},{x:.296875,y:.046875},{x:.328125,y:.046875},{x:.328125,y:.046875},{x:.359375,y:.046875},{x:.359375,y:.046875},{x:.390625,y:.046875},{x:.390625,y:.046875},{x:.421875,y:.046875},{x:.421875,y:.046875},{x:.453125,y:.046875},{x:.453125,y:.046875},{x:.484375,y:.046875},{x:.484375,y:.046875},{x:.515625,y:.046875},{x:.515625,y:.046875},{x:.546875,y:.046875},{x:.546875,y:.046875},{x:.578125,y:.046875},{x:.578125,y:.046875},{x:.609375,y:.046875},{x:.609375,y:.046875},{x:.640625,y:.046875},{x:.640625,y:.046875},{x:.671875,y:.046875},{x:.671875,y:.046875},{x:.703125,y:.046875},{x:.703125,y:.046875},{x:.734375,y:.046875},{x:.734375,y:.046875},{x:.765625,y:.046875},{x:.765625,y:.046875},{x:.796875,y:.046875},{x:.796875,y:.046875},{x:.828125,y:.046875},{x:.828125,y:.046875},{x:.859375,y:.046875},{x:.859375,y:.046875},{x:.890625,y:.046875},{x:.890625,y:.046875},{x:.921875,y:.046875},{x:.921875,y:.046875},{x:.953125,y:.046875},{x:.953125,y:.046875},{x:.984375,y:.046875},{x:.984375,y:.046875},{x:.015625,y:.078125},{x:.015625,y:.078125},{x:.046875,y:.078125},{x:.046875,y:.078125},{x:.078125,y:.078125},{x:.078125,y:.078125},{x:.109375,y:.078125},{x:.109375,y:.078125},{x:.140625,y:.078125},{x:.140625,y:.078125},{x:.171875,y:.078125},{x:.171875,y:.078125},{x:.203125,y:.078125},{x:.203125,y:.078125},{x:.234375,y:.078125},{x:.234375,y:.078125},{x:.265625,y:.078125},{x:.265625,y:.078125},{x:.296875,y:.078125},{x:.296875,y:.078125},{x:.328125,y:.078125},{x:.328125,y:.078125},{x:.359375,y:.078125},{x:.359375,y:.078125},{x:.390625,y:.078125},{x:.390625,y:.078125},{x:.421875,y:.078125},{x:.421875,y:.078125},{x:.453125,y:.078125},{x:.453125,y:.078125},{x:.484375,y:.078125},{x:.484375,y:.078125},{x:.515625,y:.078125},{x:.515625,y:.078125},{x:.546875,y:.078125},{x:.546875,y:.078125},{x:.578125,y:.078125},{x:.578125,y:.078125},{x:.609375,y:.078125},{x:.609375,y:.078125},{x:.640625,y:.078125},{x:.640625,y:.078125},{x:.671875,y:.078125},{x:.671875,y:.078125},{x:.703125,y:.078125},{x:.703125,y:.078125},{x:.734375,y:.078125},{x:.734375,y:.078125},{x:.765625,y:.078125},{x:.765625,y:.078125},{x:.796875,y:.078125},{x:.796875,y:.078125},{x:.828125,y:.078125},{x:.828125,y:.078125},{x:.859375,y:.078125},{x:.859375,y:.078125},{x:.890625,y:.078125},{x:.890625,y:.078125},{x:.921875,y:.078125},{x:.921875,y:.078125},{x:.953125,y:.078125},{x:.953125,y:.078125},{x:.984375,y:.078125},{x:.984375,y:.078125},{x:.015625,y:.109375},{x:.015625,y:.109375},{x:.046875,y:.109375},{x:.046875,y:.109375},{x:.078125,y:.109375},{x:.078125,y:.109375},{x:.109375,y:.109375},{x:.109375,y:.109375},{x:.140625,y:.109375},{x:.140625,y:.109375},{x:.171875,y:.109375},{x:.171875,y:.109375},{x:.203125,y:.109375},{x:.203125,y:.109375},{x:.234375,y:.109375},{x:.234375,y:.109375},{x:.265625,y:.109375},{x:.265625,y:.109375},{x:.296875,y:.109375},{x:.296875,y:.109375},{x:.328125,y:.109375},{x:.328125,y:.109375},{x:.359375,y:.109375},{x:.359375,y:.109375},{x:.390625,y:.109375},{x:.390625,y:.109375},{x:.421875,y:.109375},{x:.421875,y:.109375},{x:.453125,y:.109375},{x:.453125,y:.109375},{x:.484375,y:.109375},{x:.484375,y:.109375},{x:.515625,y:.109375},{x:.515625,y:.109375},{x:.546875,y:.109375},{x:.546875,y:.109375},{x:.578125,y:.109375},{x:.578125,y:.109375},{x:.609375,y:.109375},{x:.609375,y:.109375},{x:.640625,y:.109375},{x:.640625,y:.109375},{x:.671875,y:.109375},{x:.671875,y:.109375},{x:.703125,y:.109375},{x:.703125,y:.109375},{x:.734375,y:.109375},{x:.734375,y:.109375},{x:.765625,y:.109375},{x:.765625,y:.109375},{x:.796875,y:.109375},{x:.796875,y:.109375},{x:.828125,y:.109375},{x:.828125,y:.109375},{x:.859375,y:.109375},{x:.859375,y:.109375},{x:.890625,y:.109375},{x:.890625,y:.109375},{x:.921875,y:.109375},{x:.921875,y:.109375},{x:.953125,y:.109375},{x:.953125,y:.109375},{x:.984375,y:.109375},{x:.984375,y:.109375},{x:.015625,y:.140625},{x:.015625,y:.140625},{x:.046875,y:.140625},{x:.046875,y:.140625},{x:.078125,y:.140625},{x:.078125,y:.140625},{x:.109375,y:.140625},{x:.109375,y:.140625},{x:.140625,y:.140625},{x:.140625,y:.140625},{x:.171875,y:.140625},{x:.171875,y:.140625},{x:.203125,y:.140625},{x:.203125,y:.140625},{x:.234375,y:.140625},{x:.234375,y:.140625},{x:.265625,y:.140625},{x:.265625,y:.140625},{x:.296875,y:.140625},{x:.296875,y:.140625},{x:.328125,y:.140625},{x:.328125,y:.140625},{x:.359375,y:.140625},{x:.359375,y:.140625},{x:.390625,y:.140625},{x:.390625,y:.140625},{x:.421875,y:.140625},{x:.421875,y:.140625},{x:.453125,y:.140625},{x:.453125,y:.140625},{x:.484375,y:.140625},{x:.484375,y:.140625},{x:.515625,y:.140625},{x:.515625,y:.140625},{x:.546875,y:.140625},{x:.546875,y:.140625},{x:.578125,y:.140625},{x:.578125,y:.140625},{x:.609375,y:.140625},{x:.609375,y:.140625},{x:.640625,y:.140625},{x:.640625,y:.140625},{x:.671875,y:.140625},{x:.671875,y:.140625},{x:.703125,y:.140625},{x:.703125,y:.140625},{x:.734375,y:.140625},{x:.734375,y:.140625},{x:.765625,y:.140625},{x:.765625,y:.140625},{x:.796875,y:.140625},{x:.796875,y:.140625},{x:.828125,y:.140625},{x:.828125,y:.140625},{x:.859375,y:.140625},{x:.859375,y:.140625},{x:.890625,y:.140625},{x:.890625,y:.140625},{x:.921875,y:.140625},{x:.921875,y:.140625},{x:.953125,y:.140625},{x:.953125,y:.140625},{x:.984375,y:.140625},{x:.984375,y:.140625},{x:.015625,y:.171875},{x:.015625,y:.171875},{x:.046875,y:.171875},{x:.046875,y:.171875},{x:.078125,y:.171875},{x:.078125,y:.171875},{x:.109375,y:.171875},{x:.109375,y:.171875},{x:.140625,y:.171875},{x:.140625,y:.171875},{x:.171875,y:.171875},{x:.171875,y:.171875},{x:.203125,y:.171875},{x:.203125,y:.171875},{x:.234375,y:.171875},{x:.234375,y:.171875},{x:.265625,y:.171875},{x:.265625,y:.171875},{x:.296875,y:.171875},{x:.296875,y:.171875},{x:.328125,y:.171875},{x:.328125,y:.171875},{x:.359375,y:.171875},{x:.359375,y:.171875},{x:.390625,y:.171875},{x:.390625,y:.171875},{x:.421875,y:.171875},{x:.421875,y:.171875},{x:.453125,y:.171875},{x:.453125,y:.171875},{x:.484375,y:.171875},{x:.484375,y:.171875},{x:.515625,y:.171875},{x:.515625,y:.171875},{x:.546875,y:.171875},{x:.546875,y:.171875},{x:.578125,y:.171875},{x:.578125,y:.171875},{x:.609375,y:.171875},{x:.609375,y:.171875},{x:.640625,y:.171875},{x:.640625,y:.171875},{x:.671875,y:.171875},{x:.671875,y:.171875},{x:.703125,y:.171875},{x:.703125,y:.171875},{x:.734375,y:.171875},{x:.734375,y:.171875},{x:.765625,y:.171875},{x:.765625,y:.171875},{x:.796875,y:.171875},{x:.796875,y:.171875},{x:.828125,y:.171875},{x:.828125,y:.171875},{x:.859375,y:.171875},{x:.859375,y:.171875},{x:.890625,y:.171875},{x:.890625,y:.171875},{x:.921875,y:.171875},{x:.921875,y:.171875},{x:.953125,y:.171875},{x:.953125,y:.171875},{x:.984375,y:.171875},{x:.984375,y:.171875},{x:.015625,y:.203125},{x:.015625,y:.203125},{x:.046875,y:.203125},{x:.046875,y:.203125},{x:.078125,y:.203125},{x:.078125,y:.203125},{x:.109375,y:.203125},{x:.109375,y:.203125},{x:.140625,y:.203125},{x:.140625,y:.203125},{x:.171875,y:.203125},{x:.171875,y:.203125},{x:.203125,y:.203125},{x:.203125,y:.203125},{x:.234375,y:.203125},{x:.234375,y:.203125},{x:.265625,y:.203125},{x:.265625,y:.203125},{x:.296875,y:.203125},{x:.296875,y:.203125},{x:.328125,y:.203125},{x:.328125,y:.203125},{x:.359375,y:.203125},{x:.359375,y:.203125},{x:.390625,y:.203125},{x:.390625,y:.203125},{x:.421875,y:.203125},{x:.421875,y:.203125},{x:.453125,y:.203125},{x:.453125,y:.203125},{x:.484375,y:.203125},{x:.484375,y:.203125},{x:.515625,y:.203125},{x:.515625,y:.203125},{x:.546875,y:.203125},{x:.546875,y:.203125},{x:.578125,y:.203125},{x:.578125,y:.203125},{x:.609375,y:.203125},{x:.609375,y:.203125},{x:.640625,y:.203125},{x:.640625,y:.203125},{x:.671875,y:.203125},{x:.671875,y:.203125},{x:.703125,y:.203125},{x:.703125,y:.203125},{x:.734375,y:.203125},{x:.734375,y:.203125},{x:.765625,y:.203125},{x:.765625,y:.203125},{x:.796875,y:.203125},{x:.796875,y:.203125},{x:.828125,y:.203125},{x:.828125,y:.203125},{x:.859375,y:.203125},{x:.859375,y:.203125},{x:.890625,y:.203125},{x:.890625,y:.203125},{x:.921875,y:.203125},{x:.921875,y:.203125},{x:.953125,y:.203125},{x:.953125,y:.203125},{x:.984375,y:.203125},{x:.984375,y:.203125},{x:.015625,y:.234375},{x:.015625,y:.234375},{x:.046875,y:.234375},{x:.046875,y:.234375},{x:.078125,y:.234375},{x:.078125,y:.234375},{x:.109375,y:.234375},{x:.109375,y:.234375},{x:.140625,y:.234375},{x:.140625,y:.234375},{x:.171875,y:.234375},{x:.171875,y:.234375},{x:.203125,y:.234375},{x:.203125,y:.234375},{x:.234375,y:.234375},{x:.234375,y:.234375},{x:.265625,y:.234375},{x:.265625,y:.234375},{x:.296875,y:.234375},{x:.296875,y:.234375},{x:.328125,y:.234375},{x:.328125,y:.234375},{x:.359375,y:.234375},{x:.359375,y:.234375},{x:.390625,y:.234375},{x:.390625,y:.234375},{x:.421875,y:.234375},{x:.421875,y:.234375},{x:.453125,y:.234375},{x:.453125,y:.234375},{x:.484375,y:.234375},{x:.484375,y:.234375},{x:.515625,y:.234375},{x:.515625,y:.234375},{x:.546875,y:.234375},{x:.546875,y:.234375},{x:.578125,y:.234375},{x:.578125,y:.234375},{x:.609375,y:.234375},{x:.609375,y:.234375},{x:.640625,y:.234375},{x:.640625,y:.234375},{x:.671875,y:.234375},{x:.671875,y:.234375},{x:.703125,y:.234375},{x:.703125,y:.234375},{x:.734375,y:.234375},{x:.734375,y:.234375},{x:.765625,y:.234375},{x:.765625,y:.234375},{x:.796875,y:.234375},{x:.796875,y:.234375},{x:.828125,y:.234375},{x:.828125,y:.234375},{x:.859375,y:.234375},{x:.859375,y:.234375},{x:.890625,y:.234375},{x:.890625,y:.234375},{x:.921875,y:.234375},{x:.921875,y:.234375},{x:.953125,y:.234375},{x:.953125,y:.234375},{x:.984375,y:.234375},{x:.984375,y:.234375},{x:.015625,y:.265625},{x:.015625,y:.265625},{x:.046875,y:.265625},{x:.046875,y:.265625},{x:.078125,y:.265625},{x:.078125,y:.265625},{x:.109375,y:.265625},{x:.109375,y:.265625},{x:.140625,y:.265625},{x:.140625,y:.265625},{x:.171875,y:.265625},{x:.171875,y:.265625},{x:.203125,y:.265625},{x:.203125,y:.265625},{x:.234375,y:.265625},{x:.234375,y:.265625},{x:.265625,y:.265625},{x:.265625,y:.265625},{x:.296875,y:.265625},{x:.296875,y:.265625},{x:.328125,y:.265625},{x:.328125,y:.265625},{x:.359375,y:.265625},{x:.359375,y:.265625},{x:.390625,y:.265625},{x:.390625,y:.265625},{x:.421875,y:.265625},{x:.421875,y:.265625},{x:.453125,y:.265625},{x:.453125,y:.265625},{x:.484375,y:.265625},{x:.484375,y:.265625},{x:.515625,y:.265625},{x:.515625,y:.265625},{x:.546875,y:.265625},{x:.546875,y:.265625},{x:.578125,y:.265625},{x:.578125,y:.265625},{x:.609375,y:.265625},{x:.609375,y:.265625},{x:.640625,y:.265625},{x:.640625,y:.265625},{x:.671875,y:.265625},{x:.671875,y:.265625},{x:.703125,y:.265625},{x:.703125,y:.265625},{x:.734375,y:.265625},{x:.734375,y:.265625},{x:.765625,y:.265625},{x:.765625,y:.265625},{x:.796875,y:.265625},{x:.796875,y:.265625},{x:.828125,y:.265625},{x:.828125,y:.265625},{x:.859375,y:.265625},{x:.859375,y:.265625},{x:.890625,y:.265625},{x:.890625,y:.265625},{x:.921875,y:.265625},{x:.921875,y:.265625},{x:.953125,y:.265625},{x:.953125,y:.265625},{x:.984375,y:.265625},{x:.984375,y:.265625},{x:.015625,y:.296875},{x:.015625,y:.296875},{x:.046875,y:.296875},{x:.046875,y:.296875},{x:.078125,y:.296875},{x:.078125,y:.296875},{x:.109375,y:.296875},{x:.109375,y:.296875},{x:.140625,y:.296875},{x:.140625,y:.296875},{x:.171875,y:.296875},{x:.171875,y:.296875},{x:.203125,y:.296875},{x:.203125,y:.296875},{x:.234375,y:.296875},{x:.234375,y:.296875},{x:.265625,y:.296875},{x:.265625,y:.296875},{x:.296875,y:.296875},{x:.296875,y:.296875},{x:.328125,y:.296875},{x:.328125,y:.296875},{x:.359375,y:.296875},{x:.359375,y:.296875},{x:.390625,y:.296875},{x:.390625,y:.296875},{x:.421875,y:.296875},{x:.421875,y:.296875},{x:.453125,y:.296875},{x:.453125,y:.296875},{x:.484375,y:.296875},{x:.484375,y:.296875},{x:.515625,y:.296875},{x:.515625,y:.296875},{x:.546875,y:.296875},{x:.546875,y:.296875},{x:.578125,y:.296875},{x:.578125,y:.296875},{x:.609375,y:.296875},{x:.609375,y:.296875},{x:.640625,y:.296875},{x:.640625,y:.296875},{x:.671875,y:.296875},{x:.671875,y:.296875},{x:.703125,y:.296875},{x:.703125,y:.296875},{x:.734375,y:.296875},{x:.734375,y:.296875},{x:.765625,y:.296875},{x:.765625,y:.296875},{x:.796875,y:.296875},{x:.796875,y:.296875},{x:.828125,y:.296875},{x:.828125,y:.296875},{x:.859375,y:.296875},{x:.859375,y:.296875},{x:.890625,y:.296875},{x:.890625,y:.296875},{x:.921875,y:.296875},{x:.921875,y:.296875},{x:.953125,y:.296875},{x:.953125,y:.296875},{x:.984375,y:.296875},{x:.984375,y:.296875},{x:.015625,y:.328125},{x:.015625,y:.328125},{x:.046875,y:.328125},{x:.046875,y:.328125},{x:.078125,y:.328125},{x:.078125,y:.328125},{x:.109375,y:.328125},{x:.109375,y:.328125},{x:.140625,y:.328125},{x:.140625,y:.328125},{x:.171875,y:.328125},{x:.171875,y:.328125},{x:.203125,y:.328125},{x:.203125,y:.328125},{x:.234375,y:.328125},{x:.234375,y:.328125},{x:.265625,y:.328125},{x:.265625,y:.328125},{x:.296875,y:.328125},{x:.296875,y:.328125},{x:.328125,y:.328125},{x:.328125,y:.328125},{x:.359375,y:.328125},{x:.359375,y:.328125},{x:.390625,y:.328125},{x:.390625,y:.328125},{x:.421875,y:.328125},{x:.421875,y:.328125},{x:.453125,y:.328125},{x:.453125,y:.328125},{x:.484375,y:.328125},{x:.484375,y:.328125},{x:.515625,y:.328125},{x:.515625,y:.328125},{x:.546875,y:.328125},{x:.546875,y:.328125},{x:.578125,y:.328125},{x:.578125,y:.328125},{x:.609375,y:.328125},{x:.609375,y:.328125},{x:.640625,y:.328125},{x:.640625,y:.328125},{x:.671875,y:.328125},{x:.671875,y:.328125},{x:.703125,y:.328125},{x:.703125,y:.328125},{x:.734375,y:.328125},{x:.734375,y:.328125},{x:.765625,y:.328125},{x:.765625,y:.328125},{x:.796875,y:.328125},{x:.796875,y:.328125},{x:.828125,y:.328125},{x:.828125,y:.328125},{x:.859375,y:.328125},{x:.859375,y:.328125},{x:.890625,y:.328125},{x:.890625,y:.328125},{x:.921875,y:.328125},{x:.921875,y:.328125},{x:.953125,y:.328125},{x:.953125,y:.328125},{x:.984375,y:.328125},{x:.984375,y:.328125},{x:.015625,y:.359375},{x:.015625,y:.359375},{x:.046875,y:.359375},{x:.046875,y:.359375},{x:.078125,y:.359375},{x:.078125,y:.359375},{x:.109375,y:.359375},{x:.109375,y:.359375},{x:.140625,y:.359375},{x:.140625,y:.359375},{x:.171875,y:.359375},{x:.171875,y:.359375},{x:.203125,y:.359375},{x:.203125,y:.359375},{x:.234375,y:.359375},{x:.234375,y:.359375},{x:.265625,y:.359375},{x:.265625,y:.359375},{x:.296875,y:.359375},{x:.296875,y:.359375},{x:.328125,y:.359375},{x:.328125,y:.359375},{x:.359375,y:.359375},{x:.359375,y:.359375},{x:.390625,y:.359375},{x:.390625,y:.359375},{x:.421875,y:.359375},{x:.421875,y:.359375},{x:.453125,y:.359375},{x:.453125,y:.359375},{x:.484375,y:.359375},{x:.484375,y:.359375},{x:.515625,y:.359375},{x:.515625,y:.359375},{x:.546875,y:.359375},{x:.546875,y:.359375},{x:.578125,y:.359375},{x:.578125,y:.359375},{x:.609375,y:.359375},{x:.609375,y:.359375},{x:.640625,y:.359375},{x:.640625,y:.359375},{x:.671875,y:.359375},{x:.671875,y:.359375},{x:.703125,y:.359375},{x:.703125,y:.359375},{x:.734375,y:.359375},{x:.734375,y:.359375},{x:.765625,y:.359375},{x:.765625,y:.359375},{x:.796875,y:.359375},{x:.796875,y:.359375},{x:.828125,y:.359375},{x:.828125,y:.359375},{x:.859375,y:.359375},{x:.859375,y:.359375},{x:.890625,y:.359375},{x:.890625,y:.359375},{x:.921875,y:.359375},{x:.921875,y:.359375},{x:.953125,y:.359375},{x:.953125,y:.359375},{x:.984375,y:.359375},{x:.984375,y:.359375},{x:.015625,y:.390625},{x:.015625,y:.390625},{x:.046875,y:.390625},{x:.046875,y:.390625},{x:.078125,y:.390625},{x:.078125,y:.390625},{x:.109375,y:.390625},{x:.109375,y:.390625},{x:.140625,y:.390625},{x:.140625,y:.390625},{x:.171875,y:.390625},{x:.171875,y:.390625},{x:.203125,y:.390625},{x:.203125,y:.390625},{x:.234375,y:.390625},{x:.234375,y:.390625},{x:.265625,y:.390625},{x:.265625,y:.390625},{x:.296875,y:.390625},{x:.296875,y:.390625},{x:.328125,y:.390625},{x:.328125,y:.390625},{x:.359375,y:.390625},{x:.359375,y:.390625},{x:.390625,y:.390625},{x:.390625,y:.390625},{x:.421875,y:.390625},{x:.421875,y:.390625},{x:.453125,y:.390625},{x:.453125,y:.390625},{x:.484375,y:.390625},{x:.484375,y:.390625},{x:.515625,y:.390625},{x:.515625,y:.390625},{x:.546875,y:.390625},{x:.546875,y:.390625},{x:.578125,y:.390625},{x:.578125,y:.390625},{x:.609375,y:.390625},{x:.609375,y:.390625},{x:.640625,y:.390625},{x:.640625,y:.390625},{x:.671875,y:.390625},{x:.671875,y:.390625},{x:.703125,y:.390625},{x:.703125,y:.390625},{x:.734375,y:.390625},{x:.734375,y:.390625},{x:.765625,y:.390625},{x:.765625,y:.390625},{x:.796875,y:.390625},{x:.796875,y:.390625},{x:.828125,y:.390625},{x:.828125,y:.390625},{x:.859375,y:.390625},{x:.859375,y:.390625},{x:.890625,y:.390625},{x:.890625,y:.390625},{x:.921875,y:.390625},{x:.921875,y:.390625},{x:.953125,y:.390625},{x:.953125,y:.390625},{x:.984375,y:.390625},{x:.984375,y:.390625},{x:.015625,y:.421875},{x:.015625,y:.421875},{x:.046875,y:.421875},{x:.046875,y:.421875},{x:.078125,y:.421875},{x:.078125,y:.421875},{x:.109375,y:.421875},{x:.109375,y:.421875},{x:.140625,y:.421875},{x:.140625,y:.421875},{x:.171875,y:.421875},{x:.171875,y:.421875},{x:.203125,y:.421875},{x:.203125,y:.421875},{x:.234375,y:.421875},{x:.234375,y:.421875},{x:.265625,y:.421875},{x:.265625,y:.421875},{x:.296875,y:.421875},{x:.296875,y:.421875},{x:.328125,y:.421875},{x:.328125,y:.421875},{x:.359375,y:.421875},{x:.359375,y:.421875},{x:.390625,y:.421875},{x:.390625,y:.421875},{x:.421875,y:.421875},{x:.421875,y:.421875},{x:.453125,y:.421875},{x:.453125,y:.421875},{x:.484375,y:.421875},{x:.484375,y:.421875},{x:.515625,y:.421875},{x:.515625,y:.421875},{x:.546875,y:.421875},{x:.546875,y:.421875},{x:.578125,y:.421875},{x:.578125,y:.421875},{x:.609375,y:.421875},{x:.609375,y:.421875},{x:.640625,y:.421875},{x:.640625,y:.421875},{x:.671875,y:.421875},{x:.671875,y:.421875},{x:.703125,y:.421875},{x:.703125,y:.421875},{x:.734375,y:.421875},{x:.734375,y:.421875},{x:.765625,y:.421875},{x:.765625,y:.421875},{x:.796875,y:.421875},{x:.796875,y:.421875},{x:.828125,y:.421875},{x:.828125,y:.421875},{x:.859375,y:.421875},{x:.859375,y:.421875},{x:.890625,y:.421875},{x:.890625,y:.421875},{x:.921875,y:.421875},{x:.921875,y:.421875},{x:.953125,y:.421875},{x:.953125,y:.421875},{x:.984375,y:.421875},{x:.984375,y:.421875},{x:.015625,y:.453125},{x:.015625,y:.453125},{x:.046875,y:.453125},{x:.046875,y:.453125},{x:.078125,y:.453125},{x:.078125,y:.453125},{x:.109375,y:.453125},{x:.109375,y:.453125},{x:.140625,y:.453125},{x:.140625,y:.453125},{x:.171875,y:.453125},{x:.171875,y:.453125},{x:.203125,y:.453125},{x:.203125,y:.453125},{x:.234375,y:.453125},{x:.234375,y:.453125},{x:.265625,y:.453125},{x:.265625,y:.453125},{x:.296875,y:.453125},{x:.296875,y:.453125},{x:.328125,y:.453125},{x:.328125,y:.453125},{x:.359375,y:.453125},{x:.359375,y:.453125},{x:.390625,y:.453125},{x:.390625,y:.453125},{x:.421875,y:.453125},{x:.421875,y:.453125},{x:.453125,y:.453125},{x:.453125,y:.453125},{x:.484375,y:.453125},{x:.484375,y:.453125},{x:.515625,y:.453125},{x:.515625,y:.453125},{x:.546875,y:.453125},{x:.546875,y:.453125},{x:.578125,y:.453125},{x:.578125,y:.453125},{x:.609375,y:.453125},{x:.609375,y:.453125},{x:.640625,y:.453125},{x:.640625,y:.453125},{x:.671875,y:.453125},{x:.671875,y:.453125},{x:.703125,y:.453125},{x:.703125,y:.453125},{x:.734375,y:.453125},{x:.734375,y:.453125},{x:.765625,y:.453125},{x:.765625,y:.453125},{x:.796875,y:.453125},{x:.796875,y:.453125},{x:.828125,y:.453125},{x:.828125,y:.453125},{x:.859375,y:.453125},{x:.859375,y:.453125},{x:.890625,y:.453125},{x:.890625,y:.453125},{x:.921875,y:.453125},{x:.921875,y:.453125},{x:.953125,y:.453125},{x:.953125,y:.453125},{x:.984375,y:.453125},{x:.984375,y:.453125},{x:.015625,y:.484375},{x:.015625,y:.484375},{x:.046875,y:.484375},{x:.046875,y:.484375},{x:.078125,y:.484375},{x:.078125,y:.484375},{x:.109375,y:.484375},{x:.109375,y:.484375},{x:.140625,y:.484375},{x:.140625,y:.484375},{x:.171875,y:.484375},{x:.171875,y:.484375},{x:.203125,y:.484375},{x:.203125,y:.484375},{x:.234375,y:.484375},{x:.234375,y:.484375},{x:.265625,y:.484375},{x:.265625,y:.484375},{x:.296875,y:.484375},{x:.296875,y:.484375},{x:.328125,y:.484375},{x:.328125,y:.484375},{x:.359375,y:.484375},{x:.359375,y:.484375},{x:.390625,y:.484375},{x:.390625,y:.484375},{x:.421875,y:.484375},{x:.421875,y:.484375},{x:.453125,y:.484375},{x:.453125,y:.484375},{x:.484375,y:.484375},{x:.484375,y:.484375},{x:.515625,y:.484375},{x:.515625,y:.484375},{x:.546875,y:.484375},{x:.546875,y:.484375},{x:.578125,y:.484375},{x:.578125,y:.484375},{x:.609375,y:.484375},{x:.609375,y:.484375},{x:.640625,y:.484375},{x:.640625,y:.484375},{x:.671875,y:.484375},{x:.671875,y:.484375},{x:.703125,y:.484375},{x:.703125,y:.484375},{x:.734375,y:.484375},{x:.734375,y:.484375},{x:.765625,y:.484375},{x:.765625,y:.484375},{x:.796875,y:.484375},{x:.796875,y:.484375},{x:.828125,y:.484375},{x:.828125,y:.484375},{x:.859375,y:.484375},{x:.859375,y:.484375},{x:.890625,y:.484375},{x:.890625,y:.484375},{x:.921875,y:.484375},{x:.921875,y:.484375},{x:.953125,y:.484375},{x:.953125,y:.484375},{x:.984375,y:.484375},{x:.984375,y:.484375},{x:.015625,y:.515625},{x:.015625,y:.515625},{x:.046875,y:.515625},{x:.046875,y:.515625},{x:.078125,y:.515625},{x:.078125,y:.515625},{x:.109375,y:.515625},{x:.109375,y:.515625},{x:.140625,y:.515625},{x:.140625,y:.515625},{x:.171875,y:.515625},{x:.171875,y:.515625},{x:.203125,y:.515625},{x:.203125,y:.515625},{x:.234375,y:.515625},{x:.234375,y:.515625},{x:.265625,y:.515625},{x:.265625,y:.515625},{x:.296875,y:.515625},{x:.296875,y:.515625},{x:.328125,y:.515625},{x:.328125,y:.515625},{x:.359375,y:.515625},{x:.359375,y:.515625},{x:.390625,y:.515625},{x:.390625,y:.515625},{x:.421875,y:.515625},{x:.421875,y:.515625},{x:.453125,y:.515625},{x:.453125,y:.515625},{x:.484375,y:.515625},{x:.484375,y:.515625},{x:.515625,y:.515625},{x:.515625,y:.515625},{x:.546875,y:.515625},{x:.546875,y:.515625},{x:.578125,y:.515625},{x:.578125,y:.515625},{x:.609375,y:.515625},{x:.609375,y:.515625},{x:.640625,y:.515625},{x:.640625,y:.515625},{x:.671875,y:.515625},{x:.671875,y:.515625},{x:.703125,y:.515625},{x:.703125,y:.515625},{x:.734375,y:.515625},{x:.734375,y:.515625},{x:.765625,y:.515625},{x:.765625,y:.515625},{x:.796875,y:.515625},{x:.796875,y:.515625},{x:.828125,y:.515625},{x:.828125,y:.515625},{x:.859375,y:.515625},{x:.859375,y:.515625},{x:.890625,y:.515625},{x:.890625,y:.515625},{x:.921875,y:.515625},{x:.921875,y:.515625},{x:.953125,y:.515625},{x:.953125,y:.515625},{x:.984375,y:.515625},{x:.984375,y:.515625},{x:.015625,y:.546875},{x:.015625,y:.546875},{x:.046875,y:.546875},{x:.046875,y:.546875},{x:.078125,y:.546875},{x:.078125,y:.546875},{x:.109375,y:.546875},{x:.109375,y:.546875},{x:.140625,y:.546875},{x:.140625,y:.546875},{x:.171875,y:.546875},{x:.171875,y:.546875},{x:.203125,y:.546875},{x:.203125,y:.546875},{x:.234375,y:.546875},{x:.234375,y:.546875},{x:.265625,y:.546875},{x:.265625,y:.546875},{x:.296875,y:.546875},{x:.296875,y:.546875},{x:.328125,y:.546875},{x:.328125,y:.546875},{x:.359375,y:.546875},{x:.359375,y:.546875},{x:.390625,y:.546875},{x:.390625,y:.546875},{x:.421875,y:.546875},{x:.421875,y:.546875},{x:.453125,y:.546875},{x:.453125,y:.546875},{x:.484375,y:.546875},{x:.484375,y:.546875},{x:.515625,y:.546875},{x:.515625,y:.546875},{x:.546875,y:.546875},{x:.546875,y:.546875},{x:.578125,y:.546875},{x:.578125,y:.546875},{x:.609375,y:.546875},{x:.609375,y:.546875},{x:.640625,y:.546875},{x:.640625,y:.546875},{x:.671875,y:.546875},{x:.671875,y:.546875},{x:.703125,y:.546875},{x:.703125,y:.546875},{x:.734375,y:.546875},{x:.734375,y:.546875},{x:.765625,y:.546875},{x:.765625,y:.546875},{x:.796875,y:.546875},{x:.796875,y:.546875},{x:.828125,y:.546875},{x:.828125,y:.546875},{x:.859375,y:.546875},{x:.859375,y:.546875},{x:.890625,y:.546875},{x:.890625,y:.546875},{x:.921875,y:.546875},{x:.921875,y:.546875},{x:.953125,y:.546875},{x:.953125,y:.546875},{x:.984375,y:.546875},{x:.984375,y:.546875},{x:.015625,y:.578125},{x:.015625,y:.578125},{x:.046875,y:.578125},{x:.046875,y:.578125},{x:.078125,y:.578125},{x:.078125,y:.578125},{x:.109375,y:.578125},{x:.109375,y:.578125},{x:.140625,y:.578125},{x:.140625,y:.578125},{x:.171875,y:.578125},{x:.171875,y:.578125},{x:.203125,y:.578125},{x:.203125,y:.578125},{x:.234375,y:.578125},{x:.234375,y:.578125},{x:.265625,y:.578125},{x:.265625,y:.578125},{x:.296875,y:.578125},{x:.296875,y:.578125},{x:.328125,y:.578125},{x:.328125,y:.578125},{x:.359375,y:.578125},{x:.359375,y:.578125},{x:.390625,y:.578125},{x:.390625,y:.578125},{x:.421875,y:.578125},{x:.421875,y:.578125},{x:.453125,y:.578125},{x:.453125,y:.578125},{x:.484375,y:.578125},{x:.484375,y:.578125},{x:.515625,y:.578125},{x:.515625,y:.578125},{x:.546875,y:.578125},{x:.546875,y:.578125},{x:.578125,y:.578125},{x:.578125,y:.578125},{x:.609375,y:.578125},{x:.609375,y:.578125},{x:.640625,y:.578125},{x:.640625,y:.578125},{x:.671875,y:.578125},{x:.671875,y:.578125},{x:.703125,y:.578125},{x:.703125,y:.578125},{x:.734375,y:.578125},{x:.734375,y:.578125},{x:.765625,y:.578125},{x:.765625,y:.578125},{x:.796875,y:.578125},{x:.796875,y:.578125},{x:.828125,y:.578125},{x:.828125,y:.578125},{x:.859375,y:.578125},{x:.859375,y:.578125},{x:.890625,y:.578125},{x:.890625,y:.578125},{x:.921875,y:.578125},{x:.921875,y:.578125},{x:.953125,y:.578125},{x:.953125,y:.578125},{x:.984375,y:.578125},{x:.984375,y:.578125},{x:.015625,y:.609375},{x:.015625,y:.609375},{x:.046875,y:.609375},{x:.046875,y:.609375},{x:.078125,y:.609375},{x:.078125,y:.609375},{x:.109375,y:.609375},{x:.109375,y:.609375},{x:.140625,y:.609375},{x:.140625,y:.609375},{x:.171875,y:.609375},{x:.171875,y:.609375},{x:.203125,y:.609375},{x:.203125,y:.609375},{x:.234375,y:.609375},{x:.234375,y:.609375},{x:.265625,y:.609375},{x:.265625,y:.609375},{x:.296875,y:.609375},{x:.296875,y:.609375},{x:.328125,y:.609375},{x:.328125,y:.609375},{x:.359375,y:.609375},{x:.359375,y:.609375},{x:.390625,y:.609375},{x:.390625,y:.609375},{x:.421875,y:.609375},{x:.421875,y:.609375},{x:.453125,y:.609375},{x:.453125,y:.609375},{x:.484375,y:.609375},{x:.484375,y:.609375},{x:.515625,y:.609375},{x:.515625,y:.609375},{x:.546875,y:.609375},{x:.546875,y:.609375},{x:.578125,y:.609375},{x:.578125,y:.609375},{x:.609375,y:.609375},{x:.609375,y:.609375},{x:.640625,y:.609375},{x:.640625,y:.609375},{x:.671875,y:.609375},{x:.671875,y:.609375},{x:.703125,y:.609375},{x:.703125,y:.609375},{x:.734375,y:.609375},{x:.734375,y:.609375},{x:.765625,y:.609375},{x:.765625,y:.609375},{x:.796875,y:.609375},{x:.796875,y:.609375},{x:.828125,y:.609375},{x:.828125,y:.609375},{x:.859375,y:.609375},{x:.859375,y:.609375},{x:.890625,y:.609375},{x:.890625,y:.609375},{x:.921875,y:.609375},{x:.921875,y:.609375},{x:.953125,y:.609375},{x:.953125,y:.609375},{x:.984375,y:.609375},{x:.984375,y:.609375},{x:.015625,y:.640625},{x:.015625,y:.640625},{x:.046875,y:.640625},{x:.046875,y:.640625},{x:.078125,y:.640625},{x:.078125,y:.640625},{x:.109375,y:.640625},{x:.109375,y:.640625},{x:.140625,y:.640625},{x:.140625,y:.640625},{x:.171875,y:.640625},{x:.171875,y:.640625},{x:.203125,y:.640625},{x:.203125,y:.640625},{x:.234375,y:.640625},{x:.234375,y:.640625},{x:.265625,y:.640625},{x:.265625,y:.640625},{x:.296875,y:.640625},{x:.296875,y:.640625},{x:.328125,y:.640625},{x:.328125,y:.640625},{x:.359375,y:.640625},{x:.359375,y:.640625},{x:.390625,y:.640625},{x:.390625,y:.640625},{x:.421875,y:.640625},{x:.421875,y:.640625},{x:.453125,y:.640625},{x:.453125,y:.640625},{x:.484375,y:.640625},{x:.484375,y:.640625},{x:.515625,y:.640625},{x:.515625,y:.640625},{x:.546875,y:.640625},{x:.546875,y:.640625},{x:.578125,y:.640625},{x:.578125,y:.640625},{x:.609375,y:.640625},{x:.609375,y:.640625},{x:.640625,y:.640625},{x:.640625,y:.640625},{x:.671875,y:.640625},{x:.671875,y:.640625},{x:.703125,y:.640625},{x:.703125,y:.640625},{x:.734375,y:.640625},{x:.734375,y:.640625},{x:.765625,y:.640625},{x:.765625,y:.640625},{x:.796875,y:.640625},{x:.796875,y:.640625},{x:.828125,y:.640625},{x:.828125,y:.640625},{x:.859375,y:.640625},{x:.859375,y:.640625},{x:.890625,y:.640625},{x:.890625,y:.640625},{x:.921875,y:.640625},{x:.921875,y:.640625},{x:.953125,y:.640625},{x:.953125,y:.640625},{x:.984375,y:.640625},{x:.984375,y:.640625},{x:.015625,y:.671875},{x:.015625,y:.671875},{x:.046875,y:.671875},{x:.046875,y:.671875},{x:.078125,y:.671875},{x:.078125,y:.671875},{x:.109375,y:.671875},{x:.109375,y:.671875},{x:.140625,y:.671875},{x:.140625,y:.671875},{x:.171875,y:.671875},{x:.171875,y:.671875},{x:.203125,y:.671875},{x:.203125,y:.671875},{x:.234375,y:.671875},{x:.234375,y:.671875},{x:.265625,y:.671875},{x:.265625,y:.671875},{x:.296875,y:.671875},{x:.296875,y:.671875},{x:.328125,y:.671875},{x:.328125,y:.671875},{x:.359375,y:.671875},{x:.359375,y:.671875},{x:.390625,y:.671875},{x:.390625,y:.671875},{x:.421875,y:.671875},{x:.421875,y:.671875},{x:.453125,y:.671875},{x:.453125,y:.671875},{x:.484375,y:.671875},{x:.484375,y:.671875},{x:.515625,y:.671875},{x:.515625,y:.671875},{x:.546875,y:.671875},{x:.546875,y:.671875},{x:.578125,y:.671875},{x:.578125,y:.671875},{x:.609375,y:.671875},{x:.609375,y:.671875},{x:.640625,y:.671875},{x:.640625,y:.671875},{x:.671875,y:.671875},{x:.671875,y:.671875},{x:.703125,y:.671875},{x:.703125,y:.671875},{x:.734375,y:.671875},{x:.734375,y:.671875},{x:.765625,y:.671875},{x:.765625,y:.671875},{x:.796875,y:.671875},{x:.796875,y:.671875},{x:.828125,y:.671875},{x:.828125,y:.671875},{x:.859375,y:.671875},{x:.859375,y:.671875},{x:.890625,y:.671875},{x:.890625,y:.671875},{x:.921875,y:.671875},{x:.921875,y:.671875},{x:.953125,y:.671875},{x:.953125,y:.671875},{x:.984375,y:.671875},{x:.984375,y:.671875},{x:.015625,y:.703125},{x:.015625,y:.703125},{x:.046875,y:.703125},{x:.046875,y:.703125},{x:.078125,y:.703125},{x:.078125,y:.703125},{x:.109375,y:.703125},{x:.109375,y:.703125},{x:.140625,y:.703125},{x:.140625,y:.703125},{x:.171875,y:.703125},{x:.171875,y:.703125},{x:.203125,y:.703125},{x:.203125,y:.703125},{x:.234375,y:.703125},{x:.234375,y:.703125},{x:.265625,y:.703125},{x:.265625,y:.703125},{x:.296875,y:.703125},{x:.296875,y:.703125},{x:.328125,y:.703125},{x:.328125,y:.703125},{x:.359375,y:.703125},{x:.359375,y:.703125},{x:.390625,y:.703125},{x:.390625,y:.703125},{x:.421875,y:.703125},{x:.421875,y:.703125},{x:.453125,y:.703125},{x:.453125,y:.703125},{x:.484375,y:.703125},{x:.484375,y:.703125},{x:.515625,y:.703125},{x:.515625,y:.703125},{x:.546875,y:.703125},{x:.546875,y:.703125},{x:.578125,y:.703125},{x:.578125,y:.703125},{x:.609375,y:.703125},{x:.609375,y:.703125},{x:.640625,y:.703125},{x:.640625,y:.703125},{x:.671875,y:.703125},{x:.671875,y:.703125},{x:.703125,y:.703125},{x:.703125,y:.703125},{x:.734375,y:.703125},{x:.734375,y:.703125},{x:.765625,y:.703125},{x:.765625,y:.703125},{x:.796875,y:.703125},{x:.796875,y:.703125},{x:.828125,y:.703125},{x:.828125,y:.703125},{x:.859375,y:.703125},{x:.859375,y:.703125},{x:.890625,y:.703125},{x:.890625,y:.703125},{x:.921875,y:.703125},{x:.921875,y:.703125},{x:.953125,y:.703125},{x:.953125,y:.703125},{x:.984375,y:.703125},{x:.984375,y:.703125},{x:.015625,y:.734375},{x:.015625,y:.734375},{x:.046875,y:.734375},{x:.046875,y:.734375},{x:.078125,y:.734375},{x:.078125,y:.734375},{x:.109375,y:.734375},{x:.109375,y:.734375},{x:.140625,y:.734375},{x:.140625,y:.734375},{x:.171875,y:.734375},{x:.171875,y:.734375},{x:.203125,y:.734375},{x:.203125,y:.734375},{x:.234375,y:.734375},{x:.234375,y:.734375},{x:.265625,y:.734375},{x:.265625,y:.734375},{x:.296875,y:.734375},{x:.296875,y:.734375},{x:.328125,y:.734375},{x:.328125,y:.734375},{x:.359375,y:.734375},{x:.359375,y:.734375},{x:.390625,y:.734375},{x:.390625,y:.734375},{x:.421875,y:.734375},{x:.421875,y:.734375},{x:.453125,y:.734375},{x:.453125,y:.734375},{x:.484375,y:.734375},{x:.484375,y:.734375},{x:.515625,y:.734375},{x:.515625,y:.734375},{x:.546875,y:.734375},{x:.546875,y:.734375},{x:.578125,y:.734375},{x:.578125,y:.734375},{x:.609375,y:.734375},{x:.609375,y:.734375},{x:.640625,y:.734375},{x:.640625,y:.734375},{x:.671875,y:.734375},{x:.671875,y:.734375},{x:.703125,y:.734375},{x:.703125,y:.734375},{x:.734375,y:.734375},{x:.734375,y:.734375},{x:.765625,y:.734375},{x:.765625,y:.734375},{x:.796875,y:.734375},{x:.796875,y:.734375},{x:.828125,y:.734375},{x:.828125,y:.734375},{x:.859375,y:.734375},{x:.859375,y:.734375},{x:.890625,y:.734375},{x:.890625,y:.734375},{x:.921875,y:.734375},{x:.921875,y:.734375},{x:.953125,y:.734375},{x:.953125,y:.734375},{x:.984375,y:.734375},{x:.984375,y:.734375},{x:.015625,y:.765625},{x:.015625,y:.765625},{x:.046875,y:.765625},{x:.046875,y:.765625},{x:.078125,y:.765625},{x:.078125,y:.765625},{x:.109375,y:.765625},{x:.109375,y:.765625},{x:.140625,y:.765625},{x:.140625,y:.765625},{x:.171875,y:.765625},{x:.171875,y:.765625},{x:.203125,y:.765625},{x:.203125,y:.765625},{x:.234375,y:.765625},{x:.234375,y:.765625},{x:.265625,y:.765625},{x:.265625,y:.765625},{x:.296875,y:.765625},{x:.296875,y:.765625},{x:.328125,y:.765625},{x:.328125,y:.765625},{x:.359375,y:.765625},{x:.359375,y:.765625},{x:.390625,y:.765625},{x:.390625,y:.765625},{x:.421875,y:.765625},{x:.421875,y:.765625},{x:.453125,y:.765625},{x:.453125,y:.765625},{x:.484375,y:.765625},{x:.484375,y:.765625},{x:.515625,y:.765625},{x:.515625,y:.765625},{x:.546875,y:.765625},{x:.546875,y:.765625},{x:.578125,y:.765625},{x:.578125,y:.765625},{x:.609375,y:.765625},{x:.609375,y:.765625},{x:.640625,y:.765625},{x:.640625,y:.765625},{x:.671875,y:.765625},{x:.671875,y:.765625},{x:.703125,y:.765625},{x:.703125,y:.765625},{x:.734375,y:.765625},{x:.734375,y:.765625},{x:.765625,y:.765625},{x:.765625,y:.765625},{x:.796875,y:.765625},{x:.796875,y:.765625},{x:.828125,y:.765625},{x:.828125,y:.765625},{x:.859375,y:.765625},{x:.859375,y:.765625},{x:.890625,y:.765625},{x:.890625,y:.765625},{x:.921875,y:.765625},{x:.921875,y:.765625},{x:.953125,y:.765625},{x:.953125,y:.765625},{x:.984375,y:.765625},{x:.984375,y:.765625},{x:.015625,y:.796875},{x:.015625,y:.796875},{x:.046875,y:.796875},{x:.046875,y:.796875},{x:.078125,y:.796875},{x:.078125,y:.796875},{x:.109375,y:.796875},{x:.109375,y:.796875},{x:.140625,y:.796875},{x:.140625,y:.796875},{x:.171875,y:.796875},{x:.171875,y:.796875},{x:.203125,y:.796875},{x:.203125,y:.796875},{x:.234375,y:.796875},{x:.234375,y:.796875},{x:.265625,y:.796875},{x:.265625,y:.796875},{x:.296875,y:.796875},{x:.296875,y:.796875},{x:.328125,y:.796875},{x:.328125,y:.796875},{x:.359375,y:.796875},{x:.359375,y:.796875},{x:.390625,y:.796875},{x:.390625,y:.796875},{x:.421875,y:.796875},{x:.421875,y:.796875},{x:.453125,y:.796875},{x:.453125,y:.796875},{x:.484375,y:.796875},{x:.484375,y:.796875},{x:.515625,y:.796875},{x:.515625,y:.796875},{x:.546875,y:.796875},{x:.546875,y:.796875},{x:.578125,y:.796875},{x:.578125,y:.796875},{x:.609375,y:.796875},{x:.609375,y:.796875},{x:.640625,y:.796875},{x:.640625,y:.796875},{x:.671875,y:.796875},{x:.671875,y:.796875},{x:.703125,y:.796875},{x:.703125,y:.796875},{x:.734375,y:.796875},{x:.734375,y:.796875},{x:.765625,y:.796875},{x:.765625,y:.796875},{x:.796875,y:.796875},{x:.796875,y:.796875},{x:.828125,y:.796875},{x:.828125,y:.796875},{x:.859375,y:.796875},{x:.859375,y:.796875},{x:.890625,y:.796875},{x:.890625,y:.796875},{x:.921875,y:.796875},{x:.921875,y:.796875},{x:.953125,y:.796875},{x:.953125,y:.796875},{x:.984375,y:.796875},{x:.984375,y:.796875},{x:.015625,y:.828125},{x:.015625,y:.828125},{x:.046875,y:.828125},{x:.046875,y:.828125},{x:.078125,y:.828125},{x:.078125,y:.828125},{x:.109375,y:.828125},{x:.109375,y:.828125},{x:.140625,y:.828125},{x:.140625,y:.828125},{x:.171875,y:.828125},{x:.171875,y:.828125},{x:.203125,y:.828125},{x:.203125,y:.828125},{x:.234375,y:.828125},{x:.234375,y:.828125},{x:.265625,y:.828125},{x:.265625,y:.828125},{x:.296875,y:.828125},{x:.296875,y:.828125},{x:.328125,y:.828125},{x:.328125,y:.828125},{x:.359375,y:.828125},{x:.359375,y:.828125},{x:.390625,y:.828125},{x:.390625,y:.828125},{x:.421875,y:.828125},{x:.421875,y:.828125},{x:.453125,y:.828125},{x:.453125,y:.828125},{x:.484375,y:.828125},{x:.484375,y:.828125},{x:.515625,y:.828125},{x:.515625,y:.828125},{x:.546875,y:.828125},{x:.546875,y:.828125},{x:.578125,y:.828125},{x:.578125,y:.828125},{x:.609375,y:.828125},{x:.609375,y:.828125},{x:.640625,y:.828125},{x:.640625,y:.828125},{x:.671875,y:.828125},{x:.671875,y:.828125},{x:.703125,y:.828125},{x:.703125,y:.828125},{x:.734375,y:.828125},{x:.734375,y:.828125},{x:.765625,y:.828125},{x:.765625,y:.828125},{x:.796875,y:.828125},{x:.796875,y:.828125},{x:.828125,y:.828125},{x:.828125,y:.828125},{x:.859375,y:.828125},{x:.859375,y:.828125},{x:.890625,y:.828125},{x:.890625,y:.828125},{x:.921875,y:.828125},{x:.921875,y:.828125},{x:.953125,y:.828125},{x:.953125,y:.828125},{x:.984375,y:.828125},{x:.984375,y:.828125},{x:.015625,y:.859375},{x:.015625,y:.859375},{x:.046875,y:.859375},{x:.046875,y:.859375},{x:.078125,y:.859375},{x:.078125,y:.859375},{x:.109375,y:.859375},{x:.109375,y:.859375},{x:.140625,y:.859375},{x:.140625,y:.859375},{x:.171875,y:.859375},{x:.171875,y:.859375},{x:.203125,y:.859375},{x:.203125,y:.859375},{x:.234375,y:.859375},{x:.234375,y:.859375},{x:.265625,y:.859375},{x:.265625,y:.859375},{x:.296875,y:.859375},{x:.296875,y:.859375},{x:.328125,y:.859375},{x:.328125,y:.859375},{x:.359375,y:.859375},{x:.359375,y:.859375},{x:.390625,y:.859375},{x:.390625,y:.859375},{x:.421875,y:.859375},{x:.421875,y:.859375},{x:.453125,y:.859375},{x:.453125,y:.859375},{x:.484375,y:.859375},{x:.484375,y:.859375},{x:.515625,y:.859375},{x:.515625,y:.859375},{x:.546875,y:.859375},{x:.546875,y:.859375},{x:.578125,y:.859375},{x:.578125,y:.859375},{x:.609375,y:.859375},{x:.609375,y:.859375},{x:.640625,y:.859375},{x:.640625,y:.859375},{x:.671875,y:.859375},{x:.671875,y:.859375},{x:.703125,y:.859375},{x:.703125,y:.859375},{x:.734375,y:.859375},{x:.734375,y:.859375},{x:.765625,y:.859375},{x:.765625,y:.859375},{x:.796875,y:.859375},{x:.796875,y:.859375},{x:.828125,y:.859375},{x:.828125,y:.859375},{x:.859375,y:.859375},{x:.859375,y:.859375},{x:.890625,y:.859375},{x:.890625,y:.859375},{x:.921875,y:.859375},{x:.921875,y:.859375},{x:.953125,y:.859375},{x:.953125,y:.859375},{x:.984375,y:.859375},{x:.984375,y:.859375},{x:.015625,y:.890625},{x:.015625,y:.890625},{x:.046875,y:.890625},{x:.046875,y:.890625},{x:.078125,y:.890625},{x:.078125,y:.890625},{x:.109375,y:.890625},{x:.109375,y:.890625},{x:.140625,y:.890625},{x:.140625,y:.890625},{x:.171875,y:.890625},{x:.171875,y:.890625},{x:.203125,y:.890625},{x:.203125,y:.890625},{x:.234375,y:.890625},{x:.234375,y:.890625},{x:.265625,y:.890625},{x:.265625,y:.890625},{x:.296875,y:.890625},{x:.296875,y:.890625},{x:.328125,y:.890625},{x:.328125,y:.890625},{x:.359375,y:.890625},{x:.359375,y:.890625},{x:.390625,y:.890625},{x:.390625,y:.890625},{x:.421875,y:.890625},{x:.421875,y:.890625},{x:.453125,y:.890625},{x:.453125,y:.890625},{x:.484375,y:.890625},{x:.484375,y:.890625},{x:.515625,y:.890625},{x:.515625,y:.890625},{x:.546875,y:.890625},{x:.546875,y:.890625},{x:.578125,y:.890625},{x:.578125,y:.890625},{x:.609375,y:.890625},{x:.609375,y:.890625},{x:.640625,y:.890625},{x:.640625,y:.890625},{x:.671875,y:.890625},{x:.671875,y:.890625},{x:.703125,y:.890625},{x:.703125,y:.890625},{x:.734375,y:.890625},{x:.734375,y:.890625},{x:.765625,y:.890625},{x:.765625,y:.890625},{x:.796875,y:.890625},{x:.796875,y:.890625},{x:.828125,y:.890625},{x:.828125,y:.890625},{x:.859375,y:.890625},{x:.859375,y:.890625},{x:.890625,y:.890625},{x:.890625,y:.890625},{x:.921875,y:.890625},{x:.921875,y:.890625},{x:.953125,y:.890625},{x:.953125,y:.890625},{x:.984375,y:.890625},{x:.984375,y:.890625},{x:.015625,y:.921875},{x:.015625,y:.921875},{x:.046875,y:.921875},{x:.046875,y:.921875},{x:.078125,y:.921875},{x:.078125,y:.921875},{x:.109375,y:.921875},{x:.109375,y:.921875},{x:.140625,y:.921875},{x:.140625,y:.921875},{x:.171875,y:.921875},{x:.171875,y:.921875},{x:.203125,y:.921875},{x:.203125,y:.921875},{x:.234375,y:.921875},{x:.234375,y:.921875},{x:.265625,y:.921875},{x:.265625,y:.921875},{x:.296875,y:.921875},{x:.296875,y:.921875},{x:.328125,y:.921875},{x:.328125,y:.921875},{x:.359375,y:.921875},{x:.359375,y:.921875},{x:.390625,y:.921875},{x:.390625,y:.921875},{x:.421875,y:.921875},{x:.421875,y:.921875},{x:.453125,y:.921875},{x:.453125,y:.921875},{x:.484375,y:.921875},{x:.484375,y:.921875},{x:.515625,y:.921875},{x:.515625,y:.921875},{x:.546875,y:.921875},{x:.546875,y:.921875},{x:.578125,y:.921875},{x:.578125,y:.921875},{x:.609375,y:.921875},{x:.609375,y:.921875},{x:.640625,y:.921875},{x:.640625,y:.921875},{x:.671875,y:.921875},{x:.671875,y:.921875},{x:.703125,y:.921875},{x:.703125,y:.921875},{x:.734375,y:.921875},{x:.734375,y:.921875},{x:.765625,y:.921875},{x:.765625,y:.921875},{x:.796875,y:.921875},{x:.796875,y:.921875},{x:.828125,y:.921875},{x:.828125,y:.921875},{x:.859375,y:.921875},{x:.859375,y:.921875},{x:.890625,y:.921875},{x:.890625,y:.921875},{x:.921875,y:.921875},{x:.921875,y:.921875},{x:.953125,y:.921875},{x:.953125,y:.921875},{x:.984375,y:.921875},{x:.984375,y:.921875},{x:.015625,y:.953125},{x:.015625,y:.953125},{x:.046875,y:.953125},{x:.046875,y:.953125},{x:.078125,y:.953125},{x:.078125,y:.953125},{x:.109375,y:.953125},{x:.109375,y:.953125},{x:.140625,y:.953125},{x:.140625,y:.953125},{x:.171875,y:.953125},{x:.171875,y:.953125},{x:.203125,y:.953125},{x:.203125,y:.953125},{x:.234375,y:.953125},{x:.234375,y:.953125},{x:.265625,y:.953125},{x:.265625,y:.953125},{x:.296875,y:.953125},{x:.296875,y:.953125},{x:.328125,y:.953125},{x:.328125,y:.953125},{x:.359375,y:.953125},{x:.359375,y:.953125},{x:.390625,y:.953125},{x:.390625,y:.953125},{x:.421875,y:.953125},{x:.421875,y:.953125},{x:.453125,y:.953125},{x:.453125,y:.953125},{x:.484375,y:.953125},{x:.484375,y:.953125},{x:.515625,y:.953125},{x:.515625,y:.953125},{x:.546875,y:.953125},{x:.546875,y:.953125},{x:.578125,y:.953125},{x:.578125,y:.953125},{x:.609375,y:.953125},{x:.609375,y:.953125},{x:.640625,y:.953125},{x:.640625,y:.953125},{x:.671875,y:.953125},{x:.671875,y:.953125},{x:.703125,y:.953125},{x:.703125,y:.953125},{x:.734375,y:.953125},{x:.734375,y:.953125},{x:.765625,y:.953125},{x:.765625,y:.953125},{x:.796875,y:.953125},{x:.796875,y:.953125},{x:.828125,y:.953125},{x:.828125,y:.953125},{x:.859375,y:.953125},{x:.859375,y:.953125},{x:.890625,y:.953125},{x:.890625,y:.953125},{x:.921875,y:.953125},{x:.921875,y:.953125},{x:.953125,y:.953125},{x:.953125,y:.953125},{x:.984375,y:.953125},{x:.984375,y:.953125},{x:.015625,y:.984375},{x:.015625,y:.984375},{x:.046875,y:.984375},{x:.046875,y:.984375},{x:.078125,y:.984375},{x:.078125,y:.984375},{x:.109375,y:.984375},{x:.109375,y:.984375},{x:.140625,y:.984375},{x:.140625,y:.984375},{x:.171875,y:.984375},{x:.171875,y:.984375},{x:.203125,y:.984375},{x:.203125,y:.984375},{x:.234375,y:.984375},{x:.234375,y:.984375},{x:.265625,y:.984375},{x:.265625,y:.984375},{x:.296875,y:.984375},{x:.296875,y:.984375},{x:.328125,y:.984375},{x:.328125,y:.984375},{x:.359375,y:.984375},{x:.359375,y:.984375},{x:.390625,y:.984375},{x:.390625,y:.984375},{x:.421875,y:.984375},{x:.421875,y:.984375},{x:.453125,y:.984375},{x:.453125,y:.984375},{x:.484375,y:.984375},{x:.484375,y:.984375},{x:.515625,y:.984375},{x:.515625,y:.984375},{x:.546875,y:.984375},{x:.546875,y:.984375},{x:.578125,y:.984375},{x:.578125,y:.984375},{x:.609375,y:.984375},{x:.609375,y:.984375},{x:.640625,y:.984375},{x:.640625,y:.984375},{x:.671875,y:.984375},{x:.671875,y:.984375},{x:.703125,y:.984375},{x:.703125,y:.984375},{x:.734375,y:.984375},{x:.734375,y:.984375},{x:.765625,y:.984375},{x:.765625,y:.984375},{x:.796875,y:.984375},{x:.796875,y:.984375},{x:.828125,y:.984375},{x:.828125,y:.984375},{x:.859375,y:.984375},{x:.859375,y:.984375},{x:.890625,y:.984375},{x:.890625,y:.984375},{x:.921875,y:.984375},{x:.921875,y:.984375},{x:.953125,y:.984375},{x:.953125,y:.984375},{x:.984375,y:.984375},{x:.984375,y:.984375},{x:.03125,y:.03125},{x:.03125,y:.03125},{x:.09375,y:.03125},{x:.09375,y:.03125},{x:.15625,y:.03125},{x:.15625,y:.03125},{x:.21875,y:.03125},{x:.21875,y:.03125},{x:.28125,y:.03125},{x:.28125,y:.03125},{x:.34375,y:.03125},{x:.34375,y:.03125},{x:.40625,y:.03125},{x:.40625,y:.03125},{x:.46875,y:.03125},{x:.46875,y:.03125},{x:.53125,y:.03125},{x:.53125,y:.03125},{x:.59375,y:.03125},{x:.59375,y:.03125},{x:.65625,y:.03125},{x:.65625,y:.03125},{x:.71875,y:.03125},{x:.71875,y:.03125},{x:.78125,y:.03125},{x:.78125,y:.03125},{x:.84375,y:.03125},{x:.84375,y:.03125},{x:.90625,y:.03125},{x:.90625,y:.03125},{x:.96875,y:.03125},{x:.96875,y:.03125},{x:.03125,y:.09375},{x:.03125,y:.09375},{x:.09375,y:.09375},{x:.09375,y:.09375},{x:.15625,y:.09375},{x:.15625,y:.09375},{x:.21875,y:.09375},{x:.21875,y:.09375},{x:.28125,y:.09375},{x:.28125,y:.09375},{x:.34375,y:.09375},{x:.34375,y:.09375},{x:.40625,y:.09375},{x:.40625,y:.09375},{x:.46875,y:.09375},{x:.46875,y:.09375},{x:.53125,y:.09375},{x:.53125,y:.09375},{x:.59375,y:.09375},{x:.59375,y:.09375},{x:.65625,y:.09375},{x:.65625,y:.09375},{x:.71875,y:.09375},{x:.71875,y:.09375},{x:.78125,y:.09375},{x:.78125,y:.09375},{x:.84375,y:.09375},{x:.84375,y:.09375},{x:.90625,y:.09375},{x:.90625,y:.09375},{x:.96875,y:.09375},{x:.96875,y:.09375},{x:.03125,y:.15625},{x:.03125,y:.15625},{x:.09375,y:.15625},{x:.09375,y:.15625},{x:.15625,y:.15625},{x:.15625,y:.15625},{x:.21875,y:.15625},{x:.21875,y:.15625},{x:.28125,y:.15625},{x:.28125,y:.15625},{x:.34375,y:.15625},{x:.34375,y:.15625},{x:.40625,y:.15625},{x:.40625,y:.15625},{x:.46875,y:.15625},{x:.46875,y:.15625},{x:.53125,y:.15625},{x:.53125,y:.15625},{x:.59375,y:.15625},{x:.59375,y:.15625},{x:.65625,y:.15625},{x:.65625,y:.15625},{x:.71875,y:.15625},{x:.71875,y:.15625},{x:.78125,y:.15625},{x:.78125,y:.15625},{x:.84375,y:.15625},{x:.84375,y:.15625},{x:.90625,y:.15625},{x:.90625,y:.15625},{x:.96875,y:.15625},{x:.96875,y:.15625},{x:.03125,y:.21875},{x:.03125,y:.21875},{x:.09375,y:.21875},{x:.09375,y:.21875},{x:.15625,y:.21875},{x:.15625,y:.21875},{x:.21875,y:.21875},{x:.21875,y:.21875},{x:.28125,y:.21875},{x:.28125,y:.21875},{x:.34375,y:.21875},{x:.34375,y:.21875},{x:.40625,y:.21875},{x:.40625,y:.21875},{x:.46875,y:.21875},{x:.46875,y:.21875},{x:.53125,y:.21875},{x:.53125,y:.21875},{x:.59375,y:.21875},{x:.59375,y:.21875},{x:.65625,y:.21875},{x:.65625,y:.21875},{x:.71875,y:.21875},{x:.71875,y:.21875},{x:.78125,y:.21875},{x:.78125,y:.21875},{x:.84375,y:.21875},{x:.84375,y:.21875},{x:.90625,y:.21875},{x:.90625,y:.21875},{x:.96875,y:.21875},{x:.96875,y:.21875},{x:.03125,y:.28125},{x:.03125,y:.28125},{x:.09375,y:.28125},{x:.09375,y:.28125},{x:.15625,y:.28125},{x:.15625,y:.28125},{x:.21875,y:.28125},{x:.21875,y:.28125},{x:.28125,y:.28125},{x:.28125,y:.28125},{x:.34375,y:.28125},{x:.34375,y:.28125},{x:.40625,y:.28125},{x:.40625,y:.28125},{x:.46875,y:.28125},{x:.46875,y:.28125},{x:.53125,y:.28125},{x:.53125,y:.28125},{x:.59375,y:.28125},{x:.59375,y:.28125},{x:.65625,y:.28125},{x:.65625,y:.28125},{x:.71875,y:.28125},{x:.71875,y:.28125},{x:.78125,y:.28125},{x:.78125,y:.28125},{x:.84375,y:.28125},{x:.84375,y:.28125},{x:.90625,y:.28125},{x:.90625,y:.28125},{x:.96875,y:.28125},{x:.96875,y:.28125},{x:.03125,y:.34375},{x:.03125,y:.34375},{x:.09375,y:.34375},{x:.09375,y:.34375},{x:.15625,y:.34375},{x:.15625,y:.34375},{x:.21875,y:.34375},{x:.21875,y:.34375},{x:.28125,y:.34375},{x:.28125,y:.34375},{x:.34375,y:.34375},{x:.34375,y:.34375},{x:.40625,y:.34375},{x:.40625,y:.34375},{x:.46875,y:.34375},{x:.46875,y:.34375},{x:.53125,y:.34375},{x:.53125,y:.34375},{x:.59375,y:.34375},{x:.59375,y:.34375},{x:.65625,y:.34375},{x:.65625,y:.34375},{x:.71875,y:.34375},{x:.71875,y:.34375},{x:.78125,y:.34375},{x:.78125,y:.34375},{x:.84375,y:.34375},{x:.84375,y:.34375},{x:.90625,y:.34375},{x:.90625,y:.34375},{x:.96875,y:.34375},{x:.96875,y:.34375},{x:.03125,y:.40625},{x:.03125,y:.40625},{x:.09375,y:.40625},{x:.09375,y:.40625},{x:.15625,y:.40625},{x:.15625,y:.40625},{x:.21875,y:.40625},{x:.21875,y:.40625},{x:.28125,y:.40625},{x:.28125,y:.40625},{x:.34375,y:.40625},{x:.34375,y:.40625},{x:.40625,y:.40625},{x:.40625,y:.40625},{x:.46875,y:.40625},{x:.46875,y:.40625},{x:.53125,y:.40625},{x:.53125,y:.40625},{x:.59375,y:.40625},{x:.59375,y:.40625},{x:.65625,y:.40625},{x:.65625,y:.40625},{x:.71875,y:.40625},{x:.71875,y:.40625},{x:.78125,y:.40625},{x:.78125,y:.40625},{x:.84375,y:.40625},{x:.84375,y:.40625},{x:.90625,y:.40625},{x:.90625,y:.40625},{x:.96875,y:.40625},{x:.96875,y:.40625},{x:.03125,y:.46875},{x:.03125,y:.46875},{x:.09375,y:.46875},{x:.09375,y:.46875},{x:.15625,y:.46875},{x:.15625,y:.46875},{x:.21875,y:.46875},{x:.21875,y:.46875},{x:.28125,y:.46875},{x:.28125,y:.46875},{x:.34375,y:.46875},{x:.34375,y:.46875},{x:.40625,y:.46875},{x:.40625,y:.46875},{x:.46875,y:.46875},{x:.46875,y:.46875},{x:.53125,y:.46875},{x:.53125,y:.46875},{x:.59375,y:.46875},{x:.59375,y:.46875},{x:.65625,y:.46875},{x:.65625,y:.46875},{x:.71875,y:.46875},{x:.71875,y:.46875},{x:.78125,y:.46875},{x:.78125,y:.46875},{x:.84375,y:.46875},{x:.84375,y:.46875},{x:.90625,y:.46875},{x:.90625,y:.46875},{x:.96875,y:.46875},{x:.96875,y:.46875},{x:.03125,y:.53125},{x:.03125,y:.53125},{x:.09375,y:.53125},{x:.09375,y:.53125},{x:.15625,y:.53125},{x:.15625,y:.53125},{x:.21875,y:.53125},{x:.21875,y:.53125},{x:.28125,y:.53125},{x:.28125,y:.53125},{x:.34375,y:.53125},{x:.34375,y:.53125},{x:.40625,y:.53125},{x:.40625,y:.53125},{x:.46875,y:.53125},{x:.46875,y:.53125},{x:.53125,y:.53125},{x:.53125,y:.53125},{x:.59375,y:.53125},{x:.59375,y:.53125},{x:.65625,y:.53125},{x:.65625,y:.53125},{x:.71875,y:.53125},{x:.71875,y:.53125},{x:.78125,y:.53125},{x:.78125,y:.53125},{x:.84375,y:.53125},{x:.84375,y:.53125},{x:.90625,y:.53125},{x:.90625,y:.53125},{x:.96875,y:.53125},{x:.96875,y:.53125},{x:.03125,y:.59375},{x:.03125,y:.59375},{x:.09375,y:.59375},{x:.09375,y:.59375},{x:.15625,y:.59375},{x:.15625,y:.59375},{x:.21875,y:.59375},{x:.21875,y:.59375},{x:.28125,y:.59375},{x:.28125,y:.59375},{x:.34375,y:.59375},{x:.34375,y:.59375},{x:.40625,y:.59375},{x:.40625,y:.59375},{x:.46875,y:.59375},{x:.46875,y:.59375},{x:.53125,y:.59375},{x:.53125,y:.59375},{x:.59375,y:.59375},{x:.59375,y:.59375},{x:.65625,y:.59375},{x:.65625,y:.59375},{x:.71875,y:.59375},{x:.71875,y:.59375},{x:.78125,y:.59375},{x:.78125,y:.59375},{x:.84375,y:.59375},{x:.84375,y:.59375},{x:.90625,y:.59375},{x:.90625,y:.59375},{x:.96875,y:.59375},{x:.96875,y:.59375},{x:.03125,y:.65625},{x:.03125,y:.65625},{x:.09375,y:.65625},{x:.09375,y:.65625},{x:.15625,y:.65625},{x:.15625,y:.65625},{x:.21875,y:.65625},{x:.21875,y:.65625},{x:.28125,y:.65625},{x:.28125,y:.65625},{x:.34375,y:.65625},{x:.34375,y:.65625},{x:.40625,y:.65625},{x:.40625,y:.65625},{x:.46875,y:.65625},{x:.46875,y:.65625},{x:.53125,y:.65625},{x:.53125,y:.65625},{x:.59375,y:.65625},{x:.59375,y:.65625},{x:.65625,y:.65625},{x:.65625,y:.65625},{x:.71875,y:.65625},{x:.71875,y:.65625},{x:.78125,y:.65625},{x:.78125,y:.65625},{x:.84375,y:.65625},{x:.84375,y:.65625},{x:.90625,y:.65625},{x:.90625,y:.65625},{x:.96875,y:.65625},{x:.96875,y:.65625},{x:.03125,y:.71875},{x:.03125,y:.71875},{x:.09375,y:.71875},{x:.09375,y:.71875},{x:.15625,y:.71875},{x:.15625,y:.71875},{x:.21875,y:.71875},{x:.21875,y:.71875},{x:.28125,y:.71875},{x:.28125,y:.71875},{x:.34375,y:.71875},{x:.34375,y:.71875},{x:.40625,y:.71875},{x:.40625,y:.71875},{x:.46875,y:.71875},{x:.46875,y:.71875},{x:.53125,y:.71875},{x:.53125,y:.71875},{x:.59375,y:.71875},{x:.59375,y:.71875},{x:.65625,y:.71875},{x:.65625,y:.71875},{x:.71875,y:.71875},{x:.71875,y:.71875},{x:.78125,y:.71875},{x:.78125,y:.71875},{x:.84375,y:.71875},{x:.84375,y:.71875},{x:.90625,y:.71875},{x:.90625,y:.71875},{x:.96875,y:.71875},{x:.96875,y:.71875},{x:.03125,y:.78125},{x:.03125,y:.78125},{x:.09375,y:.78125},{x:.09375,y:.78125},{x:.15625,y:.78125},{x:.15625,y:.78125},{x:.21875,y:.78125},{x:.21875,y:.78125},{x:.28125,y:.78125},{x:.28125,y:.78125},{x:.34375,y:.78125},{x:.34375,y:.78125},{x:.40625,y:.78125},{x:.40625,y:.78125},{x:.46875,y:.78125},{x:.46875,y:.78125},{x:.53125,y:.78125},{x:.53125,y:.78125},{x:.59375,y:.78125},{x:.59375,y:.78125},{x:.65625,y:.78125},{x:.65625,y:.78125},{x:.71875,y:.78125},{x:.71875,y:.78125},{x:.78125,y:.78125},{x:.78125,y:.78125},{x:.84375,y:.78125},{x:.84375,y:.78125},{x:.90625,y:.78125},{x:.90625,y:.78125},{x:.96875,y:.78125},{x:.96875,y:.78125},{x:.03125,y:.84375},{x:.03125,y:.84375},{x:.09375,y:.84375},{x:.09375,y:.84375},{x:.15625,y:.84375},{x:.15625,y:.84375},{x:.21875,y:.84375},{x:.21875,y:.84375},{x:.28125,y:.84375},{x:.28125,y:.84375},{x:.34375,y:.84375},{x:.34375,y:.84375},{x:.40625,y:.84375},{x:.40625,y:.84375},{x:.46875,y:.84375},{x:.46875,y:.84375},{x:.53125,y:.84375},{x:.53125,y:.84375},{x:.59375,y:.84375},{x:.59375,y:.84375},{x:.65625,y:.84375},{x:.65625,y:.84375},{x:.71875,y:.84375},{x:.71875,y:.84375},{x:.78125,y:.84375},{x:.78125,y:.84375},{x:.84375,y:.84375},{x:.84375,y:.84375},{x:.90625,y:.84375},{x:.90625,y:.84375},{x:.96875,y:.84375},{x:.96875,y:.84375},{x:.03125,y:.90625},{x:.03125,y:.90625},{x:.09375,y:.90625},{x:.09375,y:.90625},{x:.15625,y:.90625},{x:.15625,y:.90625},{x:.21875,y:.90625},{x:.21875,y:.90625},{x:.28125,y:.90625},{x:.28125,y:.90625},{x:.34375,y:.90625},{x:.34375,y:.90625},{x:.40625,y:.90625},{x:.40625,y:.90625},{x:.46875,y:.90625},{x:.46875,y:.90625},{x:.53125,y:.90625},{x:.53125,y:.90625},{x:.59375,y:.90625},{x:.59375,y:.90625},{x:.65625,y:.90625},{x:.65625,y:.90625},{x:.71875,y:.90625},{x:.71875,y:.90625},{x:.78125,y:.90625},{x:.78125,y:.90625},{x:.84375,y:.90625},{x:.84375,y:.90625},{x:.90625,y:.90625},{x:.90625,y:.90625},{x:.96875,y:.90625},{x:.96875,y:.90625},{x:.03125,y:.96875},{x:.03125,y:.96875},{x:.09375,y:.96875},{x:.09375,y:.96875},{x:.15625,y:.96875},{x:.15625,y:.96875},{x:.21875,y:.96875},{x:.21875,y:.96875},{x:.28125,y:.96875},{x:.28125,y:.96875},{x:.34375,y:.96875},{x:.34375,y:.96875},{x:.40625,y:.96875},{x:.40625,y:.96875},{x:.46875,y:.96875},{x:.46875,y:.96875},{x:.53125,y:.96875},{x:.53125,y:.96875},{x:.59375,y:.96875},{x:.59375,y:.96875},{x:.65625,y:.96875},{x:.65625,y:.96875},{x:.71875,y:.96875},{x:.71875,y:.96875},{x:.78125,y:.96875},{x:.78125,y:.96875},{x:.84375,y:.96875},{x:.84375,y:.96875},{x:.90625,y:.96875},{x:.90625,y:.96875},{x:.96875,y:.96875},{x:.96875,y:.96875},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.0625,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.1875,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.3125,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.4375,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.5625,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.6875,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.8125,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.9375,y:.0625},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.0625,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.1875,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.3125,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.4375,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.5625,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.6875,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.8125,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.9375,y:.1875},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.0625,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.1875,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.3125,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.4375,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.5625,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.6875,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.8125,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.9375,y:.3125},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.0625,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.1875,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.3125,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.4375,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.5625,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.6875,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.8125,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.9375,y:.4375},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.0625,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.1875,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.3125,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.4375,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.5625,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.6875,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.8125,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.9375,y:.5625},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.0625,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.1875,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.3125,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.4375,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.5625,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.6875,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.8125,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.9375,y:.6875},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.0625,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.1875,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.3125,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.4375,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.5625,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.6875,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.8125,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.9375,y:.8125},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.0625,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.1875,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.3125,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.4375,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.5625,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.6875,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.8125,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375},{x:.9375,y:.9375}];var z5=class{constructor(e){var t;this.model=e,this.anchors=NA.map(n=>[n.x,n.y]),this.anchorsTensor=a.tensor2d(this.anchors),this.inputSize=(t=this.model)==null?void 0:t.inputs[0].shape[2],this.inputSizeTensor=a.tensor1d([this.inputSize,this.inputSize]),this.doubleInputSizeTensor=a.tensor1d([this.inputSize*2,this.inputSize*2])}normalizeBoxes(e){return a.tidy(()=>{let t=a.slice(e,[0,0],[-1,2]),n=a.slice(e,[0,2],[-1,2]),o=a.add(a.div(t,this.inputSizeTensor),this.anchorsTensor),i=a.div(n,this.doubleInputSizeTensor),s=a.mul(a.sub(o,i),this.inputSizeTensor),r=a.mul(a.add(o,i),this.inputSizeTensor);return a.concat2d([s,r],1)})}normalizeLandmarks(e,t){return a.tidy(()=>{let n=a.add(a.div(e.reshape([-1,7,2]),this.inputSizeTensor),this.anchors[t]);return a.mul(n,this.inputSizeTensor)})}async getBoxes(e,t){let n=this.model.predict(e),o=n.squeeze();n.dispose();let i=a.tidy(()=>a.sigmoid(a.slice(o,[0,0],[-1,1])).squeeze()),s=i.dataSync(),r=a.slice(o,[0,1],[-1,4]),y=this.normalizeBoxes(r);r.dispose();let x=await a.image.nonMaxSuppressionAsync(y,s,t.hand.maxDetected,t.hand.iouThreshold,t.hand.minConfidence),d=x.arraySync();i.dispose(),x.dispose();let l=[];for(let f of d)if(s[f]>=t.hand.minConfidence){let u=a.slice(y,[f,0],[1,-1]),z=a.slice(o,[f,5],[1,14]),c=a.tidy(()=>this.normalizeLandmarks(z,f).reshape([-1,2]));z.dispose(),l.push({box:u,palmLandmarks:c,confidence:s[f]})}return o.dispose(),y.dispose(),l}async estimateHandBounds(e,t){let n=e.shape[1],o=e.shape[2],i=a.tidy(()=>e.resizeBilinear([this.inputSize,this.inputSize]).div(127.5).sub(1)),s=await this.getBoxes(i,t);i.dispose();let r=[];if(!s||s.length===0)return r;for(let y of s){let x=y.box.dataSync(),d=x.slice(0,2),l=x.slice(2,4),f=y.palmLandmarks.arraySync();y.box.dispose(),y.palmLandmarks.dispose(),r.push(WA({startPoint:d,endPoint:l,palmLandmarks:f,confidence:y.confidence},[o/this.inputSize,n/this.inputSize]))}return r}};function R2(A){return A-2*Math.PI*Math.floor((A+Math.PI)/(2*Math.PI))}function kA(A,e){let t=Math.PI/2-Math.atan2(-(e[1]-A[1]),e[0]-A[0]);return R2(t)}var IA=(A,e)=>[[1,0,A],[0,1,e],[0,0,1]];function $(A,e){let t=0;for(let n=0;ns[0]),n=e.map(s=>s[1]),o=[Math.min(...t),Math.min(...n)],i=[Math.max(...t),Math.max(...n)];return{startPoint:o,endPoint:i}}getBoxForPalmLandmarks(e,t){let n=e.map(i=>v5([...i,1],t)),o=this.calculateLandmarksBoundingBox(n);return L0(H0(o),S2)}getBoxForHandLandmarks(e){let t=this.calculateLandmarksBoundingBox(e),n=L0(H0(t),VA);n.palmLandmarks=[];for(let o=0;o[s[0]*(u[0]-this.inputSize/2),s[1]*(u[1]-this.inputSize/2),s[2]*u[2]]),y=E5(n,[0,0]),x=r.map(u=>[...v5(u,y),u[2]]),d=ZA(o),l=[...g0(t),1],f=[$(l,d[0]),$(l,d[1])];return x.map(u=>[u[0]+f[0],u[1]+f[1],u[2]])}async estimateHands(e,t){let n=!1,o;(this.skipped===0||this.skipped>t.hand.skipFrames||!t.hand.landmarks||!t.skipFrame)&&(o=await this.handDetector.estimateHandBounds(e,t),this.skipped=0),t.skipFrame&&this.skipped++,o&&o.length>0&&(o.length!==this.detectedHands&&this.detectedHands!==t.hand.maxDetected||!t.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...o],this.storedBoxes.length>0&&(n=!0));let i=[];for(let s=0;s=t.hand.minConfidence){let v=a.reshape(M,[-1,3]),j=v.arraySync();M.dispose(),v.dispose();let T=this.transformRawCoords(j,u,y,f),h=this.getBoxForHandLandmarks(T);this.storedBoxes[s]=h;let P={landmarks:T,confidence:b,box:{topLeft:h.startPoint,bottomRight:h.endPoint}};i.push(P)}else this.storedBoxes[s]=null;M.dispose()}else{let y=L0(H0(r),VA),x={confidence:r.confidence,box:{topLeft:y.startPoint,bottomRight:y.endPoint}};i.push(x)}}return this.storedBoxes=this.storedBoxes.filter(s=>s!==null),this.detectedHands=i.length,i}};var HA={thumb:[1,2,3,4],indexFinger:[5,6,7,8],middleFinger:[9,10,11,12],ringFinger:[13,14,15,16],pinky:[17,18,19,20],palmBase:[0]},A0,e0,XA;async function j5(A,e){let t=await XA.estimateHands(A,e);if(!t)return[];let n=[];for(let o=0;ot[o].landmarks[x]);let s=t[o].box?[Math.max(0,t[o].box.topLeft[0]),Math.max(0,t[o].box.topLeft[1]),Math.min(A.shape[2],t[o].box.bottomRight[0])-Math.max(0,t[o].box.topLeft[0]),Math.min(A.shape[1],t[o].box.bottomRight[1])-Math.max(0,t[o].box.topLeft[1])]:[0,0,0,0],r=[t[o].box.topLeft[0]/A.shape[2],t[o].box.topLeft[1]/A.shape[1],(t[o].box.bottomRight[0]-t[o].box.topLeft[0])/A.shape[2],(t[o].box.bottomRight[1]-t[o].box.topLeft[1])/A.shape[1]];n.push({id:o,confidence:Math.round(100*t[o].confidence)/100,box:s,boxRaw:r,landmarks:t[o].landmarks,annotations:i})}return n}async function S5(A){!A0||!e0?([A0,e0]=await Promise.all([A.hand.enabled?a.loadGraphModel(k(A.modelBasePath,A.hand.detector.modelPath),{fromTFHub:A.hand.detector.modelPath.includes("tfhub.dev")}):null,A.hand.landmarks?a.loadGraphModel(k(A.modelBasePath,A.hand.skeleton.modelPath),{fromTFHub:A.hand.skeleton.modelPath.includes("tfhub.dev")}):null]),A.hand.enabled&&(!A0||!A0.modelUrl?p("load model failed:",A.hand.detector.modelPath):A.debug&&p("load model:",A0.modelUrl),!e0||!e0.modelUrl?p("load model failed:",A.hand.skeleton.modelPath):A.debug&&p("load model:",e0.modelUrl))):(A.debug&&p("cached model:",A0.modelUrl),A.debug&&p("cached model:",e0.modelUrl));let e=new z5(A0);return XA=new R5(e,e0),[A0,e0]}var k5={};K(k5,{load:()=>W5,predict:()=>N5});var FA=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftPalm","rightPalm","leftIndex","rightIndex","leftPinky","rightPinky","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle","leftHeel","rightHeel","leftFoot","rightFoot","midHip","forehead","leftThumb","leftHand","rightThumb","rightHand"],qA=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","left:15","right:16","left:17","right:18","left:19","right:20","left:21","right:22","leftChest","rightChest","neck","forehead","left:27","right:28","left:29","right:30"];var V;async function W5(A){return V?A.debug&&p("cached model:",V.modelUrl):(V=await a.loadGraphModel(k(A.modelBasePath,A.body.modelPath)),V.width=parseInt(V.signature.inputs["input_1:0"].tensorShape.dim[2].size),V.height=parseInt(V.signature.inputs["input_1:0"].tensorShape.dim[1].size),!V||!V.modelUrl?p("load model failed:",A.body.modelPath):A.debug&&p("load model:",V.modelUrl)),V}async function N5(A,e){if(!V||!e.body.enabled)return null;let t={width:A.shape[2],height:A.shape[1]},n=a.image.resizeBilinear(A,[V.width,V.height],!1),o=a.div(n,[255]);n.dispose();let i=await V.predict(o),s=i.find(l=>l.size===195||l.size===155).dataSync();i.forEach(l=>l.dispose()),o.dispose();let r=[],y=s.length===195?FA:qA,x=5;for(let l=0;lf.score>l?f.score:l,0),keypoints:r}]}var L5={};K(L5,{load:()=>Z5,predict:()=>V5});var d0=[{class:1,label:"person"},{class:2,label:"bicycle"},{class:3,label:"car"},{class:4,label:"motorcycle"},{class:5,label:"airplane"},{class:6,label:"bus"},{class:7,label:"train"},{class:8,label:"truck"},{class:9,label:"boat"},{class:10,label:"traffic light"},{class:11,label:"fire hydrant"},{class:12,label:"stop sign"},{class:13,label:"parking meter"},{class:14,label:"bench"},{class:15,label:"bird"},{class:16,label:"cat"},{class:17,label:"dog"},{class:18,label:"horse"},{class:19,label:"sheep"},{class:20,label:"cow"},{class:21,label:"elephant"},{class:22,label:"bear"},{class:23,label:"zebra"},{class:24,label:"giraffe"},{class:25,label:"backpack"},{class:26,label:"umbrella"},{class:27,label:"handbag"},{class:28,label:"tie"},{class:29,label:"suitcase"},{class:30,label:"frisbee"},{class:31,label:"skis"},{class:32,label:"snowboard"},{class:33,label:"sports ball"},{class:34,label:"kite"},{class:35,label:"baseball bat"},{class:36,label:"baseball glove"},{class:37,label:"skateboard"},{class:38,label:"surfboard"},{class:39,label:"tennis racket"},{class:40,label:"bottle"},{class:41,label:"wine glass"},{class:42,label:"cup"},{class:43,label:"fork"},{class:44,label:"knife"},{class:45,label:"spoon"},{class:46,label:"bowl"},{class:47,label:"banana"},{class:48,label:"apple"},{class:49,label:"sandwich"},{class:50,label:"orange"},{class:51,label:"broccoli"},{class:52,label:"carrot"},{class:53,label:"hot dog"},{class:54,label:"pizza"},{class:55,label:"donut"},{class:56,label:"cake"},{class:57,label:"chair"},{class:58,label:"couch"},{class:59,label:"potted plant"},{class:60,label:"bed"},{class:61,label:"dining table"},{class:62,label:"toilet"},{class:63,label:"tv"},{class:64,label:"laptop"},{class:65,label:"mouse"},{class:66,label:"remote"},{class:67,label:"keyboard"},{class:68,label:"cell phone"},{class:69,label:"microwave"},{class:70,label:"oven"},{class:71,label:"toaster"},{class:72,label:"sink"},{class:73,label:"refrigerator"},{class:74,label:"book"},{class:75,label:"clock"},{class:76,label:"vase"},{class:77,label:"scissors"},{class:78,label:"teddy bear"},{class:79,label:"hair drier"},{class:80,label:"toothbrush"}];var X,I5=[],O5=Number.MAX_SAFE_INTEGER,X0=2.5;async function Z5(A){if(X)A.debug&&p("cached model:",X.modelUrl);else{X=await a.loadGraphModel(k(A.modelBasePath,A.object.modelPath));let e=Object.values(X.modelSignature.inputs);if(X.inputSize=Array.isArray(e)?parseInt(e[0].tensorShape.dim[2].size):null,!X.inputSize)throw new Error(`Human: Cannot determine model inputSize: ${A.object.modelPath}`);!X||!X.modelUrl?p("load model failed:",A.object.modelPath):A.debug&&p("load model:",X.modelUrl)}return X}async function N2(A,e,t,n){let o=0,i=[];for(let x of[1,2,4])a.tidy(()=>{var g,M;let d=x*13,l=(g=A.find(b=>b.shape[1]===d**2&&b.shape[2]===d0.length))==null?void 0:g.squeeze(),f=(M=A.find(b=>b.shape[1]===d**2&&b.shape[2]n.object.minConfidence&&v!==61){let T=(.5+Math.trunc(b%d))/d,h=(.5+Math.trunc(b/d))/d,P=z[b].map(t0=>t0*(d/x/e)),[R,w]=[T-X0/x*P[0],h-X0/x*P[1]],[O,Q]=[T+X0/x*P[2]-R,h+X0/x*P[3]-w],L=[R,w,O,Q];L=L.map(t0=>Math.max(0,Math.min(t0,1)));let E0=[L[0]*t[0],L[1]*t[1],L[2]*t[0],L[3]*t[1]],D0={id:o++,strideSize:x,score:Math.round(100*j)/100,class:v+1,label:d0[v].label,center:[Math.trunc(t[0]*T),Math.trunc(t[1]*h)],centerRaw:[T,h],box:E0.map(t0=>Math.trunc(t0)),boxRaw:L};i.push(D0)}}});A.forEach(x=>a.dispose(x));let s=i.map(x=>[x.boxRaw[1],x.boxRaw[0],x.boxRaw[3],x.boxRaw[2]]),r=i.map(x=>x.score),y=[];if(s&&s.length>0){let x=await a.image.nonMaxSuppressionAsync(s,r,n.object.maxDetected,n.object.iouThreshold,n.object.minConfidence);y=x.dataSync(),a.dispose(x)}return i=i.filter((x,d)=>y.includes(d)).sort((x,d)=>d.score-x.score),i}async function V5(A,e){return O50?(O5++,I5):(O5=0,new Promise(async t=>{let n=[A.shape[2],A.shape[1]],o=a.image.resizeBilinear(A,[X.inputSize,X.inputSize],!1),i=o.div(255),s=i.transpose([0,3,1,2]);i.dispose(),o.dispose();let r;e.object.enabled&&(r=await X.predict(s)),s.dispose();let y=await N2(r,X.inputSize,n,e);I5=y,t(y)}))}var B5={};K(B5,{load:()=>F5,predict:()=>q5});var F,H5=[],X5=Number.MAX_SAFE_INTEGER;async function F5(A){if(F)A.debug&&p("cached model:",F.modelUrl);else{F=await a.loadGraphModel(k(A.modelBasePath,A.object.modelPath));let e=Object.values(F.modelSignature.inputs);if(F.inputSize=Array.isArray(e)?parseInt(e[0].tensorShape.dim[2].size):null,!F.inputSize)throw new Error(`Human: Cannot determine model inputSize: ${A.object.modelPath}`);!F||!F.modelUrl?p("load model failed:",A.object.modelPath):A.debug&&p("load model:",F.modelUrl)}return F}async function k2(A,e,t,n){let o=[],i=A.arraySync(),s=a.squeeze(A);A.dispose();let r=a.split(s,6,1);s.dispose();let x=a.stack([r[1],r[0],r[3],r[2]],1).squeeze(),d=r[4].squeeze(),l=r[5].squeeze();r.forEach(z=>z.dispose());let f=await a.image.nonMaxSuppressionAsync(x,d,n.object.maxDetected,n.object.iouThreshold,n.object.minConfidence);x.dispose(),d.dispose(),l.dispose();let u=f.dataSync();f.dispose();for(let z of u){let c=i[0][z][4],g=i[0][z][5],M=d0[g].label,b=[i[0][z][0]/e,i[0][z][1]/e,i[0][z][2]/e,i[0][z][3]/e],v=[Math.trunc(b[0]*t[0]),Math.trunc(b[1]*t[1]),Math.trunc(b[2]*t[0]),Math.trunc(b[3]*t[1])];o.push({score:c,class:g,label:M,box:v,boxRaw:b})}return o}async function q5(A,e){return X50?(X5++,H5):(X5=0,new Promise(async t=>{let n=[A.shape[2],A.shape[1]],o=a.image.resizeBilinear(A,[F.inputSize,F.inputSize],!1),i;e.object.enabled&&(i=F.execute(o,"tower_0/detections")),o.dispose();let s=await k2(i,F.inputSize,n,e);H5=s,t(s)}))}var BA=A=>{if(!A)return[];let e=[];for(let t=0;ty.part==="leftWrist"),o=A[t].keypoints.find(y=>y.part==="rightWrist"),i=A[t].keypoints.find(y=>y.part==="nose");i&&n&&o&&n.position.yy.part==="leftShoulder"),r=A[t].keypoints.find(y=>y.part==="rightShoulder");s&&r&&e.push({body:t,gesture:`leaning ${s.position.y>r.position.y?"left":"right"}`})}return e},UA=A=>{if(!A)return[];let e=[];for(let t=0;t0){let n=A[t].mesh[33][2]-A[t].mesh[263][2];Math.abs(n)<10?e.push({face:t,gesture:"facing center"}):e.push({face:t,gesture:`facing ${n<0?"left":"right"}`}),Math.abs(A[t].mesh[374][1]-A[t].mesh[386][1])/Math.abs(A[t].mesh[443][1]-A[t].mesh[450][1])<.2&&e.push({face:t,gesture:"blink left eye"}),Math.abs(A[t].mesh[145][1]-A[t].mesh[159][1])/Math.abs(A[t].mesh[223][1]-A[t].mesh[230][1])<.2&&e.push({face:t,gesture:"blink right eye"});let s=Math.min(100,500*Math.abs(A[t].mesh[13][1]-A[t].mesh[14][1])/Math.abs(A[t].mesh[10][1]-A[t].mesh[152][1]));s>10&&e.push({face:t,gesture:`mouth ${Math.trunc(s)}% open`});let r=A[t].mesh[152][2];Math.abs(r)>10&&e.push({face:t,gesture:`head ${r<0?"up":"down"}`})}return e},YA=A=>{if(!A)return[];let e=[];for(let t=0;t.033||l>.033)&&(x=!1),f>.033&&e.push({iris:t,gesture:"looking right"}),l>.033&&e.push({iris:t,gesture:"looking left"});let u=Math.abs(A[t].mesh[145][1]-A[t].annotations.rightEyeIris[0][1])/A[t].annotations.rightEyeIris[0][1],z=Math.abs(A[t].mesh[374][1]-A[t].annotations.leftEyeIris[0][1])/A[t].annotations.leftEyeIris[0][1];(z<.015||u<.015||z>.03||u>.03)&&(x=!1),(z<.015||u<.015)&&e.push({iris:t,gesture:"looking down"}),(z>.03||u>.03)&&e.push({iris:t,gesture:"looking up"}),x&&e.push({iris:t,gesture:"looking center"})}return e},CA=A=>{if(!A)return[];let e=[];for(let t=0;t0){let o=n.reduce((s,r)=>s.position[2]s.position[1](x[f]=0,l))},o=function(r,y){let x=A.createShader(y);if(A.shaderSource(x,r),A.compileShader(x),!A.getShaderParameter(x,A.COMPILE_STATUS))throw new Error("Filter: GL compile failed",A.getShaderInfoLog(x));return x};this.uniform={},this.attribute={};let i=o(e,A.VERTEX_SHADER),s=o(t,A.FRAGMENT_SHADER);if(this.id=A.createProgram(),A.attachShader(this.id,i),A.attachShader(this.id,s),A.linkProgram(this.id),!A.getProgramParameter(this.id,A.LINK_STATUS))throw new Error("Filter: GL link failed",A.getProgramInfoLog(this.id));A.useProgram(this.id),n(e,"attribute",this.attribute);for(let r in this.attribute)this.attribute[r]=A.getAttribLocation(this.id,r);n(e,"uniform",this.uniform),n(t,"uniform",this.uniform);for(let r in this.uniform)this.uniform[r]=A.getUniformLocation(this.id,r)}function JA(A){A||(A={});let e=0,t=null,n=!1,o=-1,i=[null,null],s=[],r=-1,y=-1,x=null,d=null,l={},f=A.canvas||document.createElement("canvas"),u={},z={INTERMEDIATE:1},c=f.getContext("webgl");if(!c)throw new Error("Filter: getContext() failed");this.addFilter=function(T){let h=Array.prototype.slice.call(arguments,1),P=l[T];s.push({func:P,args:h})},this.reset=function(){s=[]};let g=function(T,h){if(!(T===r&&h===y)){if(f.width=T,r=T,f.height=h,y=h,!x){let P=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,-1,1,0,0,1,-1,1,1,1,1,1,0]);x=c.createBuffer(),c.bindBuffer(c.ARRAY_BUFFER,x),c.bufferData(c.ARRAY_BUFFER,P,c.STATIC_DRAW),c.pixelStorei(c.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0)}c.viewport(0,0,r,y),i=[null,null]}},M=function(T,h){let P=c.createFramebuffer();c.bindFramebuffer(c.FRAMEBUFFER,P);let R=c.createRenderbuffer();c.bindRenderbuffer(c.RENDERBUFFER,R);let w=c.createTexture();return c.bindTexture(c.TEXTURE_2D,w),c.texImage2D(c.TEXTURE_2D,0,c.RGBA,T,h,0,c.RGBA,c.UNSIGNED_BYTE,null),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,c.LINEAR),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,c.LINEAR),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,c.CLAMP_TO_EDGE),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,c.CLAMP_TO_EDGE),c.framebufferTexture2D(c.FRAMEBUFFER,c.COLOR_ATTACHMENT0,c.TEXTURE_2D,w,0),c.bindTexture(c.TEXTURE_2D,null),c.bindFramebuffer(c.FRAMEBUFFER,null),{fbo:P,texture:w}},b=function(T){return i[T]=i[T]||M(r,y),i[T]},v=function(T=null){var w,O;let h=null,P=null,R=!1;e===0?h=t:h=(w=b(o))==null?void 0:w.texture,e++,n&&!(T&z.INTERMEDIATE)?(P=null,R=e%2==0):(o=(o+1)%2,P=(O=b(o))==null?void 0:O.fbo),c.bindTexture(c.TEXTURE_2D,h),c.bindFramebuffer(c.FRAMEBUFFER,P),c.uniform1f(d.uniform.flipY,R?-1:1),c.drawArrays(c.TRIANGLES,0,6)};this.apply=function(T){if(g(T.width,T.height),e=0,t||(t=c.createTexture()),c.bindTexture(c.TEXTURE_2D,t),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_S,c.CLAMP_TO_EDGE),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_WRAP_T,c.CLAMP_TO_EDGE),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MIN_FILTER,c.NEAREST),c.texParameteri(c.TEXTURE_2D,c.TEXTURE_MAG_FILTER,c.NEAREST),c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,T),s.length===0)return v(),f;for(let h=0;h0,i=A.naturalHeight||A.videoHeight||A.height||A.shape&&A.shape[2]>0,s=o,r=i;if(s>F0&&(s=F0,r=s*i/o),r>F0&&(r=F0,s=r*o/i),e.filter.width>0?s=e.filter.width:e.filter.height>0&&(s=o*(e.filter.height/i)),e.filter.height>0?r=e.filter.height:e.filter.width>0&&(r=i*(e.filter.width/o)),!s||!r)throw new Error("Human: Input cannot determine dimension");(!E||(E==null?void 0:E.width)!==s||(E==null?void 0:E.height)!==r)&&(E=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(s,r):document.createElement("canvas"),(E==null?void 0:E.width)!==s&&(E.width=s),(E==null?void 0:E.height)!==r&&(E.height=r));let y=E.getContext("2d");if(A instanceof ImageData?y.putImageData(A,0,0):e.filter.flip&&typeof y.translate!="undefined"?(y.translate(o,0),y.scale(-1,1),y.drawImage(A,0,0,o,i,0,0,E==null?void 0:E.width,E==null?void 0:E.height),y.setTransform(1,0,0,1,0,0)):y.drawImage(A,0,0,o,i,0,0,E==null?void 0:E.width,E==null?void 0:E.height),e.filter.enabled){if((!N||!W||E.width!==W.width||(E==null?void 0:E.height)!==(W==null?void 0:W.height))&&(W=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(E==null?void 0:E.width,E==null?void 0:E.height):document.createElement("canvas"),(W==null?void 0:W.width)!==(E==null?void 0:E.width)&&(W.width=E==null?void 0:E.width),(W==null?void 0:W.height)!==(E==null?void 0:E.height)&&(W.height=E==null?void 0:E.height),N=a.ENV.flags.IS_BROWSER?new JA({canvas:W}):null),!N)return{tensor:null,canvas:E};N.reset(),N.addFilter("brightness",e.filter.brightness),e.filter.contrast!==0&&N.addFilter("contrast",e.filter.contrast),e.filter.sharpness!==0&&N.addFilter("sharpen",e.filter.sharpness),e.filter.blur!==0&&N.addFilter("blur",e.filter.blur),e.filter.saturation!==0&&N.addFilter("saturation",e.filter.saturation),e.filter.hue!==0&&N.addFilter("hue",e.filter.hue),e.filter.negative&&N.addFilter("negative"),e.filter.sepia&&N.addFilter("sepia"),e.filter.vintage&&N.addFilter("brownie"),e.filter.sepia&&N.addFilter("sepia"),e.filter.kodachrome&&N.addFilter("kodachrome"),e.filter.technicolor&&N.addFilter("technicolor"),e.filter.polaroid&&N.addFilter("polaroid"),e.filter.pixelate!==0&&N.addFilter("pixelate",e.filter.pixelate),N.apply(E)}else W=E,N&&(N=null);let x;if(W.data){let l=[W.height,W.width,3];x=a.tensor3d(W.data,l,"int32")}else if(W instanceof ImageData)x=a.browser.fromPixels(W);else if(e.backend==="webgl"||e.backend==="humangl"){let l=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(s,r):document.createElement("canvas");l.width=s,l.height=r;let f=l.getContext("2d");f==null||f.drawImage(W,0,0),x=a.browser.fromPixels(l)}else{let l=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(s,r):document.createElement("canvas");l.width=s,l.height=r;let f=l.getContext("2d");f==null||f.drawImage(W,0,0);let u=f==null?void 0:f.getImageData(0,0,s,r);x=a.browser.fromPixels(u)}let d=x.toFloat();t=d.expandDims(0),x.dispose(),d.dispose()}let n=e.filter.return?W:null;return{tensor:t,canvas:n}}var J5={};K(J5,{all:()=>Z2,body:()=>GA,canvas:()=>O2,face:()=>DA,gesture:()=>KA,hand:()=>QA,object:()=>_A,options:()=>o0});var o0={color:"rgba(173, 216, 230, 0.3)",labelColor:"rgba(173, 216, 230, 1)",shadowColor:"black",font:'small-caps 16px "Segoe UI"',lineHeight:24,lineWidth:6,pointSize:2,roundRect:28,drawPoints:!1,drawLabels:!0,drawBoxes:!0,drawPolygons:!0,fillPolygons:!1,useDepth:!0,useCurves:!1,bufferedOutput:!1,useRawBoxes:!1,calculateHandBox:!0},G;function Y5(A,e,t,n=0,o){A.fillStyle=o.useDepth&&n?`rgba(${127.5+2*n}, ${127.5-2*n}, 255, 0.3)`:o.color,A.beginPath(),A.arc(e,t,o.pointSize,0,2*Math.PI),A.fill()}function s0(A,e,t,n,o,i){if(A.beginPath(),i.useCurves){let s=(e+e+n)/2,r=(t+t+o)/2;A.ellipse(s,r,n/2,o/2,0,0,2*Math.PI)}else A.lineWidth=i.lineWidth,A.moveTo(e+i.roundRect,t),A.lineTo(e+n-i.roundRect,t),A.quadraticCurveTo(e+n,t,e+n,t+i.roundRect),A.lineTo(e+n,t+o-i.roundRect),A.quadraticCurveTo(e+n,t+o,e+n-i.roundRect,t+o),A.lineTo(e+i.roundRect,t+o),A.quadraticCurveTo(e,t+o,e,t+o-i.roundRect),A.lineTo(e,t+i.roundRect),A.quadraticCurveTo(e,t,e+i.roundRect,t),A.closePath();A.stroke()}function C5(A,e=[],t){if(!(e===void 0||e.length===0)){A.beginPath(),A.moveTo(e[0][0],e[0][1]);for(let n of e)A.strokeStyle=t.useDepth&&n[2]?`rgba(${127.5+2*n[2]}, ${127.5-2*n[2]}, 255, 0.3)`:t.color,A.fillStyle=t.useDepth&&n[2]?`rgba(${127.5+2*n[2]}, ${127.5-2*n[2]}, 255, 0.3)`:t.color,A.lineTo(n[0],Math.round(n[1]));A.stroke(),t.fillPolygons&&(A.closePath(),A.fill())}}function T0(A,e=[],t){if(!(e===void 0||e.length===0)){if(!t.useCurves||e.length<=2){C5(A,e,t);return}A.moveTo(e[0][0],e[0][1]);for(let n=0;n1&&y[1].length>0){let x=r[1]>0?`#${r[1]}`:"",d=`${r[0]} ${x}: ${y[1]}`;n.shadowColor&&n.shadowColor!==""&&(o.fillStyle=n.shadowColor,o.fillText(d,8,2+i*n.lineHeight)),o.fillStyle=n.labelColor,o.fillText(d,6,0+i*n.lineHeight),i+=1}}}async function DA(A,e,t){let n=B(o0,t);if(!e||!A||!(A instanceof HTMLCanvasElement))return;let o=A.getContext("2d");if(!!o)for(let i of e){o.font=n.font,o.strokeStyle=n.color,o.fillStyle=n.color,n.drawBoxes&&(n.useRawBoxes?s0(o,A.width*i.boxRaw[0],A.height*i.boxRaw[1],A.width*i.boxRaw[2],A.height*i.boxRaw[3],n):s0(o,i.box[0],i.box[1],i.box[2],i.box[3],n));let s=[];if(s.push(`face confidence: ${Math.trunc(100*i.confidence)}%`),i.genderConfidence&&s.push(`${i.gender||""} ${Math.trunc(100*i.genderConfidence)}% confident`),i.age&&s.push(`age: ${i.age||""}`),i.iris&&s.push(`iris distance: ${i.iris}`),i.emotion&&i.emotion.length>0){let r=i.emotion.map(y=>`${Math.trunc(100*y.score)}% ${y.emotion}`);s.push(r.join(" "))}i.rotation&&i.rotation.angle&&i.rotation.angle.roll&&s.push(`roll: ${Math.trunc(100*i.rotation.angle.roll)/100} yaw:${Math.trunc(100*i.rotation.angle.yaw)/100} pitch:${Math.trunc(100*i.rotation.angle.pitch)/100}`),s.length===0&&s.push("face"),o.fillStyle=n.color;for(let r=s.length-1;r>=0;r--){let y=Math.max(i.box[0],0),x=r*n.lineHeight+i.box[1];n.shadowColor&&n.shadowColor!==""&&(o.fillStyle=n.shadowColor,o.fillText(s[r],y+5,x+16)),o.fillStyle=n.labelColor,o.fillText(s[r],y+4,x+15)}if(o.lineWidth=1,i.mesh&&i.mesh.length>0){if(n.drawPoints)for(let r of i.mesh)Y5(o,r[0],r[1],r[2],n);if(n.drawPolygons){o.lineWidth=1;for(let r=0;ri.mesh[x]);C5(o,y,n)}if(i.annotations&&i.annotations.leftEyeIris){o.strokeStyle=n.useDepth?"rgba(255, 200, 255, 0.3)":n.color,o.beginPath();let r=Math.abs(i.annotations.leftEyeIris[3][0]-i.annotations.leftEyeIris[1][0])/2,y=Math.abs(i.annotations.leftEyeIris[4][1]-i.annotations.leftEyeIris[2][1])/2;o.ellipse(i.annotations.leftEyeIris[0][0],i.annotations.leftEyeIris[0][1],r,y,0,0,2*Math.PI),o.stroke(),n.fillPolygons&&(o.fillStyle=n.useDepth?"rgba(255, 255, 200, 0.3)":n.color,o.fill())}if(i.annotations&&i.annotations.rightEyeIris){o.strokeStyle=n.useDepth?"rgba(255, 200, 255, 0.3)":n.color,o.beginPath();let r=Math.abs(i.annotations.rightEyeIris[3][0]-i.annotations.rightEyeIris[1][0])/2,y=Math.abs(i.annotations.rightEyeIris[4][1]-i.annotations.rightEyeIris[2][1])/2;o.ellipse(i.annotations.rightEyeIris[0][0],i.annotations.rightEyeIris[0][1],r,y,0,0,2*Math.PI),o.stroke(),n.fillPolygons&&(o.fillStyle=n.useDepth?"rgba(255, 255, 200, 0.3)":n.color,o.fill())}}}}}async function GA(A,e,t){var i;let n=B(o0,t);if(!e||!A||!(A instanceof HTMLCanvasElement))return;let o=A.getContext("2d");if(!!o){o.lineJoin="round";for(let s=0;sx.part==="leftShoulder"),r&&y.push([r.position.x,r.position.y]),r=e[s].keypoints.find(x=>x.part==="rightShoulder"),r&&y.push([r.position.x,r.position.y]),T0(o,y,n),y.length=0,r=e[s].keypoints.find(x=>x.part==="rightShoulder"),r&&y.push([r.position.x,r.position.y]),r=e[s].keypoints.find(x=>x.part==="rightHip"),r&&y.push([r.position.x,r.position.y]),r=e[s].keypoints.find(x=>x.part==="leftHip"),r&&y.push([r.position.x,r.position.y]),r=e[s].keypoints.find(x=>x.part==="leftShoulder"),r&&y.push([r.position.x,r.position.y]),y.length===4&&C5(o,y,n),y.length=0,r=e[s].keypoints.find(x=>x.part==="leftHip"),r&&y.push([r.position.x,r.position.y]),r=e[s].keypoints.find(x=>x.part==="leftKnee"),r&&y.push([r.position.x,r.position.y]),r=e[s].keypoints.find(x=>x.part==="leftAnkle"),r&&y.push([r.position.x,r.position.y]),r=e[s].keypoints.find(x=>x.part==="leftHeel"),r&&y.push([r.position.x,r.position.y]),r=e[s].keypoints.find(x=>x.part==="leftFoot"),r&&y.push([r.position.x,r.position.y]),T0(o,y,n),y.length=0,r=e[s].keypoints.find(x=>x.part==="rightHip"),r&&y.push([r.position.x,r.position.y]),r=e[s].keypoints.find(x=>x.part==="rightKnee"),r&&y.push([r.position.x,r.position.y]),r=e[s].keypoints.find(x=>x.part==="rightAnkle"),r&&y.push([r.position.x,r.position.y]),r=e[s].keypoints.find(x=>x.part==="rightHeel"),r&&y.push([r.position.x,r.position.y]),r=e[s].keypoints.find(x=>x.part==="rightFoot"),r&&y.push([r.position.x,r.position.y]),T0(o,y,n),y.length=0,r=e[s].keypoints.find(x=>x.part==="leftShoulder"),r&&y.push([r.position.x,r.position.y]),r=e[s].keypoints.find(x=>x.part==="leftElbow"),r&&y.push([r.position.x,r.position.y]),r=e[s].keypoints.find(x=>x.part==="leftWrist"),r&&y.push([r.position.x,r.position.y]),r=e[s].keypoints.find(x=>x.part==="leftPalm"),r&&y.push([r.position.x,r.position.y]),T0(o,y,n),y.length=0,r=e[s].keypoints.find(x=>x.part==="rightShoulder"),r&&y.push([r.position.x,r.position.y]),r=e[s].keypoints.find(x=>x.part==="rightElbow"),r&&y.push([r.position.x,r.position.y]),r=e[s].keypoints.find(x=>x.part==="rightWrist"),r&&y.push([r.position.x,r.position.y]),r=e[s].keypoints.find(x=>x.part==="rightPalm"),r&&y.push([r.position.x,r.position.y]),T0(o,y,n)}}}}async function QA(A,e,t){let n=B(o0,t);if(!e||!A||!(A instanceof HTMLCanvasElement))return;let o=A.getContext("2d");if(!!o){o.lineJoin="round",o.font=n.font;for(let i of e){if(n.drawBoxes){o.strokeStyle=n.color,o.fillStyle=n.color;let s;if(!n.calculateHandBox)s=n.useRawBoxes?i.boxRaw:i.box;else if(s=[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,0,0],i.landmarks&&i.landmarks.length>0){for(let r of i.landmarks)r[0]s[2]&&(s[2]=r[0]),r[1]>s[3]&&(s[3]=r[1]);s[2]-=s[0],s[3]-=s[1]}n.useRawBoxes?s0(o,A.width*s[0],A.height*s[1],A.width*s[2],A.height*s[3],n):s0(o,s[0],s[1],s[2],s[3],n),n.drawLabels&&(n.shadowColor&&n.shadowColor!==""&&(o.fillStyle=n.shadowColor,o.fillText("hand",s[0]+3,1+s[1]+n.lineHeight,s[2])),o.fillStyle=n.labelColor,o.fillText("hand",s[0]+2,0+s[1]+n.lineHeight,s[2])),o.stroke()}if(n.drawPoints&&i.landmarks&&i.landmarks.length>0)for(let s of i.landmarks)o.fillStyle=n.useDepth?`rgba(${127.5+2*s[2]}, ${127.5-2*s[2]}, 255, 0.5)`:n.color,Y5(o,s[0],s[1],0,n);if(n.drawLabels){let s=(r,y)=>{o.fillStyle=n.useDepth?`rgba(${127.5+2*r[r.length-1][2]}, ${127.5-2*r[r.length-1][2]}, 255, 0.5)`:n.color,o.fillText(y,r[r.length-1][0]+4,r[r.length-1][1]+4)};o.font=n.font,s(i.annotations.indexFinger,"index"),s(i.annotations.middleFinger,"middle"),s(i.annotations.ringFinger,"ring"),s(i.annotations.pinky,"pinky"),s(i.annotations.thumb,"thumb"),s(i.annotations.palmBase,"palm")}if(n.drawPolygons){let s=r=>{if(!!r)for(let y=0;y0?y-1:0][0],r[y>0?y-1:0][1]),o.lineTo(r[y][0],r[y][1]),o.stroke()};o.lineWidth=n.lineWidth,s(i.annotations.indexFinger),s(i.annotations.middleFinger),s(i.annotations.ringFinger),s(i.annotations.pinky),s(i.annotations.thumb)}}}}async function _A(A,e,t){let n=B(o0,t);if(!e||!A||!(A instanceof HTMLCanvasElement))return;let o=A.getContext("2d");if(!!o){o.lineJoin="round",o.font=n.font;for(let i of e)if(n.drawBoxes){if(o.strokeStyle=n.color,o.fillStyle=n.color,n.useRawBoxes?s0(o,A.width*i.boxRaw[0],A.height*i.boxRaw[1],A.width*i.boxRaw[2],A.height*i.boxRaw[3],n):s0(o,i.box[0],i.box[1],i.box[2],i.box[3],n),n.drawLabels){let s=`${Math.round(100*i.score)}% ${i.label}`;n.shadowColor&&n.shadowColor!==""&&(o.fillStyle=n.shadowColor,o.fillText(s,i.box[0]+3,1+i.box[1]+n.lineHeight,i.box[2])),o.fillStyle=n.labelColor,o.fillText(s,i.box[0]+2,0+i.box[1]+n.lineHeight,i.box[2])}o.stroke()}}}async function O2(A,e){if(!A||!e||!(A instanceof HTMLCanvasElement)||!(e instanceof HTMLCanvasElement))return;let t=A.getContext("2d");t==null||t.drawImage(A,0,0)}async function Z2(A,e,t){let n=B(o0,t);!e||!A||A instanceof HTMLCanvasElement&&(n.bufferedOutput?e.timestamp!==(G==null?void 0:G.timestamp)&&(G=e):G=e,DA(A,G.face,n),GA(A,G.body,n),QA(A,G.hand,n),KA(A,G.gesture,n),_A(A,G.object,n))}var q0=` /9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUA AAABAAAARgEoAAMAAAABAAIAAAExAAIAAAARAAAATgAAAAAAAABgAAAAAQAAAGAAAAABcGFpbnQu bmV0IDQuMi4xMwAA/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxob @@ -18992,8 +163,7 @@ PQ4GJ+ashuK0MhWaoWcA0AaOmASMK7jRNPWYBmHyiuepO2x10qfcv6vYxCzYqoGK4HVYVTJrmb5l c6oaM5TUJ8EgGsG4kLNUHT0M64OaqMMikSRsuKbnFMRLG3zVehOaGNE445NNlnVFpDMu6uie9Vo1 8z5mOAOST2pDK91cNN+5tsrH3PrW54a06KxT7fdrlh/q1Pc+tJ6IUdZGvHPLezMcnBOWbsPap5r3 ylFtbdT1xUWNWzU0/Zbwlgfmx8zGsHWtRHmMqE59aAMyNifvHPc1f0gtPdqkY5JosJHeNci2tktY -euPnNY+oXWZEVJNrZ9aun8SIq/CzodHuriIokhDIR1ronbKZr0o6o8ipoz//2Q==`; -var body3 = ` +euPnNY+oXWZEVJNrZ9aun8SIq/CzodHuriIokhDIR1ronbKZr0o6o8ipoz//2Q==`,B0=` /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAsICAoIBwsKCQoNDAsNERwSEQ8PESIZGhQcKSQrKigk JyctMkA3LTA9MCcnOEw5PUNFSElIKzZPVU5GVEBHSEX/2wBDAQwNDREPESESEiFFLicuRUVFRUVF RUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUX/wAARCASwBLADASIA @@ -19561,473 +731,5 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`; - -// package.json -var version2 = "1.9.1"; - -// src/human.ts -var _numTensors, _analyzeMemoryLeaks, _checkSanity, _firstRun, _lastInputSum, _lastCacheDiff, _sanity, _checkBackend, _skipFrame, _warmupBitmap, _warmupCanvas, _warmupNode; -var Human = class { - constructor(userConfig = {}) { - __privateAdd(this, _numTensors, void 0); - __privateAdd(this, _analyzeMemoryLeaks, void 0); - __privateAdd(this, _checkSanity, void 0); - __privateAdd(this, _firstRun, void 0); - __privateAdd(this, _lastInputSum, void 0); - __privateAdd(this, _lastCacheDiff, void 0); - this.analyze = (...msg) => { - if (!__privateGet(this, _analyzeMemoryLeaks)) - return; - const current = this.tf.engine().state.numTensors; - const previous = __privateGet(this, _numTensors); - __privateSet(this, _numTensors, current); - const leaked = current - previous; - if (leaked !== 0) - log(...msg, leaked); - }; - __privateAdd(this, _sanity, (input) => { - if (!__privateGet(this, _checkSanity)) - return null; - if (!input) - return "input is not defined"; - if (this.tf.ENV.flags.IS_NODE && !(input instanceof tfjs_esm_exports.Tensor)) - return "input must be a tensor"; - try { - this.tf.getBackend(); - } catch (e) { - return "backend not loaded"; - } - return null; - }); - __privateAdd(this, _checkBackend, async (force = false) => { - var _a; - if (this.config.backend && this.config.backend.length > 0 && force || this.tf.getBackend() !== this.config.backend) { - const timeStamp = now(); - this.state = "backend"; - if (this.config.backend && this.config.backend.length > 0) { - if (typeof window === "undefined" && typeof WorkerGlobalScope !== "undefined" && this.config.debug) - log("running inside web worker"); - if (this.tf.ENV.flags.IS_BROWSER && this.config.backend === "tensorflow") - this.config.backend = "webgl"; - if (this.tf.ENV.flags.IS_NODE && (this.config.backend === "webgl" || this.config.backend === "humangl")) - this.config.backend = "tensorflow"; - if (this.config.debug) - log("setting backend:", this.config.backend); - if (this.config.backend === "wasm") { - if (this.config.debug) - log("wasm path:", this.config.wasmPath); - if (typeof ((_a = this.tf) == null ? void 0 : _a.setWasmPaths) !== "undefined") - this.tf.setWasmPaths(this.config.wasmPath); - else - throw new Error("Human: WASM backend is not loaded"); - const simd = await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"); - const mt = await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"); - if (this.config.debug) - log(`wasm execution: ${simd ? "SIMD" : "no SIMD"} ${mt ? "multithreaded" : "singlethreaded"}`); - if (this.config.debug && !simd) - log("warning: wasm simd support is not enabled"); - } - if (this.config.backend === "humangl") - register(); - try { - await this.tf.setBackend(this.config.backend); - } catch (err) { - log("error: cannot set backend:", this.config.backend, err); - } - } - this.tf.enableProdMode(); - if (this.tf.getBackend() === "webgl" || this.tf.getBackend() === "humangl") { - this.tf.ENV.set("CHECK_COMPUTATION_FOR_ERRORS", false); - this.tf.ENV.set("WEBGL_CPU_FORWARD", true); - tfjs_esm_exports.ENV.set("WEBGL_FORCE_F16_TEXTURES", true); - this.tf.ENV.set("WEBGL_PACK_DEPTHWISECONV", true); - if (typeof this.config["deallocate"] !== "undefined") { - log("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:", true); - this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD", 0); - } - const gl = await this.tf.backend().getGPGPUContext().gl; - if (this.config.debug) - log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`); - } - await this.tf.ready(); - this.perf.backend = Math.trunc(now() - timeStamp); - } - }); - __privateAdd(this, _skipFrame, async (input) => { - if (this.config.cacheSensitivity === 0) - return false; - const resizeFact = 40; - const reduced = input.resizeBilinear([Math.trunc(input.shape[1] / resizeFact), Math.trunc(input.shape[2] / resizeFact)]); - const sumT = this.tf.sum(reduced); - const sum = sumT.dataSync()[0]; - sumT.dispose(); - reduced.dispose(); - const diff = Math.max(sum, __privateGet(this, _lastInputSum)) / Math.min(sum, __privateGet(this, _lastInputSum)) - 1; - __privateSet(this, _lastInputSum, sum); - const skipFrame = diff < Math.max(this.config.cacheSensitivity, __privateGet(this, _lastCacheDiff)); - __privateSet(this, _lastCacheDiff, diff > 4 * this.config.cacheSensitivity ? 0 : diff); - return skipFrame; - }); - __privateAdd(this, _warmupBitmap, async () => { - const b64toBlob = (base64, type = "application/octet-stream") => fetch(`data:${type};base64,${base64}`).then((res2) => res2.blob()); - let blob; - let res; - switch (this.config.warmup) { - case "face": - blob = await b64toBlob(face3); - break; - case "full": - blob = await b64toBlob(body3); - break; - default: - blob = null; - } - if (blob) { - const bitmap = await createImageBitmap(blob); - res = await this.detect(bitmap, this.config); - bitmap.close(); - } - return res; - }); - __privateAdd(this, _warmupCanvas, async () => new Promise((resolve) => { - let src; - let size = 0; - switch (this.config.warmup) { - case "face": - size = 256; - src = "data:image/jpeg;base64," + face3; - break; - case "full": - case "body": - size = 1200; - src = "data:image/jpeg;base64," + body3; - break; - default: - src = null; - } - const img = new Image(); - img.onload = async () => { - const canvas2 = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(size, size) : document.createElement("canvas"); - canvas2.width = img.naturalWidth; - canvas2.height = img.naturalHeight; - const ctx = canvas2.getContext("2d"); - ctx == null ? void 0 : ctx.drawImage(img, 0, 0); - const res = await this.detect(canvas2, this.config); - resolve(res); - }; - if (src) - img.src = src; - else - resolve(null); - })); - __privateAdd(this, _warmupNode, async () => { - const atob = (str) => Buffer.from(str, "base64"); - let img; - if (this.config.warmup === "face") - img = atob(face3); - if (this.config.warmup === "body" || this.config.warmup === "full") - img = atob(body3); - if (!img) - return null; - let res; - if (typeof tfjs_esm_exports["node"] !== "undefined") { - const data2 = tfjs_esm_exports["node"].decodeJpeg(img); - const expanded = data2.expandDims(0); - this.tf.dispose(data2); - res = await this.detect(expanded, this.config); - this.tf.dispose(expanded); - } else { - if (this.config.debug) - log("Warmup tfjs-node not loaded"); - } - return res; - }); - this.tf = tfjs_esm_exports; - this.draw = draw_exports; - this.version = version2; - this.config = mergeDeep(config, userConfig); - this.state = "idle"; - __privateSet(this, _numTensors, 0); - __privateSet(this, _analyzeMemoryLeaks, false); - __privateSet(this, _checkSanity, false); - __privateSet(this, _firstRun, true); - __privateSet(this, _lastCacheDiff, 0); - this.perf = {}; - this.models = { - face: null, - posenet: null, - blazepose: null, - efficientpose: null, - handpose: null, - iris: null, - age: null, - gender: null, - emotion: null, - embedding: null, - nanodet: null, - centernet: null, - faceres: null - }; - this.image = (input) => process4(input, this.config); - this.classes = { - facemesh: facemesh_exports, - emotion: emotion_exports, - faceres: faceres_exports, - body: this.config.body.modelPath.includes("posenet") ? posenet_exports : blazepose_exports, - hand: handpose_exports, - nanodet: nanodet_exports, - centernet: centernet_exports - }; - this.faceTriangulation = triangulation; - this.faceUVMap = uvmap; - this.sysinfo = info(); - __privateSet(this, _lastInputSum, 1); - } - similarity(embedding1, embedding2) { - return similarity(embedding1, embedding2); - } - enhance(input) { - return enhance(input); - } - match(faceEmbedding, db, threshold = 0) { - return match(faceEmbedding, db, threshold); - } - async load(userConfig = {}) { - this.state = "load"; - const timeStamp = now(); - if (userConfig) - this.config = mergeDeep(this.config, userConfig); - if (__privateGet(this, _firstRun)) { - if (this.config.debug) - log(`version: ${this.version}`); - if (this.config.debug) - log(`tfjs version: ${this.tf.version_core}`); - if (this.config.debug) - log("platform:", this.sysinfo.platform); - if (this.config.debug) - log("agent:", this.sysinfo.agent); - await __privateGet(this, _checkBackend).call(this, true); - if (this.tf.ENV.flags.IS_BROWSER) { - if (this.config.debug) - log("configuration:", this.config); - if (this.config.debug) - log("tf flags:", this.tf.ENV.flags); - } - } - if (this.config.async) { - [ - this.models.face, - this.models.emotion, - this.models.handpose, - this.models.posenet, - this.models.blazepose, - this.models.nanodet, - this.models.centernet, - this.models.faceres - ] = await Promise.all([ - this.models.face || (this.config.face.enabled ? load2(this.config) : null), - this.models.emotion || (this.config.face.enabled && this.config.face.emotion.enabled ? load3(this.config) : null), - this.models.handpose || (this.config.hand.enabled ? load6(this.config) : null), - this.models.posenet || (this.config.body.enabled && this.config.body.modelPath.includes("posenet") ? load5(this.config) : null), - this.models.blazepose || (this.config.body.enabled && this.config.body.modelPath.includes("blazepose") ? load7(this.config) : null), - this.models.nanodet || (this.config.object.enabled && this.config.object.modelPath.includes("nanodet") ? load8(this.config) : null), - this.models.centernet || (this.config.object.enabled && this.config.object.modelPath.includes("centernet") ? load9(this.config) : null), - this.models.faceres || (this.config.face.enabled && this.config.face.description.enabled ? load4(this.config) : null) - ]); - } else { - if (this.config.face.enabled && !this.models.face) - this.models.face = await load2(this.config); - if (this.config.face.enabled && this.config.face.emotion.enabled && !this.models.emotion) - this.models.emotion = await load3(this.config); - if (this.config.hand.enabled && !this.models.handpose) - this.models.handpose = await load6(this.config); - if (this.config.body.enabled && !this.models.posenet && this.config.body.modelPath.includes("posenet")) - this.models.posenet = await load5(this.config); - if (this.config.body.enabled && !this.models.blazepose && this.config.body.modelPath.includes("blazepose")) - this.models.blazepose = await load7(this.config); - if (this.config.object.enabled && !this.models.nanodet && this.config.object.modelPath.includes("nanodet")) - this.models.nanodet = await load8(this.config); - if (this.config.object.enabled && !this.models.centernet && this.config.object.modelPath.includes("centernet")) - this.models.centernet = await load9(this.config); - if (this.config.face.enabled && this.config.face.description.enabled && !this.models.faceres) - this.models.faceres = await load4(this.config); - } - if (__privateGet(this, _firstRun)) { - if (this.config.debug) - log("tf engine state:", this.tf.engine().state.numBytes, "bytes", this.tf.engine().state.numTensors, "tensors"); - __privateSet(this, _firstRun, false); - } - const current = Math.trunc(now() - timeStamp); - if (current > (this.perf.load || 0)) - this.perf.load = current; - } - async detect(input, userConfig = {}) { - return new Promise(async (resolve) => { - this.state = "config"; - let timeStamp; - this.config = mergeDeep(this.config, userConfig); - this.state = "check"; - const error = __privateGet(this, _sanity).call(this, input); - if (error) { - log(error, input); - resolve({ error }); - } - const timeStart = now(); - await __privateGet(this, _checkBackend).call(this); - await this.load(); - timeStamp = now(); - const process5 = process4(input, this.config); - if (!process5 || !process5.tensor) { - log("could not convert input to tensor"); - resolve({ error: "could not convert input to tensor" }); - return; - } - this.perf.image = Math.trunc(now() - timeStamp); - this.analyze("Get Image:"); - timeStamp = now(); - this.config.skipFrame = await __privateGet(this, _skipFrame).call(this, process5.tensor); - if (!this.perf.frames) - this.perf.frames = 0; - if (!this.perf.cached) - this.perf.cached = 0; - this.perf.frames++; - if (this.config.skipFrame) - this.perf.cached++; - this.perf.changed = Math.trunc(now() - timeStamp); - this.analyze("Check Changed:"); - let bodyRes; - let handRes; - let faceRes; - let objectRes; - let current; - if (this.config.async) { - faceRes = this.config.face.enabled ? detectFace(this, process5.tensor) : []; - if (this.perf.face) - delete this.perf.face; - } else { - this.state = "run:face"; - timeStamp = now(); - faceRes = this.config.face.enabled ? await detectFace(this, process5.tensor) : []; - current = Math.trunc(now() - timeStamp); - if (current > 0) - this.perf.face = current; - } - this.analyze("Start Body:"); - if (this.config.async) { - if (this.config.body.modelPath.includes("posenet")) - bodyRes = this.config.body.enabled ? predict4(process5.tensor, this.config) : []; - else if (this.config.body.modelPath.includes("blazepose")) - bodyRes = this.config.body.enabled ? predict6(process5.tensor, this.config) : []; - if (this.perf.body) - delete this.perf.body; - } else { - this.state = "run:body"; - timeStamp = now(); - if (this.config.body.modelPath.includes("posenet")) - bodyRes = this.config.body.enabled ? await predict4(process5.tensor, this.config) : []; - else if (this.config.body.modelPath.includes("blazepose")) - bodyRes = this.config.body.enabled ? await predict6(process5.tensor, this.config) : []; - current = Math.trunc(now() - timeStamp); - if (current > 0) - this.perf.body = current; - } - this.analyze("End Body:"); - this.analyze("Start Hand:"); - if (this.config.async) { - handRes = this.config.hand.enabled ? predict5(process5.tensor, this.config) : []; - if (this.perf.hand) - delete this.perf.hand; - } else { - this.state = "run:hand"; - timeStamp = now(); - handRes = this.config.hand.enabled ? await predict5(process5.tensor, this.config) : []; - current = Math.trunc(now() - timeStamp); - if (current > 0) - this.perf.hand = current; - } - this.analyze("End Hand:"); - this.analyze("Start Object:"); - if (this.config.async) { - if (this.config.object.modelPath.includes("nanodet")) - objectRes = this.config.object.enabled ? predict7(process5.tensor, this.config) : []; - else if (this.config.object.modelPath.includes("centernet")) - objectRes = this.config.object.enabled ? predict8(process5.tensor, this.config) : []; - if (this.perf.object) - delete this.perf.object; - } else { - this.state = "run:object"; - timeStamp = now(); - if (this.config.object.modelPath.includes("nanodet")) - objectRes = this.config.object.enabled ? await predict7(process5.tensor, this.config) : []; - else if (this.config.object.modelPath.includes("centernet")) - objectRes = this.config.object.enabled ? await predict8(process5.tensor, this.config) : []; - current = Math.trunc(now() - timeStamp); - if (current > 0) - this.perf.object = current; - } - this.analyze("End Object:"); - if (this.config.async) { - [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]); - } - tfjs_esm_exports.dispose(process5.tensor); - let gestureRes = []; - if (this.config.gesture.enabled) { - timeStamp = now(); - gestureRes = [...face(faceRes), ...body(bodyRes), ...hand(handRes), ...iris(faceRes)]; - if (!this.config.async) - this.perf.gesture = Math.trunc(now() - timeStamp); - else if (this.perf.gesture) - delete this.perf.gesture; - } - this.perf.total = Math.trunc(now() - timeStart); - this.state = "idle"; - const res = { - face: faceRes, - body: bodyRes, - hand: handRes, - gesture: gestureRes, - object: objectRes, - performance: this.perf, - canvas: process5.canvas, - timestamp: Date.now() - }; - resolve(res); - }); - } - async warmup(userConfig = {}) { - const t0 = now(); - if (userConfig) - this.config = mergeDeep(this.config, userConfig); - if (!this.config.warmup || this.config.warmup === "none") - return { error: "null" }; - let res; - if (typeof createImageBitmap === "function") - res = await __privateGet(this, _warmupBitmap).call(this); - else if (typeof Image !== "undefined") - res = await __privateGet(this, _warmupCanvas).call(this); - else - res = await __privateGet(this, _warmupNode).call(this); - const t1 = now(); - if (this.config.debug) - log("Warmup", this.config.warmup, Math.round(t1 - t0), "ms", res); - return res; - } -}; -_numTensors = new WeakMap(); -_analyzeMemoryLeaks = new WeakMap(); -_checkSanity = new WeakMap(); -_firstRun = new WeakMap(); -_lastInputSum = new WeakMap(); -_lastCacheDiff = new WeakMap(); -_sanity = new WeakMap(); -_checkBackend = new WeakMap(); -_skipFrame = new WeakMap(); -_warmupBitmap = new WeakMap(); -_warmupCanvas = new WeakMap(); -_warmupNode = new WeakMap(); -export { - Human, - Human as default -}; +2Q==`;var $A="1.9.2";var f0,P0,M0,r0,i0,m0,U0,z0,Y0,C0,J0,K0,L2=class{constructor(e={}){q(this,f0,void 0);q(this,P0,void 0);q(this,M0,void 0);q(this,r0,void 0);q(this,i0,void 0);q(this,m0,void 0);this.analyze=(...e)=>{if(!Z(this,P0))return;let t=this.tf.engine().state.numTensors,n=Z(this,f0);C(this,f0,t);let o=t-n;o!==0&&p(...e,o)};q(this,U0,e=>{if(!Z(this,M0))return null;if(!e)return"input is not defined";if(this.tf.ENV.flags.IS_NODE&&!(e instanceof a.Tensor))return"input must be a tensor";try{this.tf.getBackend()}catch(t){return"backend not loaded"}return null});q(this,z0,async(e=!1)=>{var t;if(this.config.backend&&this.config.backend.length>0&&e||this.tf.getBackend()!==this.config.backend){let n=S();if(this.state="backend",this.config.backend&&this.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&this.config.debug&&p("running inside web worker"),this.tf.ENV.flags.IS_BROWSER&&this.config.backend==="tensorflow"&&(this.config.backend="webgl"),this.tf.ENV.flags.IS_NODE&&(this.config.backend==="webgl"||this.config.backend==="humangl")&&(this.config.backend="tensorflow"),this.config.debug&&p("setting backend:",this.config.backend),this.config.backend==="wasm"){if(this.config.debug&&p("wasm path:",this.config.wasmPath),typeof((t=this.tf)==null?void 0:t.setWasmPaths)!="undefined")this.tf.setWasmPaths(this.config.wasmPath);else throw new Error("Human: WASM backend is not loaded");let o=await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"),i=await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");this.config.debug&&p(`wasm execution: ${o?"SIMD":"no SIMD"} ${i?"multithreaded":"singlethreaded"}`),this.config.debug&&!o&&p("warning: wasm simd support is not enabled")}this.config.backend==="humangl"&&sA();try{await this.tf.setBackend(this.config.backend)}catch(o){p("error: cannot set backend:",this.config.backend,o)}}if(this.tf.enableProdMode(),this.tf.getBackend()==="webgl"||this.tf.getBackend()==="humangl"){this.tf.ENV.set("CHECK_COMPUTATION_FOR_ERRORS",!1),this.tf.ENV.set("WEBGL_CPU_FORWARD",!0),a.ENV.set("WEBGL_FORCE_F16_TEXTURES",!0),this.tf.ENV.set("WEBGL_PACK_DEPTHWISECONV",!0),typeof this.config.deallocate!="undefined"&&(p("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",0));let o=await this.tf.backend().getGPGPUContext().gl;this.config.debug&&p(`gl version:${o.getParameter(o.VERSION)} renderer:${o.getParameter(o.RENDERER)}`)}await this.tf.ready(),this.perf.backend=Math.trunc(S()-n)}});q(this,Y0,async e=>{if(this.config.cacheSensitivity===0)return!1;let t=40,n=e.resizeBilinear([Math.trunc(e.shape[1]/t),Math.trunc(e.shape[2]/t)]),o=this.tf.sum(n),i=o.dataSync()[0];o.dispose(),n.dispose();let s=Math.max(i,Z(this,i0))/Math.min(i,Z(this,i0))-1;C(this,i0,i);let r=s4*this.config.cacheSensitivity?0:s),r});q(this,C0,async()=>{let e=(o,i="application/octet-stream")=>fetch(`data:${i};base64,${o}`).then(s=>s.blob()),t,n;switch(this.config.warmup){case"face":t=await e(q0);break;case"full":t=await e(B0);break;default:t=null}if(t){let o=await createImageBitmap(t);n=await this.detect(o,this.config),o.close()}return n});q(this,J0,async()=>new Promise(e=>{let t,n=0;switch(this.config.warmup){case"face":n=256,t="data:image/jpeg;base64,"+q0;break;case"full":case"body":n=1200,t="data:image/jpeg;base64,"+B0;break;default:t=null}let o=new Image;o.onload=async()=>{let i=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(n,n):document.createElement("canvas");i.width=o.naturalWidth,i.height=o.naturalHeight;let s=i.getContext("2d");s==null||s.drawImage(o,0,0);let r=await this.detect(i,this.config);e(r)},t?o.src=t:e(null)}));q(this,K0,async()=>{let e=o=>Buffer.from(o,"base64"),t;if(this.config.warmup==="face"&&(t=e(q0)),(this.config.warmup==="body"||this.config.warmup==="full")&&(t=e(B0)),!t)return null;let n;if(typeof a.node!="undefined"){let o=a.node.decodeJpeg(t),i=o.expandDims(0);this.tf.dispose(o),n=await this.detect(i,this.config),this.tf.dispose(i)}else this.config.debug&&p("Warmup tfjs-node not loaded");return n});this.tf=a,this.draw=J5,this.version=$A,this.config=B(_5,e),this.state="idle",C(this,f0,0),C(this,P0,!1),C(this,M0,!1),C(this,r0,!0),C(this,m0,0),this.perf={},this.models={face:null,posenet:null,blazepose:null,efficientpose:null,handpose:null,iris:null,age:null,gender:null,emotion:null,embedding:null,nanodet:null,centernet:null,faceres:null},this.image=t=>U5(t,this.config),this.classes={facemesh:s5,emotion:x5,faceres:f5,body:this.config.body.modelPath.includes("posenet")?M5:k5,hand:w5,nanodet:L5,centernet:B5},this.faceTriangulation=uA,this.faceUVMap=pA,this.sysinfo=$5(),C(this,i0,1)}similarity(e,t){return c5(e,t)}enhance(e){return d5(e)}match(e,t,n=0){return TA(e,t,n)}async load(e={}){this.state="load";let t=S();e&&(this.config=B(this.config,e)),Z(this,r0)&&(this.config.debug&&p(`version: ${this.version}`),this.config.debug&&p(`tfjs version: ${this.tf.version_core}`),this.config.debug&&p("platform:",this.sysinfo.platform),this.config.debug&&p("agent:",this.sysinfo.agent),await Z(this,z0).call(this,!0),this.tf.ENV.flags.IS_BROWSER&&(this.config.debug&&p("configuration:",this.config),this.config.debug&&p("tf flags:",this.tf.ENV.flags))),this.config.async?[this.models.face,this.models.emotion,this.models.handpose,this.models.posenet,this.models.blazepose,this.models.nanodet,this.models.centernet,this.models.faceres]=await Promise.all([this.models.face||(this.config.face.enabled?o5(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?a5(this.config):null),this.models.handpose||(this.config.hand.enabled?S5(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("posenet")?P5(this.config):null),this.models.blazepose||(this.config.body.enabled&&this.config.body.modelPath.includes("blazepose")?W5(this.config):null),this.models.nanodet||(this.config.object.enabled&&this.config.object.modelPath.includes("nanodet")?Z5(this.config):null),this.models.centernet||(this.config.object.enabled&&this.config.object.modelPath.includes("centernet")?F5(this.config):null),this.models.faceres||(this.config.face.enabled&&this.config.face.description.enabled?l5(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await o5(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await a5(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await S5(this.config)),this.config.body.enabled&&!this.models.posenet&&this.config.body.modelPath.includes("posenet")&&(this.models.posenet=await P5(this.config)),this.config.body.enabled&&!this.models.blazepose&&this.config.body.modelPath.includes("blazepose")&&(this.models.blazepose=await W5(this.config)),this.config.object.enabled&&!this.models.nanodet&&this.config.object.modelPath.includes("nanodet")&&(this.models.nanodet=await Z5(this.config)),this.config.object.enabled&&!this.models.centernet&&this.config.object.modelPath.includes("centernet")&&(this.models.centernet=await F5(this.config)),this.config.face.enabled&&this.config.face.description.enabled&&!this.models.faceres&&(this.models.faceres=await l5(this.config))),Z(this,r0)&&(this.config.debug&&p("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),C(this,r0,!1));let n=Math.trunc(S()-t);n>(this.perf.load||0)&&(this.perf.load=n)}async detect(e,t={}){return new Promise(async n=>{this.state="config";let o;this.config=B(this.config,t),this.state="check";let i=Z(this,U0).call(this,e);i&&(p(i,e),n({error:i}));let s=S();await Z(this,z0).call(this),await this.load(),o=S();let r=U5(e,this.config);if(!r||!r.tensor){p("could not convert input to tensor"),n({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(S()-o),this.analyze("Get Image:"),o=S(),this.config.skipFrame=await Z(this,Y0).call(this,r.tensor),this.perf.frames||(this.perf.frames=0),this.perf.cached||(this.perf.cached=0),this.perf.frames++,this.config.skipFrame&&this.perf.cached++,this.perf.changed=Math.trunc(S()-o),this.analyze("Check Changed:");let y,x,d,l,f;this.config.async?(d=this.config.face.enabled?m5(this,r.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",o=S(),d=this.config.face.enabled?await m5(this,r.tensor):[],f=Math.trunc(S()-o),f>0&&(this.perf.face=f)),this.analyze("Start Body:"),this.config.async?(this.config.body.modelPath.includes("posenet")?y=this.config.body.enabled?T5(r.tensor,this.config):[]:this.config.body.modelPath.includes("blazepose")&&(y=this.config.body.enabled?N5(r.tensor,this.config):[]),this.perf.body&&delete this.perf.body):(this.state="run:body",o=S(),this.config.body.modelPath.includes("posenet")?y=this.config.body.enabled?await T5(r.tensor,this.config):[]:this.config.body.modelPath.includes("blazepose")&&(y=this.config.body.enabled?await N5(r.tensor,this.config):[]),f=Math.trunc(S()-o),f>0&&(this.perf.body=f)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(x=this.config.hand.enabled?j5(r.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",o=S(),x=this.config.hand.enabled?await j5(r.tensor,this.config):[],f=Math.trunc(S()-o),f>0&&(this.perf.hand=f)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.config.async?(this.config.object.modelPath.includes("nanodet")?l=this.config.object.enabled?V5(r.tensor,this.config):[]:this.config.object.modelPath.includes("centernet")&&(l=this.config.object.enabled?q5(r.tensor,this.config):[]),this.perf.object&&delete this.perf.object):(this.state="run:object",o=S(),this.config.object.modelPath.includes("nanodet")?l=this.config.object.enabled?await V5(r.tensor,this.config):[]:this.config.object.modelPath.includes("centernet")&&(l=this.config.object.enabled?await q5(r.tensor,this.config):[]),f=Math.trunc(S()-o),f>0&&(this.perf.object=f)),this.analyze("End Object:"),this.config.async&&([d,y,x,l]=await Promise.all([d,y,x,l])),a.dispose(r.tensor);let u=[];this.config.gesture.enabled&&(o=S(),u=[...UA(d),...BA(y),...CA(x),...YA(d)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(S()-o)),this.perf.total=Math.trunc(S()-s),this.state="idle";let z={face:d,body:y,hand:x,gesture:u,object:l,performance:this.perf,canvas:r.canvas,timestamp:Date.now()};n(z)})}async warmup(e={}){let t=S();if(e&&(this.config=B(this.config,e)),!this.config.warmup||this.config.warmup==="none")return{error:"null"};let n;typeof createImageBitmap=="function"?n=await Z(this,C0).call(this):typeof Image!="undefined"?n=await Z(this,J0).call(this):n=await Z(this,K0).call(this);let o=S();return this.config.debug&&p("Warmup",this.config.warmup,Math.round(o-t),"ms",n),n}};f0=new WeakMap,P0=new WeakMap,M0=new WeakMap,r0=new WeakMap,i0=new WeakMap,m0=new WeakMap,U0=new WeakMap,z0=new WeakMap,Y0=new WeakMap,C0=new WeakMap,J0=new WeakMap,K0=new WeakMap;export{L2 as Human,L2 as default}; //# sourceMappingURL=human.esm-nobundle.js.map diff --git a/dist/human.esm-nobundle.js.map b/dist/human.esm-nobundle.js.map index 79c12520..2a9ffe6b 100644 --- a/dist/human.esm-nobundle.js.map +++ b/dist/human.esm-nobundle.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/helpers.ts", "../src/config.ts", "../src/sysinfo.ts", "../src/tfjs/tf-browser.ts", "../src/tfjs/backend.ts", "../src/blazeface/facemesh.ts", "../src/blazeface/box.ts", "../src/blazeface/util.ts", "../src/blazeface/blazeface.ts", "../src/blazeface/coords.ts", "../src/blazeface/facepipeline.ts", "../src/emotion/emotion.ts", "../src/faceres/faceres.ts", "../src/face.ts", "../src/posenet/posenet.ts", "../src/posenet/keypoints.ts", "../src/posenet/utils.ts", "../src/posenet/poses.ts", "../src/handpose/handpose.ts", "../src/handpose/box.ts", "../src/handpose/anchors.ts", "../src/handpose/handdetector.ts", "../src/handpose/util.ts", "../src/handpose/handpipeline.ts", "../src/blazepose/blazepose.ts", "../src/blazepose/annotations.ts", "../src/object/nanodet.ts", "../src/object/labels.ts", "../src/object/centernet.ts", "../src/gesture/gesture.ts", "../src/image/imagefx.js", "../src/image/image.ts", "../src/draw/draw.ts", "../src/sample.ts", "../src/human.ts"], - "sourcesContent": ["// helper function: join two paths\nexport function join(folder: string, file: string): string {\n const separator = folder.endsWith('/') ? '' : '/';\n const skipJoin = file.startsWith('.') || file.startsWith('/') || file.startsWith('http:') || file.startsWith('https:') || file.startsWith('file:');\n const path = skipJoin ? `${file}` : `${folder}${separator}${file}`;\n if (!path.toLocaleLowerCase().includes('.json')) throw new Error(`Human: ModelPath Error: ${path} Expecting JSON file`);\n return path;\n}\n\n// helper function: wrapper around console output\nexport function log(...msg) {\n const dt = new Date();\n const ts = `${dt.getHours().toString().padStart(2, '0')}:${dt.getMinutes().toString().padStart(2, '0')}:${dt.getSeconds().toString().padStart(2, '0')}.${dt.getMilliseconds().toString().padStart(3, '0')}`;\n // eslint-disable-next-line no-console\n if (msg) console.log(ts, 'Human:', ...msg);\n}\n\n// helper function: gets elapsed time on both browser and nodejs\nexport const now = () => {\n if (typeof performance !== 'undefined') return performance.now();\n return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString());\n};\n\n// helper function: perform deep merge of multiple objects so it allows full inheriance with overrides\nexport function mergeDeep(...objects) {\n const isObject = (obj) => obj && typeof obj === 'object';\n return objects.reduce((prev, obj) => {\n Object.keys(obj || {}).forEach((key) => {\n const pVal = prev[key];\n const oVal = obj[key];\n if (Array.isArray(pVal) && Array.isArray(oVal)) prev[key] = pVal.concat(...oVal);\n else if (isObject(pVal) && isObject(oVal)) prev[key] = mergeDeep(pVal, oVal);\n else prev[key] = oVal;\n });\n return prev;\n }, {});\n}\n", "/* eslint-disable indent */\n/* eslint-disable no-multi-spaces */\n\n/**\n * Configuration interface definition for **Human** library\n *\n * Contains all configurable parameters\n */\nexport interface Config {\n /** Backend used for TFJS operations */\n backend: null | '' | 'cpu' | 'wasm' | 'webgl' | 'humangl' | 'tensorflow',\n\n /** Path to *.wasm files if backend is set to `wasm` */\n wasmPath: string,\n\n /** Print debug statements to console */\n debug: boolean,\n\n /** Perform model loading and inference concurrently or sequentially */\n async: boolean,\n\n /** What to use for `human.warmup()`\n * - warmup pre-initializes all models for faster inference but can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n */\n warmup: 'none' | 'face' | 'full' | 'body',\n\n /** Base model path (typically starting with file://, http:// or https://) for all models\n * - individual modelPath values are relative to this path\n */\n modelBasePath: string,\n\n /** Cache sensitivity\n * - values 0..1 where 0.01 means reset cache if input changed more than 1%\n * - set to 0 to disable caching\n */\n cacheSensitivity: number;\n\n /** Run input through image filters before inference\n * - image filters run with near-zero latency as they are executed on the GPU\n */\n filter: {\n enabled: boolean,\n /** Resize input width\n * - if both width and height are set to 0, there is no resizing\n * - if just one is set, second one is scaled automatically\n * - if both are set, values are used as-is\n */\n width: number,\n /** Resize input height\n * - if both width and height are set to 0, there is no resizing\n * - if just one is set, second one is scaled automatically\n * - if both are set, values are used as-is\n */\n height: number,\n /** Return processed canvas imagedata in result */\n return: boolean,\n /** Flip input as mirror image */\n flip: boolean,\n /** Range: -1 (darken) to 1 (lighten) */\n brightness: number,\n /** Range: -1 (reduce contrast) to 1 (increase contrast) */\n contrast: number,\n /** Range: 0 (no sharpening) to 1 (maximum sharpening) */\n sharpness: number,\n /** Range: 0 (no blur) to N (blur radius in pixels) */\n blur: number\n /** Range: -1 (reduce saturation) to 1 (increase saturation) */\n saturation: number,\n /** Range: 0 (no change) to 360 (hue rotation in degrees) */\n hue: number,\n /** Image negative */\n negative: boolean,\n /** Image sepia colors */\n sepia: boolean,\n /** Image vintage colors */\n vintage: boolean,\n /** Image kodachrome colors */\n kodachrome: boolean,\n /** Image technicolor colors */\n technicolor: boolean,\n /** Image polaroid camera effect */\n polaroid: boolean,\n /** Range: 0 (no pixelate) to N (number of pixels to pixelate) */\n pixelate: number,\n },\n // type definition end\n\n /** Controlls gesture detection */\n gesture: {\n enabled: boolean,\n },\n\n /** Controlls and configures all face-specific options:\n * - face detection, face mesh detection, age, gender, emotion detection and face description\n * Parameters:\n * - enabled: true/false\n * - modelPath: path for each of face models\n * - minConfidence: threshold for discarding a prediction\n * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n * - maxDetected: maximum number of faces detected in the input, should be set to the minimum number for performance\n * - rotation: use calculated rotated face image or just box with rotation as-is, false means higher performance, but incorrect mesh mapping on higher face angles\n * - return: return extracted face as tensor for futher user processing\n */\n face: {\n enabled: boolean,\n detector: {\n modelPath: string,\n rotation: boolean,\n maxDetected: number,\n skipFrames: number,\n minConfidence: number,\n iouThreshold: number,\n return: boolean,\n },\n mesh: {\n enabled: boolean,\n modelPath: string,\n },\n iris: {\n enabled: boolean,\n modelPath: string,\n },\n description: {\n enabled: boolean,\n modelPath: string,\n skipFrames: number,\n minConfidence: number,\n },\n emotion: {\n enabled: boolean,\n minConfidence: number,\n skipFrames: number,\n modelPath: string,\n },\n },\n\n /** Controlls and configures all body detection specific options\n * - enabled: true/false\n * - modelPath: body pose model, can be absolute path or relative to modelBasePath\n * - minConfidence: threshold for discarding a prediction\n * - maxDetected: maximum number of people detected in the input, should be set to the minimum number for performance\n */\n body: {\n enabled: boolean,\n modelPath: string,\n maxDetected: number,\n minConfidence: number,\n },\n\n /** Controlls and configures all hand detection specific options\n * - enabled: true/false\n * - landmarks: detect hand landmarks or just hand boundary box\n * - modelPath: paths for hand detector and hand skeleton models, can be absolute path or relative to modelBasePath\n * - minConfidence: threshold for discarding a prediction\n * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n * - maxDetected: maximum number of hands detected in the input, should be set to the minimum number for performance\n * - rotation: use best-guess rotated hand image or just box with rotation as-is, false means higher performance, but incorrect finger mapping if hand is inverted\n */\n hand: {\n enabled: boolean,\n rotation: boolean,\n skipFrames: number,\n minConfidence: number,\n iouThreshold: number,\n maxDetected: number,\n landmarks: boolean,\n detector: {\n modelPath: string,\n },\n skeleton: {\n modelPath: string,\n },\n },\n\n /** Controlls and configures all object detection specific options\n * - enabled: true/false\n * - modelPath: object detection model, can be absolute path or relative to modelBasePath\n * - minConfidence: minimum score that detection must have to return as valid object\n * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n * - maxDetected: maximum number of detections to return\n */\n object: {\n enabled: boolean,\n modelPath: string,\n minConfidence: number,\n iouThreshold: number,\n maxDetected: number,\n skipFrames: number,\n },\n}\n\nconst config: Config = {\n backend: 'webgl', // select tfjs backend to use, leave empty to use default backend\n // can be 'webgl', 'wasm', 'cpu', or 'humangl' which is a custom version of webgl\n modelBasePath: '../models/', // base path for all models\n wasmPath: '../node_modules/@tensorflow/tfjs-backend-wasm/dist//', // path for wasm binaries, only used for backend: wasm\n debug: true, // print additional status messages to console\n async: true, // execute enabled models in parallel\n warmup: 'full', // what to use for human.warmup(), can be 'none', 'face', 'full'\n // warmup pre-initializes all models for faster inference but can take\n // significant time on startup\n // only used for `webgl` and `humangl` backends\n cacheSensitivity: 0.01, // cache sensitivity\n // values 0..1 where 0.01 means reset cache if input changed more than 1%\n // set to 0 to disable caching\n filter: { // run input through image filters before inference\n // image filters run with near-zero latency as they are executed on the GPU\n enabled: true, // enable image pre-processing filters\n width: 0, // resize input width\n height: 0, // resize input height\n // if both width and height are set to 0, there is no resizing\n // if just one is set, second one is scaled automatically\n // if both are set, values are used as-is\n flip: false, // flip input as mirror image\n return: true, // return processed canvas imagedata in result\n brightness: 0, // range: -1 (darken) to 1 (lighten)\n contrast: 0, // range: -1 (reduce contrast) to 1 (increase contrast)\n sharpness: 0, // range: 0 (no sharpening) to 1 (maximum sharpening)\n blur: 0, // range: 0 (no blur) to N (blur radius in pixels)\n saturation: 0, // range: -1 (reduce saturation) to 1 (increase saturation)\n hue: 0, // range: 0 (no change) to 360 (hue rotation in degrees)\n negative: false, // image negative\n sepia: false, // image sepia colors\n vintage: false, // image vintage colors\n kodachrome: false, // image kodachrome colors\n technicolor: false, // image technicolor colors\n polaroid: false, // image polaroid camera effect\n pixelate: 0, // range: 0 (no pixelate) to N (number of pixels to pixelate)\n },\n\n gesture: {\n enabled: true, // enable gesture recognition based on model results\n },\n\n face: {\n enabled: true, // controls if specified modul is enabled\n // face.enabled is required for all face models:\n // detector, mesh, iris, age, gender, emotion\n // (note: module is not loaded until it is required)\n detector: {\n modelPath: 'blazeface.json', // detector model, can be absolute path or relative to modelBasePath\n rotation: false, // use best-guess rotated face image or just box with rotation as-is\n // false means higher performance, but incorrect mesh mapping if face angle is above 20 degrees\n // this parameter is not valid in nodejs\n maxDetected: 10, // maximum number of faces detected in the input\n // should be set to the minimum number for performance\n skipFrames: 21, // how many max frames to go without re-running the face bounding box detector\n // only used when cacheSensitivity is not zero\n // e.g., if model is running st 25 FPS, we can re-use existing bounding\n // box for updated face analysis as the head probably hasn't moved much\n // in short time (10 * 1/25 = 0.25 sec)\n minConfidence: 0.2, // threshold for discarding a prediction\n iouThreshold: 0.1, // ammount of overlap between two detected objects before one object is removed\n return: false, // return extracted face as tensor\n },\n\n mesh: {\n enabled: true,\n modelPath: 'facemesh.json', // facemesh model, can be absolute path or relative to modelBasePath\n },\n\n iris: {\n enabled: true,\n modelPath: 'iris.json', // face iris model\n // can be either absolute path or relative to modelBasePath\n },\n\n description: {\n enabled: true, // to improve accuracy of face description extraction it is\n // recommended to enable detector.rotation and mesh.enabled\n modelPath: 'faceres.json', // face description model\n // can be either absolute path or relative to modelBasePath\n skipFrames: 31, // how many max frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n minConfidence: 0.1, // threshold for discarding a prediction\n },\n\n emotion: {\n enabled: true,\n minConfidence: 0.1, // threshold for discarding a prediction\n skipFrames: 32, // how max many frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n modelPath: 'emotion.json', // face emotion model, can be absolute path or relative to modelBasePath\n },\n },\n\n body: {\n enabled: true,\n modelPath: 'posenet.json', // body model, can be absolute path or relative to modelBasePath\n // can be 'posenet' or 'blazepose'\n maxDetected: 1, // maximum number of people detected in the input\n // should be set to the minimum number for performance\n // only valid for posenet as blazepose only detects single pose\n minConfidence: 0.1, // threshold for discarding a prediction\n },\n\n hand: {\n enabled: true,\n rotation: false, // use best-guess rotated hand image or just box with rotation as-is\n // false means higher performance, but incorrect finger mapping if hand is inverted\n skipFrames: 32, // how many max frames to go without re-running the hand bounding box detector\n // only used when cacheSensitivity is not zero\n // e.g., if model is running st 25 FPS, we can re-use existing bounding\n // box for updated hand skeleton analysis as the hand probably\n // hasn't moved much in short time (10 * 1/25 = 0.25 sec)\n minConfidence: 0.1, // threshold for discarding a prediction\n iouThreshold: 0.1, // ammount of overlap between two detected objects before one object is removed\n maxDetected: 2, // maximum number of hands detected in the input\n // should be set to the minimum number for performance\n landmarks: true, // detect hand landmarks or just hand boundary box\n detector: {\n modelPath: 'handdetect.json', // hand detector model, can be absolute path or relative to modelBasePath\n },\n skeleton: {\n modelPath: 'handskeleton.json', // hand skeleton model, can be absolute path or relative to modelBasePath\n },\n },\n\n object: {\n enabled: false,\n modelPath: 'mb3-centernet.json', // experimental: object detection model, can be absolute path or relative to modelBasePath\n // can be 'mb3-centernet' or 'nanodet'\n minConfidence: 0.2, // threshold for discarding a prediction\n iouThreshold: 0.4, // ammount of overlap between two detected objects before one object is removed\n maxDetected: 10, // maximum number of objects detected in the input\n skipFrames: 41, // how many max frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n },\n};\nexport { config as defaults };\n", "export function info(): { platform: string, agent: string } {\n let platform;\n let agent;\n if (typeof navigator !== 'undefined') {\n const raw = navigator.userAgent.match(/\\(([^()]+)\\)/g);\n if (raw && raw[0]) {\n const platformMatch = raw[0].match(/\\(([^()]+)\\)/g);\n platform = platformMatch ? platformMatch[0].replace(/\\(|\\)/g, '') : '';\n agent = navigator.userAgent.replace(raw[0], '');\n if (platform[1]) agent = agent.replace(raw[1], '');\n agent = agent.replace(/ /g, ' ');\n }\n } else if (typeof process !== 'undefined') {\n platform = `${process.platform} ${process.arch}`;\n agent = `NodeJS ${process.version}`;\n }\n return { platform, agent };\n}\n", "// wrapper to load tfjs in a single place so version can be changed quickly\n\n// simplified\n// { modules: 1250, moduleBytes: 4013323, imports: 7, importBytes: 2255, outputBytes: 2991826, outputFiles: 'dist/tfjs.esm.js' }\n// export * from '@tensorflow/tfjs/dist/index.js';\n// export * from '@tensorflow/tfjs-backend-wasm';\n\n// modular\n// { modules: 1253, moduleBytes: 4029357, imports: 7, importBytes: 2285, outputBytes: 2998298, outputFiles: 'dist/tfjs.esm.js' }\n\n// get versions of all packages.\nimport * as packageBundle from '@tensorflow/tfjs/package.json';\nimport * as packageCore from '@tensorflow/tfjs-core/package.json';\nimport * as packageData from '@tensorflow/tfjs-data/package.json';\nimport * as packageLayers from '@tensorflow/tfjs-layers/package.json';\nimport * as packageConverter from '@tensorflow/tfjs-converter/package.json';\n// for backends, get version from source so it can register backend during import\nimport { version_cpu } from '@tensorflow/tfjs-backend-cpu/dist/index.js';\nimport { version_webgl } from '@tensorflow/tfjs-backend-webgl/dist/index.js';\nimport { version_wasm } from '@tensorflow/tfjs-backend-wasm/dist/index.js';\n\n// export all - compiled\nexport * from '@tensorflow/tfjs-core/dist/index.js';\nexport * from '@tensorflow/tfjs-layers/dist/index.js';\nexport * from '@tensorflow/tfjs-converter/dist/index.js';\nexport * as data from '@tensorflow/tfjs-data/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-cpu/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-webgl/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-wasm/dist/index.js';\n\n// export all - sources\n/*\nexport * from '@tensorflow/tfjs-core/src/index';\nexport * from '@tensorflow/tfjs-layers/src/index';\nexport * from '@tensorflow/tfjs-converter/src/index';\nexport * as data from '@tensorflow/tfjs-data/src/index';\nexport * from '@tensorflow/tfjs-backend-cpu/src/index';\nexport * from '@tensorflow/tfjs-backend-webgl/src/index';\nexport * from '@tensorflow/tfjs-backend-wasm/src/index';\n*/\n\n// export versions\nexport const version = {\n tfjs: packageBundle?.version || undefined,\n 'tfjs-core': packageCore?.version || undefined,\n 'tfjs-data': packageData?.version || undefined,\n 'tfjs-layers': packageLayers?.version || undefined,\n 'tfjs-converter': packageConverter?.version || undefined,\n 'tfjs-backend-cpu': version_cpu || undefined,\n 'tfjs-backend-webgl': version_webgl || undefined,\n 'tfjs-backend-wasm': version_wasm || undefined,\n};\n// export const version = {};\n", "import { log } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\n\nexport const config = {\n name: 'humangl',\n priority: 99,\n canvas: null,\n gl: null,\n width: 1024,\n height: 1024,\n webGLattr: { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.2\n alpha: false,\n antialias: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n depth: false,\n stencil: false,\n failIfMajorPerformanceCaveat: false,\n desynchronized: true,\n },\n};\n\nexport function register(): void {\n if (!tf.findBackend(config.name)) {\n log('backend registration:', config.name);\n try {\n config.canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(config.width, config.height) : document.createElement('canvas');\n } catch (err) {\n log('error: cannot create canvas:', err);\n return;\n }\n try {\n config.gl = config.canvas.getContext('webgl2', config.webGLattr);\n } catch (err) {\n log('error: cannot get WebGL2 context:', err);\n return;\n }\n try {\n tf.setWebGLContext(2, config.gl);\n } catch (err) {\n log('error: cannot set WebGL2 context:', err);\n return;\n }\n try {\n const ctx = new tf.GPGPUContext(config.gl);\n tf.registerBackend(config.name, () => new tf.MathBackendWebGL(ctx), config.priority);\n } catch (err) {\n log('error: cannot register WebGL backend:', err);\n return;\n }\n try {\n const kernels = tf.getKernelsForBackend('webgl');\n kernels.forEach((kernelConfig) => {\n const newKernelConfig = { ...kernelConfig, backendName: config.name };\n tf.registerKernel(newKernelConfig);\n });\n } catch (err) {\n log('error: cannot update WebGL backend registration:', err);\n return;\n }\n try {\n tf.ENV.set('WEBGL_VERSION', 2);\n // tf.ENV.set('WEBGL_MAX_TEXTURE_SIZE', config.gl.getParameter(config.gl.MAX_TEXTURE_SIZE));\n // tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true);\n // tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', true);\n } catch (err) {\n log('error: cannot set WebGL backend flags:', err);\n return;\n }\n log('backend registered:', config.name);\n }\n}\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as blazeface from './blazeface';\nimport * as facepipeline from './facepipeline';\nimport * as coords from './coords';\n\nlet faceModels:[any, any, any] = [null, null, null];\nlet facePipeline;\n\nexport async function predict(input, config): Promise<{ confidence, boxConfidence, faceConfidence, box, mesh, boxRaw, meshRaw, annotations, image }[]> {\n const predictions = await facePipeline.predict(input, config);\n const results: Array<{ confidence, boxConfidence, faceConfidence, box, mesh, boxRaw, meshRaw, annotations, image }> = [];\n for (const prediction of (predictions || [])) {\n if (!prediction || prediction.isDisposedInternal) continue; // guard against disposed tensors on long running operations such as pause in middle of processing\n const meshRaw = prediction.mesh.map((pt) => [\n pt[0] / input.shape[2],\n pt[1] / input.shape[1],\n pt[2] / facePipeline.meshSize,\n ]);\n const annotations = {};\n if (prediction.mesh && prediction.mesh.length > 0) {\n for (const key of Object.keys(coords.MESH_ANNOTATIONS)) annotations[key] = coords.MESH_ANNOTATIONS[key].map((index) => prediction.mesh[index]);\n }\n const clampedBox = prediction.box ? [\n Math.max(0, prediction.box.startPoint[0]),\n Math.max(0, prediction.box.startPoint[1]),\n Math.min(input.shape[2], prediction.box.endPoint[0]) - Math.max(0, prediction.box.startPoint[0]),\n Math.min(input.shape[1], prediction.box.endPoint[1]) - Math.max(0, prediction.box.startPoint[1]),\n ] : 0;\n const boxRaw = prediction.box ? [\n prediction.box.startPoint[0] / input.shape[2],\n prediction.box.startPoint[1] / input.shape[1],\n (prediction.box.endPoint[0] - prediction.box.startPoint[0]) / input.shape[2],\n (prediction.box.endPoint[1] - prediction.box.startPoint[1]) / input.shape[1],\n ] : [];\n results.push({\n confidence: Math.round(100 * prediction.faceConfidence || 100 * prediction.boxConfidence || 0) / 100,\n boxConfidence: Math.round(100 * prediction.boxConfidence) / 100,\n faceConfidence: Math.round(100 * prediction.faceConfidence) / 100,\n box: clampedBox,\n boxRaw,\n mesh: prediction.mesh,\n meshRaw,\n annotations,\n image: prediction.image,\n });\n if (prediction.coords) prediction.coords.dispose();\n }\n return results;\n}\n\nexport async function load(config): Promise<[Object, Object, Object]> {\n if ((!faceModels[0] && config.face.enabled) || (!faceModels[1] && config.face.mesh.enabled) || (!faceModels[2] && config.face.iris.enabled)) {\n faceModels = await Promise.all([\n (!faceModels[0] && config.face.enabled) ? blazeface.load(config) : null,\n (!faceModels[1] && config.face.mesh.enabled) ? tf.loadGraphModel(join(config.modelBasePath, config.face.mesh.modelPath), { fromTFHub: config.face.mesh.modelPath.includes('tfhub.dev') }) : null,\n (!faceModels[2] && config.face.iris.enabled) ? tf.loadGraphModel(join(config.modelBasePath, config.face.iris.modelPath), { fromTFHub: config.face.iris.modelPath.includes('tfhub.dev') }) : null,\n ]);\n if (config.face.mesh.enabled) {\n if (!faceModels[1] || !faceModels[1].modelUrl) log('load model failed:', config.face.mesh.modelPath);\n else if (config.debug) log('load model:', faceModels[1].modelUrl);\n }\n if (config.face.iris.enabled) {\n if (!faceModels[2] || !faceModels[1].modelUrl) log('load model failed:', config.face.iris.modelPath);\n else if (config.debug) log('load model:', faceModels[2].modelUrl);\n }\n } else if (config.debug) {\n log('cached model:', faceModels[0].model.modelUrl);\n log('cached model:', faceModels[1].modelUrl);\n log('cached model:', faceModels[2].modelUrl);\n }\n facePipeline = new facepipeline.Pipeline(faceModels[0], faceModels[1], faceModels[2]);\n return faceModels;\n}\n\nexport const triangulation = coords.TRI468;\nexport const uvmap = coords.UV468;\n", "import * as tf from '../../dist/tfjs.esm.js';\n\nexport function scaleBoxCoordinates(box, factor) {\n const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]];\n const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\n return { startPoint, endPoint };\n}\n\nexport function getBoxSize(box) {\n return [\n Math.abs(box.endPoint[0] - box.startPoint[0]),\n Math.abs(box.endPoint[1] - box.startPoint[1]),\n ];\n}\n\nexport function getBoxCenter(box) {\n return [\n box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2,\n box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2,\n ];\n}\n\nexport function cutBoxFromImageAndResize(box, image, cropSize) {\n const h = image.shape[1];\n const w = image.shape[2];\n const boxes = [[\n box.startPoint[1] / h,\n box.startPoint[0] / w,\n box.endPoint[1] / h,\n box.endPoint[0] / w,\n ]];\n return tf.image.cropAndResize(image, boxes, [0], cropSize);\n}\n\nexport function enlargeBox(box, factor = 1.5) {\n const center = getBoxCenter(box);\n const size = getBoxSize(box);\n const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2];\n const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]];\n const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]];\n return { startPoint, endPoint, landmarks: box.landmarks };\n}\n\nexport function squarifyBox(box) {\n const centers = getBoxCenter(box);\n const size = getBoxSize(box);\n const maxEdge = Math.max(...size);\n const halfSize = maxEdge / 2;\n const startPoint = [Math.round(centers[0] - halfSize), Math.round(centers[1] - halfSize)];\n const endPoint = [Math.round(centers[0] + halfSize), Math.round(centers[1] + halfSize)];\n return { startPoint, endPoint, landmarks: box.landmarks };\n}\n\nexport function calculateLandmarksBoundingBox(landmarks) {\n const xs = landmarks.map((d) => d[0]);\n const ys = landmarks.map((d) => d[1]);\n const startPoint = [Math.min(...xs), Math.min(...ys)];\n const endPoint = [Math.max(...xs), Math.max(...ys)];\n return { startPoint, endPoint, landmarks };\n}\n\nexport const disposeBox = (t) => {\n t.startPoint.dispose();\n t.endPoint.dispose();\n};\n\nexport const createBox = (startEndTensor) => ({\n startPoint: tf.slice(startEndTensor, [0, 0], [-1, 2]),\n endPoint: tf.slice(startEndTensor, [0, 2], [-1, 2]),\n});\n", "export const IDENTITY_MATRIX = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];\n/**\n * Normalizes the provided angle to the range -pi to pi.\n * @param angle The angle in radians to be normalized.\n */\nexport function normalizeRadians(angle) {\n return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n}\n\n/**\n * Computes the angle of rotation between two anchor points.\n * @param point1 First anchor point\n * @param point2 Second anchor point\n */\nexport function computeRotation(point1, point2) {\n const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]);\n return normalizeRadians(radians);\n}\n\nexport function radToDegrees(rad) {\n return rad * 180 / Math.PI;\n}\n\nexport function buildTranslationMatrix(x, y) {\n return [[1, 0, x], [0, 1, y], [0, 0, 1]];\n}\n\nexport function dot(v1, v2) {\n let product = 0;\n for (let i = 0; i < v1.length; i++) {\n product += v1[i] * v2[i];\n }\n return product;\n}\n\nexport function getColumnFrom2DArr(arr, columnIndex) {\n const column: Array = [];\n for (let i = 0; i < arr.length; i++) {\n column.push(arr[i][columnIndex]);\n }\n return column;\n}\n\nexport function multiplyTransformMatrices(mat1, mat2) {\n const product: Array = [];\n const size = mat1.length;\n for (let row = 0; row < size; row++) {\n product.push([]);\n for (let col = 0; col < size; col++) {\n product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n }\n }\n return product;\n}\n\nexport function buildRotationMatrix(rotation, center) {\n const cosA = Math.cos(rotation);\n const sinA = Math.sin(rotation);\n const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]];\n const translationMatrix = buildTranslationMatrix(center[0], center[1]);\n const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix);\n const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]);\n return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix);\n}\n\nexport function invertTransformMatrix(matrix) {\n const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]];\n const translationComponent = [matrix[0][2], matrix[1][2]];\n const invertedTranslation = [\n -dot(rotationComponent[0], translationComponent),\n -dot(rotationComponent[1], translationComponent),\n ];\n return [\n rotationComponent[0].concat(invertedTranslation[0]),\n rotationComponent[1].concat(invertedTranslation[1]),\n [0, 0, 1],\n ];\n}\n\nexport function rotatePoint(homogeneousCoordinate, rotationMatrix) {\n return [\n dot(homogeneousCoordinate, rotationMatrix[0]),\n dot(homogeneousCoordinate, rotationMatrix[1]),\n ];\n}\n\nexport function xyDistanceBetweenPoints(a, b) {\n return Math.sqrt(((a[0] - b[0]) ** 2) + ((a[1] - b[1]) ** 2));\n}\n\nexport function generateAnchors(inputSize) {\n const spec = { strides: [inputSize / 16, inputSize / 8], anchors: [2, 6] };\n const anchors: Array<[number, number]> = [];\n for (let i = 0; i < spec.strides.length; i++) {\n const stride = spec.strides[i];\n const gridRows = Math.floor((inputSize + stride - 1) / stride);\n const gridCols = Math.floor((inputSize + stride - 1) / stride);\n const anchorsNum = spec.anchors[i];\n for (let gridY = 0; gridY < gridRows; gridY++) {\n const anchorY = stride * (gridY + 0.5);\n for (let gridX = 0; gridX < gridCols; gridX++) {\n const anchorX = stride * (gridX + 0.5);\n for (let n = 0; n < anchorsNum; n++) {\n anchors.push([anchorX, anchorY]);\n }\n }\n }\n }\n return anchors;\n}\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as util from './util';\n\nconst keypointsCount = 6;\n\nfunction decodeBounds(boxOutputs, anchors, inputSize) {\n const boxStarts = tf.slice(boxOutputs, [0, 1], [-1, 2]);\n const centers = tf.add(boxStarts, anchors);\n const boxSizes = tf.slice(boxOutputs, [0, 3], [-1, 2]);\n const boxSizesNormalized = tf.div(boxSizes, inputSize);\n const centersNormalized = tf.div(centers, inputSize);\n const halfBoxSize = tf.div(boxSizesNormalized, 2);\n const starts = tf.sub(centersNormalized, halfBoxSize);\n const ends = tf.add(centersNormalized, halfBoxSize);\n const startNormalized = tf.mul(starts, inputSize);\n const endNormalized = tf.mul(ends, inputSize);\n const concatAxis = 1;\n return tf.concat2d([startNormalized, endNormalized], concatAxis);\n}\n\nexport class BlazeFaceModel {\n model: any;\n anchorsData: any;\n anchors: any;\n inputSize: number;\n config: any;\n\n constructor(model, config) {\n this.model = model;\n this.anchorsData = util.generateAnchors(model.inputs[0].shape[1]);\n this.anchors = tf.tensor2d(this.anchorsData);\n this.inputSize = model.inputs[0].shape[2];\n this.config = config;\n }\n\n async getBoundingBoxes(inputImage) {\n // sanity check on input\n if ((!inputImage) || (inputImage.isDisposedInternal) || (inputImage.shape.length !== 4) || (inputImage.shape[1] < 1) || (inputImage.shape[2] < 1)) return null;\n const [batch, boxes, scores] = tf.tidy(() => {\n const resizedImage = inputImage.resizeBilinear([this.inputSize, this.inputSize]);\n const normalizedImage = resizedImage.div(127.5).sub(0.5);\n const res = this.model.execute(normalizedImage);\n let batchOut;\n if (Array.isArray(res)) { // are we using tfhub or pinto converted model?\n const sorted = res.sort((a, b) => a.size - b.size);\n const concat384 = tf.concat([sorted[0], sorted[2]], 2); // dim: 384, 1 + 16\n const concat512 = tf.concat([sorted[1], sorted[3]], 2); // dim: 512, 1 + 16\n const concat = tf.concat([concat512, concat384], 1);\n batchOut = concat.squeeze(0);\n } else {\n batchOut = res.squeeze(); // when using tfhub model\n }\n const boxesOut = decodeBounds(batchOut, this.anchors, [this.inputSize, this.inputSize]);\n const logits = tf.slice(batchOut, [0, 0], [-1, 1]);\n const scoresOut = tf.sigmoid(logits).squeeze().dataSync();\n return [batchOut, boxesOut, scoresOut];\n });\n const nmsTensor = await tf.image.nonMaxSuppressionAsync(boxes, scores, this.config.face.detector.maxDetected, this.config.face.detector.iouThreshold, this.config.face.detector.minConfidence);\n const nms = nmsTensor.arraySync();\n nmsTensor.dispose();\n const annotatedBoxes: Array<{ box: any, landmarks: any, anchor: number[], confidence: number }> = [];\n for (let i = 0; i < nms.length; i++) {\n const confidence = scores[nms[i]];\n if (confidence > this.config.face.detector.minConfidence) {\n const boundingBox = tf.slice(boxes, [nms[i], 0], [1, -1]);\n const localBox = box.createBox(boundingBox);\n boundingBox.dispose();\n const anchor = this.anchorsData[nms[i]];\n const landmarks = tf.tidy(() => tf.slice(batch, [nms[i], keypointsCount - 1], [1, -1]).squeeze().reshape([keypointsCount, -1]));\n annotatedBoxes.push({ box: localBox, landmarks, anchor, confidence });\n }\n }\n // boundingBoxes.forEach((t) => t.dispose());\n batch.dispose();\n boxes.dispose();\n // scores.dispose();\n return {\n boxes: annotatedBoxes,\n scaleFactor: [inputImage.shape[2] / this.inputSize, inputImage.shape[1] / this.inputSize],\n };\n }\n}\n\nexport async function load(config) {\n const model = await tf.loadGraphModel(join(config.modelBasePath, config.face.detector.modelPath), { fromTFHub: config.face.detector.modelPath.includes('tfhub.dev') });\n const blazeFace = new BlazeFaceModel(model, config);\n if (!model || !model.modelUrl) log('load model failed:', config.face.detector.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n return blazeFace;\n}\n", "export const MESH_ANNOTATIONS = {\n silhouette: [\n 10, 338, 297, 332, 284, 251, 389, 356, 454, 323, 361, 288,\n 397, 365, 379, 378, 400, 377, 152, 148, 176, 149, 150, 136,\n 172, 58, 132, 93, 234, 127, 162, 21, 54, 103, 67, 109,\n ],\n lipsUpperOuter: [61, 185, 40, 39, 37, 0, 267, 269, 270, 409, 291],\n lipsLowerOuter: [146, 91, 181, 84, 17, 314, 405, 321, 375, 291],\n lipsUpperInner: [78, 191, 80, 81, 82, 13, 312, 311, 310, 415, 308],\n lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308],\n rightEyeUpper0: [246, 161, 160, 159, 158, 157, 173],\n rightEyeLower0: [33, 7, 163, 144, 145, 153, 154, 155, 133],\n rightEyeUpper1: [247, 30, 29, 27, 28, 56, 190],\n rightEyeLower1: [130, 25, 110, 24, 23, 22, 26, 112, 243],\n rightEyeUpper2: [113, 225, 224, 223, 222, 221, 189],\n rightEyeLower2: [226, 31, 228, 229, 230, 231, 232, 233, 244],\n rightEyeLower3: [143, 111, 117, 118, 119, 120, 121, 128, 245],\n rightEyebrowUpper: [156, 70, 63, 105, 66, 107, 55, 193],\n rightEyebrowLower: [35, 124, 46, 53, 52, 65],\n rightEyeIris: [473, 474, 475, 476, 477],\n leftEyeUpper0: [466, 388, 387, 386, 385, 384, 398],\n leftEyeLower0: [263, 249, 390, 373, 374, 380, 381, 382, 362],\n leftEyeUpper1: [467, 260, 259, 257, 258, 286, 414],\n leftEyeLower1: [359, 255, 339, 254, 253, 252, 256, 341, 463],\n leftEyeUpper2: [342, 445, 444, 443, 442, 441, 413],\n leftEyeLower2: [446, 261, 448, 449, 450, 451, 452, 453, 464],\n leftEyeLower3: [372, 340, 346, 347, 348, 349, 350, 357, 465],\n leftEyebrowUpper: [383, 300, 293, 334, 296, 336, 285, 417],\n leftEyebrowLower: [265, 353, 276, 283, 282, 295],\n leftEyeIris: [468, 469, 470, 471, 472],\n midwayBetweenEyes: [168],\n noseTip: [1],\n noseBottom: [2],\n noseRightCorner: [98],\n noseLeftCorner: [327],\n rightCheek: [205],\n leftCheek: [425],\n};\n\nexport const MESH_TO_IRIS_INDICES_MAP = [ // A mapping from facemesh model keypoints to iris model keypoints.\n { key: 'EyeUpper0', indices: [9, 10, 11, 12, 13, 14, 15] },\n { key: 'EyeUpper1', indices: [25, 26, 27, 28, 29, 30, 31] },\n { key: 'EyeUpper2', indices: [41, 42, 43, 44, 45, 46, 47] },\n { key: 'EyeLower0', indices: [0, 1, 2, 3, 4, 5, 6, 7, 8] },\n { key: 'EyeLower1', indices: [16, 17, 18, 19, 20, 21, 22, 23, 24] },\n { key: 'EyeLower2', indices: [32, 33, 34, 35, 36, 37, 38, 39, 40] },\n { key: 'EyeLower3', indices: [54, 55, 56, 57, 58, 59, 60, 61, 62] },\n // { key: 'EyebrowUpper', indices: [63, 64, 65, 66, 67, 68, 69, 70] },\n // { key: 'EyebrowLower', indices: [48, 49, 50, 51, 52, 53] },\n];\n\nexport const UV468 = [\n [0.499976992607117, 0.652534008026123],\n [0.500025987625122, 0.547487020492554],\n [0.499974012374878, 0.602371990680695],\n [0.482113003730774, 0.471979022026062],\n [0.500150978565216, 0.527155995368958],\n [0.499909996986389, 0.498252987861633],\n [0.499523013830185, 0.40106201171875],\n [0.289712011814117, 0.380764007568359],\n [0.499954998493195, 0.312398016452789],\n [0.499987006187439, 0.269918978214264],\n [0.500023007392883, 0.107050001621246],\n [0.500023007392883, 0.666234016418457],\n [0.5000159740448, 0.679224014282227],\n [0.500023007392883, 0.692348003387451],\n [0.499976992607117, 0.695277988910675],\n [0.499976992607117, 0.70593398809433],\n [0.499976992607117, 0.719385027885437],\n [0.499976992607117, 0.737019002437592],\n [0.499967992305756, 0.781370997428894],\n [0.499816000461578, 0.562981009483337],\n [0.473773002624512, 0.573909997940063],\n [0.104906998574734, 0.254140973091125],\n [0.365929991006851, 0.409575998783112],\n [0.338757991790771, 0.41302502155304],\n [0.311120003461838, 0.409460008144379],\n [0.274657994508743, 0.389131009578705],\n [0.393361985683441, 0.403706014156342],\n [0.345234006643295, 0.344011008739471],\n [0.370094001293182, 0.346076011657715],\n [0.319321990013123, 0.347265005111694],\n [0.297903001308441, 0.353591024875641],\n [0.24779200553894, 0.410809993743896],\n [0.396889001131058, 0.842755019664764],\n [0.280097991228104, 0.375599980354309],\n [0.106310002505779, 0.399955987930298],\n [0.2099249958992, 0.391353011131287],\n [0.355807989835739, 0.534406006336212],\n [0.471751004457474, 0.65040397644043],\n [0.474155008792877, 0.680191993713379],\n [0.439785003662109, 0.657229006290436],\n [0.414617002010345, 0.66654098033905],\n [0.450374007225037, 0.680860996246338],\n [0.428770989179611, 0.682690978050232],\n [0.374971002340317, 0.727805018424988],\n [0.486716985702515, 0.547628998756409],\n [0.485300987958908, 0.527395009994507],\n [0.257764995098114, 0.314490020275116],\n [0.401223003864288, 0.455172002315521],\n [0.429818987846375, 0.548614978790283],\n [0.421351999044418, 0.533740997314453],\n [0.276895999908447, 0.532056987285614],\n [0.483370006084442, 0.499586999416351],\n [0.33721199631691, 0.282882988452911],\n [0.296391993761063, 0.293242990970612],\n [0.169294998049736, 0.193813979625702],\n [0.447580009698868, 0.302609980106354],\n [0.392390012741089, 0.353887975215912],\n [0.354490011930466, 0.696784019470215],\n [0.067304998636246, 0.730105042457581],\n [0.442739009857178, 0.572826027870178],\n [0.457098007202148, 0.584792017936707],\n [0.381974011659622, 0.694710969924927],\n [0.392388999462128, 0.694203019142151],\n [0.277076005935669, 0.271932005882263],\n [0.422551989555359, 0.563233017921448],\n [0.385919004678726, 0.281364023685455],\n [0.383103013038635, 0.255840003490448],\n [0.331431001424789, 0.119714021682739],\n [0.229923993349075, 0.232002973556519],\n [0.364500999450684, 0.189113974571228],\n [0.229622006416321, 0.299540996551514],\n [0.173287004232407, 0.278747975826263],\n [0.472878992557526, 0.666198015213013],\n [0.446828007698059, 0.668527007102966],\n [0.422762006521225, 0.673889994621277],\n [0.445307999849319, 0.580065965652466],\n [0.388103008270264, 0.693961024284363],\n [0.403039008378983, 0.706539988517761],\n [0.403629004955292, 0.693953037261963],\n [0.460041999816895, 0.557139039039612],\n [0.431158006191254, 0.692366003990173],\n [0.452181994915009, 0.692366003990173],\n [0.475387006998062, 0.692366003990173],\n [0.465828001499176, 0.779190003871918],\n [0.472328990697861, 0.736225962638855],\n [0.473087012767792, 0.717857003211975],\n [0.473122000694275, 0.704625964164734],\n [0.473033010959625, 0.695277988910675],\n [0.427942007780075, 0.695277988910675],\n [0.426479011774063, 0.703539967536926],\n [0.423162013292313, 0.711845993995667],\n [0.4183090031147, 0.720062971115112],\n [0.390094995498657, 0.639572978019714],\n [0.013953999616206, 0.560034036636353],\n [0.499913990497589, 0.58014702796936],\n [0.413199990987778, 0.69539999961853],\n [0.409626007080078, 0.701822996139526],\n [0.468080013990402, 0.601534962654114],\n [0.422728985548019, 0.585985004901886],\n [0.463079988956451, 0.593783974647522],\n [0.37211999297142, 0.47341400384903],\n [0.334562003612518, 0.496073007583618],\n [0.411671012639999, 0.546965003013611],\n [0.242175996303558, 0.14767599105835],\n [0.290776997804642, 0.201445996761322],\n [0.327338010072708, 0.256527006626129],\n [0.399509996175766, 0.748921036720276],\n [0.441727995872498, 0.261676013469696],\n [0.429764986038208, 0.187834024429321],\n [0.412198007106781, 0.108901023864746],\n [0.288955003023148, 0.398952007293701],\n [0.218936994671822, 0.435410976409912],\n [0.41278201341629, 0.398970007896423],\n [0.257135003805161, 0.355440020561218],\n [0.427684992551804, 0.437960982322693],\n [0.448339998722076, 0.536936044692993],\n [0.178560003638268, 0.45755398273468],\n [0.247308000922203, 0.457193970680237],\n [0.286267012357712, 0.467674970626831],\n [0.332827985286713, 0.460712015628815],\n [0.368755996227264, 0.447206974029541],\n [0.398963987827301, 0.432654976844788],\n [0.476410001516342, 0.405806005001068],\n [0.189241006970406, 0.523923993110657],\n [0.228962004184723, 0.348950982093811],\n [0.490725994110107, 0.562400996685028],\n [0.404670000076294, 0.485132992267609],\n [0.019469000399113, 0.401564002037048],\n [0.426243007183075, 0.420431017875671],\n [0.396993011236191, 0.548797011375427],\n [0.266469985246658, 0.376977026462555],\n [0.439121007919312, 0.51895797252655],\n [0.032313998788595, 0.644356966018677],\n [0.419054001569748, 0.387154996395111],\n [0.462783008813858, 0.505746960639954],\n [0.238978996872902, 0.779744982719421],\n [0.198220998048782, 0.831938028335571],\n [0.107550002634525, 0.540755033493042],\n [0.183610007166862, 0.740257024765015],\n [0.134409993886948, 0.333683013916016],\n [0.385764002799988, 0.883153975009918],\n [0.490967005491257, 0.579378008842468],\n [0.382384985685349, 0.508572995662689],\n [0.174399003386497, 0.397670984268188],\n [0.318785011768341, 0.39623498916626],\n [0.343364000320435, 0.400596976280212],\n [0.396100014448166, 0.710216999053955],\n [0.187885001301765, 0.588537991046906],\n [0.430987000465393, 0.944064974784851],\n [0.318993002176285, 0.898285031318665],\n [0.266247987747192, 0.869701027870178],\n [0.500023007392883, 0.190576016902924],\n [0.499976992607117, 0.954452991485596],\n [0.366169989109039, 0.398822009563446],\n [0.393207013607025, 0.39553701877594],\n [0.410373002290726, 0.391080021858215],\n [0.194993004202843, 0.342101991176605],\n [0.388664990663528, 0.362284004688263],\n [0.365961998701096, 0.355970978736877],\n [0.343364000320435, 0.355356991291046],\n [0.318785011768341, 0.35834002494812],\n [0.301414996385574, 0.363156020641327],\n [0.058132998645306, 0.319076001644135],\n [0.301414996385574, 0.387449026107788],\n [0.499987989664078, 0.618434011936188],\n [0.415838003158569, 0.624195992946625],\n [0.445681989192963, 0.566076993942261],\n [0.465844005346298, 0.620640993118286],\n [0.49992299079895, 0.351523995399475],\n [0.288718998432159, 0.819945991039276],\n [0.335278987884521, 0.852819979190826],\n [0.440512001514435, 0.902418971061707],\n [0.128294005990028, 0.791940987110138],\n [0.408771991729736, 0.373893976211548],\n [0.455606997013092, 0.451801002025604],\n [0.499877005815506, 0.908990025520325],\n [0.375436991453171, 0.924192011356354],\n [0.11421000212431, 0.615022003650665],\n [0.448662012815475, 0.695277988910675],\n [0.4480200111866, 0.704632043838501],\n [0.447111994028091, 0.715808033943176],\n [0.444831997156143, 0.730794012546539],\n [0.430011987686157, 0.766808986663818],\n [0.406787008047104, 0.685672998428345],\n [0.400738000869751, 0.681069016456604],\n [0.392399996519089, 0.677703022956848],\n [0.367855995893478, 0.663918972015381],\n [0.247923001646996, 0.601333022117615],\n [0.452769994735718, 0.420849978923798],\n [0.43639200925827, 0.359887003898621],\n [0.416164010763168, 0.368713974952698],\n [0.413385987281799, 0.692366003990173],\n [0.228018000721931, 0.683571994304657],\n [0.468268007040024, 0.352671027183533],\n [0.411361992359161, 0.804327011108398],\n [0.499989002943039, 0.469825029373169],\n [0.479153990745544, 0.442654013633728],\n [0.499974012374878, 0.439637005329132],\n [0.432112008333206, 0.493588984012604],\n [0.499886006116867, 0.866917014122009],\n [0.49991300702095, 0.821729004383087],\n [0.456548988819122, 0.819200992584229],\n [0.344549000263214, 0.745438992977142],\n [0.37890899181366, 0.574010014533997],\n [0.374292999505997, 0.780184984207153],\n [0.319687992334366, 0.570737957954407],\n [0.357154995203018, 0.604269981384277],\n [0.295284003019333, 0.621580958366394],\n [0.447750002145767, 0.862477004528046],\n [0.410986006259918, 0.508723020553589],\n [0.31395098567009, 0.775308012962341],\n [0.354128003120422, 0.812552988529205],\n [0.324548006057739, 0.703992962837219],\n [0.189096003770828, 0.646299958229065],\n [0.279776990413666, 0.71465802192688],\n [0.1338230073452, 0.682700991630554],\n [0.336768001317978, 0.644733011722565],\n [0.429883986711502, 0.466521978378296],\n [0.455527991056442, 0.548622965812683],\n [0.437114000320435, 0.558896005153656],\n [0.467287987470627, 0.529924988746643],\n [0.414712011814117, 0.335219979286194],\n [0.37704598903656, 0.322777986526489],\n [0.344107985496521, 0.320150971412659],\n [0.312875986099243, 0.32233202457428],\n [0.283526003360748, 0.333190023899078],\n [0.241245999932289, 0.382785975933075],\n [0.102986000478268, 0.468762993812561],\n [0.267612010240555, 0.424560010433197],\n [0.297879010438919, 0.433175981044769],\n [0.333433985710144, 0.433878004550934],\n [0.366427004337311, 0.426115989685059],\n [0.396012008190155, 0.416696012020111],\n [0.420121014118195, 0.41022801399231],\n [0.007561000064015, 0.480777025222778],\n [0.432949006557465, 0.569517970085144],\n [0.458638995885849, 0.479089021682739],\n [0.473466008901596, 0.545744001865387],\n [0.476087987422943, 0.563830018043518],\n [0.468472003936768, 0.555056989192963],\n [0.433990985155106, 0.582361996173859],\n [0.483518004417419, 0.562983989715576],\n [0.482482999563217, 0.57784903049469],\n [0.42645001411438, 0.389798998832703],\n [0.438998997211456, 0.39649498462677],\n [0.450067013502121, 0.400434017181396],\n [0.289712011814117, 0.368252992630005],\n [0.276670008897781, 0.363372981548309],\n [0.517862021923065, 0.471948027610779],\n [0.710287988185883, 0.380764007568359],\n [0.526226997375488, 0.573909997940063],\n [0.895093023777008, 0.254140973091125],\n [0.634069979190826, 0.409575998783112],\n [0.661242008209229, 0.41302502155304],\n [0.688880026340485, 0.409460008144379],\n [0.725341975688934, 0.389131009578705],\n [0.606630027294159, 0.40370500087738],\n [0.654766023159027, 0.344011008739471],\n [0.629905998706818, 0.346076011657715],\n [0.680678009986877, 0.347265005111694],\n [0.702096998691559, 0.353591024875641],\n [0.75221198797226, 0.410804986953735],\n [0.602918028831482, 0.842862963676453],\n [0.719901978969574, 0.375599980354309],\n [0.893692970275879, 0.399959981441498],\n [0.790081977844238, 0.391354024410248],\n [0.643998026847839, 0.534487962722778],\n [0.528249025344849, 0.65040397644043],\n [0.525849997997284, 0.680191040039062],\n [0.560214996337891, 0.657229006290436],\n [0.585384011268616, 0.66654098033905],\n [0.549625992774963, 0.680860996246338],\n [0.57122802734375, 0.682691991329193],\n [0.624852001667023, 0.72809898853302],\n [0.513050019741058, 0.547281980514526],\n [0.51509702205658, 0.527251958847046],\n [0.742246985435486, 0.314507007598877],\n [0.598631024360657, 0.454979002475739],\n [0.570338010787964, 0.548575043678284],\n [0.578631997108459, 0.533622980117798],\n [0.723087012767792, 0.532054007053375],\n [0.516445994377136, 0.499638974666595],\n [0.662801027297974, 0.282917976379395],\n [0.70362401008606, 0.293271005153656],\n [0.830704987049103, 0.193813979625702],\n [0.552385985851288, 0.302568018436432],\n [0.607609987258911, 0.353887975215912],\n [0.645429015159607, 0.696707010269165],\n [0.932694971561432, 0.730105042457581],\n [0.557260990142822, 0.572826027870178],\n [0.542901992797852, 0.584792017936707],\n [0.6180260181427, 0.694710969924927],\n [0.607590973377228, 0.694203019142151],\n [0.722943007946014, 0.271963000297546],\n [0.577413976192474, 0.563166975975037],\n [0.614082992076874, 0.281386971473694],\n [0.616907000541687, 0.255886018276215],\n [0.668509006500244, 0.119913995265961],\n [0.770092010498047, 0.232020974159241],\n [0.635536015033722, 0.189248979091644],\n [0.77039098739624, 0.299556016921997],\n [0.826722025871277, 0.278755009174347],\n [0.527121007442474, 0.666198015213013],\n [0.553171992301941, 0.668527007102966],\n [0.577238023281097, 0.673889994621277],\n [0.554691970348358, 0.580065965652466],\n [0.611896991729736, 0.693961024284363],\n [0.59696102142334, 0.706539988517761],\n [0.596370995044708, 0.693953037261963],\n [0.539958000183105, 0.557139039039612],\n [0.568841993808746, 0.692366003990173],\n [0.547818005084991, 0.692366003990173],\n [0.52461302280426, 0.692366003990173],\n [0.534089982509613, 0.779141008853912],\n [0.527670979499817, 0.736225962638855],\n [0.526912987232208, 0.717857003211975],\n [0.526877999305725, 0.704625964164734],\n [0.526966989040375, 0.695277988910675],\n [0.572058022022247, 0.695277988910675],\n [0.573521018028259, 0.703539967536926],\n [0.57683801651001, 0.711845993995667],\n [0.581691026687622, 0.720062971115112],\n [0.609944999217987, 0.639909982681274],\n [0.986046016216278, 0.560034036636353],\n [0.5867999792099, 0.69539999961853],\n [0.590372025966644, 0.701822996139526],\n [0.531915009021759, 0.601536989212036],\n [0.577268004417419, 0.585934996604919],\n [0.536915004253387, 0.593786001205444],\n [0.627542972564697, 0.473352015018463],\n [0.665585994720459, 0.495950996875763],\n [0.588353991508484, 0.546862006187439],\n [0.757824003696442, 0.14767599105835],\n [0.709249973297119, 0.201507985591888],\n [0.672684013843536, 0.256581008434296],\n [0.600408971309662, 0.74900496006012],\n [0.55826598405838, 0.261672019958496],\n [0.570303976535797, 0.187870979309082],\n [0.588165998458862, 0.109044015407562],\n [0.711045026779175, 0.398952007293701],\n [0.781069993972778, 0.435405015945435],\n [0.587247014045715, 0.398931980133057],\n [0.742869973182678, 0.355445981025696],\n [0.572156012058258, 0.437651991844177],\n [0.55186802148819, 0.536570012569427],\n [0.821442008018494, 0.457556009292603],\n [0.752701997756958, 0.457181990146637],\n [0.71375697851181, 0.467626988887787],\n [0.66711300611496, 0.460672974586487],\n [0.631101012229919, 0.447153985500336],\n [0.6008620262146, 0.432473003864288],\n [0.523481011390686, 0.405627012252808],\n [0.810747981071472, 0.523926019668579],\n [0.771045982837677, 0.348959028720856],\n [0.509127020835876, 0.562718033790588],\n [0.595292985439301, 0.485023975372314],\n [0.980530977249146, 0.401564002037048],\n [0.573499977588654, 0.420000016689301],\n [0.602994978427887, 0.548687994480133],\n [0.733529984951019, 0.376977026462555],\n [0.560611009597778, 0.519016981124878],\n [0.967685997486115, 0.644356966018677],\n [0.580985009670258, 0.387160003185272],\n [0.537728011608124, 0.505385041236877],\n [0.760966002941132, 0.779752969741821],\n [0.801778972148895, 0.831938028335571],\n [0.892440974712372, 0.54076099395752],\n [0.816350996494293, 0.740260004997253],\n [0.865594983100891, 0.333687007427216],\n [0.614073991775513, 0.883246004581451],\n [0.508952975273132, 0.579437971115112],\n [0.617941975593567, 0.508316040039062],\n [0.825608015060425, 0.397674977779388],\n [0.681214988231659, 0.39623498916626],\n [0.656635999679565, 0.400596976280212],\n [0.603900015354156, 0.710216999053955],\n [0.81208598613739, 0.588539004325867],\n [0.56801301240921, 0.944564998149872],\n [0.681007981300354, 0.898285031318665],\n [0.733752012252808, 0.869701027870178],\n [0.633830010890961, 0.398822009563446],\n [0.606792986392975, 0.39553701877594],\n [0.589659988880157, 0.391062021255493],\n [0.805015981197357, 0.342108011245728],\n [0.611334979534149, 0.362284004688263],\n [0.634037971496582, 0.355970978736877],\n [0.656635999679565, 0.355356991291046],\n [0.681214988231659, 0.35834002494812],\n [0.698584973812103, 0.363156020641327],\n [0.941866993904114, 0.319076001644135],\n [0.698584973812103, 0.387449026107788],\n [0.584177017211914, 0.624107003211975],\n [0.554318010807037, 0.566076993942261],\n [0.534153997898102, 0.62064003944397],\n [0.711217999458313, 0.819975018501282],\n [0.664629995822906, 0.852871000766754],\n [0.559099972248077, 0.902631998062134],\n [0.871706008911133, 0.791940987110138],\n [0.591234028339386, 0.373893976211548],\n [0.544341027736664, 0.451583981513977],\n [0.624562978744507, 0.924192011356354],\n [0.88577002286911, 0.615028977394104],\n [0.551338016986847, 0.695277988910675],\n [0.551980018615723, 0.704632043838501],\n [0.552887976169586, 0.715808033943176],\n [0.555167973041534, 0.730794012546539],\n [0.569944024085999, 0.767035007476807],\n [0.593203008174896, 0.685675978660583],\n [0.599261999130249, 0.681069016456604],\n [0.607599973678589, 0.677703022956848],\n [0.631937980651855, 0.663500010967255],\n [0.752032995223999, 0.601315021514893],\n [0.547226011753082, 0.420395016670227],\n [0.563543975353241, 0.359827995300293],\n [0.583841025829315, 0.368713974952698],\n [0.586614012718201, 0.692366003990173],\n [0.771915018558502, 0.683578014373779],\n [0.531597018241882, 0.352482974529266],\n [0.588370978832245, 0.804440975189209],\n [0.52079701423645, 0.442565023899078],\n [0.567984998226166, 0.493479013442993],\n [0.543282985687256, 0.819254994392395],\n [0.655317008495331, 0.745514988899231],\n [0.621008992195129, 0.574018001556396],\n [0.625559985637665, 0.78031200170517],\n [0.680198013782501, 0.570719003677368],\n [0.64276397228241, 0.604337990283966],\n [0.704662978649139, 0.621529996395111],\n [0.552012026309967, 0.862591981887817],\n [0.589071989059448, 0.508637011051178],\n [0.685944974422455, 0.775357007980347],\n [0.645735025405884, 0.812640011310577],\n [0.675342977046967, 0.703978002071381],\n [0.810858011245728, 0.646304965019226],\n [0.72012197971344, 0.714666962623596],\n [0.866151988506317, 0.682704985141754],\n [0.663187026977539, 0.644596993923187],\n [0.570082008838654, 0.466325998306274],\n [0.544561982154846, 0.548375964164734],\n [0.562758982181549, 0.558784961700439],\n [0.531987011432648, 0.530140042304993],\n [0.585271000862122, 0.335177004337311],\n [0.622952997684479, 0.32277899980545],\n [0.655896008014679, 0.320163011550903],\n [0.687132000923157, 0.322345972061157],\n [0.716481983661652, 0.333200991153717],\n [0.758756995201111, 0.382786989212036],\n [0.897013008594513, 0.468769013881683],\n [0.732392013072968, 0.424547016620636],\n [0.70211398601532, 0.433162987232208],\n [0.66652500629425, 0.433866024017334],\n [0.633504986763, 0.426087975502014],\n [0.603875994682312, 0.416586995124817],\n [0.579657971858978, 0.409945011138916],\n [0.992439985275269, 0.480777025222778],\n [0.567192018032074, 0.569419980049133],\n [0.54136598110199, 0.478899002075195],\n [0.526564002037048, 0.546118021011353],\n [0.523913025856018, 0.563830018043518],\n [0.531529009342194, 0.555056989192963],\n [0.566035985946655, 0.582329034805298],\n [0.51631098985672, 0.563053965568542],\n [0.5174720287323, 0.577877044677734],\n [0.573594987392426, 0.389806985855103],\n [0.560697972774506, 0.395331978797913],\n [0.549755990505219, 0.399751007556915],\n [0.710287988185883, 0.368252992630005],\n [0.723330020904541, 0.363372981548309],\n];\n\nexport const TRI468 = [\n 127, 34, 139, 11, 0, 37, 232, 231, 120, 72, 37, 39, 128, 121, 47, 232, 121, 128, 104, 69, 67, 175, 171, 148, 157, 154, 155, 118, 50, 101, 73, 39, 40, 9,\n 151, 108, 48, 115, 131, 194, 204, 211, 74, 40, 185, 80, 42, 183, 40, 92, 186, 230, 229, 118, 202, 212, 214, 83, 18, 17, 76, 61, 146, 160, 29, 30, 56,\n 157, 173, 106, 204, 194, 135, 214, 192, 203, 165, 98, 21, 71, 68, 51, 45, 4, 144, 24, 23, 77, 146, 91, 205, 50, 187, 201, 200, 18, 91, 106, 182, 90, 91,\n 181, 85, 84, 17, 206, 203, 36, 148, 171, 140, 92, 40, 39, 193, 189, 244, 159, 158, 28, 247, 246, 161, 236, 3, 196, 54, 68, 104, 193, 168, 8, 117,\n 228, 31, 189, 193, 55, 98, 97, 99, 126, 47, 100, 166, 79, 218, 155, 154, 26, 209, 49, 131, 135, 136, 150, 47, 126, 217, 223, 52, 53, 45, 51, 134, 211,\n 170, 140, 67, 69, 108, 43, 106, 91, 230, 119, 120, 226, 130, 247, 63, 53, 52, 238, 20, 242, 46, 70, 156, 78, 62, 96, 46, 53, 63, 143, 34, 227, 173,\n 155, 133, 123, 117, 111, 44, 125, 19, 236, 134, 51, 216, 206, 205, 154, 153, 22, 39, 37, 167, 200, 201, 208, 36, 142, 100, 57, 212, 202, 20, 60, 99, 28,\n 158, 157, 35, 226, 113, 160, 159, 27, 204, 202, 210, 113, 225, 46, 43, 202, 204, 62, 76, 77, 137, 123, 116, 41, 38, 72, 203, 129, 142, 64, 98, 240, 49,\n 102, 64, 41, 73, 74, 212, 216, 207, 42, 74, 184, 169, 170, 211, 170, 149, 176, 105, 66, 69, 122, 6, 168, 123, 147, 187, 96, 77, 90, 65, 55, 107, 89,\n 90, 180, 101, 100, 120, 63, 105, 104, 93, 137, 227, 15, 86, 85, 129, 102, 49, 14, 87, 86, 55, 8, 9, 100, 47, 121, 145, 23, 22, 88, 89, 179, 6, 122,\n 196, 88, 95, 96, 138, 172, 136, 215, 58, 172, 115, 48, 219, 42, 80, 81, 195, 3, 51, 43, 146, 61, 171, 175, 199, 81, 82, 38, 53, 46, 225, 144, 163, 110,\n 246, 33, 7, 52, 65, 66, 229, 228, 117, 34, 127, 234, 107, 108, 69, 109, 108, 151, 48, 64, 235, 62, 78, 191, 129, 209, 126, 111, 35, 143, 163, 161, 246,\n 117, 123, 50, 222, 65, 52, 19, 125, 141, 221, 55, 65, 3, 195, 197, 25, 7, 33, 220, 237, 44, 70, 71, 139, 122, 193, 245, 247, 130, 33, 71, 21, 162,\n 153, 158, 159, 170, 169, 150, 188, 174, 196, 216, 186, 92, 144, 160, 161, 2, 97, 167, 141, 125, 241, 164, 167, 37, 72, 38, 12, 145, 159, 160, 38, 82, 13,\n 63, 68, 71, 226, 35, 111, 158, 153, 154, 101, 50, 205, 206, 92, 165, 209, 198, 217, 165, 167, 97, 220, 115, 218, 133, 112, 243, 239, 238, 241, 214,\n 135, 169, 190, 173, 133, 171, 208, 32, 125, 44, 237, 86, 87, 178, 85, 86, 179, 84, 85, 180, 83, 84, 181, 201, 83, 182, 137, 93, 132, 76, 62, 183, 61,\n 76, 184, 57, 61, 185, 212, 57, 186, 214, 207, 187, 34, 143, 156, 79, 239, 237, 123, 137, 177, 44, 1, 4, 201, 194, 32, 64, 102, 129, 213, 215, 138, 59,\n 166, 219, 242, 99, 97, 2, 94, 141, 75, 59, 235, 24, 110, 228, 25, 130, 226, 23, 24, 229, 22, 23, 230, 26, 22, 231, 112, 26, 232, 189, 190, 243, 221, 56,\n 190, 28, 56, 221, 27, 28, 222, 29, 27, 223, 30, 29, 224, 247, 30, 225, 238, 79, 20, 166, 59, 75, 60, 75, 240, 147, 177, 215, 20, 79, 166, 187, 147, 213,\n 112, 233, 244, 233, 128, 245, 128, 114, 188, 114, 217, 174, 131, 115, 220, 217, 198, 236, 198, 131, 134, 177, 132, 58, 143, 35, 124, 110, 163, 7, 228,\n 110, 25, 356, 389, 368, 11, 302, 267, 452, 350, 349, 302, 303, 269, 357, 343, 277, 452, 453, 357, 333, 332, 297, 175, 152, 377, 384, 398, 382, 347,\n 348, 330, 303, 304, 270, 9, 336, 337, 278, 279, 360, 418, 262, 431, 304, 408, 409, 310, 415, 407, 270, 409, 410, 450, 348, 347, 422, 430, 434, 313,\n 314, 17, 306, 307, 375, 387, 388, 260, 286, 414, 398, 335, 406, 418, 364, 367, 416, 423, 358, 327, 251, 284, 298, 281, 5, 4, 373, 374, 253, 307, 320,\n 321, 425, 427, 411, 421, 313, 18, 321, 405, 406, 320, 404, 405, 315, 16, 17, 426, 425, 266, 377, 400, 369, 322, 391, 269, 417, 465, 464, 386, 257, 258,\n 466, 260, 388, 456, 399, 419, 284, 332, 333, 417, 285, 8, 346, 340, 261, 413, 441, 285, 327, 460, 328, 355, 371, 329, 392, 439, 438, 382, 341, 256,\n 429, 420, 360, 364, 394, 379, 277, 343, 437, 443, 444, 283, 275, 440, 363, 431, 262, 369, 297, 338, 337, 273, 375, 321, 450, 451, 349, 446, 342, 467,\n 293, 334, 282, 458, 461, 462, 276, 353, 383, 308, 324, 325, 276, 300, 293, 372, 345, 447, 382, 398, 362, 352, 345, 340, 274, 1, 19, 456, 248, 281, 436,\n 427, 425, 381, 256, 252, 269, 391, 393, 200, 199, 428, 266, 330, 329, 287, 273, 422, 250, 462, 328, 258, 286, 384, 265, 353, 342, 387, 259, 257, 424,\n 431, 430, 342, 353, 276, 273, 335, 424, 292, 325, 307, 366, 447, 345, 271, 303, 302, 423, 266, 371, 294, 455, 460, 279, 278, 294, 271, 272, 304, 432,\n 434, 427, 272, 407, 408, 394, 430, 431, 395, 369, 400, 334, 333, 299, 351, 417, 168, 352, 280, 411, 325, 319, 320, 295, 296, 336, 319, 403, 404, 330,\n 348, 349, 293, 298, 333, 323, 454, 447, 15, 16, 315, 358, 429, 279, 14, 15, 316, 285, 336, 9, 329, 349, 350, 374, 380, 252, 318, 402, 403, 6, 197, 419,\n 318, 319, 325, 367, 364, 365, 435, 367, 397, 344, 438, 439, 272, 271, 311, 195, 5, 281, 273, 287, 291, 396, 428, 199, 311, 271, 268, 283, 444, 445,\n 373, 254, 339, 263, 466, 249, 282, 334, 296, 449, 347, 346, 264, 447, 454, 336, 296, 299, 338, 10, 151, 278, 439, 455, 292, 407, 415, 358, 371, 355,\n 340, 345, 372, 390, 249, 466, 346, 347, 280, 442, 443, 282, 19, 94, 370, 441, 442, 295, 248, 419, 197, 263, 255, 359, 440, 275, 274, 300, 383, 368,\n 351, 412, 465, 263, 467, 466, 301, 368, 389, 380, 374, 386, 395, 378, 379, 412, 351, 419, 436, 426, 322, 373, 390, 388, 2, 164, 393, 370, 462, 461,\n 164, 0, 267, 302, 11, 12, 374, 373, 387, 268, 12, 13, 293, 300, 301, 446, 261, 340, 385, 384, 381, 330, 266, 425, 426, 423, 391, 429, 355, 437, 391,\n 327, 326, 440, 457, 438, 341, 382, 362, 459, 457, 461, 434, 430, 394, 414, 463, 362, 396, 369, 262, 354, 461, 457, 316, 403, 402, 315, 404, 403, 314,\n 405, 404, 313, 406, 405, 421, 418, 406, 366, 401, 361, 306, 408, 407, 291, 409, 408, 287, 410, 409, 432, 436, 410, 434, 416, 411, 264, 368, 383, 309,\n 438, 457, 352, 376, 401, 274, 275, 4, 421, 428, 262, 294, 327, 358, 433, 416, 367, 289, 455, 439, 462, 370, 326, 2, 326, 370, 305, 460, 455, 254,\n 449, 448, 255, 261, 446, 253, 450, 449, 252, 451, 450, 256, 452, 451, 341, 453, 452, 413, 464, 463, 441, 413, 414, 258, 442, 441, 257, 443, 442, 259,\n 444, 443, 260, 445, 444, 467, 342, 445, 459, 458, 250, 289, 392, 290, 290, 328, 460, 376, 433, 435, 250, 290, 392, 411, 416, 433, 341, 463, 464, 453,\n 464, 465, 357, 465, 412, 343, 412, 399, 360, 363, 440, 437, 399, 456, 420, 456, 363, 401, 435, 288, 372, 383, 353, 339, 255, 249, 448, 261, 255, 133,\n 243, 190, 133, 155, 112, 33, 246, 247, 33, 130, 25, 398, 384, 286, 362, 398, 414, 362, 463, 341, 263, 359, 467, 263, 249, 255, 466, 467, 260, 75, 60,\n 166, 238, 239, 79, 162, 127, 139, 72, 11, 37, 121, 232, 120, 73, 72, 39, 114, 128, 47, 233, 232, 128, 103, 104, 67, 152, 175, 148, 173, 157, 155,\n 119, 118, 101, 74, 73, 40, 107, 9, 108, 49, 48, 131, 32, 194, 211, 184, 74, 185, 191, 80, 183, 185, 40, 186, 119, 230, 118, 210, 202, 214, 84, 83, 17,\n 77, 76, 146, 161, 160, 30, 190, 56, 173, 182, 106, 194, 138, 135, 192, 129, 203, 98, 54, 21, 68, 5, 51, 4, 145, 144, 23, 90, 77, 91, 207, 205, 187, 83,\n 201, 18, 181, 91, 182, 180, 90, 181, 16, 85, 17, 205, 206, 36, 176, 148, 140, 165, 92, 39, 245, 193, 244, 27, 159, 28, 30, 247, 161, 174, 236, 196,\n 103, 54, 104, 55, 193, 8, 111, 117, 31, 221, 189, 55, 240, 98, 99, 142, 126, 100, 219, 166, 218, 112, 155, 26, 198, 209, 131, 169, 135, 150, 114, 47,\n 217, 224, 223, 53, 220, 45, 134, 32, 211, 140, 109, 67, 108, 146, 43, 91, 231, 230, 120, 113, 226, 247, 105, 63, 52, 241, 238, 242, 124, 46, 156, 95,\n 78, 96, 70, 46, 63, 116, 143, 227, 116, 123, 111, 1, 44, 19, 3, 236, 51, 207, 216, 205, 26, 154, 22, 165, 39, 167, 199, 200, 208, 101, 36, 100, 43,\n 57, 202, 242, 20, 99, 56, 28, 157, 124, 35, 113, 29, 160, 27, 211, 204, 210, 124, 113, 46, 106, 43, 204, 96, 62, 77, 227, 137, 116, 73, 41, 72, 36, 203,\n 142, 235, 64, 240, 48, 49, 64, 42, 41, 74, 214, 212, 207, 183, 42, 184, 210, 169, 211, 140, 170, 176, 104, 105, 69, 193, 122, 168, 50, 123, 187, 89, 96,\n 90, 66, 65, 107, 179, 89, 180, 119, 101, 120, 68, 63, 104, 234, 93, 227, 16, 15, 85, 209, 129, 49, 15, 14, 86, 107, 55, 9, 120, 100, 121, 153, 145, 22,\n 178, 88, 179, 197, 6, 196, 89, 88, 96, 135, 138, 136, 138, 215, 172, 218, 115, 219, 41, 42, 81, 5, 195, 51, 57, 43, 61, 208, 171, 199, 41, 81, 38,\n 224, 53, 225, 24, 144, 110, 105, 52, 66, 118, 229, 117, 227, 34, 234, 66, 107, 69, 10, 109, 151, 219, 48, 235, 183, 62, 191, 142, 129, 126, 116, 111,\n 143, 7, 163, 246, 118, 117, 50, 223, 222, 52, 94, 19, 141, 222, 221, 65, 196, 3, 197, 45, 220, 44, 156, 70, 139, 188, 122, 245, 139, 71, 162, 145,\n 153, 159, 149, 170, 150, 122, 188, 196, 206, 216, 92, 163, 144, 161, 164, 2, 167, 242, 141, 241, 0, 164, 37, 11, 72, 12, 144, 145, 160, 12, 38, 13, 70,\n 63, 71, 31, 226, 111, 157, 158, 154, 36, 101, 205, 203, 206, 165, 126, 209, 217, 98, 165, 97, 237, 220, 218, 237, 239, 241, 210, 214, 169, 140, 171, 32,\n 241, 125, 237, 179, 86, 178, 180, 85, 179, 181, 84, 180, 182, 83, 181, 194, 201, 182, 177, 137, 132, 184, 76, 183, 185, 61, 184, 186, 57, 185, 216, 212,\n 186, 192, 214, 187, 139, 34, 156, 218, 79, 237, 147, 123, 177, 45, 44, 4, 208, 201, 32, 98, 64, 129, 192, 213, 138, 235, 59, 219, 141, 242, 97, 97, 2,\n 141, 240, 75, 235, 229, 24, 228, 31, 25, 226, 230, 23, 229, 231, 22, 230, 232, 26, 231, 233, 112, 232, 244, 189, 243, 189, 221, 190, 222, 28, 221,\n 223, 27, 222, 224, 29, 223, 225, 30, 224, 113, 247, 225, 99, 60, 240, 213, 147, 215, 60, 20, 166, 192, 187, 213, 243, 112, 244, 244, 233, 245, 245,\n 128, 188, 188, 114, 174, 134, 131, 220, 174, 217, 236, 236, 198, 134, 215, 177, 58, 156, 143, 124, 25, 110, 7, 31, 228, 25, 264, 356, 368, 0, 11, 267,\n 451, 452, 349, 267, 302, 269, 350, 357, 277, 350, 452, 357, 299, 333, 297, 396, 175, 377, 381, 384, 382, 280, 347, 330, 269, 303, 270, 151, 9, 337,\n 344, 278, 360, 424, 418, 431, 270, 304, 409, 272, 310, 407, 322, 270, 410, 449, 450, 347, 432, 422, 434, 18, 313, 17, 291, 306, 375, 259, 387, 260,\n 424, 335, 418, 434, 364, 416, 391, 423, 327, 301, 251, 298, 275, 281, 4, 254, 373, 253, 375, 307, 321, 280, 425, 411, 200, 421, 18, 335, 321, 406,\n 321, 320, 405, 314, 315, 17, 423, 426, 266, 396, 377, 369, 270, 322, 269, 413, 417, 464, 385, 386, 258, 248, 456, 419, 298, 284, 333, 168, 417, 8,\n 448, 346, 261, 417, 413, 285, 326, 327, 328, 277, 355, 329, 309, 392, 438, 381, 382, 256, 279, 429, 360, 365, 364, 379, 355, 277, 437, 282, 443, 283,\n 281, 275, 363, 395, 431, 369, 299, 297, 337, 335, 273, 321, 348, 450, 349, 359, 446, 467, 283, 293, 282, 250, 458, 462, 300, 276, 383, 292, 308, 325,\n 283, 276, 293, 264, 372, 447, 346, 352, 340, 354, 274, 19, 363, 456, 281, 426, 436, 425, 380, 381, 252, 267, 269, 393, 421, 200, 428, 371, 266, 329,\n 432, 287, 422, 290, 250, 328, 385, 258, 384, 446, 265, 342, 386, 387, 257, 422, 424, 430, 445, 342, 276, 422, 273, 424, 306, 292, 307, 352, 366, 345,\n 268, 271, 302, 358, 423, 371, 327, 294, 460, 331, 279, 294, 303, 271, 304, 436, 432, 427, 304, 272, 408, 395, 394, 431, 378, 395, 400, 296, 334, 299,\n 6, 351, 168, 376, 352, 411, 307, 325, 320, 285, 295, 336, 320, 319, 404, 329, 330, 349, 334, 293, 333, 366, 323, 447, 316, 15, 315, 331, 358, 279,\n 317, 14, 316, 8, 285, 9, 277, 329, 350, 253, 374, 252, 319, 318, 403, 351, 6, 419, 324, 318, 325, 397, 367, 365, 288, 435, 397, 278, 344, 439, 310,\n 272, 311, 248, 195, 281, 375, 273, 291, 175, 396, 199, 312, 311, 268, 276, 283, 445, 390, 373, 339, 295, 282, 296, 448, 449, 346, 356, 264, 454, 337,\n 336, 299, 337, 338, 151, 294, 278, 455, 308, 292, 415, 429, 358, 355, 265, 340, 372, 388, 390, 466, 352, 346, 280, 295, 442, 282, 354, 19, 370, 285,\n 441, 295, 195, 248, 197, 457, 440, 274, 301, 300, 368, 417, 351, 465, 251, 301, 389, 385, 380, 386, 394, 395, 379, 399, 412, 419, 410, 436, 322, 387,\n 373, 388, 326, 2, 393, 354, 370, 461, 393, 164, 267, 268, 302, 12, 386, 374, 387, 312, 268, 13, 298, 293, 301, 265, 446, 340, 380, 385, 381, 280, 330,\n 425, 322, 426, 391, 420, 429, 437, 393, 391, 326, 344, 440, 438, 458, 459, 461, 364, 434, 394, 428, 396, 262, 274, 354, 457, 317, 316, 402, 316, 315,\n 403, 315, 314, 404, 314, 313, 405, 313, 421, 406, 323, 366, 361, 292, 306, 407, 306, 291, 408, 291, 287, 409, 287, 432, 410, 427, 434, 411, 372, 264,\n 383, 459, 309, 457, 366, 352, 401, 1, 274, 4, 418, 421, 262, 331, 294, 358, 435, 433, 367, 392, 289, 439, 328, 462, 326, 94, 2, 370, 289, 305, 455, 339,\n 254, 448, 359, 255, 446, 254, 253, 449, 253, 252, 450, 252, 256, 451, 256, 341, 452, 414, 413, 463, 286, 441, 414, 286, 258, 441, 258, 257, 442, 257,\n 259, 443, 259, 260, 444, 260, 467, 445, 309, 459, 250, 305, 289, 290, 305, 290, 460, 401, 376, 435, 309, 250, 392, 376, 411, 433, 453, 341, 464, 357,\n 453, 465, 343, 357, 412, 437, 343, 399, 344, 360, 440, 420, 437, 456, 360, 420, 363, 361, 401, 288, 265, 372, 353, 390, 339, 249, 339, 448, 255];\n\nexport const TRI68 = [0, 1, 36, 0, 36, 17, 1, 2, 41, 1, 41, 36, 2, 3, 31, 2, 31, 41, 3, 4, 48, 3, 48, 31, 4, 5, 48, 5, 6, 48, 6, 7, 59, 6, 59, 48, 7, 8, 58, 7, 58, 59,\n 8, 9, 56, 8, 56, 57, 8, 57, 58, 9, 10, 55, 9, 55, 56, 10, 11, 54, 10, 54, 55, 11, 12, 54, 12, 13, 54, 13, 14, 35, 13, 35, 54, 14, 15, 46, 14, 46, 35, 15, 16,\n 45, 15, 45, 46, 16, 26, 45, 17, 36, 18, 18, 37, 19, 18, 36, 37, 19, 38, 20, 19, 37, 38, 20, 39, 21, 20, 38, 39, 21, 39, 27, 22, 42, 23, 22, 27, 42, 23, 43, 24,\n 23, 42, 43, 24, 44, 25, 24, 43, 44, 25, 45, 26, 25, 44, 45, 27, 39, 28, 27, 28, 42, 28, 39, 29, 28, 29, 42, 29, 31, 30, 29, 30, 35, 29, 40, 31, 29, 35, 47, 29,\n 39, 40, 29, 47, 42, 30, 31, 32, 30, 32, 33, 30, 33, 34, 30, 34, 35, 31, 50, 32, 31, 40, 41, 31, 48, 49, 31, 49, 50, 32, 51, 33, 32, 50, 51, 33, 51, 34, 34, 52,\n 35, 34, 51, 52, 35, 46, 47, 35, 52, 53, 35, 53, 54, 36, 41, 37, 37, 40, 38, 37, 41, 40, 38, 40, 39, 42, 47, 43, 43, 47, 44, 44, 46, 45, 44, 47, 46, 48, 60, 49,\n 48, 59, 60, 49, 61, 50, 49, 60, 61, 50, 62, 51, 50, 61, 62, 51, 62, 52, 52, 63, 53, 52, 62, 63, 53, 64, 54, 53, 63, 64, 54, 64, 55, 55, 65, 56, 55, 64, 65, 56,\n 66, 57, 56, 65, 66, 57, 66, 58, 58, 67, 59, 58, 66, 67, 59, 67, 60, 60, 67, 61, 61, 66, 62, 61, 67, 66, 62, 66, 63, 63, 65, 64, 63, 66, 65, 21, 27, 22];\n\nexport const TRI33 = [\n /* eyes */ 0, 8, 7, 7, 8, 1, 2, 10, 9, 9, 10, 3,\n /* brows */ 17, 0, 18, 18, 0, 7, 18, 7, 19, 19, 7, 1, 19, 1, 11, 19, 11, 20, 21, 3, 22, 21, 9, 3, 20, 9, 21, 20, 2, 9, 20, 11, 2,\n /* 4head */ 23, 17, 18, 25, 21, 22, 24, 19, 20, 24, 18, 19, 24, 20, 21, 24, 23, 18, 24, 21, 25,\n /* nose */ 11, 12, 4, 11, 4, 13, 1, 12, 11, 11, 13, 2, 12, 14, 4, 4, 14, 13,\n /* up-lip */ 14, 5, 15, 14, 15, 6, 12, 5, 14, 14, 6, 13,\n /* cheeks */ 8, 12, 1, 2, 13, 10, 8, 26, 12, 10, 13, 27, 26, 5, 12, 13, 6, 27, 0, 26, 8, 10, 27, 3,\n /* chin */ 5, 32, 16, 16, 32, 6, 5, 30, 32, 6, 32, 31,\n /* cont */ 26, 30, 5, 27, 6, 31, 0, 28, 26, 3, 27, 29, 17, 28, 0, 3, 29, 22, 23, 28, 17, 22, 29, 25, 28, 30, 26, 27, 31, 29,\n];\n\nexport const TRI7 = [0, 4, 1, 2, 4, 3, 4, 5, 6];\n\nexport const VTX68 = [\n /* cont */ 127, 234, 132, 58, 172, 150, 149, 148, 152, 377, 378, 379, 397, 288, 361, 454, 356,\n /* brows */ 70, 63, 105, 66, 107, 336, 296, 334, 293, 300,\n /* nose */ 168, 6, 195, 4, 98, 97, 2, 326, 327,\n /* eyes */ 33, 160, 158, 133, 153, 144, 362, 385, 387, 263, 373, 380,\n /* lip */ 57, 40, 37, 0, 267, 270, 287, 321, 314, 17, 84, 91,\n /* mouth */ 78, 81, 13, 311, 308, 402, 14, 178,\n];\n\nexport const VTX33 = [33, 133, 362, 263, 1, 62, 308, 159, 145, 386, 374, 6, 102, 331, 2, 13, 14, 70, 105, 107, 336, 334, 300, 54, 10, 284, 50, 280, 234, 454, 58, 288, 152];\n\nexport const VTX7 = [33, 133, 362, 263, 1, 78, 308];\n\nexport const UV68 = VTX68.map((x) => UV468[x]);\n\nexport const UV33 = VTX33.map((x) => UV468[x]);\n\nexport const UV7 = VTX7.map((x) => UV468[x]);\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as bounding from './box';\nimport * as util from './util';\nimport * as coords from './coords';\n\nconst leftOutline = coords.MESH_ANNOTATIONS['leftEyeLower0'];\nconst rightOutline = coords.MESH_ANNOTATIONS['rightEyeLower0'];\n\nconst eyeLandmarks = {\n leftBounds: [leftOutline[0], leftOutline[leftOutline.length - 1]],\n rightBounds: [rightOutline[0], rightOutline[rightOutline.length - 1]],\n};\n\nconst meshLandmarks = {\n count: 468,\n mouth: 13,\n symmetryLine: [13, coords.MESH_ANNOTATIONS['midwayBetweenEyes'][0]],\n};\n\nconst blazeFaceLandmarks = {\n leftEye: 0,\n rightEye: 1,\n nose: 2,\n mouth: 3,\n leftEar: 4,\n rightEar: 5,\n symmetryLine: [3, 2],\n};\n\nconst irisLandmarks = {\n upperCenter: 3,\n lowerCenter: 4,\n index: 71,\n numCoordinates: 76,\n};\n\n// Replace the raw coordinates returned by facemesh with refined iris model coordinates\n// Update the z coordinate to be an average of the original and the new.\nfunction replaceRawCoordinates(rawCoords, newCoords, prefix, keys) {\n for (let i = 0; i < coords.MESH_TO_IRIS_INDICES_MAP.length; i++) {\n const { key, indices } = coords.MESH_TO_IRIS_INDICES_MAP[i];\n const originalIndices = coords.MESH_ANNOTATIONS[`${prefix}${key}`];\n if (!keys || keys.includes(key)) {\n for (let j = 0; j < indices.length; j++) {\n const index = indices[j];\n rawCoords[originalIndices[j]] = [\n newCoords[index][0], newCoords[index][1],\n (newCoords[index][2] + rawCoords[originalIndices[j]][2]) / 2,\n ];\n }\n }\n }\n}\n// The Pipeline coordinates between the bounding box and skeleton models.\nexport class Pipeline {\n storedBoxes: any;\n boundingBoxDetector: any;\n meshDetector: any;\n irisModel: any;\n boxSize: number;\n meshSize: number;\n irisSize: number;\n irisEnlarge: number;\n skipped: number;\n detectedFaces: number;\n\n constructor(boundingBoxDetector, meshDetector, irisModel) {\n // An array of facial bounding boxes.\n this.storedBoxes = [];\n this.boundingBoxDetector = boundingBoxDetector;\n this.meshDetector = meshDetector;\n this.irisModel = irisModel;\n this.boxSize = boundingBoxDetector?.model?.inputs[0].shape[2] || 0;\n this.meshSize = meshDetector?.inputs[0].shape[2] || boundingBoxDetector?.model?.inputs[0].shape[2];\n this.irisSize = irisModel?.inputs[0].shape[1] || 0;\n this.irisEnlarge = 2.3;\n this.skipped = 0;\n this.detectedFaces = 0;\n }\n\n transformRawCoords(rawCoords, box, angle, rotationMatrix) {\n const boxSize = bounding.getBoxSize({ startPoint: box.startPoint, endPoint: box.endPoint });\n const coordsScaled = rawCoords.map((coord) => ([\n boxSize[0] / this.meshSize * (coord[0] - this.meshSize / 2),\n boxSize[1] / this.meshSize * (coord[1] - this.meshSize / 2),\n coord[2],\n ]));\n const coordsRotationMatrix = (angle !== 0) ? util.buildRotationMatrix(angle, [0, 0]) : util.IDENTITY_MATRIX;\n const coordsRotated = (angle !== 0) ? coordsScaled.map((coord) => ([...util.rotatePoint(coord, coordsRotationMatrix), coord[2]])) : coordsScaled;\n const inverseRotationMatrix = (angle !== 0) ? util.invertTransformMatrix(rotationMatrix) : util.IDENTITY_MATRIX;\n const boxCenter = [...bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint }), 1];\n return coordsRotated.map((coord) => ([\n Math.round(coord[0] + util.dot(boxCenter, inverseRotationMatrix[0])),\n Math.round(coord[1] + util.dot(boxCenter, inverseRotationMatrix[1])),\n Math.round(coord[2]),\n ]));\n }\n\n // eslint-disable-next-line class-methods-use-this\n getLeftToRightEyeDepthDifference(rawCoords) {\n const leftEyeZ = rawCoords[eyeLandmarks.leftBounds[0]][2];\n const rightEyeZ = rawCoords[eyeLandmarks.rightBounds[0]][2];\n return leftEyeZ - rightEyeZ;\n }\n\n // Returns a box describing a cropped region around the eye fit for passing to the iris model.\n getEyeBox(rawCoords, face, eyeInnerCornerIndex, eyeOuterCornerIndex, flip = false) {\n const box = bounding.squarifyBox(bounding.enlargeBox(bounding.calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), this.irisEnlarge));\n const boxSize = bounding.getBoxSize(box);\n let crop = tf.image.cropAndResize(face, [[\n box.startPoint[1] / this.meshSize,\n box.startPoint[0] / this.meshSize, box.endPoint[1] / this.meshSize,\n box.endPoint[0] / this.meshSize,\n ]], [0], [this.irisSize, this.irisSize]);\n if (flip && tf.ENV.flags.IS_BROWSER) {\n crop = tf.image.flipLeftRight(crop); // flipLeftRight is not defined for tfjs-node\n }\n return { box, boxSize, crop };\n }\n\n // Given a cropped image of an eye, returns the coordinates of the contours surrounding the eye and the iris.\n getEyeCoords(eyeData, eyeBox, eyeBoxSize, flip = false) {\n const eyeRawCoords: Array = [];\n for (let i = 0; i < irisLandmarks.numCoordinates; i++) {\n const x = eyeData[i * 3];\n const y = eyeData[i * 3 + 1];\n const z = eyeData[i * 3 + 2];\n eyeRawCoords.push([\n (flip ? (1 - (x / this.irisSize)) : (x / this.irisSize)) * eyeBoxSize[0] + eyeBox.startPoint[0],\n (y / this.irisSize) * eyeBoxSize[1] + eyeBox.startPoint[1], z,\n ]);\n }\n return { rawCoords: eyeRawCoords, iris: eyeRawCoords.slice(irisLandmarks.index) };\n }\n\n // The z-coordinates returned for the iris are unreliable, so we take the z values from the surrounding keypoints.\n // eslint-disable-next-line class-methods-use-this\n getAdjustedIrisCoords(rawCoords, irisCoords, direction) {\n const upperCenterZ = rawCoords[coords.MESH_ANNOTATIONS[`${direction}EyeUpper0`][irisLandmarks.upperCenter]][2];\n const lowerCenterZ = rawCoords[coords.MESH_ANNOTATIONS[`${direction}EyeLower0`][irisLandmarks.lowerCenter]][2];\n const averageZ = (upperCenterZ + lowerCenterZ) / 2;\n // Iris indices: 0: center | 1: right | 2: above | 3: left | 4: below\n return irisCoords.map((coord, i) => {\n let z = averageZ;\n if (i === 2) {\n z = upperCenterZ;\n } else if (i === 4) {\n z = lowerCenterZ;\n }\n return [coord[0], coord[1], z];\n });\n }\n\n async predict(input, config) {\n let useFreshBox = false;\n // run new detector every skipFrames unless we only want box to start with\n let detector;\n if ((this.skipped === 0) || (this.skipped > config.face.detector.skipFrames) || !config.face.mesh.enabled || !config.skipFrame) {\n detector = await this.boundingBoxDetector.getBoundingBoxes(input);\n this.skipped = 0;\n }\n if (config.skipFrame) this.skipped++;\n\n // if detector result count doesn't match current working set, use it to reset current working set\n if (!config.skipFrame || (detector && detector.boxes && (!config.face.mesh.enabled || (detector.boxes.length !== this.detectedFaces) && (this.detectedFaces !== config.face.detector.maxDetected)))) {\n this.storedBoxes = [];\n this.detectedFaces = 0;\n for (const possible of detector.boxes) {\n this.storedBoxes.push({ startPoint: possible.box.startPoint.dataSync(), endPoint: possible.box.endPoint.dataSync(), landmarks: possible.landmarks, confidence: possible.confidence });\n }\n if (this.storedBoxes.length > 0) useFreshBox = true;\n }\n\n if (useFreshBox) {\n if (!detector || !detector.boxes || (detector.boxes.length === 0)) {\n this.storedBoxes = [];\n this.detectedFaces = 0;\n return null;\n }\n for (let i = 0; i < this.storedBoxes.length; i++) {\n const scaledBox = bounding.scaleBoxCoordinates({ startPoint: this.storedBoxes[i].startPoint, endPoint: this.storedBoxes[i].endPoint }, detector.scaleFactor);\n const enlargedBox = bounding.enlargeBox(scaledBox);\n const squarifiedBox = bounding.squarifyBox(enlargedBox);\n const landmarks = this.storedBoxes[i].landmarks.arraySync();\n const confidence = this.storedBoxes[i].confidence;\n this.storedBoxes[i] = { ...squarifiedBox, confidence, landmarks };\n }\n }\n if (detector && detector.boxes) {\n detector.boxes.forEach((prediction) => {\n prediction.box.startPoint.dispose();\n prediction.box.endPoint.dispose();\n prediction.landmarks.dispose();\n });\n }\n const results = tf.tidy(() => this.storedBoxes.map((box, i) => {\n // The facial bounding box landmarks could come either from blazeface (if we are using a fresh box), or from the mesh model (if we are reusing an old box).\n let face;\n let angle = 0;\n let rotationMatrix;\n\n if (config.face.detector.rotation && config.face.mesh.enabled && tf.ENV.flags.IS_BROWSER) {\n const [indexOfMouth, indexOfForehead] = (box.landmarks.length >= meshLandmarks.count) ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine;\n angle = util.computeRotation(box.landmarks[indexOfMouth], box.landmarks[indexOfForehead]);\n const faceCenter = bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint });\n const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]];\n const rotatedImage = tf.image.rotateWithOffset(input, angle, 0, faceCenterNormalized); // rotateWithOffset is not defined for tfjs-node\n rotationMatrix = util.buildRotationMatrix(-angle, faceCenter);\n if (config.face.mesh.enabled) face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.meshSize, this.meshSize]).div(255);\n else face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.boxSize, this.boxSize]).div(255);\n } else {\n rotationMatrix = util.IDENTITY_MATRIX;\n const clonedImage = input.clone();\n if (config.face.mesh.enabled) face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, clonedImage, [this.meshSize, this.meshSize]).div(255);\n else face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, clonedImage, [this.boxSize, this.boxSize]).div(255);\n }\n\n // if we're not going to produce mesh, don't spend time with further processing\n if (!config.face.mesh.enabled) {\n const prediction = {\n mesh: [],\n box,\n faceConfidence: null,\n boxConfidence: box.confidence,\n confidence: box.confidence,\n image: face,\n };\n return prediction;\n }\n\n const [, confidence, contourCoords] = this.meshDetector.execute(face); // The first returned tensor represents facial contours which are already included in the coordinates.\n const faceConfidence = confidence.dataSync()[0];\n if (faceConfidence < config.face.detector.minConfidence) {\n this.storedBoxes[i].confidence = faceConfidence; // reset confidence of cached box\n return null; // if below confidence just exit\n }\n const coordsReshaped = tf.reshape(contourCoords, [-1, 3]);\n let rawCoords = coordsReshaped.arraySync();\n\n if (config.face.iris.enabled) {\n const { box: leftEyeBox, boxSize: leftEyeBoxSize, crop: leftEyeCrop } = this.getEyeBox(rawCoords, face, eyeLandmarks.leftBounds[0], eyeLandmarks.leftBounds[1], true);\n const { box: rightEyeBox, boxSize: rightEyeBoxSize, crop: rightEyeCrop } = this.getEyeBox(rawCoords, face, eyeLandmarks.rightBounds[0], eyeLandmarks.rightBounds[1]);\n const eyePredictions = this.irisModel.predict(tf.concat([leftEyeCrop, rightEyeCrop]));\n const eyePredictionsData = eyePredictions.dataSync();\n const leftEyeData = eyePredictionsData.slice(0, irisLandmarks.numCoordinates * 3);\n const { rawCoords: leftEyeRawCoords, iris: leftIrisRawCoords } = this.getEyeCoords(leftEyeData, leftEyeBox, leftEyeBoxSize, true);\n const rightEyeData = eyePredictionsData.slice(irisLandmarks.numCoordinates * 3);\n const { rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords } = this.getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize);\n const leftToRightEyeDepthDifference = this.getLeftToRightEyeDepthDifference(rawCoords);\n if (Math.abs(leftToRightEyeDepthDifference) < 30) { // User is looking straight ahead.\n replaceRawCoordinates(rawCoords, leftEyeRawCoords, 'left', null);\n replaceRawCoordinates(rawCoords, rightEyeRawCoords, 'right', null);\n // If the user is looking to the left or to the right, the iris coordinates tend to diverge too much from the mesh coordinates for them to be merged\n // So we only update a single contour line above and below the eye.\n } else if (leftToRightEyeDepthDifference < 1) { // User is looking towards the right.\n replaceRawCoordinates(rawCoords, leftEyeRawCoords, 'left', ['EyeUpper0', 'EyeLower0']);\n } else { // User is looking towards the left.\n replaceRawCoordinates(rawCoords, rightEyeRawCoords, 'right', ['EyeUpper0', 'EyeLower0']);\n }\n const adjustedLeftIrisCoords = this.getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, 'left');\n const adjustedRightIrisCoords = this.getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, 'right');\n rawCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords);\n }\n\n // override box from detection with one calculated from mesh\n const mesh = this.transformRawCoords(rawCoords, box, angle, rotationMatrix);\n const storeConfidence = box.confidence;\n box = bounding.enlargeBox(bounding.calculateLandmarksBoundingBox(mesh), 1.5); // redefine box with mesh calculated one\n box.confidence = storeConfidence;\n\n // do rotation one more time with mesh keypoints if we want to return perfect image\n if (config.face.detector.rotation && config.face.mesh.enabled && config.face.description.enabled && tf.ENV.flags.IS_BROWSER) {\n const [indexOfMouth, indexOfForehead] = (box.landmarks.length >= meshLandmarks.count) ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine;\n angle = util.computeRotation(box.landmarks[indexOfMouth], box.landmarks[indexOfForehead]);\n const faceCenter = bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint });\n const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]];\n const rotatedImage = tf.image.rotateWithOffset(input.toFloat(), angle, 0, faceCenterNormalized); // rotateWithOffset is not defined for tfjs-node\n rotationMatrix = util.buildRotationMatrix(-angle, faceCenter);\n face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.meshSize, this.meshSize]).div(255);\n }\n\n const prediction = {\n mesh,\n box,\n faceConfidence,\n boxConfidence: box.confidence,\n image: face,\n };\n\n // updated stored cache values\n const storedBox = bounding.squarifyBox(box);\n // @ts-ignore box itself doesn't have those properties, but we stored them for future use\n storedBox.confidence = box.confidence;\n // @ts-ignore box itself doesn't have those properties, but we stored them for future use\n storedBox.faceConfidence = faceConfidence;\n // this.storedBoxes[i] = { ...squarifiedLandmarksBox, confidence: box.confidence, faceConfidence };\n this.storedBoxes[i] = storedBox;\n\n return prediction;\n }));\n\n // results = results.filter((a) => a !== null);\n // remove cache entries for detected boxes on low confidence\n if (config.face.mesh.enabled) this.storedBoxes = this.storedBoxes.filter((a) => a.confidence > config.face.detector.minConfidence);\n this.detectedFaces = results.length;\n\n return results;\n }\n}\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\n\nconst annotations = ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral'];\nlet model;\n// let last: Array<{ score: number, emotion: string }> = [];\nconst last: Array> = [];\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\n// tuning values\nconst rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale\n\nexport async function load(config) {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.face.emotion.modelPath));\n if (!model || !model.modelUrl) log('load model failed:', config.face.emotion.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nexport async function predict(image, config, idx, count) {\n if (!model) return null;\n if ((skipped < config.face.emotion.skipFrames) && config.skipFrame && (lastCount === count) && last[idx] && (last[idx].length > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n const [red, green, blue] = tf.split(resize, 3, 3);\n resize.dispose();\n // weighted rgb to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n const redNorm = tf.mul(red, rgb[0]);\n const greenNorm = tf.mul(green, rgb[1]);\n const blueNorm = tf.mul(blue, rgb[2]);\n red.dispose();\n green.dispose();\n blue.dispose();\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n redNorm.dispose();\n greenNorm.dispose();\n blueNorm.dispose();\n const normalize = tf.tidy(() => grayscale.sub(0.5).mul(2));\n grayscale.dispose();\n const obj: Array<{ score: number, emotion: string }> = [];\n if (config.face.emotion.enabled) {\n const emotionT = await model.predict(normalize); // result is already in range 0..1, no need for additional activation\n const data = emotionT.dataSync();\n tf.dispose(emotionT);\n for (let i = 0; i < data.length; i++) {\n if (data[i] > config.face.emotion.minConfidence) obj.push({ score: Math.min(0.99, Math.trunc(100 * data[i]) / 100), emotion: annotations[i] });\n }\n obj.sort((a, b) => b.score - a.score);\n }\n normalize.dispose();\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\n\nlet model;\nconst last: Array<{ age: number}> = [];\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\ntype Tensor = typeof tf.Tensor;\ntype DB = Array<{ name: string, source: string, embedding: number[] }>;\n\nexport async function load(config) {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.face.description.modelPath));\n if (!model || !model.modelUrl) log('load model failed:', config.face.description.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nexport function similarity(embedding1, embedding2, order = 2): number {\n if (!embedding1 || !embedding2) return 0;\n if (embedding1?.length === 0 || embedding2?.length === 0) return 0;\n if (embedding1?.length !== embedding2?.length) return 0;\n // general minkowski distance, euclidean distance is limited case where order is 2\n const distance = 5.0 * embedding1\n .map((val, i) => (Math.abs(embedding1[i] - embedding2[i]) ** order)) // distance squared\n .reduce((sum, now) => (sum + now), 0) // sum all distances\n ** (1 / order); // get root of\n const res = Math.max(0, 100 - distance) / 100.0;\n return res;\n}\n\nexport function match(embedding: Array, db: DB, threshold = 0) {\n let best = { similarity: 0, name: '', source: '', embedding: [] as number[] };\n if (!embedding || !db || !Array.isArray(embedding) || !Array.isArray(db)) return best;\n for (const f of db) {\n if (f.embedding && f.name) {\n const perc = similarity(embedding, f.embedding);\n if (perc > threshold && perc > best.similarity) best = { ...f, similarity: perc };\n }\n }\n return best;\n}\n\nexport function enhance(input): Tensor {\n const image = tf.tidy(() => {\n // input received from detector is already normalized to 0..1\n // input is also assumed to be straightened\n const tensor = input.image || input.tensor || input;\n if (!(tensor instanceof tf.Tensor)) return null;\n // do a tight crop of image and resize it to fit the model\n const box = [[0.05, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n // const box = [[0.0, 0.0, 1.0, 1.0]]; // basically no crop for test\n const crop = (tensor.shape.length === 3)\n ? tf.image.cropAndResize(tf.expandDims(tensor, 0), box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) // add batch dimension if missing\n : tf.image.cropAndResize(tensor, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n\n /*\n // just resize to fit the embedding model instead of cropping\n const crop = tf.image.resizeBilinear(tensor, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n */\n\n /*\n // convert to black&white to avoid colorization impact\n const rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n const [red, green, blue] = tf.split(crop, 3, 3);\n const redNorm = tf.mul(red, rgb[0]);\n const greenNorm = tf.mul(green, rgb[1]);\n const blueNorm = tf.mul(blue, rgb[2]);\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n const merge = tf.stack([grayscale, grayscale, grayscale], 3).squeeze(4);\n */\n\n /*\n // increase image pseudo-contrast 100%\n // (or do it per-channel so mean is done on each channel)\n // (or calculate histogram and do it based on histogram)\n const mean = merge.mean();\n const factor = 2;\n const contrast = merge.sub(mean).mul(factor).add(mean);\n */\n\n /*\n // normalize brightness from 0..1\n // silly way of creating pseudo-hdr of image\n const darken = crop.sub(crop.min());\n const lighten = darken.div(darken.max());\n */\n\n const norm = crop.mul(255);\n\n return norm;\n });\n return image;\n}\n\nexport async function predict(image, config, idx, count) {\n if (!model) return null;\n if ((skipped < config.face.description.skipFrames) && config.skipFrame && (lastCount === count) && last[idx]?.age && (last[idx]?.age > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const enhanced = enhance(image);\n\n let resT;\n const obj = {\n age: 0,\n gender: 'unknown',\n genderConfidence: 0,\n descriptor: [] };\n\n if (config.face.description.enabled) resT = await model.predict(enhanced);\n tf.dispose(enhanced);\n\n if (resT) {\n tf.tidy(() => {\n const gender = resT.find((t) => t.shape[1] === 1).dataSync();\n const confidence = Math.trunc(200 * Math.abs((gender[0] - 0.5))) / 100;\n if (confidence > config.face.description.minConfidence) {\n obj.gender = gender[0] <= 0.5 ? 'female' : 'male';\n obj.genderConfidence = Math.min(0.99, confidence);\n }\n const age = resT.find((t) => t.shape[1] === 100).argMax(1).dataSync()[0];\n const all = resT.find((t) => t.shape[1] === 100).dataSync();\n obj.age = Math.round(all[age - 1] > all[age + 1] ? 10 * age - 100 * all[age - 1] : 10 * age + 100 * all[age + 1]) / 10;\n\n const desc = resT.find((t) => t.shape[1] === 1024);\n // const reshape = desc.reshape([128, 8]); // reshape large 1024-element descriptor to 128 x 8\n // const reduce = reshape.logSumExp(1); // reduce 2nd dimension by calculating logSumExp on it which leaves us with 128-element descriptor\n\n obj.descriptor = [...desc.dataSync()];\n });\n resT.forEach((t) => tf.dispose(t));\n }\n\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "import { log, now } from './helpers';\nimport * as facemesh from './blazeface/facemesh';\nimport * as emotion from './emotion/emotion';\nimport * as faceres from './faceres/faceres';\nimport { Face } from './result';\n\nconst calculateFaceAngle = (face, image_size): { angle: { pitch: number, yaw: number, roll: number }, matrix: [number, number, number, number, number, number, number, number, number] } => {\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const degrees = (theta) => (theta * 180) / Math.PI;\n // const degrees = (theta) => Math.abs(((theta * 180) / Math.PI) % 360);\n const normalize = (v) => { // normalize vector\n const length = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);\n v[0] /= length;\n v[1] /= length;\n v[2] /= length;\n return v;\n };\n const subVectors = (a, b) => { // vector subtraction (a - b)\n const x = a[0] - b[0];\n const y = a[1] - b[1];\n const z = a[2] - b[2];\n return [x, y, z];\n };\n const crossVectors = (a, b) => { // vector cross product (a x b)\n const x = a[1] * b[2] - a[2] * b[1];\n const y = a[2] * b[0] - a[0] * b[2];\n const z = a[0] * b[1] - a[1] * b[0];\n return [x, y, z];\n };\n // 3x3 rotation matrix to Euler angles based on https://www.geometrictools.com/Documentation/EulerAngles.pdf\n const rotationMatrixToEulerAngle = (r) => {\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const [r00, r01, r02, r10, r11, r12, r20, r21, r22] = r;\n let thetaX; let thetaY; let thetaZ;\n if (r10 < 1) { // YZX calculation\n if (r10 > -1) {\n thetaZ = Math.asin(r10);\n thetaY = Math.atan2(-r20, r00);\n thetaX = Math.atan2(-r12, r11);\n } else {\n thetaZ = -Math.PI / 2;\n thetaY = -Math.atan2(r21, r22);\n thetaX = 0;\n }\n } else {\n thetaZ = Math.PI / 2;\n thetaY = Math.atan2(r21, r22);\n thetaX = 0;\n }\n return { pitch: 2 * -thetaX, yaw: 2 * -thetaY, roll: 2 * -thetaZ };\n };\n // simple Euler angle calculation based existing 3D mesh\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const meshToEulerAngle = (mesh) => {\n const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1);\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const angle = {\n // values are in radians in range of -pi/2 to pi/2 which is -90 to +90 degrees, value of 0 means center\n // pitch is face move up/down\n pitch: radians(mesh[10][1], mesh[10][2], mesh[152][1], mesh[152][2]), // looking at y,z of top and bottom points of the face\n // yaw is face turn left/right\n yaw: radians(mesh[33][0], mesh[33][2], mesh[263][0], mesh[263][2]), // looking at x,z of outside corners of leftEye and rightEye\n // roll is face lean left/right\n roll: radians(mesh[33][0], mesh[33][1], mesh[263][0], mesh[263][1]), // looking at x,y of outside corners of leftEye and rightEye\n };\n return angle;\n };\n\n const mesh = face.meshRaw;\n if (!mesh || mesh.length < 300) return { angle: { pitch: 0, yaw: 0, roll: 0 }, matrix: [1, 0, 0, 0, 1, 0, 0, 0, 1] };\n\n const size = Math.max(face.boxRaw[2] * image_size[0], face.boxRaw[3] * image_size[1]) / 1.5;\n // top, bottom, left, right\n const pts = [mesh[10], mesh[152], mesh[234], mesh[454]].map((pt) => [\n // make the xyz coordinates proportional, independent of the image/box size\n pt[0] * image_size[0] / size,\n pt[1] * image_size[1] / size,\n pt[2],\n ]);\n\n const y_axis = normalize(subVectors(pts[1], pts[0]));\n let x_axis = normalize(subVectors(pts[3], pts[2]));\n const z_axis = normalize(crossVectors(x_axis, y_axis));\n // adjust x_axis to make sure that all axes are perpendicular to each other\n x_axis = crossVectors(y_axis, z_axis);\n\n // Rotation Matrix from Axis Vectors - http://renderdan.blogspot.com/2006/05/rotation-matrix-from-axis-vectors.html\n // 3x3 rotation matrix is flatten to array in row-major order. Note that the rotation represented by this matrix is inverted.\n const matrix: [number, number, number, number, number, number, number, number, number] = [\n x_axis[0], x_axis[1], x_axis[2],\n y_axis[0], y_axis[1], y_axis[2],\n z_axis[0], z_axis[1], z_axis[2],\n ];\n const angle = rotationMatrixToEulerAngle(matrix);\n // const angle = meshToEulerAngle(mesh);\n return { angle, matrix };\n};\n\nexport const detectFace = async (parent, input): Promise => {\n // run facemesh, includes blazeface and iris\n // eslint-disable-next-line no-async-promise-executor\n let timeStamp;\n let ageRes;\n let genderRes;\n let emotionRes;\n let embeddingRes;\n let descRes;\n const faceRes: Array = [];\n parent.state = 'run:face';\n timeStamp = now();\n const faces = await facemesh.predict(input, parent.config);\n parent.perf.face = Math.trunc(now() - timeStamp);\n if (!faces) return [];\n // for (const face of faces) {\n for (let i = 0; i < faces.length; i++) {\n parent.analyze('Get Face');\n\n // is something went wrong, skip the face\n if (!faces[i].image || faces[i].image.isDisposedInternal) {\n log('Face object is disposed:', faces[i].image);\n continue;\n }\n\n const rotation = calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]);\n\n // run emotion, inherits face from blazeface\n parent.analyze('Start Emotion:');\n if (parent.config.async) {\n emotionRes = parent.config.face.emotion.enabled ? emotion.predict(faces[i].image, parent.config, i, faces.length) : {};\n } else {\n parent.state = 'run:emotion';\n timeStamp = now();\n emotionRes = parent.config.face.emotion.enabled ? await emotion.predict(faces[i].image, parent.config, i, faces.length) : {};\n parent.perf.emotion = Math.trunc(now() - timeStamp);\n }\n parent.analyze('End Emotion:');\n\n // run emotion, inherits face from blazeface\n parent.analyze('Start Description:');\n if (parent.config.async) {\n descRes = parent.config.face.description.enabled ? faceres.predict(faces[i], parent.config, i, faces.length) : [];\n } else {\n parent.state = 'run:description';\n timeStamp = now();\n descRes = parent.config.face.description.enabled ? await faceres.predict(faces[i].image, parent.config, i, faces.length) : [];\n parent.perf.embedding = Math.trunc(now() - timeStamp);\n }\n parent.analyze('End Description:');\n\n // if async wait for results\n if (parent.config.async) {\n [ageRes, genderRes, emotionRes, embeddingRes, descRes] = await Promise.all([ageRes, genderRes, emotionRes, embeddingRes, descRes]);\n }\n\n parent.analyze('Finish Face:');\n\n // calculate iris distance\n // iris: array[ center, left, top, right, bottom]\n if (!parent.config.face.iris.enabled && faces[i]?.annotations?.leftEyeIris && faces[i]?.annotations?.rightEyeIris) {\n delete faces[i].annotations.leftEyeIris;\n delete faces[i].annotations.rightEyeIris;\n }\n const irisSize = (faces[i].annotations?.leftEyeIris && faces[i].annotations?.rightEyeIris)\n /* average human iris size is 11.7mm */\n ? 11.7 * Math.max(Math.abs(faces[i].annotations.leftEyeIris[3][0] - faces[i].annotations.leftEyeIris[1][0]), Math.abs(faces[i].annotations.rightEyeIris[4][1] - faces[i].annotations.rightEyeIris[2][1]))\n : 0;\n\n // combine results\n faceRes.push({\n id: i,\n ...faces[i],\n age: descRes.age,\n gender: descRes.gender,\n genderConfidence: descRes.genderConfidence,\n embedding: descRes.descriptor,\n emotion: emotionRes,\n iris: (irisSize !== 0) ? Math.trunc(irisSize) / 100 : 0,\n rotation,\n tensor: parent.config.face.detector.return ? faces[i].image?.squeeze() : null,\n });\n // dispose original face tensor\n faces[i].image?.dispose();\n\n parent.analyze('End Face');\n }\n parent.analyze('End FaceMesh:');\n if (parent.config.async) {\n if (parent.perf.face) delete parent.perf.face;\n if (parent.perf.age) delete parent.perf.age;\n if (parent.perf.gender) delete parent.perf.gender;\n if (parent.perf.emotion) delete parent.perf.emotion;\n }\n return faceRes;\n};\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as poses from './poses';\nimport * as util from './utils';\nimport { Body } from '../result';\n\nlet model;\nconst poseNetOutputs = ['MobilenetV1/offset_2/BiasAdd'/* offsets */, 'MobilenetV1/heatmap_2/BiasAdd'/* heatmapScores */, 'MobilenetV1/displacement_fwd_2/BiasAdd'/* displacementFwd */, 'MobilenetV1/displacement_bwd_2/BiasAdd'/* displacementBwd */];\n\nexport async function predict(input, config): Promise {\n const res = tf.tidy(() => {\n const resized = input.resizeBilinear([model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n const normalized = resized.toFloat().div(127.5).sub(1.0);\n const results = model.execute(normalized, poseNetOutputs);\n const results3d = results.map((y) => y.squeeze([0]));\n results3d[1] = results3d[1].sigmoid(); // apply sigmoid on scores\n return results3d;\n });\n\n const buffers = await Promise.all(res.map((tensor) => tensor.buffer()));\n for (const t of res) t.dispose();\n\n const decoded = await poses.decode(buffers[0], buffers[1], buffers[2], buffers[3], config.body.maxDetected, config.body.minConfidence);\n const scaled = util.scalePoses(decoded, [input.shape[1], input.shape[2]], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) as Body[];\n return scaled;\n}\n\nexport async function load(config) {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\n if (!model || !model.modelUrl) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n", "export const partNames = [\n 'nose', 'leftEye', 'rightEye', 'leftEar', 'rightEar', 'leftShoulder',\n 'rightShoulder', 'leftElbow', 'rightElbow', 'leftWrist', 'rightWrist',\n 'leftHip', 'rightHip', 'leftKnee', 'rightKnee', 'leftAnkle', 'rightAnkle',\n];\n\nexport const count = partNames.length; // 17 keypoints\n\nexport const partIds = partNames.reduce((result, jointName, i) => {\n result[jointName] = i;\n return result;\n}, {});\n\nconst connectedPartNames = [\n ['leftHip', 'leftShoulder'], ['leftElbow', 'leftShoulder'],\n ['leftElbow', 'leftWrist'], ['leftHip', 'leftKnee'],\n ['leftKnee', 'leftAnkle'], ['rightHip', 'rightShoulder'],\n ['rightElbow', 'rightShoulder'], ['rightElbow', 'rightWrist'],\n ['rightHip', 'rightKnee'], ['rightKnee', 'rightAnkle'],\n ['leftShoulder', 'rightShoulder'], ['leftHip', 'rightHip'],\n];\nexport const connectedPartIndices = connectedPartNames.map(([jointNameA, jointNameB]) => ([partIds[jointNameA], partIds[jointNameB]]));\n\nexport const poseChain = [\n ['nose', 'leftEye'], ['leftEye', 'leftEar'], ['nose', 'rightEye'],\n ['rightEye', 'rightEar'], ['nose', 'leftShoulder'],\n ['leftShoulder', 'leftElbow'], ['leftElbow', 'leftWrist'],\n ['leftShoulder', 'leftHip'], ['leftHip', 'leftKnee'],\n ['leftKnee', 'leftAnkle'], ['nose', 'rightShoulder'],\n ['rightShoulder', 'rightElbow'], ['rightElbow', 'rightWrist'],\n ['rightShoulder', 'rightHip'], ['rightHip', 'rightKnee'],\n ['rightKnee', 'rightAnkle'],\n];\n", "import * as kpt from './keypoints';\n\nexport function eitherPointDoesntMeetConfidence(a, b, minConfidence) {\n return (a < minConfidence || b < minConfidence);\n}\n\nexport function getAdjacentKeyPoints(keypoints, minConfidence) {\n return kpt.connectedPartIndices.reduce((result, [leftJoint, rightJoint]) => {\n if (eitherPointDoesntMeetConfidence(keypoints[leftJoint].score, keypoints[rightJoint].score, minConfidence)) {\n return result;\n }\n result.push([keypoints[leftJoint], keypoints[rightJoint]]);\n return result;\n }, []);\n}\n\nexport function getBoundingBox(keypoints) {\n const coord = keypoints.reduce(({ maxX, maxY, minX, minY }, { position: { x, y } }) => ({\n maxX: Math.max(maxX, x),\n maxY: Math.max(maxY, y),\n minX: Math.min(minX, x),\n minY: Math.min(minY, y),\n }), {\n maxX: Number.NEGATIVE_INFINITY,\n maxY: Number.NEGATIVE_INFINITY,\n minX: Number.POSITIVE_INFINITY,\n minY: Number.POSITIVE_INFINITY,\n });\n return [coord.minX, coord.minY, coord.maxX - coord.minX, coord.maxY - coord.minY];\n}\n\nexport function scalePoses(poses, [height, width], [inputResolutionHeight, inputResolutionWidth]) {\n const scaleY = height / inputResolutionHeight;\n const scaleX = width / inputResolutionWidth;\n const scalePose = (pose, i) => ({\n id: i,\n score: pose.score,\n bowRaw: [pose.box[0] / inputResolutionWidth, pose.box[1] / inputResolutionHeight, pose.box[2] / inputResolutionWidth, pose.box[3] / inputResolutionHeight],\n box: [Math.trunc(pose.box[0] * scaleX), Math.trunc(pose.box[1] * scaleY), Math.trunc(pose.box[2] * scaleX), Math.trunc(pose.box[3] * scaleY)],\n keypoints: pose.keypoints.map(({ score, part, position }) => ({\n score,\n part,\n position: { x: Math.trunc(position.x * scaleX), y: Math.trunc(position.y * scaleY) },\n })),\n });\n const scaledPoses = poses.map((pose, i) => scalePose(pose, i));\n return scaledPoses;\n}\n\n// algorithm based on Coursera Lecture from Algorithms, Part 1: https://www.coursera.org/learn/algorithms-part1/lecture/ZjoSM/heapsort\nexport class MaxHeap {\n priorityQueue: any;\n numberOfElements: number;\n getElementValue: any;\n\n constructor(maxSize, getElementValue) {\n this.priorityQueue = new Array(maxSize);\n this.numberOfElements = -1;\n this.getElementValue = getElementValue;\n }\n\n enqueue(x) {\n this.priorityQueue[++this.numberOfElements] = x;\n this.swim(this.numberOfElements);\n }\n\n dequeue() {\n const max = this.priorityQueue[0];\n this.exchange(0, this.numberOfElements--);\n this.sink(0);\n this.priorityQueue[this.numberOfElements + 1] = null;\n return max;\n }\n\n empty() { return this.numberOfElements === -1; }\n\n size() { return this.numberOfElements + 1; }\n\n all() { return this.priorityQueue.slice(0, this.numberOfElements + 1); }\n\n max() { return this.priorityQueue[0]; }\n\n swim(k) {\n while (k > 0 && this.less(Math.floor(k / 2), k)) {\n this.exchange(k, Math.floor(k / 2));\n k = Math.floor(k / 2);\n }\n }\n\n sink(k) {\n while (2 * k <= this.numberOfElements) {\n let j = 2 * k;\n if (j < this.numberOfElements && this.less(j, j + 1)) j++;\n if (!this.less(k, j)) break;\n this.exchange(k, j);\n k = j;\n }\n }\n\n getValueAt(i) {\n return this.getElementValue(this.priorityQueue[i]);\n }\n\n less(i, j) {\n return this.getValueAt(i) < this.getValueAt(j);\n }\n\n exchange(i, j) {\n const t = this.priorityQueue[i];\n this.priorityQueue[i] = this.priorityQueue[j];\n this.priorityQueue[j] = t;\n }\n}\n\nexport function getOffsetPoint(y, x, keypoint, offsets) {\n return {\n y: offsets.get(y, x, keypoint),\n x: offsets.get(y, x, keypoint + kpt.count),\n };\n}\n\nexport function getImageCoords(part, outputStride, offsets) {\n const { heatmapY, heatmapX, id: keypoint } = part;\n const { y, x } = getOffsetPoint(heatmapY, heatmapX, keypoint, offsets);\n return {\n x: part.heatmapX * outputStride + x,\n y: part.heatmapY * outputStride + y,\n };\n}\n\nexport function fillArray(element, size) {\n const result = new Array(size);\n for (let i = 0; i < size; i++) {\n result[i] = element;\n }\n return result;\n}\n\nexport function clamp(a, min, max) {\n if (a < min) return min;\n if (a > max) return max;\n return a;\n}\n\nexport function squaredDistance(y1, x1, y2, x2) {\n const dy = y2 - y1;\n const dx = x2 - x1;\n return dy * dy + dx * dx;\n}\n\nexport function addVectors(a, b) {\n return { x: a.x + b.x, y: a.y + b.y };\n}\n\nexport function clampVector(a, min, max) {\n return { y: clamp(a.y, min, max), x: clamp(a.x, min, max) };\n}\n", "import * as utils from './utils';\nimport * as kpt from './keypoints';\n\nconst localMaximumRadius = 1;\nconst outputStride = 16;\nconst squaredNmsRadius = 50 ** 2;\n\nfunction traverse(edgeId, sourceKeypoint, targetId, scores, offsets, displacements, offsetRefineStep = 2) {\n const getDisplacement = (point) => ({\n y: displacements.get(point.y, point.x, edgeId),\n x: displacements.get(point.y, point.x, (displacements.shape[2] / 2) + edgeId),\n });\n const getStridedIndexNearPoint = (point, height, width) => ({\n y: utils.clamp(Math.round(point.y / outputStride), 0, height - 1),\n x: utils.clamp(Math.round(point.x / outputStride), 0, width - 1),\n });\n\n const [height, width] = scores.shape;\n // Nearest neighbor interpolation for the source->target displacements.\n const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width);\n const displacement = getDisplacement(sourceKeypointIndices);\n const displacedPoint = utils.addVectors(sourceKeypoint.position, displacement);\n let targetKeypoint = displacedPoint;\n for (let i = 0; i < offsetRefineStep; i++) {\n const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);\n const offsetPoint = utils.getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetId, offsets);\n targetKeypoint = utils.addVectors(\n { x: targetKeypointIndices.x * outputStride, y: targetKeypointIndices.y * outputStride },\n { x: offsetPoint.x, y: offsetPoint.y },\n );\n }\n const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);\n const score = scores.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetId);\n return { position: targetKeypoint, part: kpt.partNames[targetId], score };\n}\n\nexport function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {\n const tuples = kpt.poseChain.map(([parentJoinName, childJoinName]) => ([kpt.partIds[parentJoinName], kpt.partIds[childJoinName]]));\n const edgesFwd = tuples.map(([, childJointId]) => childJointId);\n const edgesBwd = tuples.map(([parentJointId]) => parentJointId);\n const numParts = scores.shape[2]; // [21,21,17]\n const numEdges = edgesFwd.length;\n const keypoints = new Array(numParts);\n // Start a new detection instance at the position of the root.\n const rootPoint = utils.getImageCoords(root.part, outputStride, offsets);\n keypoints[root.part.id] = {\n score: root.score,\n part: kpt.partNames[root.part.id],\n position: rootPoint,\n };\n // Decode the part positions upwards in the tree, following the backward displacements.\n for (let edge = numEdges - 1; edge >= 0; --edge) {\n const sourceId = edgesFwd[edge];\n const targetId = edgesBwd[edge];\n if (keypoints[sourceId] && !keypoints[targetId]) {\n keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsBwd);\n }\n }\n // Decode the part positions downwards in the tree, following the forward displacements.\n for (let edge = 0; edge < numEdges; ++edge) {\n const sourceId = edgesBwd[edge];\n const targetId = edgesFwd[edge];\n if (keypoints[sourceId] && !keypoints[targetId]) {\n keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsFwd);\n }\n }\n return keypoints;\n}\n\nfunction scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores) {\n const [height, width] = scores.shape;\n let localMaximum = true;\n const yStart = Math.max(heatmapY - localMaximumRadius, 0);\n const yEnd = Math.min(heatmapY + localMaximumRadius + 1, height);\n for (let yCurrent = yStart; yCurrent < yEnd; ++yCurrent) {\n const xStart = Math.max(heatmapX - localMaximumRadius, 0);\n const xEnd = Math.min(heatmapX + localMaximumRadius + 1, width);\n for (let xCurrent = xStart; xCurrent < xEnd; ++xCurrent) {\n if (scores.get(yCurrent, xCurrent, keypointId) > score) {\n localMaximum = false;\n break;\n }\n }\n if (!localMaximum) break;\n }\n return localMaximum;\n}\n\nexport function buildPartWithScoreQueue(minConfidence, scores) {\n const [height, width, numKeypoints] = scores.shape;\n const queue = new utils.MaxHeap(height * width * numKeypoints, ({ score }) => score);\n for (let heatmapY = 0; heatmapY < height; ++heatmapY) {\n for (let heatmapX = 0; heatmapX < width; ++heatmapX) {\n for (let keypointId = 0; keypointId < numKeypoints; ++keypointId) {\n const score = scores.get(heatmapY, heatmapX, keypointId);\n // Only consider parts with score greater or equal to threshold as root candidates.\n if (score < minConfidence) continue;\n // Only consider keypoints whose score is maximum in a local window.\n if (scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores)) queue.enqueue({ score, part: { heatmapY, heatmapX, id: keypointId } });\n }\n }\n }\n return queue;\n}\n\nfunction withinRadius(poses, { x, y }, keypointId) {\n return poses.some(({ keypoints }) => {\n const correspondingKeypoint = keypoints[keypointId]?.position;\n if (!correspondingKeypoint) return false;\n return utils.squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius;\n });\n}\n\nfunction getInstanceScore(existingPoses, keypoints) {\n const notOverlappedKeypointScores = keypoints.reduce((result, { position, score }, keypointId) => {\n if (!withinRadius(existingPoses, position, keypointId)) result += score;\n return result;\n }, 0.0);\n return notOverlappedKeypointScores / keypoints.length;\n}\n\nexport function decode(offsets, scores, displacementsFwd, displacementsBwd, maxDetected, minConfidence) {\n const poses: Array<{ keypoints: any, box: any, score: number }> = [];\n const queue = buildPartWithScoreQueue(minConfidence, scores);\n // Generate at most maxDetected object instances per image in decreasing root part score order.\n while (poses.length < maxDetected && !queue.empty()) {\n // The top element in the queue is the next root candidate.\n const root = queue.dequeue();\n // Part-based non-maximum suppression: We reject a root candidate if it is within a disk of `nmsRadius` pixels from the corresponding part of a previously detected instance.\n const rootImageCoords = utils.getImageCoords(root.part, outputStride, offsets);\n if (withinRadius(poses, rootImageCoords, root.part.id)) continue;\n // Else start a new detection instance at the position of the root.\n let keypoints = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd);\n keypoints = keypoints.filter((a) => a.score > minConfidence);\n const score = getInstanceScore(poses, keypoints);\n const box = utils.getBoundingBox(keypoints);\n if (score > minConfidence) poses.push({ keypoints, box, score: Math.round(100 * score) / 100 });\n }\n return poses;\n}\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as handdetector from './handdetector';\nimport * as handpipeline from './handpipeline';\nimport { Hand } from '../result';\n\nconst meshAnnotations = {\n thumb: [1, 2, 3, 4],\n indexFinger: [5, 6, 7, 8],\n middleFinger: [9, 10, 11, 12],\n ringFinger: [13, 14, 15, 16],\n pinky: [17, 18, 19, 20],\n palmBase: [0],\n};\n\nlet handDetectorModel;\nlet handPoseModel;\nlet handPipeline;\n\nexport async function predict(input, config): Promise {\n const predictions = await handPipeline.estimateHands(input, config);\n if (!predictions) return [];\n const hands: Array = [];\n for (let i = 0; i < predictions.length; i++) {\n const annotations = {};\n if (predictions[i].landmarks) {\n for (const key of Object.keys(meshAnnotations)) {\n annotations[key] = meshAnnotations[key].map((index) => predictions[i].landmarks[index]);\n }\n }\n const box: [number, number, number, number] = predictions[i].box ? [\n Math.max(0, predictions[i].box.topLeft[0]),\n Math.max(0, predictions[i].box.topLeft[1]),\n Math.min(input.shape[2], predictions[i].box.bottomRight[0]) - Math.max(0, predictions[i].box.topLeft[0]),\n Math.min(input.shape[1], predictions[i].box.bottomRight[1]) - Math.max(0, predictions[i].box.topLeft[1]),\n ] : [0, 0, 0, 0];\n const boxRaw: [number, number, number, number] = [\n (predictions[i].box.topLeft[0]) / input.shape[2],\n (predictions[i].box.topLeft[1]) / input.shape[1],\n (predictions[i].box.bottomRight[0] - predictions[i].box.topLeft[0]) / input.shape[2],\n (predictions[i].box.bottomRight[1] - predictions[i].box.topLeft[1]) / input.shape[1],\n ];\n hands.push({ id: i, confidence: Math.round(100 * predictions[i].confidence) / 100, box, boxRaw, landmarks: predictions[i].landmarks, annotations });\n }\n return hands;\n}\n\nexport async function load(config): Promise<[Object, Object]> {\n if (!handDetectorModel || !handPoseModel) {\n [handDetectorModel, handPoseModel] = await Promise.all([\n config.hand.enabled ? tf.loadGraphModel(join(config.modelBasePath, config.hand.detector.modelPath), { fromTFHub: config.hand.detector.modelPath.includes('tfhub.dev') }) : null,\n config.hand.landmarks ? tf.loadGraphModel(join(config.modelBasePath, config.hand.skeleton.modelPath), { fromTFHub: config.hand.skeleton.modelPath.includes('tfhub.dev') }) : null,\n ]);\n if (config.hand.enabled) {\n if (!handDetectorModel || !handDetectorModel.modelUrl) log('load model failed:', config.hand.detector.modelPath);\n else if (config.debug) log('load model:', handDetectorModel.modelUrl);\n if (!handPoseModel || !handPoseModel.modelUrl) log('load model failed:', config.hand.skeleton.modelPath);\n else if (config.debug) log('load model:', handPoseModel.modelUrl);\n }\n } else {\n if (config.debug) log('cached model:', handDetectorModel.modelUrl);\n if (config.debug) log('cached model:', handPoseModel.modelUrl);\n }\n const handDetector = new handdetector.HandDetector(handDetectorModel);\n handPipeline = new handpipeline.HandPipeline(handDetector, handPoseModel);\n return [handDetectorModel, handPoseModel];\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\n\nexport function getBoxSize(box) {\n return [\n Math.abs(box.endPoint[0] - box.startPoint[0]),\n Math.abs(box.endPoint[1] - box.startPoint[1]),\n ];\n}\n\nexport function getBoxCenter(box) {\n return [\n box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2,\n box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2,\n ];\n}\n\nexport function cutBoxFromImageAndResize(box, image, cropSize) {\n const h = image.shape[1];\n const w = image.shape[2];\n const boxes = [[\n box.startPoint[1] / h,\n box.startPoint[0] / w,\n box.endPoint[1] / h,\n box.endPoint[0] / w,\n ]];\n return tf.image.cropAndResize(image, boxes, [0], cropSize);\n}\n\nexport function scaleBoxCoordinates(box, factor) {\n const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]];\n const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\n const palmLandmarks = box.palmLandmarks.map((coord) => {\n const scaledCoord = [coord[0] * factor[0], coord[1] * factor[1]];\n return scaledCoord;\n });\n return { startPoint, endPoint, palmLandmarks, confidence: box.confidence };\n}\n\nexport function enlargeBox(box, factor = 1.5) {\n const center = getBoxCenter(box);\n const size = getBoxSize(box);\n const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2];\n const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]];\n const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]];\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function squarifyBox(box) {\n const centers = getBoxCenter(box);\n const size = getBoxSize(box);\n const maxEdge = Math.max(...size);\n const halfSize = maxEdge / 2;\n const startPoint = [centers[0] - halfSize, centers[1] - halfSize];\n const endPoint = [centers[0] + halfSize, centers[1] + halfSize];\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function shiftBox(box, shiftFactor) {\n const boxSize = [\n box.endPoint[0] - box.startPoint[0],\n box.endPoint[1] - box.startPoint[1],\n ];\n const shiftVector = [boxSize[0] * shiftFactor[0], boxSize[1] * shiftFactor[1]];\n const startPoint = [box.startPoint[0] + shiftVector[0], box.startPoint[1] + shiftVector[1]];\n const endPoint = [box.endPoint[0] + shiftVector[0], box.endPoint[1] + shiftVector[1]];\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n", "export const anchors = [\n {\n x: 0.015625,\n y: 0.015625,\n },\n {\n x: 0.015625,\n y: 0.015625,\n },\n {\n x: 0.046875,\n y: 0.015625,\n },\n {\n x: 0.046875,\n y: 0.015625,\n },\n {\n x: 0.078125,\n y: 0.015625,\n },\n {\n x: 0.078125,\n y: 0.015625,\n },\n {\n x: 0.109375,\n y: 0.015625,\n },\n {\n x: 0.109375,\n y: 0.015625,\n },\n {\n x: 0.140625,\n y: 0.015625,\n },\n {\n x: 0.140625,\n y: 0.015625,\n },\n {\n x: 0.171875,\n y: 0.015625,\n },\n {\n x: 0.171875,\n y: 0.015625,\n },\n {\n x: 0.203125,\n y: 0.015625,\n },\n {\n x: 0.203125,\n y: 0.015625,\n },\n {\n x: 0.234375,\n y: 0.015625,\n },\n {\n x: 0.234375,\n y: 0.015625,\n },\n {\n x: 0.265625,\n y: 0.015625,\n },\n {\n x: 0.265625,\n y: 0.015625,\n },\n {\n x: 0.296875,\n y: 0.015625,\n },\n {\n x: 0.296875,\n y: 0.015625,\n },\n {\n x: 0.328125,\n y: 0.015625,\n },\n {\n x: 0.328125,\n y: 0.015625,\n },\n {\n x: 0.359375,\n y: 0.015625,\n },\n {\n x: 0.359375,\n y: 0.015625,\n },\n {\n x: 0.390625,\n y: 0.015625,\n },\n {\n x: 0.390625,\n y: 0.015625,\n },\n {\n x: 0.421875,\n y: 0.015625,\n },\n {\n x: 0.421875,\n y: 0.015625,\n },\n {\n x: 0.453125,\n y: 0.015625,\n },\n {\n x: 0.453125,\n y: 0.015625,\n },\n {\n x: 0.484375,\n y: 0.015625,\n },\n {\n x: 0.484375,\n y: 0.015625,\n },\n {\n x: 0.515625,\n y: 0.015625,\n },\n {\n x: 0.515625,\n y: 0.015625,\n },\n {\n x: 0.546875,\n y: 0.015625,\n },\n {\n x: 0.546875,\n y: 0.015625,\n },\n {\n x: 0.578125,\n y: 0.015625,\n },\n {\n x: 0.578125,\n y: 0.015625,\n },\n {\n x: 0.609375,\n y: 0.015625,\n },\n {\n x: 0.609375,\n y: 0.015625,\n },\n {\n x: 0.640625,\n y: 0.015625,\n },\n {\n x: 0.640625,\n y: 0.015625,\n },\n {\n x: 0.671875,\n y: 0.015625,\n },\n {\n x: 0.671875,\n y: 0.015625,\n },\n {\n x: 0.703125,\n y: 0.015625,\n },\n {\n x: 0.703125,\n y: 0.015625,\n },\n {\n x: 0.734375,\n y: 0.015625,\n },\n {\n x: 0.734375,\n y: 0.015625,\n },\n {\n x: 0.765625,\n y: 0.015625,\n },\n {\n x: 0.765625,\n y: 0.015625,\n },\n {\n x: 0.796875,\n y: 0.015625,\n },\n {\n x: 0.796875,\n y: 0.015625,\n },\n {\n x: 0.828125,\n y: 0.015625,\n },\n {\n x: 0.828125,\n y: 0.015625,\n },\n {\n x: 0.859375,\n y: 0.015625,\n },\n {\n x: 0.859375,\n y: 0.015625,\n },\n {\n x: 0.890625,\n y: 0.015625,\n },\n {\n x: 0.890625,\n y: 0.015625,\n },\n {\n x: 0.921875,\n y: 0.015625,\n },\n {\n x: 0.921875,\n y: 0.015625,\n },\n {\n x: 0.953125,\n y: 0.015625,\n },\n {\n x: 0.953125,\n y: 0.015625,\n },\n {\n x: 0.984375,\n y: 0.015625,\n },\n {\n x: 0.984375,\n y: 0.015625,\n },\n {\n x: 0.015625,\n y: 0.046875,\n },\n {\n x: 0.015625,\n y: 0.046875,\n },\n {\n x: 0.046875,\n y: 0.046875,\n },\n {\n x: 0.046875,\n y: 0.046875,\n },\n {\n x: 0.078125,\n y: 0.046875,\n },\n {\n x: 0.078125,\n y: 0.046875,\n },\n {\n x: 0.109375,\n y: 0.046875,\n },\n {\n x: 0.109375,\n y: 0.046875,\n },\n {\n x: 0.140625,\n y: 0.046875,\n },\n {\n x: 0.140625,\n y: 0.046875,\n },\n {\n x: 0.171875,\n y: 0.046875,\n },\n {\n x: 0.171875,\n y: 0.046875,\n },\n {\n x: 0.203125,\n y: 0.046875,\n },\n {\n x: 0.203125,\n y: 0.046875,\n },\n {\n x: 0.234375,\n y: 0.046875,\n },\n {\n x: 0.234375,\n y: 0.046875,\n },\n {\n x: 0.265625,\n y: 0.046875,\n },\n {\n x: 0.265625,\n y: 0.046875,\n },\n {\n x: 0.296875,\n y: 0.046875,\n },\n {\n x: 0.296875,\n y: 0.046875,\n },\n {\n x: 0.328125,\n y: 0.046875,\n },\n {\n x: 0.328125,\n y: 0.046875,\n },\n {\n x: 0.359375,\n y: 0.046875,\n },\n {\n x: 0.359375,\n y: 0.046875,\n },\n {\n x: 0.390625,\n y: 0.046875,\n },\n {\n x: 0.390625,\n y: 0.046875,\n },\n {\n x: 0.421875,\n y: 0.046875,\n },\n {\n x: 0.421875,\n y: 0.046875,\n },\n {\n x: 0.453125,\n y: 0.046875,\n },\n {\n x: 0.453125,\n y: 0.046875,\n },\n {\n x: 0.484375,\n y: 0.046875,\n },\n {\n x: 0.484375,\n y: 0.046875,\n },\n {\n x: 0.515625,\n y: 0.046875,\n },\n {\n x: 0.515625,\n y: 0.046875,\n },\n {\n x: 0.546875,\n y: 0.046875,\n },\n {\n x: 0.546875,\n y: 0.046875,\n },\n {\n x: 0.578125,\n y: 0.046875,\n },\n {\n x: 0.578125,\n y: 0.046875,\n },\n {\n x: 0.609375,\n y: 0.046875,\n },\n {\n x: 0.609375,\n y: 0.046875,\n },\n {\n x: 0.640625,\n y: 0.046875,\n },\n {\n x: 0.640625,\n y: 0.046875,\n },\n {\n x: 0.671875,\n y: 0.046875,\n },\n {\n x: 0.671875,\n y: 0.046875,\n },\n {\n x: 0.703125,\n y: 0.046875,\n },\n {\n x: 0.703125,\n y: 0.046875,\n },\n {\n x: 0.734375,\n y: 0.046875,\n },\n {\n x: 0.734375,\n y: 0.046875,\n },\n {\n x: 0.765625,\n y: 0.046875,\n },\n {\n x: 0.765625,\n y: 0.046875,\n },\n {\n x: 0.796875,\n y: 0.046875,\n },\n {\n x: 0.796875,\n y: 0.046875,\n },\n {\n x: 0.828125,\n y: 0.046875,\n },\n {\n x: 0.828125,\n y: 0.046875,\n },\n {\n x: 0.859375,\n y: 0.046875,\n },\n {\n x: 0.859375,\n y: 0.046875,\n },\n {\n x: 0.890625,\n y: 0.046875,\n },\n {\n x: 0.890625,\n y: 0.046875,\n },\n {\n x: 0.921875,\n y: 0.046875,\n },\n {\n x: 0.921875,\n y: 0.046875,\n },\n {\n x: 0.953125,\n y: 0.046875,\n },\n {\n x: 0.953125,\n y: 0.046875,\n },\n {\n x: 0.984375,\n y: 0.046875,\n },\n {\n x: 0.984375,\n y: 0.046875,\n },\n {\n x: 0.015625,\n y: 0.078125,\n },\n {\n x: 0.015625,\n y: 0.078125,\n },\n {\n x: 0.046875,\n y: 0.078125,\n },\n {\n x: 0.046875,\n y: 0.078125,\n },\n {\n x: 0.078125,\n y: 0.078125,\n },\n {\n x: 0.078125,\n y: 0.078125,\n },\n {\n x: 0.109375,\n y: 0.078125,\n },\n {\n x: 0.109375,\n y: 0.078125,\n },\n {\n x: 0.140625,\n y: 0.078125,\n },\n {\n x: 0.140625,\n y: 0.078125,\n },\n {\n x: 0.171875,\n y: 0.078125,\n },\n {\n x: 0.171875,\n y: 0.078125,\n },\n {\n x: 0.203125,\n y: 0.078125,\n },\n {\n x: 0.203125,\n y: 0.078125,\n },\n {\n x: 0.234375,\n y: 0.078125,\n },\n {\n x: 0.234375,\n y: 0.078125,\n },\n {\n x: 0.265625,\n y: 0.078125,\n },\n {\n x: 0.265625,\n y: 0.078125,\n },\n {\n x: 0.296875,\n y: 0.078125,\n },\n {\n x: 0.296875,\n y: 0.078125,\n },\n {\n x: 0.328125,\n y: 0.078125,\n },\n {\n x: 0.328125,\n y: 0.078125,\n },\n {\n x: 0.359375,\n y: 0.078125,\n },\n {\n x: 0.359375,\n y: 0.078125,\n },\n {\n x: 0.390625,\n y: 0.078125,\n },\n {\n x: 0.390625,\n y: 0.078125,\n },\n {\n x: 0.421875,\n y: 0.078125,\n },\n {\n x: 0.421875,\n y: 0.078125,\n },\n {\n x: 0.453125,\n y: 0.078125,\n },\n {\n x: 0.453125,\n y: 0.078125,\n },\n {\n x: 0.484375,\n y: 0.078125,\n },\n {\n x: 0.484375,\n y: 0.078125,\n },\n {\n x: 0.515625,\n y: 0.078125,\n },\n {\n x: 0.515625,\n y: 0.078125,\n },\n {\n x: 0.546875,\n y: 0.078125,\n },\n {\n x: 0.546875,\n y: 0.078125,\n },\n {\n x: 0.578125,\n y: 0.078125,\n },\n {\n x: 0.578125,\n y: 0.078125,\n },\n {\n x: 0.609375,\n y: 0.078125,\n },\n {\n x: 0.609375,\n y: 0.078125,\n },\n {\n x: 0.640625,\n y: 0.078125,\n },\n {\n x: 0.640625,\n y: 0.078125,\n },\n {\n x: 0.671875,\n y: 0.078125,\n },\n {\n x: 0.671875,\n y: 0.078125,\n },\n {\n x: 0.703125,\n y: 0.078125,\n },\n {\n x: 0.703125,\n y: 0.078125,\n },\n {\n x: 0.734375,\n y: 0.078125,\n },\n {\n x: 0.734375,\n y: 0.078125,\n },\n {\n x: 0.765625,\n y: 0.078125,\n },\n {\n x: 0.765625,\n y: 0.078125,\n },\n {\n x: 0.796875,\n y: 0.078125,\n },\n {\n x: 0.796875,\n y: 0.078125,\n },\n {\n x: 0.828125,\n y: 0.078125,\n },\n {\n x: 0.828125,\n y: 0.078125,\n },\n {\n x: 0.859375,\n y: 0.078125,\n },\n {\n x: 0.859375,\n y: 0.078125,\n },\n {\n x: 0.890625,\n y: 0.078125,\n },\n {\n x: 0.890625,\n y: 0.078125,\n },\n {\n x: 0.921875,\n y: 0.078125,\n },\n {\n x: 0.921875,\n y: 0.078125,\n },\n {\n x: 0.953125,\n y: 0.078125,\n },\n {\n x: 0.953125,\n y: 0.078125,\n },\n {\n x: 0.984375,\n y: 0.078125,\n },\n {\n x: 0.984375,\n y: 0.078125,\n },\n {\n x: 0.015625,\n y: 0.109375,\n },\n {\n x: 0.015625,\n y: 0.109375,\n },\n {\n x: 0.046875,\n y: 0.109375,\n },\n {\n x: 0.046875,\n y: 0.109375,\n },\n {\n x: 0.078125,\n y: 0.109375,\n },\n {\n x: 0.078125,\n y: 0.109375,\n },\n {\n x: 0.109375,\n y: 0.109375,\n },\n {\n x: 0.109375,\n y: 0.109375,\n },\n {\n x: 0.140625,\n y: 0.109375,\n },\n {\n x: 0.140625,\n y: 0.109375,\n },\n {\n x: 0.171875,\n y: 0.109375,\n },\n {\n x: 0.171875,\n y: 0.109375,\n },\n {\n x: 0.203125,\n y: 0.109375,\n },\n {\n x: 0.203125,\n y: 0.109375,\n },\n {\n x: 0.234375,\n y: 0.109375,\n },\n {\n x: 0.234375,\n y: 0.109375,\n },\n {\n x: 0.265625,\n y: 0.109375,\n },\n {\n x: 0.265625,\n y: 0.109375,\n },\n {\n x: 0.296875,\n y: 0.109375,\n },\n {\n x: 0.296875,\n y: 0.109375,\n },\n {\n x: 0.328125,\n y: 0.109375,\n },\n {\n x: 0.328125,\n y: 0.109375,\n },\n {\n x: 0.359375,\n y: 0.109375,\n },\n {\n x: 0.359375,\n y: 0.109375,\n },\n {\n x: 0.390625,\n y: 0.109375,\n },\n {\n x: 0.390625,\n y: 0.109375,\n },\n {\n x: 0.421875,\n y: 0.109375,\n },\n {\n x: 0.421875,\n y: 0.109375,\n },\n {\n x: 0.453125,\n y: 0.109375,\n },\n {\n x: 0.453125,\n y: 0.109375,\n },\n {\n x: 0.484375,\n y: 0.109375,\n },\n {\n x: 0.484375,\n y: 0.109375,\n },\n {\n x: 0.515625,\n y: 0.109375,\n },\n {\n x: 0.515625,\n y: 0.109375,\n },\n {\n x: 0.546875,\n y: 0.109375,\n },\n {\n x: 0.546875,\n y: 0.109375,\n },\n {\n x: 0.578125,\n y: 0.109375,\n },\n {\n x: 0.578125,\n y: 0.109375,\n },\n {\n x: 0.609375,\n y: 0.109375,\n },\n {\n x: 0.609375,\n y: 0.109375,\n },\n {\n x: 0.640625,\n y: 0.109375,\n },\n {\n x: 0.640625,\n y: 0.109375,\n },\n {\n x: 0.671875,\n y: 0.109375,\n },\n {\n x: 0.671875,\n y: 0.109375,\n },\n {\n x: 0.703125,\n y: 0.109375,\n },\n {\n x: 0.703125,\n y: 0.109375,\n },\n {\n x: 0.734375,\n y: 0.109375,\n },\n {\n x: 0.734375,\n y: 0.109375,\n },\n {\n x: 0.765625,\n y: 0.109375,\n },\n {\n x: 0.765625,\n y: 0.109375,\n },\n {\n x: 0.796875,\n y: 0.109375,\n },\n {\n x: 0.796875,\n y: 0.109375,\n },\n {\n x: 0.828125,\n y: 0.109375,\n },\n {\n x: 0.828125,\n y: 0.109375,\n },\n {\n x: 0.859375,\n y: 0.109375,\n },\n {\n x: 0.859375,\n y: 0.109375,\n },\n {\n x: 0.890625,\n y: 0.109375,\n },\n {\n x: 0.890625,\n y: 0.109375,\n },\n {\n x: 0.921875,\n y: 0.109375,\n },\n {\n x: 0.921875,\n y: 0.109375,\n },\n {\n x: 0.953125,\n y: 0.109375,\n },\n {\n x: 0.953125,\n y: 0.109375,\n },\n {\n x: 0.984375,\n y: 0.109375,\n },\n {\n x: 0.984375,\n y: 0.109375,\n },\n {\n x: 0.015625,\n y: 0.140625,\n },\n {\n x: 0.015625,\n y: 0.140625,\n },\n {\n x: 0.046875,\n y: 0.140625,\n },\n {\n x: 0.046875,\n y: 0.140625,\n },\n {\n x: 0.078125,\n y: 0.140625,\n },\n {\n x: 0.078125,\n y: 0.140625,\n },\n {\n x: 0.109375,\n y: 0.140625,\n },\n {\n x: 0.109375,\n y: 0.140625,\n },\n {\n x: 0.140625,\n y: 0.140625,\n },\n {\n x: 0.140625,\n y: 0.140625,\n },\n {\n x: 0.171875,\n y: 0.140625,\n },\n {\n x: 0.171875,\n y: 0.140625,\n },\n {\n x: 0.203125,\n y: 0.140625,\n },\n {\n x: 0.203125,\n y: 0.140625,\n },\n {\n x: 0.234375,\n y: 0.140625,\n },\n {\n x: 0.234375,\n y: 0.140625,\n },\n {\n x: 0.265625,\n y: 0.140625,\n },\n {\n x: 0.265625,\n y: 0.140625,\n },\n {\n x: 0.296875,\n y: 0.140625,\n },\n {\n x: 0.296875,\n y: 0.140625,\n },\n {\n x: 0.328125,\n y: 0.140625,\n },\n {\n x: 0.328125,\n y: 0.140625,\n },\n {\n x: 0.359375,\n y: 0.140625,\n },\n {\n x: 0.359375,\n y: 0.140625,\n },\n {\n x: 0.390625,\n y: 0.140625,\n },\n {\n x: 0.390625,\n y: 0.140625,\n },\n {\n x: 0.421875,\n y: 0.140625,\n },\n {\n x: 0.421875,\n y: 0.140625,\n },\n {\n x: 0.453125,\n y: 0.140625,\n },\n {\n x: 0.453125,\n y: 0.140625,\n },\n {\n x: 0.484375,\n y: 0.140625,\n },\n {\n x: 0.484375,\n y: 0.140625,\n },\n {\n x: 0.515625,\n y: 0.140625,\n },\n {\n x: 0.515625,\n y: 0.140625,\n },\n {\n x: 0.546875,\n y: 0.140625,\n },\n {\n x: 0.546875,\n y: 0.140625,\n },\n {\n x: 0.578125,\n y: 0.140625,\n },\n {\n x: 0.578125,\n y: 0.140625,\n },\n {\n x: 0.609375,\n y: 0.140625,\n },\n {\n x: 0.609375,\n y: 0.140625,\n },\n {\n x: 0.640625,\n y: 0.140625,\n },\n {\n x: 0.640625,\n y: 0.140625,\n },\n {\n x: 0.671875,\n y: 0.140625,\n },\n {\n x: 0.671875,\n y: 0.140625,\n },\n {\n x: 0.703125,\n y: 0.140625,\n },\n {\n x: 0.703125,\n y: 0.140625,\n },\n {\n x: 0.734375,\n y: 0.140625,\n },\n {\n x: 0.734375,\n y: 0.140625,\n },\n {\n x: 0.765625,\n y: 0.140625,\n },\n {\n x: 0.765625,\n y: 0.140625,\n },\n {\n x: 0.796875,\n y: 0.140625,\n },\n {\n x: 0.796875,\n y: 0.140625,\n },\n {\n x: 0.828125,\n y: 0.140625,\n },\n {\n x: 0.828125,\n y: 0.140625,\n },\n {\n x: 0.859375,\n y: 0.140625,\n },\n {\n x: 0.859375,\n y: 0.140625,\n },\n {\n x: 0.890625,\n y: 0.140625,\n },\n {\n x: 0.890625,\n y: 0.140625,\n },\n {\n x: 0.921875,\n y: 0.140625,\n },\n {\n x: 0.921875,\n y: 0.140625,\n },\n {\n x: 0.953125,\n y: 0.140625,\n },\n {\n x: 0.953125,\n y: 0.140625,\n },\n {\n x: 0.984375,\n y: 0.140625,\n },\n {\n x: 0.984375,\n y: 0.140625,\n },\n {\n x: 0.015625,\n y: 0.171875,\n },\n {\n x: 0.015625,\n y: 0.171875,\n },\n {\n x: 0.046875,\n y: 0.171875,\n },\n {\n x: 0.046875,\n y: 0.171875,\n },\n {\n x: 0.078125,\n y: 0.171875,\n },\n {\n x: 0.078125,\n y: 0.171875,\n },\n {\n x: 0.109375,\n y: 0.171875,\n },\n {\n x: 0.109375,\n y: 0.171875,\n },\n {\n x: 0.140625,\n y: 0.171875,\n },\n {\n x: 0.140625,\n y: 0.171875,\n },\n {\n x: 0.171875,\n y: 0.171875,\n },\n {\n x: 0.171875,\n y: 0.171875,\n },\n {\n x: 0.203125,\n y: 0.171875,\n },\n {\n x: 0.203125,\n y: 0.171875,\n },\n {\n x: 0.234375,\n y: 0.171875,\n },\n {\n x: 0.234375,\n y: 0.171875,\n },\n {\n x: 0.265625,\n y: 0.171875,\n },\n {\n x: 0.265625,\n y: 0.171875,\n },\n {\n x: 0.296875,\n y: 0.171875,\n },\n {\n x: 0.296875,\n y: 0.171875,\n },\n {\n x: 0.328125,\n y: 0.171875,\n },\n {\n x: 0.328125,\n y: 0.171875,\n },\n {\n x: 0.359375,\n y: 0.171875,\n },\n {\n x: 0.359375,\n y: 0.171875,\n },\n {\n x: 0.390625,\n y: 0.171875,\n },\n {\n x: 0.390625,\n y: 0.171875,\n },\n {\n x: 0.421875,\n y: 0.171875,\n },\n {\n x: 0.421875,\n y: 0.171875,\n },\n {\n x: 0.453125,\n y: 0.171875,\n },\n {\n x: 0.453125,\n y: 0.171875,\n },\n {\n x: 0.484375,\n y: 0.171875,\n },\n {\n x: 0.484375,\n y: 0.171875,\n },\n {\n x: 0.515625,\n y: 0.171875,\n },\n {\n x: 0.515625,\n y: 0.171875,\n },\n {\n x: 0.546875,\n y: 0.171875,\n },\n {\n x: 0.546875,\n y: 0.171875,\n },\n {\n x: 0.578125,\n y: 0.171875,\n },\n {\n x: 0.578125,\n y: 0.171875,\n },\n {\n x: 0.609375,\n y: 0.171875,\n },\n {\n x: 0.609375,\n y: 0.171875,\n },\n {\n x: 0.640625,\n y: 0.171875,\n },\n {\n x: 0.640625,\n y: 0.171875,\n },\n {\n x: 0.671875,\n y: 0.171875,\n },\n {\n x: 0.671875,\n y: 0.171875,\n },\n {\n x: 0.703125,\n y: 0.171875,\n },\n {\n x: 0.703125,\n y: 0.171875,\n },\n {\n x: 0.734375,\n y: 0.171875,\n },\n {\n x: 0.734375,\n y: 0.171875,\n },\n {\n x: 0.765625,\n y: 0.171875,\n },\n {\n x: 0.765625,\n y: 0.171875,\n },\n {\n x: 0.796875,\n y: 0.171875,\n },\n {\n x: 0.796875,\n y: 0.171875,\n },\n {\n x: 0.828125,\n y: 0.171875,\n },\n {\n x: 0.828125,\n y: 0.171875,\n },\n {\n x: 0.859375,\n y: 0.171875,\n },\n {\n x: 0.859375,\n y: 0.171875,\n },\n {\n x: 0.890625,\n y: 0.171875,\n },\n {\n x: 0.890625,\n y: 0.171875,\n },\n {\n x: 0.921875,\n y: 0.171875,\n },\n {\n x: 0.921875,\n y: 0.171875,\n },\n {\n x: 0.953125,\n y: 0.171875,\n },\n {\n x: 0.953125,\n y: 0.171875,\n },\n {\n x: 0.984375,\n y: 0.171875,\n },\n {\n x: 0.984375,\n y: 0.171875,\n },\n {\n x: 0.015625,\n y: 0.203125,\n },\n {\n x: 0.015625,\n y: 0.203125,\n },\n {\n x: 0.046875,\n y: 0.203125,\n },\n {\n x: 0.046875,\n y: 0.203125,\n },\n {\n x: 0.078125,\n y: 0.203125,\n },\n {\n x: 0.078125,\n y: 0.203125,\n },\n {\n x: 0.109375,\n y: 0.203125,\n },\n {\n x: 0.109375,\n y: 0.203125,\n },\n {\n x: 0.140625,\n y: 0.203125,\n },\n {\n x: 0.140625,\n y: 0.203125,\n },\n {\n x: 0.171875,\n y: 0.203125,\n },\n {\n x: 0.171875,\n y: 0.203125,\n },\n {\n x: 0.203125,\n y: 0.203125,\n },\n {\n x: 0.203125,\n y: 0.203125,\n },\n {\n x: 0.234375,\n y: 0.203125,\n },\n {\n x: 0.234375,\n y: 0.203125,\n },\n {\n x: 0.265625,\n y: 0.203125,\n },\n {\n x: 0.265625,\n y: 0.203125,\n },\n {\n x: 0.296875,\n y: 0.203125,\n },\n {\n x: 0.296875,\n y: 0.203125,\n },\n {\n x: 0.328125,\n y: 0.203125,\n },\n {\n x: 0.328125,\n y: 0.203125,\n },\n {\n x: 0.359375,\n y: 0.203125,\n },\n {\n x: 0.359375,\n y: 0.203125,\n },\n {\n x: 0.390625,\n y: 0.203125,\n },\n {\n x: 0.390625,\n y: 0.203125,\n },\n {\n x: 0.421875,\n y: 0.203125,\n },\n {\n x: 0.421875,\n y: 0.203125,\n },\n {\n x: 0.453125,\n y: 0.203125,\n },\n {\n x: 0.453125,\n y: 0.203125,\n },\n {\n x: 0.484375,\n y: 0.203125,\n },\n {\n x: 0.484375,\n y: 0.203125,\n },\n {\n x: 0.515625,\n y: 0.203125,\n },\n {\n x: 0.515625,\n y: 0.203125,\n },\n {\n x: 0.546875,\n y: 0.203125,\n },\n {\n x: 0.546875,\n y: 0.203125,\n },\n {\n x: 0.578125,\n y: 0.203125,\n },\n {\n x: 0.578125,\n y: 0.203125,\n },\n {\n x: 0.609375,\n y: 0.203125,\n },\n {\n x: 0.609375,\n y: 0.203125,\n },\n {\n x: 0.640625,\n y: 0.203125,\n },\n {\n x: 0.640625,\n y: 0.203125,\n },\n {\n x: 0.671875,\n y: 0.203125,\n },\n {\n x: 0.671875,\n y: 0.203125,\n },\n {\n x: 0.703125,\n y: 0.203125,\n },\n {\n x: 0.703125,\n y: 0.203125,\n },\n {\n x: 0.734375,\n y: 0.203125,\n },\n {\n x: 0.734375,\n y: 0.203125,\n },\n {\n x: 0.765625,\n y: 0.203125,\n },\n {\n x: 0.765625,\n y: 0.203125,\n },\n {\n x: 0.796875,\n y: 0.203125,\n },\n {\n x: 0.796875,\n y: 0.203125,\n },\n {\n x: 0.828125,\n y: 0.203125,\n },\n {\n x: 0.828125,\n y: 0.203125,\n },\n {\n x: 0.859375,\n y: 0.203125,\n },\n {\n x: 0.859375,\n y: 0.203125,\n },\n {\n x: 0.890625,\n y: 0.203125,\n },\n {\n x: 0.890625,\n y: 0.203125,\n },\n {\n x: 0.921875,\n y: 0.203125,\n },\n {\n x: 0.921875,\n y: 0.203125,\n },\n {\n x: 0.953125,\n y: 0.203125,\n },\n {\n x: 0.953125,\n y: 0.203125,\n },\n {\n x: 0.984375,\n y: 0.203125,\n },\n {\n x: 0.984375,\n y: 0.203125,\n },\n {\n x: 0.015625,\n y: 0.234375,\n },\n {\n x: 0.015625,\n y: 0.234375,\n },\n {\n x: 0.046875,\n y: 0.234375,\n },\n {\n x: 0.046875,\n y: 0.234375,\n },\n {\n x: 0.078125,\n y: 0.234375,\n },\n {\n x: 0.078125,\n y: 0.234375,\n },\n {\n x: 0.109375,\n y: 0.234375,\n },\n {\n x: 0.109375,\n y: 0.234375,\n },\n {\n x: 0.140625,\n y: 0.234375,\n },\n {\n x: 0.140625,\n y: 0.234375,\n },\n {\n x: 0.171875,\n y: 0.234375,\n },\n {\n x: 0.171875,\n y: 0.234375,\n },\n {\n x: 0.203125,\n y: 0.234375,\n },\n {\n x: 0.203125,\n y: 0.234375,\n },\n {\n x: 0.234375,\n y: 0.234375,\n },\n {\n x: 0.234375,\n y: 0.234375,\n },\n {\n x: 0.265625,\n y: 0.234375,\n },\n {\n x: 0.265625,\n y: 0.234375,\n },\n {\n x: 0.296875,\n y: 0.234375,\n },\n {\n x: 0.296875,\n y: 0.234375,\n },\n {\n x: 0.328125,\n y: 0.234375,\n },\n {\n x: 0.328125,\n y: 0.234375,\n },\n {\n x: 0.359375,\n y: 0.234375,\n },\n {\n x: 0.359375,\n y: 0.234375,\n },\n {\n x: 0.390625,\n y: 0.234375,\n },\n {\n x: 0.390625,\n y: 0.234375,\n },\n {\n x: 0.421875,\n y: 0.234375,\n },\n {\n x: 0.421875,\n y: 0.234375,\n },\n {\n x: 0.453125,\n y: 0.234375,\n },\n {\n x: 0.453125,\n y: 0.234375,\n },\n {\n x: 0.484375,\n y: 0.234375,\n },\n {\n x: 0.484375,\n y: 0.234375,\n },\n {\n x: 0.515625,\n y: 0.234375,\n },\n {\n x: 0.515625,\n y: 0.234375,\n },\n {\n x: 0.546875,\n y: 0.234375,\n },\n {\n x: 0.546875,\n y: 0.234375,\n },\n {\n x: 0.578125,\n y: 0.234375,\n },\n {\n x: 0.578125,\n y: 0.234375,\n },\n {\n x: 0.609375,\n y: 0.234375,\n },\n {\n x: 0.609375,\n y: 0.234375,\n },\n {\n x: 0.640625,\n y: 0.234375,\n },\n {\n x: 0.640625,\n y: 0.234375,\n },\n {\n x: 0.671875,\n y: 0.234375,\n },\n {\n x: 0.671875,\n y: 0.234375,\n },\n {\n x: 0.703125,\n y: 0.234375,\n },\n {\n x: 0.703125,\n y: 0.234375,\n },\n {\n x: 0.734375,\n y: 0.234375,\n },\n {\n x: 0.734375,\n y: 0.234375,\n },\n {\n x: 0.765625,\n y: 0.234375,\n },\n {\n x: 0.765625,\n y: 0.234375,\n },\n {\n x: 0.796875,\n y: 0.234375,\n },\n {\n x: 0.796875,\n y: 0.234375,\n },\n {\n x: 0.828125,\n y: 0.234375,\n },\n {\n x: 0.828125,\n y: 0.234375,\n },\n {\n x: 0.859375,\n y: 0.234375,\n },\n {\n x: 0.859375,\n y: 0.234375,\n },\n {\n x: 0.890625,\n y: 0.234375,\n },\n {\n x: 0.890625,\n y: 0.234375,\n },\n {\n x: 0.921875,\n y: 0.234375,\n },\n {\n x: 0.921875,\n y: 0.234375,\n },\n {\n x: 0.953125,\n y: 0.234375,\n },\n {\n x: 0.953125,\n y: 0.234375,\n },\n {\n x: 0.984375,\n y: 0.234375,\n },\n {\n x: 0.984375,\n y: 0.234375,\n },\n {\n x: 0.015625,\n y: 0.265625,\n },\n {\n x: 0.015625,\n y: 0.265625,\n },\n {\n x: 0.046875,\n y: 0.265625,\n },\n {\n x: 0.046875,\n y: 0.265625,\n },\n {\n x: 0.078125,\n y: 0.265625,\n },\n {\n x: 0.078125,\n y: 0.265625,\n },\n {\n x: 0.109375,\n y: 0.265625,\n },\n {\n x: 0.109375,\n y: 0.265625,\n },\n {\n x: 0.140625,\n y: 0.265625,\n },\n {\n x: 0.140625,\n y: 0.265625,\n },\n {\n x: 0.171875,\n y: 0.265625,\n },\n {\n x: 0.171875,\n y: 0.265625,\n },\n {\n x: 0.203125,\n y: 0.265625,\n },\n {\n x: 0.203125,\n y: 0.265625,\n },\n {\n x: 0.234375,\n y: 0.265625,\n },\n {\n x: 0.234375,\n y: 0.265625,\n },\n {\n x: 0.265625,\n y: 0.265625,\n },\n {\n x: 0.265625,\n y: 0.265625,\n },\n {\n x: 0.296875,\n y: 0.265625,\n },\n {\n x: 0.296875,\n y: 0.265625,\n },\n {\n x: 0.328125,\n y: 0.265625,\n },\n {\n x: 0.328125,\n y: 0.265625,\n },\n {\n x: 0.359375,\n y: 0.265625,\n },\n {\n x: 0.359375,\n y: 0.265625,\n },\n {\n x: 0.390625,\n y: 0.265625,\n },\n {\n x: 0.390625,\n y: 0.265625,\n },\n {\n x: 0.421875,\n y: 0.265625,\n },\n {\n x: 0.421875,\n y: 0.265625,\n },\n {\n x: 0.453125,\n y: 0.265625,\n },\n {\n x: 0.453125,\n y: 0.265625,\n },\n {\n x: 0.484375,\n y: 0.265625,\n },\n {\n x: 0.484375,\n y: 0.265625,\n },\n {\n x: 0.515625,\n y: 0.265625,\n },\n {\n x: 0.515625,\n y: 0.265625,\n },\n {\n x: 0.546875,\n y: 0.265625,\n },\n {\n x: 0.546875,\n y: 0.265625,\n },\n {\n x: 0.578125,\n y: 0.265625,\n },\n {\n x: 0.578125,\n y: 0.265625,\n },\n {\n x: 0.609375,\n y: 0.265625,\n },\n {\n x: 0.609375,\n y: 0.265625,\n },\n {\n x: 0.640625,\n y: 0.265625,\n },\n {\n x: 0.640625,\n y: 0.265625,\n },\n {\n x: 0.671875,\n y: 0.265625,\n },\n {\n x: 0.671875,\n y: 0.265625,\n },\n {\n x: 0.703125,\n y: 0.265625,\n },\n {\n x: 0.703125,\n y: 0.265625,\n },\n {\n x: 0.734375,\n y: 0.265625,\n },\n {\n x: 0.734375,\n y: 0.265625,\n },\n {\n x: 0.765625,\n y: 0.265625,\n },\n {\n x: 0.765625,\n y: 0.265625,\n },\n {\n x: 0.796875,\n y: 0.265625,\n },\n {\n x: 0.796875,\n y: 0.265625,\n },\n {\n x: 0.828125,\n y: 0.265625,\n },\n {\n x: 0.828125,\n y: 0.265625,\n },\n {\n x: 0.859375,\n y: 0.265625,\n },\n {\n x: 0.859375,\n y: 0.265625,\n },\n {\n x: 0.890625,\n y: 0.265625,\n },\n {\n x: 0.890625,\n y: 0.265625,\n },\n {\n x: 0.921875,\n y: 0.265625,\n },\n {\n x: 0.921875,\n y: 0.265625,\n },\n {\n x: 0.953125,\n y: 0.265625,\n },\n {\n x: 0.953125,\n y: 0.265625,\n },\n {\n x: 0.984375,\n y: 0.265625,\n },\n {\n x: 0.984375,\n y: 0.265625,\n },\n {\n x: 0.015625,\n y: 0.296875,\n },\n {\n x: 0.015625,\n y: 0.296875,\n },\n {\n x: 0.046875,\n y: 0.296875,\n },\n {\n x: 0.046875,\n y: 0.296875,\n },\n {\n x: 0.078125,\n y: 0.296875,\n },\n {\n x: 0.078125,\n y: 0.296875,\n },\n {\n x: 0.109375,\n y: 0.296875,\n },\n {\n x: 0.109375,\n y: 0.296875,\n },\n {\n x: 0.140625,\n y: 0.296875,\n },\n {\n x: 0.140625,\n y: 0.296875,\n },\n {\n x: 0.171875,\n y: 0.296875,\n },\n {\n x: 0.171875,\n y: 0.296875,\n },\n {\n x: 0.203125,\n y: 0.296875,\n },\n {\n x: 0.203125,\n y: 0.296875,\n },\n {\n x: 0.234375,\n y: 0.296875,\n },\n {\n x: 0.234375,\n y: 0.296875,\n },\n {\n x: 0.265625,\n y: 0.296875,\n },\n {\n x: 0.265625,\n y: 0.296875,\n },\n {\n x: 0.296875,\n y: 0.296875,\n },\n {\n x: 0.296875,\n y: 0.296875,\n },\n {\n x: 0.328125,\n y: 0.296875,\n },\n {\n x: 0.328125,\n y: 0.296875,\n },\n {\n x: 0.359375,\n y: 0.296875,\n },\n {\n x: 0.359375,\n y: 0.296875,\n },\n {\n x: 0.390625,\n y: 0.296875,\n },\n {\n x: 0.390625,\n y: 0.296875,\n },\n {\n x: 0.421875,\n y: 0.296875,\n },\n {\n x: 0.421875,\n y: 0.296875,\n },\n {\n x: 0.453125,\n y: 0.296875,\n },\n {\n x: 0.453125,\n y: 0.296875,\n },\n {\n x: 0.484375,\n y: 0.296875,\n },\n {\n x: 0.484375,\n y: 0.296875,\n },\n {\n x: 0.515625,\n y: 0.296875,\n },\n {\n x: 0.515625,\n y: 0.296875,\n },\n {\n x: 0.546875,\n y: 0.296875,\n },\n {\n x: 0.546875,\n y: 0.296875,\n },\n {\n x: 0.578125,\n y: 0.296875,\n },\n {\n x: 0.578125,\n y: 0.296875,\n },\n {\n x: 0.609375,\n y: 0.296875,\n },\n {\n x: 0.609375,\n y: 0.296875,\n },\n {\n x: 0.640625,\n y: 0.296875,\n },\n {\n x: 0.640625,\n y: 0.296875,\n },\n {\n x: 0.671875,\n y: 0.296875,\n },\n {\n x: 0.671875,\n y: 0.296875,\n },\n {\n x: 0.703125,\n y: 0.296875,\n },\n {\n x: 0.703125,\n y: 0.296875,\n },\n {\n x: 0.734375,\n y: 0.296875,\n },\n {\n x: 0.734375,\n y: 0.296875,\n },\n {\n x: 0.765625,\n y: 0.296875,\n },\n {\n x: 0.765625,\n y: 0.296875,\n },\n {\n x: 0.796875,\n y: 0.296875,\n },\n {\n x: 0.796875,\n y: 0.296875,\n },\n {\n x: 0.828125,\n y: 0.296875,\n },\n {\n x: 0.828125,\n y: 0.296875,\n },\n {\n x: 0.859375,\n y: 0.296875,\n },\n {\n x: 0.859375,\n y: 0.296875,\n },\n {\n x: 0.890625,\n y: 0.296875,\n },\n {\n x: 0.890625,\n y: 0.296875,\n },\n {\n x: 0.921875,\n y: 0.296875,\n },\n {\n x: 0.921875,\n y: 0.296875,\n },\n {\n x: 0.953125,\n y: 0.296875,\n },\n {\n x: 0.953125,\n y: 0.296875,\n },\n {\n x: 0.984375,\n y: 0.296875,\n },\n {\n x: 0.984375,\n y: 0.296875,\n },\n {\n x: 0.015625,\n y: 0.328125,\n },\n {\n x: 0.015625,\n y: 0.328125,\n },\n {\n x: 0.046875,\n y: 0.328125,\n },\n {\n x: 0.046875,\n y: 0.328125,\n },\n {\n x: 0.078125,\n y: 0.328125,\n },\n {\n x: 0.078125,\n y: 0.328125,\n },\n {\n x: 0.109375,\n y: 0.328125,\n },\n {\n x: 0.109375,\n y: 0.328125,\n },\n {\n x: 0.140625,\n y: 0.328125,\n },\n {\n x: 0.140625,\n y: 0.328125,\n },\n {\n x: 0.171875,\n y: 0.328125,\n },\n {\n x: 0.171875,\n y: 0.328125,\n },\n {\n x: 0.203125,\n y: 0.328125,\n },\n {\n x: 0.203125,\n y: 0.328125,\n },\n {\n x: 0.234375,\n y: 0.328125,\n },\n {\n x: 0.234375,\n y: 0.328125,\n },\n {\n x: 0.265625,\n y: 0.328125,\n },\n {\n x: 0.265625,\n y: 0.328125,\n },\n {\n x: 0.296875,\n y: 0.328125,\n },\n {\n x: 0.296875,\n y: 0.328125,\n },\n {\n x: 0.328125,\n y: 0.328125,\n },\n {\n x: 0.328125,\n y: 0.328125,\n },\n {\n x: 0.359375,\n y: 0.328125,\n },\n {\n x: 0.359375,\n y: 0.328125,\n },\n {\n x: 0.390625,\n y: 0.328125,\n },\n {\n x: 0.390625,\n y: 0.328125,\n },\n {\n x: 0.421875,\n y: 0.328125,\n },\n {\n x: 0.421875,\n y: 0.328125,\n },\n {\n x: 0.453125,\n y: 0.328125,\n },\n {\n x: 0.453125,\n y: 0.328125,\n },\n {\n x: 0.484375,\n y: 0.328125,\n },\n {\n x: 0.484375,\n y: 0.328125,\n },\n {\n x: 0.515625,\n y: 0.328125,\n },\n {\n x: 0.515625,\n y: 0.328125,\n },\n {\n x: 0.546875,\n y: 0.328125,\n },\n {\n x: 0.546875,\n y: 0.328125,\n },\n {\n x: 0.578125,\n y: 0.328125,\n },\n {\n x: 0.578125,\n y: 0.328125,\n },\n {\n x: 0.609375,\n y: 0.328125,\n },\n {\n x: 0.609375,\n y: 0.328125,\n },\n {\n x: 0.640625,\n y: 0.328125,\n },\n {\n x: 0.640625,\n y: 0.328125,\n },\n {\n x: 0.671875,\n y: 0.328125,\n },\n {\n x: 0.671875,\n y: 0.328125,\n },\n {\n x: 0.703125,\n y: 0.328125,\n },\n {\n x: 0.703125,\n y: 0.328125,\n },\n {\n x: 0.734375,\n y: 0.328125,\n },\n {\n x: 0.734375,\n y: 0.328125,\n },\n {\n x: 0.765625,\n y: 0.328125,\n },\n {\n x: 0.765625,\n y: 0.328125,\n },\n {\n x: 0.796875,\n y: 0.328125,\n },\n {\n x: 0.796875,\n y: 0.328125,\n },\n {\n x: 0.828125,\n y: 0.328125,\n },\n {\n x: 0.828125,\n y: 0.328125,\n },\n {\n x: 0.859375,\n y: 0.328125,\n },\n {\n x: 0.859375,\n y: 0.328125,\n },\n {\n x: 0.890625,\n y: 0.328125,\n },\n {\n x: 0.890625,\n y: 0.328125,\n },\n {\n x: 0.921875,\n y: 0.328125,\n },\n {\n x: 0.921875,\n y: 0.328125,\n },\n {\n x: 0.953125,\n y: 0.328125,\n },\n {\n x: 0.953125,\n y: 0.328125,\n },\n {\n x: 0.984375,\n y: 0.328125,\n },\n {\n x: 0.984375,\n y: 0.328125,\n },\n {\n x: 0.015625,\n y: 0.359375,\n },\n {\n x: 0.015625,\n y: 0.359375,\n },\n {\n x: 0.046875,\n y: 0.359375,\n },\n {\n x: 0.046875,\n y: 0.359375,\n },\n {\n x: 0.078125,\n y: 0.359375,\n },\n {\n x: 0.078125,\n y: 0.359375,\n },\n {\n x: 0.109375,\n y: 0.359375,\n },\n {\n x: 0.109375,\n y: 0.359375,\n },\n {\n x: 0.140625,\n y: 0.359375,\n },\n {\n x: 0.140625,\n y: 0.359375,\n },\n {\n x: 0.171875,\n y: 0.359375,\n },\n {\n x: 0.171875,\n y: 0.359375,\n },\n {\n x: 0.203125,\n y: 0.359375,\n },\n {\n x: 0.203125,\n y: 0.359375,\n },\n {\n x: 0.234375,\n y: 0.359375,\n },\n {\n x: 0.234375,\n y: 0.359375,\n },\n {\n x: 0.265625,\n y: 0.359375,\n },\n {\n x: 0.265625,\n y: 0.359375,\n },\n {\n x: 0.296875,\n y: 0.359375,\n },\n {\n x: 0.296875,\n y: 0.359375,\n },\n {\n x: 0.328125,\n y: 0.359375,\n },\n {\n x: 0.328125,\n y: 0.359375,\n },\n {\n x: 0.359375,\n y: 0.359375,\n },\n {\n x: 0.359375,\n y: 0.359375,\n },\n {\n x: 0.390625,\n y: 0.359375,\n },\n {\n x: 0.390625,\n y: 0.359375,\n },\n {\n x: 0.421875,\n y: 0.359375,\n },\n {\n x: 0.421875,\n y: 0.359375,\n },\n {\n x: 0.453125,\n y: 0.359375,\n },\n {\n x: 0.453125,\n y: 0.359375,\n },\n {\n x: 0.484375,\n y: 0.359375,\n },\n {\n x: 0.484375,\n y: 0.359375,\n },\n {\n x: 0.515625,\n y: 0.359375,\n },\n {\n x: 0.515625,\n y: 0.359375,\n },\n {\n x: 0.546875,\n y: 0.359375,\n },\n {\n x: 0.546875,\n y: 0.359375,\n },\n {\n x: 0.578125,\n y: 0.359375,\n },\n {\n x: 0.578125,\n y: 0.359375,\n },\n {\n x: 0.609375,\n y: 0.359375,\n },\n {\n x: 0.609375,\n y: 0.359375,\n },\n {\n x: 0.640625,\n y: 0.359375,\n },\n {\n x: 0.640625,\n y: 0.359375,\n },\n {\n x: 0.671875,\n y: 0.359375,\n },\n {\n x: 0.671875,\n y: 0.359375,\n },\n {\n x: 0.703125,\n y: 0.359375,\n },\n {\n x: 0.703125,\n y: 0.359375,\n },\n {\n x: 0.734375,\n y: 0.359375,\n },\n {\n x: 0.734375,\n y: 0.359375,\n },\n {\n x: 0.765625,\n y: 0.359375,\n },\n {\n x: 0.765625,\n y: 0.359375,\n },\n {\n x: 0.796875,\n y: 0.359375,\n },\n {\n x: 0.796875,\n y: 0.359375,\n },\n {\n x: 0.828125,\n y: 0.359375,\n },\n {\n x: 0.828125,\n y: 0.359375,\n },\n {\n x: 0.859375,\n y: 0.359375,\n },\n {\n x: 0.859375,\n y: 0.359375,\n },\n {\n x: 0.890625,\n y: 0.359375,\n },\n {\n x: 0.890625,\n y: 0.359375,\n },\n {\n x: 0.921875,\n y: 0.359375,\n },\n {\n x: 0.921875,\n y: 0.359375,\n },\n {\n x: 0.953125,\n y: 0.359375,\n },\n {\n x: 0.953125,\n y: 0.359375,\n },\n {\n x: 0.984375,\n y: 0.359375,\n },\n {\n x: 0.984375,\n y: 0.359375,\n },\n {\n x: 0.015625,\n y: 0.390625,\n },\n {\n x: 0.015625,\n y: 0.390625,\n },\n {\n x: 0.046875,\n y: 0.390625,\n },\n {\n x: 0.046875,\n y: 0.390625,\n },\n {\n x: 0.078125,\n y: 0.390625,\n },\n {\n x: 0.078125,\n y: 0.390625,\n },\n {\n x: 0.109375,\n y: 0.390625,\n },\n {\n x: 0.109375,\n y: 0.390625,\n },\n {\n x: 0.140625,\n y: 0.390625,\n },\n {\n x: 0.140625,\n y: 0.390625,\n },\n {\n x: 0.171875,\n y: 0.390625,\n },\n {\n x: 0.171875,\n y: 0.390625,\n },\n {\n x: 0.203125,\n y: 0.390625,\n },\n {\n x: 0.203125,\n y: 0.390625,\n },\n {\n x: 0.234375,\n y: 0.390625,\n },\n {\n x: 0.234375,\n y: 0.390625,\n },\n {\n x: 0.265625,\n y: 0.390625,\n },\n {\n x: 0.265625,\n y: 0.390625,\n },\n {\n x: 0.296875,\n y: 0.390625,\n },\n {\n x: 0.296875,\n y: 0.390625,\n },\n {\n x: 0.328125,\n y: 0.390625,\n },\n {\n x: 0.328125,\n y: 0.390625,\n },\n {\n x: 0.359375,\n y: 0.390625,\n },\n {\n x: 0.359375,\n y: 0.390625,\n },\n {\n x: 0.390625,\n y: 0.390625,\n },\n {\n x: 0.390625,\n y: 0.390625,\n },\n {\n x: 0.421875,\n y: 0.390625,\n },\n {\n x: 0.421875,\n y: 0.390625,\n },\n {\n x: 0.453125,\n y: 0.390625,\n },\n {\n x: 0.453125,\n y: 0.390625,\n },\n {\n x: 0.484375,\n y: 0.390625,\n },\n {\n x: 0.484375,\n y: 0.390625,\n },\n {\n x: 0.515625,\n y: 0.390625,\n },\n {\n x: 0.515625,\n y: 0.390625,\n },\n {\n x: 0.546875,\n y: 0.390625,\n },\n {\n x: 0.546875,\n y: 0.390625,\n },\n {\n x: 0.578125,\n y: 0.390625,\n },\n {\n x: 0.578125,\n y: 0.390625,\n },\n {\n x: 0.609375,\n y: 0.390625,\n },\n {\n x: 0.609375,\n y: 0.390625,\n },\n {\n x: 0.640625,\n y: 0.390625,\n },\n {\n x: 0.640625,\n y: 0.390625,\n },\n {\n x: 0.671875,\n y: 0.390625,\n },\n {\n x: 0.671875,\n y: 0.390625,\n },\n {\n x: 0.703125,\n y: 0.390625,\n },\n {\n x: 0.703125,\n y: 0.390625,\n },\n {\n x: 0.734375,\n y: 0.390625,\n },\n {\n x: 0.734375,\n y: 0.390625,\n },\n {\n x: 0.765625,\n y: 0.390625,\n },\n {\n x: 0.765625,\n y: 0.390625,\n },\n {\n x: 0.796875,\n y: 0.390625,\n },\n {\n x: 0.796875,\n y: 0.390625,\n },\n {\n x: 0.828125,\n y: 0.390625,\n },\n {\n x: 0.828125,\n y: 0.390625,\n },\n {\n x: 0.859375,\n y: 0.390625,\n },\n {\n x: 0.859375,\n y: 0.390625,\n },\n {\n x: 0.890625,\n y: 0.390625,\n },\n {\n x: 0.890625,\n y: 0.390625,\n },\n {\n x: 0.921875,\n y: 0.390625,\n },\n {\n x: 0.921875,\n y: 0.390625,\n },\n {\n x: 0.953125,\n y: 0.390625,\n },\n {\n x: 0.953125,\n y: 0.390625,\n },\n {\n x: 0.984375,\n y: 0.390625,\n },\n {\n x: 0.984375,\n y: 0.390625,\n },\n {\n x: 0.015625,\n y: 0.421875,\n },\n {\n x: 0.015625,\n y: 0.421875,\n },\n {\n x: 0.046875,\n y: 0.421875,\n },\n {\n x: 0.046875,\n y: 0.421875,\n },\n {\n x: 0.078125,\n y: 0.421875,\n },\n {\n x: 0.078125,\n y: 0.421875,\n },\n {\n x: 0.109375,\n y: 0.421875,\n },\n {\n x: 0.109375,\n y: 0.421875,\n },\n {\n x: 0.140625,\n y: 0.421875,\n },\n {\n x: 0.140625,\n y: 0.421875,\n },\n {\n x: 0.171875,\n y: 0.421875,\n },\n {\n x: 0.171875,\n y: 0.421875,\n },\n {\n x: 0.203125,\n y: 0.421875,\n },\n {\n x: 0.203125,\n y: 0.421875,\n },\n {\n x: 0.234375,\n y: 0.421875,\n },\n {\n x: 0.234375,\n y: 0.421875,\n },\n {\n x: 0.265625,\n y: 0.421875,\n },\n {\n x: 0.265625,\n y: 0.421875,\n },\n {\n x: 0.296875,\n y: 0.421875,\n },\n {\n x: 0.296875,\n y: 0.421875,\n },\n {\n x: 0.328125,\n y: 0.421875,\n },\n {\n x: 0.328125,\n y: 0.421875,\n },\n {\n x: 0.359375,\n y: 0.421875,\n },\n {\n x: 0.359375,\n y: 0.421875,\n },\n {\n x: 0.390625,\n y: 0.421875,\n },\n {\n x: 0.390625,\n y: 0.421875,\n },\n {\n x: 0.421875,\n y: 0.421875,\n },\n {\n x: 0.421875,\n y: 0.421875,\n },\n {\n x: 0.453125,\n y: 0.421875,\n },\n {\n x: 0.453125,\n y: 0.421875,\n },\n {\n x: 0.484375,\n y: 0.421875,\n },\n {\n x: 0.484375,\n y: 0.421875,\n },\n {\n x: 0.515625,\n y: 0.421875,\n },\n {\n x: 0.515625,\n y: 0.421875,\n },\n {\n x: 0.546875,\n y: 0.421875,\n },\n {\n x: 0.546875,\n y: 0.421875,\n },\n {\n x: 0.578125,\n y: 0.421875,\n },\n {\n x: 0.578125,\n y: 0.421875,\n },\n {\n x: 0.609375,\n y: 0.421875,\n },\n {\n x: 0.609375,\n y: 0.421875,\n },\n {\n x: 0.640625,\n y: 0.421875,\n },\n {\n x: 0.640625,\n y: 0.421875,\n },\n {\n x: 0.671875,\n y: 0.421875,\n },\n {\n x: 0.671875,\n y: 0.421875,\n },\n {\n x: 0.703125,\n y: 0.421875,\n },\n {\n x: 0.703125,\n y: 0.421875,\n },\n {\n x: 0.734375,\n y: 0.421875,\n },\n {\n x: 0.734375,\n y: 0.421875,\n },\n {\n x: 0.765625,\n y: 0.421875,\n },\n {\n x: 0.765625,\n y: 0.421875,\n },\n {\n x: 0.796875,\n y: 0.421875,\n },\n {\n x: 0.796875,\n y: 0.421875,\n },\n {\n x: 0.828125,\n y: 0.421875,\n },\n {\n x: 0.828125,\n y: 0.421875,\n },\n {\n x: 0.859375,\n y: 0.421875,\n },\n {\n x: 0.859375,\n y: 0.421875,\n },\n {\n x: 0.890625,\n y: 0.421875,\n },\n {\n x: 0.890625,\n y: 0.421875,\n },\n {\n x: 0.921875,\n y: 0.421875,\n },\n {\n x: 0.921875,\n y: 0.421875,\n },\n {\n x: 0.953125,\n y: 0.421875,\n },\n {\n x: 0.953125,\n y: 0.421875,\n },\n {\n x: 0.984375,\n y: 0.421875,\n },\n {\n x: 0.984375,\n y: 0.421875,\n },\n {\n x: 0.015625,\n y: 0.453125,\n },\n {\n x: 0.015625,\n y: 0.453125,\n },\n {\n x: 0.046875,\n y: 0.453125,\n },\n {\n x: 0.046875,\n y: 0.453125,\n },\n {\n x: 0.078125,\n y: 0.453125,\n },\n {\n x: 0.078125,\n y: 0.453125,\n },\n {\n x: 0.109375,\n y: 0.453125,\n },\n {\n x: 0.109375,\n y: 0.453125,\n },\n {\n x: 0.140625,\n y: 0.453125,\n },\n {\n x: 0.140625,\n y: 0.453125,\n },\n {\n x: 0.171875,\n y: 0.453125,\n },\n {\n x: 0.171875,\n y: 0.453125,\n },\n {\n x: 0.203125,\n y: 0.453125,\n },\n {\n x: 0.203125,\n y: 0.453125,\n },\n {\n x: 0.234375,\n y: 0.453125,\n },\n {\n x: 0.234375,\n y: 0.453125,\n },\n {\n x: 0.265625,\n y: 0.453125,\n },\n {\n x: 0.265625,\n y: 0.453125,\n },\n {\n x: 0.296875,\n y: 0.453125,\n },\n {\n x: 0.296875,\n y: 0.453125,\n },\n {\n x: 0.328125,\n y: 0.453125,\n },\n {\n x: 0.328125,\n y: 0.453125,\n },\n {\n x: 0.359375,\n y: 0.453125,\n },\n {\n x: 0.359375,\n y: 0.453125,\n },\n {\n x: 0.390625,\n y: 0.453125,\n },\n {\n x: 0.390625,\n y: 0.453125,\n },\n {\n x: 0.421875,\n y: 0.453125,\n },\n {\n x: 0.421875,\n y: 0.453125,\n },\n {\n x: 0.453125,\n y: 0.453125,\n },\n {\n x: 0.453125,\n y: 0.453125,\n },\n {\n x: 0.484375,\n y: 0.453125,\n },\n {\n x: 0.484375,\n y: 0.453125,\n },\n {\n x: 0.515625,\n y: 0.453125,\n },\n {\n x: 0.515625,\n y: 0.453125,\n },\n {\n x: 0.546875,\n y: 0.453125,\n },\n {\n x: 0.546875,\n y: 0.453125,\n },\n {\n x: 0.578125,\n y: 0.453125,\n },\n {\n x: 0.578125,\n y: 0.453125,\n },\n {\n x: 0.609375,\n y: 0.453125,\n },\n {\n x: 0.609375,\n y: 0.453125,\n },\n {\n x: 0.640625,\n y: 0.453125,\n },\n {\n x: 0.640625,\n y: 0.453125,\n },\n {\n x: 0.671875,\n y: 0.453125,\n },\n {\n x: 0.671875,\n y: 0.453125,\n },\n {\n x: 0.703125,\n y: 0.453125,\n },\n {\n x: 0.703125,\n y: 0.453125,\n },\n {\n x: 0.734375,\n y: 0.453125,\n },\n {\n x: 0.734375,\n y: 0.453125,\n },\n {\n x: 0.765625,\n y: 0.453125,\n },\n {\n x: 0.765625,\n y: 0.453125,\n },\n {\n x: 0.796875,\n y: 0.453125,\n },\n {\n x: 0.796875,\n y: 0.453125,\n },\n {\n x: 0.828125,\n y: 0.453125,\n },\n {\n x: 0.828125,\n y: 0.453125,\n },\n {\n x: 0.859375,\n y: 0.453125,\n },\n {\n x: 0.859375,\n y: 0.453125,\n },\n {\n x: 0.890625,\n y: 0.453125,\n },\n {\n x: 0.890625,\n y: 0.453125,\n },\n {\n x: 0.921875,\n y: 0.453125,\n },\n {\n x: 0.921875,\n y: 0.453125,\n },\n {\n x: 0.953125,\n y: 0.453125,\n },\n {\n x: 0.953125,\n y: 0.453125,\n },\n {\n x: 0.984375,\n y: 0.453125,\n },\n {\n x: 0.984375,\n y: 0.453125,\n },\n {\n x: 0.015625,\n y: 0.484375,\n },\n {\n x: 0.015625,\n y: 0.484375,\n },\n {\n x: 0.046875,\n y: 0.484375,\n },\n {\n x: 0.046875,\n y: 0.484375,\n },\n {\n x: 0.078125,\n y: 0.484375,\n },\n {\n x: 0.078125,\n y: 0.484375,\n },\n {\n x: 0.109375,\n y: 0.484375,\n },\n {\n x: 0.109375,\n y: 0.484375,\n },\n {\n x: 0.140625,\n y: 0.484375,\n },\n {\n x: 0.140625,\n y: 0.484375,\n },\n {\n x: 0.171875,\n y: 0.484375,\n },\n {\n x: 0.171875,\n y: 0.484375,\n },\n {\n x: 0.203125,\n y: 0.484375,\n },\n {\n x: 0.203125,\n y: 0.484375,\n },\n {\n x: 0.234375,\n y: 0.484375,\n },\n {\n x: 0.234375,\n y: 0.484375,\n },\n {\n x: 0.265625,\n y: 0.484375,\n },\n {\n x: 0.265625,\n y: 0.484375,\n },\n {\n x: 0.296875,\n y: 0.484375,\n },\n {\n x: 0.296875,\n y: 0.484375,\n },\n {\n x: 0.328125,\n y: 0.484375,\n },\n {\n x: 0.328125,\n y: 0.484375,\n },\n {\n x: 0.359375,\n y: 0.484375,\n },\n {\n x: 0.359375,\n y: 0.484375,\n },\n {\n x: 0.390625,\n y: 0.484375,\n },\n {\n x: 0.390625,\n y: 0.484375,\n },\n {\n x: 0.421875,\n y: 0.484375,\n },\n {\n x: 0.421875,\n y: 0.484375,\n },\n {\n x: 0.453125,\n y: 0.484375,\n },\n {\n x: 0.453125,\n y: 0.484375,\n },\n {\n x: 0.484375,\n y: 0.484375,\n },\n {\n x: 0.484375,\n y: 0.484375,\n },\n {\n x: 0.515625,\n y: 0.484375,\n },\n {\n x: 0.515625,\n y: 0.484375,\n },\n {\n x: 0.546875,\n y: 0.484375,\n },\n {\n x: 0.546875,\n y: 0.484375,\n },\n {\n x: 0.578125,\n y: 0.484375,\n },\n {\n x: 0.578125,\n y: 0.484375,\n },\n {\n x: 0.609375,\n y: 0.484375,\n },\n {\n x: 0.609375,\n y: 0.484375,\n },\n {\n x: 0.640625,\n y: 0.484375,\n },\n {\n x: 0.640625,\n y: 0.484375,\n },\n {\n x: 0.671875,\n y: 0.484375,\n },\n {\n x: 0.671875,\n y: 0.484375,\n },\n {\n x: 0.703125,\n y: 0.484375,\n },\n {\n x: 0.703125,\n y: 0.484375,\n },\n {\n x: 0.734375,\n y: 0.484375,\n },\n {\n x: 0.734375,\n y: 0.484375,\n },\n {\n x: 0.765625,\n y: 0.484375,\n },\n {\n x: 0.765625,\n y: 0.484375,\n },\n {\n x: 0.796875,\n y: 0.484375,\n },\n {\n x: 0.796875,\n y: 0.484375,\n },\n {\n x: 0.828125,\n y: 0.484375,\n },\n {\n x: 0.828125,\n y: 0.484375,\n },\n {\n x: 0.859375,\n y: 0.484375,\n },\n {\n x: 0.859375,\n y: 0.484375,\n },\n {\n x: 0.890625,\n y: 0.484375,\n },\n {\n x: 0.890625,\n y: 0.484375,\n },\n {\n x: 0.921875,\n y: 0.484375,\n },\n {\n x: 0.921875,\n y: 0.484375,\n },\n {\n x: 0.953125,\n y: 0.484375,\n },\n {\n x: 0.953125,\n y: 0.484375,\n },\n {\n x: 0.984375,\n y: 0.484375,\n },\n {\n x: 0.984375,\n y: 0.484375,\n },\n {\n x: 0.015625,\n y: 0.515625,\n },\n {\n x: 0.015625,\n y: 0.515625,\n },\n {\n x: 0.046875,\n y: 0.515625,\n },\n {\n x: 0.046875,\n y: 0.515625,\n },\n {\n x: 0.078125,\n y: 0.515625,\n },\n {\n x: 0.078125,\n y: 0.515625,\n },\n {\n x: 0.109375,\n y: 0.515625,\n },\n {\n x: 0.109375,\n y: 0.515625,\n },\n {\n x: 0.140625,\n y: 0.515625,\n },\n {\n x: 0.140625,\n y: 0.515625,\n },\n {\n x: 0.171875,\n y: 0.515625,\n },\n {\n x: 0.171875,\n y: 0.515625,\n },\n {\n x: 0.203125,\n y: 0.515625,\n },\n {\n x: 0.203125,\n y: 0.515625,\n },\n {\n x: 0.234375,\n y: 0.515625,\n },\n {\n x: 0.234375,\n y: 0.515625,\n },\n {\n x: 0.265625,\n y: 0.515625,\n },\n {\n x: 0.265625,\n y: 0.515625,\n },\n {\n x: 0.296875,\n y: 0.515625,\n },\n {\n x: 0.296875,\n y: 0.515625,\n },\n {\n x: 0.328125,\n y: 0.515625,\n },\n {\n x: 0.328125,\n y: 0.515625,\n },\n {\n x: 0.359375,\n y: 0.515625,\n },\n {\n x: 0.359375,\n y: 0.515625,\n },\n {\n x: 0.390625,\n y: 0.515625,\n },\n {\n x: 0.390625,\n y: 0.515625,\n },\n {\n x: 0.421875,\n y: 0.515625,\n },\n {\n x: 0.421875,\n y: 0.515625,\n },\n {\n x: 0.453125,\n y: 0.515625,\n },\n {\n x: 0.453125,\n y: 0.515625,\n },\n {\n x: 0.484375,\n y: 0.515625,\n },\n {\n x: 0.484375,\n y: 0.515625,\n },\n {\n x: 0.515625,\n y: 0.515625,\n },\n {\n x: 0.515625,\n y: 0.515625,\n },\n {\n x: 0.546875,\n y: 0.515625,\n },\n {\n x: 0.546875,\n y: 0.515625,\n },\n {\n x: 0.578125,\n y: 0.515625,\n },\n {\n x: 0.578125,\n y: 0.515625,\n },\n {\n x: 0.609375,\n y: 0.515625,\n },\n {\n x: 0.609375,\n y: 0.515625,\n },\n {\n x: 0.640625,\n y: 0.515625,\n },\n {\n x: 0.640625,\n y: 0.515625,\n },\n {\n x: 0.671875,\n y: 0.515625,\n },\n {\n x: 0.671875,\n y: 0.515625,\n },\n {\n x: 0.703125,\n y: 0.515625,\n },\n {\n x: 0.703125,\n y: 0.515625,\n },\n {\n x: 0.734375,\n y: 0.515625,\n },\n {\n x: 0.734375,\n y: 0.515625,\n },\n {\n x: 0.765625,\n y: 0.515625,\n },\n {\n x: 0.765625,\n y: 0.515625,\n },\n {\n x: 0.796875,\n y: 0.515625,\n },\n {\n x: 0.796875,\n y: 0.515625,\n },\n {\n x: 0.828125,\n y: 0.515625,\n },\n {\n x: 0.828125,\n y: 0.515625,\n },\n {\n x: 0.859375,\n y: 0.515625,\n },\n {\n x: 0.859375,\n y: 0.515625,\n },\n {\n x: 0.890625,\n y: 0.515625,\n },\n {\n x: 0.890625,\n y: 0.515625,\n },\n {\n x: 0.921875,\n y: 0.515625,\n },\n {\n x: 0.921875,\n y: 0.515625,\n },\n {\n x: 0.953125,\n y: 0.515625,\n },\n {\n x: 0.953125,\n y: 0.515625,\n },\n {\n x: 0.984375,\n y: 0.515625,\n },\n {\n x: 0.984375,\n y: 0.515625,\n },\n {\n x: 0.015625,\n y: 0.546875,\n },\n {\n x: 0.015625,\n y: 0.546875,\n },\n {\n x: 0.046875,\n y: 0.546875,\n },\n {\n x: 0.046875,\n y: 0.546875,\n },\n {\n x: 0.078125,\n y: 0.546875,\n },\n {\n x: 0.078125,\n y: 0.546875,\n },\n {\n x: 0.109375,\n y: 0.546875,\n },\n {\n x: 0.109375,\n y: 0.546875,\n },\n {\n x: 0.140625,\n y: 0.546875,\n },\n {\n x: 0.140625,\n y: 0.546875,\n },\n {\n x: 0.171875,\n y: 0.546875,\n },\n {\n x: 0.171875,\n y: 0.546875,\n },\n {\n x: 0.203125,\n y: 0.546875,\n },\n {\n x: 0.203125,\n y: 0.546875,\n },\n {\n x: 0.234375,\n y: 0.546875,\n },\n {\n x: 0.234375,\n y: 0.546875,\n },\n {\n x: 0.265625,\n y: 0.546875,\n },\n {\n x: 0.265625,\n y: 0.546875,\n },\n {\n x: 0.296875,\n y: 0.546875,\n },\n {\n x: 0.296875,\n y: 0.546875,\n },\n {\n x: 0.328125,\n y: 0.546875,\n },\n {\n x: 0.328125,\n y: 0.546875,\n },\n {\n x: 0.359375,\n y: 0.546875,\n },\n {\n x: 0.359375,\n y: 0.546875,\n },\n {\n x: 0.390625,\n y: 0.546875,\n },\n {\n x: 0.390625,\n y: 0.546875,\n },\n {\n x: 0.421875,\n y: 0.546875,\n },\n {\n x: 0.421875,\n y: 0.546875,\n },\n {\n x: 0.453125,\n y: 0.546875,\n },\n {\n x: 0.453125,\n y: 0.546875,\n },\n {\n x: 0.484375,\n y: 0.546875,\n },\n {\n x: 0.484375,\n y: 0.546875,\n },\n {\n x: 0.515625,\n y: 0.546875,\n },\n {\n x: 0.515625,\n y: 0.546875,\n },\n {\n x: 0.546875,\n y: 0.546875,\n },\n {\n x: 0.546875,\n y: 0.546875,\n },\n {\n x: 0.578125,\n y: 0.546875,\n },\n {\n x: 0.578125,\n y: 0.546875,\n },\n {\n x: 0.609375,\n y: 0.546875,\n },\n {\n x: 0.609375,\n y: 0.546875,\n },\n {\n x: 0.640625,\n y: 0.546875,\n },\n {\n x: 0.640625,\n y: 0.546875,\n },\n {\n x: 0.671875,\n y: 0.546875,\n },\n {\n x: 0.671875,\n y: 0.546875,\n },\n {\n x: 0.703125,\n y: 0.546875,\n },\n {\n x: 0.703125,\n y: 0.546875,\n },\n {\n x: 0.734375,\n y: 0.546875,\n },\n {\n x: 0.734375,\n y: 0.546875,\n },\n {\n x: 0.765625,\n y: 0.546875,\n },\n {\n x: 0.765625,\n y: 0.546875,\n },\n {\n x: 0.796875,\n y: 0.546875,\n },\n {\n x: 0.796875,\n y: 0.546875,\n },\n {\n x: 0.828125,\n y: 0.546875,\n },\n {\n x: 0.828125,\n y: 0.546875,\n },\n {\n x: 0.859375,\n y: 0.546875,\n },\n {\n x: 0.859375,\n y: 0.546875,\n },\n {\n x: 0.890625,\n y: 0.546875,\n },\n {\n x: 0.890625,\n y: 0.546875,\n },\n {\n x: 0.921875,\n y: 0.546875,\n },\n {\n x: 0.921875,\n y: 0.546875,\n },\n {\n x: 0.953125,\n y: 0.546875,\n },\n {\n x: 0.953125,\n y: 0.546875,\n },\n {\n x: 0.984375,\n y: 0.546875,\n },\n {\n x: 0.984375,\n y: 0.546875,\n },\n {\n x: 0.015625,\n y: 0.578125,\n },\n {\n x: 0.015625,\n y: 0.578125,\n },\n {\n x: 0.046875,\n y: 0.578125,\n },\n {\n x: 0.046875,\n y: 0.578125,\n },\n {\n x: 0.078125,\n y: 0.578125,\n },\n {\n x: 0.078125,\n y: 0.578125,\n },\n {\n x: 0.109375,\n y: 0.578125,\n },\n {\n x: 0.109375,\n y: 0.578125,\n },\n {\n x: 0.140625,\n y: 0.578125,\n },\n {\n x: 0.140625,\n y: 0.578125,\n },\n {\n x: 0.171875,\n y: 0.578125,\n },\n {\n x: 0.171875,\n y: 0.578125,\n },\n {\n x: 0.203125,\n y: 0.578125,\n },\n {\n x: 0.203125,\n y: 0.578125,\n },\n {\n x: 0.234375,\n y: 0.578125,\n },\n {\n x: 0.234375,\n y: 0.578125,\n },\n {\n x: 0.265625,\n y: 0.578125,\n },\n {\n x: 0.265625,\n y: 0.578125,\n },\n {\n x: 0.296875,\n y: 0.578125,\n },\n {\n x: 0.296875,\n y: 0.578125,\n },\n {\n x: 0.328125,\n y: 0.578125,\n },\n {\n x: 0.328125,\n y: 0.578125,\n },\n {\n x: 0.359375,\n y: 0.578125,\n },\n {\n x: 0.359375,\n y: 0.578125,\n },\n {\n x: 0.390625,\n y: 0.578125,\n },\n {\n x: 0.390625,\n y: 0.578125,\n },\n {\n x: 0.421875,\n y: 0.578125,\n },\n {\n x: 0.421875,\n y: 0.578125,\n },\n {\n x: 0.453125,\n y: 0.578125,\n },\n {\n x: 0.453125,\n y: 0.578125,\n },\n {\n x: 0.484375,\n y: 0.578125,\n },\n {\n x: 0.484375,\n y: 0.578125,\n },\n {\n x: 0.515625,\n y: 0.578125,\n },\n {\n x: 0.515625,\n y: 0.578125,\n },\n {\n x: 0.546875,\n y: 0.578125,\n },\n {\n x: 0.546875,\n y: 0.578125,\n },\n {\n x: 0.578125,\n y: 0.578125,\n },\n {\n x: 0.578125,\n y: 0.578125,\n },\n {\n x: 0.609375,\n y: 0.578125,\n },\n {\n x: 0.609375,\n y: 0.578125,\n },\n {\n x: 0.640625,\n y: 0.578125,\n },\n {\n x: 0.640625,\n y: 0.578125,\n },\n {\n x: 0.671875,\n y: 0.578125,\n },\n {\n x: 0.671875,\n y: 0.578125,\n },\n {\n x: 0.703125,\n y: 0.578125,\n },\n {\n x: 0.703125,\n y: 0.578125,\n },\n {\n x: 0.734375,\n y: 0.578125,\n },\n {\n x: 0.734375,\n y: 0.578125,\n },\n {\n x: 0.765625,\n y: 0.578125,\n },\n {\n x: 0.765625,\n y: 0.578125,\n },\n {\n x: 0.796875,\n y: 0.578125,\n },\n {\n x: 0.796875,\n y: 0.578125,\n },\n {\n x: 0.828125,\n y: 0.578125,\n },\n {\n x: 0.828125,\n y: 0.578125,\n },\n {\n x: 0.859375,\n y: 0.578125,\n },\n {\n x: 0.859375,\n y: 0.578125,\n },\n {\n x: 0.890625,\n y: 0.578125,\n },\n {\n x: 0.890625,\n y: 0.578125,\n },\n {\n x: 0.921875,\n y: 0.578125,\n },\n {\n x: 0.921875,\n y: 0.578125,\n },\n {\n x: 0.953125,\n y: 0.578125,\n },\n {\n x: 0.953125,\n y: 0.578125,\n },\n {\n x: 0.984375,\n y: 0.578125,\n },\n {\n x: 0.984375,\n y: 0.578125,\n },\n {\n x: 0.015625,\n y: 0.609375,\n },\n {\n x: 0.015625,\n y: 0.609375,\n },\n {\n x: 0.046875,\n y: 0.609375,\n },\n {\n x: 0.046875,\n y: 0.609375,\n },\n {\n x: 0.078125,\n y: 0.609375,\n },\n {\n x: 0.078125,\n y: 0.609375,\n },\n {\n x: 0.109375,\n y: 0.609375,\n },\n {\n x: 0.109375,\n y: 0.609375,\n },\n {\n x: 0.140625,\n y: 0.609375,\n },\n {\n x: 0.140625,\n y: 0.609375,\n },\n {\n x: 0.171875,\n y: 0.609375,\n },\n {\n x: 0.171875,\n y: 0.609375,\n },\n {\n x: 0.203125,\n y: 0.609375,\n },\n {\n x: 0.203125,\n y: 0.609375,\n },\n {\n x: 0.234375,\n y: 0.609375,\n },\n {\n x: 0.234375,\n y: 0.609375,\n },\n {\n x: 0.265625,\n y: 0.609375,\n },\n {\n x: 0.265625,\n y: 0.609375,\n },\n {\n x: 0.296875,\n y: 0.609375,\n },\n {\n x: 0.296875,\n y: 0.609375,\n },\n {\n x: 0.328125,\n y: 0.609375,\n },\n {\n x: 0.328125,\n y: 0.609375,\n },\n {\n x: 0.359375,\n y: 0.609375,\n },\n {\n x: 0.359375,\n y: 0.609375,\n },\n {\n x: 0.390625,\n y: 0.609375,\n },\n {\n x: 0.390625,\n y: 0.609375,\n },\n {\n x: 0.421875,\n y: 0.609375,\n },\n {\n x: 0.421875,\n y: 0.609375,\n },\n {\n x: 0.453125,\n y: 0.609375,\n },\n {\n x: 0.453125,\n y: 0.609375,\n },\n {\n x: 0.484375,\n y: 0.609375,\n },\n {\n x: 0.484375,\n y: 0.609375,\n },\n {\n x: 0.515625,\n y: 0.609375,\n },\n {\n x: 0.515625,\n y: 0.609375,\n },\n {\n x: 0.546875,\n y: 0.609375,\n },\n {\n x: 0.546875,\n y: 0.609375,\n },\n {\n x: 0.578125,\n y: 0.609375,\n },\n {\n x: 0.578125,\n y: 0.609375,\n },\n {\n x: 0.609375,\n y: 0.609375,\n },\n {\n x: 0.609375,\n y: 0.609375,\n },\n {\n x: 0.640625,\n y: 0.609375,\n },\n {\n x: 0.640625,\n y: 0.609375,\n },\n {\n x: 0.671875,\n y: 0.609375,\n },\n {\n x: 0.671875,\n y: 0.609375,\n },\n {\n x: 0.703125,\n y: 0.609375,\n },\n {\n x: 0.703125,\n y: 0.609375,\n },\n {\n x: 0.734375,\n y: 0.609375,\n },\n {\n x: 0.734375,\n y: 0.609375,\n },\n {\n x: 0.765625,\n y: 0.609375,\n },\n {\n x: 0.765625,\n y: 0.609375,\n },\n {\n x: 0.796875,\n y: 0.609375,\n },\n {\n x: 0.796875,\n y: 0.609375,\n },\n {\n x: 0.828125,\n y: 0.609375,\n },\n {\n x: 0.828125,\n y: 0.609375,\n },\n {\n x: 0.859375,\n y: 0.609375,\n },\n {\n x: 0.859375,\n y: 0.609375,\n },\n {\n x: 0.890625,\n y: 0.609375,\n },\n {\n x: 0.890625,\n y: 0.609375,\n },\n {\n x: 0.921875,\n y: 0.609375,\n },\n {\n x: 0.921875,\n y: 0.609375,\n },\n {\n x: 0.953125,\n y: 0.609375,\n },\n {\n x: 0.953125,\n y: 0.609375,\n },\n {\n x: 0.984375,\n y: 0.609375,\n },\n {\n x: 0.984375,\n y: 0.609375,\n },\n {\n x: 0.015625,\n y: 0.640625,\n },\n {\n x: 0.015625,\n y: 0.640625,\n },\n {\n x: 0.046875,\n y: 0.640625,\n },\n {\n x: 0.046875,\n y: 0.640625,\n },\n {\n x: 0.078125,\n y: 0.640625,\n },\n {\n x: 0.078125,\n y: 0.640625,\n },\n {\n x: 0.109375,\n y: 0.640625,\n },\n {\n x: 0.109375,\n y: 0.640625,\n },\n {\n x: 0.140625,\n y: 0.640625,\n },\n {\n x: 0.140625,\n y: 0.640625,\n },\n {\n x: 0.171875,\n y: 0.640625,\n },\n {\n x: 0.171875,\n y: 0.640625,\n },\n {\n x: 0.203125,\n y: 0.640625,\n },\n {\n x: 0.203125,\n y: 0.640625,\n },\n {\n x: 0.234375,\n y: 0.640625,\n },\n {\n x: 0.234375,\n y: 0.640625,\n },\n {\n x: 0.265625,\n y: 0.640625,\n },\n {\n x: 0.265625,\n y: 0.640625,\n },\n {\n x: 0.296875,\n y: 0.640625,\n },\n {\n x: 0.296875,\n y: 0.640625,\n },\n {\n x: 0.328125,\n y: 0.640625,\n },\n {\n x: 0.328125,\n y: 0.640625,\n },\n {\n x: 0.359375,\n y: 0.640625,\n },\n {\n x: 0.359375,\n y: 0.640625,\n },\n {\n x: 0.390625,\n y: 0.640625,\n },\n {\n x: 0.390625,\n y: 0.640625,\n },\n {\n x: 0.421875,\n y: 0.640625,\n },\n {\n x: 0.421875,\n y: 0.640625,\n },\n {\n x: 0.453125,\n y: 0.640625,\n },\n {\n x: 0.453125,\n y: 0.640625,\n },\n {\n x: 0.484375,\n y: 0.640625,\n },\n {\n x: 0.484375,\n y: 0.640625,\n },\n {\n x: 0.515625,\n y: 0.640625,\n },\n {\n x: 0.515625,\n y: 0.640625,\n },\n {\n x: 0.546875,\n y: 0.640625,\n },\n {\n x: 0.546875,\n y: 0.640625,\n },\n {\n x: 0.578125,\n y: 0.640625,\n },\n {\n x: 0.578125,\n y: 0.640625,\n },\n {\n x: 0.609375,\n y: 0.640625,\n },\n {\n x: 0.609375,\n y: 0.640625,\n },\n {\n x: 0.640625,\n y: 0.640625,\n },\n {\n x: 0.640625,\n y: 0.640625,\n },\n {\n x: 0.671875,\n y: 0.640625,\n },\n {\n x: 0.671875,\n y: 0.640625,\n },\n {\n x: 0.703125,\n y: 0.640625,\n },\n {\n x: 0.703125,\n y: 0.640625,\n },\n {\n x: 0.734375,\n y: 0.640625,\n },\n {\n x: 0.734375,\n y: 0.640625,\n },\n {\n x: 0.765625,\n y: 0.640625,\n },\n {\n x: 0.765625,\n y: 0.640625,\n },\n {\n x: 0.796875,\n y: 0.640625,\n },\n {\n x: 0.796875,\n y: 0.640625,\n },\n {\n x: 0.828125,\n y: 0.640625,\n },\n {\n x: 0.828125,\n y: 0.640625,\n },\n {\n x: 0.859375,\n y: 0.640625,\n },\n {\n x: 0.859375,\n y: 0.640625,\n },\n {\n x: 0.890625,\n y: 0.640625,\n },\n {\n x: 0.890625,\n y: 0.640625,\n },\n {\n x: 0.921875,\n y: 0.640625,\n },\n {\n x: 0.921875,\n y: 0.640625,\n },\n {\n x: 0.953125,\n y: 0.640625,\n },\n {\n x: 0.953125,\n y: 0.640625,\n },\n {\n x: 0.984375,\n y: 0.640625,\n },\n {\n x: 0.984375,\n y: 0.640625,\n },\n {\n x: 0.015625,\n y: 0.671875,\n },\n {\n x: 0.015625,\n y: 0.671875,\n },\n {\n x: 0.046875,\n y: 0.671875,\n },\n {\n x: 0.046875,\n y: 0.671875,\n },\n {\n x: 0.078125,\n y: 0.671875,\n },\n {\n x: 0.078125,\n y: 0.671875,\n },\n {\n x: 0.109375,\n y: 0.671875,\n },\n {\n x: 0.109375,\n y: 0.671875,\n },\n {\n x: 0.140625,\n y: 0.671875,\n },\n {\n x: 0.140625,\n y: 0.671875,\n },\n {\n x: 0.171875,\n y: 0.671875,\n },\n {\n x: 0.171875,\n y: 0.671875,\n },\n {\n x: 0.203125,\n y: 0.671875,\n },\n {\n x: 0.203125,\n y: 0.671875,\n },\n {\n x: 0.234375,\n y: 0.671875,\n },\n {\n x: 0.234375,\n y: 0.671875,\n },\n {\n x: 0.265625,\n y: 0.671875,\n },\n {\n x: 0.265625,\n y: 0.671875,\n },\n {\n x: 0.296875,\n y: 0.671875,\n },\n {\n x: 0.296875,\n y: 0.671875,\n },\n {\n x: 0.328125,\n y: 0.671875,\n },\n {\n x: 0.328125,\n y: 0.671875,\n },\n {\n x: 0.359375,\n y: 0.671875,\n },\n {\n x: 0.359375,\n y: 0.671875,\n },\n {\n x: 0.390625,\n y: 0.671875,\n },\n {\n x: 0.390625,\n y: 0.671875,\n },\n {\n x: 0.421875,\n y: 0.671875,\n },\n {\n x: 0.421875,\n y: 0.671875,\n },\n {\n x: 0.453125,\n y: 0.671875,\n },\n {\n x: 0.453125,\n y: 0.671875,\n },\n {\n x: 0.484375,\n y: 0.671875,\n },\n {\n x: 0.484375,\n y: 0.671875,\n },\n {\n x: 0.515625,\n y: 0.671875,\n },\n {\n x: 0.515625,\n y: 0.671875,\n },\n {\n x: 0.546875,\n y: 0.671875,\n },\n {\n x: 0.546875,\n y: 0.671875,\n },\n {\n x: 0.578125,\n y: 0.671875,\n },\n {\n x: 0.578125,\n y: 0.671875,\n },\n {\n x: 0.609375,\n y: 0.671875,\n },\n {\n x: 0.609375,\n y: 0.671875,\n },\n {\n x: 0.640625,\n y: 0.671875,\n },\n {\n x: 0.640625,\n y: 0.671875,\n },\n {\n x: 0.671875,\n y: 0.671875,\n },\n {\n x: 0.671875,\n y: 0.671875,\n },\n {\n x: 0.703125,\n y: 0.671875,\n },\n {\n x: 0.703125,\n y: 0.671875,\n },\n {\n x: 0.734375,\n y: 0.671875,\n },\n {\n x: 0.734375,\n y: 0.671875,\n },\n {\n x: 0.765625,\n y: 0.671875,\n },\n {\n x: 0.765625,\n y: 0.671875,\n },\n {\n x: 0.796875,\n y: 0.671875,\n },\n {\n x: 0.796875,\n y: 0.671875,\n },\n {\n x: 0.828125,\n y: 0.671875,\n },\n {\n x: 0.828125,\n y: 0.671875,\n },\n {\n x: 0.859375,\n y: 0.671875,\n },\n {\n x: 0.859375,\n y: 0.671875,\n },\n {\n x: 0.890625,\n y: 0.671875,\n },\n {\n x: 0.890625,\n y: 0.671875,\n },\n {\n x: 0.921875,\n y: 0.671875,\n },\n {\n x: 0.921875,\n y: 0.671875,\n },\n {\n x: 0.953125,\n y: 0.671875,\n },\n {\n x: 0.953125,\n y: 0.671875,\n },\n {\n x: 0.984375,\n y: 0.671875,\n },\n {\n x: 0.984375,\n y: 0.671875,\n },\n {\n x: 0.015625,\n y: 0.703125,\n },\n {\n x: 0.015625,\n y: 0.703125,\n },\n {\n x: 0.046875,\n y: 0.703125,\n },\n {\n x: 0.046875,\n y: 0.703125,\n },\n {\n x: 0.078125,\n y: 0.703125,\n },\n {\n x: 0.078125,\n y: 0.703125,\n },\n {\n x: 0.109375,\n y: 0.703125,\n },\n {\n x: 0.109375,\n y: 0.703125,\n },\n {\n x: 0.140625,\n y: 0.703125,\n },\n {\n x: 0.140625,\n y: 0.703125,\n },\n {\n x: 0.171875,\n y: 0.703125,\n },\n {\n x: 0.171875,\n y: 0.703125,\n },\n {\n x: 0.203125,\n y: 0.703125,\n },\n {\n x: 0.203125,\n y: 0.703125,\n },\n {\n x: 0.234375,\n y: 0.703125,\n },\n {\n x: 0.234375,\n y: 0.703125,\n },\n {\n x: 0.265625,\n y: 0.703125,\n },\n {\n x: 0.265625,\n y: 0.703125,\n },\n {\n x: 0.296875,\n y: 0.703125,\n },\n {\n x: 0.296875,\n y: 0.703125,\n },\n {\n x: 0.328125,\n y: 0.703125,\n },\n {\n x: 0.328125,\n y: 0.703125,\n },\n {\n x: 0.359375,\n y: 0.703125,\n },\n {\n x: 0.359375,\n y: 0.703125,\n },\n {\n x: 0.390625,\n y: 0.703125,\n },\n {\n x: 0.390625,\n y: 0.703125,\n },\n {\n x: 0.421875,\n y: 0.703125,\n },\n {\n x: 0.421875,\n y: 0.703125,\n },\n {\n x: 0.453125,\n y: 0.703125,\n },\n {\n x: 0.453125,\n y: 0.703125,\n },\n {\n x: 0.484375,\n y: 0.703125,\n },\n {\n x: 0.484375,\n y: 0.703125,\n },\n {\n x: 0.515625,\n y: 0.703125,\n },\n {\n x: 0.515625,\n y: 0.703125,\n },\n {\n x: 0.546875,\n y: 0.703125,\n },\n {\n x: 0.546875,\n y: 0.703125,\n },\n {\n x: 0.578125,\n y: 0.703125,\n },\n {\n x: 0.578125,\n y: 0.703125,\n },\n {\n x: 0.609375,\n y: 0.703125,\n },\n {\n x: 0.609375,\n y: 0.703125,\n },\n {\n x: 0.640625,\n y: 0.703125,\n },\n {\n x: 0.640625,\n y: 0.703125,\n },\n {\n x: 0.671875,\n y: 0.703125,\n },\n {\n x: 0.671875,\n y: 0.703125,\n },\n {\n x: 0.703125,\n y: 0.703125,\n },\n {\n x: 0.703125,\n y: 0.703125,\n },\n {\n x: 0.734375,\n y: 0.703125,\n },\n {\n x: 0.734375,\n y: 0.703125,\n },\n {\n x: 0.765625,\n y: 0.703125,\n },\n {\n x: 0.765625,\n y: 0.703125,\n },\n {\n x: 0.796875,\n y: 0.703125,\n },\n {\n x: 0.796875,\n y: 0.703125,\n },\n {\n x: 0.828125,\n y: 0.703125,\n },\n {\n x: 0.828125,\n y: 0.703125,\n },\n {\n x: 0.859375,\n y: 0.703125,\n },\n {\n x: 0.859375,\n y: 0.703125,\n },\n {\n x: 0.890625,\n y: 0.703125,\n },\n {\n x: 0.890625,\n y: 0.703125,\n },\n {\n x: 0.921875,\n y: 0.703125,\n },\n {\n x: 0.921875,\n y: 0.703125,\n },\n {\n x: 0.953125,\n y: 0.703125,\n },\n {\n x: 0.953125,\n y: 0.703125,\n },\n {\n x: 0.984375,\n y: 0.703125,\n },\n {\n x: 0.984375,\n y: 0.703125,\n },\n {\n x: 0.015625,\n y: 0.734375,\n },\n {\n x: 0.015625,\n y: 0.734375,\n },\n {\n x: 0.046875,\n y: 0.734375,\n },\n {\n x: 0.046875,\n y: 0.734375,\n },\n {\n x: 0.078125,\n y: 0.734375,\n },\n {\n x: 0.078125,\n y: 0.734375,\n },\n {\n x: 0.109375,\n y: 0.734375,\n },\n {\n x: 0.109375,\n y: 0.734375,\n },\n {\n x: 0.140625,\n y: 0.734375,\n },\n {\n x: 0.140625,\n y: 0.734375,\n },\n {\n x: 0.171875,\n y: 0.734375,\n },\n {\n x: 0.171875,\n y: 0.734375,\n },\n {\n x: 0.203125,\n y: 0.734375,\n },\n {\n x: 0.203125,\n y: 0.734375,\n },\n {\n x: 0.234375,\n y: 0.734375,\n },\n {\n x: 0.234375,\n y: 0.734375,\n },\n {\n x: 0.265625,\n y: 0.734375,\n },\n {\n x: 0.265625,\n y: 0.734375,\n },\n {\n x: 0.296875,\n y: 0.734375,\n },\n {\n x: 0.296875,\n y: 0.734375,\n },\n {\n x: 0.328125,\n y: 0.734375,\n },\n {\n x: 0.328125,\n y: 0.734375,\n },\n {\n x: 0.359375,\n y: 0.734375,\n },\n {\n x: 0.359375,\n y: 0.734375,\n },\n {\n x: 0.390625,\n y: 0.734375,\n },\n {\n x: 0.390625,\n y: 0.734375,\n },\n {\n x: 0.421875,\n y: 0.734375,\n },\n {\n x: 0.421875,\n y: 0.734375,\n },\n {\n x: 0.453125,\n y: 0.734375,\n },\n {\n x: 0.453125,\n y: 0.734375,\n },\n {\n x: 0.484375,\n y: 0.734375,\n },\n {\n x: 0.484375,\n y: 0.734375,\n },\n {\n x: 0.515625,\n y: 0.734375,\n },\n {\n x: 0.515625,\n y: 0.734375,\n },\n {\n x: 0.546875,\n y: 0.734375,\n },\n {\n x: 0.546875,\n y: 0.734375,\n },\n {\n x: 0.578125,\n y: 0.734375,\n },\n {\n x: 0.578125,\n y: 0.734375,\n },\n {\n x: 0.609375,\n y: 0.734375,\n },\n {\n x: 0.609375,\n y: 0.734375,\n },\n {\n x: 0.640625,\n y: 0.734375,\n },\n {\n x: 0.640625,\n y: 0.734375,\n },\n {\n x: 0.671875,\n y: 0.734375,\n },\n {\n x: 0.671875,\n y: 0.734375,\n },\n {\n x: 0.703125,\n y: 0.734375,\n },\n {\n x: 0.703125,\n y: 0.734375,\n },\n {\n x: 0.734375,\n y: 0.734375,\n },\n {\n x: 0.734375,\n y: 0.734375,\n },\n {\n x: 0.765625,\n y: 0.734375,\n },\n {\n x: 0.765625,\n y: 0.734375,\n },\n {\n x: 0.796875,\n y: 0.734375,\n },\n {\n x: 0.796875,\n y: 0.734375,\n },\n {\n x: 0.828125,\n y: 0.734375,\n },\n {\n x: 0.828125,\n y: 0.734375,\n },\n {\n x: 0.859375,\n y: 0.734375,\n },\n {\n x: 0.859375,\n y: 0.734375,\n },\n {\n x: 0.890625,\n y: 0.734375,\n },\n {\n x: 0.890625,\n y: 0.734375,\n },\n {\n x: 0.921875,\n y: 0.734375,\n },\n {\n x: 0.921875,\n y: 0.734375,\n },\n {\n x: 0.953125,\n y: 0.734375,\n },\n {\n x: 0.953125,\n y: 0.734375,\n },\n {\n x: 0.984375,\n y: 0.734375,\n },\n {\n x: 0.984375,\n y: 0.734375,\n },\n {\n x: 0.015625,\n y: 0.765625,\n },\n {\n x: 0.015625,\n y: 0.765625,\n },\n {\n x: 0.046875,\n y: 0.765625,\n },\n {\n x: 0.046875,\n y: 0.765625,\n },\n {\n x: 0.078125,\n y: 0.765625,\n },\n {\n x: 0.078125,\n y: 0.765625,\n },\n {\n x: 0.109375,\n y: 0.765625,\n },\n {\n x: 0.109375,\n y: 0.765625,\n },\n {\n x: 0.140625,\n y: 0.765625,\n },\n {\n x: 0.140625,\n y: 0.765625,\n },\n {\n x: 0.171875,\n y: 0.765625,\n },\n {\n x: 0.171875,\n y: 0.765625,\n },\n {\n x: 0.203125,\n y: 0.765625,\n },\n {\n x: 0.203125,\n y: 0.765625,\n },\n {\n x: 0.234375,\n y: 0.765625,\n },\n {\n x: 0.234375,\n y: 0.765625,\n },\n {\n x: 0.265625,\n y: 0.765625,\n },\n {\n x: 0.265625,\n y: 0.765625,\n },\n {\n x: 0.296875,\n y: 0.765625,\n },\n {\n x: 0.296875,\n y: 0.765625,\n },\n {\n x: 0.328125,\n y: 0.765625,\n },\n {\n x: 0.328125,\n y: 0.765625,\n },\n {\n x: 0.359375,\n y: 0.765625,\n },\n {\n x: 0.359375,\n y: 0.765625,\n },\n {\n x: 0.390625,\n y: 0.765625,\n },\n {\n x: 0.390625,\n y: 0.765625,\n },\n {\n x: 0.421875,\n y: 0.765625,\n },\n {\n x: 0.421875,\n y: 0.765625,\n },\n {\n x: 0.453125,\n y: 0.765625,\n },\n {\n x: 0.453125,\n y: 0.765625,\n },\n {\n x: 0.484375,\n y: 0.765625,\n },\n {\n x: 0.484375,\n y: 0.765625,\n },\n {\n x: 0.515625,\n y: 0.765625,\n },\n {\n x: 0.515625,\n y: 0.765625,\n },\n {\n x: 0.546875,\n y: 0.765625,\n },\n {\n x: 0.546875,\n y: 0.765625,\n },\n {\n x: 0.578125,\n y: 0.765625,\n },\n {\n x: 0.578125,\n y: 0.765625,\n },\n {\n x: 0.609375,\n y: 0.765625,\n },\n {\n x: 0.609375,\n y: 0.765625,\n },\n {\n x: 0.640625,\n y: 0.765625,\n },\n {\n x: 0.640625,\n y: 0.765625,\n },\n {\n x: 0.671875,\n y: 0.765625,\n },\n {\n x: 0.671875,\n y: 0.765625,\n },\n {\n x: 0.703125,\n y: 0.765625,\n },\n {\n x: 0.703125,\n y: 0.765625,\n },\n {\n x: 0.734375,\n y: 0.765625,\n },\n {\n x: 0.734375,\n y: 0.765625,\n },\n {\n x: 0.765625,\n y: 0.765625,\n },\n {\n x: 0.765625,\n y: 0.765625,\n },\n {\n x: 0.796875,\n y: 0.765625,\n },\n {\n x: 0.796875,\n y: 0.765625,\n },\n {\n x: 0.828125,\n y: 0.765625,\n },\n {\n x: 0.828125,\n y: 0.765625,\n },\n {\n x: 0.859375,\n y: 0.765625,\n },\n {\n x: 0.859375,\n y: 0.765625,\n },\n {\n x: 0.890625,\n y: 0.765625,\n },\n {\n x: 0.890625,\n y: 0.765625,\n },\n {\n x: 0.921875,\n y: 0.765625,\n },\n {\n x: 0.921875,\n y: 0.765625,\n },\n {\n x: 0.953125,\n y: 0.765625,\n },\n {\n x: 0.953125,\n y: 0.765625,\n },\n {\n x: 0.984375,\n y: 0.765625,\n },\n {\n x: 0.984375,\n y: 0.765625,\n },\n {\n x: 0.015625,\n y: 0.796875,\n },\n {\n x: 0.015625,\n y: 0.796875,\n },\n {\n x: 0.046875,\n y: 0.796875,\n },\n {\n x: 0.046875,\n y: 0.796875,\n },\n {\n x: 0.078125,\n y: 0.796875,\n },\n {\n x: 0.078125,\n y: 0.796875,\n },\n {\n x: 0.109375,\n y: 0.796875,\n },\n {\n x: 0.109375,\n y: 0.796875,\n },\n {\n x: 0.140625,\n y: 0.796875,\n },\n {\n x: 0.140625,\n y: 0.796875,\n },\n {\n x: 0.171875,\n y: 0.796875,\n },\n {\n x: 0.171875,\n y: 0.796875,\n },\n {\n x: 0.203125,\n y: 0.796875,\n },\n {\n x: 0.203125,\n y: 0.796875,\n },\n {\n x: 0.234375,\n y: 0.796875,\n },\n {\n x: 0.234375,\n y: 0.796875,\n },\n {\n x: 0.265625,\n y: 0.796875,\n },\n {\n x: 0.265625,\n y: 0.796875,\n },\n {\n x: 0.296875,\n y: 0.796875,\n },\n {\n x: 0.296875,\n y: 0.796875,\n },\n {\n x: 0.328125,\n y: 0.796875,\n },\n {\n x: 0.328125,\n y: 0.796875,\n },\n {\n x: 0.359375,\n y: 0.796875,\n },\n {\n x: 0.359375,\n y: 0.796875,\n },\n {\n x: 0.390625,\n y: 0.796875,\n },\n {\n x: 0.390625,\n y: 0.796875,\n },\n {\n x: 0.421875,\n y: 0.796875,\n },\n {\n x: 0.421875,\n y: 0.796875,\n },\n {\n x: 0.453125,\n y: 0.796875,\n },\n {\n x: 0.453125,\n y: 0.796875,\n },\n {\n x: 0.484375,\n y: 0.796875,\n },\n {\n x: 0.484375,\n y: 0.796875,\n },\n {\n x: 0.515625,\n y: 0.796875,\n },\n {\n x: 0.515625,\n y: 0.796875,\n },\n {\n x: 0.546875,\n y: 0.796875,\n },\n {\n x: 0.546875,\n y: 0.796875,\n },\n {\n x: 0.578125,\n y: 0.796875,\n },\n {\n x: 0.578125,\n y: 0.796875,\n },\n {\n x: 0.609375,\n y: 0.796875,\n },\n {\n x: 0.609375,\n y: 0.796875,\n },\n {\n x: 0.640625,\n y: 0.796875,\n },\n {\n x: 0.640625,\n y: 0.796875,\n },\n {\n x: 0.671875,\n y: 0.796875,\n },\n {\n x: 0.671875,\n y: 0.796875,\n },\n {\n x: 0.703125,\n y: 0.796875,\n },\n {\n x: 0.703125,\n y: 0.796875,\n },\n {\n x: 0.734375,\n y: 0.796875,\n },\n {\n x: 0.734375,\n y: 0.796875,\n },\n {\n x: 0.765625,\n y: 0.796875,\n },\n {\n x: 0.765625,\n y: 0.796875,\n },\n {\n x: 0.796875,\n y: 0.796875,\n },\n {\n x: 0.796875,\n y: 0.796875,\n },\n {\n x: 0.828125,\n y: 0.796875,\n },\n {\n x: 0.828125,\n y: 0.796875,\n },\n {\n x: 0.859375,\n y: 0.796875,\n },\n {\n x: 0.859375,\n y: 0.796875,\n },\n {\n x: 0.890625,\n y: 0.796875,\n },\n {\n x: 0.890625,\n y: 0.796875,\n },\n {\n x: 0.921875,\n y: 0.796875,\n },\n {\n x: 0.921875,\n y: 0.796875,\n },\n {\n x: 0.953125,\n y: 0.796875,\n },\n {\n x: 0.953125,\n y: 0.796875,\n },\n {\n x: 0.984375,\n y: 0.796875,\n },\n {\n x: 0.984375,\n y: 0.796875,\n },\n {\n x: 0.015625,\n y: 0.828125,\n },\n {\n x: 0.015625,\n y: 0.828125,\n },\n {\n x: 0.046875,\n y: 0.828125,\n },\n {\n x: 0.046875,\n y: 0.828125,\n },\n {\n x: 0.078125,\n y: 0.828125,\n },\n {\n x: 0.078125,\n y: 0.828125,\n },\n {\n x: 0.109375,\n y: 0.828125,\n },\n {\n x: 0.109375,\n y: 0.828125,\n },\n {\n x: 0.140625,\n y: 0.828125,\n },\n {\n x: 0.140625,\n y: 0.828125,\n },\n {\n x: 0.171875,\n y: 0.828125,\n },\n {\n x: 0.171875,\n y: 0.828125,\n },\n {\n x: 0.203125,\n y: 0.828125,\n },\n {\n x: 0.203125,\n y: 0.828125,\n },\n {\n x: 0.234375,\n y: 0.828125,\n },\n {\n x: 0.234375,\n y: 0.828125,\n },\n {\n x: 0.265625,\n y: 0.828125,\n },\n {\n x: 0.265625,\n y: 0.828125,\n },\n {\n x: 0.296875,\n y: 0.828125,\n },\n {\n x: 0.296875,\n y: 0.828125,\n },\n {\n x: 0.328125,\n y: 0.828125,\n },\n {\n x: 0.328125,\n y: 0.828125,\n },\n {\n x: 0.359375,\n y: 0.828125,\n },\n {\n x: 0.359375,\n y: 0.828125,\n },\n {\n x: 0.390625,\n y: 0.828125,\n },\n {\n x: 0.390625,\n y: 0.828125,\n },\n {\n x: 0.421875,\n y: 0.828125,\n },\n {\n x: 0.421875,\n y: 0.828125,\n },\n {\n x: 0.453125,\n y: 0.828125,\n },\n {\n x: 0.453125,\n y: 0.828125,\n },\n {\n x: 0.484375,\n y: 0.828125,\n },\n {\n x: 0.484375,\n y: 0.828125,\n },\n {\n x: 0.515625,\n y: 0.828125,\n },\n {\n x: 0.515625,\n y: 0.828125,\n },\n {\n x: 0.546875,\n y: 0.828125,\n },\n {\n x: 0.546875,\n y: 0.828125,\n },\n {\n x: 0.578125,\n y: 0.828125,\n },\n {\n x: 0.578125,\n y: 0.828125,\n },\n {\n x: 0.609375,\n y: 0.828125,\n },\n {\n x: 0.609375,\n y: 0.828125,\n },\n {\n x: 0.640625,\n y: 0.828125,\n },\n {\n x: 0.640625,\n y: 0.828125,\n },\n {\n x: 0.671875,\n y: 0.828125,\n },\n {\n x: 0.671875,\n y: 0.828125,\n },\n {\n x: 0.703125,\n y: 0.828125,\n },\n {\n x: 0.703125,\n y: 0.828125,\n },\n {\n x: 0.734375,\n y: 0.828125,\n },\n {\n x: 0.734375,\n y: 0.828125,\n },\n {\n x: 0.765625,\n y: 0.828125,\n },\n {\n x: 0.765625,\n y: 0.828125,\n },\n {\n x: 0.796875,\n y: 0.828125,\n },\n {\n x: 0.796875,\n y: 0.828125,\n },\n {\n x: 0.828125,\n y: 0.828125,\n },\n {\n x: 0.828125,\n y: 0.828125,\n },\n {\n x: 0.859375,\n y: 0.828125,\n },\n {\n x: 0.859375,\n y: 0.828125,\n },\n {\n x: 0.890625,\n y: 0.828125,\n },\n {\n x: 0.890625,\n y: 0.828125,\n },\n {\n x: 0.921875,\n y: 0.828125,\n },\n {\n x: 0.921875,\n y: 0.828125,\n },\n {\n x: 0.953125,\n y: 0.828125,\n },\n {\n x: 0.953125,\n y: 0.828125,\n },\n {\n x: 0.984375,\n y: 0.828125,\n },\n {\n x: 0.984375,\n y: 0.828125,\n },\n {\n x: 0.015625,\n y: 0.859375,\n },\n {\n x: 0.015625,\n y: 0.859375,\n },\n {\n x: 0.046875,\n y: 0.859375,\n },\n {\n x: 0.046875,\n y: 0.859375,\n },\n {\n x: 0.078125,\n y: 0.859375,\n },\n {\n x: 0.078125,\n y: 0.859375,\n },\n {\n x: 0.109375,\n y: 0.859375,\n },\n {\n x: 0.109375,\n y: 0.859375,\n },\n {\n x: 0.140625,\n y: 0.859375,\n },\n {\n x: 0.140625,\n y: 0.859375,\n },\n {\n x: 0.171875,\n y: 0.859375,\n },\n {\n x: 0.171875,\n y: 0.859375,\n },\n {\n x: 0.203125,\n y: 0.859375,\n },\n {\n x: 0.203125,\n y: 0.859375,\n },\n {\n x: 0.234375,\n y: 0.859375,\n },\n {\n x: 0.234375,\n y: 0.859375,\n },\n {\n x: 0.265625,\n y: 0.859375,\n },\n {\n x: 0.265625,\n y: 0.859375,\n },\n {\n x: 0.296875,\n y: 0.859375,\n },\n {\n x: 0.296875,\n y: 0.859375,\n },\n {\n x: 0.328125,\n y: 0.859375,\n },\n {\n x: 0.328125,\n y: 0.859375,\n },\n {\n x: 0.359375,\n y: 0.859375,\n },\n {\n x: 0.359375,\n y: 0.859375,\n },\n {\n x: 0.390625,\n y: 0.859375,\n },\n {\n x: 0.390625,\n y: 0.859375,\n },\n {\n x: 0.421875,\n y: 0.859375,\n },\n {\n x: 0.421875,\n y: 0.859375,\n },\n {\n x: 0.453125,\n y: 0.859375,\n },\n {\n x: 0.453125,\n y: 0.859375,\n },\n {\n x: 0.484375,\n y: 0.859375,\n },\n {\n x: 0.484375,\n y: 0.859375,\n },\n {\n x: 0.515625,\n y: 0.859375,\n },\n {\n x: 0.515625,\n y: 0.859375,\n },\n {\n x: 0.546875,\n y: 0.859375,\n },\n {\n x: 0.546875,\n y: 0.859375,\n },\n {\n x: 0.578125,\n y: 0.859375,\n },\n {\n x: 0.578125,\n y: 0.859375,\n },\n {\n x: 0.609375,\n y: 0.859375,\n },\n {\n x: 0.609375,\n y: 0.859375,\n },\n {\n x: 0.640625,\n y: 0.859375,\n },\n {\n x: 0.640625,\n y: 0.859375,\n },\n {\n x: 0.671875,\n y: 0.859375,\n },\n {\n x: 0.671875,\n y: 0.859375,\n },\n {\n x: 0.703125,\n y: 0.859375,\n },\n {\n x: 0.703125,\n y: 0.859375,\n },\n {\n x: 0.734375,\n y: 0.859375,\n },\n {\n x: 0.734375,\n y: 0.859375,\n },\n {\n x: 0.765625,\n y: 0.859375,\n },\n {\n x: 0.765625,\n y: 0.859375,\n },\n {\n x: 0.796875,\n y: 0.859375,\n },\n {\n x: 0.796875,\n y: 0.859375,\n },\n {\n x: 0.828125,\n y: 0.859375,\n },\n {\n x: 0.828125,\n y: 0.859375,\n },\n {\n x: 0.859375,\n y: 0.859375,\n },\n {\n x: 0.859375,\n y: 0.859375,\n },\n {\n x: 0.890625,\n y: 0.859375,\n },\n {\n x: 0.890625,\n y: 0.859375,\n },\n {\n x: 0.921875,\n y: 0.859375,\n },\n {\n x: 0.921875,\n y: 0.859375,\n },\n {\n x: 0.953125,\n y: 0.859375,\n },\n {\n x: 0.953125,\n y: 0.859375,\n },\n {\n x: 0.984375,\n y: 0.859375,\n },\n {\n x: 0.984375,\n y: 0.859375,\n },\n {\n x: 0.015625,\n y: 0.890625,\n },\n {\n x: 0.015625,\n y: 0.890625,\n },\n {\n x: 0.046875,\n y: 0.890625,\n },\n {\n x: 0.046875,\n y: 0.890625,\n },\n {\n x: 0.078125,\n y: 0.890625,\n },\n {\n x: 0.078125,\n y: 0.890625,\n },\n {\n x: 0.109375,\n y: 0.890625,\n },\n {\n x: 0.109375,\n y: 0.890625,\n },\n {\n x: 0.140625,\n y: 0.890625,\n },\n {\n x: 0.140625,\n y: 0.890625,\n },\n {\n x: 0.171875,\n y: 0.890625,\n },\n {\n x: 0.171875,\n y: 0.890625,\n },\n {\n x: 0.203125,\n y: 0.890625,\n },\n {\n x: 0.203125,\n y: 0.890625,\n },\n {\n x: 0.234375,\n y: 0.890625,\n },\n {\n x: 0.234375,\n y: 0.890625,\n },\n {\n x: 0.265625,\n y: 0.890625,\n },\n {\n x: 0.265625,\n y: 0.890625,\n },\n {\n x: 0.296875,\n y: 0.890625,\n },\n {\n x: 0.296875,\n y: 0.890625,\n },\n {\n x: 0.328125,\n y: 0.890625,\n },\n {\n x: 0.328125,\n y: 0.890625,\n },\n {\n x: 0.359375,\n y: 0.890625,\n },\n {\n x: 0.359375,\n y: 0.890625,\n },\n {\n x: 0.390625,\n y: 0.890625,\n },\n {\n x: 0.390625,\n y: 0.890625,\n },\n {\n x: 0.421875,\n y: 0.890625,\n },\n {\n x: 0.421875,\n y: 0.890625,\n },\n {\n x: 0.453125,\n y: 0.890625,\n },\n {\n x: 0.453125,\n y: 0.890625,\n },\n {\n x: 0.484375,\n y: 0.890625,\n },\n {\n x: 0.484375,\n y: 0.890625,\n },\n {\n x: 0.515625,\n y: 0.890625,\n },\n {\n x: 0.515625,\n y: 0.890625,\n },\n {\n x: 0.546875,\n y: 0.890625,\n },\n {\n x: 0.546875,\n y: 0.890625,\n },\n {\n x: 0.578125,\n y: 0.890625,\n },\n {\n x: 0.578125,\n y: 0.890625,\n },\n {\n x: 0.609375,\n y: 0.890625,\n },\n {\n x: 0.609375,\n y: 0.890625,\n },\n {\n x: 0.640625,\n y: 0.890625,\n },\n {\n x: 0.640625,\n y: 0.890625,\n },\n {\n x: 0.671875,\n y: 0.890625,\n },\n {\n x: 0.671875,\n y: 0.890625,\n },\n {\n x: 0.703125,\n y: 0.890625,\n },\n {\n x: 0.703125,\n y: 0.890625,\n },\n {\n x: 0.734375,\n y: 0.890625,\n },\n {\n x: 0.734375,\n y: 0.890625,\n },\n {\n x: 0.765625,\n y: 0.890625,\n },\n {\n x: 0.765625,\n y: 0.890625,\n },\n {\n x: 0.796875,\n y: 0.890625,\n },\n {\n x: 0.796875,\n y: 0.890625,\n },\n {\n x: 0.828125,\n y: 0.890625,\n },\n {\n x: 0.828125,\n y: 0.890625,\n },\n {\n x: 0.859375,\n y: 0.890625,\n },\n {\n x: 0.859375,\n y: 0.890625,\n },\n {\n x: 0.890625,\n y: 0.890625,\n },\n {\n x: 0.890625,\n y: 0.890625,\n },\n {\n x: 0.921875,\n y: 0.890625,\n },\n {\n x: 0.921875,\n y: 0.890625,\n },\n {\n x: 0.953125,\n y: 0.890625,\n },\n {\n x: 0.953125,\n y: 0.890625,\n },\n {\n x: 0.984375,\n y: 0.890625,\n },\n {\n x: 0.984375,\n y: 0.890625,\n },\n {\n x: 0.015625,\n y: 0.921875,\n },\n {\n x: 0.015625,\n y: 0.921875,\n },\n {\n x: 0.046875,\n y: 0.921875,\n },\n {\n x: 0.046875,\n y: 0.921875,\n },\n {\n x: 0.078125,\n y: 0.921875,\n },\n {\n x: 0.078125,\n y: 0.921875,\n },\n {\n x: 0.109375,\n y: 0.921875,\n },\n {\n x: 0.109375,\n y: 0.921875,\n },\n {\n x: 0.140625,\n y: 0.921875,\n },\n {\n x: 0.140625,\n y: 0.921875,\n },\n {\n x: 0.171875,\n y: 0.921875,\n },\n {\n x: 0.171875,\n y: 0.921875,\n },\n {\n x: 0.203125,\n y: 0.921875,\n },\n {\n x: 0.203125,\n y: 0.921875,\n },\n {\n x: 0.234375,\n y: 0.921875,\n },\n {\n x: 0.234375,\n y: 0.921875,\n },\n {\n x: 0.265625,\n y: 0.921875,\n },\n {\n x: 0.265625,\n y: 0.921875,\n },\n {\n x: 0.296875,\n y: 0.921875,\n },\n {\n x: 0.296875,\n y: 0.921875,\n },\n {\n x: 0.328125,\n y: 0.921875,\n },\n {\n x: 0.328125,\n y: 0.921875,\n },\n {\n x: 0.359375,\n y: 0.921875,\n },\n {\n x: 0.359375,\n y: 0.921875,\n },\n {\n x: 0.390625,\n y: 0.921875,\n },\n {\n x: 0.390625,\n y: 0.921875,\n },\n {\n x: 0.421875,\n y: 0.921875,\n },\n {\n x: 0.421875,\n y: 0.921875,\n },\n {\n x: 0.453125,\n y: 0.921875,\n },\n {\n x: 0.453125,\n y: 0.921875,\n },\n {\n x: 0.484375,\n y: 0.921875,\n },\n {\n x: 0.484375,\n y: 0.921875,\n },\n {\n x: 0.515625,\n y: 0.921875,\n },\n {\n x: 0.515625,\n y: 0.921875,\n },\n {\n x: 0.546875,\n y: 0.921875,\n },\n {\n x: 0.546875,\n y: 0.921875,\n },\n {\n x: 0.578125,\n y: 0.921875,\n },\n {\n x: 0.578125,\n y: 0.921875,\n },\n {\n x: 0.609375,\n y: 0.921875,\n },\n {\n x: 0.609375,\n y: 0.921875,\n },\n {\n x: 0.640625,\n y: 0.921875,\n },\n {\n x: 0.640625,\n y: 0.921875,\n },\n {\n x: 0.671875,\n y: 0.921875,\n },\n {\n x: 0.671875,\n y: 0.921875,\n },\n {\n x: 0.703125,\n y: 0.921875,\n },\n {\n x: 0.703125,\n y: 0.921875,\n },\n {\n x: 0.734375,\n y: 0.921875,\n },\n {\n x: 0.734375,\n y: 0.921875,\n },\n {\n x: 0.765625,\n y: 0.921875,\n },\n {\n x: 0.765625,\n y: 0.921875,\n },\n {\n x: 0.796875,\n y: 0.921875,\n },\n {\n x: 0.796875,\n y: 0.921875,\n },\n {\n x: 0.828125,\n y: 0.921875,\n },\n {\n x: 0.828125,\n y: 0.921875,\n },\n {\n x: 0.859375,\n y: 0.921875,\n },\n {\n x: 0.859375,\n y: 0.921875,\n },\n {\n x: 0.890625,\n y: 0.921875,\n },\n {\n x: 0.890625,\n y: 0.921875,\n },\n {\n x: 0.921875,\n y: 0.921875,\n },\n {\n x: 0.921875,\n y: 0.921875,\n },\n {\n x: 0.953125,\n y: 0.921875,\n },\n {\n x: 0.953125,\n y: 0.921875,\n },\n {\n x: 0.984375,\n y: 0.921875,\n },\n {\n x: 0.984375,\n y: 0.921875,\n },\n {\n x: 0.015625,\n y: 0.953125,\n },\n {\n x: 0.015625,\n y: 0.953125,\n },\n {\n x: 0.046875,\n y: 0.953125,\n },\n {\n x: 0.046875,\n y: 0.953125,\n },\n {\n x: 0.078125,\n y: 0.953125,\n },\n {\n x: 0.078125,\n y: 0.953125,\n },\n {\n x: 0.109375,\n y: 0.953125,\n },\n {\n x: 0.109375,\n y: 0.953125,\n },\n {\n x: 0.140625,\n y: 0.953125,\n },\n {\n x: 0.140625,\n y: 0.953125,\n },\n {\n x: 0.171875,\n y: 0.953125,\n },\n {\n x: 0.171875,\n y: 0.953125,\n },\n {\n x: 0.203125,\n y: 0.953125,\n },\n {\n x: 0.203125,\n y: 0.953125,\n },\n {\n x: 0.234375,\n y: 0.953125,\n },\n {\n x: 0.234375,\n y: 0.953125,\n },\n {\n x: 0.265625,\n y: 0.953125,\n },\n {\n x: 0.265625,\n y: 0.953125,\n },\n {\n x: 0.296875,\n y: 0.953125,\n },\n {\n x: 0.296875,\n y: 0.953125,\n },\n {\n x: 0.328125,\n y: 0.953125,\n },\n {\n x: 0.328125,\n y: 0.953125,\n },\n {\n x: 0.359375,\n y: 0.953125,\n },\n {\n x: 0.359375,\n y: 0.953125,\n },\n {\n x: 0.390625,\n y: 0.953125,\n },\n {\n x: 0.390625,\n y: 0.953125,\n },\n {\n x: 0.421875,\n y: 0.953125,\n },\n {\n x: 0.421875,\n y: 0.953125,\n },\n {\n x: 0.453125,\n y: 0.953125,\n },\n {\n x: 0.453125,\n y: 0.953125,\n },\n {\n x: 0.484375,\n y: 0.953125,\n },\n {\n x: 0.484375,\n y: 0.953125,\n },\n {\n x: 0.515625,\n y: 0.953125,\n },\n {\n x: 0.515625,\n y: 0.953125,\n },\n {\n x: 0.546875,\n y: 0.953125,\n },\n {\n x: 0.546875,\n y: 0.953125,\n },\n {\n x: 0.578125,\n y: 0.953125,\n },\n {\n x: 0.578125,\n y: 0.953125,\n },\n {\n x: 0.609375,\n y: 0.953125,\n },\n {\n x: 0.609375,\n y: 0.953125,\n },\n {\n x: 0.640625,\n y: 0.953125,\n },\n {\n x: 0.640625,\n y: 0.953125,\n },\n {\n x: 0.671875,\n y: 0.953125,\n },\n {\n x: 0.671875,\n y: 0.953125,\n },\n {\n x: 0.703125,\n y: 0.953125,\n },\n {\n x: 0.703125,\n y: 0.953125,\n },\n {\n x: 0.734375,\n y: 0.953125,\n },\n {\n x: 0.734375,\n y: 0.953125,\n },\n {\n x: 0.765625,\n y: 0.953125,\n },\n {\n x: 0.765625,\n y: 0.953125,\n },\n {\n x: 0.796875,\n y: 0.953125,\n },\n {\n x: 0.796875,\n y: 0.953125,\n },\n {\n x: 0.828125,\n y: 0.953125,\n },\n {\n x: 0.828125,\n y: 0.953125,\n },\n {\n x: 0.859375,\n y: 0.953125,\n },\n {\n x: 0.859375,\n y: 0.953125,\n },\n {\n x: 0.890625,\n y: 0.953125,\n },\n {\n x: 0.890625,\n y: 0.953125,\n },\n {\n x: 0.921875,\n y: 0.953125,\n },\n {\n x: 0.921875,\n y: 0.953125,\n },\n {\n x: 0.953125,\n y: 0.953125,\n },\n {\n x: 0.953125,\n y: 0.953125,\n },\n {\n x: 0.984375,\n y: 0.953125,\n },\n {\n x: 0.984375,\n y: 0.953125,\n },\n {\n x: 0.015625,\n y: 0.984375,\n },\n {\n x: 0.015625,\n y: 0.984375,\n },\n {\n x: 0.046875,\n y: 0.984375,\n },\n {\n x: 0.046875,\n y: 0.984375,\n },\n {\n x: 0.078125,\n y: 0.984375,\n },\n {\n x: 0.078125,\n y: 0.984375,\n },\n {\n x: 0.109375,\n y: 0.984375,\n },\n {\n x: 0.109375,\n y: 0.984375,\n },\n {\n x: 0.140625,\n y: 0.984375,\n },\n {\n x: 0.140625,\n y: 0.984375,\n },\n {\n x: 0.171875,\n y: 0.984375,\n },\n {\n x: 0.171875,\n y: 0.984375,\n },\n {\n x: 0.203125,\n y: 0.984375,\n },\n {\n x: 0.203125,\n y: 0.984375,\n },\n {\n x: 0.234375,\n y: 0.984375,\n },\n {\n x: 0.234375,\n y: 0.984375,\n },\n {\n x: 0.265625,\n y: 0.984375,\n },\n {\n x: 0.265625,\n y: 0.984375,\n },\n {\n x: 0.296875,\n y: 0.984375,\n },\n {\n x: 0.296875,\n y: 0.984375,\n },\n {\n x: 0.328125,\n y: 0.984375,\n },\n {\n x: 0.328125,\n y: 0.984375,\n },\n {\n x: 0.359375,\n y: 0.984375,\n },\n {\n x: 0.359375,\n y: 0.984375,\n },\n {\n x: 0.390625,\n y: 0.984375,\n },\n {\n x: 0.390625,\n y: 0.984375,\n },\n {\n x: 0.421875,\n y: 0.984375,\n },\n {\n x: 0.421875,\n y: 0.984375,\n },\n {\n x: 0.453125,\n y: 0.984375,\n },\n {\n x: 0.453125,\n y: 0.984375,\n },\n {\n x: 0.484375,\n y: 0.984375,\n },\n {\n x: 0.484375,\n y: 0.984375,\n },\n {\n x: 0.515625,\n y: 0.984375,\n },\n {\n x: 0.515625,\n y: 0.984375,\n },\n {\n x: 0.546875,\n y: 0.984375,\n },\n {\n x: 0.546875,\n y: 0.984375,\n },\n {\n x: 0.578125,\n y: 0.984375,\n },\n {\n x: 0.578125,\n y: 0.984375,\n },\n {\n x: 0.609375,\n y: 0.984375,\n },\n {\n x: 0.609375,\n y: 0.984375,\n },\n {\n x: 0.640625,\n y: 0.984375,\n },\n {\n x: 0.640625,\n y: 0.984375,\n },\n {\n x: 0.671875,\n y: 0.984375,\n },\n {\n x: 0.671875,\n y: 0.984375,\n },\n {\n x: 0.703125,\n y: 0.984375,\n },\n {\n x: 0.703125,\n y: 0.984375,\n },\n {\n x: 0.734375,\n y: 0.984375,\n },\n {\n x: 0.734375,\n y: 0.984375,\n },\n {\n x: 0.765625,\n y: 0.984375,\n },\n {\n x: 0.765625,\n y: 0.984375,\n },\n {\n x: 0.796875,\n y: 0.984375,\n },\n {\n x: 0.796875,\n y: 0.984375,\n },\n {\n x: 0.828125,\n y: 0.984375,\n },\n {\n x: 0.828125,\n y: 0.984375,\n },\n {\n x: 0.859375,\n y: 0.984375,\n },\n {\n x: 0.859375,\n y: 0.984375,\n },\n {\n x: 0.890625,\n y: 0.984375,\n },\n {\n x: 0.890625,\n y: 0.984375,\n },\n {\n x: 0.921875,\n y: 0.984375,\n },\n {\n x: 0.921875,\n y: 0.984375,\n },\n {\n x: 0.953125,\n y: 0.984375,\n },\n {\n x: 0.953125,\n y: 0.984375,\n },\n {\n x: 0.984375,\n y: 0.984375,\n },\n {\n x: 0.984375,\n y: 0.984375,\n },\n {\n x: 0.03125,\n y: 0.03125,\n },\n {\n x: 0.03125,\n y: 0.03125,\n },\n {\n x: 0.09375,\n y: 0.03125,\n },\n {\n x: 0.09375,\n y: 0.03125,\n },\n {\n x: 0.15625,\n y: 0.03125,\n },\n {\n x: 0.15625,\n y: 0.03125,\n },\n {\n x: 0.21875,\n y: 0.03125,\n },\n {\n x: 0.21875,\n y: 0.03125,\n },\n {\n x: 0.28125,\n y: 0.03125,\n },\n {\n x: 0.28125,\n y: 0.03125,\n },\n {\n x: 0.34375,\n y: 0.03125,\n },\n {\n x: 0.34375,\n y: 0.03125,\n },\n {\n x: 0.40625,\n y: 0.03125,\n },\n {\n x: 0.40625,\n y: 0.03125,\n },\n {\n x: 0.46875,\n y: 0.03125,\n },\n {\n x: 0.46875,\n y: 0.03125,\n },\n {\n x: 0.53125,\n y: 0.03125,\n },\n {\n x: 0.53125,\n y: 0.03125,\n },\n {\n x: 0.59375,\n y: 0.03125,\n },\n {\n x: 0.59375,\n y: 0.03125,\n },\n {\n x: 0.65625,\n y: 0.03125,\n },\n {\n x: 0.65625,\n y: 0.03125,\n },\n {\n x: 0.71875,\n y: 0.03125,\n },\n {\n x: 0.71875,\n y: 0.03125,\n },\n {\n x: 0.78125,\n y: 0.03125,\n },\n {\n x: 0.78125,\n y: 0.03125,\n },\n {\n x: 0.84375,\n y: 0.03125,\n },\n {\n x: 0.84375,\n y: 0.03125,\n },\n {\n x: 0.90625,\n y: 0.03125,\n },\n {\n x: 0.90625,\n y: 0.03125,\n },\n {\n x: 0.96875,\n y: 0.03125,\n },\n {\n x: 0.96875,\n y: 0.03125,\n },\n {\n x: 0.03125,\n y: 0.09375,\n },\n {\n x: 0.03125,\n y: 0.09375,\n },\n {\n x: 0.09375,\n y: 0.09375,\n },\n {\n x: 0.09375,\n y: 0.09375,\n },\n {\n x: 0.15625,\n y: 0.09375,\n },\n {\n x: 0.15625,\n y: 0.09375,\n },\n {\n x: 0.21875,\n y: 0.09375,\n },\n {\n x: 0.21875,\n y: 0.09375,\n },\n {\n x: 0.28125,\n y: 0.09375,\n },\n {\n x: 0.28125,\n y: 0.09375,\n },\n {\n x: 0.34375,\n y: 0.09375,\n },\n {\n x: 0.34375,\n y: 0.09375,\n },\n {\n x: 0.40625,\n y: 0.09375,\n },\n {\n x: 0.40625,\n y: 0.09375,\n },\n {\n x: 0.46875,\n y: 0.09375,\n },\n {\n x: 0.46875,\n y: 0.09375,\n },\n {\n x: 0.53125,\n y: 0.09375,\n },\n {\n x: 0.53125,\n y: 0.09375,\n },\n {\n x: 0.59375,\n y: 0.09375,\n },\n {\n x: 0.59375,\n y: 0.09375,\n },\n {\n x: 0.65625,\n y: 0.09375,\n },\n {\n x: 0.65625,\n y: 0.09375,\n },\n {\n x: 0.71875,\n y: 0.09375,\n },\n {\n x: 0.71875,\n y: 0.09375,\n },\n {\n x: 0.78125,\n y: 0.09375,\n },\n {\n x: 0.78125,\n y: 0.09375,\n },\n {\n x: 0.84375,\n y: 0.09375,\n },\n {\n x: 0.84375,\n y: 0.09375,\n },\n {\n x: 0.90625,\n y: 0.09375,\n },\n {\n x: 0.90625,\n y: 0.09375,\n },\n {\n x: 0.96875,\n y: 0.09375,\n },\n {\n x: 0.96875,\n y: 0.09375,\n },\n {\n x: 0.03125,\n y: 0.15625,\n },\n {\n x: 0.03125,\n y: 0.15625,\n },\n {\n x: 0.09375,\n y: 0.15625,\n },\n {\n x: 0.09375,\n y: 0.15625,\n },\n {\n x: 0.15625,\n y: 0.15625,\n },\n {\n x: 0.15625,\n y: 0.15625,\n },\n {\n x: 0.21875,\n y: 0.15625,\n },\n {\n x: 0.21875,\n y: 0.15625,\n },\n {\n x: 0.28125,\n y: 0.15625,\n },\n {\n x: 0.28125,\n y: 0.15625,\n },\n {\n x: 0.34375,\n y: 0.15625,\n },\n {\n x: 0.34375,\n y: 0.15625,\n },\n {\n x: 0.40625,\n y: 0.15625,\n },\n {\n x: 0.40625,\n y: 0.15625,\n },\n {\n x: 0.46875,\n y: 0.15625,\n },\n {\n x: 0.46875,\n y: 0.15625,\n },\n {\n x: 0.53125,\n y: 0.15625,\n },\n {\n x: 0.53125,\n y: 0.15625,\n },\n {\n x: 0.59375,\n y: 0.15625,\n },\n {\n x: 0.59375,\n y: 0.15625,\n },\n {\n x: 0.65625,\n y: 0.15625,\n },\n {\n x: 0.65625,\n y: 0.15625,\n },\n {\n x: 0.71875,\n y: 0.15625,\n },\n {\n x: 0.71875,\n y: 0.15625,\n },\n {\n x: 0.78125,\n y: 0.15625,\n },\n {\n x: 0.78125,\n y: 0.15625,\n },\n {\n x: 0.84375,\n y: 0.15625,\n },\n {\n x: 0.84375,\n y: 0.15625,\n },\n {\n x: 0.90625,\n y: 0.15625,\n },\n {\n x: 0.90625,\n y: 0.15625,\n },\n {\n x: 0.96875,\n y: 0.15625,\n },\n {\n x: 0.96875,\n y: 0.15625,\n },\n {\n x: 0.03125,\n y: 0.21875,\n },\n {\n x: 0.03125,\n y: 0.21875,\n },\n {\n x: 0.09375,\n y: 0.21875,\n },\n {\n x: 0.09375,\n y: 0.21875,\n },\n {\n x: 0.15625,\n y: 0.21875,\n },\n {\n x: 0.15625,\n y: 0.21875,\n },\n {\n x: 0.21875,\n y: 0.21875,\n },\n {\n x: 0.21875,\n y: 0.21875,\n },\n {\n x: 0.28125,\n y: 0.21875,\n },\n {\n x: 0.28125,\n y: 0.21875,\n },\n {\n x: 0.34375,\n y: 0.21875,\n },\n {\n x: 0.34375,\n y: 0.21875,\n },\n {\n x: 0.40625,\n y: 0.21875,\n },\n {\n x: 0.40625,\n y: 0.21875,\n },\n {\n x: 0.46875,\n y: 0.21875,\n },\n {\n x: 0.46875,\n y: 0.21875,\n },\n {\n x: 0.53125,\n y: 0.21875,\n },\n {\n x: 0.53125,\n y: 0.21875,\n },\n {\n x: 0.59375,\n y: 0.21875,\n },\n {\n x: 0.59375,\n y: 0.21875,\n },\n {\n x: 0.65625,\n y: 0.21875,\n },\n {\n x: 0.65625,\n y: 0.21875,\n },\n {\n x: 0.71875,\n y: 0.21875,\n },\n {\n x: 0.71875,\n y: 0.21875,\n },\n {\n x: 0.78125,\n y: 0.21875,\n },\n {\n x: 0.78125,\n y: 0.21875,\n },\n {\n x: 0.84375,\n y: 0.21875,\n },\n {\n x: 0.84375,\n y: 0.21875,\n },\n {\n x: 0.90625,\n y: 0.21875,\n },\n {\n x: 0.90625,\n y: 0.21875,\n },\n {\n x: 0.96875,\n y: 0.21875,\n },\n {\n x: 0.96875,\n y: 0.21875,\n },\n {\n x: 0.03125,\n y: 0.28125,\n },\n {\n x: 0.03125,\n y: 0.28125,\n },\n {\n x: 0.09375,\n y: 0.28125,\n },\n {\n x: 0.09375,\n y: 0.28125,\n },\n {\n x: 0.15625,\n y: 0.28125,\n },\n {\n x: 0.15625,\n y: 0.28125,\n },\n {\n x: 0.21875,\n y: 0.28125,\n },\n {\n x: 0.21875,\n y: 0.28125,\n },\n {\n x: 0.28125,\n y: 0.28125,\n },\n {\n x: 0.28125,\n y: 0.28125,\n },\n {\n x: 0.34375,\n y: 0.28125,\n },\n {\n x: 0.34375,\n y: 0.28125,\n },\n {\n x: 0.40625,\n y: 0.28125,\n },\n {\n x: 0.40625,\n y: 0.28125,\n },\n {\n x: 0.46875,\n y: 0.28125,\n },\n {\n x: 0.46875,\n y: 0.28125,\n },\n {\n x: 0.53125,\n y: 0.28125,\n },\n {\n x: 0.53125,\n y: 0.28125,\n },\n {\n x: 0.59375,\n y: 0.28125,\n },\n {\n x: 0.59375,\n y: 0.28125,\n },\n {\n x: 0.65625,\n y: 0.28125,\n },\n {\n x: 0.65625,\n y: 0.28125,\n },\n {\n x: 0.71875,\n y: 0.28125,\n },\n {\n x: 0.71875,\n y: 0.28125,\n },\n {\n x: 0.78125,\n y: 0.28125,\n },\n {\n x: 0.78125,\n y: 0.28125,\n },\n {\n x: 0.84375,\n y: 0.28125,\n },\n {\n x: 0.84375,\n y: 0.28125,\n },\n {\n x: 0.90625,\n y: 0.28125,\n },\n {\n x: 0.90625,\n y: 0.28125,\n },\n {\n x: 0.96875,\n y: 0.28125,\n },\n {\n x: 0.96875,\n y: 0.28125,\n },\n {\n x: 0.03125,\n y: 0.34375,\n },\n {\n x: 0.03125,\n y: 0.34375,\n },\n {\n x: 0.09375,\n y: 0.34375,\n },\n {\n x: 0.09375,\n y: 0.34375,\n },\n {\n x: 0.15625,\n y: 0.34375,\n },\n {\n x: 0.15625,\n y: 0.34375,\n },\n {\n x: 0.21875,\n y: 0.34375,\n },\n {\n x: 0.21875,\n y: 0.34375,\n },\n {\n x: 0.28125,\n y: 0.34375,\n },\n {\n x: 0.28125,\n y: 0.34375,\n },\n {\n x: 0.34375,\n y: 0.34375,\n },\n {\n x: 0.34375,\n y: 0.34375,\n },\n {\n x: 0.40625,\n y: 0.34375,\n },\n {\n x: 0.40625,\n y: 0.34375,\n },\n {\n x: 0.46875,\n y: 0.34375,\n },\n {\n x: 0.46875,\n y: 0.34375,\n },\n {\n x: 0.53125,\n y: 0.34375,\n },\n {\n x: 0.53125,\n y: 0.34375,\n },\n {\n x: 0.59375,\n y: 0.34375,\n },\n {\n x: 0.59375,\n y: 0.34375,\n },\n {\n x: 0.65625,\n y: 0.34375,\n },\n {\n x: 0.65625,\n y: 0.34375,\n },\n {\n x: 0.71875,\n y: 0.34375,\n },\n {\n x: 0.71875,\n y: 0.34375,\n },\n {\n x: 0.78125,\n y: 0.34375,\n },\n {\n x: 0.78125,\n y: 0.34375,\n },\n {\n x: 0.84375,\n y: 0.34375,\n },\n {\n x: 0.84375,\n y: 0.34375,\n },\n {\n x: 0.90625,\n y: 0.34375,\n },\n {\n x: 0.90625,\n y: 0.34375,\n },\n {\n x: 0.96875,\n y: 0.34375,\n },\n {\n x: 0.96875,\n y: 0.34375,\n },\n {\n x: 0.03125,\n y: 0.40625,\n },\n {\n x: 0.03125,\n y: 0.40625,\n },\n {\n x: 0.09375,\n y: 0.40625,\n },\n {\n x: 0.09375,\n y: 0.40625,\n },\n {\n x: 0.15625,\n y: 0.40625,\n },\n {\n x: 0.15625,\n y: 0.40625,\n },\n {\n x: 0.21875,\n y: 0.40625,\n },\n {\n x: 0.21875,\n y: 0.40625,\n },\n {\n x: 0.28125,\n y: 0.40625,\n },\n {\n x: 0.28125,\n y: 0.40625,\n },\n {\n x: 0.34375,\n y: 0.40625,\n },\n {\n x: 0.34375,\n y: 0.40625,\n },\n {\n x: 0.40625,\n y: 0.40625,\n },\n {\n x: 0.40625,\n y: 0.40625,\n },\n {\n x: 0.46875,\n y: 0.40625,\n },\n {\n x: 0.46875,\n y: 0.40625,\n },\n {\n x: 0.53125,\n y: 0.40625,\n },\n {\n x: 0.53125,\n y: 0.40625,\n },\n {\n x: 0.59375,\n y: 0.40625,\n },\n {\n x: 0.59375,\n y: 0.40625,\n },\n {\n x: 0.65625,\n y: 0.40625,\n },\n {\n x: 0.65625,\n y: 0.40625,\n },\n {\n x: 0.71875,\n y: 0.40625,\n },\n {\n x: 0.71875,\n y: 0.40625,\n },\n {\n x: 0.78125,\n y: 0.40625,\n },\n {\n x: 0.78125,\n y: 0.40625,\n },\n {\n x: 0.84375,\n y: 0.40625,\n },\n {\n x: 0.84375,\n y: 0.40625,\n },\n {\n x: 0.90625,\n y: 0.40625,\n },\n {\n x: 0.90625,\n y: 0.40625,\n },\n {\n x: 0.96875,\n y: 0.40625,\n },\n {\n x: 0.96875,\n y: 0.40625,\n },\n {\n x: 0.03125,\n y: 0.46875,\n },\n {\n x: 0.03125,\n y: 0.46875,\n },\n {\n x: 0.09375,\n y: 0.46875,\n },\n {\n x: 0.09375,\n y: 0.46875,\n },\n {\n x: 0.15625,\n y: 0.46875,\n },\n {\n x: 0.15625,\n y: 0.46875,\n },\n {\n x: 0.21875,\n y: 0.46875,\n },\n {\n x: 0.21875,\n y: 0.46875,\n },\n {\n x: 0.28125,\n y: 0.46875,\n },\n {\n x: 0.28125,\n y: 0.46875,\n },\n {\n x: 0.34375,\n y: 0.46875,\n },\n {\n x: 0.34375,\n y: 0.46875,\n },\n {\n x: 0.40625,\n y: 0.46875,\n },\n {\n x: 0.40625,\n y: 0.46875,\n },\n {\n x: 0.46875,\n y: 0.46875,\n },\n {\n x: 0.46875,\n y: 0.46875,\n },\n {\n x: 0.53125,\n y: 0.46875,\n },\n {\n x: 0.53125,\n y: 0.46875,\n },\n {\n x: 0.59375,\n y: 0.46875,\n },\n {\n x: 0.59375,\n y: 0.46875,\n },\n {\n x: 0.65625,\n y: 0.46875,\n },\n {\n x: 0.65625,\n y: 0.46875,\n },\n {\n x: 0.71875,\n y: 0.46875,\n },\n {\n x: 0.71875,\n y: 0.46875,\n },\n {\n x: 0.78125,\n y: 0.46875,\n },\n {\n x: 0.78125,\n y: 0.46875,\n },\n {\n x: 0.84375,\n y: 0.46875,\n },\n {\n x: 0.84375,\n y: 0.46875,\n },\n {\n x: 0.90625,\n y: 0.46875,\n },\n {\n x: 0.90625,\n y: 0.46875,\n },\n {\n x: 0.96875,\n y: 0.46875,\n },\n {\n x: 0.96875,\n y: 0.46875,\n },\n {\n x: 0.03125,\n y: 0.53125,\n },\n {\n x: 0.03125,\n y: 0.53125,\n },\n {\n x: 0.09375,\n y: 0.53125,\n },\n {\n x: 0.09375,\n y: 0.53125,\n },\n {\n x: 0.15625,\n y: 0.53125,\n },\n {\n x: 0.15625,\n y: 0.53125,\n },\n {\n x: 0.21875,\n y: 0.53125,\n },\n {\n x: 0.21875,\n y: 0.53125,\n },\n {\n x: 0.28125,\n y: 0.53125,\n },\n {\n x: 0.28125,\n y: 0.53125,\n },\n {\n x: 0.34375,\n y: 0.53125,\n },\n {\n x: 0.34375,\n y: 0.53125,\n },\n {\n x: 0.40625,\n y: 0.53125,\n },\n {\n x: 0.40625,\n y: 0.53125,\n },\n {\n x: 0.46875,\n y: 0.53125,\n },\n {\n x: 0.46875,\n y: 0.53125,\n },\n {\n x: 0.53125,\n y: 0.53125,\n },\n {\n x: 0.53125,\n y: 0.53125,\n },\n {\n x: 0.59375,\n y: 0.53125,\n },\n {\n x: 0.59375,\n y: 0.53125,\n },\n {\n x: 0.65625,\n y: 0.53125,\n },\n {\n x: 0.65625,\n y: 0.53125,\n },\n {\n x: 0.71875,\n y: 0.53125,\n },\n {\n x: 0.71875,\n y: 0.53125,\n },\n {\n x: 0.78125,\n y: 0.53125,\n },\n {\n x: 0.78125,\n y: 0.53125,\n },\n {\n x: 0.84375,\n y: 0.53125,\n },\n {\n x: 0.84375,\n y: 0.53125,\n },\n {\n x: 0.90625,\n y: 0.53125,\n },\n {\n x: 0.90625,\n y: 0.53125,\n },\n {\n x: 0.96875,\n y: 0.53125,\n },\n {\n x: 0.96875,\n y: 0.53125,\n },\n {\n x: 0.03125,\n y: 0.59375,\n },\n {\n x: 0.03125,\n y: 0.59375,\n },\n {\n x: 0.09375,\n y: 0.59375,\n },\n {\n x: 0.09375,\n y: 0.59375,\n },\n {\n x: 0.15625,\n y: 0.59375,\n },\n {\n x: 0.15625,\n y: 0.59375,\n },\n {\n x: 0.21875,\n y: 0.59375,\n },\n {\n x: 0.21875,\n y: 0.59375,\n },\n {\n x: 0.28125,\n y: 0.59375,\n },\n {\n x: 0.28125,\n y: 0.59375,\n },\n {\n x: 0.34375,\n y: 0.59375,\n },\n {\n x: 0.34375,\n y: 0.59375,\n },\n {\n x: 0.40625,\n y: 0.59375,\n },\n {\n x: 0.40625,\n y: 0.59375,\n },\n {\n x: 0.46875,\n y: 0.59375,\n },\n {\n x: 0.46875,\n y: 0.59375,\n },\n {\n x: 0.53125,\n y: 0.59375,\n },\n {\n x: 0.53125,\n y: 0.59375,\n },\n {\n x: 0.59375,\n y: 0.59375,\n },\n {\n x: 0.59375,\n y: 0.59375,\n },\n {\n x: 0.65625,\n y: 0.59375,\n },\n {\n x: 0.65625,\n y: 0.59375,\n },\n {\n x: 0.71875,\n y: 0.59375,\n },\n {\n x: 0.71875,\n y: 0.59375,\n },\n {\n x: 0.78125,\n y: 0.59375,\n },\n {\n x: 0.78125,\n y: 0.59375,\n },\n {\n x: 0.84375,\n y: 0.59375,\n },\n {\n x: 0.84375,\n y: 0.59375,\n },\n {\n x: 0.90625,\n y: 0.59375,\n },\n {\n x: 0.90625,\n y: 0.59375,\n },\n {\n x: 0.96875,\n y: 0.59375,\n },\n {\n x: 0.96875,\n y: 0.59375,\n },\n {\n x: 0.03125,\n y: 0.65625,\n },\n {\n x: 0.03125,\n y: 0.65625,\n },\n {\n x: 0.09375,\n y: 0.65625,\n },\n {\n x: 0.09375,\n y: 0.65625,\n },\n {\n x: 0.15625,\n y: 0.65625,\n },\n {\n x: 0.15625,\n y: 0.65625,\n },\n {\n x: 0.21875,\n y: 0.65625,\n },\n {\n x: 0.21875,\n y: 0.65625,\n },\n {\n x: 0.28125,\n y: 0.65625,\n },\n {\n x: 0.28125,\n y: 0.65625,\n },\n {\n x: 0.34375,\n y: 0.65625,\n },\n {\n x: 0.34375,\n y: 0.65625,\n },\n {\n x: 0.40625,\n y: 0.65625,\n },\n {\n x: 0.40625,\n y: 0.65625,\n },\n {\n x: 0.46875,\n y: 0.65625,\n },\n {\n x: 0.46875,\n y: 0.65625,\n },\n {\n x: 0.53125,\n y: 0.65625,\n },\n {\n x: 0.53125,\n y: 0.65625,\n },\n {\n x: 0.59375,\n y: 0.65625,\n },\n {\n x: 0.59375,\n y: 0.65625,\n },\n {\n x: 0.65625,\n y: 0.65625,\n },\n {\n x: 0.65625,\n y: 0.65625,\n },\n {\n x: 0.71875,\n y: 0.65625,\n },\n {\n x: 0.71875,\n y: 0.65625,\n },\n {\n x: 0.78125,\n y: 0.65625,\n },\n {\n x: 0.78125,\n y: 0.65625,\n },\n {\n x: 0.84375,\n y: 0.65625,\n },\n {\n x: 0.84375,\n y: 0.65625,\n },\n {\n x: 0.90625,\n y: 0.65625,\n },\n {\n x: 0.90625,\n y: 0.65625,\n },\n {\n x: 0.96875,\n y: 0.65625,\n },\n {\n x: 0.96875,\n y: 0.65625,\n },\n {\n x: 0.03125,\n y: 0.71875,\n },\n {\n x: 0.03125,\n y: 0.71875,\n },\n {\n x: 0.09375,\n y: 0.71875,\n },\n {\n x: 0.09375,\n y: 0.71875,\n },\n {\n x: 0.15625,\n y: 0.71875,\n },\n {\n x: 0.15625,\n y: 0.71875,\n },\n {\n x: 0.21875,\n y: 0.71875,\n },\n {\n x: 0.21875,\n y: 0.71875,\n },\n {\n x: 0.28125,\n y: 0.71875,\n },\n {\n x: 0.28125,\n y: 0.71875,\n },\n {\n x: 0.34375,\n y: 0.71875,\n },\n {\n x: 0.34375,\n y: 0.71875,\n },\n {\n x: 0.40625,\n y: 0.71875,\n },\n {\n x: 0.40625,\n y: 0.71875,\n },\n {\n x: 0.46875,\n y: 0.71875,\n },\n {\n x: 0.46875,\n y: 0.71875,\n },\n {\n x: 0.53125,\n y: 0.71875,\n },\n {\n x: 0.53125,\n y: 0.71875,\n },\n {\n x: 0.59375,\n y: 0.71875,\n },\n {\n x: 0.59375,\n y: 0.71875,\n },\n {\n x: 0.65625,\n y: 0.71875,\n },\n {\n x: 0.65625,\n y: 0.71875,\n },\n {\n x: 0.71875,\n y: 0.71875,\n },\n {\n x: 0.71875,\n y: 0.71875,\n },\n {\n x: 0.78125,\n y: 0.71875,\n },\n {\n x: 0.78125,\n y: 0.71875,\n },\n {\n x: 0.84375,\n y: 0.71875,\n },\n {\n x: 0.84375,\n y: 0.71875,\n },\n {\n x: 0.90625,\n y: 0.71875,\n },\n {\n x: 0.90625,\n y: 0.71875,\n },\n {\n x: 0.96875,\n y: 0.71875,\n },\n {\n x: 0.96875,\n y: 0.71875,\n },\n {\n x: 0.03125,\n y: 0.78125,\n },\n {\n x: 0.03125,\n y: 0.78125,\n },\n {\n x: 0.09375,\n y: 0.78125,\n },\n {\n x: 0.09375,\n y: 0.78125,\n },\n {\n x: 0.15625,\n y: 0.78125,\n },\n {\n x: 0.15625,\n y: 0.78125,\n },\n {\n x: 0.21875,\n y: 0.78125,\n },\n {\n x: 0.21875,\n y: 0.78125,\n },\n {\n x: 0.28125,\n y: 0.78125,\n },\n {\n x: 0.28125,\n y: 0.78125,\n },\n {\n x: 0.34375,\n y: 0.78125,\n },\n {\n x: 0.34375,\n y: 0.78125,\n },\n {\n x: 0.40625,\n y: 0.78125,\n },\n {\n x: 0.40625,\n y: 0.78125,\n },\n {\n x: 0.46875,\n y: 0.78125,\n },\n {\n x: 0.46875,\n y: 0.78125,\n },\n {\n x: 0.53125,\n y: 0.78125,\n },\n {\n x: 0.53125,\n y: 0.78125,\n },\n {\n x: 0.59375,\n y: 0.78125,\n },\n {\n x: 0.59375,\n y: 0.78125,\n },\n {\n x: 0.65625,\n y: 0.78125,\n },\n {\n x: 0.65625,\n y: 0.78125,\n },\n {\n x: 0.71875,\n y: 0.78125,\n },\n {\n x: 0.71875,\n y: 0.78125,\n },\n {\n x: 0.78125,\n y: 0.78125,\n },\n {\n x: 0.78125,\n y: 0.78125,\n },\n {\n x: 0.84375,\n y: 0.78125,\n },\n {\n x: 0.84375,\n y: 0.78125,\n },\n {\n x: 0.90625,\n y: 0.78125,\n },\n {\n x: 0.90625,\n y: 0.78125,\n },\n {\n x: 0.96875,\n y: 0.78125,\n },\n {\n x: 0.96875,\n y: 0.78125,\n },\n {\n x: 0.03125,\n y: 0.84375,\n },\n {\n x: 0.03125,\n y: 0.84375,\n },\n {\n x: 0.09375,\n y: 0.84375,\n },\n {\n x: 0.09375,\n y: 0.84375,\n },\n {\n x: 0.15625,\n y: 0.84375,\n },\n {\n x: 0.15625,\n y: 0.84375,\n },\n {\n x: 0.21875,\n y: 0.84375,\n },\n {\n x: 0.21875,\n y: 0.84375,\n },\n {\n x: 0.28125,\n y: 0.84375,\n },\n {\n x: 0.28125,\n y: 0.84375,\n },\n {\n x: 0.34375,\n y: 0.84375,\n },\n {\n x: 0.34375,\n y: 0.84375,\n },\n {\n x: 0.40625,\n y: 0.84375,\n },\n {\n x: 0.40625,\n y: 0.84375,\n },\n {\n x: 0.46875,\n y: 0.84375,\n },\n {\n x: 0.46875,\n y: 0.84375,\n },\n {\n x: 0.53125,\n y: 0.84375,\n },\n {\n x: 0.53125,\n y: 0.84375,\n },\n {\n x: 0.59375,\n y: 0.84375,\n },\n {\n x: 0.59375,\n y: 0.84375,\n },\n {\n x: 0.65625,\n y: 0.84375,\n },\n {\n x: 0.65625,\n y: 0.84375,\n },\n {\n x: 0.71875,\n y: 0.84375,\n },\n {\n x: 0.71875,\n y: 0.84375,\n },\n {\n x: 0.78125,\n y: 0.84375,\n },\n {\n x: 0.78125,\n y: 0.84375,\n },\n {\n x: 0.84375,\n y: 0.84375,\n },\n {\n x: 0.84375,\n y: 0.84375,\n },\n {\n x: 0.90625,\n y: 0.84375,\n },\n {\n x: 0.90625,\n y: 0.84375,\n },\n {\n x: 0.96875,\n y: 0.84375,\n },\n {\n x: 0.96875,\n y: 0.84375,\n },\n {\n x: 0.03125,\n y: 0.90625,\n },\n {\n x: 0.03125,\n y: 0.90625,\n },\n {\n x: 0.09375,\n y: 0.90625,\n },\n {\n x: 0.09375,\n y: 0.90625,\n },\n {\n x: 0.15625,\n y: 0.90625,\n },\n {\n x: 0.15625,\n y: 0.90625,\n },\n {\n x: 0.21875,\n y: 0.90625,\n },\n {\n x: 0.21875,\n y: 0.90625,\n },\n {\n x: 0.28125,\n y: 0.90625,\n },\n {\n x: 0.28125,\n y: 0.90625,\n },\n {\n x: 0.34375,\n y: 0.90625,\n },\n {\n x: 0.34375,\n y: 0.90625,\n },\n {\n x: 0.40625,\n y: 0.90625,\n },\n {\n x: 0.40625,\n y: 0.90625,\n },\n {\n x: 0.46875,\n y: 0.90625,\n },\n {\n x: 0.46875,\n y: 0.90625,\n },\n {\n x: 0.53125,\n y: 0.90625,\n },\n {\n x: 0.53125,\n y: 0.90625,\n },\n {\n x: 0.59375,\n y: 0.90625,\n },\n {\n x: 0.59375,\n y: 0.90625,\n },\n {\n x: 0.65625,\n y: 0.90625,\n },\n {\n x: 0.65625,\n y: 0.90625,\n },\n {\n x: 0.71875,\n y: 0.90625,\n },\n {\n x: 0.71875,\n y: 0.90625,\n },\n {\n x: 0.78125,\n y: 0.90625,\n },\n {\n x: 0.78125,\n y: 0.90625,\n },\n {\n x: 0.84375,\n y: 0.90625,\n },\n {\n x: 0.84375,\n y: 0.90625,\n },\n {\n x: 0.90625,\n y: 0.90625,\n },\n {\n x: 0.90625,\n y: 0.90625,\n },\n {\n x: 0.96875,\n y: 0.90625,\n },\n {\n x: 0.96875,\n y: 0.90625,\n },\n {\n x: 0.03125,\n y: 0.96875,\n },\n {\n x: 0.03125,\n y: 0.96875,\n },\n {\n x: 0.09375,\n y: 0.96875,\n },\n {\n x: 0.09375,\n y: 0.96875,\n },\n {\n x: 0.15625,\n y: 0.96875,\n },\n {\n x: 0.15625,\n y: 0.96875,\n },\n {\n x: 0.21875,\n y: 0.96875,\n },\n {\n x: 0.21875,\n y: 0.96875,\n },\n {\n x: 0.28125,\n y: 0.96875,\n },\n {\n x: 0.28125,\n y: 0.96875,\n },\n {\n x: 0.34375,\n y: 0.96875,\n },\n {\n x: 0.34375,\n y: 0.96875,\n },\n {\n x: 0.40625,\n y: 0.96875,\n },\n {\n x: 0.40625,\n y: 0.96875,\n },\n {\n x: 0.46875,\n y: 0.96875,\n },\n {\n x: 0.46875,\n y: 0.96875,\n },\n {\n x: 0.53125,\n y: 0.96875,\n },\n {\n x: 0.53125,\n y: 0.96875,\n },\n {\n x: 0.59375,\n y: 0.96875,\n },\n {\n x: 0.59375,\n y: 0.96875,\n },\n {\n x: 0.65625,\n y: 0.96875,\n },\n {\n x: 0.65625,\n y: 0.96875,\n },\n {\n x: 0.71875,\n y: 0.96875,\n },\n {\n x: 0.71875,\n y: 0.96875,\n },\n {\n x: 0.78125,\n y: 0.96875,\n },\n {\n x: 0.78125,\n y: 0.96875,\n },\n {\n x: 0.84375,\n y: 0.96875,\n },\n {\n x: 0.84375,\n y: 0.96875,\n },\n {\n x: 0.90625,\n y: 0.96875,\n },\n {\n x: 0.90625,\n y: 0.96875,\n },\n {\n x: 0.96875,\n y: 0.96875,\n },\n {\n x: 0.96875,\n y: 0.96875,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n];\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as anchors from './anchors';\n\nexport class HandDetector {\n model: any;\n anchors: any;\n anchorsTensor: any;\n inputSize: number;\n inputSizeTensor: any;\n doubleInputSizeTensor: any;\n\n constructor(model) {\n this.model = model;\n this.anchors = anchors.anchors.map((anchor) => [anchor.x, anchor.y]);\n this.anchorsTensor = tf.tensor2d(this.anchors);\n this.inputSize = this.model?.inputs[0].shape[2];\n this.inputSizeTensor = tf.tensor1d([this.inputSize, this.inputSize]);\n this.doubleInputSizeTensor = tf.tensor1d([this.inputSize * 2, this.inputSize * 2]);\n }\n\n normalizeBoxes(boxes) {\n return tf.tidy(() => {\n const boxOffsets = tf.slice(boxes, [0, 0], [-1, 2]);\n const boxSizes = tf.slice(boxes, [0, 2], [-1, 2]);\n const boxCenterPoints = tf.add(tf.div(boxOffsets, this.inputSizeTensor), this.anchorsTensor);\n const halfBoxSizes = tf.div(boxSizes, this.doubleInputSizeTensor);\n const startPoints = tf.mul(tf.sub(boxCenterPoints, halfBoxSizes), this.inputSizeTensor);\n const endPoints = tf.mul(tf.add(boxCenterPoints, halfBoxSizes), this.inputSizeTensor);\n return tf.concat2d([startPoints, endPoints], 1);\n });\n }\n\n normalizeLandmarks(rawPalmLandmarks, index) {\n return tf.tidy(() => {\n const landmarks = tf.add(tf.div(rawPalmLandmarks.reshape([-1, 7, 2]), this.inputSizeTensor), this.anchors[index]);\n return tf.mul(landmarks, this.inputSizeTensor);\n });\n }\n\n async getBoxes(input, config) {\n const batched = this.model.predict(input);\n const predictions = batched.squeeze();\n batched.dispose();\n const scoresT = tf.tidy(() => tf.sigmoid(tf.slice(predictions, [0, 0], [-1, 1])).squeeze());\n const scores = scoresT.dataSync();\n const rawBoxes = tf.slice(predictions, [0, 1], [-1, 4]);\n const boxes = this.normalizeBoxes(rawBoxes);\n rawBoxes.dispose();\n const filteredT = await tf.image.nonMaxSuppressionAsync(boxes, scores, config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence);\n const filtered = filteredT.arraySync();\n\n scoresT.dispose();\n filteredT.dispose();\n const hands: Array<{ box: any, palmLandmarks: any, confidence: number }> = [];\n for (const index of filtered) {\n if (scores[index] >= config.hand.minConfidence) {\n const matchingBox = tf.slice(boxes, [index, 0], [1, -1]);\n const rawPalmLandmarks = tf.slice(predictions, [index, 5], [1, 14]);\n const palmLandmarks = tf.tidy(() => this.normalizeLandmarks(rawPalmLandmarks, index).reshape([-1, 2]));\n rawPalmLandmarks.dispose();\n hands.push({ box: matchingBox, palmLandmarks, confidence: scores[index] });\n }\n }\n predictions.dispose();\n boxes.dispose();\n return hands;\n }\n\n async estimateHandBounds(input, config) {\n const inputHeight = input.shape[1];\n const inputWidth = input.shape[2];\n const image = tf.tidy(() => input.resizeBilinear([this.inputSize, this.inputSize]).div(127.5).sub(1));\n const predictions = await this.getBoxes(image, config);\n image.dispose();\n const hands: Array<{}> = [];\n if (!predictions || predictions.length === 0) return hands;\n for (const prediction of predictions) {\n const boxes = prediction.box.dataSync();\n const startPoint = boxes.slice(0, 2);\n const endPoint = boxes.slice(2, 4);\n const palmLandmarks = prediction.palmLandmarks.arraySync();\n prediction.box.dispose();\n prediction.palmLandmarks.dispose();\n hands.push(box.scaleBoxCoordinates({ startPoint, endPoint, palmLandmarks, confidence: prediction.confidence }, [inputWidth / this.inputSize, inputHeight / this.inputSize]));\n }\n return hands;\n }\n}\n", "export function normalizeRadians(angle) {\n return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n}\n\nexport function computeRotation(point1, point2) {\n const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]);\n return normalizeRadians(radians);\n}\n\nexport const buildTranslationMatrix = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]];\n\nexport function dot(v1, v2) {\n let product = 0;\n for (let i = 0; i < v1.length; i++) {\n product += v1[i] * v2[i];\n }\n return product;\n}\n\nexport function getColumnFrom2DArr(arr, columnIndex) {\n const column: Array = [];\n for (let i = 0; i < arr.length; i++) {\n column.push(arr[i][columnIndex]);\n }\n return column;\n}\n\nexport function multiplyTransformMatrices(mat1, mat2) {\n const product: Array = [];\n const size = mat1.length;\n for (let row = 0; row < size; row++) {\n product.push([]);\n for (let col = 0; col < size; col++) {\n product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n }\n }\n return product;\n}\n\nexport function buildRotationMatrix(rotation, center) {\n const cosA = Math.cos(rotation);\n const sinA = Math.sin(rotation);\n const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]];\n const translationMatrix = buildTranslationMatrix(center[0], center[1]);\n const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix);\n const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]);\n return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix);\n}\n\nexport function invertTransformMatrix(matrix) {\n const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]];\n const translationComponent = [matrix[0][2], matrix[1][2]];\n const invertedTranslation = [\n -dot(rotationComponent[0], translationComponent),\n -dot(rotationComponent[1], translationComponent),\n ];\n return [\n rotationComponent[0].concat(invertedTranslation[0]),\n rotationComponent[1].concat(invertedTranslation[1]),\n [0, 0, 1],\n ];\n}\n\nexport function rotatePoint(homogeneousCoordinate, rotationMatrix) {\n return [\n dot(homogeneousCoordinate, rotationMatrix[0]),\n dot(homogeneousCoordinate, rotationMatrix[1]),\n ];\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as util from './util';\n\nconst palmBoxEnlargeFactor = 5; // default 3\nconst handBoxEnlargeFactor = 1.65; // default 1.65\nconst palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2];\nconst palmLandmarksPalmBase = 0;\nconst palmLandmarksMiddleFingerBase = 2;\n\nexport class HandPipeline {\n handDetector: any;\n landmarkDetector: any;\n inputSize: number;\n storedBoxes: any;\n skipped: number;\n detectedHands: number;\n\n constructor(handDetector, landmarkDetector) {\n this.handDetector = handDetector;\n this.landmarkDetector = landmarkDetector;\n this.inputSize = this.landmarkDetector?.inputs[0].shape[2];\n this.storedBoxes = [];\n this.skipped = 0;\n this.detectedHands = 0;\n }\n\n // eslint-disable-next-line class-methods-use-this\n calculateLandmarksBoundingBox(landmarks) {\n const xs = landmarks.map((d) => d[0]);\n const ys = landmarks.map((d) => d[1]);\n const startPoint = [Math.min(...xs), Math.min(...ys)];\n const endPoint = [Math.max(...xs), Math.max(...ys)];\n return { startPoint, endPoint };\n }\n\n getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) {\n const rotatedPalmLandmarks = palmLandmarks.map((coord) => util.rotatePoint([...coord, 1], rotationMatrix));\n const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks);\n return box.enlargeBox(box.squarifyBox(boxAroundPalm), palmBoxEnlargeFactor);\n }\n\n getBoxForHandLandmarks(landmarks) {\n const boundingBox = this.calculateLandmarksBoundingBox(landmarks);\n const boxAroundHand = box.enlargeBox(box.squarifyBox(boundingBox), handBoxEnlargeFactor);\n boxAroundHand.palmLandmarks = [];\n for (let i = 0; i < palmLandmarkIds.length; i++) {\n boxAroundHand.palmLandmarks.push(landmarks[palmLandmarkIds[i]].slice(0, 2));\n }\n return boxAroundHand;\n }\n\n transformRawCoords(rawCoords, box2, angle, rotationMatrix) {\n const boxSize = box.getBoxSize(box2);\n const scaleFactor = [boxSize[0] / this.inputSize, boxSize[1] / this.inputSize, (boxSize[0] + boxSize[1]) / this.inputSize / 2];\n const coordsScaled = rawCoords.map((coord) => [\n scaleFactor[0] * (coord[0] - this.inputSize / 2),\n scaleFactor[1] * (coord[1] - this.inputSize / 2),\n scaleFactor[2] * coord[2],\n ]);\n const coordsRotationMatrix = util.buildRotationMatrix(angle, [0, 0]);\n const coordsRotated = coordsScaled.map((coord) => {\n const rotated = util.rotatePoint(coord, coordsRotationMatrix);\n return [...rotated, coord[2]];\n });\n const inverseRotationMatrix = util.invertTransformMatrix(rotationMatrix);\n const boxCenter = [...box.getBoxCenter(box2), 1];\n const originalBoxCenter = [\n util.dot(boxCenter, inverseRotationMatrix[0]),\n util.dot(boxCenter, inverseRotationMatrix[1]),\n ];\n return coordsRotated.map((coord) => [\n coord[0] + originalBoxCenter[0],\n coord[1] + originalBoxCenter[1],\n coord[2],\n ]);\n }\n\n async estimateHands(image, config) {\n let useFreshBox = false;\n\n // run new detector every skipFrames unless we only want box to start with\n let boxes;\n\n if ((this.skipped === 0) || (this.skipped > config.hand.skipFrames) || !config.hand.landmarks || !config.skipFrame) {\n boxes = await this.handDetector.estimateHandBounds(image, config);\n this.skipped = 0;\n }\n if (config.skipFrame) this.skipped++;\n\n // if detector result count doesn't match current working set, use it to reset current working set\n if (boxes && (boxes.length > 0) && ((boxes.length !== this.detectedHands) && (this.detectedHands !== config.hand.maxDetected) || !config.hand.landmarks)) {\n this.detectedHands = 0;\n this.storedBoxes = [...boxes];\n // for (const possible of boxes) this.storedBoxes.push(possible);\n if (this.storedBoxes.length > 0) useFreshBox = true;\n }\n const hands: Array<{}> = [];\n\n // go through working set of boxes\n for (let i = 0; i < this.storedBoxes.length; i++) {\n const currentBox = this.storedBoxes[i];\n if (!currentBox) continue;\n if (config.hand.landmarks) {\n const angle = config.hand.rotation ? util.computeRotation(currentBox.palmLandmarks[palmLandmarksPalmBase], currentBox.palmLandmarks[palmLandmarksMiddleFingerBase]) : 0;\n const palmCenter = box.getBoxCenter(currentBox);\n const palmCenterNormalized = [palmCenter[0] / image.shape[2], palmCenter[1] / image.shape[1]];\n const rotatedImage = config.hand.rotation ? tf.image.rotateWithOffset(image, angle, 0, palmCenterNormalized) : image.clone();\n const rotationMatrix = util.buildRotationMatrix(-angle, palmCenter);\n const newBox = useFreshBox ? this.getBoxForPalmLandmarks(currentBox.palmLandmarks, rotationMatrix) : currentBox;\n const croppedInput = box.cutBoxFromImageAndResize(newBox, rotatedImage, [this.inputSize, this.inputSize]);\n const handImage = croppedInput.div(255);\n croppedInput.dispose();\n rotatedImage.dispose();\n const [confidenceT, keypoints] = await this.landmarkDetector.predict(handImage);\n handImage.dispose();\n const confidence = confidenceT.dataSync()[0];\n confidenceT.dispose();\n if (confidence >= config.hand.minConfidence) {\n const keypointsReshaped = tf.reshape(keypoints, [-1, 3]);\n const rawCoords = keypointsReshaped.arraySync();\n keypoints.dispose();\n keypointsReshaped.dispose();\n const coords = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix);\n const nextBoundingBox = this.getBoxForHandLandmarks(coords);\n this.storedBoxes[i] = nextBoundingBox;\n const result = {\n landmarks: coords,\n confidence,\n box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint },\n };\n hands.push(result);\n } else {\n this.storedBoxes[i] = null;\n }\n keypoints.dispose();\n } else {\n // const enlarged = box.enlargeBox(box.squarifyBox(box.shiftBox(currentBox, HAND_BOX_SHIFT_VECTOR)), handBoxEnlargeFactor);\n const enlarged = box.enlargeBox(box.squarifyBox(currentBox), handBoxEnlargeFactor);\n const result = {\n confidence: currentBox.confidence,\n box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint },\n };\n hands.push(result);\n }\n }\n this.storedBoxes = this.storedBoxes.filter((a) => a !== null);\n this.detectedHands = hands.length;\n return hands;\n }\n}\n", "// paper: https://ai.googleblog.com/2020/08/on-device-real-time-body-pose-tracking.html\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as annotations from './annotations';\n\nlet model;\n\nexport async function load(config) {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\n model.width = parseInt(model.signature.inputs['input_1:0'].tensorShape.dim[2].size);\n model.height = parseInt(model.signature.inputs['input_1:0'].tensorShape.dim[1].size);\n if (!model || !model.modelUrl) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nexport async function predict(image, config) {\n if (!model) return null;\n if (!config.body.enabled) return null;\n const imgSize = { width: image.shape[2], height: image.shape[1] };\n const resize = tf.image.resizeBilinear(image, [model.width, model.height], false);\n const normalize = tf.div(resize, [255.0]);\n resize.dispose();\n const resT = await model.predict(normalize);\n const points = resT.find((t) => (t.size === 195 || t.size === 155)).dataSync(); // order of output tensors may change between models, full has 195 and upper has 155 items\n resT.forEach((t) => t.dispose());\n normalize.dispose();\n const keypoints: Array<{ id, part, position: { x, y, z }, score, presence }> = [];\n const labels = points.length === 195 ? annotations.full : annotations.upper; // full model has 39 keypoints, upper has 31 keypoints\n const depth = 5; // each points has x,y,z,visibility,presence\n for (let i = 0; i < points.length / depth; i++) {\n keypoints.push({\n id: i,\n part: labels[i],\n position: {\n x: Math.trunc(imgSize.width * points[depth * i + 0] / 255), // return normalized x value istead of 0..255\n y: Math.trunc(imgSize.height * points[depth * i + 1] / 255), // return normalized y value istead of 0..255\n z: Math.trunc(points[depth * i + 2]) + 0, // fix negative zero\n },\n score: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100, // reverse sigmoid value\n presence: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 4])))) / 100, // reverse sigmoid value\n });\n }\n const score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n return [{ score, keypoints }];\n}\n", "export const full = [\n 'nose',\n 'leftEyeInside',\n 'leftEye',\n 'leftEyeOutside',\n 'rightEyeInside',\n 'rightEye',\n 'rightEyeOutside',\n 'leftEar',\n 'rightEar',\n 'leftMouth',\n 'rightMouth',\n 'leftShoulder',\n 'rightShoulder',\n 'leftElbow',\n 'rightElbow',\n 'leftWrist',\n 'rightWrist',\n 'leftPalm',\n 'rightPalm',\n 'leftIndex',\n 'rightIndex',\n 'leftPinky',\n 'rightPinky',\n 'leftHip',\n 'rightHip',\n 'leftKnee',\n 'rightKnee',\n 'leftAnkle',\n 'rightAnkle',\n 'leftHeel',\n 'rightHeel',\n 'leftFoot',\n 'rightFoot',\n 'midHip',\n 'forehead',\n 'leftThumb',\n 'leftHand',\n 'rightThumb',\n 'rightHand',\n];\n\nexport const upper = [\n 'nose',\n 'leftEyeInside',\n 'leftEye',\n 'leftEyeOutside',\n 'rightEyeInside',\n 'rightEye',\n 'rightEyeOutside',\n 'leftEar',\n 'rightEar',\n 'leftMouth',\n 'rightMouth',\n 'leftShoulder',\n 'rightShoulder',\n 'leftElbow',\n 'rightElbow',\n 'left:15',\n 'right:16',\n 'left:17',\n 'right:18',\n 'left:19',\n 'right:20',\n 'left:21',\n 'right:22',\n 'leftChest',\n 'rightChest',\n 'neck',\n 'forehead',\n 'left:27',\n 'right:28',\n 'left:29',\n 'right:30',\n];\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { labels } from './labels';\nimport { Item } from '../result';\n\nlet model;\nlet last: Array = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nconst scaleBox = 2.5; // increase box size\n\nexport async function load(config) {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.object.modelPath));\n const inputs = Object.values(model.modelSignature['inputs']);\n model.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null;\n if (!model.inputSize) throw new Error(`Human: Cannot determine model inputSize: ${config.object.modelPath}`);\n if (!model || !model.modelUrl) log('load model failed:', config.object.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nasync function process(res, inputSize, outputShape, config) {\n let id = 0;\n let results: Array<{ score: number, strideSize: number, class: number, label: string, center: number[], centerRaw: number[], box: number[], boxRaw: number[] }> = [];\n for (const strideSize of [1, 2, 4]) { // try each stride size as it detects large/medium/small objects\n // find scores, boxes, classes\n tf.tidy(() => { // wrap in tidy to automatically deallocate temp tensors\n const baseSize = strideSize * 13; // 13x13=169, 26x26=676, 52x52=2704\n // find boxes and scores output depending on stride\n const scoresT = res.find((a) => (a.shape[1] === (baseSize ** 2) && a.shape[2] === labels.length))?.squeeze();\n const featuresT = res.find((a) => (a.shape[1] === (baseSize ** 2) && a.shape[2] < labels.length))?.squeeze();\n const boxesMax = featuresT.reshape([-1, 4, featuresT.shape[1] / 4]); // reshape [output] to [4, output / 4] where number is number of different features inside each stride\n const boxIdx = boxesMax.argMax(2).arraySync(); // what we need is indexes of features with highest scores, not values itself\n const scores = scoresT.arraySync(); // optionally use exponential scores or just as-is\n for (let i = 0; i < scoresT.shape[0]; i++) { // total strides (x * y matrix)\n for (let j = 0; j < scoresT.shape[1]; j++) { // one score for each class\n const score = scores[i][j]; // get score for current position\n if (score > config.object.minConfidence && j !== 61) {\n const cx = (0.5 + Math.trunc(i % baseSize)) / baseSize; // center.x normalized to range 0..1\n const cy = (0.5 + Math.trunc(i / baseSize)) / baseSize; // center.y normalized to range 0..1\n const boxOffset = boxIdx[i].map((a) => a * (baseSize / strideSize / inputSize)); // just grab indexes of features with highest scores\n const [x, y] = [\n cx - (scaleBox / strideSize * boxOffset[0]),\n cy - (scaleBox / strideSize * boxOffset[1]),\n ];\n const [w, h] = [\n cx + (scaleBox / strideSize * boxOffset[2]) - x,\n cy + (scaleBox / strideSize * boxOffset[3]) - y,\n ];\n let boxRaw = [x, y, w, h]; // results normalized to range 0..1\n boxRaw = boxRaw.map((a) => Math.max(0, Math.min(a, 1))); // fix out-of-bounds coords\n const box = [ // results normalized to input image pixels\n boxRaw[0] * outputShape[0],\n boxRaw[1] * outputShape[1],\n boxRaw[2] * outputShape[0],\n boxRaw[3] * outputShape[1],\n ];\n const result = {\n id: id++,\n strideSize,\n score: Math.round(100 * score) / 100,\n class: j + 1,\n label: labels[j].label,\n center: [Math.trunc(outputShape[0] * cx), Math.trunc(outputShape[1] * cy)],\n centerRaw: [cx, cy],\n box: box.map((a) => Math.trunc(a)),\n boxRaw,\n };\n results.push(result);\n }\n }\n }\n });\n }\n // deallocate tensors\n res.forEach((t) => tf.dispose(t));\n\n // normally nms is run on raw results, but since boxes need to be calculated this way we skip calulcation of\n // unnecessary boxes and run nms only on good candidates (basically it just does IOU analysis as scores are already filtered)\n const nmsBoxes = results.map((a) => [a.boxRaw[1], a.boxRaw[0], a.boxRaw[3], a.boxRaw[2]]); // switches coordinates from x,y to y,x as expected by tf.nms\n const nmsScores = results.map((a) => a.score);\n let nmsIdx: any[] = [];\n if (nmsBoxes && nmsBoxes.length > 0) {\n const nms = await tf.image.nonMaxSuppressionAsync(nmsBoxes, nmsScores, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence);\n nmsIdx = nms.dataSync();\n tf.dispose(nms);\n }\n\n // filter & sort results\n results = results\n .filter((a, idx) => nmsIdx.includes(idx))\n .sort((a, b) => (b.score - a.score));\n\n return results;\n}\n\nexport async function predict(image, config): Promise {\n if ((skipped < config.object.skipFrames) && config.skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const outputSize = [image.shape[2], image.shape[1]];\n const resize = tf.image.resizeBilinear(image, [model.inputSize, model.inputSize], false);\n const norm = resize.div(255);\n const transpose = norm.transpose([0, 3, 1, 2]);\n norm.dispose();\n resize.dispose();\n\n let objectT;\n if (config.object.enabled) objectT = await model.predict(transpose);\n transpose.dispose();\n\n const obj = await process(objectT, model.inputSize, outputSize, config);\n last = obj;\n resolve(obj);\n });\n}\n", "export const labels = [\n { class: 1, label: 'person' },\n { class: 2, label: 'bicycle' },\n { class: 3, label: 'car' },\n { class: 4, label: 'motorcycle' },\n { class: 5, label: 'airplane' },\n { class: 6, label: 'bus' },\n { class: 7, label: 'train' },\n { class: 8, label: 'truck' },\n { class: 9, label: 'boat' },\n { class: 10, label: 'traffic light' },\n { class: 11, label: 'fire hydrant' },\n { class: 12, label: 'stop sign' },\n { class: 13, label: 'parking meter' },\n { class: 14, label: 'bench' },\n { class: 15, label: 'bird' },\n { class: 16, label: 'cat' },\n { class: 17, label: 'dog' },\n { class: 18, label: 'horse' },\n { class: 19, label: 'sheep' },\n { class: 20, label: 'cow' },\n { class: 21, label: 'elephant' },\n { class: 22, label: 'bear' },\n { class: 23, label: 'zebra' },\n { class: 24, label: 'giraffe' },\n { class: 25, label: 'backpack' },\n { class: 26, label: 'umbrella' },\n { class: 27, label: 'handbag' },\n { class: 28, label: 'tie' },\n { class: 29, label: 'suitcase' },\n { class: 30, label: 'frisbee' },\n { class: 31, label: 'skis' },\n { class: 32, label: 'snowboard' },\n { class: 33, label: 'sports ball' },\n { class: 34, label: 'kite' },\n { class: 35, label: 'baseball bat' },\n { class: 36, label: 'baseball glove' },\n { class: 37, label: 'skateboard' },\n { class: 38, label: 'surfboard' },\n { class: 39, label: 'tennis racket' },\n { class: 40, label: 'bottle' },\n { class: 41, label: 'wine glass' },\n { class: 42, label: 'cup' },\n { class: 43, label: 'fork' },\n { class: 44, label: 'knife' },\n { class: 45, label: 'spoon' },\n { class: 46, label: 'bowl' },\n { class: 47, label: 'banana' },\n { class: 48, label: 'apple' },\n { class: 49, label: 'sandwich' },\n { class: 50, label: 'orange' },\n { class: 51, label: 'broccoli' },\n { class: 52, label: 'carrot' },\n { class: 53, label: 'hot dog' },\n { class: 54, label: 'pizza' },\n { class: 55, label: 'donut' },\n { class: 56, label: 'cake' },\n { class: 57, label: 'chair' },\n { class: 58, label: 'couch' },\n { class: 59, label: 'potted plant' },\n { class: 60, label: 'bed' },\n { class: 61, label: 'dining table' },\n { class: 62, label: 'toilet' },\n { class: 63, label: 'tv' },\n { class: 64, label: 'laptop' },\n { class: 65, label: 'mouse' },\n { class: 66, label: 'remote' },\n { class: 67, label: 'keyboard' },\n { class: 68, label: 'cell phone' },\n { class: 69, label: 'microwave' },\n { class: 70, label: 'oven' },\n { class: 71, label: 'toaster' },\n { class: 72, label: 'sink' },\n { class: 73, label: 'refrigerator' },\n { class: 74, label: 'book' },\n { class: 75, label: 'clock' },\n { class: 76, label: 'vase' },\n { class: 77, label: 'scissors' },\n { class: 78, label: 'teddy bear' },\n { class: 79, label: 'hair drier' },\n { class: 80, label: 'toothbrush' },\n];\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { labels } from './labels';\nimport { Item } from '../result';\n\nlet model;\nlet last: Item[] = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config) {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.object.modelPath));\n const inputs = Object.values(model.modelSignature['inputs']);\n model.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null;\n if (!model.inputSize) throw new Error(`Human: Cannot determine model inputSize: ${config.object.modelPath}`);\n if (!model || !model.modelUrl) log('load model failed:', config.object.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nasync function process(res, inputSize, outputShape, config) {\n const results: Array<{ score: number, class: number, label: string, box: number[], boxRaw: number[] }> = [];\n const detections = res.arraySync();\n const squeezeT = tf.squeeze(res);\n res.dispose();\n const arr = tf.split(squeezeT, 6, 1); // x1, y1, x2, y2, score, class\n squeezeT.dispose();\n const stackT = tf.stack([arr[1], arr[0], arr[3], arr[2]], 1); // tf.nms expects y, x\n const boxesT = stackT.squeeze();\n const scoresT = arr[4].squeeze();\n const classesT = arr[5].squeeze();\n arr.forEach((t) => t.dispose());\n // @ts-ignore boxesT type is not correctly inferred\n const nmsT = await tf.image.nonMaxSuppressionAsync(boxesT, scoresT, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence);\n boxesT.dispose();\n scoresT.dispose();\n classesT.dispose();\n const nms = nmsT.dataSync();\n nmsT.dispose();\n for (const id of nms) {\n const score = detections[0][id][4];\n const classVal = detections[0][id][5];\n const label = labels[classVal].label;\n const boxRaw = [\n detections[0][id][0] / inputSize,\n detections[0][id][1] / inputSize,\n detections[0][id][2] / inputSize,\n detections[0][id][3] / inputSize,\n ];\n const box = [\n Math.trunc(boxRaw[0] * outputShape[0]),\n Math.trunc(boxRaw[1] * outputShape[1]),\n Math.trunc(boxRaw[2] * outputShape[0]),\n Math.trunc(boxRaw[3] * outputShape[1]),\n ];\n results.push({ score, class: classVal, label, box, boxRaw });\n }\n return results;\n}\n\nexport async function predict(image, config): Promise {\n if ((skipped < config.object.skipFrames) && config.skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const outputSize = [image.shape[2], image.shape[1]];\n const resize = tf.image.resizeBilinear(image, [model.inputSize, model.inputSize], false);\n\n let objectT;\n if (config.object.enabled) objectT = model.execute(resize, 'tower_0/detections');\n resize.dispose();\n\n const obj = await process(objectT, model.inputSize, outputSize, config);\n last = obj;\n resolve(obj);\n });\n}\n", "import { Gesture } from '../result';\n\nexport const body = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ body: number, gesture: string }> = [];\n for (let i = 0; i < res.length; i++) {\n // raising hands\n const leftWrist = res[i].keypoints.find((a) => (a.part === 'leftWrist'));\n const rightWrist = res[i].keypoints.find((a) => (a.part === 'rightWrist'));\n const nose = res[i].keypoints.find((a) => (a.part === 'nose'));\n if (nose && leftWrist && rightWrist && (leftWrist.position.y < nose.position.y) && (rightWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'i give up' });\n else if (nose && leftWrist && (leftWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'raise left hand' });\n else if (nose && rightWrist && (rightWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'raise right hand' });\n\n // leaning\n const leftShoulder = res[i].keypoints.find((a) => (a.part === 'leftShoulder'));\n const rightShoulder = res[i].keypoints.find((a) => (a.part === 'rightShoulder'));\n if (leftShoulder && rightShoulder) gestures.push({ body: i, gesture: `leaning ${(leftShoulder.position.y > rightShoulder.position.y) ? 'left' : 'right'}` });\n }\n return gestures;\n};\n\nexport const face = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ face: number, gesture: string }> = [];\n for (let i = 0; i < res.length; i++) {\n if (res[i].mesh && res[i].mesh.length > 0) {\n const eyeFacing = res[i].mesh[33][2] - res[i].mesh[263][2];\n if (Math.abs(eyeFacing) < 10) gestures.push({ face: i, gesture: 'facing center' });\n else gestures.push({ face: i, gesture: `facing ${eyeFacing < 0 ? 'left' : 'right'}` });\n const openLeft = Math.abs(res[i].mesh[374][1] - res[i].mesh[386][1]) / Math.abs(res[i].mesh[443][1] - res[i].mesh[450][1]); // center of eye inner lid y coord div center of wider eye border y coord\n if (openLeft < 0.2) gestures.push({ face: i, gesture: 'blink left eye' });\n const openRight = Math.abs(res[i].mesh[145][1] - res[i].mesh[159][1]) / Math.abs(res[i].mesh[223][1] - res[i].mesh[230][1]); // center of eye inner lid y coord div center of wider eye border y coord\n if (openRight < 0.2) gestures.push({ face: i, gesture: 'blink right eye' });\n const mouthOpen = Math.min(100, 500 * Math.abs(res[i].mesh[13][1] - res[i].mesh[14][1]) / Math.abs(res[i].mesh[10][1] - res[i].mesh[152][1]));\n if (mouthOpen > 10) gestures.push({ face: i, gesture: `mouth ${Math.trunc(mouthOpen)}% open` });\n const chinDepth = res[i].mesh[152][2];\n if (Math.abs(chinDepth) > 10) gestures.push({ face: i, gesture: `head ${chinDepth < 0 ? 'up' : 'down'}` });\n }\n }\n return gestures;\n};\n\nexport const iris = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ iris: number, gesture: string }> = [];\n for (let i = 0; i < res.length; i++) {\n if (!res[i].annotations || !res[i].annotations.leftEyeIris || !res[i].annotations.rightEyeIris) continue;\n const sizeXLeft = res[i].annotations.leftEyeIris[3][0] - res[i].annotations.leftEyeIris[1][0];\n const sizeYLeft = res[i].annotations.leftEyeIris[4][1] - res[i].annotations.leftEyeIris[2][1];\n const areaLeft = Math.abs(sizeXLeft * sizeYLeft);\n\n const sizeXRight = res[i].annotations.rightEyeIris[3][0] - res[i].annotations.rightEyeIris[1][0];\n const sizeYRight = res[i].annotations.rightEyeIris[4][1] - res[i].annotations.rightEyeIris[2][1];\n const areaRight = Math.abs(sizeXRight * sizeYRight);\n\n let center = false;\n const difference = Math.abs(areaLeft - areaRight) / Math.max(areaLeft, areaRight);\n if (difference < 0.25) {\n center = true;\n gestures.push({ iris: i, gesture: 'facing center' });\n }\n\n const rightIrisCenterX = Math.abs(res[i].mesh[33][0] - res[i].annotations.rightEyeIris[0][0]) / res[i].annotations.rightEyeIris[0][0];\n const leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].annotations.leftEyeIris[0][0];\n if (leftIrisCenterX > 0.033 || rightIrisCenterX > 0.033) center = false;\n if (leftIrisCenterX > 0.033) gestures.push({ iris: i, gesture: 'looking right' });\n if (rightIrisCenterX > 0.033) gestures.push({ iris: i, gesture: 'looking left' });\n\n const rightIrisCenterY = Math.abs(res[i].mesh[145][1] - res[i].annotations.rightEyeIris[0][1]) / res[i].annotations.rightEyeIris[0][1];\n const leftIrisCenterY = Math.abs(res[i].mesh[374][1] - res[i].annotations.leftEyeIris[0][1]) / res[i].annotations.leftEyeIris[0][1];\n if (leftIrisCenterY < 0.015 || rightIrisCenterY < 0.015 || leftIrisCenterY > 0.030 || rightIrisCenterY > 0.030) center = false;\n if (leftIrisCenterY < 0.015 || rightIrisCenterY < 0.015) gestures.push({ iris: i, gesture: 'looking down' });\n if (leftIrisCenterY > 0.030 || rightIrisCenterY > 0.030) gestures.push({ iris: i, gesture: 'looking up' });\n\n // still center;\n if (center) gestures.push({ iris: i, gesture: 'looking center' });\n }\n return gestures;\n};\n\nexport const hand = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ hand: number, gesture: string }> = [];\n for (let i = 0; i < res.length; i++) {\n const fingers: Array<{ name: string, position: number }> = [];\n for (const [finger, pos] of Object.entries(res[i]['annotations'])) {\n if (finger !== 'palmBase' && Array.isArray(pos)) fingers.push({ name: finger.toLowerCase(), position: pos[0] }); // get tip of each finger\n }\n if (fingers && fingers.length > 0) {\n const closest = fingers.reduce((best, a) => (best.position[2] < a.position[2] ? best : a));\n const highest = fingers.reduce((best, a) => (best.position[1] < a.position[1] ? best : a));\n gestures.push({ hand: i, gesture: `${closest.name} forward ${highest.name} up` });\n }\n }\n return gestures;\n};\n", "/*\nWebGLImageFilter - MIT Licensed\n2013, Dominic Szablewski - phoboslab.org\n\n*/\n\nfunction GLProgram(gl, vertexSource, fragmentSource) {\n const _collect = function (source, prefix, collection) {\n const r = new RegExp('\\\\b' + prefix + ' \\\\w+ (\\\\w+)', 'ig');\n source.replace(r, (match, name) => {\n collection[name] = 0;\n return match;\n });\n };\n\n const _compile = function (source, type) {\n const shader = gl.createShader(type);\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) throw new Error('Filter: GL compile failed', gl.getShaderInfoLog(shader));\n return shader;\n };\n\n this.uniform = {};\n this.attribute = {};\n const _vsh = _compile(vertexSource, gl.VERTEX_SHADER);\n const _fsh = _compile(fragmentSource, gl.FRAGMENT_SHADER);\n this.id = gl.createProgram();\n gl.attachShader(this.id, _vsh);\n gl.attachShader(this.id, _fsh);\n gl.linkProgram(this.id);\n\n if (!gl.getProgramParameter(this.id, gl.LINK_STATUS)) throw new Error('Filter: GL link failed', gl.getProgramInfoLog(this.id));\n\n gl.useProgram(this.id);\n // Collect attributes\n _collect(vertexSource, 'attribute', this.attribute);\n for (const a in this.attribute) this.attribute[a] = gl.getAttribLocation(this.id, a);\n // Collect uniforms\n _collect(vertexSource, 'uniform', this.uniform);\n _collect(fragmentSource, 'uniform', this.uniform);\n for (const u in this.uniform) this.uniform[u] = gl.getUniformLocation(this.id, u);\n}\n\n// export const GLImageFilter = function (params) {\nexport function GLImageFilter(params) {\n if (!params) params = { };\n let _drawCount = 0;\n let _sourceTexture = null;\n let _lastInChain = false;\n let _currentFramebufferIndex = -1;\n let _tempFramebuffers = [null, null];\n let _filterChain = [];\n let _width = -1;\n let _height = -1;\n let _vertexBuffer = null;\n let _currentProgram = null;\n const _filter = {};\n const _canvas = params.canvas || document.createElement('canvas');\n // key is the shader program source, value is the compiled program\n const _shaderProgramCache = { };\n const DRAW = { INTERMEDIATE: 1 };\n const gl = _canvas.getContext('webgl');\n if (!gl) throw new Error('Filter: getContext() failed');\n\n this.addFilter = function (name) {\n // eslint-disable-next-line prefer-rest-params\n const args = Array.prototype.slice.call(arguments, 1);\n const filter = _filter[name];\n _filterChain.push({ func: filter, args });\n };\n\n this.reset = function () {\n _filterChain = [];\n };\n\n const _resize = function (width, height) {\n // Same width/height? Nothing to do here\n if (width === _width && height === _height) { return; }\n _canvas.width = width;\n _width = width;\n _canvas.height = height;\n _height = height;\n // Create the context if we don't have it yet\n if (!_vertexBuffer) {\n // Create the vertex buffer for the two triangles [x, y, u, v] * 6\n const vertices = new Float32Array([\n -1, -1, 0, 1, 1, -1, 1, 1, -1, 1, 0, 0,\n -1, 1, 0, 0, 1, -1, 1, 1, 1, 1, 1, 0,\n ]);\n // eslint-disable-next-line no-unused-expressions\n (_vertexBuffer = gl.createBuffer(), gl.bindBuffer(gl.ARRAY_BUFFER, _vertexBuffer));\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n }\n gl.viewport(0, 0, _width, _height);\n // Delete old temp framebuffers\n _tempFramebuffers = [null, null];\n };\n\n const _createFramebufferTexture = function (width, height) {\n const fbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n const renderbuffer = gl.createRenderbuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);\n const texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return { fbo, texture };\n };\n\n const _getTempFramebuffer = function (index) {\n _tempFramebuffers[index] = _tempFramebuffers[index] || _createFramebufferTexture(_width, _height);\n return _tempFramebuffers[index];\n };\n\n const _draw = function (flags = null) {\n let source = null;\n let target = null;\n let flipY = false;\n // Set up the source\n if (_drawCount === 0) {\n // First draw call - use the source texture\n source = _sourceTexture;\n } else {\n // All following draw calls use the temp buffer last drawn to\n source = _getTempFramebuffer(_currentFramebufferIndex)?.texture;\n }\n _drawCount++;\n // Set up the target\n if (_lastInChain && !(flags & DRAW.INTERMEDIATE)) {\n // Last filter in our chain - draw directly to the WebGL Canvas. We may\n // also have to flip the image vertically now\n target = null;\n flipY = _drawCount % 2 === 0;\n } else {\n // Intermediate draw call - get a temp buffer to draw to\n _currentFramebufferIndex = (_currentFramebufferIndex + 1) % 2;\n target = _getTempFramebuffer(_currentFramebufferIndex)?.fbo;\n }\n // Bind the source and target and draw the two triangles\n gl.bindTexture(gl.TEXTURE_2D, source);\n gl.bindFramebuffer(gl.FRAMEBUFFER, target);\n gl.uniform1f(_currentProgram.uniform.flipY, (flipY ? -1 : 1));\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n };\n\n this.apply = function (image) {\n _resize(image.width, image.height);\n _drawCount = 0;\n // Create the texture for the input image if we haven't yet\n if (!_sourceTexture) _sourceTexture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, _sourceTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n // No filters? Just draw\n if (_filterChain.length === 0) {\n // const program = _compileShader(SHADER.FRAGMENT_IDENTITY);\n _draw();\n return _canvas;\n }\n for (let i = 0; i < _filterChain.length; i++) {\n _lastInChain = (i === _filterChain.length - 1);\n const f = _filterChain[i];\n f.func.apply(this, f.args || []);\n }\n return _canvas;\n };\n\n const _compileShader = function (fragmentSource) {\n if (_shaderProgramCache[fragmentSource]) {\n _currentProgram = _shaderProgramCache[fragmentSource];\n gl.useProgram(_currentProgram.id);\n return _currentProgram;\n }\n // Compile shaders\n const SHADER = {};\n SHADER.VERTEX_IDENTITY = [\n 'precision highp float;',\n 'attribute vec2 pos;',\n 'attribute vec2 uv;',\n 'varying vec2 vUv;',\n 'uniform float flipY;',\n 'void main(void) {',\n 'vUv = uv;',\n 'gl_Position = vec4(pos.x, pos.y*flipY, 0.0, 1.);',\n '}',\n ].join('\\n');\n SHADER.FRAGMENT_IDENTITY = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'void main(void) {',\n 'gl_FragColor = texture2D(texture, vUv);',\n '}',\n ].join('\\n');\n _currentProgram = new GLProgram(gl, SHADER.VERTEX_IDENTITY, fragmentSource);\n const floatSize = Float32Array.BYTES_PER_ELEMENT;\n const vertSize = 4 * floatSize;\n gl.enableVertexAttribArray(_currentProgram.attribute.pos);\n gl.vertexAttribPointer(_currentProgram.attribute.pos, 2, gl.FLOAT, false, vertSize, 0 * floatSize);\n gl.enableVertexAttribArray(_currentProgram.attribute.uv);\n gl.vertexAttribPointer(_currentProgram.attribute.uv, 2, gl.FLOAT, false, vertSize, 2 * floatSize);\n _shaderProgramCache[fragmentSource] = _currentProgram;\n return _currentProgram;\n };\n\n // -------------------------------------------------------------------------\n // Color Matrix Filter\n _filter.colorMatrix = function (matrix) {\n // Create a Float32 Array and normalize the offset component to 0-1\n const m = new Float32Array(matrix);\n m[4] /= 255;\n m[9] /= 255;\n m[14] /= 255;\n m[19] /= 255;\n // Can we ignore the alpha value? Makes things a bit faster.\n const shader = (m[18] === 1 && m[3] === 0 && m[8] === 0 && m[13] === 0 && m[15] === 0 && m[16] === 0 && m[17] === 0 && m[19] === 0)\n ? _filter.colorMatrix.SHADER.WITHOUT_ALPHA\n : _filter.colorMatrix.SHADER.WITH_ALPHA;\n const program = _compileShader(shader);\n gl.uniform1fv(program.uniform.m, m);\n _draw();\n };\n _filter.colorMatrix.SHADER = {};\n _filter.colorMatrix.SHADER.WITH_ALPHA = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'uniform float m[20];',\n 'void main(void) {',\n 'vec4 c = texture2D(texture, vUv);',\n 'gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[3] * c.a + m[4];',\n 'gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[8] * c.a + m[9];',\n 'gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[13] * c.a + m[14];',\n 'gl_FragColor.a = m[15] * c.r + m[16] * c.g + m[17] * c.b + m[18] * c.a + m[19];',\n '}',\n ].join('\\n');\n _filter.colorMatrix.SHADER.WITHOUT_ALPHA = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'uniform float m[20];',\n 'void main(void) {',\n 'vec4 c = texture2D(texture, vUv);',\n 'gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[4];',\n 'gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[9];',\n 'gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[14];',\n 'gl_FragColor.a = c.a;',\n '}',\n ].join('\\n');\n\n _filter.brightness = function (brightness) {\n const b = (brightness || 0) + 1;\n _filter.colorMatrix([\n b, 0, 0, 0, 0,\n 0, b, 0, 0, 0,\n 0, 0, b, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.saturation = function (amount) {\n const x = (amount || 0) * 2 / 3 + 1;\n const y = ((x - 1) * -0.5);\n _filter.colorMatrix([\n x, y, y, 0, 0,\n y, x, y, 0, 0,\n y, y, x, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.desaturate = function () {\n _filter.saturation(-1);\n };\n\n _filter.contrast = function (amount) {\n const v = (amount || 0) + 1;\n const o = -128 * (v - 1);\n\n _filter.colorMatrix([\n v, 0, 0, 0, o,\n 0, v, 0, 0, o,\n 0, 0, v, 0, o,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.negative = function () {\n _filter.contrast(-2);\n };\n\n _filter.hue = function (rotation) {\n rotation = (rotation || 0) / 180 * Math.PI;\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const lumR = 0.213;\n const lumG = 0.715;\n const lumB = 0.072;\n\n _filter.colorMatrix([\n lumR + cos * (1 - lumR) + sin * (-lumR), lumG + cos * (-lumG) + sin * (-lumG), lumB + cos * (-lumB) + sin * (1 - lumB), 0, 0,\n lumR + cos * (-lumR) + sin * (0.143), lumG + cos * (1 - lumG) + sin * (0.140), lumB + cos * (-lumB) + sin * (-0.283), 0, 0,\n lumR + cos * (-lumR) + sin * (-(1 - lumR)), lumG + cos * (-lumG) + sin * (lumG), lumB + cos * (1 - lumB) + sin * (lumB), 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.desaturateLuminance = function () {\n _filter.colorMatrix([\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.sepia = function () {\n _filter.colorMatrix([\n 0.393, 0.7689999, 0.18899999, 0, 0,\n 0.349, 0.6859999, 0.16799999, 0, 0,\n 0.272, 0.5339999, 0.13099999, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.brownie = function () {\n _filter.colorMatrix([\n 0.5997023498159715, 0.34553243048391263, -0.2708298674538042, 0, 47.43192855600873,\n -0.037703249837783157, 0.8609577587992641, 0.15059552388459913, 0, -36.96841498319127,\n 0.24113635128153335, -0.07441037908422492, 0.44972182064877153, 0, -7.562075277591283,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.vintagePinhole = function () {\n _filter.colorMatrix([\n 0.6279345635605994, 0.3202183420819367, -0.03965408211312453, 0, 9.651285835294123,\n 0.02578397704808868, 0.6441188644374771, 0.03259127616149294, 0, 7.462829176470591,\n 0.0466055556782719, -0.0851232987247891, 0.5241648018700465, 0, 5.159190588235296,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.kodachrome = function () {\n _filter.colorMatrix([\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.technicolor = function () {\n _filter.colorMatrix([\n 1.9125277891456083, -0.8545344976951645, -0.09155508482755585, 0, 11.793603434377337,\n -0.3087833385928097, 1.7658908555458428, -0.10601743074722245, 0, -70.35205161461398,\n -0.231103377548616, -0.7501899197440212, 1.847597816108189, 0, 30.950940869491138,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.polaroid = function () {\n _filter.colorMatrix([\n 1.438, -0.062, -0.062, 0, 0,\n -0.122, 1.378, -0.122, 0, 0,\n -0.016, -0.016, 1.483, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.shiftToBGR = function () {\n _filter.colorMatrix([\n 0, 0, 1, 0, 0,\n 0, 1, 0, 0, 0,\n 1, 0, 0, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n // -------------------------------------------------------------------------\n // Convolution Filter\n _filter.convolution = function (matrix) {\n const m = new Float32Array(matrix);\n const pixelSizeX = 1 / _width;\n const pixelSizeY = 1 / _height;\n const program = _compileShader(_filter.convolution.SHADER);\n gl.uniform1fv(program.uniform.m, m);\n gl.uniform2f(program.uniform.px, pixelSizeX, pixelSizeY);\n _draw();\n };\n\n _filter.convolution.SHADER = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'uniform vec2 px;',\n 'uniform float m[9];',\n 'void main(void) {',\n 'vec4 c11 = texture2D(texture, vUv - px);', // top left\n 'vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y));', // top center\n 'vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y));', // top right\n 'vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) );', // mid left\n 'vec4 c22 = texture2D(texture, vUv);', // mid center\n 'vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) );', // mid right\n 'vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) );', // bottom left\n 'vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) );', // bottom center\n 'vec4 c33 = texture2D(texture, vUv + px );', // bottom right\n 'gl_FragColor = ',\n 'c11 * m[0] + c12 * m[1] + c22 * m[2] +',\n 'c21 * m[3] + c22 * m[4] + c23 * m[5] +',\n 'c31 * m[6] + c32 * m[7] + c33 * m[8];',\n 'gl_FragColor.a = c22.a;',\n '}',\n ].join('\\n');\n\n _filter.detectEdges = function () {\n _filter.convolution.call(this, [\n 0, 1, 0,\n 1, -4, 1,\n 0, 1, 0,\n ]);\n };\n\n _filter.sobelX = function () {\n _filter.convolution.call(this, [\n -1, 0, 1,\n -2, 0, 2,\n -1, 0, 1,\n ]);\n };\n\n _filter.sobelY = function () {\n _filter.convolution.call(this, [\n -1, -2, -1,\n 0, 0, 0,\n 1, 2, 1,\n ]);\n };\n\n _filter.sharpen = function (amount) {\n const a = amount || 1;\n _filter.convolution.call(this, [\n 0, -1 * a, 0,\n -1 * a, 1 + 4 * a, -1 * a,\n 0, -1 * a, 0,\n ]);\n };\n\n _filter.emboss = function (size) {\n const s = size || 1;\n _filter.convolution.call(this, [\n -2 * s, -1 * s, 0,\n -1 * s, 1, 1 * s,\n 0, 1 * s, 2 * s,\n ]);\n };\n\n // -------------------------------------------------------------------------\n // Blur Filter\n _filter.blur = function (size) {\n const blurSizeX = (size / 7) / _width;\n const blurSizeY = (size / 7) / _height;\n const program = _compileShader(_filter.blur.SHADER);\n // Vertical\n gl.uniform2f(program.uniform.px, 0, blurSizeY);\n _draw(DRAW.INTERMEDIATE);\n // Horizontal\n gl.uniform2f(program.uniform.px, blurSizeX, 0);\n _draw();\n };\n\n _filter.blur.SHADER = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'uniform vec2 px;',\n 'void main(void) {',\n 'gl_FragColor = vec4(0.0);',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-7.0*px.x, -7.0*px.y))*0.0044299121055113265;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-6.0*px.x, -6.0*px.y))*0.00895781211794;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-5.0*px.x, -5.0*px.y))*0.0215963866053;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-4.0*px.x, -4.0*px.y))*0.0443683338718;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-3.0*px.x, -3.0*px.y))*0.0776744219933;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-2.0*px.x, -2.0*px.y))*0.115876621105;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-1.0*px.x, -1.0*px.y))*0.147308056121;',\n 'gl_FragColor += texture2D(texture, vUv )*0.159576912161;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 1.0*px.x, 1.0*px.y))*0.147308056121;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 2.0*px.x, 2.0*px.y))*0.115876621105;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 3.0*px.x, 3.0*px.y))*0.0776744219933;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 4.0*px.x, 4.0*px.y))*0.0443683338718;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 5.0*px.x, 5.0*px.y))*0.0215963866053;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 6.0*px.x, 6.0*px.y))*0.00895781211794;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 7.0*px.x, 7.0*px.y))*0.0044299121055113265;',\n '}',\n ].join('\\n');\n\n // -------------------------------------------------------------------------\n // Pixelate Filter\n _filter.pixelate = function (size) {\n const blurSizeX = (size) / _width;\n const blurSizeY = (size) / _height;\n const program = _compileShader(_filter.pixelate.SHADER);\n // Horizontal\n gl.uniform2f(program.uniform.size, blurSizeX, blurSizeY);\n _draw();\n };\n\n _filter.pixelate.SHADER = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform vec2 size;',\n 'uniform sampler2D texture;',\n 'vec2 pixelate(vec2 coord, vec2 size) {',\n 'return floor( coord / size ) * size;',\n '}',\n 'void main(void) {',\n 'gl_FragColor = vec4(0.0);',\n 'vec2 coord = pixelate(vUv, size);',\n 'gl_FragColor += texture2D(texture, coord);',\n '}',\n ].join('\\n');\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as fxImage from './imagefx';\n\nconst maxSize = 2048;\n// internal temp canvases\nlet inCanvas;\nlet outCanvas;\n// instance of fximage\nlet fx;\n\n// process input image and return tensor\n// input can be tensor, imagedata, htmlimageelement, htmlvideoelement\n// input is resized and run through imagefx filter\nexport function process(input, config): { tensor: typeof tf.Tensor | null, canvas: OffscreenCanvas | HTMLCanvasElement } {\n let tensor;\n if (!input) throw new Error('Human: Input is missing');\n // sanity checks since different browsers do not implement all dom elements\n if (\n !(input instanceof tf.Tensor)\n && !(typeof Image !== 'undefined' && input instanceof Image)\n && !(typeof ImageData !== 'undefined' && input instanceof ImageData)\n && !(typeof ImageBitmap !== 'undefined' && input instanceof ImageBitmap)\n && !(typeof HTMLImageElement !== 'undefined' && input instanceof HTMLImageElement)\n && !(typeof HTMLMediaElement !== 'undefined' && input instanceof HTMLMediaElement)\n && !(typeof HTMLVideoElement !== 'undefined' && input instanceof HTMLVideoElement)\n && !(typeof HTMLCanvasElement !== 'undefined' && input instanceof HTMLCanvasElement)\n && !(typeof OffscreenCanvas !== 'undefined' && input instanceof OffscreenCanvas)\n ) {\n throw new Error('Human: Input type is not recognized');\n }\n if (input instanceof tf.Tensor) {\n // if input is tensor, use as-is\n if (input.shape && input.shape.length === 4 && input.shape[0] === 1 && input.shape[3] === 3) tensor = tf.clone(input);\n else throw new Error(`Human: Input tensor shape must be [1, height, width, 3] and instead was ${input.shape}`);\n } else {\n // check if resizing will be needed\n const originalWidth = input['naturalWidth'] || input['videoWidth'] || input['width'] || (input['shape'] && (input['shape'][1] > 0));\n const originalHeight = input['naturalHeight'] || input['videoHeight'] || input['height'] || (input['shape'] && (input['shape'][2] > 0));\n let targetWidth = originalWidth;\n let targetHeight = originalHeight;\n if (targetWidth > maxSize) {\n targetWidth = maxSize;\n targetHeight = targetWidth * originalHeight / originalWidth;\n }\n if (targetHeight > maxSize) {\n targetHeight = maxSize;\n targetWidth = targetHeight * originalWidth / originalHeight;\n }\n\n // create our canvas and resize it if needed\n if (config.filter.width > 0) targetWidth = config.filter.width;\n else if (config.filter.height > 0) targetWidth = originalWidth * (config.filter.height / originalHeight);\n if (config.filter.height > 0) targetHeight = config.filter.height;\n else if (config.filter.width > 0) targetHeight = originalHeight * (config.filter.width / originalWidth);\n if (!targetWidth || !targetHeight) throw new Error('Human: Input cannot determine dimension');\n if (!inCanvas || (inCanvas?.width !== targetWidth) || (inCanvas?.height !== targetHeight)) {\n inCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n if (inCanvas?.width !== targetWidth) inCanvas.width = targetWidth;\n if (inCanvas?.height !== targetHeight) inCanvas.height = targetHeight;\n }\n\n // draw input to our canvas\n const ctx = inCanvas.getContext('2d');\n if (input instanceof ImageData) {\n ctx.putImageData(input, 0, 0);\n } else {\n if (config.filter.flip && typeof ctx.translate !== 'undefined') {\n ctx.translate(originalWidth, 0);\n ctx.scale(-1, 1);\n ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n ctx.setTransform(1, 0, 0, 1, 0, 0); // resets transforms to defaults\n } else {\n ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n }\n }\n\n // imagefx transforms using gl\n if (config.filter.enabled) {\n if (!fx || !outCanvas || (inCanvas.width !== outCanvas.width) || (inCanvas?.height !== outCanvas?.height)) {\n outCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(inCanvas?.width, inCanvas?.height) : document.createElement('canvas');\n if (outCanvas?.width !== inCanvas?.width) outCanvas.width = inCanvas?.width;\n if (outCanvas?.height !== inCanvas?.height) outCanvas.height = inCanvas?.height;\n // log('created FX filter');\n fx = tf.ENV.flags.IS_BROWSER ? new fxImage.GLImageFilter({ canvas: outCanvas }) : null; // && (typeof document !== 'undefined')\n }\n if (!fx) return { tensor: null, canvas: inCanvas };\n fx.reset();\n fx.addFilter('brightness', config.filter.brightness); // must have at least one filter enabled\n if (config.filter.contrast !== 0) fx.addFilter('contrast', config.filter.contrast);\n if (config.filter.sharpness !== 0) fx.addFilter('sharpen', config.filter.sharpness);\n if (config.filter.blur !== 0) fx.addFilter('blur', config.filter.blur);\n if (config.filter.saturation !== 0) fx.addFilter('saturation', config.filter.saturation);\n if (config.filter.hue !== 0) fx.addFilter('hue', config.filter.hue);\n if (config.filter.negative) fx.addFilter('negative');\n if (config.filter.sepia) fx.addFilter('sepia');\n if (config.filter.vintage) fx.addFilter('brownie');\n if (config.filter.sepia) fx.addFilter('sepia');\n if (config.filter.kodachrome) fx.addFilter('kodachrome');\n if (config.filter.technicolor) fx.addFilter('technicolor');\n if (config.filter.polaroid) fx.addFilter('polaroid');\n if (config.filter.pixelate !== 0) fx.addFilter('pixelate', config.filter.pixelate);\n fx.apply(inCanvas);\n // read pixel data\n /*\n const gl = outCanvas.getContext('webgl');\n if (gl) {\n const glBuffer = new Uint8Array(outCanvas.width * outCanvas.height * 4);\n const pixBuffer = new Uint8Array(outCanvas.width * outCanvas.height * 3);\n gl.readPixels(0, 0, outCanvas.width, outCanvas.height, gl.RGBA, gl.UNSIGNED_BYTE, glBuffer);\n // gl returns rbga while we only need rgb, so discarding alpha channel\n // gl returns starting point as lower left, so need to invert vertical\n let i = 0;\n for (let y = outCanvas.height - 1; y >= 0; y--) {\n for (let x = 0; x < outCanvas.width; x++) {\n const index = (x + y * outCanvas.width) * 4;\n pixBuffer[i++] = glBuffer[index + 0];\n pixBuffer[i++] = glBuffer[index + 1];\n pixBuffer[i++] = glBuffer[index + 2];\n }\n }\n outCanvas.data = pixBuffer;\n }\n */\n } else {\n outCanvas = inCanvas;\n if (fx) fx = null;\n }\n\n // create tensor from image\n let pixels;\n if (outCanvas.data) { // if we have data, just convert to tensor\n const shape = [outCanvas.height, outCanvas.width, 3];\n pixels = tf.tensor3d(outCanvas.data, shape, 'int32');\n } else if (outCanvas instanceof ImageData) { // if input is imagedata, just use it\n pixels = tf.browser.fromPixels(outCanvas);\n } else if (config.backend === 'webgl' || config.backend === 'humangl') { // tf kernel-optimized method to get imagedata\n // we can use canvas as-is as it already has a context, so we do a silly one more canvas\n const tempCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n tempCanvas.width = targetWidth;\n tempCanvas.height = targetHeight;\n const tempCtx = tempCanvas.getContext('2d');\n tempCtx?.drawImage(outCanvas, 0, 0);\n pixels = tf.browser.fromPixels(tempCanvas);\n } else { // cpu and wasm kernel does not implement efficient fromPixels method\n // we can use canvas as-is as it already has a context, so we do a silly one more canvas\n const tempCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n tempCanvas.width = targetWidth;\n tempCanvas.height = targetHeight;\n const tempCtx = tempCanvas.getContext('2d');\n tempCtx?.drawImage(outCanvas, 0, 0);\n const data = tempCtx?.getImageData(0, 0, targetWidth, targetHeight);\n pixels = tf.browser.fromPixels(data);\n }\n const casted = pixels.toFloat();\n tensor = casted.expandDims(0);\n pixels.dispose();\n casted.dispose();\n }\n const canvas = config.filter.return ? outCanvas : null;\n return { tensor, canvas };\n}\n", "import { TRI468 as triangulation } from '../blazeface/coords';\nimport { mergeDeep } from '../helpers';\nimport type { Result, Face, Body, Hand, Item, Gesture } from '../result';\n\n/**\n * Draw Options\n * Accessed via `human.draw.options` or provided per each draw method as the drawOptions optional parameter\n * -color: draw color\n * -labelColor: color for labels\n * -shadowColor: optional shadow color for labels\n * -font: font for labels\n * -lineHeight: line height for labels, used for multi-line labels,\n * -lineWidth: width of any lines,\n * -pointSize: size of any point,\n * -roundRect: for boxes, round corners by this many pixels,\n * -drawPoints: should points be drawn,\n * -drawLabels: should labels be drawn,\n * -drawBoxes: should boxes be drawn,\n * -drawPolygons: should polygons be drawn,\n * -fillPolygons: should drawn polygons be filled,\n * -useDepth: use z-axis coordinate as color shade,\n * -useCurves: draw polygons as cures or as lines,\n * -bufferedOutput: experimental: allows to call draw methods multiple times for each detection and interpolate results between results thus achieving smoother animations\n * -useRawBoxes: Boolean: internal: use non-normalized coordinates when performing draw methods,\n */\nexport interface DrawOptions {\n color: string,\n labelColor: string,\n shadowColor: string,\n font: string,\n lineHeight: number,\n lineWidth: number,\n pointSize: number,\n roundRect: number,\n drawPoints: Boolean,\n drawLabels: Boolean,\n drawBoxes: Boolean,\n drawPolygons: Boolean,\n fillPolygons: Boolean,\n useDepth: Boolean,\n useCurves: Boolean,\n bufferedOutput: Boolean,\n useRawBoxes: Boolean,\n calculateHandBox: Boolean,\n}\n\nexport const options: DrawOptions = {\n color: 'rgba(173, 216, 230, 0.3)', // 'lightblue' with light alpha channel\n labelColor: 'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel\n shadowColor: 'black',\n font: 'small-caps 16px \"Segoe UI\"',\n lineHeight: 24,\n lineWidth: 6,\n pointSize: 2,\n roundRect: 28,\n drawPoints: false,\n drawLabels: true,\n drawBoxes: true,\n drawPolygons: true,\n fillPolygons: false,\n useDepth: true,\n useCurves: false,\n bufferedOutput: true,\n useRawBoxes: false,\n calculateHandBox: true,\n};\n\nfunction point(ctx, x, y, z = 0, localOptions) {\n ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.beginPath();\n ctx.arc(x, y, localOptions.pointSize, 0, 2 * Math.PI);\n ctx.fill();\n}\n\nfunction rect(ctx, x, y, width, height, localOptions) {\n ctx.beginPath();\n if (localOptions.useCurves) {\n const cx = (x + x + width) / 2;\n const cy = (y + y + height) / 2;\n ctx.ellipse(cx, cy, width / 2, height / 2, 0, 0, 2 * Math.PI);\n } else {\n ctx.lineWidth = localOptions.lineWidth;\n ctx.moveTo(x + localOptions.roundRect, y);\n ctx.lineTo(x + width - localOptions.roundRect, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + localOptions.roundRect);\n ctx.lineTo(x + width, y + height - localOptions.roundRect);\n ctx.quadraticCurveTo(x + width, y + height, x + width - localOptions.roundRect, y + height);\n ctx.lineTo(x + localOptions.roundRect, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - localOptions.roundRect);\n ctx.lineTo(x, y + localOptions.roundRect);\n ctx.quadraticCurveTo(x, y, x + localOptions.roundRect, y);\n ctx.closePath();\n }\n ctx.stroke();\n}\n\nfunction lines(ctx, points: [number, number, number][] = [], localOptions) {\n if (points === undefined || points.length === 0) return;\n ctx.beginPath();\n ctx.moveTo(points[0][0], points[0][1]);\n for (const pt of points) {\n ctx.strokeStyle = localOptions.useDepth && pt[2] ? `rgba(${127.5 + (2 * pt[2])}, ${127.5 - (2 * pt[2])}, 255, 0.3)` : localOptions.color;\n ctx.fillStyle = localOptions.useDepth && pt[2] ? `rgba(${127.5 + (2 * pt[2])}, ${127.5 - (2 * pt[2])}, 255, 0.3)` : localOptions.color;\n ctx.lineTo(pt[0], Math.round(pt[1]));\n }\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nfunction curves(ctx, points: [number, number, number][] = [], localOptions) {\n if (points === undefined || points.length === 0) return;\n if (!localOptions.useCurves || points.length <= 2) {\n lines(ctx, points, localOptions);\n return;\n }\n ctx.moveTo(points[0][0], points[0][1]);\n for (let i = 0; i < points.length - 2; i++) {\n const xc = (points[i][0] + points[i + 1][0]) / 2;\n const yc = (points[i][1] + points[i + 1][1]) / 2;\n ctx.quadraticCurveTo(points[i][0], points[i][1], xc, yc);\n }\n ctx.quadraticCurveTo(points[points.length - 2][0], points[points.length - 2][1], points[points.length - 1][0], points[points.length - 1][1]);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nexport async function gesture(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\n ctx.font = localOptions.font;\n ctx.fillStyle = localOptions.color;\n let i = 1;\n for (let j = 0; j < result.length; j++) {\n let where:any[] = [];\n let what:any[] = [];\n [where, what] = Object.entries(result[j]);\n if ((what.length > 1) && (what[1].length > 0)) {\n const person = where[1] > 0 ? `#${where[1]}` : '';\n const label = `${where[0]} ${person}: ${what[1]}`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, 8, 2 + (i * localOptions.lineHeight));\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, 6, 0 + (i * localOptions.lineHeight));\n i += 1;\n }\n }\n}\n\nexport async function face(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\n for (const f of result) {\n ctx.font = localOptions.font;\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n if (localOptions.drawBoxes) {\n if (localOptions.useRawBoxes) rect(ctx, inCanvas.width * f.boxRaw[0], inCanvas.height * f.boxRaw[1], inCanvas.width * f.boxRaw[2], inCanvas.height * f.boxRaw[3], localOptions);\n else rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions);\n }\n // silly hack since fillText does not suport new line\n const labels:string[] = [];\n labels.push(`face confidence: ${Math.trunc(100 * f.confidence)}%`);\n if (f.genderConfidence) labels.push(`${f.gender || ''} ${Math.trunc(100 * f.genderConfidence)}% confident`);\n // if (f.genderConfidence) labels.push(f.gender);\n if (f.age) labels.push(`age: ${f.age || ''}`);\n if (f.iris) labels.push(`iris distance: ${f.iris}`);\n if (f.emotion && f.emotion.length > 0) {\n const emotion = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);\n labels.push(emotion.join(' '));\n }\n if (f.rotation && f.rotation.angle && f.rotation.angle.roll) labels.push(`roll: ${Math.trunc(100 * f.rotation.angle.roll) / 100} yaw:${Math.trunc(100 * f.rotation.angle.yaw) / 100} pitch:${Math.trunc(100 * f.rotation.angle.pitch) / 100}`);\n if (labels.length === 0) labels.push('face');\n ctx.fillStyle = localOptions.color;\n for (let i = labels.length - 1; i >= 0; i--) {\n const x = Math.max(f.box[0], 0);\n const y = i * localOptions.lineHeight + f.box[1];\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(labels[i], x + 5, y + 16);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(labels[i], x + 4, y + 15);\n }\n ctx.lineWidth = 1;\n if (f.mesh && f.mesh.length > 0) {\n if (localOptions.drawPoints) {\n for (const pt of f.mesh) point(ctx, pt[0], pt[1], pt[2], localOptions);\n // for (const pt of f.meshRaw) point(ctx, pt[0] * inCanvas.offsetWidth, pt[1] * inCanvas.offsetHeight, pt[2]);\n }\n if (localOptions.drawPolygons) {\n ctx.lineWidth = 1;\n for (let i = 0; i < triangulation.length / 3; i++) {\n const points = [\n triangulation[i * 3 + 0],\n triangulation[i * 3 + 1],\n triangulation[i * 3 + 2],\n ].map((index) => f.mesh[index]);\n lines(ctx, points, localOptions);\n }\n // iris: array[center, left, top, right, bottom]\n if (f.annotations && f.annotations['leftEyeIris']) {\n ctx.strokeStyle = localOptions.useDepth ? 'rgba(255, 200, 255, 0.3)' : localOptions.color;\n ctx.beginPath();\n const sizeX = Math.abs(f.annotations['leftEyeIris'][3][0] - f.annotations['leftEyeIris'][1][0]) / 2;\n const sizeY = Math.abs(f.annotations['leftEyeIris'][4][1] - f.annotations['leftEyeIris'][2][1]) / 2;\n ctx.ellipse(f.annotations['leftEyeIris'][0][0], f.annotations['leftEyeIris'][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.fillStyle = localOptions.useDepth ? 'rgba(255, 255, 200, 0.3)' : localOptions.color;\n ctx.fill();\n }\n }\n if (f.annotations && f.annotations['rightEyeIris']) {\n ctx.strokeStyle = localOptions.useDepth ? 'rgba(255, 200, 255, 0.3)' : localOptions.color;\n ctx.beginPath();\n const sizeX = Math.abs(f.annotations['rightEyeIris'][3][0] - f.annotations['rightEyeIris'][1][0]) / 2;\n const sizeY = Math.abs(f.annotations['rightEyeIris'][4][1] - f.annotations['rightEyeIris'][2][1]) / 2;\n ctx.ellipse(f.annotations['rightEyeIris'][0][0], f.annotations['rightEyeIris'][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.fillStyle = localOptions.useDepth ? 'rgba(255, 255, 200, 0.3)' : localOptions.color;\n ctx.fill();\n }\n }\n }\n }\n }\n}\n\nconst lastDrawnPose:any[] = [];\nexport async function body(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\n ctx.lineJoin = 'round';\n for (let i = 0; i < result.length; i++) {\n if (!lastDrawnPose[i] && localOptions.bufferedOutput) lastDrawnPose[i] = { ...result[i] };\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n ctx.lineWidth = localOptions.lineWidth;\n ctx.font = localOptions.font;\n if (localOptions.drawBoxes && result[i].box && result[i].box?.length === 4) {\n // @ts-ignore box may not exist\n rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions);\n if (localOptions.drawLabels) {\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n // @ts-ignore box may not exist\n ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n // @ts-ignore box may not exist\n ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n }\n if (localOptions.drawPoints) {\n for (let pt = 0; pt < result[i].keypoints.length; pt++) {\n ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position.z ? `rgba(${127.5 + (2 * result[i].keypoints[pt].position.z)}, ${127.5 - (2 * result[i].keypoints[pt].position.z)}, 255, 0.5)` : localOptions.color;\n if (localOptions.bufferedOutput) {\n lastDrawnPose[i].keypoints[pt][0] = (lastDrawnPose[i].keypoints[pt][0] + result[i].keypoints[pt].position.x) / 2;\n lastDrawnPose[i].keypoints[pt][1] = (lastDrawnPose[i].keypoints[pt][1] + result[i].keypoints[pt].position.y) / 2;\n point(ctx, lastDrawnPose[i].keypoints[pt][0], lastDrawnPose[i].keypoints[pt][1], 0, localOptions);\n } else {\n point(ctx, result[i].keypoints[pt].position.x, result[i].keypoints[pt].position.y, 0, localOptions);\n }\n }\n }\n if (localOptions.drawLabels) {\n ctx.font = localOptions.font;\n if (result[i].keypoints) {\n for (const pt of result[i].keypoints) {\n ctx.fillStyle = localOptions.useDepth && pt.position.z ? `rgba(${127.5 + (2 * pt.position.z)}, ${127.5 - (2 * pt.position.z)}, 255, 0.5)` : localOptions.color;\n ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position.x + 4, pt.position.y + 4);\n }\n }\n }\n if (localOptions.drawPolygons && result[i].keypoints) {\n let part;\n const points: any[] = [];\n // shoulder line\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position.x, part.position.y]);\n curves(ctx, points, localOptions);\n // torso main\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightHip');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftHip');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position.x, part.position.y]);\n if (points.length === 4) lines(ctx, points, localOptions); // only draw if we have complete torso\n // leg left\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftHip');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftKnee');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftAnkle');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftHeel');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftFoot');\n if (part) points.push([part.position.x, part.position.y]);\n curves(ctx, points, localOptions);\n // leg right\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'rightHip');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightKnee');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightAnkle');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightHeel');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightFoot');\n if (part) points.push([part.position.x, part.position.y]);\n curves(ctx, points, localOptions);\n // arm left\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftElbow');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftWrist');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftPalm');\n if (part) points.push([part.position.x, part.position.y]);\n curves(ctx, points, localOptions);\n // arm right\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightElbow');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightWrist');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightPalm');\n if (part) points.push([part.position.x, part.position.y]);\n curves(ctx, points, localOptions);\n // draw all\n }\n }\n}\n\nexport async function hand(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n for (const h of result) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n let box;\n if (!localOptions.calculateHandBox) {\n box = localOptions.useRawBoxes ? h.boxRaw : h.box;\n } else {\n box = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0];\n if (h.landmarks && h.landmarks.length > 0) {\n for (const pt of h.landmarks) {\n if (pt[0] < box[0]) box[0] = pt[0];\n if (pt[1] < box[1]) box[1] = pt[1];\n if (pt[0] > box[2]) box[2] = pt[0];\n if (pt[1] > box[3]) box[3] = pt[1];\n }\n box[2] -= box[0];\n box[3] -= box[1];\n }\n }\n if (localOptions.useRawBoxes) rect(ctx, inCanvas.width * box[0], inCanvas.height * box[1], inCanvas.width * box[2], inCanvas.height * box[3], localOptions);\n else rect(ctx, box[0], box[1], box[2], box[3], localOptions);\n if (localOptions.drawLabels) {\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText('hand', box[0] + 3, 1 + box[1] + localOptions.lineHeight, box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText('hand', box[0] + 2, 0 + box[1] + localOptions.lineHeight, box[2]);\n }\n ctx.stroke();\n }\n if (localOptions.drawPoints) {\n if (h.landmarks && h.landmarks.length > 0) {\n for (const pt of h.landmarks) {\n ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * pt[2])}, ${127.5 - (2 * pt[2])}, 255, 0.5)` : localOptions.color;\n point(ctx, pt[0], pt[1], 0, localOptions);\n }\n }\n }\n if (localOptions.drawLabels) {\n const addHandLabel = (part, title) => {\n ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * part[part.length - 1][2])}, ${127.5 - (2 * part[part.length - 1][2])}, 255, 0.5)` : localOptions.color;\n ctx.fillText(title, part[part.length - 1][0] + 4, part[part.length - 1][1] + 4);\n };\n ctx.font = localOptions.font;\n addHandLabel(h.annotations['indexFinger'], 'index');\n addHandLabel(h.annotations['middleFinger'], 'middle');\n addHandLabel(h.annotations['ringFinger'], 'ring');\n addHandLabel(h.annotations['pinky'], 'pinky');\n addHandLabel(h.annotations['thumb'], 'thumb');\n addHandLabel(h.annotations['palmBase'], 'palm');\n }\n if (localOptions.drawPolygons) {\n const addHandLine = (part) => {\n if (!part) return;\n for (let i = 0; i < part.length; i++) {\n ctx.beginPath();\n ctx.strokeStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * part[i][2])}, ${127.5 - (2 * part[i][2])}, 255, 0.5)` : localOptions.color;\n ctx.moveTo(part[i > 0 ? i - 1 : 0][0], part[i > 0 ? i - 1 : 0][1]);\n ctx.lineTo(part[i][0], part[i][1]);\n ctx.stroke();\n }\n };\n ctx.lineWidth = localOptions.lineWidth;\n addHandLine(h.annotations['indexFinger']);\n addHandLine(h.annotations['middleFinger']);\n addHandLine(h.annotations['ringFinger']);\n addHandLine(h.annotations['pinky']);\n addHandLine(h.annotations['thumb']);\n // addPart(h.annotations.palmBase);\n }\n }\n}\n\nexport async function object(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n for (const h of result) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n if (localOptions.useRawBoxes) rect(ctx, inCanvas.width * h.boxRaw[0], inCanvas.height * h.boxRaw[1], inCanvas.width * h.boxRaw[2], inCanvas.height * h.boxRaw[3], localOptions);\n else rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n if (localOptions.drawLabels) {\n const label = `${Math.round(100 * h.score)}% ${h.label}`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.stroke();\n }\n }\n}\n\nexport async function canvas(inCanvas: HTMLCanvasElement, outCanvas: HTMLCanvasElement) {\n if (!inCanvas || !outCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement) || !(outCanvas instanceof HTMLCanvasElement)) return;\n const outCtx = inCanvas.getContext('2d');\n outCtx?.drawImage(inCanvas, 0, 0);\n}\n\nexport async function all(inCanvas: HTMLCanvasElement, result: Result, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n face(inCanvas, result.face, localOptions);\n body(inCanvas, result.body, localOptions);\n hand(inCanvas, result.hand, localOptions);\n gesture(inCanvas, result.gesture, localOptions);\n object(inCanvas, result.object, localOptions);\n}\n", "// data:image/jpeg;base64,\nexport const face = `\n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`;\n\n// data:image/jpeg;base64,\nexport const body = `\n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\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAa2p1UYo5adbz+xbxMlvqJ1OqjDHLXree0ejmzNrWm953tPmTPWbWneZ7yoy5YhjrXXTjH8s75N\nmtkyxt0VZM2/m175N1V03yTKubMLXVXybeYLLX2VXy7eam+b0bOg4VquJW+rry4/O9uyZOq3UjVm\n9r25axMzPaIdvhns1kzbZddM0p5Y47z8/R2+HcF03Doi1a8+Xzvbv+TotJnjDXkt+K8ODHp8cY8N\nIpSO0RCwF2YAAAAAAAAACvUZYw6fJkntWN3k8dfHz2vLucdz8mkjFE9bz1+UOZosX1UzPm0nqI/W\nMYo9FlcPNklfFGeH/NshLGun+Cz6PtHZtVZWlRLS+jxPkRpIn7rdoupHTdA5s6SI+7H6Mfo+32Y2\n+To3neSIiZ7A0IjPXpXLePlMotGW3272t85datKzHZjbTVnsDj+FG/2Y/RlGP4R+jo20u7H6N1Ql\no+H8I/REY957R+jpfReiK6eOYHLtj2tttH6KrY/6Y/R2c+kjeJiFVtLG24hxpw7/AHY/RRkw9O37\nO99Hrt1YX0tfOBLjcGp4XF8c+u8fs9c4dcVcGemSI61nd3IneN1orQAAAAAAAAAAAAABFqxes1tE\nTE9JiUgPKcX4RbRXnNgiZwWnrH4XPi28PdXpW9JraImsxtMS8pxXhF9DecuGJtgmf+1TWW2N/la1\nL7N7T5e3Vy6W3hsYcvLbqzbO9jvvCzvDR0+XeO7crO6FmGSvRThy/RtVXJ92elvk2rRvDUzU7pl4\nizsd2J3jeBpcNz+Lg5LT7+Pp+Xk3W7js5eAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs0NTrN96Yp6edkW8Wzm6+LNTq4pvTHO9vOfRoWtt\n1mes95YWvs1s2fZldddOczLPLn2ju0MmebT3YZc2/mpm3qqllN1drsbZIhr3yzvtHf4AsvlYYseb\nV5Yx4KTe0+UQ6nDvZ3UazbJqd8OKeu33peq0eh0+hxcmnxxWPOfOfm0mP+steT/ji8N9mKY9suum\nL37+HHaPm9DSlaVitKxWsdohI0Y22gAgAAAAAAAAAABXnyRhw3yT92Nwef4xm8bVzET0rPJH5d12\n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\nAOZE/OsPS29nuH27YrV+VpeV9pdPXhOtw49NG9Mld55+vXcTPd42I47qo7xSfyWV9oM8d8VJ/VxM\nd8l46xWF9cV7en6o/qLfxp2I9ob+eCv/AHMo9op89P8A/wBORGmyT5R+qfo2X8P7n9Q/jTsx7RR5\n6ef+4/8AuHftg/8A6cWcOSO9J/WEbWr3pY7Efzp2Lcfv5YK/9zWy8d1E/ZpSv5Oba1/+Hb9lc+LP\nbFt87I7E/wAabWbiurvEx4nL/pjZzc2bJkn372t85ZXx55/BX85lucC0vPxnTxlnnjm32mOiZqUu\nLJ2p4TwnVavNWaYbRTfre0bQ99pcH0bT0xb78vmtiIiNojaErMwAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAHnfarF7umzRHaZrLjYrdIen9ocPi8JyTt1xzF4eUw23rCm3R4r6bMy\nwt6kdTaWLdjswmNoZontsCm0K5XWjopnuDC0dGpqG5bs08/daKV672MjbSaif6oh6Z5f2LtvptRX\n0tEvUN3Jfo8f7cYve0eX4zV7B5z20xc/C8eSPuZIRficfXlcPaG7ino08HWIbePpLF2NuiyOyrHK\n3fZFSwuovHVfaVF4QK5YWTM9UT0EKry6Ps1Tn4zjn8NZn9nOtLseydObiWW34cf918fWfk+PYANn\nKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq1WKM+ly4p+/WYeBxTNd6zG0xO0\nvobw3FcP0bi2em20Tbmj5Srr418V9sa2Z7qKyzi07MXUylhaU7yjqhLCeiq3ddaFNxFYW7NLNG8t\nzya+WO6Va9J7FW66mvwidnrXiPY3Ny8RyUn71Jj9Ht3RPjk19HK9pMHj8D1ER3rHN+jqqtTjjNps\nuOe16zAifXzfTz7kNyndpYazS9qT0mszDdoxrsi6m8LazMq6zDOsq1ZEyrt1WWlXaUCqyq0rbKbi\nFdp6PReyFd8uqv8ACsfy83aXrPZHHto89/xX2/SP/dpj6y8vx6EBq5gAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAB5n2q03LfDqqx39y39npmlxbS/TOG5se29tuavzgWzeV4mtui2\nO3RRSY2hdVhqO2MvI36iu9lUsrSrvDHn6spnmSiq5jooyV6tq1VV69RC32byTh43h8otMx+r6I+Z\naK/g8TwX7bXh9Mid4iW+fjl8n1ICWb57xLBOm4zqse20Tbmj8+qKdnS9q8PhcTw5tumSm0/OHMxz\n0Za+uzx3sX1t0Zxurr1ZxvspWiZYWZbsbT0QK7KLrZVZJFaqt5vbezNOTg9J/FaZeJns93wCvLwb\nT/GJn92uGHldIBowAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADuAPA67F9H4l\nqMW20VvO3yRWW97T4fC4rXJHSMtI/WGhVlue3b473K2KzMML4+62tujG9pnozXaOSOVFMnVbmq1t\ntrJRW5E7wwvUxTvCyY6CHOt7moxz6Wh9PxTzYaT61h8x1MbZK/OH0zTf+Fxf6I/htj45vL9WgLMn\nmvbPFvocGWO9L7fq85p5maw9d7VYvE4JkmPu2if3eW0+PasdFNOnxfF1Y2hlykRsmY+LJ0MZjZXa\neq2eyi8oQTO0KLdZWzPRjWu6VaqtHR73g0bcI0sf0Q8Nkq93wqNuFaWP+XDTDDytwBowAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAef9q8HNpcGaI60vtPyl56k9Iew49j8ThGe\nPwxFv0l4zH2U26fDfTYiyJljvsjf4sm6vJ1hrXjq2MkqLdZEVbgbMx0auGdmzNt6iHN1Ub5af6of\nTdPG2nxx6Vj+HzaaTm1+nx/iyVj930ysbViPRrj45vL9SAuyc7j1efguqj+jd4/T33rD3HEcPj8O\n1GP8WOY/Z4TTT7sKadHhbcsZnaCJ3TPZk6VdrKbTutmP0U2nqgrGOsr8deiuI2X09EqKM1dt3uuG\nf/jdN/06/wAPE546S9rwud+Gaaf+XH8NMMPK2wGjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAABrcRp4nDtRWPPHP8PCYusPoWSvNjtX1iYfPuWaXtX8MzCuvjfw32siu8ptXoxi\n0wy5t4YulReqmazu2skbquURWFInddM7VYRGyL291KFnCcfj8e0le/Lbmn8n0N4b2Ur4nHLWmPsY\n5e5a5+OXyXugBZmiY3iY9Xz7NjnTa3Ph/BeYj5PoTxftFg8Hjk2iOmWkW/Psrr418V5WrWd2faFc\nV2jdnEMXWxntupmN7NiYU27iWML6dVMVnddjgVqMsdHr+CW5uE6f4Rt+7yuSsTDv+zWXn0WTHP3L\n/tK+GHl+O0A1c4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8Dn93W56/wDM\nt/L3z59qp24jn+OS38lnpr4r7ZxHQ2TEstt3PXUrt27K57rr1VT0BjKnJPRbMqMs7QlV2fYvHvrd\nVknyrEfu9m8f7FZI8fVU85iJewbT45NfQBKo817W4eulzxHaZrL0rje09ItwqbfhtBVs3leai8RD\nKLw1sduesL606dWFdsZT1jdhNeq6K9DlhCVUU6s4jZnt1YzAhnM71dH2bycmszY/K1d/0c6OzY4R\nfwuK4p8rTstn6z8k7HrwGzkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHz3\nVxvr80/8y38voTwGpj/F5/8AqT/JfjTx/WVeyY6FPspc9dZPVXaOq2WEwIUTVRmjo2rNfLHRI3vZ\nDJycXtX8dZh7t879nsnhcbwz23tt+r6I2nxyb+gCVBzuPY/E4PqI9K7ui19fTxNBnp60n+Aj5/pJ\n3jZu1aOnnltMNussdfXbm+l3ZM9URHREdZVXTuT1Nk7boQiOkJw28PU47/htEp5eivJPLMTCZ9Vv\nx7mJ3iJ9UqNHk8XR4b+tIXuhxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD\nweqjbWZ4/wCZP8vePCaz/wDIaiP+Zb+UX408f0r9lOxWOifJhXWjfyYWllPRXYQxnrCrJHRd3YZI\n6A1NJecHEsN/S0T+76bE7xE+r5dk93LW3pL6ZpMni6PDf8VIn9m2fjm8s9rgFmQxvHNS0esbMiew\nPnHLyai9fS0w2aNfUTtrs3+uf5bGPqy068fF227KtSsdFlKqNGMV6myyY6sbdIQI8tlOWOi6Jhhk\nj3RD0vA8nicMx9etZmHRcT2Zyb6XNT8N9/2dt0T449T2AJVAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAHhdfG3E9TH9cvdPEcXjk4zqI/q3L8aeP6xr2TsxpLOekMK6mFo6qpXSrm\nOqBixvHSVmzC4OfqK7S9/wAByeLwbTW9K7fo8Fqo6Paeyl+fglI/Da0NcMPK7QC7AAB8313TiOf/\nAKk/y2MHWrX4jG3E9R/1Lfyv0/aFNOrHxuU7LI7MMayGTVlHWUXhNe6Z6wIUsb9d1m20q7dkDpez\nN9tRqKT5xEvRvKez9+Xis1/FSYerb5+OTyf6AFlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAB43j9eXjN/jWJ/Z7J5L2mry8Upb8VIF8f6aGOey2eynHvOy7bowrrYSxZSwQJ2YXZ\n92N4BoanrEvVexmTm4blr+HJ/aHltRHSXofYm/1Wrp5RaJaYY+X49WA0c4AD51xONuKan/qW/lbp\n+0MOLRtxbU/9SU4J7KadWPjep2WQrr2WRPRk1TvsndXMpiRCb9FNu0rbTuqvKBscCjfi9PhWZeue\nV9n434rafTHL1TfPxy+T/QAszAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHmv\navHtfTZfnV6VxPajHzcNrf8ABeJFs/XnMcr4no18c+6vr2YadkY2YM57sEDLyY37Mo7MMnYGlqO0\nvQ+xNfqNVb1tEfs87qZ2rL0/sVX/AHdnt65P7Q0wx8vx6UBo5wAHz/jUbcX1PT78qtO2vaCnJxjP\n8Zif2amnnspp04+OjWejKJ6MKdmcMmyJn4m5ZHzEVPMwtJv0VZLbQDqezcb8RzT6Y/7vUPM+ytZt\nn1OTyiIh6Ztn45N/6AFlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABocbxeLw\nnUR5xXm/Rvq8+OMuDJjntaswEeBxT0bNZ6NatZpNqz3rO0rqsdO3PxlaWEMpY+aqWXkryT0ZT2V3\n7A0dVPuy9f7G124NM/iyT/Z4zWT7sw957MYfB4Fp4/FE2/WWmGHldcBowAAeM9qKcvFeb8VIly9P\n0nq7ntbTbVYL+tJj93CwT76unR4/jo0nozhhTsy3Y1sWljM9Ce7HyQIm3RRlttVbaWrnt0Sh6n2U\nx8vD8mSfv3/h3XN4Bi8Lg2nj8Uc36y6TeOPXugCUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAPD8RxeBxXUU26Tbmj8+quro+02Lw+I4ssdslNvzhzazvDPbq8d7GW7Dfqz2VzG\n0s2qd+iu/Zn5Ksk9BVztX1mI8930zh2LwOHabH+HHWP2fNYp4+vwYvxXiP3fUqxtWIjyjZtj45/L\nfaQFmQADzftfj3w6fJ6WmHmsP23rvaqnNwqLfhvEvIYZ+sV038bo0noy36MK9oZQxrdMyrlnMbMZ\nQKrS1M07zEestq/RRjr4utwY/wAV4j91p9V18fQdJj8LR4ccfdpEfsuREbREJbuMAAAAAAAAAAAA\nBAJAAAAEAJEAJQAJQAJEAJQAJQAJEACUJAQlAJEAJQAJQJAAAEAJEAJBAAAJAABAJEJAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwvanDzaPFmjvjv8A\ntLztJ3h7HjGHx+FainnFeaPnHV4vFbeIU038VbHeGF+kso7Mb9mTdhKnLK3dRm7SIrHhGPxeP6Sv\n9cT/AHfSnz72Zx+J7Q45/BWZ/Z9BbZ+OXyfQBZQABzeP4/E4NqI9Ii36S8Ng/wAx9C4jTxOH6ivr\njn+Hz3B/mQi/GvjdCnWNlsdI2V07LIlg6USrt2ZzZXMoFV+zPhGLxeOaavpbm/RVltEN72Yx+Jxm\nb7dKUmf7L5+s9/HtRA2cqRACRACRACRACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQCQQCRACRACRCQBCQBCQB\nACRACRACRACRACL1i9LVntMbPATTwdRkxT3pea/u+gPE8Xx+DxrPHlaYt+qNfGvjvtXXsi0dOrKk\ndEXjZg6VMtbP2bMtXUdpEV0/Y2nNxbNf8OP+727xvsXH+N1U/wBEfy9k3nxyb+gCVQAGOWvNivX1\nrMPnGGOXNNfOJ2fSZ6w+dZKeHxDPX8N7R+6L8a+L63KdoZ7q6zvEMpnowdKJ6ywmWUyqvIKM0vQ+\nx+D6rU55+9aKx+TzWa36vbezmDwODYenW+95/Nphj5L6dQBo5wAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEiAAAEoA\nAAAAAAAAAAAAAEAkEAkRuAkQbgkQAkQAkQAkQAl5T2nx8nEMOT8dNv0l6pwfarHvpcGWPu32/WCr\nYvK4mOem6b9mGKd4Z3idmFdka0y1c892zfpMtLPaNpEV6D2Kj/Eauf6YeweQ9ieuTVz8K/3evbT4\n5NfQBKoAA8FxCvJxrUx/XMvevD8Zry8fz/Haf2RfjTx/6RSOnRMyypHu9kXjowrqVSrvPRnZVl6V\nkK0775MsUjvadn0nT4ow6bFijtSsVfPuFYvpPGtNTy54mfy6vorXDm8l9pEC7JIgBIgBIgBIgBIg\nBIgBIhIAgBIhIAgBIgBIIBIAAhIAhIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAA\nAAAAAAAAABAJQkAEAAAAAAAAAAjc3BIjdG4Mkbo5kcwMjdhzHMDPc3V8xzAs3N1fMjmBZubq+Y5g\nWbm6vmOYFm5ur5jmBZubq+Y5gWbm6vmOYFm5ur5jmBZubq+Y5gWbm6vmTzAz3N2HMnmBlu5ftFTx\nOEZJ/DMW/d0t2rxKni8N1FPWkiZ9eS08e7Cy8dGGn6UhZaJljXZGnmc3UT3dPP2cnUT78xCIV6j2\nH/8A9c/6f7vXPI+w8bU1U+vL/d63du5NfUiDcVSIAS8b7RV5eOb/AIqRL2TyXtNX/e2KfXH/AHlF\n+NPH/pr4+2xcxx0hFpY11K7R16KM32ZWz3UaidqSgrc9kcPicWyZJjfw6T+727y3sXh2xarN+K0V\nh6lvPjj3e0ASqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQAAAAAkQAkQAkAAAAAAAAAAAAAAA\nEgAAAAAAAAAAAAAAAAAAAAAgAAABKDcAN0bgkY8xzAyRux5kcwM9zdXNkTcFm6OZXzMeYFvMibKu\nZHMC2bo51U2RuC2bom6rc3BZzom6sBZzI52ADPnOdggFnMc6skFnMc6rc3BbznOp3RzAv50c6nml\nHMC/nOf4qOY5wX85zqOc5wbHOc7X5znBsc6edr85zg2ec52vzpi4NjmY5bROG+/bllVzsNTk5dLl\nn0pP8BHmMHWNmzt0aum8obm08vVjfrtnxztR0mXHzTvaZdjVRMTLkZo6yiFen9iZ2pqY/wBP93rN\n3kPY+/LfPX1rE/u9XzN3HfqzdO6vmTuIZ7m7Hc3Bnu8t7TR/vHBP9E/y9Pu837SV31umn+if5Rfi\n/j/01MMb1hjkrtKzBG0bMsmOZY11tOYamr6Und0LUc7XT7u3rJPqL8er9lcPhcFpbzyWm39v7O00\n+FYvA4Zpsc94xxu227jv1IAgAAAAAAAAABKAAAASgASgBIgBIgBIgBIhIAAAAAAAAAAAAAAAAAAC\nUACUJAAAAAAAAAAAABIAAAAAAAAAAAAAAAAAAAAg3AEbomQZbo3YzLGbAz3RNlc3YzcFs2YzdVN2\nM2Bdzom6nmNwW86JurTAMuY3REJ2BB1ZRVMVBhsbSsiqeUFXLucq3lTygp5TlXcpygp5TlXcpygp\n5TlXcqOUFXKjlXcrGYBXysdlswiYBVMdUTCyY6sZBWxlnMMZgGLGZZSwkDdHMiWO4MuY5mEyjcFn\nN1OdVzHMC3nTzqeY5gX85zqOZPMC+Lqdbk20eb/RKOZr8QybaK/XvtH7iZ9aGlp2luzT3fg19NHS\nOjbmPcYX67XH1XSZ9XIzRvMuzrK7zLkZYmYnciunb9lZ5dTk+OP+71cXeP8AZnJ/ip2nf3J/l6iL\n/Fu5L9bMWZczXi6YuIbEWTzKIuyiwLt3nuO25uI4a/hx7/rLuczg8TicvFLbfdpEK6+NPH/phhjo\nstLGkctUWnoxrrU3j1cnWTzZq1jzl1clo5Zcu8c+txR63iP3Tn6pv4+g4o5cVI9IiGe7CJ2iE7t3\nGyN2O6dwSINwSISAlAAlACRAAlAAlACRACRCQAAAAAAAAAASgASISAAAAAAAAAAAAACQAAAAAAAA\nAAAAAASAAAAAAAAAAAAAAAAIAAAQCAJljuljsCJlhMs9mOwMJYys5TkBVsjZdyHICrZPKt5E8oK4\nqmKrOVOwMIqyirPY2Bjyp2ZbAI2NmSARsbMgEbI2ZAMdjZICNkbMkSCNmOzJEgx2YyzljMAwlhKy\nWEwCuWErJhhMArlhLOWEgxljMpljIImWMyTKJA3N0IBO5vux3NwZbnMx3NwZczT4jf3MdPW27a3a\nfJOq1XNP2KdIRfi+J2trSYfcjeF+Wm1OicVeWIiN9kai8xjY12ORqultnI1Ecsujq79XP1FovWYI\nrTgeq+j8QrWZ+3Mx+r2UXeC0WG2Ti2kiN5mL807eUREvbzbaejefHJv62Iv8WUXa0WTFhVtRdlF2\nrz9WUXBtc7jR9dqc2T1ttHyhvZMvJitb0jdq6XHNcNenWVN3028U99WRj6Kb02be3Tq18/SN2Lpc\n3UdN9nOmZrqKX/DaJ/d0svvTLRzV3jomK6+Pd1vvWJj0ZczT0mXxNJht60hfFnQ4qu3N1cWTEgs3\nTur5k7gz3N2O5uDM3Y7m4MtxBuCQASIASIASAAAAAAACRCQAAAAAAAAEoSAAAAAAAAAAAlAAlCQA\nAAAAAAAAAAASAAAAAAAAAAAAIASgAAAEJAQJQCNkbMgGOyOVnsAw5TlZ7GwMOVPKy2NgY7GzIBGx\nskA2AAAAAAAAAAQkBAEghEskAxYzDPZGwK5hjMLJhjMAqmGEwumrCagomFcw2JqqtUFEsLLrV82F\no7gqljKyYYTGwMZRKUSCAQAboJnaN5Bjkneu0d5W4ccViIiOzHFWbTzNumP1Zarr8eeRMbxDW1Mx\nNO67NbkhzNVnmInqzaOZrL93JyZeV0M1++7S02jvxDWxhxx033tPpC8Z6rrezWjmZyazJG2/u03h\n2vFibTHoqvamiwVwY+nLGzV0+SZ1Mx8G0/45tOhzJ5lXMc3UVXRdlF1HP+iYsDPLPPy49/tz1+Te\npSIr0ho6ak5Ms5J8o2q6NImOrHV7XX488ypzTtHXo0s9t6zG7c1G1qz6ubeZiZ3UatXJG3yauSO7\ncvMTEx5tPLb3prPRMVr0HB8vicNxf0+7+kt+LOJwTJyY/Bnz3tH93X36N58cWvq6LSyiyndMSlC7\nmZcymLJiwLosmJVRLKLAtiU7q4lMSCzc3YxJuDMRuAlKAEgAAAlAkAAAAAABKAEgAAAAAJAAAAAA\nAAAAAAAEgAAAAAAAAAAAAAkAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAhIAAACAAAASgAAAAAAEAAAA\nhGzJAImGMwzQDDZjNVuyNgUTVhNGxysZqDVmiu1G5NN2M4waM0+DCaN2cbGcQNGaMZq3JxMJxA1J\nqx2bU4kU09slorWNwa20z02RXHbJbl26QvtFovbHWkxEdJt5y2MOHlr2U1W3jx+1hiw8vSO63lmI\nXRTaEWmtY6snRHO1VpmJ+DjavpSZl2s8b7y4HFcnh0n0gha5ebJN55KRM2mdoiPN6fh+kpwXh0Wy\nRHj5Otp/s5Ps1p62y31+em9aTMYt/OfVfxTiPjZ52naI7fBrI5t66xz5+a1rW7yx0eSL6iZjtEOX\nqNbSletom3lENjh2fbHzbbWt3iVozruc+5ztWubf4M4ybpQ2Oboyrva0Vjza8WdDR4OkXt3n9ldX\nkaePP9VtYqctYhdvt5oivTeCZ2YOxXk6ubqMfV0b9mrljfqlFcq88k7z2U5axeItDa1OPessuC8P\nya7XRWYnwqdbT/ZMilvIu4dpslNdixXja8Y5tt85djZdbDWnGOesRtXFtuw6T27No5Kx2OrKYQlC\nExKJgBnEpiyvdlEgsizKLKollFgWxLKJVRLKJBbEp3VxLKJBnuMWQJEbpBIAAAJAAAABIAAAAAAA\nlAJAAAAAAAAAAAAAASAAAAAAAAAAAAAJAAAABAJABAlAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAA\nAAABAJQAAAAgAABAAI2EoBGyJhkgGPKxmqxAKpownHC+YRMdN5BrTj67R3bOn01o7p01Iv71u89o\n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\n2Q==`;\n", "import { log, now, mergeDeep } from './helpers';\nimport { Config, defaults } from './config';\nimport { Result } from './result';\nimport * as sysinfo from './sysinfo';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as backend from './tfjs/backend';\nimport * as face from './face';\nimport * as facemesh from './blazeface/facemesh';\nimport * as faceres from './faceres/faceres';\nimport * as emotion from './emotion/emotion';\nimport * as posenet from './posenet/posenet';\nimport * as handpose from './handpose/handpose';\nimport * as blazepose from './blazepose/blazepose';\nimport * as nanodet from './object/nanodet';\nimport * as centernet from './object/centernet';\nimport * as gesture from './gesture/gesture';\nimport * as image from './image/image';\nimport * as draw from './draw/draw';\nimport * as sample from './sample';\nimport * as app from '../package.json';\n\n/** Generic Tensor object type */\nexport type Tensor = typeof tf.Tensor;\n\nexport type { Config } from './config';\nexport type { Result, Face, Hand, Body, Item, Gesture } from './result';\nexport type { DrawOptions } from './draw/draw';\n\n/** Defines all possible input types for **Human** detection */\nexport type Input = Tensor | typeof Image | ImageData | ImageBitmap | HTMLImageElement | HTMLMediaElement | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;\n\n/** Error message */\nexport type Error = { error: string };\n\n/** Instance of TensorFlow/JS */\nexport type TensorFlow = typeof tf;\n\n/** Generic Model object type, holds instance of individual models */\ntype Model = Object;\n\n/**\n * **Human** library main class\n *\n * All methods and properties are available only as members of Human class\n *\n * - Configuration object definition: {@link Config}\n * - Results object definition: {@link Result}\n * - Possible inputs: {@link Input}\n */\nexport class Human {\n /** Current version of Human library in semver format */\n version: string;\n /** Current configuration\n * - Details: {@link Config}\n */\n config: Config;\n /** Current state of Human library\n * - Can be polled to determine operations that are currently executed\n */\n state: string;\n /** Internal: Instance of current image being processed */\n image: { tensor: Tensor | null, canvas: OffscreenCanvas | HTMLCanvasElement | null };\n /** Internal: Instance of TensorFlow/JS used by Human\n * - Can be embedded or externally provided\n */\n tf: TensorFlow;\n /** Draw helper classes that can draw detected objects on canvas using specified draw styles\n * - options: global settings for all draw operations, can be overriden for each draw method, for details see {@link DrawOptions}\n * - face: draw detected faces\n * - body: draw detected people and body parts\n * - hand: draw detected hands and hand parts\n * - canvas: draw processed canvas which is a processed copy of the input\n * - all: meta-function that performs: canvas, face, body, hand\n */\n draw: {\n options: draw.DrawOptions,\n gesture: typeof draw.gesture,\n face: typeof draw.face,\n body: typeof draw.body,\n hand: typeof draw.hand,\n canvas: typeof draw.canvas,\n all: typeof draw.all,\n };\n /** Internal: Currently loaded models */\n models: {\n face: [Model, Model, Model] | null,\n posenet: Model | null,\n blazepose: Model | null,\n efficientpose: Model | null,\n handpose: [Model, Model] | null,\n iris: Model | null,\n age: Model | null,\n gender: Model | null,\n emotion: Model | null,\n embedding: Model | null,\n nanodet: Model | null,\n centernet: Model | null,\n faceres: Model | null,\n };\n /** Internal: Currently loaded classes */\n classes: {\n facemesh: typeof facemesh;\n emotion: typeof emotion;\n body: typeof posenet | typeof blazepose;\n hand: typeof handpose;\n nanodet: typeof nanodet;\n centernet: typeof centernet;\n faceres: typeof faceres;\n };\n /** Face triangualtion array of 468 points, used for triangle references between points */\n faceTriangulation: typeof facemesh.triangulation;\n /** UV map of 468 values, used for 3D mapping of the face mesh */\n faceUVMap: typeof facemesh.uvmap;\n /** Platform and agent information detected by Human */\n sysinfo: { platform: string, agent: string };\n /** Performance object that contains values for all recently performed operations */\n perf: any;\n #numTensors: number;\n #analyzeMemoryLeaks: boolean;\n #checkSanity: boolean;\n #firstRun: boolean;\n #lastInputSum: number;\n #lastCacheDiff: number;\n\n // definition end\n\n /**\n * Creates instance of Human library that is futher used for all operations\n * - @param userConfig: {@link Config}\n */\n constructor(userConfig: Config | Object = {}) {\n this.tf = tf;\n this.draw = draw;\n this.version = app.version;\n this.config = mergeDeep(defaults, userConfig);\n this.state = 'idle';\n this.#numTensors = 0;\n this.#analyzeMemoryLeaks = false;\n this.#checkSanity = false;\n this.#firstRun = true;\n this.#lastCacheDiff = 0;\n this.perf = {};\n // object that contains all initialized models\n this.models = {\n face: null,\n posenet: null,\n blazepose: null,\n efficientpose: null,\n handpose: null,\n iris: null,\n age: null,\n gender: null,\n emotion: null,\n embedding: null,\n nanodet: null,\n centernet: null,\n faceres: null,\n };\n // export access to image processing\n // @ts-ignore eslint-typescript cannot correctly infer type in anonymous function\n this.image = (input: Input) => image.process(input, this.config);\n // export raw access to underlying models\n this.classes = {\n facemesh,\n emotion,\n faceres,\n body: this.config.body.modelPath.includes('posenet') ? posenet : blazepose,\n hand: handpose,\n nanodet,\n centernet,\n };\n this.faceTriangulation = facemesh.triangulation;\n this.faceUVMap = facemesh.uvmap;\n // include platform info\n this.sysinfo = sysinfo.info();\n this.#lastInputSum = 1;\n }\n\n // helper function: measure tensor leak\n /** @hidden */\n analyze = (...msg) => {\n if (!this.#analyzeMemoryLeaks) return;\n const current = this.tf.engine().state.numTensors;\n const previous = this.#numTensors;\n this.#numTensors = current;\n const leaked = current - previous;\n if (leaked !== 0) log(...msg, leaked);\n }\n\n // quick sanity check on inputs\n /** @hidden */\n #sanity = (input): null | string => {\n if (!this.#checkSanity) return null;\n if (!input) return 'input is not defined';\n if (this.tf.ENV.flags.IS_NODE && !(input instanceof tf.Tensor)) return 'input must be a tensor';\n try {\n this.tf.getBackend();\n } catch {\n return 'backend not loaded';\n }\n return null;\n }\n\n /** Simmilarity method calculates simmilarity between two provided face descriptors (face embeddings)\n * - Calculation is based on normalized Minkowski distance between\n */\n // eslint-disable-next-line class-methods-use-this\n similarity(embedding1: Array, embedding2: Array): number {\n return faceres.similarity(embedding1, embedding2);\n }\n\n /** Enhance method performs additional enhacements to face image previously detected for futher processing\n * @param input Tensor as provided in human.result.face[n].tensor\n * @returns Tensor\n */\n // eslint-disable-next-line class-methods-use-this\n enhance(input: Tensor): Tensor | null {\n return faceres.enhance(input);\n }\n\n /**\n * Math method find best match between provided face descriptor and predefined database of known descriptors\n * @param faceEmbedding: face descriptor previsouly calculated on any face\n * @param db: array of mapping of face descriptors to known values\n * @param threshold: minimum score for matching to be considered in the result\n * @returns best match\n */\n // eslint-disable-next-line class-methods-use-this\n match(faceEmbedding: Array, db: Array<{ name: string, source: string, embedding: number[] }>, threshold = 0): { name: string, source: string, similarity: number, embedding: number[] } {\n return faceres.match(faceEmbedding, db, threshold);\n }\n\n /** Load method preloads all configured models on-demand\n * - Not explicitly required as any required model is load implicitly on it's first run\n */\n async load(userConfig: Config | Object = {}) {\n this.state = 'load';\n const timeStamp = now();\n if (userConfig) this.config = mergeDeep(this.config, userConfig);\n\n if (this.#firstRun) { // print version info on first run and check for correct backend setup\n if (this.config.debug) log(`version: ${this.version}`);\n if (this.config.debug) log(`tfjs version: ${this.tf.version_core}`);\n if (this.config.debug) log('platform:', this.sysinfo.platform);\n if (this.config.debug) log('agent:', this.sysinfo.agent);\n\n await this.#checkBackend(true);\n if (this.tf.ENV.flags.IS_BROWSER) {\n if (this.config.debug) log('configuration:', this.config);\n if (this.config.debug) log('tf flags:', this.tf.ENV.flags);\n }\n }\n if (this.config.async) { // load models concurrently\n [\n this.models.face,\n this.models.emotion,\n this.models.handpose,\n this.models.posenet,\n this.models.blazepose,\n this.models.nanodet,\n this.models.centernet,\n this.models.faceres,\n ] = await Promise.all([\n this.models.face || (this.config.face.enabled ? facemesh.load(this.config) : null),\n this.models.emotion || ((this.config.face.enabled && this.config.face.emotion.enabled) ? emotion.load(this.config) : null),\n this.models.handpose || (this.config.hand.enabled ? handpose.load(this.config) : null),\n this.models.posenet || (this.config.body.enabled && this.config.body.modelPath.includes('posenet') ? posenet.load(this.config) : null),\n this.models.blazepose || (this.config.body.enabled && this.config.body.modelPath.includes('blazepose') ? blazepose.load(this.config) : null),\n this.models.nanodet || (this.config.object.enabled && this.config.object.modelPath.includes('nanodet') ? nanodet.load(this.config) : null),\n this.models.centernet || (this.config.object.enabled && this.config.object.modelPath.includes('centernet') ? centernet.load(this.config) : null),\n this.models.faceres || ((this.config.face.enabled && this.config.face.description.enabled) ? faceres.load(this.config) : null),\n ]);\n } else { // load models sequentially\n if (this.config.face.enabled && !this.models.face) this.models.face = await facemesh.load(this.config);\n if (this.config.face.enabled && this.config.face.emotion.enabled && !this.models.emotion) this.models.emotion = await emotion.load(this.config);\n if (this.config.hand.enabled && !this.models.handpose) this.models.handpose = await handpose.load(this.config);\n if (this.config.body.enabled && !this.models.posenet && this.config.body.modelPath.includes('posenet')) this.models.posenet = await posenet.load(this.config);\n if (this.config.body.enabled && !this.models.blazepose && this.config.body.modelPath.includes('blazepose')) this.models.blazepose = await blazepose.load(this.config);\n if (this.config.object.enabled && !this.models.nanodet && this.config.object.modelPath.includes('nanodet')) this.models.nanodet = await nanodet.load(this.config);\n if (this.config.object.enabled && !this.models.centernet && this.config.object.modelPath.includes('centernet')) this.models.centernet = await centernet.load(this.config);\n if (this.config.face.enabled && this.config.face.description.enabled && !this.models.faceres) this.models.faceres = await faceres.load(this.config);\n }\n\n if (this.#firstRun) { // print memory stats on first run\n if (this.config.debug) log('tf engine state:', this.tf.engine().state.numBytes, 'bytes', this.tf.engine().state.numTensors, 'tensors');\n this.#firstRun = false;\n }\n\n const current = Math.trunc(now() - timeStamp);\n if (current > (this.perf.load || 0)) this.perf.load = current;\n }\n\n // check if backend needs initialization if it changed\n /** @hidden */\n #checkBackend = async (force = false) => {\n if (this.config.backend && (this.config.backend.length > 0) && force || (this.tf.getBackend() !== this.config.backend)) {\n const timeStamp = now();\n this.state = 'backend';\n /* force backend reload\n if (this.config.backend in tf.engine().registry) {\n const backendFactory = tf.findBackendFactory(this.config.backend);\n tf.removeBackend(this.config.backend);\n tf.registerBackend(this.config.backend, backendFactory);\n } else {\n log('Backend not registred:', this.config.backend);\n }\n */\n\n if (this.config.backend && this.config.backend.length > 0) {\n // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (typeof window === 'undefined' && typeof WorkerGlobalScope !== 'undefined' && this.config.debug) log('running inside web worker');\n\n // force browser vs node backend\n if (this.tf.ENV.flags.IS_BROWSER && this.config.backend === 'tensorflow') this.config.backend = 'webgl';\n if (this.tf.ENV.flags.IS_NODE && (this.config.backend === 'webgl' || this.config.backend === 'humangl')) this.config.backend = 'tensorflow';\n\n if (this.config.debug) log('setting backend:', this.config.backend);\n\n if (this.config.backend === 'wasm') {\n if (this.config.debug) log('wasm path:', this.config.wasmPath);\n if (typeof this.tf?.setWasmPaths !== 'undefined') this.tf.setWasmPaths(this.config.wasmPath);\n else throw new Error('Human: WASM backend is not loaded');\n const simd = await this.tf.env().getAsync('WASM_HAS_SIMD_SUPPORT');\n const mt = await this.tf.env().getAsync('WASM_HAS_MULTITHREAD_SUPPORT');\n if (this.config.debug) log(`wasm execution: ${simd ? 'SIMD' : 'no SIMD'} ${mt ? 'multithreaded' : 'singlethreaded'}`);\n if (this.config.debug && !simd) log('warning: wasm simd support is not enabled');\n }\n\n if (this.config.backend === 'humangl') backend.register();\n try {\n await this.tf.setBackend(this.config.backend);\n } catch (err) {\n log('error: cannot set backend:', this.config.backend, err);\n }\n }\n this.tf.enableProdMode();\n // this.tf.enableDebugMode();\n if (this.tf.getBackend() === 'webgl' || this.tf.getBackend() === 'humangl') {\n this.tf.ENV.set('CHECK_COMPUTATION_FOR_ERRORS', false);\n this.tf.ENV.set('WEBGL_CPU_FORWARD', true);\n tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true);\n this.tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', true);\n if (typeof this.config['deallocate'] !== 'undefined') {\n log('changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:', true);\n this.tf.ENV.set('WEBGL_DELETE_TEXTURE_THRESHOLD', 0);\n }\n const gl = await this.tf.backend().getGPGPUContext().gl;\n if (this.config.debug) log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`);\n }\n await this.tf.ready();\n this.perf.backend = Math.trunc(now() - timeStamp);\n }\n }\n\n // check if input changed sufficiently to trigger new detections\n /** @hidden */\n #skipFrame = async (input) => {\n if (this.config.cacheSensitivity === 0) return false;\n const resizeFact = 40;\n const reduced = input.resizeBilinear([Math.trunc(input.shape[1] / resizeFact), Math.trunc(input.shape[2] / resizeFact)]);\n // use tensor sum\n const sumT = this.tf.sum(reduced);\n const sum = sumT.dataSync()[0] as number;\n sumT.dispose();\n // use js loop sum\n /*\n const reducedData = reduced.dataSync();\n let sum = 0;\n for (let i = 0; i < reducedData.length; i++) sum += reducedData[i];\n */\n reduced.dispose();\n const diff = Math.max(sum, this.#lastInputSum) / Math.min(sum, this.#lastInputSum) - 1;\n this.#lastInputSum = sum;\n // if previous frame was skipped, skip this frame if changed more than cacheSensitivity\n // if previous frame was not skipped, then look for cacheSensitivity or difference larger than one in previous frame to avoid resetting cache in subsequent frames unnecessarily\n const skipFrame = diff < Math.max(this.config.cacheSensitivity, this.#lastCacheDiff);\n // if difference is above 4x threshold, don't use last value to force reset cache for significant change of scenes or images\n this.#lastCacheDiff = diff > 4 * this.config.cacheSensitivity ? 0 : diff;\n return skipFrame;\n }\n\n /** Main detection method\n * - Analyze configuration: {@link Config}\n * - Pre-process input: {@link Input}\n * - Run inference for all configured models\n * - Process and return result: {@link Result}\n */\n async detect(input: Input, userConfig: Config | Object = {}): Promise {\n // detection happens inside a promise\n return new Promise(async (resolve) => {\n this.state = 'config';\n let timeStamp;\n\n // update configuration\n this.config = mergeDeep(this.config, userConfig);\n\n // sanity checks\n this.state = 'check';\n const error = this.#sanity(input);\n if (error) {\n log(error, input);\n resolve({ error });\n }\n\n const timeStart = now();\n\n // configure backend\n await this.#checkBackend();\n\n // load models if enabled\n await this.load();\n\n /*\n // function disabled in favor of inputChanged\n // disable video optimization for inputs of type image, but skip if inside worker thread\n let previousVideoOptimized;\n // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (input && this.config.videoOptimized && (typeof window !== 'undefined') && (typeof WorkerGlobalScope !== 'undefined') && (\n (typeof HTMLImageElement !== 'undefined' && input instanceof HTMLImageElement)\n || (typeof Image !== 'undefined' && input instanceof Image)\n || (typeof ImageData !== 'undefined' && input instanceof ImageData)\n || (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap))\n ) {\n log('disabling video optimization');\n previousVideoOptimized = this.config.videoOptimized;\n this.config.videoOptimized = false;\n }\n */\n\n timeStamp = now();\n const process = image.process(input, this.config);\n if (!process || !process.tensor) {\n log('could not convert input to tensor');\n resolve({ error: 'could not convert input to tensor' });\n return;\n }\n this.perf.image = Math.trunc(now() - timeStamp);\n this.analyze('Get Image:');\n\n timeStamp = now();\n // @ts-ignore hidden dynamic property that is not part of definitions\n this.config.skipFrame = await this.#skipFrame(process.tensor);\n if (!this.perf.frames) this.perf.frames = 0;\n if (!this.perf.cached) this.perf.cached = 0;\n this.perf.frames++;\n // @ts-ignore hidden dynamic property that is not part of definitions\n if (this.config.skipFrame) this.perf.cached++;\n this.perf.changed = Math.trunc(now() - timeStamp);\n this.analyze('Check Changed:');\n\n // prepare where to store model results\n let bodyRes;\n let handRes;\n let faceRes;\n let objectRes;\n let current;\n\n // run face detection followed by all models that rely on face bounding box: face mesh, age, gender, emotion\n if (this.config.async) {\n faceRes = this.config.face.enabled ? face.detectFace(this, process.tensor) : [];\n if (this.perf.face) delete this.perf.face;\n } else {\n this.state = 'run:face';\n timeStamp = now();\n faceRes = this.config.face.enabled ? await face.detectFace(this, process.tensor) : [];\n current = Math.trunc(now() - timeStamp);\n if (current > 0) this.perf.face = current;\n }\n\n // run body: can be posenet or blazepose\n this.analyze('Start Body:');\n if (this.config.async) {\n if (this.config.body.modelPath.includes('posenet')) bodyRes = this.config.body.enabled ? posenet.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('blazepose')) bodyRes = this.config.body.enabled ? blazepose.predict(process.tensor, this.config) : [];\n if (this.perf.body) delete this.perf.body;\n } else {\n this.state = 'run:body';\n timeStamp = now();\n if (this.config.body.modelPath.includes('posenet')) bodyRes = this.config.body.enabled ? await posenet.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('blazepose')) bodyRes = this.config.body.enabled ? await blazepose.predict(process.tensor, this.config) : [];\n current = Math.trunc(now() - timeStamp);\n if (current > 0) this.perf.body = current;\n }\n this.analyze('End Body:');\n\n // run handpose\n this.analyze('Start Hand:');\n if (this.config.async) {\n handRes = this.config.hand.enabled ? handpose.predict(process.tensor, this.config) : [];\n if (this.perf.hand) delete this.perf.hand;\n } else {\n this.state = 'run:hand';\n timeStamp = now();\n handRes = this.config.hand.enabled ? await handpose.predict(process.tensor, this.config) : [];\n current = Math.trunc(now() - timeStamp);\n if (current > 0) this.perf.hand = current;\n }\n this.analyze('End Hand:');\n\n // run nanodet\n this.analyze('Start Object:');\n if (this.config.async) {\n if (this.config.object.modelPath.includes('nanodet')) objectRes = this.config.object.enabled ? nanodet.predict(process.tensor, this.config) : [];\n else if (this.config.object.modelPath.includes('centernet')) objectRes = this.config.object.enabled ? centernet.predict(process.tensor, this.config) : [];\n if (this.perf.object) delete this.perf.object;\n } else {\n this.state = 'run:object';\n timeStamp = now();\n if (this.config.object.modelPath.includes('nanodet')) objectRes = this.config.object.enabled ? await nanodet.predict(process.tensor, this.config) : [];\n else if (this.config.object.modelPath.includes('centernet')) objectRes = this.config.object.enabled ? await centernet.predict(process.tensor, this.config) : [];\n current = Math.trunc(now() - timeStamp);\n if (current > 0) this.perf.object = current;\n }\n this.analyze('End Object:');\n\n // if async wait for results\n if (this.config.async) {\n [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]);\n }\n tf.dispose(process.tensor);\n\n // run gesture analysis last\n let gestureRes: any[] = [];\n if (this.config.gesture.enabled) {\n timeStamp = now();\n gestureRes = [...gesture.face(faceRes), ...gesture.body(bodyRes), ...gesture.hand(handRes), ...gesture.iris(faceRes)];\n if (!this.config.async) this.perf.gesture = Math.trunc(now() - timeStamp);\n else if (this.perf.gesture) delete this.perf.gesture;\n }\n\n this.perf.total = Math.trunc(now() - timeStart);\n this.state = 'idle';\n const res = {\n face: faceRes,\n body: bodyRes,\n hand: handRes,\n gesture: gestureRes,\n object: objectRes,\n performance: this.perf,\n canvas: process.canvas,\n timestamp: Date.now(),\n };\n // log('Result:', result);\n resolve(res);\n });\n }\n\n /** @hidden */\n #warmupBitmap = async () => {\n const b64toBlob = (base64, type = 'application/octet-stream') => fetch(`data:${type};base64,${base64}`).then((res) => res.blob());\n let blob;\n let res;\n switch (this.config.warmup) {\n case 'face': blob = await b64toBlob(sample.face); break;\n case 'full': blob = await b64toBlob(sample.body); break;\n default: blob = null;\n }\n if (blob) {\n const bitmap = await createImageBitmap(blob);\n res = await this.detect(bitmap, this.config);\n bitmap.close();\n }\n return res;\n }\n\n /** @hidden */\n #warmupCanvas = async () => new Promise((resolve) => {\n let src;\n let size = 0;\n switch (this.config.warmup) {\n case 'face':\n size = 256;\n src = 'data:image/jpeg;base64,' + sample.face;\n break;\n case 'full':\n case 'body':\n size = 1200;\n src = 'data:image/jpeg;base64,' + sample.body;\n break;\n default:\n src = null;\n }\n // src = encodeURI('../assets/human-sample-upper.jpg');\n const img = new Image();\n img.onload = async () => {\n const canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(size, size) : document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n ctx?.drawImage(img, 0, 0);\n // const data = ctx?.getImageData(0, 0, canvas.height, canvas.width);\n const res = await this.detect(canvas, this.config);\n resolve(res);\n };\n if (src) img.src = src;\n else resolve(null);\n });\n\n /** @hidden */\n #warmupNode = async () => {\n const atob = (str) => Buffer.from(str, 'base64');\n let img;\n if (this.config.warmup === 'face') img = atob(sample.face);\n if (this.config.warmup === 'body' || this.config.warmup === 'full') img = atob(sample.body);\n if (!img) return null;\n let res;\n if (typeof tf['node'] !== 'undefined') {\n const data = tf['node'].decodeJpeg(img);\n const expanded = data.expandDims(0);\n this.tf.dispose(data);\n // log('Input:', expanded);\n res = await this.detect(expanded, this.config);\n this.tf.dispose(expanded);\n } else {\n if (this.config.debug) log('Warmup tfjs-node not loaded');\n /*\n const input = await canvasJS.loadImage(img);\n const canvas = canvasJS.createCanvas(input.width, input.height);\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, input.width, input.height);\n res = await this.detect(input, this.config);\n */\n }\n return res;\n }\n\n /** Warmup metho pre-initializes all models for faster inference\n * - can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n */\n async warmup(userConfig: Config | Object = {}): Promise {\n const t0 = now();\n if (userConfig) this.config = mergeDeep(this.config, userConfig);\n if (!this.config.warmup || this.config.warmup === 'none') return { error: 'null' };\n let res;\n if (typeof createImageBitmap === 'function') res = await this.#warmupBitmap();\n else if (typeof Image !== 'undefined') res = await this.#warmupCanvas();\n else res = await this.#warmupNode();\n const t1 = now();\n if (this.config.debug) log('Warmup', this.config.warmup, Math.round(t1 - t0), 'ms', res);\n return res;\n }\n}\n\n/**\n * Class Human is also available as default export\n */\nexport { Human as default };\n"], - "mappings": "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,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,kBAAkB;AAAA,EACnB,CAAC,gBAAgB;AAAA,EACjB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,kBAAkB;AAAA,EACnB,CAAC,iBAAiB;AAAA,EAClB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA,EACpB,CAAC,mBAAmB;AAAA;AAGf,IAAM,SAAS;AAAA,EACpB;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAG;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EACtJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EACrJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAC7I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EACrJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACnJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAG;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACnJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAG;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAC9I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EACtJ;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAClJ;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAG;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACnJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACrJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACnJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACnJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EACnJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAChJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAChJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC7I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC7I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EACnJ;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAClJ;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAChJ;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EACrJ;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAC9I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EACpJ;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACrJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EACpJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAC9I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAI;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAC9I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAChJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAChJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC9I;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC/I;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAChJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAClJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EACjJ;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAI;AAAA,EAAG;AAAA,EAAK;AAAA,EAAK;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IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,EAEL;AAAA,IACE,GAAG;AAAA,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AO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAAO,IAAI,OAAO;AAAA,EACpB,EAAE,OAA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AA0Jb,IAAM,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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", + "sourcesContent": ["// helper function: join two paths\nexport function join(folder: string, file: string): string {\n const separator = folder.endsWith('/') ? '' : '/';\n const skipJoin = file.startsWith('.') || file.startsWith('/') || file.startsWith('http:') || file.startsWith('https:') || file.startsWith('file:');\n const path = skipJoin ? `${file}` : `${folder}${separator}${file}`;\n if (!path.toLocaleLowerCase().includes('.json')) throw new Error(`Human: ModelPath Error: ${path} Expecting JSON file`);\n return path;\n}\n\n// helper function: wrapper around console output\nexport function log(...msg) {\n const dt = new Date();\n const ts = `${dt.getHours().toString().padStart(2, '0')}:${dt.getMinutes().toString().padStart(2, '0')}:${dt.getSeconds().toString().padStart(2, '0')}.${dt.getMilliseconds().toString().padStart(3, '0')}`;\n // eslint-disable-next-line no-console\n if (msg) console.log(ts, 'Human:', ...msg);\n}\n\n// helper function: gets elapsed time on both browser and nodejs\nexport const now = () => {\n if (typeof performance !== 'undefined') return performance.now();\n return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString());\n};\n\n// helper function: perform deep merge of multiple objects so it allows full inheriance with overrides\nexport function mergeDeep(...objects) {\n const isObject = (obj) => obj && typeof obj === 'object';\n return objects.reduce((prev, obj) => {\n Object.keys(obj || {}).forEach((key) => {\n const pVal = prev[key];\n const oVal = obj[key];\n if (Array.isArray(pVal) && Array.isArray(oVal)) prev[key] = pVal.concat(...oVal);\n else if (isObject(pVal) && isObject(oVal)) prev[key] = mergeDeep(pVal, oVal);\n else prev[key] = oVal;\n });\n return prev;\n }, {});\n}\n", "/* eslint-disable indent */\n/* eslint-disable no-multi-spaces */\n\n/**\n * Configuration interface definition for **Human** library\n *\n * Contains all configurable parameters\n */\nexport interface Config {\n /** Backend used for TFJS operations */\n backend: null | '' | 'cpu' | 'wasm' | 'webgl' | 'humangl' | 'tensorflow',\n\n /** Path to *.wasm files if backend is set to `wasm` */\n wasmPath: string,\n\n /** Print debug statements to console */\n debug: boolean,\n\n /** Perform model loading and inference concurrently or sequentially */\n async: boolean,\n\n /** What to use for `human.warmup()`\n * - warmup pre-initializes all models for faster inference but can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n */\n warmup: 'none' | 'face' | 'full' | 'body',\n\n /** Base model path (typically starting with file://, http:// or https://) for all models\n * - individual modelPath values are relative to this path\n */\n modelBasePath: string,\n\n /** Cache sensitivity\n * - values 0..1 where 0.01 means reset cache if input changed more than 1%\n * - set to 0 to disable caching\n */\n cacheSensitivity: number;\n\n /** Run input through image filters before inference\n * - image filters run with near-zero latency as they are executed on the GPU\n */\n filter: {\n enabled: boolean,\n /** Resize input width\n * - if both width and height are set to 0, there is no resizing\n * - if just one is set, second one is scaled automatically\n * - if both are set, values are used as-is\n */\n width: number,\n /** Resize input height\n * - if both width and height are set to 0, there is no resizing\n * - if just one is set, second one is scaled automatically\n * - if both are set, values are used as-is\n */\n height: number,\n /** Return processed canvas imagedata in result */\n return: boolean,\n /** Flip input as mirror image */\n flip: boolean,\n /** Range: -1 (darken) to 1 (lighten) */\n brightness: number,\n /** Range: -1 (reduce contrast) to 1 (increase contrast) */\n contrast: number,\n /** Range: 0 (no sharpening) to 1 (maximum sharpening) */\n sharpness: number,\n /** Range: 0 (no blur) to N (blur radius in pixels) */\n blur: number\n /** Range: -1 (reduce saturation) to 1 (increase saturation) */\n saturation: number,\n /** Range: 0 (no change) to 360 (hue rotation in degrees) */\n hue: number,\n /** Image negative */\n negative: boolean,\n /** Image sepia colors */\n sepia: boolean,\n /** Image vintage colors */\n vintage: boolean,\n /** Image kodachrome colors */\n kodachrome: boolean,\n /** Image technicolor colors */\n technicolor: boolean,\n /** Image polaroid camera effect */\n polaroid: boolean,\n /** Range: 0 (no pixelate) to N (number of pixels to pixelate) */\n pixelate: number,\n },\n // type definition end\n\n /** Controlls gesture detection */\n gesture: {\n enabled: boolean,\n },\n\n /** Controlls and configures all face-specific options:\n * - face detection, face mesh detection, age, gender, emotion detection and face description\n * Parameters:\n * - enabled: true/false\n * - modelPath: path for each of face models\n * - minConfidence: threshold for discarding a prediction\n * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n * - maxDetected: maximum number of faces detected in the input, should be set to the minimum number for performance\n * - rotation: use calculated rotated face image or just box with rotation as-is, false means higher performance, but incorrect mesh mapping on higher face angles\n * - return: return extracted face as tensor for futher user processing\n */\n face: {\n enabled: boolean,\n detector: {\n modelPath: string,\n rotation: boolean,\n maxDetected: number,\n skipFrames: number,\n minConfidence: number,\n iouThreshold: number,\n return: boolean,\n },\n mesh: {\n enabled: boolean,\n modelPath: string,\n },\n iris: {\n enabled: boolean,\n modelPath: string,\n },\n description: {\n enabled: boolean,\n modelPath: string,\n skipFrames: number,\n minConfidence: number,\n },\n emotion: {\n enabled: boolean,\n minConfidence: number,\n skipFrames: number,\n modelPath: string,\n },\n },\n\n /** Controlls and configures all body detection specific options\n * - enabled: true/false\n * - modelPath: body pose model, can be absolute path or relative to modelBasePath\n * - minConfidence: threshold for discarding a prediction\n * - maxDetected: maximum number of people detected in the input, should be set to the minimum number for performance\n */\n body: {\n enabled: boolean,\n modelPath: string,\n maxDetected: number,\n minConfidence: number,\n },\n\n /** Controlls and configures all hand detection specific options\n * - enabled: true/false\n * - landmarks: detect hand landmarks or just hand boundary box\n * - modelPath: paths for hand detector and hand skeleton models, can be absolute path or relative to modelBasePath\n * - minConfidence: threshold for discarding a prediction\n * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n * - maxDetected: maximum number of hands detected in the input, should be set to the minimum number for performance\n * - rotation: use best-guess rotated hand image or just box with rotation as-is, false means higher performance, but incorrect finger mapping if hand is inverted\n */\n hand: {\n enabled: boolean,\n rotation: boolean,\n skipFrames: number,\n minConfidence: number,\n iouThreshold: number,\n maxDetected: number,\n landmarks: boolean,\n detector: {\n modelPath: string,\n },\n skeleton: {\n modelPath: string,\n },\n },\n\n /** Controlls and configures all object detection specific options\n * - enabled: true/false\n * - modelPath: object detection model, can be absolute path or relative to modelBasePath\n * - minConfidence: minimum score that detection must have to return as valid object\n * - iouThreshold: ammount of overlap between two detected objects before one object is removed\n * - maxDetected: maximum number of detections to return\n */\n object: {\n enabled: boolean,\n modelPath: string,\n minConfidence: number,\n iouThreshold: number,\n maxDetected: number,\n skipFrames: number,\n },\n}\n\nconst config: Config = {\n backend: 'webgl', // select tfjs backend to use, leave empty to use default backend\n // can be 'webgl', 'wasm', 'cpu', or 'humangl' which is a custom version of webgl\n modelBasePath: '../models/', // base path for all models\n wasmPath: '../node_modules/@tensorflow/tfjs-backend-wasm/dist//', // path for wasm binaries, only used for backend: wasm\n debug: true, // print additional status messages to console\n async: true, // execute enabled models in parallel\n warmup: 'full', // what to use for human.warmup(), can be 'none', 'face', 'full'\n // warmup pre-initializes all models for faster inference but can take\n // significant time on startup\n // only used for `webgl` and `humangl` backends\n cacheSensitivity: 0.01, // cache sensitivity\n // values 0..1 where 0.01 means reset cache if input changed more than 1%\n // set to 0 to disable caching\n filter: { // run input through image filters before inference\n // image filters run with near-zero latency as they are executed on the GPU\n enabled: true, // enable image pre-processing filters\n width: 0, // resize input width\n height: 0, // resize input height\n // if both width and height are set to 0, there is no resizing\n // if just one is set, second one is scaled automatically\n // if both are set, values are used as-is\n flip: false, // flip input as mirror image\n return: true, // return processed canvas imagedata in result\n brightness: 0, // range: -1 (darken) to 1 (lighten)\n contrast: 0, // range: -1 (reduce contrast) to 1 (increase contrast)\n sharpness: 0, // range: 0 (no sharpening) to 1 (maximum sharpening)\n blur: 0, // range: 0 (no blur) to N (blur radius in pixels)\n saturation: 0, // range: -1 (reduce saturation) to 1 (increase saturation)\n hue: 0, // range: 0 (no change) to 360 (hue rotation in degrees)\n negative: false, // image negative\n sepia: false, // image sepia colors\n vintage: false, // image vintage colors\n kodachrome: false, // image kodachrome colors\n technicolor: false, // image technicolor colors\n polaroid: false, // image polaroid camera effect\n pixelate: 0, // range: 0 (no pixelate) to N (number of pixels to pixelate)\n },\n\n gesture: {\n enabled: true, // enable gesture recognition based on model results\n },\n\n face: {\n enabled: true, // controls if specified modul is enabled\n // face.enabled is required for all face models:\n // detector, mesh, iris, age, gender, emotion\n // (note: module is not loaded until it is required)\n detector: {\n modelPath: 'blazeface.json', // detector model, can be absolute path or relative to modelBasePath\n rotation: false, // use best-guess rotated face image or just box with rotation as-is\n // false means higher performance, but incorrect mesh mapping if face angle is above 20 degrees\n // this parameter is not valid in nodejs\n maxDetected: 10, // maximum number of faces detected in the input\n // should be set to the minimum number for performance\n skipFrames: 21, // how many max frames to go without re-running the face bounding box detector\n // only used when cacheSensitivity is not zero\n // e.g., if model is running st 25 FPS, we can re-use existing bounding\n // box for updated face analysis as the head probably hasn't moved much\n // in short time (10 * 1/25 = 0.25 sec)\n minConfidence: 0.2, // threshold for discarding a prediction\n iouThreshold: 0.1, // ammount of overlap between two detected objects before one object is removed\n return: false, // return extracted face as tensor\n },\n\n mesh: {\n enabled: true,\n modelPath: 'facemesh.json', // facemesh model, can be absolute path or relative to modelBasePath\n },\n\n iris: {\n enabled: true,\n modelPath: 'iris.json', // face iris model\n // can be either absolute path or relative to modelBasePath\n },\n\n description: {\n enabled: true, // to improve accuracy of face description extraction it is\n // recommended to enable detector.rotation and mesh.enabled\n modelPath: 'faceres.json', // face description model\n // can be either absolute path or relative to modelBasePath\n skipFrames: 31, // how many max frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n minConfidence: 0.1, // threshold for discarding a prediction\n },\n\n emotion: {\n enabled: true,\n minConfidence: 0.1, // threshold for discarding a prediction\n skipFrames: 32, // how max many frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n modelPath: 'emotion.json', // face emotion model, can be absolute path or relative to modelBasePath\n },\n },\n\n body: {\n enabled: true,\n modelPath: 'posenet.json', // body model, can be absolute path or relative to modelBasePath\n // can be 'posenet' or 'blazepose'\n maxDetected: 1, // maximum number of people detected in the input\n // should be set to the minimum number for performance\n // only valid for posenet as blazepose only detects single pose\n minConfidence: 0.1, // threshold for discarding a prediction\n },\n\n hand: {\n enabled: true,\n rotation: false, // use best-guess rotated hand image or just box with rotation as-is\n // false means higher performance, but incorrect finger mapping if hand is inverted\n skipFrames: 32, // how many max frames to go without re-running the hand bounding box detector\n // only used when cacheSensitivity is not zero\n // e.g., if model is running st 25 FPS, we can re-use existing bounding\n // box for updated hand skeleton analysis as the hand probably\n // hasn't moved much in short time (10 * 1/25 = 0.25 sec)\n minConfidence: 0.1, // threshold for discarding a prediction\n iouThreshold: 0.1, // ammount of overlap between two detected objects before one object is removed\n maxDetected: 2, // maximum number of hands detected in the input\n // should be set to the minimum number for performance\n landmarks: true, // detect hand landmarks or just hand boundary box\n detector: {\n modelPath: 'handdetect.json', // hand detector model, can be absolute path or relative to modelBasePath\n },\n skeleton: {\n modelPath: 'handskeleton.json', // hand skeleton model, can be absolute path or relative to modelBasePath\n },\n },\n\n object: {\n enabled: false,\n modelPath: 'mb3-centernet.json', // experimental: object detection model, can be absolute path or relative to modelBasePath\n // can be 'mb3-centernet' or 'nanodet'\n minConfidence: 0.2, // threshold for discarding a prediction\n iouThreshold: 0.4, // ammount of overlap between two detected objects before one object is removed\n maxDetected: 10, // maximum number of objects detected in the input\n skipFrames: 41, // how many max frames to go without re-running the detector\n // only used when cacheSensitivity is not zero\n },\n};\nexport { config as defaults };\n", "export function info(): { platform: string, agent: string } {\n let platform;\n let agent;\n if (typeof navigator !== 'undefined') {\n const raw = navigator.userAgent.match(/\\(([^()]+)\\)/g);\n if (raw && raw[0]) {\n const platformMatch = raw[0].match(/\\(([^()]+)\\)/g);\n platform = platformMatch ? platformMatch[0].replace(/\\(|\\)/g, '') : '';\n agent = navigator.userAgent.replace(raw[0], '');\n if (platform[1]) agent = agent.replace(raw[1], '');\n agent = agent.replace(/ /g, ' ');\n }\n } else if (typeof process !== 'undefined') {\n platform = `${process.platform} ${process.arch}`;\n agent = `NodeJS ${process.version}`;\n }\n return { platform, agent };\n}\n", "// wrapper to load tfjs in a single place so version can be changed quickly\n\n// simplified\n// { modules: 1250, moduleBytes: 4013323, imports: 7, importBytes: 2255, outputBytes: 2991826, outputFiles: 'dist/tfjs.esm.js' }\n// export * from '@tensorflow/tfjs/dist/index.js';\n// export * from '@tensorflow/tfjs-backend-wasm';\n\n// modular\n// { modules: 1253, moduleBytes: 4029357, imports: 7, importBytes: 2285, outputBytes: 2998298, outputFiles: 'dist/tfjs.esm.js' }\n\n// get versions of all packages.\nimport * as packageBundle from '@tensorflow/tfjs/package.json';\nimport * as packageCore from '@tensorflow/tfjs-core/package.json';\nimport * as packageData from '@tensorflow/tfjs-data/package.json';\nimport * as packageLayers from '@tensorflow/tfjs-layers/package.json';\nimport * as packageConverter from '@tensorflow/tfjs-converter/package.json';\n// for backends, get version from source so it can register backend during import\nimport { version_cpu } from '@tensorflow/tfjs-backend-cpu/dist/index.js';\nimport { version_webgl } from '@tensorflow/tfjs-backend-webgl/dist/index.js';\nimport { version_wasm } from '@tensorflow/tfjs-backend-wasm/dist/index.js';\n\n// export all - compiled\nexport * from '@tensorflow/tfjs-core/dist/index.js';\nexport * from '@tensorflow/tfjs-layers/dist/index.js';\nexport * from '@tensorflow/tfjs-converter/dist/index.js';\nexport * as data from '@tensorflow/tfjs-data/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-cpu/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-webgl/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-wasm/dist/index.js';\n\n// export all - sources\n/*\nexport * from '@tensorflow/tfjs-core/src/index';\nexport * from '@tensorflow/tfjs-layers/src/index';\nexport * from '@tensorflow/tfjs-converter/src/index';\nexport * as data from '@tensorflow/tfjs-data/src/index';\nexport * from '@tensorflow/tfjs-backend-cpu/src/index';\nexport * from '@tensorflow/tfjs-backend-webgl/src/index';\nexport * from '@tensorflow/tfjs-backend-wasm/src/index';\n*/\n\n// export versions\nexport const version = {\n tfjs: packageBundle?.version || undefined,\n 'tfjs-core': packageCore?.version || undefined,\n 'tfjs-data': packageData?.version || undefined,\n 'tfjs-layers': packageLayers?.version || undefined,\n 'tfjs-converter': packageConverter?.version || undefined,\n 'tfjs-backend-cpu': version_cpu || undefined,\n 'tfjs-backend-webgl': version_webgl || undefined,\n 'tfjs-backend-wasm': version_wasm || undefined,\n};\n// export const version = {};\n", "import { log } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\n\nexport const config = {\n name: 'humangl',\n priority: 99,\n canvas: null,\n gl: null,\n width: 1024,\n height: 1024,\n webGLattr: { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.2\n alpha: false,\n antialias: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n depth: false,\n stencil: false,\n failIfMajorPerformanceCaveat: false,\n desynchronized: true,\n },\n};\n\nexport function register(): void {\n if (!tf.findBackend(config.name)) {\n log('backend registration:', config.name);\n try {\n config.canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(config.width, config.height) : document.createElement('canvas');\n } catch (err) {\n log('error: cannot create canvas:', err);\n return;\n }\n try {\n config.gl = config.canvas.getContext('webgl2', config.webGLattr);\n } catch (err) {\n log('error: cannot get WebGL2 context:', err);\n return;\n }\n try {\n tf.setWebGLContext(2, config.gl);\n } catch (err) {\n log('error: cannot set WebGL2 context:', err);\n return;\n }\n try {\n const ctx = new tf.GPGPUContext(config.gl);\n tf.registerBackend(config.name, () => new tf.MathBackendWebGL(ctx), config.priority);\n } catch (err) {\n log('error: cannot register WebGL backend:', err);\n return;\n }\n try {\n const kernels = tf.getKernelsForBackend('webgl');\n kernels.forEach((kernelConfig) => {\n const newKernelConfig = { ...kernelConfig, backendName: config.name };\n tf.registerKernel(newKernelConfig);\n });\n } catch (err) {\n log('error: cannot update WebGL backend registration:', err);\n return;\n }\n try {\n tf.ENV.set('WEBGL_VERSION', 2);\n // tf.ENV.set('WEBGL_MAX_TEXTURE_SIZE', config.gl.getParameter(config.gl.MAX_TEXTURE_SIZE));\n // tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true);\n // tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', true);\n } catch (err) {\n log('error: cannot set WebGL backend flags:', err);\n return;\n }\n log('backend registered:', config.name);\n }\n}\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as blazeface from './blazeface';\nimport * as facepipeline from './facepipeline';\nimport * as coords from './coords';\n\nlet faceModels:[any, any, any] = [null, null, null];\nlet facePipeline;\n\nexport async function predict(input, config): Promise<{ confidence, boxConfidence, faceConfidence, box, mesh, boxRaw, meshRaw, annotations, image }[]> {\n const predictions = await facePipeline.predict(input, config);\n const results: Array<{ confidence, boxConfidence, faceConfidence, box, mesh, boxRaw, meshRaw, annotations, image }> = [];\n for (const prediction of (predictions || [])) {\n if (!prediction || prediction.isDisposedInternal) continue; // guard against disposed tensors on long running operations such as pause in middle of processing\n const meshRaw = prediction.mesh.map((pt) => [\n pt[0] / input.shape[2],\n pt[1] / input.shape[1],\n pt[2] / facePipeline.meshSize,\n ]);\n const annotations = {};\n if (prediction.mesh && prediction.mesh.length > 0) {\n for (const key of Object.keys(coords.MESH_ANNOTATIONS)) annotations[key] = coords.MESH_ANNOTATIONS[key].map((index) => prediction.mesh[index]);\n }\n const clampedBox = prediction.box ? [\n Math.max(0, prediction.box.startPoint[0]),\n Math.max(0, prediction.box.startPoint[1]),\n Math.min(input.shape[2], prediction.box.endPoint[0]) - Math.max(0, prediction.box.startPoint[0]),\n Math.min(input.shape[1], prediction.box.endPoint[1]) - Math.max(0, prediction.box.startPoint[1]),\n ] : 0;\n const boxRaw = prediction.box ? [\n prediction.box.startPoint[0] / input.shape[2],\n prediction.box.startPoint[1] / input.shape[1],\n (prediction.box.endPoint[0] - prediction.box.startPoint[0]) / input.shape[2],\n (prediction.box.endPoint[1] - prediction.box.startPoint[1]) / input.shape[1],\n ] : [];\n results.push({\n confidence: Math.round(100 * prediction.faceConfidence || 100 * prediction.boxConfidence || 0) / 100,\n boxConfidence: Math.round(100 * prediction.boxConfidence) / 100,\n faceConfidence: Math.round(100 * prediction.faceConfidence) / 100,\n box: clampedBox,\n boxRaw,\n mesh: prediction.mesh,\n meshRaw,\n annotations,\n image: prediction.image,\n });\n if (prediction.coords) prediction.coords.dispose();\n }\n return results;\n}\n\nexport async function load(config): Promise<[Object, Object, Object]> {\n if ((!faceModels[0] && config.face.enabled) || (!faceModels[1] && config.face.mesh.enabled) || (!faceModels[2] && config.face.iris.enabled)) {\n faceModels = await Promise.all([\n (!faceModels[0] && config.face.enabled) ? blazeface.load(config) : null,\n (!faceModels[1] && config.face.mesh.enabled) ? tf.loadGraphModel(join(config.modelBasePath, config.face.mesh.modelPath), { fromTFHub: config.face.mesh.modelPath.includes('tfhub.dev') }) : null,\n (!faceModels[2] && config.face.iris.enabled) ? tf.loadGraphModel(join(config.modelBasePath, config.face.iris.modelPath), { fromTFHub: config.face.iris.modelPath.includes('tfhub.dev') }) : null,\n ]);\n if (config.face.mesh.enabled) {\n if (!faceModels[1] || !faceModels[1].modelUrl) log('load model failed:', config.face.mesh.modelPath);\n else if (config.debug) log('load model:', faceModels[1].modelUrl);\n }\n if (config.face.iris.enabled) {\n if (!faceModels[2] || !faceModels[1].modelUrl) log('load model failed:', config.face.iris.modelPath);\n else if (config.debug) log('load model:', faceModels[2].modelUrl);\n }\n } else if (config.debug) {\n log('cached model:', faceModels[0].model.modelUrl);\n log('cached model:', faceModels[1].modelUrl);\n log('cached model:', faceModels[2].modelUrl);\n }\n facePipeline = new facepipeline.Pipeline(faceModels[0], faceModels[1], faceModels[2]);\n return faceModels;\n}\n\nexport const triangulation = coords.TRI468;\nexport const uvmap = coords.UV468;\n", "import * as tf from '../../dist/tfjs.esm.js';\n\nexport function scaleBoxCoordinates(box, factor) {\n const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]];\n const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\n return { startPoint, endPoint };\n}\n\nexport function getBoxSize(box) {\n return [\n Math.abs(box.endPoint[0] - box.startPoint[0]),\n Math.abs(box.endPoint[1] - box.startPoint[1]),\n ];\n}\n\nexport function getBoxCenter(box) {\n return [\n box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2,\n box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2,\n ];\n}\n\nexport function cutBoxFromImageAndResize(box, image, cropSize) {\n const h = image.shape[1];\n const w = image.shape[2];\n const boxes = [[\n box.startPoint[1] / h,\n box.startPoint[0] / w,\n box.endPoint[1] / h,\n box.endPoint[0] / w,\n ]];\n return tf.image.cropAndResize(image, boxes, [0], cropSize);\n}\n\nexport function enlargeBox(box, factor = 1.5) {\n const center = getBoxCenter(box);\n const size = getBoxSize(box);\n const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2];\n const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]];\n const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]];\n return { startPoint, endPoint, landmarks: box.landmarks };\n}\n\nexport function squarifyBox(box) {\n const centers = getBoxCenter(box);\n const size = getBoxSize(box);\n const maxEdge = Math.max(...size);\n const halfSize = maxEdge / 2;\n const startPoint = [Math.round(centers[0] - halfSize), Math.round(centers[1] - halfSize)];\n const endPoint = [Math.round(centers[0] + halfSize), Math.round(centers[1] + halfSize)];\n return { startPoint, endPoint, landmarks: box.landmarks };\n}\n\nexport function calculateLandmarksBoundingBox(landmarks) {\n const xs = landmarks.map((d) => d[0]);\n const ys = landmarks.map((d) => d[1]);\n const startPoint = [Math.min(...xs), Math.min(...ys)];\n const endPoint = [Math.max(...xs), Math.max(...ys)];\n return { startPoint, endPoint, landmarks };\n}\n\nexport const disposeBox = (t) => {\n t.startPoint.dispose();\n t.endPoint.dispose();\n};\n\nexport const createBox = (startEndTensor) => ({\n startPoint: tf.slice(startEndTensor, [0, 0], [-1, 2]),\n endPoint: tf.slice(startEndTensor, [0, 2], [-1, 2]),\n});\n", "export const IDENTITY_MATRIX = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];\n/**\n * Normalizes the provided angle to the range -pi to pi.\n * @param angle The angle in radians to be normalized.\n */\nexport function normalizeRadians(angle) {\n return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n}\n\n/**\n * Computes the angle of rotation between two anchor points.\n * @param point1 First anchor point\n * @param point2 Second anchor point\n */\nexport function computeRotation(point1, point2) {\n const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]);\n return normalizeRadians(radians);\n}\n\nexport function radToDegrees(rad) {\n return rad * 180 / Math.PI;\n}\n\nexport function buildTranslationMatrix(x, y) {\n return [[1, 0, x], [0, 1, y], [0, 0, 1]];\n}\n\nexport function dot(v1, v2) {\n let product = 0;\n for (let i = 0; i < v1.length; i++) {\n product += v1[i] * v2[i];\n }\n return product;\n}\n\nexport function getColumnFrom2DArr(arr, columnIndex) {\n const column: Array = [];\n for (let i = 0; i < arr.length; i++) {\n column.push(arr[i][columnIndex]);\n }\n return column;\n}\n\nexport function multiplyTransformMatrices(mat1, mat2) {\n const product: Array = [];\n const size = mat1.length;\n for (let row = 0; row < size; row++) {\n product.push([]);\n for (let col = 0; col < size; col++) {\n product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n }\n }\n return product;\n}\n\nexport function buildRotationMatrix(rotation, center) {\n const cosA = Math.cos(rotation);\n const sinA = Math.sin(rotation);\n const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]];\n const translationMatrix = buildTranslationMatrix(center[0], center[1]);\n const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix);\n const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]);\n return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix);\n}\n\nexport function invertTransformMatrix(matrix) {\n const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]];\n const translationComponent = [matrix[0][2], matrix[1][2]];\n const invertedTranslation = [\n -dot(rotationComponent[0], translationComponent),\n -dot(rotationComponent[1], translationComponent),\n ];\n return [\n rotationComponent[0].concat(invertedTranslation[0]),\n rotationComponent[1].concat(invertedTranslation[1]),\n [0, 0, 1],\n ];\n}\n\nexport function rotatePoint(homogeneousCoordinate, rotationMatrix) {\n return [\n dot(homogeneousCoordinate, rotationMatrix[0]),\n dot(homogeneousCoordinate, rotationMatrix[1]),\n ];\n}\n\nexport function xyDistanceBetweenPoints(a, b) {\n return Math.sqrt(((a[0] - b[0]) ** 2) + ((a[1] - b[1]) ** 2));\n}\n\nexport function generateAnchors(inputSize) {\n const spec = { strides: [inputSize / 16, inputSize / 8], anchors: [2, 6] };\n const anchors: Array<[number, number]> = [];\n for (let i = 0; i < spec.strides.length; i++) {\n const stride = spec.strides[i];\n const gridRows = Math.floor((inputSize + stride - 1) / stride);\n const gridCols = Math.floor((inputSize + stride - 1) / stride);\n const anchorsNum = spec.anchors[i];\n for (let gridY = 0; gridY < gridRows; gridY++) {\n const anchorY = stride * (gridY + 0.5);\n for (let gridX = 0; gridX < gridCols; gridX++) {\n const anchorX = stride * (gridX + 0.5);\n for (let n = 0; n < anchorsNum; n++) {\n anchors.push([anchorX, anchorY]);\n }\n }\n }\n }\n return anchors;\n}\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as util from './util';\n\nconst keypointsCount = 6;\n\nfunction decodeBounds(boxOutputs, anchors, inputSize) {\n const boxStarts = tf.slice(boxOutputs, [0, 1], [-1, 2]);\n const centers = tf.add(boxStarts, anchors);\n const boxSizes = tf.slice(boxOutputs, [0, 3], [-1, 2]);\n const boxSizesNormalized = tf.div(boxSizes, inputSize);\n const centersNormalized = tf.div(centers, inputSize);\n const halfBoxSize = tf.div(boxSizesNormalized, 2);\n const starts = tf.sub(centersNormalized, halfBoxSize);\n const ends = tf.add(centersNormalized, halfBoxSize);\n const startNormalized = tf.mul(starts, inputSize);\n const endNormalized = tf.mul(ends, inputSize);\n const concatAxis = 1;\n return tf.concat2d([startNormalized, endNormalized], concatAxis);\n}\n\nexport class BlazeFaceModel {\n model: any;\n anchorsData: any;\n anchors: any;\n inputSize: number;\n config: any;\n\n constructor(model, config) {\n this.model = model;\n this.anchorsData = util.generateAnchors(model.inputs[0].shape[1]);\n this.anchors = tf.tensor2d(this.anchorsData);\n this.inputSize = model.inputs[0].shape[2];\n this.config = config;\n }\n\n async getBoundingBoxes(inputImage) {\n // sanity check on input\n if ((!inputImage) || (inputImage.isDisposedInternal) || (inputImage.shape.length !== 4) || (inputImage.shape[1] < 1) || (inputImage.shape[2] < 1)) return null;\n const [batch, boxes, scores] = tf.tidy(() => {\n const resizedImage = inputImage.resizeBilinear([this.inputSize, this.inputSize]);\n const normalizedImage = resizedImage.div(127.5).sub(0.5);\n const res = this.model.execute(normalizedImage);\n let batchOut;\n if (Array.isArray(res)) { // are we using tfhub or pinto converted model?\n const sorted = res.sort((a, b) => a.size - b.size);\n const concat384 = tf.concat([sorted[0], sorted[2]], 2); // dim: 384, 1 + 16\n const concat512 = tf.concat([sorted[1], sorted[3]], 2); // dim: 512, 1 + 16\n const concat = tf.concat([concat512, concat384], 1);\n batchOut = concat.squeeze(0);\n } else {\n batchOut = res.squeeze(); // when using tfhub model\n }\n const boxesOut = decodeBounds(batchOut, this.anchors, [this.inputSize, this.inputSize]);\n const logits = tf.slice(batchOut, [0, 0], [-1, 1]);\n const scoresOut = tf.sigmoid(logits).squeeze().dataSync();\n return [batchOut, boxesOut, scoresOut];\n });\n const nmsTensor = await tf.image.nonMaxSuppressionAsync(boxes, scores, this.config.face.detector.maxDetected, this.config.face.detector.iouThreshold, this.config.face.detector.minConfidence);\n const nms = nmsTensor.arraySync();\n nmsTensor.dispose();\n const annotatedBoxes: Array<{ box: any, landmarks: any, anchor: number[], confidence: number }> = [];\n for (let i = 0; i < nms.length; i++) {\n const confidence = scores[nms[i]];\n if (confidence > this.config.face.detector.minConfidence) {\n const boundingBox = tf.slice(boxes, [nms[i], 0], [1, -1]);\n const localBox = box.createBox(boundingBox);\n boundingBox.dispose();\n const anchor = this.anchorsData[nms[i]];\n const landmarks = tf.tidy(() => tf.slice(batch, [nms[i], keypointsCount - 1], [1, -1]).squeeze().reshape([keypointsCount, -1]));\n annotatedBoxes.push({ box: localBox, landmarks, anchor, confidence });\n }\n }\n // boundingBoxes.forEach((t) => t.dispose());\n batch.dispose();\n boxes.dispose();\n // scores.dispose();\n return {\n boxes: annotatedBoxes,\n scaleFactor: [inputImage.shape[2] / this.inputSize, inputImage.shape[1] / this.inputSize],\n };\n }\n}\n\nexport async function load(config) {\n const model = await tf.loadGraphModel(join(config.modelBasePath, config.face.detector.modelPath), { fromTFHub: config.face.detector.modelPath.includes('tfhub.dev') });\n const blazeFace = new BlazeFaceModel(model, config);\n if (!model || !model.modelUrl) log('load model failed:', config.face.detector.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n return blazeFace;\n}\n", "export const MESH_ANNOTATIONS = {\n silhouette: [\n 10, 338, 297, 332, 284, 251, 389, 356, 454, 323, 361, 288,\n 397, 365, 379, 378, 400, 377, 152, 148, 176, 149, 150, 136,\n 172, 58, 132, 93, 234, 127, 162, 21, 54, 103, 67, 109,\n ],\n lipsUpperOuter: [61, 185, 40, 39, 37, 0, 267, 269, 270, 409, 291],\n lipsLowerOuter: [146, 91, 181, 84, 17, 314, 405, 321, 375, 291],\n lipsUpperInner: [78, 191, 80, 81, 82, 13, 312, 311, 310, 415, 308],\n lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308],\n rightEyeUpper0: [246, 161, 160, 159, 158, 157, 173],\n rightEyeLower0: [33, 7, 163, 144, 145, 153, 154, 155, 133],\n rightEyeUpper1: [247, 30, 29, 27, 28, 56, 190],\n rightEyeLower1: [130, 25, 110, 24, 23, 22, 26, 112, 243],\n rightEyeUpper2: [113, 225, 224, 223, 222, 221, 189],\n rightEyeLower2: [226, 31, 228, 229, 230, 231, 232, 233, 244],\n rightEyeLower3: [143, 111, 117, 118, 119, 120, 121, 128, 245],\n rightEyebrowUpper: [156, 70, 63, 105, 66, 107, 55, 193],\n rightEyebrowLower: [35, 124, 46, 53, 52, 65],\n rightEyeIris: [473, 474, 475, 476, 477],\n leftEyeUpper0: [466, 388, 387, 386, 385, 384, 398],\n leftEyeLower0: [263, 249, 390, 373, 374, 380, 381, 382, 362],\n leftEyeUpper1: [467, 260, 259, 257, 258, 286, 414],\n leftEyeLower1: [359, 255, 339, 254, 253, 252, 256, 341, 463],\n leftEyeUpper2: [342, 445, 444, 443, 442, 441, 413],\n leftEyeLower2: [446, 261, 448, 449, 450, 451, 452, 453, 464],\n leftEyeLower3: [372, 340, 346, 347, 348, 349, 350, 357, 465],\n leftEyebrowUpper: [383, 300, 293, 334, 296, 336, 285, 417],\n leftEyebrowLower: [265, 353, 276, 283, 282, 295],\n leftEyeIris: [468, 469, 470, 471, 472],\n midwayBetweenEyes: [168],\n noseTip: [1],\n noseBottom: [2],\n noseRightCorner: [98],\n noseLeftCorner: [327],\n rightCheek: [205],\n leftCheek: [425],\n};\n\nexport const MESH_TO_IRIS_INDICES_MAP = [ // A mapping from facemesh model keypoints to iris model keypoints.\n { key: 'EyeUpper0', indices: [9, 10, 11, 12, 13, 14, 15] },\n { key: 'EyeUpper1', indices: [25, 26, 27, 28, 29, 30, 31] },\n { key: 'EyeUpper2', indices: [41, 42, 43, 44, 45, 46, 47] },\n { key: 'EyeLower0', indices: [0, 1, 2, 3, 4, 5, 6, 7, 8] },\n { key: 'EyeLower1', indices: [16, 17, 18, 19, 20, 21, 22, 23, 24] },\n { key: 'EyeLower2', indices: [32, 33, 34, 35, 36, 37, 38, 39, 40] },\n { key: 'EyeLower3', indices: [54, 55, 56, 57, 58, 59, 60, 61, 62] },\n // { key: 'EyebrowUpper', indices: [63, 64, 65, 66, 67, 68, 69, 70] },\n // { key: 'EyebrowLower', indices: [48, 49, 50, 51, 52, 53] },\n];\n\nexport const UV468 = [\n [0.499976992607117, 0.652534008026123],\n [0.500025987625122, 0.547487020492554],\n [0.499974012374878, 0.602371990680695],\n [0.482113003730774, 0.471979022026062],\n [0.500150978565216, 0.527155995368958],\n [0.499909996986389, 0.498252987861633],\n [0.499523013830185, 0.40106201171875],\n [0.289712011814117, 0.380764007568359],\n [0.499954998493195, 0.312398016452789],\n [0.499987006187439, 0.269918978214264],\n [0.500023007392883, 0.107050001621246],\n [0.500023007392883, 0.666234016418457],\n [0.5000159740448, 0.679224014282227],\n [0.500023007392883, 0.692348003387451],\n [0.499976992607117, 0.695277988910675],\n [0.499976992607117, 0.70593398809433],\n [0.499976992607117, 0.719385027885437],\n [0.499976992607117, 0.737019002437592],\n [0.499967992305756, 0.781370997428894],\n [0.499816000461578, 0.562981009483337],\n [0.473773002624512, 0.573909997940063],\n [0.104906998574734, 0.254140973091125],\n [0.365929991006851, 0.409575998783112],\n [0.338757991790771, 0.41302502155304],\n [0.311120003461838, 0.409460008144379],\n [0.274657994508743, 0.389131009578705],\n [0.393361985683441, 0.403706014156342],\n [0.345234006643295, 0.344011008739471],\n [0.370094001293182, 0.346076011657715],\n [0.319321990013123, 0.347265005111694],\n [0.297903001308441, 0.353591024875641],\n [0.24779200553894, 0.410809993743896],\n [0.396889001131058, 0.842755019664764],\n [0.280097991228104, 0.375599980354309],\n [0.106310002505779, 0.399955987930298],\n [0.2099249958992, 0.391353011131287],\n [0.355807989835739, 0.534406006336212],\n [0.471751004457474, 0.65040397644043],\n [0.474155008792877, 0.680191993713379],\n [0.439785003662109, 0.657229006290436],\n [0.414617002010345, 0.66654098033905],\n [0.450374007225037, 0.680860996246338],\n [0.428770989179611, 0.682690978050232],\n [0.374971002340317, 0.727805018424988],\n [0.486716985702515, 0.547628998756409],\n [0.485300987958908, 0.527395009994507],\n [0.257764995098114, 0.314490020275116],\n [0.401223003864288, 0.455172002315521],\n [0.429818987846375, 0.548614978790283],\n [0.421351999044418, 0.533740997314453],\n [0.276895999908447, 0.532056987285614],\n [0.483370006084442, 0.499586999416351],\n [0.33721199631691, 0.282882988452911],\n [0.296391993761063, 0.293242990970612],\n [0.169294998049736, 0.193813979625702],\n [0.447580009698868, 0.302609980106354],\n [0.392390012741089, 0.353887975215912],\n [0.354490011930466, 0.696784019470215],\n [0.067304998636246, 0.730105042457581],\n [0.442739009857178, 0.572826027870178],\n [0.457098007202148, 0.584792017936707],\n [0.381974011659622, 0.694710969924927],\n [0.392388999462128, 0.694203019142151],\n [0.277076005935669, 0.271932005882263],\n [0.422551989555359, 0.563233017921448],\n [0.385919004678726, 0.281364023685455],\n [0.383103013038635, 0.255840003490448],\n [0.331431001424789, 0.119714021682739],\n [0.229923993349075, 0.232002973556519],\n [0.364500999450684, 0.189113974571228],\n [0.229622006416321, 0.299540996551514],\n [0.173287004232407, 0.278747975826263],\n [0.472878992557526, 0.666198015213013],\n [0.446828007698059, 0.668527007102966],\n [0.422762006521225, 0.673889994621277],\n [0.445307999849319, 0.580065965652466],\n [0.388103008270264, 0.693961024284363],\n [0.403039008378983, 0.706539988517761],\n [0.403629004955292, 0.693953037261963],\n [0.460041999816895, 0.557139039039612],\n [0.431158006191254, 0.692366003990173],\n [0.452181994915009, 0.692366003990173],\n [0.475387006998062, 0.692366003990173],\n [0.465828001499176, 0.779190003871918],\n [0.472328990697861, 0.736225962638855],\n [0.473087012767792, 0.717857003211975],\n [0.473122000694275, 0.704625964164734],\n [0.473033010959625, 0.695277988910675],\n [0.427942007780075, 0.695277988910675],\n [0.426479011774063, 0.703539967536926],\n [0.423162013292313, 0.711845993995667],\n [0.4183090031147, 0.720062971115112],\n [0.390094995498657, 0.639572978019714],\n [0.013953999616206, 0.560034036636353],\n [0.499913990497589, 0.58014702796936],\n [0.413199990987778, 0.69539999961853],\n [0.409626007080078, 0.701822996139526],\n [0.468080013990402, 0.601534962654114],\n [0.422728985548019, 0.585985004901886],\n [0.463079988956451, 0.593783974647522],\n [0.37211999297142, 0.47341400384903],\n [0.334562003612518, 0.496073007583618],\n [0.411671012639999, 0.546965003013611],\n [0.242175996303558, 0.14767599105835],\n [0.290776997804642, 0.201445996761322],\n [0.327338010072708, 0.256527006626129],\n [0.399509996175766, 0.748921036720276],\n [0.441727995872498, 0.261676013469696],\n [0.429764986038208, 0.187834024429321],\n [0.412198007106781, 0.108901023864746],\n [0.288955003023148, 0.398952007293701],\n [0.218936994671822, 0.435410976409912],\n [0.41278201341629, 0.398970007896423],\n [0.257135003805161, 0.355440020561218],\n [0.427684992551804, 0.437960982322693],\n [0.448339998722076, 0.536936044692993],\n [0.178560003638268, 0.45755398273468],\n [0.247308000922203, 0.457193970680237],\n [0.286267012357712, 0.467674970626831],\n [0.332827985286713, 0.460712015628815],\n [0.368755996227264, 0.447206974029541],\n [0.398963987827301, 0.432654976844788],\n [0.476410001516342, 0.405806005001068],\n [0.189241006970406, 0.523923993110657],\n [0.228962004184723, 0.348950982093811],\n [0.490725994110107, 0.562400996685028],\n [0.404670000076294, 0.485132992267609],\n [0.019469000399113, 0.401564002037048],\n [0.426243007183075, 0.420431017875671],\n [0.396993011236191, 0.548797011375427],\n [0.266469985246658, 0.376977026462555],\n [0.439121007919312, 0.51895797252655],\n [0.032313998788595, 0.644356966018677],\n [0.419054001569748, 0.387154996395111],\n [0.462783008813858, 0.505746960639954],\n [0.238978996872902, 0.779744982719421],\n [0.198220998048782, 0.831938028335571],\n [0.107550002634525, 0.540755033493042],\n [0.183610007166862, 0.740257024765015],\n [0.134409993886948, 0.333683013916016],\n [0.385764002799988, 0.883153975009918],\n [0.490967005491257, 0.579378008842468],\n [0.382384985685349, 0.508572995662689],\n [0.174399003386497, 0.397670984268188],\n [0.318785011768341, 0.39623498916626],\n [0.343364000320435, 0.400596976280212],\n [0.396100014448166, 0.710216999053955],\n [0.187885001301765, 0.588537991046906],\n [0.430987000465393, 0.944064974784851],\n [0.318993002176285, 0.898285031318665],\n [0.266247987747192, 0.869701027870178],\n [0.500023007392883, 0.190576016902924],\n [0.499976992607117, 0.954452991485596],\n [0.366169989109039, 0.398822009563446],\n [0.393207013607025, 0.39553701877594],\n [0.410373002290726, 0.391080021858215],\n [0.194993004202843, 0.342101991176605],\n [0.388664990663528, 0.362284004688263],\n [0.365961998701096, 0.355970978736877],\n [0.343364000320435, 0.355356991291046],\n [0.318785011768341, 0.35834002494812],\n [0.301414996385574, 0.363156020641327],\n [0.058132998645306, 0.319076001644135],\n [0.301414996385574, 0.387449026107788],\n [0.499987989664078, 0.618434011936188],\n [0.415838003158569, 0.624195992946625],\n [0.445681989192963, 0.566076993942261],\n [0.465844005346298, 0.620640993118286],\n [0.49992299079895, 0.351523995399475],\n [0.288718998432159, 0.819945991039276],\n [0.335278987884521, 0.852819979190826],\n [0.440512001514435, 0.902418971061707],\n [0.128294005990028, 0.791940987110138],\n [0.408771991729736, 0.373893976211548],\n [0.455606997013092, 0.451801002025604],\n [0.499877005815506, 0.908990025520325],\n [0.375436991453171, 0.924192011356354],\n [0.11421000212431, 0.615022003650665],\n [0.448662012815475, 0.695277988910675],\n [0.4480200111866, 0.704632043838501],\n [0.447111994028091, 0.715808033943176],\n [0.444831997156143, 0.730794012546539],\n [0.430011987686157, 0.766808986663818],\n [0.406787008047104, 0.685672998428345],\n [0.400738000869751, 0.681069016456604],\n [0.392399996519089, 0.677703022956848],\n [0.367855995893478, 0.663918972015381],\n [0.247923001646996, 0.601333022117615],\n [0.452769994735718, 0.420849978923798],\n [0.43639200925827, 0.359887003898621],\n [0.416164010763168, 0.368713974952698],\n [0.413385987281799, 0.692366003990173],\n [0.228018000721931, 0.683571994304657],\n [0.468268007040024, 0.352671027183533],\n [0.411361992359161, 0.804327011108398],\n [0.499989002943039, 0.469825029373169],\n [0.479153990745544, 0.442654013633728],\n [0.499974012374878, 0.439637005329132],\n [0.432112008333206, 0.493588984012604],\n [0.499886006116867, 0.866917014122009],\n [0.49991300702095, 0.821729004383087],\n [0.456548988819122, 0.819200992584229],\n [0.344549000263214, 0.745438992977142],\n [0.37890899181366, 0.574010014533997],\n [0.374292999505997, 0.780184984207153],\n [0.319687992334366, 0.570737957954407],\n [0.357154995203018, 0.604269981384277],\n [0.295284003019333, 0.621580958366394],\n [0.447750002145767, 0.862477004528046],\n [0.410986006259918, 0.508723020553589],\n [0.31395098567009, 0.775308012962341],\n [0.354128003120422, 0.812552988529205],\n [0.324548006057739, 0.703992962837219],\n [0.189096003770828, 0.646299958229065],\n [0.279776990413666, 0.71465802192688],\n [0.1338230073452, 0.682700991630554],\n [0.336768001317978, 0.644733011722565],\n [0.429883986711502, 0.466521978378296],\n [0.455527991056442, 0.548622965812683],\n [0.437114000320435, 0.558896005153656],\n [0.467287987470627, 0.529924988746643],\n [0.414712011814117, 0.335219979286194],\n [0.37704598903656, 0.322777986526489],\n [0.344107985496521, 0.320150971412659],\n [0.312875986099243, 0.32233202457428],\n [0.283526003360748, 0.333190023899078],\n [0.241245999932289, 0.382785975933075],\n [0.102986000478268, 0.468762993812561],\n [0.267612010240555, 0.424560010433197],\n [0.297879010438919, 0.433175981044769],\n [0.333433985710144, 0.433878004550934],\n [0.366427004337311, 0.426115989685059],\n [0.396012008190155, 0.416696012020111],\n [0.420121014118195, 0.41022801399231],\n [0.007561000064015, 0.480777025222778],\n [0.432949006557465, 0.569517970085144],\n [0.458638995885849, 0.479089021682739],\n [0.473466008901596, 0.545744001865387],\n [0.476087987422943, 0.563830018043518],\n [0.468472003936768, 0.555056989192963],\n [0.433990985155106, 0.582361996173859],\n [0.483518004417419, 0.562983989715576],\n [0.482482999563217, 0.57784903049469],\n [0.42645001411438, 0.389798998832703],\n [0.438998997211456, 0.39649498462677],\n [0.450067013502121, 0.400434017181396],\n [0.289712011814117, 0.368252992630005],\n [0.276670008897781, 0.363372981548309],\n [0.517862021923065, 0.471948027610779],\n [0.710287988185883, 0.380764007568359],\n [0.526226997375488, 0.573909997940063],\n [0.895093023777008, 0.254140973091125],\n [0.634069979190826, 0.409575998783112],\n [0.661242008209229, 0.41302502155304],\n [0.688880026340485, 0.409460008144379],\n [0.725341975688934, 0.389131009578705],\n [0.606630027294159, 0.40370500087738],\n [0.654766023159027, 0.344011008739471],\n [0.629905998706818, 0.346076011657715],\n [0.680678009986877, 0.347265005111694],\n [0.702096998691559, 0.353591024875641],\n [0.75221198797226, 0.410804986953735],\n [0.602918028831482, 0.842862963676453],\n [0.719901978969574, 0.375599980354309],\n [0.893692970275879, 0.399959981441498],\n [0.790081977844238, 0.391354024410248],\n [0.643998026847839, 0.534487962722778],\n [0.528249025344849, 0.65040397644043],\n [0.525849997997284, 0.680191040039062],\n [0.560214996337891, 0.657229006290436],\n [0.585384011268616, 0.66654098033905],\n [0.549625992774963, 0.680860996246338],\n [0.57122802734375, 0.682691991329193],\n [0.624852001667023, 0.72809898853302],\n [0.513050019741058, 0.547281980514526],\n [0.51509702205658, 0.527251958847046],\n [0.742246985435486, 0.314507007598877],\n [0.598631024360657, 0.454979002475739],\n [0.570338010787964, 0.548575043678284],\n [0.578631997108459, 0.533622980117798],\n [0.723087012767792, 0.532054007053375],\n [0.516445994377136, 0.499638974666595],\n [0.662801027297974, 0.282917976379395],\n [0.70362401008606, 0.293271005153656],\n [0.830704987049103, 0.193813979625702],\n [0.552385985851288, 0.302568018436432],\n [0.607609987258911, 0.353887975215912],\n [0.645429015159607, 0.696707010269165],\n [0.932694971561432, 0.730105042457581],\n [0.557260990142822, 0.572826027870178],\n [0.542901992797852, 0.584792017936707],\n [0.6180260181427, 0.694710969924927],\n [0.607590973377228, 0.694203019142151],\n [0.722943007946014, 0.271963000297546],\n [0.577413976192474, 0.563166975975037],\n [0.614082992076874, 0.281386971473694],\n [0.616907000541687, 0.255886018276215],\n [0.668509006500244, 0.119913995265961],\n [0.770092010498047, 0.232020974159241],\n [0.635536015033722, 0.189248979091644],\n [0.77039098739624, 0.299556016921997],\n [0.826722025871277, 0.278755009174347],\n [0.527121007442474, 0.666198015213013],\n [0.553171992301941, 0.668527007102966],\n [0.577238023281097, 0.673889994621277],\n [0.554691970348358, 0.580065965652466],\n [0.611896991729736, 0.693961024284363],\n [0.59696102142334, 0.706539988517761],\n [0.596370995044708, 0.693953037261963],\n [0.539958000183105, 0.557139039039612],\n [0.568841993808746, 0.692366003990173],\n [0.547818005084991, 0.692366003990173],\n [0.52461302280426, 0.692366003990173],\n [0.534089982509613, 0.779141008853912],\n [0.527670979499817, 0.736225962638855],\n [0.526912987232208, 0.717857003211975],\n [0.526877999305725, 0.704625964164734],\n [0.526966989040375, 0.695277988910675],\n [0.572058022022247, 0.695277988910675],\n [0.573521018028259, 0.703539967536926],\n [0.57683801651001, 0.711845993995667],\n [0.581691026687622, 0.720062971115112],\n [0.609944999217987, 0.639909982681274],\n [0.986046016216278, 0.560034036636353],\n [0.5867999792099, 0.69539999961853],\n [0.590372025966644, 0.701822996139526],\n [0.531915009021759, 0.601536989212036],\n [0.577268004417419, 0.585934996604919],\n [0.536915004253387, 0.593786001205444],\n [0.627542972564697, 0.473352015018463],\n [0.665585994720459, 0.495950996875763],\n [0.588353991508484, 0.546862006187439],\n [0.757824003696442, 0.14767599105835],\n [0.709249973297119, 0.201507985591888],\n [0.672684013843536, 0.256581008434296],\n [0.600408971309662, 0.74900496006012],\n [0.55826598405838, 0.261672019958496],\n [0.570303976535797, 0.187870979309082],\n [0.588165998458862, 0.109044015407562],\n [0.711045026779175, 0.398952007293701],\n [0.781069993972778, 0.435405015945435],\n [0.587247014045715, 0.398931980133057],\n [0.742869973182678, 0.355445981025696],\n [0.572156012058258, 0.437651991844177],\n [0.55186802148819, 0.536570012569427],\n [0.821442008018494, 0.457556009292603],\n [0.752701997756958, 0.457181990146637],\n [0.71375697851181, 0.467626988887787],\n [0.66711300611496, 0.460672974586487],\n [0.631101012229919, 0.447153985500336],\n [0.6008620262146, 0.432473003864288],\n [0.523481011390686, 0.405627012252808],\n [0.810747981071472, 0.523926019668579],\n [0.771045982837677, 0.348959028720856],\n [0.509127020835876, 0.562718033790588],\n [0.595292985439301, 0.485023975372314],\n [0.980530977249146, 0.401564002037048],\n [0.573499977588654, 0.420000016689301],\n [0.602994978427887, 0.548687994480133],\n [0.733529984951019, 0.376977026462555],\n [0.560611009597778, 0.519016981124878],\n [0.967685997486115, 0.644356966018677],\n [0.580985009670258, 0.387160003185272],\n [0.537728011608124, 0.505385041236877],\n [0.760966002941132, 0.779752969741821],\n [0.801778972148895, 0.831938028335571],\n [0.892440974712372, 0.54076099395752],\n [0.816350996494293, 0.740260004997253],\n [0.865594983100891, 0.333687007427216],\n [0.614073991775513, 0.883246004581451],\n [0.508952975273132, 0.579437971115112],\n [0.617941975593567, 0.508316040039062],\n [0.825608015060425, 0.397674977779388],\n [0.681214988231659, 0.39623498916626],\n [0.656635999679565, 0.400596976280212],\n [0.603900015354156, 0.710216999053955],\n [0.81208598613739, 0.588539004325867],\n [0.56801301240921, 0.944564998149872],\n [0.681007981300354, 0.898285031318665],\n [0.733752012252808, 0.869701027870178],\n [0.633830010890961, 0.398822009563446],\n [0.606792986392975, 0.39553701877594],\n [0.589659988880157, 0.391062021255493],\n [0.805015981197357, 0.342108011245728],\n [0.611334979534149, 0.362284004688263],\n [0.634037971496582, 0.355970978736877],\n [0.656635999679565, 0.355356991291046],\n [0.681214988231659, 0.35834002494812],\n [0.698584973812103, 0.363156020641327],\n [0.941866993904114, 0.319076001644135],\n [0.698584973812103, 0.387449026107788],\n [0.584177017211914, 0.624107003211975],\n [0.554318010807037, 0.566076993942261],\n [0.534153997898102, 0.62064003944397],\n [0.711217999458313, 0.819975018501282],\n [0.664629995822906, 0.852871000766754],\n [0.559099972248077, 0.902631998062134],\n [0.871706008911133, 0.791940987110138],\n [0.591234028339386, 0.373893976211548],\n [0.544341027736664, 0.451583981513977],\n [0.624562978744507, 0.924192011356354],\n [0.88577002286911, 0.615028977394104],\n [0.551338016986847, 0.695277988910675],\n [0.551980018615723, 0.704632043838501],\n [0.552887976169586, 0.715808033943176],\n [0.555167973041534, 0.730794012546539],\n [0.569944024085999, 0.767035007476807],\n [0.593203008174896, 0.685675978660583],\n [0.599261999130249, 0.681069016456604],\n [0.607599973678589, 0.677703022956848],\n [0.631937980651855, 0.663500010967255],\n [0.752032995223999, 0.601315021514893],\n [0.547226011753082, 0.420395016670227],\n [0.563543975353241, 0.359827995300293],\n [0.583841025829315, 0.368713974952698],\n [0.586614012718201, 0.692366003990173],\n [0.771915018558502, 0.683578014373779],\n [0.531597018241882, 0.352482974529266],\n [0.588370978832245, 0.804440975189209],\n [0.52079701423645, 0.442565023899078],\n [0.567984998226166, 0.493479013442993],\n [0.543282985687256, 0.819254994392395],\n [0.655317008495331, 0.745514988899231],\n [0.621008992195129, 0.574018001556396],\n [0.625559985637665, 0.78031200170517],\n [0.680198013782501, 0.570719003677368],\n [0.64276397228241, 0.604337990283966],\n [0.704662978649139, 0.621529996395111],\n [0.552012026309967, 0.862591981887817],\n [0.589071989059448, 0.508637011051178],\n [0.685944974422455, 0.775357007980347],\n [0.645735025405884, 0.812640011310577],\n [0.675342977046967, 0.703978002071381],\n [0.810858011245728, 0.646304965019226],\n [0.72012197971344, 0.714666962623596],\n [0.866151988506317, 0.682704985141754],\n [0.663187026977539, 0.644596993923187],\n [0.570082008838654, 0.466325998306274],\n [0.544561982154846, 0.548375964164734],\n [0.562758982181549, 0.558784961700439],\n [0.531987011432648, 0.530140042304993],\n [0.585271000862122, 0.335177004337311],\n [0.622952997684479, 0.32277899980545],\n [0.655896008014679, 0.320163011550903],\n [0.687132000923157, 0.322345972061157],\n [0.716481983661652, 0.333200991153717],\n [0.758756995201111, 0.382786989212036],\n [0.897013008594513, 0.468769013881683],\n [0.732392013072968, 0.424547016620636],\n [0.70211398601532, 0.433162987232208],\n [0.66652500629425, 0.433866024017334],\n [0.633504986763, 0.426087975502014],\n [0.603875994682312, 0.416586995124817],\n [0.579657971858978, 0.409945011138916],\n [0.992439985275269, 0.480777025222778],\n [0.567192018032074, 0.569419980049133],\n [0.54136598110199, 0.478899002075195],\n [0.526564002037048, 0.546118021011353],\n [0.523913025856018, 0.563830018043518],\n [0.531529009342194, 0.555056989192963],\n [0.566035985946655, 0.582329034805298],\n [0.51631098985672, 0.563053965568542],\n [0.5174720287323, 0.577877044677734],\n [0.573594987392426, 0.389806985855103],\n [0.560697972774506, 0.395331978797913],\n [0.549755990505219, 0.399751007556915],\n [0.710287988185883, 0.368252992630005],\n [0.723330020904541, 0.363372981548309],\n];\n\nexport const TRI468 = [\n 127, 34, 139, 11, 0, 37, 232, 231, 120, 72, 37, 39, 128, 121, 47, 232, 121, 128, 104, 69, 67, 175, 171, 148, 157, 154, 155, 118, 50, 101, 73, 39, 40, 9,\n 151, 108, 48, 115, 131, 194, 204, 211, 74, 40, 185, 80, 42, 183, 40, 92, 186, 230, 229, 118, 202, 212, 214, 83, 18, 17, 76, 61, 146, 160, 29, 30, 56,\n 157, 173, 106, 204, 194, 135, 214, 192, 203, 165, 98, 21, 71, 68, 51, 45, 4, 144, 24, 23, 77, 146, 91, 205, 50, 187, 201, 200, 18, 91, 106, 182, 90, 91,\n 181, 85, 84, 17, 206, 203, 36, 148, 171, 140, 92, 40, 39, 193, 189, 244, 159, 158, 28, 247, 246, 161, 236, 3, 196, 54, 68, 104, 193, 168, 8, 117,\n 228, 31, 189, 193, 55, 98, 97, 99, 126, 47, 100, 166, 79, 218, 155, 154, 26, 209, 49, 131, 135, 136, 150, 47, 126, 217, 223, 52, 53, 45, 51, 134, 211,\n 170, 140, 67, 69, 108, 43, 106, 91, 230, 119, 120, 226, 130, 247, 63, 53, 52, 238, 20, 242, 46, 70, 156, 78, 62, 96, 46, 53, 63, 143, 34, 227, 173,\n 155, 133, 123, 117, 111, 44, 125, 19, 236, 134, 51, 216, 206, 205, 154, 153, 22, 39, 37, 167, 200, 201, 208, 36, 142, 100, 57, 212, 202, 20, 60, 99, 28,\n 158, 157, 35, 226, 113, 160, 159, 27, 204, 202, 210, 113, 225, 46, 43, 202, 204, 62, 76, 77, 137, 123, 116, 41, 38, 72, 203, 129, 142, 64, 98, 240, 49,\n 102, 64, 41, 73, 74, 212, 216, 207, 42, 74, 184, 169, 170, 211, 170, 149, 176, 105, 66, 69, 122, 6, 168, 123, 147, 187, 96, 77, 90, 65, 55, 107, 89,\n 90, 180, 101, 100, 120, 63, 105, 104, 93, 137, 227, 15, 86, 85, 129, 102, 49, 14, 87, 86, 55, 8, 9, 100, 47, 121, 145, 23, 22, 88, 89, 179, 6, 122,\n 196, 88, 95, 96, 138, 172, 136, 215, 58, 172, 115, 48, 219, 42, 80, 81, 195, 3, 51, 43, 146, 61, 171, 175, 199, 81, 82, 38, 53, 46, 225, 144, 163, 110,\n 246, 33, 7, 52, 65, 66, 229, 228, 117, 34, 127, 234, 107, 108, 69, 109, 108, 151, 48, 64, 235, 62, 78, 191, 129, 209, 126, 111, 35, 143, 163, 161, 246,\n 117, 123, 50, 222, 65, 52, 19, 125, 141, 221, 55, 65, 3, 195, 197, 25, 7, 33, 220, 237, 44, 70, 71, 139, 122, 193, 245, 247, 130, 33, 71, 21, 162,\n 153, 158, 159, 170, 169, 150, 188, 174, 196, 216, 186, 92, 144, 160, 161, 2, 97, 167, 141, 125, 241, 164, 167, 37, 72, 38, 12, 145, 159, 160, 38, 82, 13,\n 63, 68, 71, 226, 35, 111, 158, 153, 154, 101, 50, 205, 206, 92, 165, 209, 198, 217, 165, 167, 97, 220, 115, 218, 133, 112, 243, 239, 238, 241, 214,\n 135, 169, 190, 173, 133, 171, 208, 32, 125, 44, 237, 86, 87, 178, 85, 86, 179, 84, 85, 180, 83, 84, 181, 201, 83, 182, 137, 93, 132, 76, 62, 183, 61,\n 76, 184, 57, 61, 185, 212, 57, 186, 214, 207, 187, 34, 143, 156, 79, 239, 237, 123, 137, 177, 44, 1, 4, 201, 194, 32, 64, 102, 129, 213, 215, 138, 59,\n 166, 219, 242, 99, 97, 2, 94, 141, 75, 59, 235, 24, 110, 228, 25, 130, 226, 23, 24, 229, 22, 23, 230, 26, 22, 231, 112, 26, 232, 189, 190, 243, 221, 56,\n 190, 28, 56, 221, 27, 28, 222, 29, 27, 223, 30, 29, 224, 247, 30, 225, 238, 79, 20, 166, 59, 75, 60, 75, 240, 147, 177, 215, 20, 79, 166, 187, 147, 213,\n 112, 233, 244, 233, 128, 245, 128, 114, 188, 114, 217, 174, 131, 115, 220, 217, 198, 236, 198, 131, 134, 177, 132, 58, 143, 35, 124, 110, 163, 7, 228,\n 110, 25, 356, 389, 368, 11, 302, 267, 452, 350, 349, 302, 303, 269, 357, 343, 277, 452, 453, 357, 333, 332, 297, 175, 152, 377, 384, 398, 382, 347,\n 348, 330, 303, 304, 270, 9, 336, 337, 278, 279, 360, 418, 262, 431, 304, 408, 409, 310, 415, 407, 270, 409, 410, 450, 348, 347, 422, 430, 434, 313,\n 314, 17, 306, 307, 375, 387, 388, 260, 286, 414, 398, 335, 406, 418, 364, 367, 416, 423, 358, 327, 251, 284, 298, 281, 5, 4, 373, 374, 253, 307, 320,\n 321, 425, 427, 411, 421, 313, 18, 321, 405, 406, 320, 404, 405, 315, 16, 17, 426, 425, 266, 377, 400, 369, 322, 391, 269, 417, 465, 464, 386, 257, 258,\n 466, 260, 388, 456, 399, 419, 284, 332, 333, 417, 285, 8, 346, 340, 261, 413, 441, 285, 327, 460, 328, 355, 371, 329, 392, 439, 438, 382, 341, 256,\n 429, 420, 360, 364, 394, 379, 277, 343, 437, 443, 444, 283, 275, 440, 363, 431, 262, 369, 297, 338, 337, 273, 375, 321, 450, 451, 349, 446, 342, 467,\n 293, 334, 282, 458, 461, 462, 276, 353, 383, 308, 324, 325, 276, 300, 293, 372, 345, 447, 382, 398, 362, 352, 345, 340, 274, 1, 19, 456, 248, 281, 436,\n 427, 425, 381, 256, 252, 269, 391, 393, 200, 199, 428, 266, 330, 329, 287, 273, 422, 250, 462, 328, 258, 286, 384, 265, 353, 342, 387, 259, 257, 424,\n 431, 430, 342, 353, 276, 273, 335, 424, 292, 325, 307, 366, 447, 345, 271, 303, 302, 423, 266, 371, 294, 455, 460, 279, 278, 294, 271, 272, 304, 432,\n 434, 427, 272, 407, 408, 394, 430, 431, 395, 369, 400, 334, 333, 299, 351, 417, 168, 352, 280, 411, 325, 319, 320, 295, 296, 336, 319, 403, 404, 330,\n 348, 349, 293, 298, 333, 323, 454, 447, 15, 16, 315, 358, 429, 279, 14, 15, 316, 285, 336, 9, 329, 349, 350, 374, 380, 252, 318, 402, 403, 6, 197, 419,\n 318, 319, 325, 367, 364, 365, 435, 367, 397, 344, 438, 439, 272, 271, 311, 195, 5, 281, 273, 287, 291, 396, 428, 199, 311, 271, 268, 283, 444, 445,\n 373, 254, 339, 263, 466, 249, 282, 334, 296, 449, 347, 346, 264, 447, 454, 336, 296, 299, 338, 10, 151, 278, 439, 455, 292, 407, 415, 358, 371, 355,\n 340, 345, 372, 390, 249, 466, 346, 347, 280, 442, 443, 282, 19, 94, 370, 441, 442, 295, 248, 419, 197, 263, 255, 359, 440, 275, 274, 300, 383, 368,\n 351, 412, 465, 263, 467, 466, 301, 368, 389, 380, 374, 386, 395, 378, 379, 412, 351, 419, 436, 426, 322, 373, 390, 388, 2, 164, 393, 370, 462, 461,\n 164, 0, 267, 302, 11, 12, 374, 373, 387, 268, 12, 13, 293, 300, 301, 446, 261, 340, 385, 384, 381, 330, 266, 425, 426, 423, 391, 429, 355, 437, 391,\n 327, 326, 440, 457, 438, 341, 382, 362, 459, 457, 461, 434, 430, 394, 414, 463, 362, 396, 369, 262, 354, 461, 457, 316, 403, 402, 315, 404, 403, 314,\n 405, 404, 313, 406, 405, 421, 418, 406, 366, 401, 361, 306, 408, 407, 291, 409, 408, 287, 410, 409, 432, 436, 410, 434, 416, 411, 264, 368, 383, 309,\n 438, 457, 352, 376, 401, 274, 275, 4, 421, 428, 262, 294, 327, 358, 433, 416, 367, 289, 455, 439, 462, 370, 326, 2, 326, 370, 305, 460, 455, 254,\n 449, 448, 255, 261, 446, 253, 450, 449, 252, 451, 450, 256, 452, 451, 341, 453, 452, 413, 464, 463, 441, 413, 414, 258, 442, 441, 257, 443, 442, 259,\n 444, 443, 260, 445, 444, 467, 342, 445, 459, 458, 250, 289, 392, 290, 290, 328, 460, 376, 433, 435, 250, 290, 392, 411, 416, 433, 341, 463, 464, 453,\n 464, 465, 357, 465, 412, 343, 412, 399, 360, 363, 440, 437, 399, 456, 420, 456, 363, 401, 435, 288, 372, 383, 353, 339, 255, 249, 448, 261, 255, 133,\n 243, 190, 133, 155, 112, 33, 246, 247, 33, 130, 25, 398, 384, 286, 362, 398, 414, 362, 463, 341, 263, 359, 467, 263, 249, 255, 466, 467, 260, 75, 60,\n 166, 238, 239, 79, 162, 127, 139, 72, 11, 37, 121, 232, 120, 73, 72, 39, 114, 128, 47, 233, 232, 128, 103, 104, 67, 152, 175, 148, 173, 157, 155,\n 119, 118, 101, 74, 73, 40, 107, 9, 108, 49, 48, 131, 32, 194, 211, 184, 74, 185, 191, 80, 183, 185, 40, 186, 119, 230, 118, 210, 202, 214, 84, 83, 17,\n 77, 76, 146, 161, 160, 30, 190, 56, 173, 182, 106, 194, 138, 135, 192, 129, 203, 98, 54, 21, 68, 5, 51, 4, 145, 144, 23, 90, 77, 91, 207, 205, 187, 83,\n 201, 18, 181, 91, 182, 180, 90, 181, 16, 85, 17, 205, 206, 36, 176, 148, 140, 165, 92, 39, 245, 193, 244, 27, 159, 28, 30, 247, 161, 174, 236, 196,\n 103, 54, 104, 55, 193, 8, 111, 117, 31, 221, 189, 55, 240, 98, 99, 142, 126, 100, 219, 166, 218, 112, 155, 26, 198, 209, 131, 169, 135, 150, 114, 47,\n 217, 224, 223, 53, 220, 45, 134, 32, 211, 140, 109, 67, 108, 146, 43, 91, 231, 230, 120, 113, 226, 247, 105, 63, 52, 241, 238, 242, 124, 46, 156, 95,\n 78, 96, 70, 46, 63, 116, 143, 227, 116, 123, 111, 1, 44, 19, 3, 236, 51, 207, 216, 205, 26, 154, 22, 165, 39, 167, 199, 200, 208, 101, 36, 100, 43,\n 57, 202, 242, 20, 99, 56, 28, 157, 124, 35, 113, 29, 160, 27, 211, 204, 210, 124, 113, 46, 106, 43, 204, 96, 62, 77, 227, 137, 116, 73, 41, 72, 36, 203,\n 142, 235, 64, 240, 48, 49, 64, 42, 41, 74, 214, 212, 207, 183, 42, 184, 210, 169, 211, 140, 170, 176, 104, 105, 69, 193, 122, 168, 50, 123, 187, 89, 96,\n 90, 66, 65, 107, 179, 89, 180, 119, 101, 120, 68, 63, 104, 234, 93, 227, 16, 15, 85, 209, 129, 49, 15, 14, 86, 107, 55, 9, 120, 100, 121, 153, 145, 22,\n 178, 88, 179, 197, 6, 196, 89, 88, 96, 135, 138, 136, 138, 215, 172, 218, 115, 219, 41, 42, 81, 5, 195, 51, 57, 43, 61, 208, 171, 199, 41, 81, 38,\n 224, 53, 225, 24, 144, 110, 105, 52, 66, 118, 229, 117, 227, 34, 234, 66, 107, 69, 10, 109, 151, 219, 48, 235, 183, 62, 191, 142, 129, 126, 116, 111,\n 143, 7, 163, 246, 118, 117, 50, 223, 222, 52, 94, 19, 141, 222, 221, 65, 196, 3, 197, 45, 220, 44, 156, 70, 139, 188, 122, 245, 139, 71, 162, 145,\n 153, 159, 149, 170, 150, 122, 188, 196, 206, 216, 92, 163, 144, 161, 164, 2, 167, 242, 141, 241, 0, 164, 37, 11, 72, 12, 144, 145, 160, 12, 38, 13, 70,\n 63, 71, 31, 226, 111, 157, 158, 154, 36, 101, 205, 203, 206, 165, 126, 209, 217, 98, 165, 97, 237, 220, 218, 237, 239, 241, 210, 214, 169, 140, 171, 32,\n 241, 125, 237, 179, 86, 178, 180, 85, 179, 181, 84, 180, 182, 83, 181, 194, 201, 182, 177, 137, 132, 184, 76, 183, 185, 61, 184, 186, 57, 185, 216, 212,\n 186, 192, 214, 187, 139, 34, 156, 218, 79, 237, 147, 123, 177, 45, 44, 4, 208, 201, 32, 98, 64, 129, 192, 213, 138, 235, 59, 219, 141, 242, 97, 97, 2,\n 141, 240, 75, 235, 229, 24, 228, 31, 25, 226, 230, 23, 229, 231, 22, 230, 232, 26, 231, 233, 112, 232, 244, 189, 243, 189, 221, 190, 222, 28, 221,\n 223, 27, 222, 224, 29, 223, 225, 30, 224, 113, 247, 225, 99, 60, 240, 213, 147, 215, 60, 20, 166, 192, 187, 213, 243, 112, 244, 244, 233, 245, 245,\n 128, 188, 188, 114, 174, 134, 131, 220, 174, 217, 236, 236, 198, 134, 215, 177, 58, 156, 143, 124, 25, 110, 7, 31, 228, 25, 264, 356, 368, 0, 11, 267,\n 451, 452, 349, 267, 302, 269, 350, 357, 277, 350, 452, 357, 299, 333, 297, 396, 175, 377, 381, 384, 382, 280, 347, 330, 269, 303, 270, 151, 9, 337,\n 344, 278, 360, 424, 418, 431, 270, 304, 409, 272, 310, 407, 322, 270, 410, 449, 450, 347, 432, 422, 434, 18, 313, 17, 291, 306, 375, 259, 387, 260,\n 424, 335, 418, 434, 364, 416, 391, 423, 327, 301, 251, 298, 275, 281, 4, 254, 373, 253, 375, 307, 321, 280, 425, 411, 200, 421, 18, 335, 321, 406,\n 321, 320, 405, 314, 315, 17, 423, 426, 266, 396, 377, 369, 270, 322, 269, 413, 417, 464, 385, 386, 258, 248, 456, 419, 298, 284, 333, 168, 417, 8,\n 448, 346, 261, 417, 413, 285, 326, 327, 328, 277, 355, 329, 309, 392, 438, 381, 382, 256, 279, 429, 360, 365, 364, 379, 355, 277, 437, 282, 443, 283,\n 281, 275, 363, 395, 431, 369, 299, 297, 337, 335, 273, 321, 348, 450, 349, 359, 446, 467, 283, 293, 282, 250, 458, 462, 300, 276, 383, 292, 308, 325,\n 283, 276, 293, 264, 372, 447, 346, 352, 340, 354, 274, 19, 363, 456, 281, 426, 436, 425, 380, 381, 252, 267, 269, 393, 421, 200, 428, 371, 266, 329,\n 432, 287, 422, 290, 250, 328, 385, 258, 384, 446, 265, 342, 386, 387, 257, 422, 424, 430, 445, 342, 276, 422, 273, 424, 306, 292, 307, 352, 366, 345,\n 268, 271, 302, 358, 423, 371, 327, 294, 460, 331, 279, 294, 303, 271, 304, 436, 432, 427, 304, 272, 408, 395, 394, 431, 378, 395, 400, 296, 334, 299,\n 6, 351, 168, 376, 352, 411, 307, 325, 320, 285, 295, 336, 320, 319, 404, 329, 330, 349, 334, 293, 333, 366, 323, 447, 316, 15, 315, 331, 358, 279,\n 317, 14, 316, 8, 285, 9, 277, 329, 350, 253, 374, 252, 319, 318, 403, 351, 6, 419, 324, 318, 325, 397, 367, 365, 288, 435, 397, 278, 344, 439, 310,\n 272, 311, 248, 195, 281, 375, 273, 291, 175, 396, 199, 312, 311, 268, 276, 283, 445, 390, 373, 339, 295, 282, 296, 448, 449, 346, 356, 264, 454, 337,\n 336, 299, 337, 338, 151, 294, 278, 455, 308, 292, 415, 429, 358, 355, 265, 340, 372, 388, 390, 466, 352, 346, 280, 295, 442, 282, 354, 19, 370, 285,\n 441, 295, 195, 248, 197, 457, 440, 274, 301, 300, 368, 417, 351, 465, 251, 301, 389, 385, 380, 386, 394, 395, 379, 399, 412, 419, 410, 436, 322, 387,\n 373, 388, 326, 2, 393, 354, 370, 461, 393, 164, 267, 268, 302, 12, 386, 374, 387, 312, 268, 13, 298, 293, 301, 265, 446, 340, 380, 385, 381, 280, 330,\n 425, 322, 426, 391, 420, 429, 437, 393, 391, 326, 344, 440, 438, 458, 459, 461, 364, 434, 394, 428, 396, 262, 274, 354, 457, 317, 316, 402, 316, 315,\n 403, 315, 314, 404, 314, 313, 405, 313, 421, 406, 323, 366, 361, 292, 306, 407, 306, 291, 408, 291, 287, 409, 287, 432, 410, 427, 434, 411, 372, 264,\n 383, 459, 309, 457, 366, 352, 401, 1, 274, 4, 418, 421, 262, 331, 294, 358, 435, 433, 367, 392, 289, 439, 328, 462, 326, 94, 2, 370, 289, 305, 455, 339,\n 254, 448, 359, 255, 446, 254, 253, 449, 253, 252, 450, 252, 256, 451, 256, 341, 452, 414, 413, 463, 286, 441, 414, 286, 258, 441, 258, 257, 442, 257,\n 259, 443, 259, 260, 444, 260, 467, 445, 309, 459, 250, 305, 289, 290, 305, 290, 460, 401, 376, 435, 309, 250, 392, 376, 411, 433, 453, 341, 464, 357,\n 453, 465, 343, 357, 412, 437, 343, 399, 344, 360, 440, 420, 437, 456, 360, 420, 363, 361, 401, 288, 265, 372, 353, 390, 339, 249, 339, 448, 255];\n\nexport const TRI68 = [0, 1, 36, 0, 36, 17, 1, 2, 41, 1, 41, 36, 2, 3, 31, 2, 31, 41, 3, 4, 48, 3, 48, 31, 4, 5, 48, 5, 6, 48, 6, 7, 59, 6, 59, 48, 7, 8, 58, 7, 58, 59,\n 8, 9, 56, 8, 56, 57, 8, 57, 58, 9, 10, 55, 9, 55, 56, 10, 11, 54, 10, 54, 55, 11, 12, 54, 12, 13, 54, 13, 14, 35, 13, 35, 54, 14, 15, 46, 14, 46, 35, 15, 16,\n 45, 15, 45, 46, 16, 26, 45, 17, 36, 18, 18, 37, 19, 18, 36, 37, 19, 38, 20, 19, 37, 38, 20, 39, 21, 20, 38, 39, 21, 39, 27, 22, 42, 23, 22, 27, 42, 23, 43, 24,\n 23, 42, 43, 24, 44, 25, 24, 43, 44, 25, 45, 26, 25, 44, 45, 27, 39, 28, 27, 28, 42, 28, 39, 29, 28, 29, 42, 29, 31, 30, 29, 30, 35, 29, 40, 31, 29, 35, 47, 29,\n 39, 40, 29, 47, 42, 30, 31, 32, 30, 32, 33, 30, 33, 34, 30, 34, 35, 31, 50, 32, 31, 40, 41, 31, 48, 49, 31, 49, 50, 32, 51, 33, 32, 50, 51, 33, 51, 34, 34, 52,\n 35, 34, 51, 52, 35, 46, 47, 35, 52, 53, 35, 53, 54, 36, 41, 37, 37, 40, 38, 37, 41, 40, 38, 40, 39, 42, 47, 43, 43, 47, 44, 44, 46, 45, 44, 47, 46, 48, 60, 49,\n 48, 59, 60, 49, 61, 50, 49, 60, 61, 50, 62, 51, 50, 61, 62, 51, 62, 52, 52, 63, 53, 52, 62, 63, 53, 64, 54, 53, 63, 64, 54, 64, 55, 55, 65, 56, 55, 64, 65, 56,\n 66, 57, 56, 65, 66, 57, 66, 58, 58, 67, 59, 58, 66, 67, 59, 67, 60, 60, 67, 61, 61, 66, 62, 61, 67, 66, 62, 66, 63, 63, 65, 64, 63, 66, 65, 21, 27, 22];\n\nexport const TRI33 = [\n /* eyes */ 0, 8, 7, 7, 8, 1, 2, 10, 9, 9, 10, 3,\n /* brows */ 17, 0, 18, 18, 0, 7, 18, 7, 19, 19, 7, 1, 19, 1, 11, 19, 11, 20, 21, 3, 22, 21, 9, 3, 20, 9, 21, 20, 2, 9, 20, 11, 2,\n /* 4head */ 23, 17, 18, 25, 21, 22, 24, 19, 20, 24, 18, 19, 24, 20, 21, 24, 23, 18, 24, 21, 25,\n /* nose */ 11, 12, 4, 11, 4, 13, 1, 12, 11, 11, 13, 2, 12, 14, 4, 4, 14, 13,\n /* up-lip */ 14, 5, 15, 14, 15, 6, 12, 5, 14, 14, 6, 13,\n /* cheeks */ 8, 12, 1, 2, 13, 10, 8, 26, 12, 10, 13, 27, 26, 5, 12, 13, 6, 27, 0, 26, 8, 10, 27, 3,\n /* chin */ 5, 32, 16, 16, 32, 6, 5, 30, 32, 6, 32, 31,\n /* cont */ 26, 30, 5, 27, 6, 31, 0, 28, 26, 3, 27, 29, 17, 28, 0, 3, 29, 22, 23, 28, 17, 22, 29, 25, 28, 30, 26, 27, 31, 29,\n];\n\nexport const TRI7 = [0, 4, 1, 2, 4, 3, 4, 5, 6];\n\nexport const VTX68 = [\n /* cont */ 127, 234, 132, 58, 172, 150, 149, 148, 152, 377, 378, 379, 397, 288, 361, 454, 356,\n /* brows */ 70, 63, 105, 66, 107, 336, 296, 334, 293, 300,\n /* nose */ 168, 6, 195, 4, 98, 97, 2, 326, 327,\n /* eyes */ 33, 160, 158, 133, 153, 144, 362, 385, 387, 263, 373, 380,\n /* lip */ 57, 40, 37, 0, 267, 270, 287, 321, 314, 17, 84, 91,\n /* mouth */ 78, 81, 13, 311, 308, 402, 14, 178,\n];\n\nexport const VTX33 = [33, 133, 362, 263, 1, 62, 308, 159, 145, 386, 374, 6, 102, 331, 2, 13, 14, 70, 105, 107, 336, 334, 300, 54, 10, 284, 50, 280, 234, 454, 58, 288, 152];\n\nexport const VTX7 = [33, 133, 362, 263, 1, 78, 308];\n\nexport const UV68 = VTX68.map((x) => UV468[x]);\n\nexport const UV33 = VTX33.map((x) => UV468[x]);\n\nexport const UV7 = VTX7.map((x) => UV468[x]);\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as bounding from './box';\nimport * as util from './util';\nimport * as coords from './coords';\n\nconst leftOutline = coords.MESH_ANNOTATIONS['leftEyeLower0'];\nconst rightOutline = coords.MESH_ANNOTATIONS['rightEyeLower0'];\n\nconst eyeLandmarks = {\n leftBounds: [leftOutline[0], leftOutline[leftOutline.length - 1]],\n rightBounds: [rightOutline[0], rightOutline[rightOutline.length - 1]],\n};\n\nconst meshLandmarks = {\n count: 468,\n mouth: 13,\n symmetryLine: [13, coords.MESH_ANNOTATIONS['midwayBetweenEyes'][0]],\n};\n\nconst blazeFaceLandmarks = {\n leftEye: 0,\n rightEye: 1,\n nose: 2,\n mouth: 3,\n leftEar: 4,\n rightEar: 5,\n symmetryLine: [3, 2],\n};\n\nconst irisLandmarks = {\n upperCenter: 3,\n lowerCenter: 4,\n index: 71,\n numCoordinates: 76,\n};\n\n// Replace the raw coordinates returned by facemesh with refined iris model coordinates\n// Update the z coordinate to be an average of the original and the new.\nfunction replaceRawCoordinates(rawCoords, newCoords, prefix, keys) {\n for (let i = 0; i < coords.MESH_TO_IRIS_INDICES_MAP.length; i++) {\n const { key, indices } = coords.MESH_TO_IRIS_INDICES_MAP[i];\n const originalIndices = coords.MESH_ANNOTATIONS[`${prefix}${key}`];\n if (!keys || keys.includes(key)) {\n for (let j = 0; j < indices.length; j++) {\n const index = indices[j];\n rawCoords[originalIndices[j]] = [\n newCoords[index][0], newCoords[index][1],\n (newCoords[index][2] + rawCoords[originalIndices[j]][2]) / 2,\n ];\n }\n }\n }\n}\n// The Pipeline coordinates between the bounding box and skeleton models.\nexport class Pipeline {\n storedBoxes: any;\n boundingBoxDetector: any;\n meshDetector: any;\n irisModel: any;\n boxSize: number;\n meshSize: number;\n irisSize: number;\n irisEnlarge: number;\n skipped: number;\n detectedFaces: number;\n\n constructor(boundingBoxDetector, meshDetector, irisModel) {\n // An array of facial bounding boxes.\n this.storedBoxes = [];\n this.boundingBoxDetector = boundingBoxDetector;\n this.meshDetector = meshDetector;\n this.irisModel = irisModel;\n this.boxSize = boundingBoxDetector?.model?.inputs[0].shape[2] || 0;\n this.meshSize = meshDetector?.inputs[0].shape[2] || boundingBoxDetector?.model?.inputs[0].shape[2];\n this.irisSize = irisModel?.inputs[0].shape[1] || 0;\n this.irisEnlarge = 2.3;\n this.skipped = 0;\n this.detectedFaces = 0;\n }\n\n transformRawCoords(rawCoords, box, angle, rotationMatrix) {\n const boxSize = bounding.getBoxSize({ startPoint: box.startPoint, endPoint: box.endPoint });\n const coordsScaled = rawCoords.map((coord) => ([\n boxSize[0] / this.meshSize * (coord[0] - this.meshSize / 2),\n boxSize[1] / this.meshSize * (coord[1] - this.meshSize / 2),\n coord[2],\n ]));\n const coordsRotationMatrix = (angle !== 0) ? util.buildRotationMatrix(angle, [0, 0]) : util.IDENTITY_MATRIX;\n const coordsRotated = (angle !== 0) ? coordsScaled.map((coord) => ([...util.rotatePoint(coord, coordsRotationMatrix), coord[2]])) : coordsScaled;\n const inverseRotationMatrix = (angle !== 0) ? util.invertTransformMatrix(rotationMatrix) : util.IDENTITY_MATRIX;\n const boxCenter = [...bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint }), 1];\n return coordsRotated.map((coord) => ([\n Math.round(coord[0] + util.dot(boxCenter, inverseRotationMatrix[0])),\n Math.round(coord[1] + util.dot(boxCenter, inverseRotationMatrix[1])),\n Math.round(coord[2]),\n ]));\n }\n\n // eslint-disable-next-line class-methods-use-this\n getLeftToRightEyeDepthDifference(rawCoords) {\n const leftEyeZ = rawCoords[eyeLandmarks.leftBounds[0]][2];\n const rightEyeZ = rawCoords[eyeLandmarks.rightBounds[0]][2];\n return leftEyeZ - rightEyeZ;\n }\n\n // Returns a box describing a cropped region around the eye fit for passing to the iris model.\n getEyeBox(rawCoords, face, eyeInnerCornerIndex, eyeOuterCornerIndex, flip = false) {\n const box = bounding.squarifyBox(bounding.enlargeBox(bounding.calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), this.irisEnlarge));\n const boxSize = bounding.getBoxSize(box);\n let crop = tf.image.cropAndResize(face, [[\n box.startPoint[1] / this.meshSize,\n box.startPoint[0] / this.meshSize, box.endPoint[1] / this.meshSize,\n box.endPoint[0] / this.meshSize,\n ]], [0], [this.irisSize, this.irisSize]);\n if (flip && tf.ENV.flags.IS_BROWSER) {\n crop = tf.image.flipLeftRight(crop); // flipLeftRight is not defined for tfjs-node\n }\n return { box, boxSize, crop };\n }\n\n // Given a cropped image of an eye, returns the coordinates of the contours surrounding the eye and the iris.\n getEyeCoords(eyeData, eyeBox, eyeBoxSize, flip = false) {\n const eyeRawCoords: Array = [];\n for (let i = 0; i < irisLandmarks.numCoordinates; i++) {\n const x = eyeData[i * 3];\n const y = eyeData[i * 3 + 1];\n const z = eyeData[i * 3 + 2];\n eyeRawCoords.push([\n (flip ? (1 - (x / this.irisSize)) : (x / this.irisSize)) * eyeBoxSize[0] + eyeBox.startPoint[0],\n (y / this.irisSize) * eyeBoxSize[1] + eyeBox.startPoint[1], z,\n ]);\n }\n return { rawCoords: eyeRawCoords, iris: eyeRawCoords.slice(irisLandmarks.index) };\n }\n\n // The z-coordinates returned for the iris are unreliable, so we take the z values from the surrounding keypoints.\n // eslint-disable-next-line class-methods-use-this\n getAdjustedIrisCoords(rawCoords, irisCoords, direction) {\n const upperCenterZ = rawCoords[coords.MESH_ANNOTATIONS[`${direction}EyeUpper0`][irisLandmarks.upperCenter]][2];\n const lowerCenterZ = rawCoords[coords.MESH_ANNOTATIONS[`${direction}EyeLower0`][irisLandmarks.lowerCenter]][2];\n const averageZ = (upperCenterZ + lowerCenterZ) / 2;\n // Iris indices: 0: center | 1: right | 2: above | 3: left | 4: below\n return irisCoords.map((coord, i) => {\n let z = averageZ;\n if (i === 2) {\n z = upperCenterZ;\n } else if (i === 4) {\n z = lowerCenterZ;\n }\n return [coord[0], coord[1], z];\n });\n }\n\n async predict(input, config) {\n let useFreshBox = false;\n // run new detector every skipFrames unless we only want box to start with\n let detector;\n if ((this.skipped === 0) || (this.skipped > config.face.detector.skipFrames) || !config.face.mesh.enabled || !config.skipFrame) {\n detector = await this.boundingBoxDetector.getBoundingBoxes(input);\n this.skipped = 0;\n }\n if (config.skipFrame) this.skipped++;\n\n // if detector result count doesn't match current working set, use it to reset current working set\n if (!config.skipFrame || (detector && detector.boxes && (!config.face.mesh.enabled || (detector.boxes.length !== this.detectedFaces) && (this.detectedFaces !== config.face.detector.maxDetected)))) {\n this.storedBoxes = [];\n this.detectedFaces = 0;\n for (const possible of detector.boxes) {\n this.storedBoxes.push({ startPoint: possible.box.startPoint.dataSync(), endPoint: possible.box.endPoint.dataSync(), landmarks: possible.landmarks, confidence: possible.confidence });\n }\n if (this.storedBoxes.length > 0) useFreshBox = true;\n }\n\n if (useFreshBox) {\n if (!detector || !detector.boxes || (detector.boxes.length === 0)) {\n this.storedBoxes = [];\n this.detectedFaces = 0;\n return null;\n }\n for (let i = 0; i < this.storedBoxes.length; i++) {\n const scaledBox = bounding.scaleBoxCoordinates({ startPoint: this.storedBoxes[i].startPoint, endPoint: this.storedBoxes[i].endPoint }, detector.scaleFactor);\n const enlargedBox = bounding.enlargeBox(scaledBox);\n const squarifiedBox = bounding.squarifyBox(enlargedBox);\n const landmarks = this.storedBoxes[i].landmarks.arraySync();\n const confidence = this.storedBoxes[i].confidence;\n this.storedBoxes[i] = { ...squarifiedBox, confidence, landmarks };\n }\n }\n if (detector && detector.boxes) {\n detector.boxes.forEach((prediction) => {\n prediction.box.startPoint.dispose();\n prediction.box.endPoint.dispose();\n prediction.landmarks.dispose();\n });\n }\n const results = tf.tidy(() => this.storedBoxes.map((box, i) => {\n // The facial bounding box landmarks could come either from blazeface (if we are using a fresh box), or from the mesh model (if we are reusing an old box).\n let face;\n let angle = 0;\n let rotationMatrix;\n\n if (config.face.detector.rotation && config.face.mesh.enabled && tf.ENV.flags.IS_BROWSER) {\n const [indexOfMouth, indexOfForehead] = (box.landmarks.length >= meshLandmarks.count) ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine;\n angle = util.computeRotation(box.landmarks[indexOfMouth], box.landmarks[indexOfForehead]);\n const faceCenter = bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint });\n const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]];\n const rotatedImage = tf.image.rotateWithOffset(input, angle, 0, faceCenterNormalized); // rotateWithOffset is not defined for tfjs-node\n rotationMatrix = util.buildRotationMatrix(-angle, faceCenter);\n if (config.face.mesh.enabled) face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.meshSize, this.meshSize]).div(255);\n else face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.boxSize, this.boxSize]).div(255);\n } else {\n rotationMatrix = util.IDENTITY_MATRIX;\n const clonedImage = input.clone();\n if (config.face.mesh.enabled) face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, clonedImage, [this.meshSize, this.meshSize]).div(255);\n else face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, clonedImage, [this.boxSize, this.boxSize]).div(255);\n }\n\n // if we're not going to produce mesh, don't spend time with further processing\n if (!config.face.mesh.enabled) {\n const prediction = {\n mesh: [],\n box,\n faceConfidence: null,\n boxConfidence: box.confidence,\n confidence: box.confidence,\n image: face,\n };\n return prediction;\n }\n\n const [, confidence, contourCoords] = this.meshDetector.execute(face); // The first returned tensor represents facial contours which are already included in the coordinates.\n const faceConfidence = confidence.dataSync()[0];\n if (faceConfidence < config.face.detector.minConfidence) {\n this.storedBoxes[i].confidence = faceConfidence; // reset confidence of cached box\n return null; // if below confidence just exit\n }\n const coordsReshaped = tf.reshape(contourCoords, [-1, 3]);\n let rawCoords = coordsReshaped.arraySync();\n\n if (config.face.iris.enabled) {\n const { box: leftEyeBox, boxSize: leftEyeBoxSize, crop: leftEyeCrop } = this.getEyeBox(rawCoords, face, eyeLandmarks.leftBounds[0], eyeLandmarks.leftBounds[1], true);\n const { box: rightEyeBox, boxSize: rightEyeBoxSize, crop: rightEyeCrop } = this.getEyeBox(rawCoords, face, eyeLandmarks.rightBounds[0], eyeLandmarks.rightBounds[1]);\n const eyePredictions = this.irisModel.predict(tf.concat([leftEyeCrop, rightEyeCrop]));\n const eyePredictionsData = eyePredictions.dataSync();\n const leftEyeData = eyePredictionsData.slice(0, irisLandmarks.numCoordinates * 3);\n const { rawCoords: leftEyeRawCoords, iris: leftIrisRawCoords } = this.getEyeCoords(leftEyeData, leftEyeBox, leftEyeBoxSize, true);\n const rightEyeData = eyePredictionsData.slice(irisLandmarks.numCoordinates * 3);\n const { rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords } = this.getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize);\n const leftToRightEyeDepthDifference = this.getLeftToRightEyeDepthDifference(rawCoords);\n if (Math.abs(leftToRightEyeDepthDifference) < 30) { // User is looking straight ahead.\n replaceRawCoordinates(rawCoords, leftEyeRawCoords, 'left', null);\n replaceRawCoordinates(rawCoords, rightEyeRawCoords, 'right', null);\n // If the user is looking to the left or to the right, the iris coordinates tend to diverge too much from the mesh coordinates for them to be merged\n // So we only update a single contour line above and below the eye.\n } else if (leftToRightEyeDepthDifference < 1) { // User is looking towards the right.\n replaceRawCoordinates(rawCoords, leftEyeRawCoords, 'left', ['EyeUpper0', 'EyeLower0']);\n } else { // User is looking towards the left.\n replaceRawCoordinates(rawCoords, rightEyeRawCoords, 'right', ['EyeUpper0', 'EyeLower0']);\n }\n const adjustedLeftIrisCoords = this.getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, 'left');\n const adjustedRightIrisCoords = this.getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, 'right');\n rawCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords);\n }\n\n // override box from detection with one calculated from mesh\n const mesh = this.transformRawCoords(rawCoords, box, angle, rotationMatrix);\n const storeConfidence = box.confidence;\n box = bounding.enlargeBox(bounding.calculateLandmarksBoundingBox(mesh), 1.5); // redefine box with mesh calculated one\n box.confidence = storeConfidence;\n\n // do rotation one more time with mesh keypoints if we want to return perfect image\n if (config.face.detector.rotation && config.face.mesh.enabled && config.face.description.enabled && tf.ENV.flags.IS_BROWSER) {\n const [indexOfMouth, indexOfForehead] = (box.landmarks.length >= meshLandmarks.count) ? meshLandmarks.symmetryLine : blazeFaceLandmarks.symmetryLine;\n angle = util.computeRotation(box.landmarks[indexOfMouth], box.landmarks[indexOfForehead]);\n const faceCenter = bounding.getBoxCenter({ startPoint: box.startPoint, endPoint: box.endPoint });\n const faceCenterNormalized = [faceCenter[0] / input.shape[2], faceCenter[1] / input.shape[1]];\n const rotatedImage = tf.image.rotateWithOffset(input.toFloat(), angle, 0, faceCenterNormalized); // rotateWithOffset is not defined for tfjs-node\n rotationMatrix = util.buildRotationMatrix(-angle, faceCenter);\n face = bounding.cutBoxFromImageAndResize({ startPoint: box.startPoint, endPoint: box.endPoint }, rotatedImage, [this.meshSize, this.meshSize]).div(255);\n }\n\n const prediction = {\n mesh,\n box,\n faceConfidence,\n boxConfidence: box.confidence,\n image: face,\n };\n\n // updated stored cache values\n const storedBox = bounding.squarifyBox(box);\n // @ts-ignore box itself doesn't have those properties, but we stored them for future use\n storedBox.confidence = box.confidence;\n // @ts-ignore box itself doesn't have those properties, but we stored them for future use\n storedBox.faceConfidence = faceConfidence;\n // this.storedBoxes[i] = { ...squarifiedLandmarksBox, confidence: box.confidence, faceConfidence };\n this.storedBoxes[i] = storedBox;\n\n return prediction;\n }));\n\n // results = results.filter((a) => a !== null);\n // remove cache entries for detected boxes on low confidence\n if (config.face.mesh.enabled) this.storedBoxes = this.storedBoxes.filter((a) => a.confidence > config.face.detector.minConfidence);\n this.detectedFaces = results.length;\n\n return results;\n }\n}\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\n\nconst annotations = ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral'];\nlet model;\n// let last: Array<{ score: number, emotion: string }> = [];\nconst last: Array> = [];\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\n// tuning values\nconst rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale\n\nexport async function load(config) {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.face.emotion.modelPath));\n if (!model || !model.modelUrl) log('load model failed:', config.face.emotion.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nexport async function predict(image, config, idx, count) {\n if (!model) return null;\n if ((skipped < config.face.emotion.skipFrames) && config.skipFrame && (lastCount === count) && last[idx] && (last[idx].length > 0)) {\n skipped++;\n return last[idx];\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const resize = tf.image.resizeBilinear(image, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n const [red, green, blue] = tf.split(resize, 3, 3);\n resize.dispose();\n // weighted rgb to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n const redNorm = tf.mul(red, rgb[0]);\n const greenNorm = tf.mul(green, rgb[1]);\n const blueNorm = tf.mul(blue, rgb[2]);\n red.dispose();\n green.dispose();\n blue.dispose();\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n redNorm.dispose();\n greenNorm.dispose();\n blueNorm.dispose();\n const normalize = tf.tidy(() => grayscale.sub(0.5).mul(2));\n grayscale.dispose();\n const obj: Array<{ score: number, emotion: string }> = [];\n if (config.face.emotion.enabled) {\n const emotionT = await model.predict(normalize); // result is already in range 0..1, no need for additional activation\n const data = emotionT.dataSync();\n tf.dispose(emotionT);\n for (let i = 0; i < data.length; i++) {\n if (data[i] > config.face.emotion.minConfidence) obj.push({ score: Math.min(0.99, Math.trunc(100 * data[i]) / 100), emotion: annotations[i] });\n }\n obj.sort((a, b) => b.score - a.score);\n }\n normalize.dispose();\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\n\nlet model;\nconst last: Array<{ age: number}> = [];\nlet lastCount = 0;\nlet skipped = Number.MAX_SAFE_INTEGER;\n\ntype Tensor = typeof tf.Tensor;\ntype DB = Array<{ name: string, source: string, embedding: number[] }>;\n\nexport async function load(config) {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.face.description.modelPath));\n if (!model || !model.modelUrl) log('load model failed:', config.face.description.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nexport function similarity(embedding1, embedding2, order = 2): number {\n if (!embedding1 || !embedding2) return 0;\n if (embedding1?.length === 0 || embedding2?.length === 0) return 0;\n if (embedding1?.length !== embedding2?.length) return 0;\n // general minkowski distance, euclidean distance is limited case where order is 2\n const distance = 5.0 * embedding1\n .map((val, i) => (Math.abs(embedding1[i] - embedding2[i]) ** order)) // distance squared\n .reduce((sum, now) => (sum + now), 0) // sum all distances\n ** (1 / order); // get root of\n const res = Math.max(0, 100 - distance) / 100.0;\n return res;\n}\n\nexport function match(embedding: Array, db: DB, threshold = 0) {\n let best = { similarity: 0, name: '', source: '', embedding: [] as number[] };\n if (!embedding || !db || !Array.isArray(embedding) || !Array.isArray(db)) return best;\n for (const f of db) {\n if (f.embedding && f.name) {\n const perc = similarity(embedding, f.embedding);\n if (perc > threshold && perc > best.similarity) best = { ...f, similarity: perc };\n }\n }\n return best;\n}\n\nexport function enhance(input): Tensor {\n const image = tf.tidy(() => {\n // input received from detector is already normalized to 0..1\n // input is also assumed to be straightened\n const tensor = input.image || input.tensor || input;\n if (!(tensor instanceof tf.Tensor)) return null;\n // do a tight crop of image and resize it to fit the model\n const box = [[0.05, 0.15, 0.85, 0.85]]; // empyrical values for top, left, bottom, right\n // const box = [[0.0, 0.0, 1.0, 1.0]]; // basically no crop for test\n const crop = (tensor.shape.length === 3)\n ? tf.image.cropAndResize(tf.expandDims(tensor, 0), box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) // add batch dimension if missing\n : tf.image.cropAndResize(tensor, box, [0], [model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n\n /*\n // just resize to fit the embedding model instead of cropping\n const crop = tf.image.resizeBilinear(tensor, [model.inputs[0].shape[2], model.inputs[0].shape[1]], false);\n */\n\n /*\n // convert to black&white to avoid colorization impact\n const rgb = [0.2989, 0.5870, 0.1140]; // factors for red/green/blue colors when converting to grayscale: https://www.mathworks.com/help/matlab/ref/rgb2gray.html\n const [red, green, blue] = tf.split(crop, 3, 3);\n const redNorm = tf.mul(red, rgb[0]);\n const greenNorm = tf.mul(green, rgb[1]);\n const blueNorm = tf.mul(blue, rgb[2]);\n const grayscale = tf.addN([redNorm, greenNorm, blueNorm]);\n const merge = tf.stack([grayscale, grayscale, grayscale], 3).squeeze(4);\n */\n\n /*\n // increase image pseudo-contrast 100%\n // (or do it per-channel so mean is done on each channel)\n // (or calculate histogram and do it based on histogram)\n const mean = merge.mean();\n const factor = 2;\n const contrast = merge.sub(mean).mul(factor).add(mean);\n */\n\n /*\n // normalize brightness from 0..1\n // silly way of creating pseudo-hdr of image\n const darken = crop.sub(crop.min());\n const lighten = darken.div(darken.max());\n */\n\n const norm = crop.mul(255);\n\n return norm;\n });\n return image;\n}\n\nexport async function predict(image, config, idx, count) {\n if (!model) return null;\n if ((skipped < config.face.description.skipFrames) && config.skipFrame && (lastCount === count) && last[idx]?.age && (last[idx]?.age > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const enhanced = enhance(image);\n\n let resT;\n const obj = {\n age: 0,\n gender: 'unknown',\n genderConfidence: 0,\n descriptor: [] };\n\n if (config.face.description.enabled) resT = await model.predict(enhanced);\n tf.dispose(enhanced);\n\n if (resT) {\n tf.tidy(() => {\n const gender = resT.find((t) => t.shape[1] === 1).dataSync();\n const confidence = Math.trunc(200 * Math.abs((gender[0] - 0.5))) / 100;\n if (confidence > config.face.description.minConfidence) {\n obj.gender = gender[0] <= 0.5 ? 'female' : 'male';\n obj.genderConfidence = Math.min(0.99, confidence);\n }\n const age = resT.find((t) => t.shape[1] === 100).argMax(1).dataSync()[0];\n const all = resT.find((t) => t.shape[1] === 100).dataSync();\n obj.age = Math.round(all[age - 1] > all[age + 1] ? 10 * age - 100 * all[age - 1] : 10 * age + 100 * all[age + 1]) / 10;\n\n const desc = resT.find((t) => t.shape[1] === 1024);\n // const reshape = desc.reshape([128, 8]); // reshape large 1024-element descriptor to 128 x 8\n // const reduce = reshape.logSumExp(1); // reduce 2nd dimension by calculating logSumExp on it which leaves us with 128-element descriptor\n\n obj.descriptor = [...desc.dataSync()];\n });\n resT.forEach((t) => tf.dispose(t));\n }\n\n last[idx] = obj;\n lastCount = count;\n resolve(obj);\n });\n}\n", "import { log, now } from './helpers';\nimport * as facemesh from './blazeface/facemesh';\nimport * as emotion from './emotion/emotion';\nimport * as faceres from './faceres/faceres';\nimport { Face } from './result';\n\nconst calculateFaceAngle = (face, image_size): { angle: { pitch: number, yaw: number, roll: number }, matrix: [number, number, number, number, number, number, number, number, number] } => {\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const degrees = (theta) => (theta * 180) / Math.PI;\n // const degrees = (theta) => Math.abs(((theta * 180) / Math.PI) % 360);\n const normalize = (v) => { // normalize vector\n const length = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);\n v[0] /= length;\n v[1] /= length;\n v[2] /= length;\n return v;\n };\n const subVectors = (a, b) => { // vector subtraction (a - b)\n const x = a[0] - b[0];\n const y = a[1] - b[1];\n const z = a[2] - b[2];\n return [x, y, z];\n };\n const crossVectors = (a, b) => { // vector cross product (a x b)\n const x = a[1] * b[2] - a[2] * b[1];\n const y = a[2] * b[0] - a[0] * b[2];\n const z = a[0] * b[1] - a[1] * b[0];\n return [x, y, z];\n };\n // 3x3 rotation matrix to Euler angles based on https://www.geometrictools.com/Documentation/EulerAngles.pdf\n const rotationMatrixToEulerAngle = (r) => {\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const [r00, r01, r02, r10, r11, r12, r20, r21, r22] = r;\n let thetaX; let thetaY; let thetaZ;\n if (r10 < 1) { // YZX calculation\n if (r10 > -1) {\n thetaZ = Math.asin(r10);\n thetaY = Math.atan2(-r20, r00);\n thetaX = Math.atan2(-r12, r11);\n } else {\n thetaZ = -Math.PI / 2;\n thetaY = -Math.atan2(r21, r22);\n thetaX = 0;\n }\n } else {\n thetaZ = Math.PI / 2;\n thetaY = Math.atan2(r21, r22);\n thetaX = 0;\n }\n return { pitch: 2 * -thetaX, yaw: 2 * -thetaY, roll: 2 * -thetaZ };\n };\n // simple Euler angle calculation based existing 3D mesh\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const meshToEulerAngle = (mesh) => {\n const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1);\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const angle = {\n // values are in radians in range of -pi/2 to pi/2 which is -90 to +90 degrees, value of 0 means center\n // pitch is face move up/down\n pitch: radians(mesh[10][1], mesh[10][2], mesh[152][1], mesh[152][2]), // looking at y,z of top and bottom points of the face\n // yaw is face turn left/right\n yaw: radians(mesh[33][0], mesh[33][2], mesh[263][0], mesh[263][2]), // looking at x,z of outside corners of leftEye and rightEye\n // roll is face lean left/right\n roll: radians(mesh[33][0], mesh[33][1], mesh[263][0], mesh[263][1]), // looking at x,y of outside corners of leftEye and rightEye\n };\n return angle;\n };\n\n const mesh = face.meshRaw;\n if (!mesh || mesh.length < 300) return { angle: { pitch: 0, yaw: 0, roll: 0 }, matrix: [1, 0, 0, 0, 1, 0, 0, 0, 1] };\n\n const size = Math.max(face.boxRaw[2] * image_size[0], face.boxRaw[3] * image_size[1]) / 1.5;\n // top, bottom, left, right\n const pts = [mesh[10], mesh[152], mesh[234], mesh[454]].map((pt) => [\n // make the xyz coordinates proportional, independent of the image/box size\n pt[0] * image_size[0] / size,\n pt[1] * image_size[1] / size,\n pt[2],\n ]);\n\n const y_axis = normalize(subVectors(pts[1], pts[0]));\n let x_axis = normalize(subVectors(pts[3], pts[2]));\n const z_axis = normalize(crossVectors(x_axis, y_axis));\n // adjust x_axis to make sure that all axes are perpendicular to each other\n x_axis = crossVectors(y_axis, z_axis);\n\n // Rotation Matrix from Axis Vectors - http://renderdan.blogspot.com/2006/05/rotation-matrix-from-axis-vectors.html\n // 3x3 rotation matrix is flatten to array in row-major order. Note that the rotation represented by this matrix is inverted.\n const matrix: [number, number, number, number, number, number, number, number, number] = [\n x_axis[0], x_axis[1], x_axis[2],\n y_axis[0], y_axis[1], y_axis[2],\n z_axis[0], z_axis[1], z_axis[2],\n ];\n const angle = rotationMatrixToEulerAngle(matrix);\n // const angle = meshToEulerAngle(mesh);\n return { angle, matrix };\n};\n\nexport const detectFace = async (parent, input): Promise => {\n // run facemesh, includes blazeface and iris\n // eslint-disable-next-line no-async-promise-executor\n let timeStamp;\n let ageRes;\n let genderRes;\n let emotionRes;\n let embeddingRes;\n let descRes;\n const faceRes: Array = [];\n parent.state = 'run:face';\n timeStamp = now();\n const faces = await facemesh.predict(input, parent.config);\n parent.perf.face = Math.trunc(now() - timeStamp);\n if (!faces) return [];\n // for (const face of faces) {\n for (let i = 0; i < faces.length; i++) {\n parent.analyze('Get Face');\n\n // is something went wrong, skip the face\n if (!faces[i].image || faces[i].image.isDisposedInternal) {\n log('Face object is disposed:', faces[i].image);\n continue;\n }\n\n const rotation = calculateFaceAngle(faces[i], [input.shape[2], input.shape[1]]);\n\n // run emotion, inherits face from blazeface\n parent.analyze('Start Emotion:');\n if (parent.config.async) {\n emotionRes = parent.config.face.emotion.enabled ? emotion.predict(faces[i].image, parent.config, i, faces.length) : {};\n } else {\n parent.state = 'run:emotion';\n timeStamp = now();\n emotionRes = parent.config.face.emotion.enabled ? await emotion.predict(faces[i].image, parent.config, i, faces.length) : {};\n parent.perf.emotion = Math.trunc(now() - timeStamp);\n }\n parent.analyze('End Emotion:');\n\n // run emotion, inherits face from blazeface\n parent.analyze('Start Description:');\n if (parent.config.async) {\n descRes = parent.config.face.description.enabled ? faceres.predict(faces[i], parent.config, i, faces.length) : [];\n } else {\n parent.state = 'run:description';\n timeStamp = now();\n descRes = parent.config.face.description.enabled ? await faceres.predict(faces[i].image, parent.config, i, faces.length) : [];\n parent.perf.embedding = Math.trunc(now() - timeStamp);\n }\n parent.analyze('End Description:');\n\n // if async wait for results\n if (parent.config.async) {\n [ageRes, genderRes, emotionRes, embeddingRes, descRes] = await Promise.all([ageRes, genderRes, emotionRes, embeddingRes, descRes]);\n }\n\n parent.analyze('Finish Face:');\n\n // calculate iris distance\n // iris: array[ center, left, top, right, bottom]\n if (!parent.config.face.iris.enabled && faces[i]?.annotations?.leftEyeIris && faces[i]?.annotations?.rightEyeIris) {\n delete faces[i].annotations.leftEyeIris;\n delete faces[i].annotations.rightEyeIris;\n }\n const irisSize = (faces[i].annotations?.leftEyeIris && faces[i].annotations?.rightEyeIris)\n /* average human iris size is 11.7mm */\n ? 11.7 * Math.max(Math.abs(faces[i].annotations.leftEyeIris[3][0] - faces[i].annotations.leftEyeIris[1][0]), Math.abs(faces[i].annotations.rightEyeIris[4][1] - faces[i].annotations.rightEyeIris[2][1]))\n : 0;\n\n // combine results\n faceRes.push({\n id: i,\n ...faces[i],\n age: descRes.age,\n gender: descRes.gender,\n genderConfidence: descRes.genderConfidence,\n embedding: descRes.descriptor,\n emotion: emotionRes,\n iris: (irisSize !== 0) ? Math.trunc(irisSize) / 100 : 0,\n rotation,\n tensor: parent.config.face.detector.return ? faces[i].image?.squeeze() : null,\n });\n // dispose original face tensor\n faces[i].image?.dispose();\n\n parent.analyze('End Face');\n }\n parent.analyze('End FaceMesh:');\n if (parent.config.async) {\n if (parent.perf.face) delete parent.perf.face;\n if (parent.perf.age) delete parent.perf.age;\n if (parent.perf.gender) delete parent.perf.gender;\n if (parent.perf.emotion) delete parent.perf.emotion;\n }\n return faceRes;\n};\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as poses from './poses';\nimport * as util from './utils';\nimport { Body } from '../result';\n\nlet model;\nconst poseNetOutputs = ['MobilenetV1/offset_2/BiasAdd'/* offsets */, 'MobilenetV1/heatmap_2/BiasAdd'/* heatmapScores */, 'MobilenetV1/displacement_fwd_2/BiasAdd'/* displacementFwd */, 'MobilenetV1/displacement_bwd_2/BiasAdd'/* displacementBwd */];\n\nexport async function predict(input, config): Promise {\n const res = tf.tidy(() => {\n const resized = input.resizeBilinear([model.inputs[0].shape[2], model.inputs[0].shape[1]]);\n const normalized = resized.toFloat().div(127.5).sub(1.0);\n const results = model.execute(normalized, poseNetOutputs);\n const results3d = results.map((y) => y.squeeze([0]));\n results3d[1] = results3d[1].sigmoid(); // apply sigmoid on scores\n return results3d;\n });\n\n const buffers = await Promise.all(res.map((tensor) => tensor.buffer()));\n for (const t of res) t.dispose();\n\n const decoded = await poses.decode(buffers[0], buffers[1], buffers[2], buffers[3], config.body.maxDetected, config.body.minConfidence);\n const scaled = util.scalePoses(decoded, [input.shape[1], input.shape[2]], [model.inputs[0].shape[2], model.inputs[0].shape[1]]) as Body[];\n return scaled;\n}\n\nexport async function load(config) {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\n if (!model || !model.modelUrl) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n", "export const partNames = [\n 'nose', 'leftEye', 'rightEye', 'leftEar', 'rightEar', 'leftShoulder',\n 'rightShoulder', 'leftElbow', 'rightElbow', 'leftWrist', 'rightWrist',\n 'leftHip', 'rightHip', 'leftKnee', 'rightKnee', 'leftAnkle', 'rightAnkle',\n];\n\nexport const count = partNames.length; // 17 keypoints\n\nexport const partIds = partNames.reduce((result, jointName, i) => {\n result[jointName] = i;\n return result;\n}, {});\n\nconst connectedPartNames = [\n ['leftHip', 'leftShoulder'], ['leftElbow', 'leftShoulder'],\n ['leftElbow', 'leftWrist'], ['leftHip', 'leftKnee'],\n ['leftKnee', 'leftAnkle'], ['rightHip', 'rightShoulder'],\n ['rightElbow', 'rightShoulder'], ['rightElbow', 'rightWrist'],\n ['rightHip', 'rightKnee'], ['rightKnee', 'rightAnkle'],\n ['leftShoulder', 'rightShoulder'], ['leftHip', 'rightHip'],\n];\nexport const connectedPartIndices = connectedPartNames.map(([jointNameA, jointNameB]) => ([partIds[jointNameA], partIds[jointNameB]]));\n\nexport const poseChain = [\n ['nose', 'leftEye'], ['leftEye', 'leftEar'], ['nose', 'rightEye'],\n ['rightEye', 'rightEar'], ['nose', 'leftShoulder'],\n ['leftShoulder', 'leftElbow'], ['leftElbow', 'leftWrist'],\n ['leftShoulder', 'leftHip'], ['leftHip', 'leftKnee'],\n ['leftKnee', 'leftAnkle'], ['nose', 'rightShoulder'],\n ['rightShoulder', 'rightElbow'], ['rightElbow', 'rightWrist'],\n ['rightShoulder', 'rightHip'], ['rightHip', 'rightKnee'],\n ['rightKnee', 'rightAnkle'],\n];\n", "import * as kpt from './keypoints';\n\nexport function eitherPointDoesntMeetConfidence(a, b, minConfidence) {\n return (a < minConfidence || b < minConfidence);\n}\n\nexport function getAdjacentKeyPoints(keypoints, minConfidence) {\n return kpt.connectedPartIndices.reduce((result, [leftJoint, rightJoint]) => {\n if (eitherPointDoesntMeetConfidence(keypoints[leftJoint].score, keypoints[rightJoint].score, minConfidence)) {\n return result;\n }\n result.push([keypoints[leftJoint], keypoints[rightJoint]]);\n return result;\n }, []);\n}\n\nexport function getBoundingBox(keypoints) {\n const coord = keypoints.reduce(({ maxX, maxY, minX, minY }, { position: { x, y } }) => ({\n maxX: Math.max(maxX, x),\n maxY: Math.max(maxY, y),\n minX: Math.min(minX, x),\n minY: Math.min(minY, y),\n }), {\n maxX: Number.NEGATIVE_INFINITY,\n maxY: Number.NEGATIVE_INFINITY,\n minX: Number.POSITIVE_INFINITY,\n minY: Number.POSITIVE_INFINITY,\n });\n return [coord.minX, coord.minY, coord.maxX - coord.minX, coord.maxY - coord.minY];\n}\n\nexport function scalePoses(poses, [height, width], [inputResolutionHeight, inputResolutionWidth]) {\n const scaleY = height / inputResolutionHeight;\n const scaleX = width / inputResolutionWidth;\n const scalePose = (pose, i) => ({\n id: i,\n score: pose.score,\n bowRaw: [pose.box[0] / inputResolutionWidth, pose.box[1] / inputResolutionHeight, pose.box[2] / inputResolutionWidth, pose.box[3] / inputResolutionHeight],\n box: [Math.trunc(pose.box[0] * scaleX), Math.trunc(pose.box[1] * scaleY), Math.trunc(pose.box[2] * scaleX), Math.trunc(pose.box[3] * scaleY)],\n keypoints: pose.keypoints.map(({ score, part, position }) => ({\n score,\n part,\n position: { x: Math.trunc(position.x * scaleX), y: Math.trunc(position.y * scaleY) },\n })),\n });\n const scaledPoses = poses.map((pose, i) => scalePose(pose, i));\n return scaledPoses;\n}\n\n// algorithm based on Coursera Lecture from Algorithms, Part 1: https://www.coursera.org/learn/algorithms-part1/lecture/ZjoSM/heapsort\nexport class MaxHeap {\n priorityQueue: any;\n numberOfElements: number;\n getElementValue: any;\n\n constructor(maxSize, getElementValue) {\n this.priorityQueue = new Array(maxSize);\n this.numberOfElements = -1;\n this.getElementValue = getElementValue;\n }\n\n enqueue(x) {\n this.priorityQueue[++this.numberOfElements] = x;\n this.swim(this.numberOfElements);\n }\n\n dequeue() {\n const max = this.priorityQueue[0];\n this.exchange(0, this.numberOfElements--);\n this.sink(0);\n this.priorityQueue[this.numberOfElements + 1] = null;\n return max;\n }\n\n empty() { return this.numberOfElements === -1; }\n\n size() { return this.numberOfElements + 1; }\n\n all() { return this.priorityQueue.slice(0, this.numberOfElements + 1); }\n\n max() { return this.priorityQueue[0]; }\n\n swim(k) {\n while (k > 0 && this.less(Math.floor(k / 2), k)) {\n this.exchange(k, Math.floor(k / 2));\n k = Math.floor(k / 2);\n }\n }\n\n sink(k) {\n while (2 * k <= this.numberOfElements) {\n let j = 2 * k;\n if (j < this.numberOfElements && this.less(j, j + 1)) j++;\n if (!this.less(k, j)) break;\n this.exchange(k, j);\n k = j;\n }\n }\n\n getValueAt(i) {\n return this.getElementValue(this.priorityQueue[i]);\n }\n\n less(i, j) {\n return this.getValueAt(i) < this.getValueAt(j);\n }\n\n exchange(i, j) {\n const t = this.priorityQueue[i];\n this.priorityQueue[i] = this.priorityQueue[j];\n this.priorityQueue[j] = t;\n }\n}\n\nexport function getOffsetPoint(y, x, keypoint, offsets) {\n return {\n y: offsets.get(y, x, keypoint),\n x: offsets.get(y, x, keypoint + kpt.count),\n };\n}\n\nexport function getImageCoords(part, outputStride, offsets) {\n const { heatmapY, heatmapX, id: keypoint } = part;\n const { y, x } = getOffsetPoint(heatmapY, heatmapX, keypoint, offsets);\n return {\n x: part.heatmapX * outputStride + x,\n y: part.heatmapY * outputStride + y,\n };\n}\n\nexport function fillArray(element, size) {\n const result = new Array(size);\n for (let i = 0; i < size; i++) {\n result[i] = element;\n }\n return result;\n}\n\nexport function clamp(a, min, max) {\n if (a < min) return min;\n if (a > max) return max;\n return a;\n}\n\nexport function squaredDistance(y1, x1, y2, x2) {\n const dy = y2 - y1;\n const dx = x2 - x1;\n return dy * dy + dx * dx;\n}\n\nexport function addVectors(a, b) {\n return { x: a.x + b.x, y: a.y + b.y };\n}\n\nexport function clampVector(a, min, max) {\n return { y: clamp(a.y, min, max), x: clamp(a.x, min, max) };\n}\n", "import * as utils from './utils';\nimport * as kpt from './keypoints';\n\nconst localMaximumRadius = 1;\nconst outputStride = 16;\nconst squaredNmsRadius = 50 ** 2;\n\nfunction traverse(edgeId, sourceKeypoint, targetId, scores, offsets, displacements, offsetRefineStep = 2) {\n const getDisplacement = (point) => ({\n y: displacements.get(point.y, point.x, edgeId),\n x: displacements.get(point.y, point.x, (displacements.shape[2] / 2) + edgeId),\n });\n const getStridedIndexNearPoint = (point, height, width) => ({\n y: utils.clamp(Math.round(point.y / outputStride), 0, height - 1),\n x: utils.clamp(Math.round(point.x / outputStride), 0, width - 1),\n });\n\n const [height, width] = scores.shape;\n // Nearest neighbor interpolation for the source->target displacements.\n const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, height, width);\n const displacement = getDisplacement(sourceKeypointIndices);\n const displacedPoint = utils.addVectors(sourceKeypoint.position, displacement);\n let targetKeypoint = displacedPoint;\n for (let i = 0; i < offsetRefineStep; i++) {\n const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);\n const offsetPoint = utils.getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetId, offsets);\n targetKeypoint = utils.addVectors(\n { x: targetKeypointIndices.x * outputStride, y: targetKeypointIndices.y * outputStride },\n { x: offsetPoint.x, y: offsetPoint.y },\n );\n }\n const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, height, width);\n const score = scores.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetId);\n return { position: targetKeypoint, part: kpt.partNames[targetId], score };\n}\n\nexport function decodePose(root, scores, offsets, displacementsFwd, displacementsBwd) {\n const tuples = kpt.poseChain.map(([parentJoinName, childJoinName]) => ([kpt.partIds[parentJoinName], kpt.partIds[childJoinName]]));\n const edgesFwd = tuples.map(([, childJointId]) => childJointId);\n const edgesBwd = tuples.map(([parentJointId]) => parentJointId);\n const numParts = scores.shape[2]; // [21,21,17]\n const numEdges = edgesFwd.length;\n const keypoints = new Array(numParts);\n // Start a new detection instance at the position of the root.\n const rootPoint = utils.getImageCoords(root.part, outputStride, offsets);\n keypoints[root.part.id] = {\n score: root.score,\n part: kpt.partNames[root.part.id],\n position: rootPoint,\n };\n // Decode the part positions upwards in the tree, following the backward displacements.\n for (let edge = numEdges - 1; edge >= 0; --edge) {\n const sourceId = edgesFwd[edge];\n const targetId = edgesBwd[edge];\n if (keypoints[sourceId] && !keypoints[targetId]) {\n keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsBwd);\n }\n }\n // Decode the part positions downwards in the tree, following the forward displacements.\n for (let edge = 0; edge < numEdges; ++edge) {\n const sourceId = edgesBwd[edge];\n const targetId = edgesFwd[edge];\n if (keypoints[sourceId] && !keypoints[targetId]) {\n keypoints[targetId] = traverse(edge, keypoints[sourceId], targetId, scores, offsets, displacementsFwd);\n }\n }\n return keypoints;\n}\n\nfunction scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores) {\n const [height, width] = scores.shape;\n let localMaximum = true;\n const yStart = Math.max(heatmapY - localMaximumRadius, 0);\n const yEnd = Math.min(heatmapY + localMaximumRadius + 1, height);\n for (let yCurrent = yStart; yCurrent < yEnd; ++yCurrent) {\n const xStart = Math.max(heatmapX - localMaximumRadius, 0);\n const xEnd = Math.min(heatmapX + localMaximumRadius + 1, width);\n for (let xCurrent = xStart; xCurrent < xEnd; ++xCurrent) {\n if (scores.get(yCurrent, xCurrent, keypointId) > score) {\n localMaximum = false;\n break;\n }\n }\n if (!localMaximum) break;\n }\n return localMaximum;\n}\n\nexport function buildPartWithScoreQueue(minConfidence, scores) {\n const [height, width, numKeypoints] = scores.shape;\n const queue = new utils.MaxHeap(height * width * numKeypoints, ({ score }) => score);\n for (let heatmapY = 0; heatmapY < height; ++heatmapY) {\n for (let heatmapX = 0; heatmapX < width; ++heatmapX) {\n for (let keypointId = 0; keypointId < numKeypoints; ++keypointId) {\n const score = scores.get(heatmapY, heatmapX, keypointId);\n // Only consider parts with score greater or equal to threshold as root candidates.\n if (score < minConfidence) continue;\n // Only consider keypoints whose score is maximum in a local window.\n if (scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, scores)) queue.enqueue({ score, part: { heatmapY, heatmapX, id: keypointId } });\n }\n }\n }\n return queue;\n}\n\nfunction withinRadius(poses, { x, y }, keypointId) {\n return poses.some(({ keypoints }) => {\n const correspondingKeypoint = keypoints[keypointId]?.position;\n if (!correspondingKeypoint) return false;\n return utils.squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius;\n });\n}\n\nfunction getInstanceScore(existingPoses, keypoints) {\n const notOverlappedKeypointScores = keypoints.reduce((result, { position, score }, keypointId) => {\n if (!withinRadius(existingPoses, position, keypointId)) result += score;\n return result;\n }, 0.0);\n return notOverlappedKeypointScores / keypoints.length;\n}\n\nexport function decode(offsets, scores, displacementsFwd, displacementsBwd, maxDetected, minConfidence) {\n const poses: Array<{ keypoints: any, box: any, score: number }> = [];\n const queue = buildPartWithScoreQueue(minConfidence, scores);\n // Generate at most maxDetected object instances per image in decreasing root part score order.\n while (poses.length < maxDetected && !queue.empty()) {\n // The top element in the queue is the next root candidate.\n const root = queue.dequeue();\n // Part-based non-maximum suppression: We reject a root candidate if it is within a disk of `nmsRadius` pixels from the corresponding part of a previously detected instance.\n const rootImageCoords = utils.getImageCoords(root.part, outputStride, offsets);\n if (withinRadius(poses, rootImageCoords, root.part.id)) continue;\n // Else start a new detection instance at the position of the root.\n let keypoints = decodePose(root, scores, offsets, displacementsFwd, displacementsBwd);\n keypoints = keypoints.filter((a) => a.score > minConfidence);\n const score = getInstanceScore(poses, keypoints);\n const box = utils.getBoundingBox(keypoints);\n if (score > minConfidence) poses.push({ keypoints, box, score: Math.round(100 * score) / 100 });\n }\n return poses;\n}\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as handdetector from './handdetector';\nimport * as handpipeline from './handpipeline';\nimport { Hand } from '../result';\n\nconst meshAnnotations = {\n thumb: [1, 2, 3, 4],\n indexFinger: [5, 6, 7, 8],\n middleFinger: [9, 10, 11, 12],\n ringFinger: [13, 14, 15, 16],\n pinky: [17, 18, 19, 20],\n palmBase: [0],\n};\n\nlet handDetectorModel;\nlet handPoseModel;\nlet handPipeline;\n\nexport async function predict(input, config): Promise {\n const predictions = await handPipeline.estimateHands(input, config);\n if (!predictions) return [];\n const hands: Array = [];\n for (let i = 0; i < predictions.length; i++) {\n const annotations = {};\n if (predictions[i].landmarks) {\n for (const key of Object.keys(meshAnnotations)) {\n annotations[key] = meshAnnotations[key].map((index) => predictions[i].landmarks[index]);\n }\n }\n const box: [number, number, number, number] = predictions[i].box ? [\n Math.max(0, predictions[i].box.topLeft[0]),\n Math.max(0, predictions[i].box.topLeft[1]),\n Math.min(input.shape[2], predictions[i].box.bottomRight[0]) - Math.max(0, predictions[i].box.topLeft[0]),\n Math.min(input.shape[1], predictions[i].box.bottomRight[1]) - Math.max(0, predictions[i].box.topLeft[1]),\n ] : [0, 0, 0, 0];\n const boxRaw: [number, number, number, number] = [\n (predictions[i].box.topLeft[0]) / input.shape[2],\n (predictions[i].box.topLeft[1]) / input.shape[1],\n (predictions[i].box.bottomRight[0] - predictions[i].box.topLeft[0]) / input.shape[2],\n (predictions[i].box.bottomRight[1] - predictions[i].box.topLeft[1]) / input.shape[1],\n ];\n hands.push({ id: i, confidence: Math.round(100 * predictions[i].confidence) / 100, box, boxRaw, landmarks: predictions[i].landmarks, annotations });\n }\n return hands;\n}\n\nexport async function load(config): Promise<[Object, Object]> {\n if (!handDetectorModel || !handPoseModel) {\n [handDetectorModel, handPoseModel] = await Promise.all([\n config.hand.enabled ? tf.loadGraphModel(join(config.modelBasePath, config.hand.detector.modelPath), { fromTFHub: config.hand.detector.modelPath.includes('tfhub.dev') }) : null,\n config.hand.landmarks ? tf.loadGraphModel(join(config.modelBasePath, config.hand.skeleton.modelPath), { fromTFHub: config.hand.skeleton.modelPath.includes('tfhub.dev') }) : null,\n ]);\n if (config.hand.enabled) {\n if (!handDetectorModel || !handDetectorModel.modelUrl) log('load model failed:', config.hand.detector.modelPath);\n else if (config.debug) log('load model:', handDetectorModel.modelUrl);\n if (!handPoseModel || !handPoseModel.modelUrl) log('load model failed:', config.hand.skeleton.modelPath);\n else if (config.debug) log('load model:', handPoseModel.modelUrl);\n }\n } else {\n if (config.debug) log('cached model:', handDetectorModel.modelUrl);\n if (config.debug) log('cached model:', handPoseModel.modelUrl);\n }\n const handDetector = new handdetector.HandDetector(handDetectorModel);\n handPipeline = new handpipeline.HandPipeline(handDetector, handPoseModel);\n return [handDetectorModel, handPoseModel];\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\n\nexport function getBoxSize(box) {\n return [\n Math.abs(box.endPoint[0] - box.startPoint[0]),\n Math.abs(box.endPoint[1] - box.startPoint[1]),\n ];\n}\n\nexport function getBoxCenter(box) {\n return [\n box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2,\n box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2,\n ];\n}\n\nexport function cutBoxFromImageAndResize(box, image, cropSize) {\n const h = image.shape[1];\n const w = image.shape[2];\n const boxes = [[\n box.startPoint[1] / h,\n box.startPoint[0] / w,\n box.endPoint[1] / h,\n box.endPoint[0] / w,\n ]];\n return tf.image.cropAndResize(image, boxes, [0], cropSize);\n}\n\nexport function scaleBoxCoordinates(box, factor) {\n const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]];\n const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]];\n const palmLandmarks = box.palmLandmarks.map((coord) => {\n const scaledCoord = [coord[0] * factor[0], coord[1] * factor[1]];\n return scaledCoord;\n });\n return { startPoint, endPoint, palmLandmarks, confidence: box.confidence };\n}\n\nexport function enlargeBox(box, factor = 1.5) {\n const center = getBoxCenter(box);\n const size = getBoxSize(box);\n const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2];\n const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]];\n const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]];\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function squarifyBox(box) {\n const centers = getBoxCenter(box);\n const size = getBoxSize(box);\n const maxEdge = Math.max(...size);\n const halfSize = maxEdge / 2;\n const startPoint = [centers[0] - halfSize, centers[1] - halfSize];\n const endPoint = [centers[0] + halfSize, centers[1] + halfSize];\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n\nexport function shiftBox(box, shiftFactor) {\n const boxSize = [\n box.endPoint[0] - box.startPoint[0],\n box.endPoint[1] - box.startPoint[1],\n ];\n const shiftVector = [boxSize[0] * shiftFactor[0], boxSize[1] * shiftFactor[1]];\n const startPoint = [box.startPoint[0] + shiftVector[0], box.startPoint[1] + shiftVector[1]];\n const endPoint = [box.endPoint[0] + shiftVector[0], box.endPoint[1] + shiftVector[1]];\n return { startPoint, endPoint, palmLandmarks: box.palmLandmarks };\n}\n", "export const anchors = [\n {\n x: 0.015625,\n y: 0.015625,\n },\n {\n x: 0.015625,\n y: 0.015625,\n },\n {\n x: 0.046875,\n y: 0.015625,\n },\n {\n x: 0.046875,\n y: 0.015625,\n },\n {\n x: 0.078125,\n y: 0.015625,\n },\n {\n x: 0.078125,\n y: 0.015625,\n },\n {\n x: 0.109375,\n y: 0.015625,\n },\n {\n x: 0.109375,\n y: 0.015625,\n },\n {\n x: 0.140625,\n y: 0.015625,\n },\n {\n x: 0.140625,\n y: 0.015625,\n },\n {\n x: 0.171875,\n y: 0.015625,\n },\n {\n x: 0.171875,\n y: 0.015625,\n },\n {\n x: 0.203125,\n y: 0.015625,\n },\n {\n x: 0.203125,\n y: 0.015625,\n },\n {\n x: 0.234375,\n y: 0.015625,\n },\n {\n x: 0.234375,\n y: 0.015625,\n },\n {\n x: 0.265625,\n y: 0.015625,\n },\n {\n x: 0.265625,\n y: 0.015625,\n },\n {\n x: 0.296875,\n y: 0.015625,\n },\n {\n x: 0.296875,\n y: 0.015625,\n },\n {\n x: 0.328125,\n y: 0.015625,\n },\n {\n x: 0.328125,\n y: 0.015625,\n },\n {\n x: 0.359375,\n y: 0.015625,\n },\n {\n x: 0.359375,\n y: 0.015625,\n },\n {\n x: 0.390625,\n y: 0.015625,\n },\n {\n x: 0.390625,\n y: 0.015625,\n },\n {\n x: 0.421875,\n y: 0.015625,\n },\n {\n x: 0.421875,\n y: 0.015625,\n },\n {\n x: 0.453125,\n y: 0.015625,\n },\n {\n x: 0.453125,\n y: 0.015625,\n },\n {\n x: 0.484375,\n y: 0.015625,\n },\n {\n x: 0.484375,\n y: 0.015625,\n },\n {\n x: 0.515625,\n y: 0.015625,\n },\n {\n x: 0.515625,\n y: 0.015625,\n },\n {\n x: 0.546875,\n y: 0.015625,\n },\n {\n x: 0.546875,\n y: 0.015625,\n },\n {\n x: 0.578125,\n y: 0.015625,\n },\n {\n x: 0.578125,\n y: 0.015625,\n },\n {\n x: 0.609375,\n y: 0.015625,\n },\n {\n x: 0.609375,\n y: 0.015625,\n },\n {\n x: 0.640625,\n y: 0.015625,\n },\n {\n x: 0.640625,\n y: 0.015625,\n },\n {\n x: 0.671875,\n y: 0.015625,\n },\n {\n x: 0.671875,\n y: 0.015625,\n },\n {\n x: 0.703125,\n y: 0.015625,\n },\n {\n x: 0.703125,\n y: 0.015625,\n },\n {\n x: 0.734375,\n y: 0.015625,\n },\n {\n x: 0.734375,\n y: 0.015625,\n },\n {\n x: 0.765625,\n y: 0.015625,\n },\n {\n x: 0.765625,\n y: 0.015625,\n },\n {\n x: 0.796875,\n y: 0.015625,\n },\n {\n x: 0.796875,\n y: 0.015625,\n },\n {\n x: 0.828125,\n y: 0.015625,\n },\n {\n x: 0.828125,\n y: 0.015625,\n },\n {\n x: 0.859375,\n y: 0.015625,\n },\n {\n x: 0.859375,\n y: 0.015625,\n },\n {\n x: 0.890625,\n y: 0.015625,\n },\n {\n x: 0.890625,\n y: 0.015625,\n },\n {\n x: 0.921875,\n y: 0.015625,\n },\n {\n x: 0.921875,\n y: 0.015625,\n },\n {\n x: 0.953125,\n y: 0.015625,\n },\n {\n x: 0.953125,\n y: 0.015625,\n },\n {\n x: 0.984375,\n y: 0.015625,\n },\n {\n x: 0.984375,\n y: 0.015625,\n },\n {\n x: 0.015625,\n y: 0.046875,\n },\n {\n x: 0.015625,\n y: 0.046875,\n },\n {\n x: 0.046875,\n y: 0.046875,\n },\n {\n x: 0.046875,\n y: 0.046875,\n },\n {\n x: 0.078125,\n y: 0.046875,\n },\n {\n x: 0.078125,\n y: 0.046875,\n },\n {\n x: 0.109375,\n y: 0.046875,\n },\n {\n x: 0.109375,\n y: 0.046875,\n },\n {\n x: 0.140625,\n y: 0.046875,\n },\n {\n x: 0.140625,\n y: 0.046875,\n },\n {\n x: 0.171875,\n y: 0.046875,\n },\n {\n x: 0.171875,\n y: 0.046875,\n },\n {\n x: 0.203125,\n y: 0.046875,\n },\n {\n x: 0.203125,\n y: 0.046875,\n },\n {\n x: 0.234375,\n y: 0.046875,\n },\n {\n x: 0.234375,\n y: 0.046875,\n },\n {\n x: 0.265625,\n y: 0.046875,\n },\n {\n x: 0.265625,\n y: 0.046875,\n },\n {\n x: 0.296875,\n y: 0.046875,\n },\n {\n x: 0.296875,\n y: 0.046875,\n },\n {\n x: 0.328125,\n y: 0.046875,\n },\n {\n x: 0.328125,\n y: 0.046875,\n },\n {\n x: 0.359375,\n y: 0.046875,\n },\n {\n x: 0.359375,\n y: 0.046875,\n },\n {\n x: 0.390625,\n y: 0.046875,\n },\n {\n x: 0.390625,\n y: 0.046875,\n },\n {\n x: 0.421875,\n y: 0.046875,\n },\n {\n x: 0.421875,\n y: 0.046875,\n },\n {\n x: 0.453125,\n y: 0.046875,\n },\n {\n x: 0.453125,\n y: 0.046875,\n },\n {\n x: 0.484375,\n y: 0.046875,\n },\n {\n x: 0.484375,\n y: 0.046875,\n },\n {\n x: 0.515625,\n y: 0.046875,\n },\n {\n x: 0.515625,\n y: 0.046875,\n },\n {\n x: 0.546875,\n y: 0.046875,\n },\n {\n x: 0.546875,\n y: 0.046875,\n },\n {\n x: 0.578125,\n y: 0.046875,\n },\n {\n x: 0.578125,\n y: 0.046875,\n },\n {\n x: 0.609375,\n y: 0.046875,\n },\n {\n x: 0.609375,\n y: 0.046875,\n },\n {\n x: 0.640625,\n y: 0.046875,\n },\n {\n x: 0.640625,\n y: 0.046875,\n },\n {\n x: 0.671875,\n y: 0.046875,\n },\n {\n x: 0.671875,\n y: 0.046875,\n },\n {\n x: 0.703125,\n y: 0.046875,\n },\n {\n x: 0.703125,\n y: 0.046875,\n },\n {\n x: 0.734375,\n y: 0.046875,\n },\n {\n x: 0.734375,\n y: 0.046875,\n },\n {\n x: 0.765625,\n y: 0.046875,\n },\n {\n x: 0.765625,\n y: 0.046875,\n },\n {\n x: 0.796875,\n y: 0.046875,\n },\n {\n x: 0.796875,\n y: 0.046875,\n },\n {\n x: 0.828125,\n y: 0.046875,\n },\n {\n x: 0.828125,\n y: 0.046875,\n },\n {\n x: 0.859375,\n y: 0.046875,\n },\n {\n x: 0.859375,\n y: 0.046875,\n },\n {\n x: 0.890625,\n y: 0.046875,\n },\n {\n x: 0.890625,\n y: 0.046875,\n },\n {\n x: 0.921875,\n y: 0.046875,\n },\n {\n x: 0.921875,\n y: 0.046875,\n },\n {\n x: 0.953125,\n y: 0.046875,\n },\n {\n x: 0.953125,\n y: 0.046875,\n },\n {\n x: 0.984375,\n y: 0.046875,\n },\n {\n x: 0.984375,\n y: 0.046875,\n },\n {\n x: 0.015625,\n y: 0.078125,\n },\n {\n x: 0.015625,\n y: 0.078125,\n },\n {\n x: 0.046875,\n y: 0.078125,\n },\n {\n x: 0.046875,\n y: 0.078125,\n },\n {\n x: 0.078125,\n y: 0.078125,\n },\n {\n x: 0.078125,\n y: 0.078125,\n },\n {\n x: 0.109375,\n y: 0.078125,\n },\n {\n x: 0.109375,\n y: 0.078125,\n },\n {\n x: 0.140625,\n y: 0.078125,\n },\n {\n x: 0.140625,\n y: 0.078125,\n },\n {\n x: 0.171875,\n y: 0.078125,\n },\n {\n x: 0.171875,\n y: 0.078125,\n },\n {\n x: 0.203125,\n y: 0.078125,\n },\n {\n x: 0.203125,\n y: 0.078125,\n },\n {\n x: 0.234375,\n y: 0.078125,\n },\n {\n x: 0.234375,\n y: 0.078125,\n },\n {\n x: 0.265625,\n y: 0.078125,\n },\n {\n x: 0.265625,\n y: 0.078125,\n },\n {\n x: 0.296875,\n y: 0.078125,\n },\n {\n x: 0.296875,\n y: 0.078125,\n },\n {\n x: 0.328125,\n y: 0.078125,\n },\n {\n x: 0.328125,\n y: 0.078125,\n },\n {\n x: 0.359375,\n y: 0.078125,\n },\n {\n x: 0.359375,\n y: 0.078125,\n },\n {\n x: 0.390625,\n y: 0.078125,\n },\n {\n x: 0.390625,\n y: 0.078125,\n },\n {\n x: 0.421875,\n y: 0.078125,\n },\n {\n x: 0.421875,\n y: 0.078125,\n },\n {\n x: 0.453125,\n y: 0.078125,\n },\n {\n x: 0.453125,\n y: 0.078125,\n },\n {\n x: 0.484375,\n y: 0.078125,\n },\n {\n x: 0.484375,\n y: 0.078125,\n },\n {\n x: 0.515625,\n y: 0.078125,\n },\n {\n x: 0.515625,\n y: 0.078125,\n },\n {\n x: 0.546875,\n y: 0.078125,\n },\n {\n x: 0.546875,\n y: 0.078125,\n },\n {\n x: 0.578125,\n y: 0.078125,\n },\n {\n x: 0.578125,\n y: 0.078125,\n },\n {\n x: 0.609375,\n y: 0.078125,\n },\n {\n x: 0.609375,\n y: 0.078125,\n },\n {\n x: 0.640625,\n y: 0.078125,\n },\n {\n x: 0.640625,\n y: 0.078125,\n },\n {\n x: 0.671875,\n y: 0.078125,\n },\n {\n x: 0.671875,\n y: 0.078125,\n },\n {\n x: 0.703125,\n y: 0.078125,\n },\n {\n x: 0.703125,\n y: 0.078125,\n },\n {\n x: 0.734375,\n y: 0.078125,\n },\n {\n x: 0.734375,\n y: 0.078125,\n },\n {\n x: 0.765625,\n y: 0.078125,\n },\n {\n x: 0.765625,\n y: 0.078125,\n },\n {\n x: 0.796875,\n y: 0.078125,\n },\n {\n x: 0.796875,\n y: 0.078125,\n },\n {\n x: 0.828125,\n y: 0.078125,\n },\n {\n x: 0.828125,\n y: 0.078125,\n },\n {\n x: 0.859375,\n y: 0.078125,\n },\n {\n x: 0.859375,\n y: 0.078125,\n },\n {\n x: 0.890625,\n y: 0.078125,\n },\n {\n x: 0.890625,\n y: 0.078125,\n },\n {\n x: 0.921875,\n y: 0.078125,\n },\n {\n x: 0.921875,\n y: 0.078125,\n },\n {\n x: 0.953125,\n y: 0.078125,\n },\n {\n x: 0.953125,\n y: 0.078125,\n },\n {\n x: 0.984375,\n y: 0.078125,\n },\n {\n x: 0.984375,\n y: 0.078125,\n },\n {\n x: 0.015625,\n y: 0.109375,\n },\n {\n x: 0.015625,\n y: 0.109375,\n },\n {\n x: 0.046875,\n y: 0.109375,\n },\n {\n x: 0.046875,\n y: 0.109375,\n },\n {\n x: 0.078125,\n y: 0.109375,\n },\n {\n x: 0.078125,\n y: 0.109375,\n },\n {\n x: 0.109375,\n y: 0.109375,\n },\n {\n x: 0.109375,\n y: 0.109375,\n },\n {\n x: 0.140625,\n y: 0.109375,\n },\n {\n x: 0.140625,\n y: 0.109375,\n },\n {\n x: 0.171875,\n y: 0.109375,\n },\n {\n x: 0.171875,\n y: 0.109375,\n },\n {\n x: 0.203125,\n y: 0.109375,\n },\n {\n x: 0.203125,\n y: 0.109375,\n },\n {\n x: 0.234375,\n y: 0.109375,\n },\n {\n x: 0.234375,\n y: 0.109375,\n },\n {\n x: 0.265625,\n y: 0.109375,\n },\n {\n x: 0.265625,\n y: 0.109375,\n },\n {\n x: 0.296875,\n y: 0.109375,\n },\n {\n x: 0.296875,\n y: 0.109375,\n },\n {\n x: 0.328125,\n y: 0.109375,\n },\n {\n x: 0.328125,\n y: 0.109375,\n },\n {\n x: 0.359375,\n y: 0.109375,\n },\n {\n x: 0.359375,\n y: 0.109375,\n },\n {\n x: 0.390625,\n y: 0.109375,\n },\n {\n x: 0.390625,\n y: 0.109375,\n },\n {\n x: 0.421875,\n y: 0.109375,\n },\n {\n x: 0.421875,\n y: 0.109375,\n },\n {\n x: 0.453125,\n y: 0.109375,\n },\n {\n x: 0.453125,\n y: 0.109375,\n },\n {\n x: 0.484375,\n y: 0.109375,\n },\n {\n x: 0.484375,\n y: 0.109375,\n },\n {\n x: 0.515625,\n y: 0.109375,\n },\n {\n x: 0.515625,\n y: 0.109375,\n },\n {\n x: 0.546875,\n y: 0.109375,\n },\n {\n x: 0.546875,\n y: 0.109375,\n },\n {\n x: 0.578125,\n y: 0.109375,\n },\n {\n x: 0.578125,\n y: 0.109375,\n },\n {\n x: 0.609375,\n y: 0.109375,\n },\n {\n x: 0.609375,\n y: 0.109375,\n },\n {\n x: 0.640625,\n y: 0.109375,\n },\n {\n x: 0.640625,\n y: 0.109375,\n },\n {\n x: 0.671875,\n y: 0.109375,\n },\n {\n x: 0.671875,\n y: 0.109375,\n },\n {\n x: 0.703125,\n y: 0.109375,\n },\n {\n x: 0.703125,\n y: 0.109375,\n },\n {\n x: 0.734375,\n y: 0.109375,\n },\n {\n x: 0.734375,\n y: 0.109375,\n },\n {\n x: 0.765625,\n y: 0.109375,\n },\n {\n x: 0.765625,\n y: 0.109375,\n },\n {\n x: 0.796875,\n y: 0.109375,\n },\n {\n x: 0.796875,\n y: 0.109375,\n },\n {\n x: 0.828125,\n y: 0.109375,\n },\n {\n x: 0.828125,\n y: 0.109375,\n },\n {\n x: 0.859375,\n y: 0.109375,\n },\n {\n x: 0.859375,\n y: 0.109375,\n },\n {\n x: 0.890625,\n y: 0.109375,\n },\n {\n x: 0.890625,\n y: 0.109375,\n },\n {\n x: 0.921875,\n y: 0.109375,\n },\n {\n x: 0.921875,\n y: 0.109375,\n },\n {\n x: 0.953125,\n y: 0.109375,\n },\n {\n x: 0.953125,\n y: 0.109375,\n },\n {\n x: 0.984375,\n y: 0.109375,\n },\n {\n x: 0.984375,\n y: 0.109375,\n },\n {\n x: 0.015625,\n y: 0.140625,\n },\n {\n x: 0.015625,\n y: 0.140625,\n },\n {\n x: 0.046875,\n y: 0.140625,\n },\n {\n x: 0.046875,\n y: 0.140625,\n },\n {\n x: 0.078125,\n y: 0.140625,\n },\n {\n x: 0.078125,\n y: 0.140625,\n },\n {\n x: 0.109375,\n y: 0.140625,\n },\n {\n x: 0.109375,\n y: 0.140625,\n },\n {\n x: 0.140625,\n y: 0.140625,\n },\n {\n x: 0.140625,\n y: 0.140625,\n },\n {\n x: 0.171875,\n y: 0.140625,\n },\n {\n x: 0.171875,\n y: 0.140625,\n },\n {\n x: 0.203125,\n y: 0.140625,\n },\n {\n x: 0.203125,\n y: 0.140625,\n },\n {\n x: 0.234375,\n y: 0.140625,\n },\n {\n x: 0.234375,\n y: 0.140625,\n },\n {\n x: 0.265625,\n y: 0.140625,\n },\n {\n x: 0.265625,\n y: 0.140625,\n },\n {\n x: 0.296875,\n y: 0.140625,\n },\n {\n x: 0.296875,\n y: 0.140625,\n },\n {\n x: 0.328125,\n y: 0.140625,\n },\n {\n x: 0.328125,\n y: 0.140625,\n },\n {\n x: 0.359375,\n y: 0.140625,\n },\n {\n x: 0.359375,\n y: 0.140625,\n },\n {\n x: 0.390625,\n y: 0.140625,\n },\n {\n x: 0.390625,\n y: 0.140625,\n },\n {\n x: 0.421875,\n y: 0.140625,\n },\n {\n x: 0.421875,\n y: 0.140625,\n },\n {\n x: 0.453125,\n y: 0.140625,\n },\n {\n x: 0.453125,\n y: 0.140625,\n },\n {\n x: 0.484375,\n y: 0.140625,\n },\n {\n x: 0.484375,\n y: 0.140625,\n },\n {\n x: 0.515625,\n y: 0.140625,\n },\n {\n x: 0.515625,\n y: 0.140625,\n },\n {\n x: 0.546875,\n y: 0.140625,\n },\n {\n x: 0.546875,\n y: 0.140625,\n },\n {\n x: 0.578125,\n y: 0.140625,\n },\n {\n x: 0.578125,\n y: 0.140625,\n },\n {\n x: 0.609375,\n y: 0.140625,\n },\n {\n x: 0.609375,\n y: 0.140625,\n },\n {\n x: 0.640625,\n y: 0.140625,\n },\n {\n x: 0.640625,\n y: 0.140625,\n },\n {\n x: 0.671875,\n y: 0.140625,\n },\n {\n x: 0.671875,\n y: 0.140625,\n },\n {\n x: 0.703125,\n y: 0.140625,\n },\n {\n x: 0.703125,\n y: 0.140625,\n },\n {\n x: 0.734375,\n y: 0.140625,\n },\n {\n x: 0.734375,\n y: 0.140625,\n },\n {\n x: 0.765625,\n y: 0.140625,\n },\n {\n x: 0.765625,\n y: 0.140625,\n },\n {\n x: 0.796875,\n y: 0.140625,\n },\n {\n x: 0.796875,\n y: 0.140625,\n },\n {\n x: 0.828125,\n y: 0.140625,\n },\n {\n x: 0.828125,\n y: 0.140625,\n },\n {\n x: 0.859375,\n y: 0.140625,\n },\n {\n x: 0.859375,\n y: 0.140625,\n },\n {\n x: 0.890625,\n y: 0.140625,\n },\n {\n x: 0.890625,\n y: 0.140625,\n },\n {\n x: 0.921875,\n y: 0.140625,\n },\n {\n x: 0.921875,\n y: 0.140625,\n },\n {\n x: 0.953125,\n y: 0.140625,\n },\n {\n x: 0.953125,\n y: 0.140625,\n },\n {\n x: 0.984375,\n y: 0.140625,\n },\n {\n x: 0.984375,\n y: 0.140625,\n },\n {\n x: 0.015625,\n y: 0.171875,\n },\n {\n x: 0.015625,\n y: 0.171875,\n },\n {\n x: 0.046875,\n y: 0.171875,\n },\n {\n x: 0.046875,\n y: 0.171875,\n },\n {\n x: 0.078125,\n y: 0.171875,\n },\n {\n x: 0.078125,\n y: 0.171875,\n },\n {\n x: 0.109375,\n y: 0.171875,\n },\n {\n x: 0.109375,\n y: 0.171875,\n },\n {\n x: 0.140625,\n y: 0.171875,\n },\n {\n x: 0.140625,\n y: 0.171875,\n },\n {\n x: 0.171875,\n y: 0.171875,\n },\n {\n x: 0.171875,\n y: 0.171875,\n },\n {\n x: 0.203125,\n y: 0.171875,\n },\n {\n x: 0.203125,\n y: 0.171875,\n },\n {\n x: 0.234375,\n y: 0.171875,\n },\n {\n x: 0.234375,\n y: 0.171875,\n },\n {\n x: 0.265625,\n y: 0.171875,\n },\n {\n x: 0.265625,\n y: 0.171875,\n },\n {\n x: 0.296875,\n y: 0.171875,\n },\n {\n x: 0.296875,\n y: 0.171875,\n },\n {\n x: 0.328125,\n y: 0.171875,\n },\n {\n x: 0.328125,\n y: 0.171875,\n },\n {\n x: 0.359375,\n y: 0.171875,\n },\n {\n x: 0.359375,\n y: 0.171875,\n },\n {\n x: 0.390625,\n y: 0.171875,\n },\n {\n x: 0.390625,\n y: 0.171875,\n },\n {\n x: 0.421875,\n y: 0.171875,\n },\n {\n x: 0.421875,\n y: 0.171875,\n },\n {\n x: 0.453125,\n y: 0.171875,\n },\n {\n x: 0.453125,\n y: 0.171875,\n },\n {\n x: 0.484375,\n y: 0.171875,\n },\n {\n x: 0.484375,\n y: 0.171875,\n },\n {\n x: 0.515625,\n y: 0.171875,\n },\n {\n x: 0.515625,\n y: 0.171875,\n },\n {\n x: 0.546875,\n y: 0.171875,\n },\n {\n x: 0.546875,\n y: 0.171875,\n },\n {\n x: 0.578125,\n y: 0.171875,\n },\n {\n x: 0.578125,\n y: 0.171875,\n },\n {\n x: 0.609375,\n y: 0.171875,\n },\n {\n x: 0.609375,\n y: 0.171875,\n },\n {\n x: 0.640625,\n y: 0.171875,\n },\n {\n x: 0.640625,\n y: 0.171875,\n },\n {\n x: 0.671875,\n y: 0.171875,\n },\n {\n x: 0.671875,\n y: 0.171875,\n },\n {\n x: 0.703125,\n y: 0.171875,\n },\n {\n x: 0.703125,\n y: 0.171875,\n },\n {\n x: 0.734375,\n y: 0.171875,\n },\n {\n x: 0.734375,\n y: 0.171875,\n },\n {\n x: 0.765625,\n y: 0.171875,\n },\n {\n x: 0.765625,\n y: 0.171875,\n },\n {\n x: 0.796875,\n y: 0.171875,\n },\n {\n x: 0.796875,\n y: 0.171875,\n },\n {\n x: 0.828125,\n y: 0.171875,\n },\n {\n x: 0.828125,\n y: 0.171875,\n },\n {\n x: 0.859375,\n y: 0.171875,\n },\n {\n x: 0.859375,\n y: 0.171875,\n },\n {\n x: 0.890625,\n y: 0.171875,\n },\n {\n x: 0.890625,\n y: 0.171875,\n },\n {\n x: 0.921875,\n y: 0.171875,\n },\n {\n x: 0.921875,\n y: 0.171875,\n },\n {\n x: 0.953125,\n y: 0.171875,\n },\n {\n x: 0.953125,\n y: 0.171875,\n },\n {\n x: 0.984375,\n y: 0.171875,\n },\n {\n x: 0.984375,\n y: 0.171875,\n },\n {\n x: 0.015625,\n y: 0.203125,\n },\n {\n x: 0.015625,\n y: 0.203125,\n },\n {\n x: 0.046875,\n y: 0.203125,\n },\n {\n x: 0.046875,\n y: 0.203125,\n },\n {\n x: 0.078125,\n y: 0.203125,\n },\n {\n x: 0.078125,\n y: 0.203125,\n },\n {\n x: 0.109375,\n y: 0.203125,\n },\n {\n x: 0.109375,\n y: 0.203125,\n },\n {\n x: 0.140625,\n y: 0.203125,\n },\n {\n x: 0.140625,\n y: 0.203125,\n },\n {\n x: 0.171875,\n y: 0.203125,\n },\n {\n x: 0.171875,\n y: 0.203125,\n },\n {\n x: 0.203125,\n y: 0.203125,\n },\n {\n x: 0.203125,\n y: 0.203125,\n },\n {\n x: 0.234375,\n y: 0.203125,\n },\n {\n x: 0.234375,\n y: 0.203125,\n },\n {\n x: 0.265625,\n y: 0.203125,\n },\n {\n x: 0.265625,\n y: 0.203125,\n },\n {\n x: 0.296875,\n y: 0.203125,\n },\n {\n x: 0.296875,\n y: 0.203125,\n },\n {\n x: 0.328125,\n y: 0.203125,\n },\n {\n x: 0.328125,\n y: 0.203125,\n },\n {\n x: 0.359375,\n y: 0.203125,\n },\n {\n x: 0.359375,\n y: 0.203125,\n },\n {\n x: 0.390625,\n y: 0.203125,\n },\n {\n x: 0.390625,\n y: 0.203125,\n },\n {\n x: 0.421875,\n y: 0.203125,\n },\n {\n x: 0.421875,\n y: 0.203125,\n },\n {\n x: 0.453125,\n y: 0.203125,\n },\n {\n x: 0.453125,\n y: 0.203125,\n },\n {\n x: 0.484375,\n y: 0.203125,\n },\n {\n x: 0.484375,\n y: 0.203125,\n },\n {\n x: 0.515625,\n y: 0.203125,\n },\n {\n x: 0.515625,\n y: 0.203125,\n },\n {\n x: 0.546875,\n y: 0.203125,\n },\n {\n x: 0.546875,\n y: 0.203125,\n },\n {\n x: 0.578125,\n y: 0.203125,\n },\n {\n x: 0.578125,\n y: 0.203125,\n },\n {\n x: 0.609375,\n y: 0.203125,\n },\n {\n x: 0.609375,\n y: 0.203125,\n },\n {\n x: 0.640625,\n y: 0.203125,\n },\n {\n x: 0.640625,\n y: 0.203125,\n },\n {\n x: 0.671875,\n y: 0.203125,\n },\n {\n x: 0.671875,\n y: 0.203125,\n },\n {\n x: 0.703125,\n y: 0.203125,\n },\n {\n x: 0.703125,\n y: 0.203125,\n },\n {\n x: 0.734375,\n y: 0.203125,\n },\n {\n x: 0.734375,\n y: 0.203125,\n },\n {\n x: 0.765625,\n y: 0.203125,\n },\n {\n x: 0.765625,\n y: 0.203125,\n },\n {\n x: 0.796875,\n y: 0.203125,\n },\n {\n x: 0.796875,\n y: 0.203125,\n },\n {\n x: 0.828125,\n y: 0.203125,\n },\n {\n x: 0.828125,\n y: 0.203125,\n },\n {\n x: 0.859375,\n y: 0.203125,\n },\n {\n x: 0.859375,\n y: 0.203125,\n },\n {\n x: 0.890625,\n y: 0.203125,\n },\n {\n x: 0.890625,\n y: 0.203125,\n },\n {\n x: 0.921875,\n y: 0.203125,\n },\n {\n x: 0.921875,\n y: 0.203125,\n },\n {\n x: 0.953125,\n y: 0.203125,\n },\n {\n x: 0.953125,\n y: 0.203125,\n },\n {\n x: 0.984375,\n y: 0.203125,\n },\n {\n x: 0.984375,\n y: 0.203125,\n },\n {\n x: 0.015625,\n y: 0.234375,\n },\n {\n x: 0.015625,\n y: 0.234375,\n },\n {\n x: 0.046875,\n y: 0.234375,\n },\n {\n x: 0.046875,\n y: 0.234375,\n },\n {\n x: 0.078125,\n y: 0.234375,\n },\n {\n x: 0.078125,\n y: 0.234375,\n },\n {\n x: 0.109375,\n y: 0.234375,\n },\n {\n x: 0.109375,\n y: 0.234375,\n },\n {\n x: 0.140625,\n y: 0.234375,\n },\n {\n x: 0.140625,\n y: 0.234375,\n },\n {\n x: 0.171875,\n y: 0.234375,\n },\n {\n x: 0.171875,\n y: 0.234375,\n },\n {\n x: 0.203125,\n y: 0.234375,\n },\n {\n x: 0.203125,\n y: 0.234375,\n },\n {\n x: 0.234375,\n y: 0.234375,\n },\n {\n x: 0.234375,\n y: 0.234375,\n },\n {\n x: 0.265625,\n y: 0.234375,\n },\n {\n x: 0.265625,\n y: 0.234375,\n },\n {\n x: 0.296875,\n y: 0.234375,\n },\n {\n x: 0.296875,\n y: 0.234375,\n },\n {\n x: 0.328125,\n y: 0.234375,\n },\n {\n x: 0.328125,\n y: 0.234375,\n },\n {\n x: 0.359375,\n y: 0.234375,\n },\n {\n x: 0.359375,\n y: 0.234375,\n },\n {\n x: 0.390625,\n y: 0.234375,\n },\n {\n x: 0.390625,\n y: 0.234375,\n },\n {\n x: 0.421875,\n y: 0.234375,\n },\n {\n x: 0.421875,\n y: 0.234375,\n },\n {\n x: 0.453125,\n y: 0.234375,\n },\n {\n x: 0.453125,\n y: 0.234375,\n },\n {\n x: 0.484375,\n y: 0.234375,\n },\n {\n x: 0.484375,\n y: 0.234375,\n },\n {\n x: 0.515625,\n y: 0.234375,\n },\n {\n x: 0.515625,\n y: 0.234375,\n },\n {\n x: 0.546875,\n y: 0.234375,\n },\n {\n x: 0.546875,\n y: 0.234375,\n },\n {\n x: 0.578125,\n y: 0.234375,\n },\n {\n x: 0.578125,\n y: 0.234375,\n },\n {\n x: 0.609375,\n y: 0.234375,\n },\n {\n x: 0.609375,\n y: 0.234375,\n },\n {\n x: 0.640625,\n y: 0.234375,\n },\n {\n x: 0.640625,\n y: 0.234375,\n },\n {\n x: 0.671875,\n y: 0.234375,\n },\n {\n x: 0.671875,\n y: 0.234375,\n },\n {\n x: 0.703125,\n y: 0.234375,\n },\n {\n x: 0.703125,\n y: 0.234375,\n },\n {\n x: 0.734375,\n y: 0.234375,\n },\n {\n x: 0.734375,\n y: 0.234375,\n },\n {\n x: 0.765625,\n y: 0.234375,\n },\n {\n x: 0.765625,\n y: 0.234375,\n },\n {\n x: 0.796875,\n y: 0.234375,\n },\n {\n x: 0.796875,\n y: 0.234375,\n },\n {\n x: 0.828125,\n y: 0.234375,\n },\n {\n x: 0.828125,\n y: 0.234375,\n },\n {\n x: 0.859375,\n y: 0.234375,\n },\n {\n x: 0.859375,\n y: 0.234375,\n },\n {\n x: 0.890625,\n y: 0.234375,\n },\n {\n x: 0.890625,\n y: 0.234375,\n },\n {\n x: 0.921875,\n y: 0.234375,\n },\n {\n x: 0.921875,\n y: 0.234375,\n },\n {\n x: 0.953125,\n y: 0.234375,\n },\n {\n x: 0.953125,\n y: 0.234375,\n },\n {\n x: 0.984375,\n y: 0.234375,\n },\n {\n x: 0.984375,\n y: 0.234375,\n },\n {\n x: 0.015625,\n y: 0.265625,\n },\n {\n x: 0.015625,\n y: 0.265625,\n },\n {\n x: 0.046875,\n y: 0.265625,\n },\n {\n x: 0.046875,\n y: 0.265625,\n },\n {\n x: 0.078125,\n y: 0.265625,\n },\n {\n x: 0.078125,\n y: 0.265625,\n },\n {\n x: 0.109375,\n y: 0.265625,\n },\n {\n x: 0.109375,\n y: 0.265625,\n },\n {\n x: 0.140625,\n y: 0.265625,\n },\n {\n x: 0.140625,\n y: 0.265625,\n },\n {\n x: 0.171875,\n y: 0.265625,\n },\n {\n x: 0.171875,\n y: 0.265625,\n },\n {\n x: 0.203125,\n y: 0.265625,\n },\n {\n x: 0.203125,\n y: 0.265625,\n },\n {\n x: 0.234375,\n y: 0.265625,\n },\n {\n x: 0.234375,\n y: 0.265625,\n },\n {\n x: 0.265625,\n y: 0.265625,\n },\n {\n x: 0.265625,\n y: 0.265625,\n },\n {\n x: 0.296875,\n y: 0.265625,\n },\n {\n x: 0.296875,\n y: 0.265625,\n },\n {\n x: 0.328125,\n y: 0.265625,\n },\n {\n x: 0.328125,\n y: 0.265625,\n },\n {\n x: 0.359375,\n y: 0.265625,\n },\n {\n x: 0.359375,\n y: 0.265625,\n },\n {\n x: 0.390625,\n y: 0.265625,\n },\n {\n x: 0.390625,\n y: 0.265625,\n },\n {\n x: 0.421875,\n y: 0.265625,\n },\n {\n x: 0.421875,\n y: 0.265625,\n },\n {\n x: 0.453125,\n y: 0.265625,\n },\n {\n x: 0.453125,\n y: 0.265625,\n },\n {\n x: 0.484375,\n y: 0.265625,\n },\n {\n x: 0.484375,\n y: 0.265625,\n },\n {\n x: 0.515625,\n y: 0.265625,\n },\n {\n x: 0.515625,\n y: 0.265625,\n },\n {\n x: 0.546875,\n y: 0.265625,\n },\n {\n x: 0.546875,\n y: 0.265625,\n },\n {\n x: 0.578125,\n y: 0.265625,\n },\n {\n x: 0.578125,\n y: 0.265625,\n },\n {\n x: 0.609375,\n y: 0.265625,\n },\n {\n x: 0.609375,\n y: 0.265625,\n },\n {\n x: 0.640625,\n y: 0.265625,\n },\n {\n x: 0.640625,\n y: 0.265625,\n },\n {\n x: 0.671875,\n y: 0.265625,\n },\n {\n x: 0.671875,\n y: 0.265625,\n },\n {\n x: 0.703125,\n y: 0.265625,\n },\n {\n x: 0.703125,\n y: 0.265625,\n },\n {\n x: 0.734375,\n y: 0.265625,\n },\n {\n x: 0.734375,\n y: 0.265625,\n },\n {\n x: 0.765625,\n y: 0.265625,\n },\n {\n x: 0.765625,\n y: 0.265625,\n },\n {\n x: 0.796875,\n y: 0.265625,\n },\n {\n x: 0.796875,\n y: 0.265625,\n },\n {\n x: 0.828125,\n y: 0.265625,\n },\n {\n x: 0.828125,\n y: 0.265625,\n },\n {\n x: 0.859375,\n y: 0.265625,\n },\n {\n x: 0.859375,\n y: 0.265625,\n },\n {\n x: 0.890625,\n y: 0.265625,\n },\n {\n x: 0.890625,\n y: 0.265625,\n },\n {\n x: 0.921875,\n y: 0.265625,\n },\n {\n x: 0.921875,\n y: 0.265625,\n },\n {\n x: 0.953125,\n y: 0.265625,\n },\n {\n x: 0.953125,\n y: 0.265625,\n },\n {\n x: 0.984375,\n y: 0.265625,\n },\n {\n x: 0.984375,\n y: 0.265625,\n },\n {\n x: 0.015625,\n y: 0.296875,\n },\n {\n x: 0.015625,\n y: 0.296875,\n },\n {\n x: 0.046875,\n y: 0.296875,\n },\n {\n x: 0.046875,\n y: 0.296875,\n },\n {\n x: 0.078125,\n y: 0.296875,\n },\n {\n x: 0.078125,\n y: 0.296875,\n },\n {\n x: 0.109375,\n y: 0.296875,\n },\n {\n x: 0.109375,\n y: 0.296875,\n },\n {\n x: 0.140625,\n y: 0.296875,\n },\n {\n x: 0.140625,\n y: 0.296875,\n },\n {\n x: 0.171875,\n y: 0.296875,\n },\n {\n x: 0.171875,\n y: 0.296875,\n },\n {\n x: 0.203125,\n y: 0.296875,\n },\n {\n x: 0.203125,\n y: 0.296875,\n },\n {\n x: 0.234375,\n y: 0.296875,\n },\n {\n x: 0.234375,\n y: 0.296875,\n },\n {\n x: 0.265625,\n y: 0.296875,\n },\n {\n x: 0.265625,\n y: 0.296875,\n },\n {\n x: 0.296875,\n y: 0.296875,\n },\n {\n x: 0.296875,\n y: 0.296875,\n },\n {\n x: 0.328125,\n y: 0.296875,\n },\n {\n x: 0.328125,\n y: 0.296875,\n },\n {\n x: 0.359375,\n y: 0.296875,\n },\n {\n x: 0.359375,\n y: 0.296875,\n },\n {\n x: 0.390625,\n y: 0.296875,\n },\n {\n x: 0.390625,\n y: 0.296875,\n },\n {\n x: 0.421875,\n y: 0.296875,\n },\n {\n x: 0.421875,\n y: 0.296875,\n },\n {\n x: 0.453125,\n y: 0.296875,\n },\n {\n x: 0.453125,\n y: 0.296875,\n },\n {\n x: 0.484375,\n y: 0.296875,\n },\n {\n x: 0.484375,\n y: 0.296875,\n },\n {\n x: 0.515625,\n y: 0.296875,\n },\n {\n x: 0.515625,\n y: 0.296875,\n },\n {\n x: 0.546875,\n y: 0.296875,\n },\n {\n x: 0.546875,\n y: 0.296875,\n },\n {\n x: 0.578125,\n y: 0.296875,\n },\n {\n x: 0.578125,\n y: 0.296875,\n },\n {\n x: 0.609375,\n y: 0.296875,\n },\n {\n x: 0.609375,\n y: 0.296875,\n },\n {\n x: 0.640625,\n y: 0.296875,\n },\n {\n x: 0.640625,\n y: 0.296875,\n },\n {\n x: 0.671875,\n y: 0.296875,\n },\n {\n x: 0.671875,\n y: 0.296875,\n },\n {\n x: 0.703125,\n y: 0.296875,\n },\n {\n x: 0.703125,\n y: 0.296875,\n },\n {\n x: 0.734375,\n y: 0.296875,\n },\n {\n x: 0.734375,\n y: 0.296875,\n },\n {\n x: 0.765625,\n y: 0.296875,\n },\n {\n x: 0.765625,\n y: 0.296875,\n },\n {\n x: 0.796875,\n y: 0.296875,\n },\n {\n x: 0.796875,\n y: 0.296875,\n },\n {\n x: 0.828125,\n y: 0.296875,\n },\n {\n x: 0.828125,\n y: 0.296875,\n },\n {\n x: 0.859375,\n y: 0.296875,\n },\n {\n x: 0.859375,\n y: 0.296875,\n },\n {\n x: 0.890625,\n y: 0.296875,\n },\n {\n x: 0.890625,\n y: 0.296875,\n },\n {\n x: 0.921875,\n y: 0.296875,\n },\n {\n x: 0.921875,\n y: 0.296875,\n },\n {\n x: 0.953125,\n y: 0.296875,\n },\n {\n x: 0.953125,\n y: 0.296875,\n },\n {\n x: 0.984375,\n y: 0.296875,\n },\n {\n x: 0.984375,\n y: 0.296875,\n },\n {\n x: 0.015625,\n y: 0.328125,\n },\n {\n x: 0.015625,\n y: 0.328125,\n },\n {\n x: 0.046875,\n y: 0.328125,\n },\n {\n x: 0.046875,\n y: 0.328125,\n },\n {\n x: 0.078125,\n y: 0.328125,\n },\n {\n x: 0.078125,\n y: 0.328125,\n },\n {\n x: 0.109375,\n y: 0.328125,\n },\n {\n x: 0.109375,\n y: 0.328125,\n },\n {\n x: 0.140625,\n y: 0.328125,\n },\n {\n x: 0.140625,\n y: 0.328125,\n },\n {\n x: 0.171875,\n y: 0.328125,\n },\n {\n x: 0.171875,\n y: 0.328125,\n },\n {\n x: 0.203125,\n y: 0.328125,\n },\n {\n x: 0.203125,\n y: 0.328125,\n },\n {\n x: 0.234375,\n y: 0.328125,\n },\n {\n x: 0.234375,\n y: 0.328125,\n },\n {\n x: 0.265625,\n y: 0.328125,\n },\n {\n x: 0.265625,\n y: 0.328125,\n },\n {\n x: 0.296875,\n y: 0.328125,\n },\n {\n x: 0.296875,\n y: 0.328125,\n },\n {\n x: 0.328125,\n y: 0.328125,\n },\n {\n x: 0.328125,\n y: 0.328125,\n },\n {\n x: 0.359375,\n y: 0.328125,\n },\n {\n x: 0.359375,\n y: 0.328125,\n },\n {\n x: 0.390625,\n y: 0.328125,\n },\n {\n x: 0.390625,\n y: 0.328125,\n },\n {\n x: 0.421875,\n y: 0.328125,\n },\n {\n x: 0.421875,\n y: 0.328125,\n },\n {\n x: 0.453125,\n y: 0.328125,\n },\n {\n x: 0.453125,\n y: 0.328125,\n },\n {\n x: 0.484375,\n y: 0.328125,\n },\n {\n x: 0.484375,\n y: 0.328125,\n },\n {\n x: 0.515625,\n y: 0.328125,\n },\n {\n x: 0.515625,\n y: 0.328125,\n },\n {\n x: 0.546875,\n y: 0.328125,\n },\n {\n x: 0.546875,\n y: 0.328125,\n },\n {\n x: 0.578125,\n y: 0.328125,\n },\n {\n x: 0.578125,\n y: 0.328125,\n },\n {\n x: 0.609375,\n y: 0.328125,\n },\n {\n x: 0.609375,\n y: 0.328125,\n },\n {\n x: 0.640625,\n y: 0.328125,\n },\n {\n x: 0.640625,\n y: 0.328125,\n },\n {\n x: 0.671875,\n y: 0.328125,\n },\n {\n x: 0.671875,\n y: 0.328125,\n },\n {\n x: 0.703125,\n y: 0.328125,\n },\n {\n x: 0.703125,\n y: 0.328125,\n },\n {\n x: 0.734375,\n y: 0.328125,\n },\n {\n x: 0.734375,\n y: 0.328125,\n },\n {\n x: 0.765625,\n y: 0.328125,\n },\n {\n x: 0.765625,\n y: 0.328125,\n },\n {\n x: 0.796875,\n y: 0.328125,\n },\n {\n x: 0.796875,\n y: 0.328125,\n },\n {\n x: 0.828125,\n y: 0.328125,\n },\n {\n x: 0.828125,\n y: 0.328125,\n },\n {\n x: 0.859375,\n y: 0.328125,\n },\n {\n x: 0.859375,\n y: 0.328125,\n },\n {\n x: 0.890625,\n y: 0.328125,\n },\n {\n x: 0.890625,\n y: 0.328125,\n },\n {\n x: 0.921875,\n y: 0.328125,\n },\n {\n x: 0.921875,\n y: 0.328125,\n },\n {\n x: 0.953125,\n y: 0.328125,\n },\n {\n x: 0.953125,\n y: 0.328125,\n },\n {\n x: 0.984375,\n y: 0.328125,\n },\n {\n x: 0.984375,\n y: 0.328125,\n },\n {\n x: 0.015625,\n y: 0.359375,\n },\n {\n x: 0.015625,\n y: 0.359375,\n },\n {\n x: 0.046875,\n y: 0.359375,\n },\n {\n x: 0.046875,\n y: 0.359375,\n },\n {\n x: 0.078125,\n y: 0.359375,\n },\n {\n x: 0.078125,\n y: 0.359375,\n },\n {\n x: 0.109375,\n y: 0.359375,\n },\n {\n x: 0.109375,\n y: 0.359375,\n },\n {\n x: 0.140625,\n y: 0.359375,\n },\n {\n x: 0.140625,\n y: 0.359375,\n },\n {\n x: 0.171875,\n y: 0.359375,\n },\n {\n x: 0.171875,\n y: 0.359375,\n },\n {\n x: 0.203125,\n y: 0.359375,\n },\n {\n x: 0.203125,\n y: 0.359375,\n },\n {\n x: 0.234375,\n y: 0.359375,\n },\n {\n x: 0.234375,\n y: 0.359375,\n },\n {\n x: 0.265625,\n y: 0.359375,\n },\n {\n x: 0.265625,\n y: 0.359375,\n },\n {\n x: 0.296875,\n y: 0.359375,\n },\n {\n x: 0.296875,\n y: 0.359375,\n },\n {\n x: 0.328125,\n y: 0.359375,\n },\n {\n x: 0.328125,\n y: 0.359375,\n },\n {\n x: 0.359375,\n y: 0.359375,\n },\n {\n x: 0.359375,\n y: 0.359375,\n },\n {\n x: 0.390625,\n y: 0.359375,\n },\n {\n x: 0.390625,\n y: 0.359375,\n },\n {\n x: 0.421875,\n y: 0.359375,\n },\n {\n x: 0.421875,\n y: 0.359375,\n },\n {\n x: 0.453125,\n y: 0.359375,\n },\n {\n x: 0.453125,\n y: 0.359375,\n },\n {\n x: 0.484375,\n y: 0.359375,\n },\n {\n x: 0.484375,\n y: 0.359375,\n },\n {\n x: 0.515625,\n y: 0.359375,\n },\n {\n x: 0.515625,\n y: 0.359375,\n },\n {\n x: 0.546875,\n y: 0.359375,\n },\n {\n x: 0.546875,\n y: 0.359375,\n },\n {\n x: 0.578125,\n y: 0.359375,\n },\n {\n x: 0.578125,\n y: 0.359375,\n },\n {\n x: 0.609375,\n y: 0.359375,\n },\n {\n x: 0.609375,\n y: 0.359375,\n },\n {\n x: 0.640625,\n y: 0.359375,\n },\n {\n x: 0.640625,\n y: 0.359375,\n },\n {\n x: 0.671875,\n y: 0.359375,\n },\n {\n x: 0.671875,\n y: 0.359375,\n },\n {\n x: 0.703125,\n y: 0.359375,\n },\n {\n x: 0.703125,\n y: 0.359375,\n },\n {\n x: 0.734375,\n y: 0.359375,\n },\n {\n x: 0.734375,\n y: 0.359375,\n },\n {\n x: 0.765625,\n y: 0.359375,\n },\n {\n x: 0.765625,\n y: 0.359375,\n },\n {\n x: 0.796875,\n y: 0.359375,\n },\n {\n x: 0.796875,\n y: 0.359375,\n },\n {\n x: 0.828125,\n y: 0.359375,\n },\n {\n x: 0.828125,\n y: 0.359375,\n },\n {\n x: 0.859375,\n y: 0.359375,\n },\n {\n x: 0.859375,\n y: 0.359375,\n },\n {\n x: 0.890625,\n y: 0.359375,\n },\n {\n x: 0.890625,\n y: 0.359375,\n },\n {\n x: 0.921875,\n y: 0.359375,\n },\n {\n x: 0.921875,\n y: 0.359375,\n },\n {\n x: 0.953125,\n y: 0.359375,\n },\n {\n x: 0.953125,\n y: 0.359375,\n },\n {\n x: 0.984375,\n y: 0.359375,\n },\n {\n x: 0.984375,\n y: 0.359375,\n },\n {\n x: 0.015625,\n y: 0.390625,\n },\n {\n x: 0.015625,\n y: 0.390625,\n },\n {\n x: 0.046875,\n y: 0.390625,\n },\n {\n x: 0.046875,\n y: 0.390625,\n },\n {\n x: 0.078125,\n y: 0.390625,\n },\n {\n x: 0.078125,\n y: 0.390625,\n },\n {\n x: 0.109375,\n y: 0.390625,\n },\n {\n x: 0.109375,\n y: 0.390625,\n },\n {\n x: 0.140625,\n y: 0.390625,\n },\n {\n x: 0.140625,\n y: 0.390625,\n },\n {\n x: 0.171875,\n y: 0.390625,\n },\n {\n x: 0.171875,\n y: 0.390625,\n },\n {\n x: 0.203125,\n y: 0.390625,\n },\n {\n x: 0.203125,\n y: 0.390625,\n },\n {\n x: 0.234375,\n y: 0.390625,\n },\n {\n x: 0.234375,\n y: 0.390625,\n },\n {\n x: 0.265625,\n y: 0.390625,\n },\n {\n x: 0.265625,\n y: 0.390625,\n },\n {\n x: 0.296875,\n y: 0.390625,\n },\n {\n x: 0.296875,\n y: 0.390625,\n },\n {\n x: 0.328125,\n y: 0.390625,\n },\n {\n x: 0.328125,\n y: 0.390625,\n },\n {\n x: 0.359375,\n y: 0.390625,\n },\n {\n x: 0.359375,\n y: 0.390625,\n },\n {\n x: 0.390625,\n y: 0.390625,\n },\n {\n x: 0.390625,\n y: 0.390625,\n },\n {\n x: 0.421875,\n y: 0.390625,\n },\n {\n x: 0.421875,\n y: 0.390625,\n },\n {\n x: 0.453125,\n y: 0.390625,\n },\n {\n x: 0.453125,\n y: 0.390625,\n },\n {\n x: 0.484375,\n y: 0.390625,\n },\n {\n x: 0.484375,\n y: 0.390625,\n },\n {\n x: 0.515625,\n y: 0.390625,\n },\n {\n x: 0.515625,\n y: 0.390625,\n },\n {\n x: 0.546875,\n y: 0.390625,\n },\n {\n x: 0.546875,\n y: 0.390625,\n },\n {\n x: 0.578125,\n y: 0.390625,\n },\n {\n x: 0.578125,\n y: 0.390625,\n },\n {\n x: 0.609375,\n y: 0.390625,\n },\n {\n x: 0.609375,\n y: 0.390625,\n },\n {\n x: 0.640625,\n y: 0.390625,\n },\n {\n x: 0.640625,\n y: 0.390625,\n },\n {\n x: 0.671875,\n y: 0.390625,\n },\n {\n x: 0.671875,\n y: 0.390625,\n },\n {\n x: 0.703125,\n y: 0.390625,\n },\n {\n x: 0.703125,\n y: 0.390625,\n },\n {\n x: 0.734375,\n y: 0.390625,\n },\n {\n x: 0.734375,\n y: 0.390625,\n },\n {\n x: 0.765625,\n y: 0.390625,\n },\n {\n x: 0.765625,\n y: 0.390625,\n },\n {\n x: 0.796875,\n y: 0.390625,\n },\n {\n x: 0.796875,\n y: 0.390625,\n },\n {\n x: 0.828125,\n y: 0.390625,\n },\n {\n x: 0.828125,\n y: 0.390625,\n },\n {\n x: 0.859375,\n y: 0.390625,\n },\n {\n x: 0.859375,\n y: 0.390625,\n },\n {\n x: 0.890625,\n y: 0.390625,\n },\n {\n x: 0.890625,\n y: 0.390625,\n },\n {\n x: 0.921875,\n y: 0.390625,\n },\n {\n x: 0.921875,\n y: 0.390625,\n },\n {\n x: 0.953125,\n y: 0.390625,\n },\n {\n x: 0.953125,\n y: 0.390625,\n },\n {\n x: 0.984375,\n y: 0.390625,\n },\n {\n x: 0.984375,\n y: 0.390625,\n },\n {\n x: 0.015625,\n y: 0.421875,\n },\n {\n x: 0.015625,\n y: 0.421875,\n },\n {\n x: 0.046875,\n y: 0.421875,\n },\n {\n x: 0.046875,\n y: 0.421875,\n },\n {\n x: 0.078125,\n y: 0.421875,\n },\n {\n x: 0.078125,\n y: 0.421875,\n },\n {\n x: 0.109375,\n y: 0.421875,\n },\n {\n x: 0.109375,\n y: 0.421875,\n },\n {\n x: 0.140625,\n y: 0.421875,\n },\n {\n x: 0.140625,\n y: 0.421875,\n },\n {\n x: 0.171875,\n y: 0.421875,\n },\n {\n x: 0.171875,\n y: 0.421875,\n },\n {\n x: 0.203125,\n y: 0.421875,\n },\n {\n x: 0.203125,\n y: 0.421875,\n },\n {\n x: 0.234375,\n y: 0.421875,\n },\n {\n x: 0.234375,\n y: 0.421875,\n },\n {\n x: 0.265625,\n y: 0.421875,\n },\n {\n x: 0.265625,\n y: 0.421875,\n },\n {\n x: 0.296875,\n y: 0.421875,\n },\n {\n x: 0.296875,\n y: 0.421875,\n },\n {\n x: 0.328125,\n y: 0.421875,\n },\n {\n x: 0.328125,\n y: 0.421875,\n },\n {\n x: 0.359375,\n y: 0.421875,\n },\n {\n x: 0.359375,\n y: 0.421875,\n },\n {\n x: 0.390625,\n y: 0.421875,\n },\n {\n x: 0.390625,\n y: 0.421875,\n },\n {\n x: 0.421875,\n y: 0.421875,\n },\n {\n x: 0.421875,\n y: 0.421875,\n },\n {\n x: 0.453125,\n y: 0.421875,\n },\n {\n x: 0.453125,\n y: 0.421875,\n },\n {\n x: 0.484375,\n y: 0.421875,\n },\n {\n x: 0.484375,\n y: 0.421875,\n },\n {\n x: 0.515625,\n y: 0.421875,\n },\n {\n x: 0.515625,\n y: 0.421875,\n },\n {\n x: 0.546875,\n y: 0.421875,\n },\n {\n x: 0.546875,\n y: 0.421875,\n },\n {\n x: 0.578125,\n y: 0.421875,\n },\n {\n x: 0.578125,\n y: 0.421875,\n },\n {\n x: 0.609375,\n y: 0.421875,\n },\n {\n x: 0.609375,\n y: 0.421875,\n },\n {\n x: 0.640625,\n y: 0.421875,\n },\n {\n x: 0.640625,\n y: 0.421875,\n },\n {\n x: 0.671875,\n y: 0.421875,\n },\n {\n x: 0.671875,\n y: 0.421875,\n },\n {\n x: 0.703125,\n y: 0.421875,\n },\n {\n x: 0.703125,\n y: 0.421875,\n },\n {\n x: 0.734375,\n y: 0.421875,\n },\n {\n x: 0.734375,\n y: 0.421875,\n },\n {\n x: 0.765625,\n y: 0.421875,\n },\n {\n x: 0.765625,\n y: 0.421875,\n },\n {\n x: 0.796875,\n y: 0.421875,\n },\n {\n x: 0.796875,\n y: 0.421875,\n },\n {\n x: 0.828125,\n y: 0.421875,\n },\n {\n x: 0.828125,\n y: 0.421875,\n },\n {\n x: 0.859375,\n y: 0.421875,\n },\n {\n x: 0.859375,\n y: 0.421875,\n },\n {\n x: 0.890625,\n y: 0.421875,\n },\n {\n x: 0.890625,\n y: 0.421875,\n },\n {\n x: 0.921875,\n y: 0.421875,\n },\n {\n x: 0.921875,\n y: 0.421875,\n },\n {\n x: 0.953125,\n y: 0.421875,\n },\n {\n x: 0.953125,\n y: 0.421875,\n },\n {\n x: 0.984375,\n y: 0.421875,\n },\n {\n x: 0.984375,\n y: 0.421875,\n },\n {\n x: 0.015625,\n y: 0.453125,\n },\n {\n x: 0.015625,\n y: 0.453125,\n },\n {\n x: 0.046875,\n y: 0.453125,\n },\n {\n x: 0.046875,\n y: 0.453125,\n },\n {\n x: 0.078125,\n y: 0.453125,\n },\n {\n x: 0.078125,\n y: 0.453125,\n },\n {\n x: 0.109375,\n y: 0.453125,\n },\n {\n x: 0.109375,\n y: 0.453125,\n },\n {\n x: 0.140625,\n y: 0.453125,\n },\n {\n x: 0.140625,\n y: 0.453125,\n },\n {\n x: 0.171875,\n y: 0.453125,\n },\n {\n x: 0.171875,\n y: 0.453125,\n },\n {\n x: 0.203125,\n y: 0.453125,\n },\n {\n x: 0.203125,\n y: 0.453125,\n },\n {\n x: 0.234375,\n y: 0.453125,\n },\n {\n x: 0.234375,\n y: 0.453125,\n },\n {\n x: 0.265625,\n y: 0.453125,\n },\n {\n x: 0.265625,\n y: 0.453125,\n },\n {\n x: 0.296875,\n y: 0.453125,\n },\n {\n x: 0.296875,\n y: 0.453125,\n },\n {\n x: 0.328125,\n y: 0.453125,\n },\n {\n x: 0.328125,\n y: 0.453125,\n },\n {\n x: 0.359375,\n y: 0.453125,\n },\n {\n x: 0.359375,\n y: 0.453125,\n },\n {\n x: 0.390625,\n y: 0.453125,\n },\n {\n x: 0.390625,\n y: 0.453125,\n },\n {\n x: 0.421875,\n y: 0.453125,\n },\n {\n x: 0.421875,\n y: 0.453125,\n },\n {\n x: 0.453125,\n y: 0.453125,\n },\n {\n x: 0.453125,\n y: 0.453125,\n },\n {\n x: 0.484375,\n y: 0.453125,\n },\n {\n x: 0.484375,\n y: 0.453125,\n },\n {\n x: 0.515625,\n y: 0.453125,\n },\n {\n x: 0.515625,\n y: 0.453125,\n },\n {\n x: 0.546875,\n y: 0.453125,\n },\n {\n x: 0.546875,\n y: 0.453125,\n },\n {\n x: 0.578125,\n y: 0.453125,\n },\n {\n x: 0.578125,\n y: 0.453125,\n },\n {\n x: 0.609375,\n y: 0.453125,\n },\n {\n x: 0.609375,\n y: 0.453125,\n },\n {\n x: 0.640625,\n y: 0.453125,\n },\n {\n x: 0.640625,\n y: 0.453125,\n },\n {\n x: 0.671875,\n y: 0.453125,\n },\n {\n x: 0.671875,\n y: 0.453125,\n },\n {\n x: 0.703125,\n y: 0.453125,\n },\n {\n x: 0.703125,\n y: 0.453125,\n },\n {\n x: 0.734375,\n y: 0.453125,\n },\n {\n x: 0.734375,\n y: 0.453125,\n },\n {\n x: 0.765625,\n y: 0.453125,\n },\n {\n x: 0.765625,\n y: 0.453125,\n },\n {\n x: 0.796875,\n y: 0.453125,\n },\n {\n x: 0.796875,\n y: 0.453125,\n },\n {\n x: 0.828125,\n y: 0.453125,\n },\n {\n x: 0.828125,\n y: 0.453125,\n },\n {\n x: 0.859375,\n y: 0.453125,\n },\n {\n x: 0.859375,\n y: 0.453125,\n },\n {\n x: 0.890625,\n y: 0.453125,\n },\n {\n x: 0.890625,\n y: 0.453125,\n },\n {\n x: 0.921875,\n y: 0.453125,\n },\n {\n x: 0.921875,\n y: 0.453125,\n },\n {\n x: 0.953125,\n y: 0.453125,\n },\n {\n x: 0.953125,\n y: 0.453125,\n },\n {\n x: 0.984375,\n y: 0.453125,\n },\n {\n x: 0.984375,\n y: 0.453125,\n },\n {\n x: 0.015625,\n y: 0.484375,\n },\n {\n x: 0.015625,\n y: 0.484375,\n },\n {\n x: 0.046875,\n y: 0.484375,\n },\n {\n x: 0.046875,\n y: 0.484375,\n },\n {\n x: 0.078125,\n y: 0.484375,\n },\n {\n x: 0.078125,\n y: 0.484375,\n },\n {\n x: 0.109375,\n y: 0.484375,\n },\n {\n x: 0.109375,\n y: 0.484375,\n },\n {\n x: 0.140625,\n y: 0.484375,\n },\n {\n x: 0.140625,\n y: 0.484375,\n },\n {\n x: 0.171875,\n y: 0.484375,\n },\n {\n x: 0.171875,\n y: 0.484375,\n },\n {\n x: 0.203125,\n y: 0.484375,\n },\n {\n x: 0.203125,\n y: 0.484375,\n },\n {\n x: 0.234375,\n y: 0.484375,\n },\n {\n x: 0.234375,\n y: 0.484375,\n },\n {\n x: 0.265625,\n y: 0.484375,\n },\n {\n x: 0.265625,\n y: 0.484375,\n },\n {\n x: 0.296875,\n y: 0.484375,\n },\n {\n x: 0.296875,\n y: 0.484375,\n },\n {\n x: 0.328125,\n y: 0.484375,\n },\n {\n x: 0.328125,\n y: 0.484375,\n },\n {\n x: 0.359375,\n y: 0.484375,\n },\n {\n x: 0.359375,\n y: 0.484375,\n },\n {\n x: 0.390625,\n y: 0.484375,\n },\n {\n x: 0.390625,\n y: 0.484375,\n },\n {\n x: 0.421875,\n y: 0.484375,\n },\n {\n x: 0.421875,\n y: 0.484375,\n },\n {\n x: 0.453125,\n y: 0.484375,\n },\n {\n x: 0.453125,\n y: 0.484375,\n },\n {\n x: 0.484375,\n y: 0.484375,\n },\n {\n x: 0.484375,\n y: 0.484375,\n },\n {\n x: 0.515625,\n y: 0.484375,\n },\n {\n x: 0.515625,\n y: 0.484375,\n },\n {\n x: 0.546875,\n y: 0.484375,\n },\n {\n x: 0.546875,\n y: 0.484375,\n },\n {\n x: 0.578125,\n y: 0.484375,\n },\n {\n x: 0.578125,\n y: 0.484375,\n },\n {\n x: 0.609375,\n y: 0.484375,\n },\n {\n x: 0.609375,\n y: 0.484375,\n },\n {\n x: 0.640625,\n y: 0.484375,\n },\n {\n x: 0.640625,\n y: 0.484375,\n },\n {\n x: 0.671875,\n y: 0.484375,\n },\n {\n x: 0.671875,\n y: 0.484375,\n },\n {\n x: 0.703125,\n y: 0.484375,\n },\n {\n x: 0.703125,\n y: 0.484375,\n },\n {\n x: 0.734375,\n y: 0.484375,\n },\n {\n x: 0.734375,\n y: 0.484375,\n },\n {\n x: 0.765625,\n y: 0.484375,\n },\n {\n x: 0.765625,\n y: 0.484375,\n },\n {\n x: 0.796875,\n y: 0.484375,\n },\n {\n x: 0.796875,\n y: 0.484375,\n },\n {\n x: 0.828125,\n y: 0.484375,\n },\n {\n x: 0.828125,\n y: 0.484375,\n },\n {\n x: 0.859375,\n y: 0.484375,\n },\n {\n x: 0.859375,\n y: 0.484375,\n },\n {\n x: 0.890625,\n y: 0.484375,\n },\n {\n x: 0.890625,\n y: 0.484375,\n },\n {\n x: 0.921875,\n y: 0.484375,\n },\n {\n x: 0.921875,\n y: 0.484375,\n },\n {\n x: 0.953125,\n y: 0.484375,\n },\n {\n x: 0.953125,\n y: 0.484375,\n },\n {\n x: 0.984375,\n y: 0.484375,\n },\n {\n x: 0.984375,\n y: 0.484375,\n },\n {\n x: 0.015625,\n y: 0.515625,\n },\n {\n x: 0.015625,\n y: 0.515625,\n },\n {\n x: 0.046875,\n y: 0.515625,\n },\n {\n x: 0.046875,\n y: 0.515625,\n },\n {\n x: 0.078125,\n y: 0.515625,\n },\n {\n x: 0.078125,\n y: 0.515625,\n },\n {\n x: 0.109375,\n y: 0.515625,\n },\n {\n x: 0.109375,\n y: 0.515625,\n },\n {\n x: 0.140625,\n y: 0.515625,\n },\n {\n x: 0.140625,\n y: 0.515625,\n },\n {\n x: 0.171875,\n y: 0.515625,\n },\n {\n x: 0.171875,\n y: 0.515625,\n },\n {\n x: 0.203125,\n y: 0.515625,\n },\n {\n x: 0.203125,\n y: 0.515625,\n },\n {\n x: 0.234375,\n y: 0.515625,\n },\n {\n x: 0.234375,\n y: 0.515625,\n },\n {\n x: 0.265625,\n y: 0.515625,\n },\n {\n x: 0.265625,\n y: 0.515625,\n },\n {\n x: 0.296875,\n y: 0.515625,\n },\n {\n x: 0.296875,\n y: 0.515625,\n },\n {\n x: 0.328125,\n y: 0.515625,\n },\n {\n x: 0.328125,\n y: 0.515625,\n },\n {\n x: 0.359375,\n y: 0.515625,\n },\n {\n x: 0.359375,\n y: 0.515625,\n },\n {\n x: 0.390625,\n y: 0.515625,\n },\n {\n x: 0.390625,\n y: 0.515625,\n },\n {\n x: 0.421875,\n y: 0.515625,\n },\n {\n x: 0.421875,\n y: 0.515625,\n },\n {\n x: 0.453125,\n y: 0.515625,\n },\n {\n x: 0.453125,\n y: 0.515625,\n },\n {\n x: 0.484375,\n y: 0.515625,\n },\n {\n x: 0.484375,\n y: 0.515625,\n },\n {\n x: 0.515625,\n y: 0.515625,\n },\n {\n x: 0.515625,\n y: 0.515625,\n },\n {\n x: 0.546875,\n y: 0.515625,\n },\n {\n x: 0.546875,\n y: 0.515625,\n },\n {\n x: 0.578125,\n y: 0.515625,\n },\n {\n x: 0.578125,\n y: 0.515625,\n },\n {\n x: 0.609375,\n y: 0.515625,\n },\n {\n x: 0.609375,\n y: 0.515625,\n },\n {\n x: 0.640625,\n y: 0.515625,\n },\n {\n x: 0.640625,\n y: 0.515625,\n },\n {\n x: 0.671875,\n y: 0.515625,\n },\n {\n x: 0.671875,\n y: 0.515625,\n },\n {\n x: 0.703125,\n y: 0.515625,\n },\n {\n x: 0.703125,\n y: 0.515625,\n },\n {\n x: 0.734375,\n y: 0.515625,\n },\n {\n x: 0.734375,\n y: 0.515625,\n },\n {\n x: 0.765625,\n y: 0.515625,\n },\n {\n x: 0.765625,\n y: 0.515625,\n },\n {\n x: 0.796875,\n y: 0.515625,\n },\n {\n x: 0.796875,\n y: 0.515625,\n },\n {\n x: 0.828125,\n y: 0.515625,\n },\n {\n x: 0.828125,\n y: 0.515625,\n },\n {\n x: 0.859375,\n y: 0.515625,\n },\n {\n x: 0.859375,\n y: 0.515625,\n },\n {\n x: 0.890625,\n y: 0.515625,\n },\n {\n x: 0.890625,\n y: 0.515625,\n },\n {\n x: 0.921875,\n y: 0.515625,\n },\n {\n x: 0.921875,\n y: 0.515625,\n },\n {\n x: 0.953125,\n y: 0.515625,\n },\n {\n x: 0.953125,\n y: 0.515625,\n },\n {\n x: 0.984375,\n y: 0.515625,\n },\n {\n x: 0.984375,\n y: 0.515625,\n },\n {\n x: 0.015625,\n y: 0.546875,\n },\n {\n x: 0.015625,\n y: 0.546875,\n },\n {\n x: 0.046875,\n y: 0.546875,\n },\n {\n x: 0.046875,\n y: 0.546875,\n },\n {\n x: 0.078125,\n y: 0.546875,\n },\n {\n x: 0.078125,\n y: 0.546875,\n },\n {\n x: 0.109375,\n y: 0.546875,\n },\n {\n x: 0.109375,\n y: 0.546875,\n },\n {\n x: 0.140625,\n y: 0.546875,\n },\n {\n x: 0.140625,\n y: 0.546875,\n },\n {\n x: 0.171875,\n y: 0.546875,\n },\n {\n x: 0.171875,\n y: 0.546875,\n },\n {\n x: 0.203125,\n y: 0.546875,\n },\n {\n x: 0.203125,\n y: 0.546875,\n },\n {\n x: 0.234375,\n y: 0.546875,\n },\n {\n x: 0.234375,\n y: 0.546875,\n },\n {\n x: 0.265625,\n y: 0.546875,\n },\n {\n x: 0.265625,\n y: 0.546875,\n },\n {\n x: 0.296875,\n y: 0.546875,\n },\n {\n x: 0.296875,\n y: 0.546875,\n },\n {\n x: 0.328125,\n y: 0.546875,\n },\n {\n x: 0.328125,\n y: 0.546875,\n },\n {\n x: 0.359375,\n y: 0.546875,\n },\n {\n x: 0.359375,\n y: 0.546875,\n },\n {\n x: 0.390625,\n y: 0.546875,\n },\n {\n x: 0.390625,\n y: 0.546875,\n },\n {\n x: 0.421875,\n y: 0.546875,\n },\n {\n x: 0.421875,\n y: 0.546875,\n },\n {\n x: 0.453125,\n y: 0.546875,\n },\n {\n x: 0.453125,\n y: 0.546875,\n },\n {\n x: 0.484375,\n y: 0.546875,\n },\n {\n x: 0.484375,\n y: 0.546875,\n },\n {\n x: 0.515625,\n y: 0.546875,\n },\n {\n x: 0.515625,\n y: 0.546875,\n },\n {\n x: 0.546875,\n y: 0.546875,\n },\n {\n x: 0.546875,\n y: 0.546875,\n },\n {\n x: 0.578125,\n y: 0.546875,\n },\n {\n x: 0.578125,\n y: 0.546875,\n },\n {\n x: 0.609375,\n y: 0.546875,\n },\n {\n x: 0.609375,\n y: 0.546875,\n },\n {\n x: 0.640625,\n y: 0.546875,\n },\n {\n x: 0.640625,\n y: 0.546875,\n },\n {\n x: 0.671875,\n y: 0.546875,\n },\n {\n x: 0.671875,\n y: 0.546875,\n },\n {\n x: 0.703125,\n y: 0.546875,\n },\n {\n x: 0.703125,\n y: 0.546875,\n },\n {\n x: 0.734375,\n y: 0.546875,\n },\n {\n x: 0.734375,\n y: 0.546875,\n },\n {\n x: 0.765625,\n y: 0.546875,\n },\n {\n x: 0.765625,\n y: 0.546875,\n },\n {\n x: 0.796875,\n y: 0.546875,\n },\n {\n x: 0.796875,\n y: 0.546875,\n },\n {\n x: 0.828125,\n y: 0.546875,\n },\n {\n x: 0.828125,\n y: 0.546875,\n },\n {\n x: 0.859375,\n y: 0.546875,\n },\n {\n x: 0.859375,\n y: 0.546875,\n },\n {\n x: 0.890625,\n y: 0.546875,\n },\n {\n x: 0.890625,\n y: 0.546875,\n },\n {\n x: 0.921875,\n y: 0.546875,\n },\n {\n x: 0.921875,\n y: 0.546875,\n },\n {\n x: 0.953125,\n y: 0.546875,\n },\n {\n x: 0.953125,\n y: 0.546875,\n },\n {\n x: 0.984375,\n y: 0.546875,\n },\n {\n x: 0.984375,\n y: 0.546875,\n },\n {\n x: 0.015625,\n y: 0.578125,\n },\n {\n x: 0.015625,\n y: 0.578125,\n },\n {\n x: 0.046875,\n y: 0.578125,\n },\n {\n x: 0.046875,\n y: 0.578125,\n },\n {\n x: 0.078125,\n y: 0.578125,\n },\n {\n x: 0.078125,\n y: 0.578125,\n },\n {\n x: 0.109375,\n y: 0.578125,\n },\n {\n x: 0.109375,\n y: 0.578125,\n },\n {\n x: 0.140625,\n y: 0.578125,\n },\n {\n x: 0.140625,\n y: 0.578125,\n },\n {\n x: 0.171875,\n y: 0.578125,\n },\n {\n x: 0.171875,\n y: 0.578125,\n },\n {\n x: 0.203125,\n y: 0.578125,\n },\n {\n x: 0.203125,\n y: 0.578125,\n },\n {\n x: 0.234375,\n y: 0.578125,\n },\n {\n x: 0.234375,\n y: 0.578125,\n },\n {\n x: 0.265625,\n y: 0.578125,\n },\n {\n x: 0.265625,\n y: 0.578125,\n },\n {\n x: 0.296875,\n y: 0.578125,\n },\n {\n x: 0.296875,\n y: 0.578125,\n },\n {\n x: 0.328125,\n y: 0.578125,\n },\n {\n x: 0.328125,\n y: 0.578125,\n },\n {\n x: 0.359375,\n y: 0.578125,\n },\n {\n x: 0.359375,\n y: 0.578125,\n },\n {\n x: 0.390625,\n y: 0.578125,\n },\n {\n x: 0.390625,\n y: 0.578125,\n },\n {\n x: 0.421875,\n y: 0.578125,\n },\n {\n x: 0.421875,\n y: 0.578125,\n },\n {\n x: 0.453125,\n y: 0.578125,\n },\n {\n x: 0.453125,\n y: 0.578125,\n },\n {\n x: 0.484375,\n y: 0.578125,\n },\n {\n x: 0.484375,\n y: 0.578125,\n },\n {\n x: 0.515625,\n y: 0.578125,\n },\n {\n x: 0.515625,\n y: 0.578125,\n },\n {\n x: 0.546875,\n y: 0.578125,\n },\n {\n x: 0.546875,\n y: 0.578125,\n },\n {\n x: 0.578125,\n y: 0.578125,\n },\n {\n x: 0.578125,\n y: 0.578125,\n },\n {\n x: 0.609375,\n y: 0.578125,\n },\n {\n x: 0.609375,\n y: 0.578125,\n },\n {\n x: 0.640625,\n y: 0.578125,\n },\n {\n x: 0.640625,\n y: 0.578125,\n },\n {\n x: 0.671875,\n y: 0.578125,\n },\n {\n x: 0.671875,\n y: 0.578125,\n },\n {\n x: 0.703125,\n y: 0.578125,\n },\n {\n x: 0.703125,\n y: 0.578125,\n },\n {\n x: 0.734375,\n y: 0.578125,\n },\n {\n x: 0.734375,\n y: 0.578125,\n },\n {\n x: 0.765625,\n y: 0.578125,\n },\n {\n x: 0.765625,\n y: 0.578125,\n },\n {\n x: 0.796875,\n y: 0.578125,\n },\n {\n x: 0.796875,\n y: 0.578125,\n },\n {\n x: 0.828125,\n y: 0.578125,\n },\n {\n x: 0.828125,\n y: 0.578125,\n },\n {\n x: 0.859375,\n y: 0.578125,\n },\n {\n x: 0.859375,\n y: 0.578125,\n },\n {\n x: 0.890625,\n y: 0.578125,\n },\n {\n x: 0.890625,\n y: 0.578125,\n },\n {\n x: 0.921875,\n y: 0.578125,\n },\n {\n x: 0.921875,\n y: 0.578125,\n },\n {\n x: 0.953125,\n y: 0.578125,\n },\n {\n x: 0.953125,\n y: 0.578125,\n },\n {\n x: 0.984375,\n y: 0.578125,\n },\n {\n x: 0.984375,\n y: 0.578125,\n },\n {\n x: 0.015625,\n y: 0.609375,\n },\n {\n x: 0.015625,\n y: 0.609375,\n },\n {\n x: 0.046875,\n y: 0.609375,\n },\n {\n x: 0.046875,\n y: 0.609375,\n },\n {\n x: 0.078125,\n y: 0.609375,\n },\n {\n x: 0.078125,\n y: 0.609375,\n },\n {\n x: 0.109375,\n y: 0.609375,\n },\n {\n x: 0.109375,\n y: 0.609375,\n },\n {\n x: 0.140625,\n y: 0.609375,\n },\n {\n x: 0.140625,\n y: 0.609375,\n },\n {\n x: 0.171875,\n y: 0.609375,\n },\n {\n x: 0.171875,\n y: 0.609375,\n },\n {\n x: 0.203125,\n y: 0.609375,\n },\n {\n x: 0.203125,\n y: 0.609375,\n },\n {\n x: 0.234375,\n y: 0.609375,\n },\n {\n x: 0.234375,\n y: 0.609375,\n },\n {\n x: 0.265625,\n y: 0.609375,\n },\n {\n x: 0.265625,\n y: 0.609375,\n },\n {\n x: 0.296875,\n y: 0.609375,\n },\n {\n x: 0.296875,\n y: 0.609375,\n },\n {\n x: 0.328125,\n y: 0.609375,\n },\n {\n x: 0.328125,\n y: 0.609375,\n },\n {\n x: 0.359375,\n y: 0.609375,\n },\n {\n x: 0.359375,\n y: 0.609375,\n },\n {\n x: 0.390625,\n y: 0.609375,\n },\n {\n x: 0.390625,\n y: 0.609375,\n },\n {\n x: 0.421875,\n y: 0.609375,\n },\n {\n x: 0.421875,\n y: 0.609375,\n },\n {\n x: 0.453125,\n y: 0.609375,\n },\n {\n x: 0.453125,\n y: 0.609375,\n },\n {\n x: 0.484375,\n y: 0.609375,\n },\n {\n x: 0.484375,\n y: 0.609375,\n },\n {\n x: 0.515625,\n y: 0.609375,\n },\n {\n x: 0.515625,\n y: 0.609375,\n },\n {\n x: 0.546875,\n y: 0.609375,\n },\n {\n x: 0.546875,\n y: 0.609375,\n },\n {\n x: 0.578125,\n y: 0.609375,\n },\n {\n x: 0.578125,\n y: 0.609375,\n },\n {\n x: 0.609375,\n y: 0.609375,\n },\n {\n x: 0.609375,\n y: 0.609375,\n },\n {\n x: 0.640625,\n y: 0.609375,\n },\n {\n x: 0.640625,\n y: 0.609375,\n },\n {\n x: 0.671875,\n y: 0.609375,\n },\n {\n x: 0.671875,\n y: 0.609375,\n },\n {\n x: 0.703125,\n y: 0.609375,\n },\n {\n x: 0.703125,\n y: 0.609375,\n },\n {\n x: 0.734375,\n y: 0.609375,\n },\n {\n x: 0.734375,\n y: 0.609375,\n },\n {\n x: 0.765625,\n y: 0.609375,\n },\n {\n x: 0.765625,\n y: 0.609375,\n },\n {\n x: 0.796875,\n y: 0.609375,\n },\n {\n x: 0.796875,\n y: 0.609375,\n },\n {\n x: 0.828125,\n y: 0.609375,\n },\n {\n x: 0.828125,\n y: 0.609375,\n },\n {\n x: 0.859375,\n y: 0.609375,\n },\n {\n x: 0.859375,\n y: 0.609375,\n },\n {\n x: 0.890625,\n y: 0.609375,\n },\n {\n x: 0.890625,\n y: 0.609375,\n },\n {\n x: 0.921875,\n y: 0.609375,\n },\n {\n x: 0.921875,\n y: 0.609375,\n },\n {\n x: 0.953125,\n y: 0.609375,\n },\n {\n x: 0.953125,\n y: 0.609375,\n },\n {\n x: 0.984375,\n y: 0.609375,\n },\n {\n x: 0.984375,\n y: 0.609375,\n },\n {\n x: 0.015625,\n y: 0.640625,\n },\n {\n x: 0.015625,\n y: 0.640625,\n },\n {\n x: 0.046875,\n y: 0.640625,\n },\n {\n x: 0.046875,\n y: 0.640625,\n },\n {\n x: 0.078125,\n y: 0.640625,\n },\n {\n x: 0.078125,\n y: 0.640625,\n },\n {\n x: 0.109375,\n y: 0.640625,\n },\n {\n x: 0.109375,\n y: 0.640625,\n },\n {\n x: 0.140625,\n y: 0.640625,\n },\n {\n x: 0.140625,\n y: 0.640625,\n },\n {\n x: 0.171875,\n y: 0.640625,\n },\n {\n x: 0.171875,\n y: 0.640625,\n },\n {\n x: 0.203125,\n y: 0.640625,\n },\n {\n x: 0.203125,\n y: 0.640625,\n },\n {\n x: 0.234375,\n y: 0.640625,\n },\n {\n x: 0.234375,\n y: 0.640625,\n },\n {\n x: 0.265625,\n y: 0.640625,\n },\n {\n x: 0.265625,\n y: 0.640625,\n },\n {\n x: 0.296875,\n y: 0.640625,\n },\n {\n x: 0.296875,\n y: 0.640625,\n },\n {\n x: 0.328125,\n y: 0.640625,\n },\n {\n x: 0.328125,\n y: 0.640625,\n },\n {\n x: 0.359375,\n y: 0.640625,\n },\n {\n x: 0.359375,\n y: 0.640625,\n },\n {\n x: 0.390625,\n y: 0.640625,\n },\n {\n x: 0.390625,\n y: 0.640625,\n },\n {\n x: 0.421875,\n y: 0.640625,\n },\n {\n x: 0.421875,\n y: 0.640625,\n },\n {\n x: 0.453125,\n y: 0.640625,\n },\n {\n x: 0.453125,\n y: 0.640625,\n },\n {\n x: 0.484375,\n y: 0.640625,\n },\n {\n x: 0.484375,\n y: 0.640625,\n },\n {\n x: 0.515625,\n y: 0.640625,\n },\n {\n x: 0.515625,\n y: 0.640625,\n },\n {\n x: 0.546875,\n y: 0.640625,\n },\n {\n x: 0.546875,\n y: 0.640625,\n },\n {\n x: 0.578125,\n y: 0.640625,\n },\n {\n x: 0.578125,\n y: 0.640625,\n },\n {\n x: 0.609375,\n y: 0.640625,\n },\n {\n x: 0.609375,\n y: 0.640625,\n },\n {\n x: 0.640625,\n y: 0.640625,\n },\n {\n x: 0.640625,\n y: 0.640625,\n },\n {\n x: 0.671875,\n y: 0.640625,\n },\n {\n x: 0.671875,\n y: 0.640625,\n },\n {\n x: 0.703125,\n y: 0.640625,\n },\n {\n x: 0.703125,\n y: 0.640625,\n },\n {\n x: 0.734375,\n y: 0.640625,\n },\n {\n x: 0.734375,\n y: 0.640625,\n },\n {\n x: 0.765625,\n y: 0.640625,\n },\n {\n x: 0.765625,\n y: 0.640625,\n },\n {\n x: 0.796875,\n y: 0.640625,\n },\n {\n x: 0.796875,\n y: 0.640625,\n },\n {\n x: 0.828125,\n y: 0.640625,\n },\n {\n x: 0.828125,\n y: 0.640625,\n },\n {\n x: 0.859375,\n y: 0.640625,\n },\n {\n x: 0.859375,\n y: 0.640625,\n },\n {\n x: 0.890625,\n y: 0.640625,\n },\n {\n x: 0.890625,\n y: 0.640625,\n },\n {\n x: 0.921875,\n y: 0.640625,\n },\n {\n x: 0.921875,\n y: 0.640625,\n },\n {\n x: 0.953125,\n y: 0.640625,\n },\n {\n x: 0.953125,\n y: 0.640625,\n },\n {\n x: 0.984375,\n y: 0.640625,\n },\n {\n x: 0.984375,\n y: 0.640625,\n },\n {\n x: 0.015625,\n y: 0.671875,\n },\n {\n x: 0.015625,\n y: 0.671875,\n },\n {\n x: 0.046875,\n y: 0.671875,\n },\n {\n x: 0.046875,\n y: 0.671875,\n },\n {\n x: 0.078125,\n y: 0.671875,\n },\n {\n x: 0.078125,\n y: 0.671875,\n },\n {\n x: 0.109375,\n y: 0.671875,\n },\n {\n x: 0.109375,\n y: 0.671875,\n },\n {\n x: 0.140625,\n y: 0.671875,\n },\n {\n x: 0.140625,\n y: 0.671875,\n },\n {\n x: 0.171875,\n y: 0.671875,\n },\n {\n x: 0.171875,\n y: 0.671875,\n },\n {\n x: 0.203125,\n y: 0.671875,\n },\n {\n x: 0.203125,\n y: 0.671875,\n },\n {\n x: 0.234375,\n y: 0.671875,\n },\n {\n x: 0.234375,\n y: 0.671875,\n },\n {\n x: 0.265625,\n y: 0.671875,\n },\n {\n x: 0.265625,\n y: 0.671875,\n },\n {\n x: 0.296875,\n y: 0.671875,\n },\n {\n x: 0.296875,\n y: 0.671875,\n },\n {\n x: 0.328125,\n y: 0.671875,\n },\n {\n x: 0.328125,\n y: 0.671875,\n },\n {\n x: 0.359375,\n y: 0.671875,\n },\n {\n x: 0.359375,\n y: 0.671875,\n },\n {\n x: 0.390625,\n y: 0.671875,\n },\n {\n x: 0.390625,\n y: 0.671875,\n },\n {\n x: 0.421875,\n y: 0.671875,\n },\n {\n x: 0.421875,\n y: 0.671875,\n },\n {\n x: 0.453125,\n y: 0.671875,\n },\n {\n x: 0.453125,\n y: 0.671875,\n },\n {\n x: 0.484375,\n y: 0.671875,\n },\n {\n x: 0.484375,\n y: 0.671875,\n },\n {\n x: 0.515625,\n y: 0.671875,\n },\n {\n x: 0.515625,\n y: 0.671875,\n },\n {\n x: 0.546875,\n y: 0.671875,\n },\n {\n x: 0.546875,\n y: 0.671875,\n },\n {\n x: 0.578125,\n y: 0.671875,\n },\n {\n x: 0.578125,\n y: 0.671875,\n },\n {\n x: 0.609375,\n y: 0.671875,\n },\n {\n x: 0.609375,\n y: 0.671875,\n },\n {\n x: 0.640625,\n y: 0.671875,\n },\n {\n x: 0.640625,\n y: 0.671875,\n },\n {\n x: 0.671875,\n y: 0.671875,\n },\n {\n x: 0.671875,\n y: 0.671875,\n },\n {\n x: 0.703125,\n y: 0.671875,\n },\n {\n x: 0.703125,\n y: 0.671875,\n },\n {\n x: 0.734375,\n y: 0.671875,\n },\n {\n x: 0.734375,\n y: 0.671875,\n },\n {\n x: 0.765625,\n y: 0.671875,\n },\n {\n x: 0.765625,\n y: 0.671875,\n },\n {\n x: 0.796875,\n y: 0.671875,\n },\n {\n x: 0.796875,\n y: 0.671875,\n },\n {\n x: 0.828125,\n y: 0.671875,\n },\n {\n x: 0.828125,\n y: 0.671875,\n },\n {\n x: 0.859375,\n y: 0.671875,\n },\n {\n x: 0.859375,\n y: 0.671875,\n },\n {\n x: 0.890625,\n y: 0.671875,\n },\n {\n x: 0.890625,\n y: 0.671875,\n },\n {\n x: 0.921875,\n y: 0.671875,\n },\n {\n x: 0.921875,\n y: 0.671875,\n },\n {\n x: 0.953125,\n y: 0.671875,\n },\n {\n x: 0.953125,\n y: 0.671875,\n },\n {\n x: 0.984375,\n y: 0.671875,\n },\n {\n x: 0.984375,\n y: 0.671875,\n },\n {\n x: 0.015625,\n y: 0.703125,\n },\n {\n x: 0.015625,\n y: 0.703125,\n },\n {\n x: 0.046875,\n y: 0.703125,\n },\n {\n x: 0.046875,\n y: 0.703125,\n },\n {\n x: 0.078125,\n y: 0.703125,\n },\n {\n x: 0.078125,\n y: 0.703125,\n },\n {\n x: 0.109375,\n y: 0.703125,\n },\n {\n x: 0.109375,\n y: 0.703125,\n },\n {\n x: 0.140625,\n y: 0.703125,\n },\n {\n x: 0.140625,\n y: 0.703125,\n },\n {\n x: 0.171875,\n y: 0.703125,\n },\n {\n x: 0.171875,\n y: 0.703125,\n },\n {\n x: 0.203125,\n y: 0.703125,\n },\n {\n x: 0.203125,\n y: 0.703125,\n },\n {\n x: 0.234375,\n y: 0.703125,\n },\n {\n x: 0.234375,\n y: 0.703125,\n },\n {\n x: 0.265625,\n y: 0.703125,\n },\n {\n x: 0.265625,\n y: 0.703125,\n },\n {\n x: 0.296875,\n y: 0.703125,\n },\n {\n x: 0.296875,\n y: 0.703125,\n },\n {\n x: 0.328125,\n y: 0.703125,\n },\n {\n x: 0.328125,\n y: 0.703125,\n },\n {\n x: 0.359375,\n y: 0.703125,\n },\n {\n x: 0.359375,\n y: 0.703125,\n },\n {\n x: 0.390625,\n y: 0.703125,\n },\n {\n x: 0.390625,\n y: 0.703125,\n },\n {\n x: 0.421875,\n y: 0.703125,\n },\n {\n x: 0.421875,\n y: 0.703125,\n },\n {\n x: 0.453125,\n y: 0.703125,\n },\n {\n x: 0.453125,\n y: 0.703125,\n },\n {\n x: 0.484375,\n y: 0.703125,\n },\n {\n x: 0.484375,\n y: 0.703125,\n },\n {\n x: 0.515625,\n y: 0.703125,\n },\n {\n x: 0.515625,\n y: 0.703125,\n },\n {\n x: 0.546875,\n y: 0.703125,\n },\n {\n x: 0.546875,\n y: 0.703125,\n },\n {\n x: 0.578125,\n y: 0.703125,\n },\n {\n x: 0.578125,\n y: 0.703125,\n },\n {\n x: 0.609375,\n y: 0.703125,\n },\n {\n x: 0.609375,\n y: 0.703125,\n },\n {\n x: 0.640625,\n y: 0.703125,\n },\n {\n x: 0.640625,\n y: 0.703125,\n },\n {\n x: 0.671875,\n y: 0.703125,\n },\n {\n x: 0.671875,\n y: 0.703125,\n },\n {\n x: 0.703125,\n y: 0.703125,\n },\n {\n x: 0.703125,\n y: 0.703125,\n },\n {\n x: 0.734375,\n y: 0.703125,\n },\n {\n x: 0.734375,\n y: 0.703125,\n },\n {\n x: 0.765625,\n y: 0.703125,\n },\n {\n x: 0.765625,\n y: 0.703125,\n },\n {\n x: 0.796875,\n y: 0.703125,\n },\n {\n x: 0.796875,\n y: 0.703125,\n },\n {\n x: 0.828125,\n y: 0.703125,\n },\n {\n x: 0.828125,\n y: 0.703125,\n },\n {\n x: 0.859375,\n y: 0.703125,\n },\n {\n x: 0.859375,\n y: 0.703125,\n },\n {\n x: 0.890625,\n y: 0.703125,\n },\n {\n x: 0.890625,\n y: 0.703125,\n },\n {\n x: 0.921875,\n y: 0.703125,\n },\n {\n x: 0.921875,\n y: 0.703125,\n },\n {\n x: 0.953125,\n y: 0.703125,\n },\n {\n x: 0.953125,\n y: 0.703125,\n },\n {\n x: 0.984375,\n y: 0.703125,\n },\n {\n x: 0.984375,\n y: 0.703125,\n },\n {\n x: 0.015625,\n y: 0.734375,\n },\n {\n x: 0.015625,\n y: 0.734375,\n },\n {\n x: 0.046875,\n y: 0.734375,\n },\n {\n x: 0.046875,\n y: 0.734375,\n },\n {\n x: 0.078125,\n y: 0.734375,\n },\n {\n x: 0.078125,\n y: 0.734375,\n },\n {\n x: 0.109375,\n y: 0.734375,\n },\n {\n x: 0.109375,\n y: 0.734375,\n },\n {\n x: 0.140625,\n y: 0.734375,\n },\n {\n x: 0.140625,\n y: 0.734375,\n },\n {\n x: 0.171875,\n y: 0.734375,\n },\n {\n x: 0.171875,\n y: 0.734375,\n },\n {\n x: 0.203125,\n y: 0.734375,\n },\n {\n x: 0.203125,\n y: 0.734375,\n },\n {\n x: 0.234375,\n y: 0.734375,\n },\n {\n x: 0.234375,\n y: 0.734375,\n },\n {\n x: 0.265625,\n y: 0.734375,\n },\n {\n x: 0.265625,\n y: 0.734375,\n },\n {\n x: 0.296875,\n y: 0.734375,\n },\n {\n x: 0.296875,\n y: 0.734375,\n },\n {\n x: 0.328125,\n y: 0.734375,\n },\n {\n x: 0.328125,\n y: 0.734375,\n },\n {\n x: 0.359375,\n y: 0.734375,\n },\n {\n x: 0.359375,\n y: 0.734375,\n },\n {\n x: 0.390625,\n y: 0.734375,\n },\n {\n x: 0.390625,\n y: 0.734375,\n },\n {\n x: 0.421875,\n y: 0.734375,\n },\n {\n x: 0.421875,\n y: 0.734375,\n },\n {\n x: 0.453125,\n y: 0.734375,\n },\n {\n x: 0.453125,\n y: 0.734375,\n },\n {\n x: 0.484375,\n y: 0.734375,\n },\n {\n x: 0.484375,\n y: 0.734375,\n },\n {\n x: 0.515625,\n y: 0.734375,\n },\n {\n x: 0.515625,\n y: 0.734375,\n },\n {\n x: 0.546875,\n y: 0.734375,\n },\n {\n x: 0.546875,\n y: 0.734375,\n },\n {\n x: 0.578125,\n y: 0.734375,\n },\n {\n x: 0.578125,\n y: 0.734375,\n },\n {\n x: 0.609375,\n y: 0.734375,\n },\n {\n x: 0.609375,\n y: 0.734375,\n },\n {\n x: 0.640625,\n y: 0.734375,\n },\n {\n x: 0.640625,\n y: 0.734375,\n },\n {\n x: 0.671875,\n y: 0.734375,\n },\n {\n x: 0.671875,\n y: 0.734375,\n },\n {\n x: 0.703125,\n y: 0.734375,\n },\n {\n x: 0.703125,\n y: 0.734375,\n },\n {\n x: 0.734375,\n y: 0.734375,\n },\n {\n x: 0.734375,\n y: 0.734375,\n },\n {\n x: 0.765625,\n y: 0.734375,\n },\n {\n x: 0.765625,\n y: 0.734375,\n },\n {\n x: 0.796875,\n y: 0.734375,\n },\n {\n x: 0.796875,\n y: 0.734375,\n },\n {\n x: 0.828125,\n y: 0.734375,\n },\n {\n x: 0.828125,\n y: 0.734375,\n },\n {\n x: 0.859375,\n y: 0.734375,\n },\n {\n x: 0.859375,\n y: 0.734375,\n },\n {\n x: 0.890625,\n y: 0.734375,\n },\n {\n x: 0.890625,\n y: 0.734375,\n },\n {\n x: 0.921875,\n y: 0.734375,\n },\n {\n x: 0.921875,\n y: 0.734375,\n },\n {\n x: 0.953125,\n y: 0.734375,\n },\n {\n x: 0.953125,\n y: 0.734375,\n },\n {\n x: 0.984375,\n y: 0.734375,\n },\n {\n x: 0.984375,\n y: 0.734375,\n },\n {\n x: 0.015625,\n y: 0.765625,\n },\n {\n x: 0.015625,\n y: 0.765625,\n },\n {\n x: 0.046875,\n y: 0.765625,\n },\n {\n x: 0.046875,\n y: 0.765625,\n },\n {\n x: 0.078125,\n y: 0.765625,\n },\n {\n x: 0.078125,\n y: 0.765625,\n },\n {\n x: 0.109375,\n y: 0.765625,\n },\n {\n x: 0.109375,\n y: 0.765625,\n },\n {\n x: 0.140625,\n y: 0.765625,\n },\n {\n x: 0.140625,\n y: 0.765625,\n },\n {\n x: 0.171875,\n y: 0.765625,\n },\n {\n x: 0.171875,\n y: 0.765625,\n },\n {\n x: 0.203125,\n y: 0.765625,\n },\n {\n x: 0.203125,\n y: 0.765625,\n },\n {\n x: 0.234375,\n y: 0.765625,\n },\n {\n x: 0.234375,\n y: 0.765625,\n },\n {\n x: 0.265625,\n y: 0.765625,\n },\n {\n x: 0.265625,\n y: 0.765625,\n },\n {\n x: 0.296875,\n y: 0.765625,\n },\n {\n x: 0.296875,\n y: 0.765625,\n },\n {\n x: 0.328125,\n y: 0.765625,\n },\n {\n x: 0.328125,\n y: 0.765625,\n },\n {\n x: 0.359375,\n y: 0.765625,\n },\n {\n x: 0.359375,\n y: 0.765625,\n },\n {\n x: 0.390625,\n y: 0.765625,\n },\n {\n x: 0.390625,\n y: 0.765625,\n },\n {\n x: 0.421875,\n y: 0.765625,\n },\n {\n x: 0.421875,\n y: 0.765625,\n },\n {\n x: 0.453125,\n y: 0.765625,\n },\n {\n x: 0.453125,\n y: 0.765625,\n },\n {\n x: 0.484375,\n y: 0.765625,\n },\n {\n x: 0.484375,\n y: 0.765625,\n },\n {\n x: 0.515625,\n y: 0.765625,\n },\n {\n x: 0.515625,\n y: 0.765625,\n },\n {\n x: 0.546875,\n y: 0.765625,\n },\n {\n x: 0.546875,\n y: 0.765625,\n },\n {\n x: 0.578125,\n y: 0.765625,\n },\n {\n x: 0.578125,\n y: 0.765625,\n },\n {\n x: 0.609375,\n y: 0.765625,\n },\n {\n x: 0.609375,\n y: 0.765625,\n },\n {\n x: 0.640625,\n y: 0.765625,\n },\n {\n x: 0.640625,\n y: 0.765625,\n },\n {\n x: 0.671875,\n y: 0.765625,\n },\n {\n x: 0.671875,\n y: 0.765625,\n },\n {\n x: 0.703125,\n y: 0.765625,\n },\n {\n x: 0.703125,\n y: 0.765625,\n },\n {\n x: 0.734375,\n y: 0.765625,\n },\n {\n x: 0.734375,\n y: 0.765625,\n },\n {\n x: 0.765625,\n y: 0.765625,\n },\n {\n x: 0.765625,\n y: 0.765625,\n },\n {\n x: 0.796875,\n y: 0.765625,\n },\n {\n x: 0.796875,\n y: 0.765625,\n },\n {\n x: 0.828125,\n y: 0.765625,\n },\n {\n x: 0.828125,\n y: 0.765625,\n },\n {\n x: 0.859375,\n y: 0.765625,\n },\n {\n x: 0.859375,\n y: 0.765625,\n },\n {\n x: 0.890625,\n y: 0.765625,\n },\n {\n x: 0.890625,\n y: 0.765625,\n },\n {\n x: 0.921875,\n y: 0.765625,\n },\n {\n x: 0.921875,\n y: 0.765625,\n },\n {\n x: 0.953125,\n y: 0.765625,\n },\n {\n x: 0.953125,\n y: 0.765625,\n },\n {\n x: 0.984375,\n y: 0.765625,\n },\n {\n x: 0.984375,\n y: 0.765625,\n },\n {\n x: 0.015625,\n y: 0.796875,\n },\n {\n x: 0.015625,\n y: 0.796875,\n },\n {\n x: 0.046875,\n y: 0.796875,\n },\n {\n x: 0.046875,\n y: 0.796875,\n },\n {\n x: 0.078125,\n y: 0.796875,\n },\n {\n x: 0.078125,\n y: 0.796875,\n },\n {\n x: 0.109375,\n y: 0.796875,\n },\n {\n x: 0.109375,\n y: 0.796875,\n },\n {\n x: 0.140625,\n y: 0.796875,\n },\n {\n x: 0.140625,\n y: 0.796875,\n },\n {\n x: 0.171875,\n y: 0.796875,\n },\n {\n x: 0.171875,\n y: 0.796875,\n },\n {\n x: 0.203125,\n y: 0.796875,\n },\n {\n x: 0.203125,\n y: 0.796875,\n },\n {\n x: 0.234375,\n y: 0.796875,\n },\n {\n x: 0.234375,\n y: 0.796875,\n },\n {\n x: 0.265625,\n y: 0.796875,\n },\n {\n x: 0.265625,\n y: 0.796875,\n },\n {\n x: 0.296875,\n y: 0.796875,\n },\n {\n x: 0.296875,\n y: 0.796875,\n },\n {\n x: 0.328125,\n y: 0.796875,\n },\n {\n x: 0.328125,\n y: 0.796875,\n },\n {\n x: 0.359375,\n y: 0.796875,\n },\n {\n x: 0.359375,\n y: 0.796875,\n },\n {\n x: 0.390625,\n y: 0.796875,\n },\n {\n x: 0.390625,\n y: 0.796875,\n },\n {\n x: 0.421875,\n y: 0.796875,\n },\n {\n x: 0.421875,\n y: 0.796875,\n },\n {\n x: 0.453125,\n y: 0.796875,\n },\n {\n x: 0.453125,\n y: 0.796875,\n },\n {\n x: 0.484375,\n y: 0.796875,\n },\n {\n x: 0.484375,\n y: 0.796875,\n },\n {\n x: 0.515625,\n y: 0.796875,\n },\n {\n x: 0.515625,\n y: 0.796875,\n },\n {\n x: 0.546875,\n y: 0.796875,\n },\n {\n x: 0.546875,\n y: 0.796875,\n },\n {\n x: 0.578125,\n y: 0.796875,\n },\n {\n x: 0.578125,\n y: 0.796875,\n },\n {\n x: 0.609375,\n y: 0.796875,\n },\n {\n x: 0.609375,\n y: 0.796875,\n },\n {\n x: 0.640625,\n y: 0.796875,\n },\n {\n x: 0.640625,\n y: 0.796875,\n },\n {\n x: 0.671875,\n y: 0.796875,\n },\n {\n x: 0.671875,\n y: 0.796875,\n },\n {\n x: 0.703125,\n y: 0.796875,\n },\n {\n x: 0.703125,\n y: 0.796875,\n },\n {\n x: 0.734375,\n y: 0.796875,\n },\n {\n x: 0.734375,\n y: 0.796875,\n },\n {\n x: 0.765625,\n y: 0.796875,\n },\n {\n x: 0.765625,\n y: 0.796875,\n },\n {\n x: 0.796875,\n y: 0.796875,\n },\n {\n x: 0.796875,\n y: 0.796875,\n },\n {\n x: 0.828125,\n y: 0.796875,\n },\n {\n x: 0.828125,\n y: 0.796875,\n },\n {\n x: 0.859375,\n y: 0.796875,\n },\n {\n x: 0.859375,\n y: 0.796875,\n },\n {\n x: 0.890625,\n y: 0.796875,\n },\n {\n x: 0.890625,\n y: 0.796875,\n },\n {\n x: 0.921875,\n y: 0.796875,\n },\n {\n x: 0.921875,\n y: 0.796875,\n },\n {\n x: 0.953125,\n y: 0.796875,\n },\n {\n x: 0.953125,\n y: 0.796875,\n },\n {\n x: 0.984375,\n y: 0.796875,\n },\n {\n x: 0.984375,\n y: 0.796875,\n },\n {\n x: 0.015625,\n y: 0.828125,\n },\n {\n x: 0.015625,\n y: 0.828125,\n },\n {\n x: 0.046875,\n y: 0.828125,\n },\n {\n x: 0.046875,\n y: 0.828125,\n },\n {\n x: 0.078125,\n y: 0.828125,\n },\n {\n x: 0.078125,\n y: 0.828125,\n },\n {\n x: 0.109375,\n y: 0.828125,\n },\n {\n x: 0.109375,\n y: 0.828125,\n },\n {\n x: 0.140625,\n y: 0.828125,\n },\n {\n x: 0.140625,\n y: 0.828125,\n },\n {\n x: 0.171875,\n y: 0.828125,\n },\n {\n x: 0.171875,\n y: 0.828125,\n },\n {\n x: 0.203125,\n y: 0.828125,\n },\n {\n x: 0.203125,\n y: 0.828125,\n },\n {\n x: 0.234375,\n y: 0.828125,\n },\n {\n x: 0.234375,\n y: 0.828125,\n },\n {\n x: 0.265625,\n y: 0.828125,\n },\n {\n x: 0.265625,\n y: 0.828125,\n },\n {\n x: 0.296875,\n y: 0.828125,\n },\n {\n x: 0.296875,\n y: 0.828125,\n },\n {\n x: 0.328125,\n y: 0.828125,\n },\n {\n x: 0.328125,\n y: 0.828125,\n },\n {\n x: 0.359375,\n y: 0.828125,\n },\n {\n x: 0.359375,\n y: 0.828125,\n },\n {\n x: 0.390625,\n y: 0.828125,\n },\n {\n x: 0.390625,\n y: 0.828125,\n },\n {\n x: 0.421875,\n y: 0.828125,\n },\n {\n x: 0.421875,\n y: 0.828125,\n },\n {\n x: 0.453125,\n y: 0.828125,\n },\n {\n x: 0.453125,\n y: 0.828125,\n },\n {\n x: 0.484375,\n y: 0.828125,\n },\n {\n x: 0.484375,\n y: 0.828125,\n },\n {\n x: 0.515625,\n y: 0.828125,\n },\n {\n x: 0.515625,\n y: 0.828125,\n },\n {\n x: 0.546875,\n y: 0.828125,\n },\n {\n x: 0.546875,\n y: 0.828125,\n },\n {\n x: 0.578125,\n y: 0.828125,\n },\n {\n x: 0.578125,\n y: 0.828125,\n },\n {\n x: 0.609375,\n y: 0.828125,\n },\n {\n x: 0.609375,\n y: 0.828125,\n },\n {\n x: 0.640625,\n y: 0.828125,\n },\n {\n x: 0.640625,\n y: 0.828125,\n },\n {\n x: 0.671875,\n y: 0.828125,\n },\n {\n x: 0.671875,\n y: 0.828125,\n },\n {\n x: 0.703125,\n y: 0.828125,\n },\n {\n x: 0.703125,\n y: 0.828125,\n },\n {\n x: 0.734375,\n y: 0.828125,\n },\n {\n x: 0.734375,\n y: 0.828125,\n },\n {\n x: 0.765625,\n y: 0.828125,\n },\n {\n x: 0.765625,\n y: 0.828125,\n },\n {\n x: 0.796875,\n y: 0.828125,\n },\n {\n x: 0.796875,\n y: 0.828125,\n },\n {\n x: 0.828125,\n y: 0.828125,\n },\n {\n x: 0.828125,\n y: 0.828125,\n },\n {\n x: 0.859375,\n y: 0.828125,\n },\n {\n x: 0.859375,\n y: 0.828125,\n },\n {\n x: 0.890625,\n y: 0.828125,\n },\n {\n x: 0.890625,\n y: 0.828125,\n },\n {\n x: 0.921875,\n y: 0.828125,\n },\n {\n x: 0.921875,\n y: 0.828125,\n },\n {\n x: 0.953125,\n y: 0.828125,\n },\n {\n x: 0.953125,\n y: 0.828125,\n },\n {\n x: 0.984375,\n y: 0.828125,\n },\n {\n x: 0.984375,\n y: 0.828125,\n },\n {\n x: 0.015625,\n y: 0.859375,\n },\n {\n x: 0.015625,\n y: 0.859375,\n },\n {\n x: 0.046875,\n y: 0.859375,\n },\n {\n x: 0.046875,\n y: 0.859375,\n },\n {\n x: 0.078125,\n y: 0.859375,\n },\n {\n x: 0.078125,\n y: 0.859375,\n },\n {\n x: 0.109375,\n y: 0.859375,\n },\n {\n x: 0.109375,\n y: 0.859375,\n },\n {\n x: 0.140625,\n y: 0.859375,\n },\n {\n x: 0.140625,\n y: 0.859375,\n },\n {\n x: 0.171875,\n y: 0.859375,\n },\n {\n x: 0.171875,\n y: 0.859375,\n },\n {\n x: 0.203125,\n y: 0.859375,\n },\n {\n x: 0.203125,\n y: 0.859375,\n },\n {\n x: 0.234375,\n y: 0.859375,\n },\n {\n x: 0.234375,\n y: 0.859375,\n },\n {\n x: 0.265625,\n y: 0.859375,\n },\n {\n x: 0.265625,\n y: 0.859375,\n },\n {\n x: 0.296875,\n y: 0.859375,\n },\n {\n x: 0.296875,\n y: 0.859375,\n },\n {\n x: 0.328125,\n y: 0.859375,\n },\n {\n x: 0.328125,\n y: 0.859375,\n },\n {\n x: 0.359375,\n y: 0.859375,\n },\n {\n x: 0.359375,\n y: 0.859375,\n },\n {\n x: 0.390625,\n y: 0.859375,\n },\n {\n x: 0.390625,\n y: 0.859375,\n },\n {\n x: 0.421875,\n y: 0.859375,\n },\n {\n x: 0.421875,\n y: 0.859375,\n },\n {\n x: 0.453125,\n y: 0.859375,\n },\n {\n x: 0.453125,\n y: 0.859375,\n },\n {\n x: 0.484375,\n y: 0.859375,\n },\n {\n x: 0.484375,\n y: 0.859375,\n },\n {\n x: 0.515625,\n y: 0.859375,\n },\n {\n x: 0.515625,\n y: 0.859375,\n },\n {\n x: 0.546875,\n y: 0.859375,\n },\n {\n x: 0.546875,\n y: 0.859375,\n },\n {\n x: 0.578125,\n y: 0.859375,\n },\n {\n x: 0.578125,\n y: 0.859375,\n },\n {\n x: 0.609375,\n y: 0.859375,\n },\n {\n x: 0.609375,\n y: 0.859375,\n },\n {\n x: 0.640625,\n y: 0.859375,\n },\n {\n x: 0.640625,\n y: 0.859375,\n },\n {\n x: 0.671875,\n y: 0.859375,\n },\n {\n x: 0.671875,\n y: 0.859375,\n },\n {\n x: 0.703125,\n y: 0.859375,\n },\n {\n x: 0.703125,\n y: 0.859375,\n },\n {\n x: 0.734375,\n y: 0.859375,\n },\n {\n x: 0.734375,\n y: 0.859375,\n },\n {\n x: 0.765625,\n y: 0.859375,\n },\n {\n x: 0.765625,\n y: 0.859375,\n },\n {\n x: 0.796875,\n y: 0.859375,\n },\n {\n x: 0.796875,\n y: 0.859375,\n },\n {\n x: 0.828125,\n y: 0.859375,\n },\n {\n x: 0.828125,\n y: 0.859375,\n },\n {\n x: 0.859375,\n y: 0.859375,\n },\n {\n x: 0.859375,\n y: 0.859375,\n },\n {\n x: 0.890625,\n y: 0.859375,\n },\n {\n x: 0.890625,\n y: 0.859375,\n },\n {\n x: 0.921875,\n y: 0.859375,\n },\n {\n x: 0.921875,\n y: 0.859375,\n },\n {\n x: 0.953125,\n y: 0.859375,\n },\n {\n x: 0.953125,\n y: 0.859375,\n },\n {\n x: 0.984375,\n y: 0.859375,\n },\n {\n x: 0.984375,\n y: 0.859375,\n },\n {\n x: 0.015625,\n y: 0.890625,\n },\n {\n x: 0.015625,\n y: 0.890625,\n },\n {\n x: 0.046875,\n y: 0.890625,\n },\n {\n x: 0.046875,\n y: 0.890625,\n },\n {\n x: 0.078125,\n y: 0.890625,\n },\n {\n x: 0.078125,\n y: 0.890625,\n },\n {\n x: 0.109375,\n y: 0.890625,\n },\n {\n x: 0.109375,\n y: 0.890625,\n },\n {\n x: 0.140625,\n y: 0.890625,\n },\n {\n x: 0.140625,\n y: 0.890625,\n },\n {\n x: 0.171875,\n y: 0.890625,\n },\n {\n x: 0.171875,\n y: 0.890625,\n },\n {\n x: 0.203125,\n y: 0.890625,\n },\n {\n x: 0.203125,\n y: 0.890625,\n },\n {\n x: 0.234375,\n y: 0.890625,\n },\n {\n x: 0.234375,\n y: 0.890625,\n },\n {\n x: 0.265625,\n y: 0.890625,\n },\n {\n x: 0.265625,\n y: 0.890625,\n },\n {\n x: 0.296875,\n y: 0.890625,\n },\n {\n x: 0.296875,\n y: 0.890625,\n },\n {\n x: 0.328125,\n y: 0.890625,\n },\n {\n x: 0.328125,\n y: 0.890625,\n },\n {\n x: 0.359375,\n y: 0.890625,\n },\n {\n x: 0.359375,\n y: 0.890625,\n },\n {\n x: 0.390625,\n y: 0.890625,\n },\n {\n x: 0.390625,\n y: 0.890625,\n },\n {\n x: 0.421875,\n y: 0.890625,\n },\n {\n x: 0.421875,\n y: 0.890625,\n },\n {\n x: 0.453125,\n y: 0.890625,\n },\n {\n x: 0.453125,\n y: 0.890625,\n },\n {\n x: 0.484375,\n y: 0.890625,\n },\n {\n x: 0.484375,\n y: 0.890625,\n },\n {\n x: 0.515625,\n y: 0.890625,\n },\n {\n x: 0.515625,\n y: 0.890625,\n },\n {\n x: 0.546875,\n y: 0.890625,\n },\n {\n x: 0.546875,\n y: 0.890625,\n },\n {\n x: 0.578125,\n y: 0.890625,\n },\n {\n x: 0.578125,\n y: 0.890625,\n },\n {\n x: 0.609375,\n y: 0.890625,\n },\n {\n x: 0.609375,\n y: 0.890625,\n },\n {\n x: 0.640625,\n y: 0.890625,\n },\n {\n x: 0.640625,\n y: 0.890625,\n },\n {\n x: 0.671875,\n y: 0.890625,\n },\n {\n x: 0.671875,\n y: 0.890625,\n },\n {\n x: 0.703125,\n y: 0.890625,\n },\n {\n x: 0.703125,\n y: 0.890625,\n },\n {\n x: 0.734375,\n y: 0.890625,\n },\n {\n x: 0.734375,\n y: 0.890625,\n },\n {\n x: 0.765625,\n y: 0.890625,\n },\n {\n x: 0.765625,\n y: 0.890625,\n },\n {\n x: 0.796875,\n y: 0.890625,\n },\n {\n x: 0.796875,\n y: 0.890625,\n },\n {\n x: 0.828125,\n y: 0.890625,\n },\n {\n x: 0.828125,\n y: 0.890625,\n },\n {\n x: 0.859375,\n y: 0.890625,\n },\n {\n x: 0.859375,\n y: 0.890625,\n },\n {\n x: 0.890625,\n y: 0.890625,\n },\n {\n x: 0.890625,\n y: 0.890625,\n },\n {\n x: 0.921875,\n y: 0.890625,\n },\n {\n x: 0.921875,\n y: 0.890625,\n },\n {\n x: 0.953125,\n y: 0.890625,\n },\n {\n x: 0.953125,\n y: 0.890625,\n },\n {\n x: 0.984375,\n y: 0.890625,\n },\n {\n x: 0.984375,\n y: 0.890625,\n },\n {\n x: 0.015625,\n y: 0.921875,\n },\n {\n x: 0.015625,\n y: 0.921875,\n },\n {\n x: 0.046875,\n y: 0.921875,\n },\n {\n x: 0.046875,\n y: 0.921875,\n },\n {\n x: 0.078125,\n y: 0.921875,\n },\n {\n x: 0.078125,\n y: 0.921875,\n },\n {\n x: 0.109375,\n y: 0.921875,\n },\n {\n x: 0.109375,\n y: 0.921875,\n },\n {\n x: 0.140625,\n y: 0.921875,\n },\n {\n x: 0.140625,\n y: 0.921875,\n },\n {\n x: 0.171875,\n y: 0.921875,\n },\n {\n x: 0.171875,\n y: 0.921875,\n },\n {\n x: 0.203125,\n y: 0.921875,\n },\n {\n x: 0.203125,\n y: 0.921875,\n },\n {\n x: 0.234375,\n y: 0.921875,\n },\n {\n x: 0.234375,\n y: 0.921875,\n },\n {\n x: 0.265625,\n y: 0.921875,\n },\n {\n x: 0.265625,\n y: 0.921875,\n },\n {\n x: 0.296875,\n y: 0.921875,\n },\n {\n x: 0.296875,\n y: 0.921875,\n },\n {\n x: 0.328125,\n y: 0.921875,\n },\n {\n x: 0.328125,\n y: 0.921875,\n },\n {\n x: 0.359375,\n y: 0.921875,\n },\n {\n x: 0.359375,\n y: 0.921875,\n },\n {\n x: 0.390625,\n y: 0.921875,\n },\n {\n x: 0.390625,\n y: 0.921875,\n },\n {\n x: 0.421875,\n y: 0.921875,\n },\n {\n x: 0.421875,\n y: 0.921875,\n },\n {\n x: 0.453125,\n y: 0.921875,\n },\n {\n x: 0.453125,\n y: 0.921875,\n },\n {\n x: 0.484375,\n y: 0.921875,\n },\n {\n x: 0.484375,\n y: 0.921875,\n },\n {\n x: 0.515625,\n y: 0.921875,\n },\n {\n x: 0.515625,\n y: 0.921875,\n },\n {\n x: 0.546875,\n y: 0.921875,\n },\n {\n x: 0.546875,\n y: 0.921875,\n },\n {\n x: 0.578125,\n y: 0.921875,\n },\n {\n x: 0.578125,\n y: 0.921875,\n },\n {\n x: 0.609375,\n y: 0.921875,\n },\n {\n x: 0.609375,\n y: 0.921875,\n },\n {\n x: 0.640625,\n y: 0.921875,\n },\n {\n x: 0.640625,\n y: 0.921875,\n },\n {\n x: 0.671875,\n y: 0.921875,\n },\n {\n x: 0.671875,\n y: 0.921875,\n },\n {\n x: 0.703125,\n y: 0.921875,\n },\n {\n x: 0.703125,\n y: 0.921875,\n },\n {\n x: 0.734375,\n y: 0.921875,\n },\n {\n x: 0.734375,\n y: 0.921875,\n },\n {\n x: 0.765625,\n y: 0.921875,\n },\n {\n x: 0.765625,\n y: 0.921875,\n },\n {\n x: 0.796875,\n y: 0.921875,\n },\n {\n x: 0.796875,\n y: 0.921875,\n },\n {\n x: 0.828125,\n y: 0.921875,\n },\n {\n x: 0.828125,\n y: 0.921875,\n },\n {\n x: 0.859375,\n y: 0.921875,\n },\n {\n x: 0.859375,\n y: 0.921875,\n },\n {\n x: 0.890625,\n y: 0.921875,\n },\n {\n x: 0.890625,\n y: 0.921875,\n },\n {\n x: 0.921875,\n y: 0.921875,\n },\n {\n x: 0.921875,\n y: 0.921875,\n },\n {\n x: 0.953125,\n y: 0.921875,\n },\n {\n x: 0.953125,\n y: 0.921875,\n },\n {\n x: 0.984375,\n y: 0.921875,\n },\n {\n x: 0.984375,\n y: 0.921875,\n },\n {\n x: 0.015625,\n y: 0.953125,\n },\n {\n x: 0.015625,\n y: 0.953125,\n },\n {\n x: 0.046875,\n y: 0.953125,\n },\n {\n x: 0.046875,\n y: 0.953125,\n },\n {\n x: 0.078125,\n y: 0.953125,\n },\n {\n x: 0.078125,\n y: 0.953125,\n },\n {\n x: 0.109375,\n y: 0.953125,\n },\n {\n x: 0.109375,\n y: 0.953125,\n },\n {\n x: 0.140625,\n y: 0.953125,\n },\n {\n x: 0.140625,\n y: 0.953125,\n },\n {\n x: 0.171875,\n y: 0.953125,\n },\n {\n x: 0.171875,\n y: 0.953125,\n },\n {\n x: 0.203125,\n y: 0.953125,\n },\n {\n x: 0.203125,\n y: 0.953125,\n },\n {\n x: 0.234375,\n y: 0.953125,\n },\n {\n x: 0.234375,\n y: 0.953125,\n },\n {\n x: 0.265625,\n y: 0.953125,\n },\n {\n x: 0.265625,\n y: 0.953125,\n },\n {\n x: 0.296875,\n y: 0.953125,\n },\n {\n x: 0.296875,\n y: 0.953125,\n },\n {\n x: 0.328125,\n y: 0.953125,\n },\n {\n x: 0.328125,\n y: 0.953125,\n },\n {\n x: 0.359375,\n y: 0.953125,\n },\n {\n x: 0.359375,\n y: 0.953125,\n },\n {\n x: 0.390625,\n y: 0.953125,\n },\n {\n x: 0.390625,\n y: 0.953125,\n },\n {\n x: 0.421875,\n y: 0.953125,\n },\n {\n x: 0.421875,\n y: 0.953125,\n },\n {\n x: 0.453125,\n y: 0.953125,\n },\n {\n x: 0.453125,\n y: 0.953125,\n },\n {\n x: 0.484375,\n y: 0.953125,\n },\n {\n x: 0.484375,\n y: 0.953125,\n },\n {\n x: 0.515625,\n y: 0.953125,\n },\n {\n x: 0.515625,\n y: 0.953125,\n },\n {\n x: 0.546875,\n y: 0.953125,\n },\n {\n x: 0.546875,\n y: 0.953125,\n },\n {\n x: 0.578125,\n y: 0.953125,\n },\n {\n x: 0.578125,\n y: 0.953125,\n },\n {\n x: 0.609375,\n y: 0.953125,\n },\n {\n x: 0.609375,\n y: 0.953125,\n },\n {\n x: 0.640625,\n y: 0.953125,\n },\n {\n x: 0.640625,\n y: 0.953125,\n },\n {\n x: 0.671875,\n y: 0.953125,\n },\n {\n x: 0.671875,\n y: 0.953125,\n },\n {\n x: 0.703125,\n y: 0.953125,\n },\n {\n x: 0.703125,\n y: 0.953125,\n },\n {\n x: 0.734375,\n y: 0.953125,\n },\n {\n x: 0.734375,\n y: 0.953125,\n },\n {\n x: 0.765625,\n y: 0.953125,\n },\n {\n x: 0.765625,\n y: 0.953125,\n },\n {\n x: 0.796875,\n y: 0.953125,\n },\n {\n x: 0.796875,\n y: 0.953125,\n },\n {\n x: 0.828125,\n y: 0.953125,\n },\n {\n x: 0.828125,\n y: 0.953125,\n },\n {\n x: 0.859375,\n y: 0.953125,\n },\n {\n x: 0.859375,\n y: 0.953125,\n },\n {\n x: 0.890625,\n y: 0.953125,\n },\n {\n x: 0.890625,\n y: 0.953125,\n },\n {\n x: 0.921875,\n y: 0.953125,\n },\n {\n x: 0.921875,\n y: 0.953125,\n },\n {\n x: 0.953125,\n y: 0.953125,\n },\n {\n x: 0.953125,\n y: 0.953125,\n },\n {\n x: 0.984375,\n y: 0.953125,\n },\n {\n x: 0.984375,\n y: 0.953125,\n },\n {\n x: 0.015625,\n y: 0.984375,\n },\n {\n x: 0.015625,\n y: 0.984375,\n },\n {\n x: 0.046875,\n y: 0.984375,\n },\n {\n x: 0.046875,\n y: 0.984375,\n },\n {\n x: 0.078125,\n y: 0.984375,\n },\n {\n x: 0.078125,\n y: 0.984375,\n },\n {\n x: 0.109375,\n y: 0.984375,\n },\n {\n x: 0.109375,\n y: 0.984375,\n },\n {\n x: 0.140625,\n y: 0.984375,\n },\n {\n x: 0.140625,\n y: 0.984375,\n },\n {\n x: 0.171875,\n y: 0.984375,\n },\n {\n x: 0.171875,\n y: 0.984375,\n },\n {\n x: 0.203125,\n y: 0.984375,\n },\n {\n x: 0.203125,\n y: 0.984375,\n },\n {\n x: 0.234375,\n y: 0.984375,\n },\n {\n x: 0.234375,\n y: 0.984375,\n },\n {\n x: 0.265625,\n y: 0.984375,\n },\n {\n x: 0.265625,\n y: 0.984375,\n },\n {\n x: 0.296875,\n y: 0.984375,\n },\n {\n x: 0.296875,\n y: 0.984375,\n },\n {\n x: 0.328125,\n y: 0.984375,\n },\n {\n x: 0.328125,\n y: 0.984375,\n },\n {\n x: 0.359375,\n y: 0.984375,\n },\n {\n x: 0.359375,\n y: 0.984375,\n },\n {\n x: 0.390625,\n y: 0.984375,\n },\n {\n x: 0.390625,\n y: 0.984375,\n },\n {\n x: 0.421875,\n y: 0.984375,\n },\n {\n x: 0.421875,\n y: 0.984375,\n },\n {\n x: 0.453125,\n y: 0.984375,\n },\n {\n x: 0.453125,\n y: 0.984375,\n },\n {\n x: 0.484375,\n y: 0.984375,\n },\n {\n x: 0.484375,\n y: 0.984375,\n },\n {\n x: 0.515625,\n y: 0.984375,\n },\n {\n x: 0.515625,\n y: 0.984375,\n },\n {\n x: 0.546875,\n y: 0.984375,\n },\n {\n x: 0.546875,\n y: 0.984375,\n },\n {\n x: 0.578125,\n y: 0.984375,\n },\n {\n x: 0.578125,\n y: 0.984375,\n },\n {\n x: 0.609375,\n y: 0.984375,\n },\n {\n x: 0.609375,\n y: 0.984375,\n },\n {\n x: 0.640625,\n y: 0.984375,\n },\n {\n x: 0.640625,\n y: 0.984375,\n },\n {\n x: 0.671875,\n y: 0.984375,\n },\n {\n x: 0.671875,\n y: 0.984375,\n },\n {\n x: 0.703125,\n y: 0.984375,\n },\n {\n x: 0.703125,\n y: 0.984375,\n },\n {\n x: 0.734375,\n y: 0.984375,\n },\n {\n x: 0.734375,\n y: 0.984375,\n },\n {\n x: 0.765625,\n y: 0.984375,\n },\n {\n x: 0.765625,\n y: 0.984375,\n },\n {\n x: 0.796875,\n y: 0.984375,\n },\n {\n x: 0.796875,\n y: 0.984375,\n },\n {\n x: 0.828125,\n y: 0.984375,\n },\n {\n x: 0.828125,\n y: 0.984375,\n },\n {\n x: 0.859375,\n y: 0.984375,\n },\n {\n x: 0.859375,\n y: 0.984375,\n },\n {\n x: 0.890625,\n y: 0.984375,\n },\n {\n x: 0.890625,\n y: 0.984375,\n },\n {\n x: 0.921875,\n y: 0.984375,\n },\n {\n x: 0.921875,\n y: 0.984375,\n },\n {\n x: 0.953125,\n y: 0.984375,\n },\n {\n x: 0.953125,\n y: 0.984375,\n },\n {\n x: 0.984375,\n y: 0.984375,\n },\n {\n x: 0.984375,\n y: 0.984375,\n },\n {\n x: 0.03125,\n y: 0.03125,\n },\n {\n x: 0.03125,\n y: 0.03125,\n },\n {\n x: 0.09375,\n y: 0.03125,\n },\n {\n x: 0.09375,\n y: 0.03125,\n },\n {\n x: 0.15625,\n y: 0.03125,\n },\n {\n x: 0.15625,\n y: 0.03125,\n },\n {\n x: 0.21875,\n y: 0.03125,\n },\n {\n x: 0.21875,\n y: 0.03125,\n },\n {\n x: 0.28125,\n y: 0.03125,\n },\n {\n x: 0.28125,\n y: 0.03125,\n },\n {\n x: 0.34375,\n y: 0.03125,\n },\n {\n x: 0.34375,\n y: 0.03125,\n },\n {\n x: 0.40625,\n y: 0.03125,\n },\n {\n x: 0.40625,\n y: 0.03125,\n },\n {\n x: 0.46875,\n y: 0.03125,\n },\n {\n x: 0.46875,\n y: 0.03125,\n },\n {\n x: 0.53125,\n y: 0.03125,\n },\n {\n x: 0.53125,\n y: 0.03125,\n },\n {\n x: 0.59375,\n y: 0.03125,\n },\n {\n x: 0.59375,\n y: 0.03125,\n },\n {\n x: 0.65625,\n y: 0.03125,\n },\n {\n x: 0.65625,\n y: 0.03125,\n },\n {\n x: 0.71875,\n y: 0.03125,\n },\n {\n x: 0.71875,\n y: 0.03125,\n },\n {\n x: 0.78125,\n y: 0.03125,\n },\n {\n x: 0.78125,\n y: 0.03125,\n },\n {\n x: 0.84375,\n y: 0.03125,\n },\n {\n x: 0.84375,\n y: 0.03125,\n },\n {\n x: 0.90625,\n y: 0.03125,\n },\n {\n x: 0.90625,\n y: 0.03125,\n },\n {\n x: 0.96875,\n y: 0.03125,\n },\n {\n x: 0.96875,\n y: 0.03125,\n },\n {\n x: 0.03125,\n y: 0.09375,\n },\n {\n x: 0.03125,\n y: 0.09375,\n },\n {\n x: 0.09375,\n y: 0.09375,\n },\n {\n x: 0.09375,\n y: 0.09375,\n },\n {\n x: 0.15625,\n y: 0.09375,\n },\n {\n x: 0.15625,\n y: 0.09375,\n },\n {\n x: 0.21875,\n y: 0.09375,\n },\n {\n x: 0.21875,\n y: 0.09375,\n },\n {\n x: 0.28125,\n y: 0.09375,\n },\n {\n x: 0.28125,\n y: 0.09375,\n },\n {\n x: 0.34375,\n y: 0.09375,\n },\n {\n x: 0.34375,\n y: 0.09375,\n },\n {\n x: 0.40625,\n y: 0.09375,\n },\n {\n x: 0.40625,\n y: 0.09375,\n },\n {\n x: 0.46875,\n y: 0.09375,\n },\n {\n x: 0.46875,\n y: 0.09375,\n },\n {\n x: 0.53125,\n y: 0.09375,\n },\n {\n x: 0.53125,\n y: 0.09375,\n },\n {\n x: 0.59375,\n y: 0.09375,\n },\n {\n x: 0.59375,\n y: 0.09375,\n },\n {\n x: 0.65625,\n y: 0.09375,\n },\n {\n x: 0.65625,\n y: 0.09375,\n },\n {\n x: 0.71875,\n y: 0.09375,\n },\n {\n x: 0.71875,\n y: 0.09375,\n },\n {\n x: 0.78125,\n y: 0.09375,\n },\n {\n x: 0.78125,\n y: 0.09375,\n },\n {\n x: 0.84375,\n y: 0.09375,\n },\n {\n x: 0.84375,\n y: 0.09375,\n },\n {\n x: 0.90625,\n y: 0.09375,\n },\n {\n x: 0.90625,\n y: 0.09375,\n },\n {\n x: 0.96875,\n y: 0.09375,\n },\n {\n x: 0.96875,\n y: 0.09375,\n },\n {\n x: 0.03125,\n y: 0.15625,\n },\n {\n x: 0.03125,\n y: 0.15625,\n },\n {\n x: 0.09375,\n y: 0.15625,\n },\n {\n x: 0.09375,\n y: 0.15625,\n },\n {\n x: 0.15625,\n y: 0.15625,\n },\n {\n x: 0.15625,\n y: 0.15625,\n },\n {\n x: 0.21875,\n y: 0.15625,\n },\n {\n x: 0.21875,\n y: 0.15625,\n },\n {\n x: 0.28125,\n y: 0.15625,\n },\n {\n x: 0.28125,\n y: 0.15625,\n },\n {\n x: 0.34375,\n y: 0.15625,\n },\n {\n x: 0.34375,\n y: 0.15625,\n },\n {\n x: 0.40625,\n y: 0.15625,\n },\n {\n x: 0.40625,\n y: 0.15625,\n },\n {\n x: 0.46875,\n y: 0.15625,\n },\n {\n x: 0.46875,\n y: 0.15625,\n },\n {\n x: 0.53125,\n y: 0.15625,\n },\n {\n x: 0.53125,\n y: 0.15625,\n },\n {\n x: 0.59375,\n y: 0.15625,\n },\n {\n x: 0.59375,\n y: 0.15625,\n },\n {\n x: 0.65625,\n y: 0.15625,\n },\n {\n x: 0.65625,\n y: 0.15625,\n },\n {\n x: 0.71875,\n y: 0.15625,\n },\n {\n x: 0.71875,\n y: 0.15625,\n },\n {\n x: 0.78125,\n y: 0.15625,\n },\n {\n x: 0.78125,\n y: 0.15625,\n },\n {\n x: 0.84375,\n y: 0.15625,\n },\n {\n x: 0.84375,\n y: 0.15625,\n },\n {\n x: 0.90625,\n y: 0.15625,\n },\n {\n x: 0.90625,\n y: 0.15625,\n },\n {\n x: 0.96875,\n y: 0.15625,\n },\n {\n x: 0.96875,\n y: 0.15625,\n },\n {\n x: 0.03125,\n y: 0.21875,\n },\n {\n x: 0.03125,\n y: 0.21875,\n },\n {\n x: 0.09375,\n y: 0.21875,\n },\n {\n x: 0.09375,\n y: 0.21875,\n },\n {\n x: 0.15625,\n y: 0.21875,\n },\n {\n x: 0.15625,\n y: 0.21875,\n },\n {\n x: 0.21875,\n y: 0.21875,\n },\n {\n x: 0.21875,\n y: 0.21875,\n },\n {\n x: 0.28125,\n y: 0.21875,\n },\n {\n x: 0.28125,\n y: 0.21875,\n },\n {\n x: 0.34375,\n y: 0.21875,\n },\n {\n x: 0.34375,\n y: 0.21875,\n },\n {\n x: 0.40625,\n y: 0.21875,\n },\n {\n x: 0.40625,\n y: 0.21875,\n },\n {\n x: 0.46875,\n y: 0.21875,\n },\n {\n x: 0.46875,\n y: 0.21875,\n },\n {\n x: 0.53125,\n y: 0.21875,\n },\n {\n x: 0.53125,\n y: 0.21875,\n },\n {\n x: 0.59375,\n y: 0.21875,\n },\n {\n x: 0.59375,\n y: 0.21875,\n },\n {\n x: 0.65625,\n y: 0.21875,\n },\n {\n x: 0.65625,\n y: 0.21875,\n },\n {\n x: 0.71875,\n y: 0.21875,\n },\n {\n x: 0.71875,\n y: 0.21875,\n },\n {\n x: 0.78125,\n y: 0.21875,\n },\n {\n x: 0.78125,\n y: 0.21875,\n },\n {\n x: 0.84375,\n y: 0.21875,\n },\n {\n x: 0.84375,\n y: 0.21875,\n },\n {\n x: 0.90625,\n y: 0.21875,\n },\n {\n x: 0.90625,\n y: 0.21875,\n },\n {\n x: 0.96875,\n y: 0.21875,\n },\n {\n x: 0.96875,\n y: 0.21875,\n },\n {\n x: 0.03125,\n y: 0.28125,\n },\n {\n x: 0.03125,\n y: 0.28125,\n },\n {\n x: 0.09375,\n y: 0.28125,\n },\n {\n x: 0.09375,\n y: 0.28125,\n },\n {\n x: 0.15625,\n y: 0.28125,\n },\n {\n x: 0.15625,\n y: 0.28125,\n },\n {\n x: 0.21875,\n y: 0.28125,\n },\n {\n x: 0.21875,\n y: 0.28125,\n },\n {\n x: 0.28125,\n y: 0.28125,\n },\n {\n x: 0.28125,\n y: 0.28125,\n },\n {\n x: 0.34375,\n y: 0.28125,\n },\n {\n x: 0.34375,\n y: 0.28125,\n },\n {\n x: 0.40625,\n y: 0.28125,\n },\n {\n x: 0.40625,\n y: 0.28125,\n },\n {\n x: 0.46875,\n y: 0.28125,\n },\n {\n x: 0.46875,\n y: 0.28125,\n },\n {\n x: 0.53125,\n y: 0.28125,\n },\n {\n x: 0.53125,\n y: 0.28125,\n },\n {\n x: 0.59375,\n y: 0.28125,\n },\n {\n x: 0.59375,\n y: 0.28125,\n },\n {\n x: 0.65625,\n y: 0.28125,\n },\n {\n x: 0.65625,\n y: 0.28125,\n },\n {\n x: 0.71875,\n y: 0.28125,\n },\n {\n x: 0.71875,\n y: 0.28125,\n },\n {\n x: 0.78125,\n y: 0.28125,\n },\n {\n x: 0.78125,\n y: 0.28125,\n },\n {\n x: 0.84375,\n y: 0.28125,\n },\n {\n x: 0.84375,\n y: 0.28125,\n },\n {\n x: 0.90625,\n y: 0.28125,\n },\n {\n x: 0.90625,\n y: 0.28125,\n },\n {\n x: 0.96875,\n y: 0.28125,\n },\n {\n x: 0.96875,\n y: 0.28125,\n },\n {\n x: 0.03125,\n y: 0.34375,\n },\n {\n x: 0.03125,\n y: 0.34375,\n },\n {\n x: 0.09375,\n y: 0.34375,\n },\n {\n x: 0.09375,\n y: 0.34375,\n },\n {\n x: 0.15625,\n y: 0.34375,\n },\n {\n x: 0.15625,\n y: 0.34375,\n },\n {\n x: 0.21875,\n y: 0.34375,\n },\n {\n x: 0.21875,\n y: 0.34375,\n },\n {\n x: 0.28125,\n y: 0.34375,\n },\n {\n x: 0.28125,\n y: 0.34375,\n },\n {\n x: 0.34375,\n y: 0.34375,\n },\n {\n x: 0.34375,\n y: 0.34375,\n },\n {\n x: 0.40625,\n y: 0.34375,\n },\n {\n x: 0.40625,\n y: 0.34375,\n },\n {\n x: 0.46875,\n y: 0.34375,\n },\n {\n x: 0.46875,\n y: 0.34375,\n },\n {\n x: 0.53125,\n y: 0.34375,\n },\n {\n x: 0.53125,\n y: 0.34375,\n },\n {\n x: 0.59375,\n y: 0.34375,\n },\n {\n x: 0.59375,\n y: 0.34375,\n },\n {\n x: 0.65625,\n y: 0.34375,\n },\n {\n x: 0.65625,\n y: 0.34375,\n },\n {\n x: 0.71875,\n y: 0.34375,\n },\n {\n x: 0.71875,\n y: 0.34375,\n },\n {\n x: 0.78125,\n y: 0.34375,\n },\n {\n x: 0.78125,\n y: 0.34375,\n },\n {\n x: 0.84375,\n y: 0.34375,\n },\n {\n x: 0.84375,\n y: 0.34375,\n },\n {\n x: 0.90625,\n y: 0.34375,\n },\n {\n x: 0.90625,\n y: 0.34375,\n },\n {\n x: 0.96875,\n y: 0.34375,\n },\n {\n x: 0.96875,\n y: 0.34375,\n },\n {\n x: 0.03125,\n y: 0.40625,\n },\n {\n x: 0.03125,\n y: 0.40625,\n },\n {\n x: 0.09375,\n y: 0.40625,\n },\n {\n x: 0.09375,\n y: 0.40625,\n },\n {\n x: 0.15625,\n y: 0.40625,\n },\n {\n x: 0.15625,\n y: 0.40625,\n },\n {\n x: 0.21875,\n y: 0.40625,\n },\n {\n x: 0.21875,\n y: 0.40625,\n },\n {\n x: 0.28125,\n y: 0.40625,\n },\n {\n x: 0.28125,\n y: 0.40625,\n },\n {\n x: 0.34375,\n y: 0.40625,\n },\n {\n x: 0.34375,\n y: 0.40625,\n },\n {\n x: 0.40625,\n y: 0.40625,\n },\n {\n x: 0.40625,\n y: 0.40625,\n },\n {\n x: 0.46875,\n y: 0.40625,\n },\n {\n x: 0.46875,\n y: 0.40625,\n },\n {\n x: 0.53125,\n y: 0.40625,\n },\n {\n x: 0.53125,\n y: 0.40625,\n },\n {\n x: 0.59375,\n y: 0.40625,\n },\n {\n x: 0.59375,\n y: 0.40625,\n },\n {\n x: 0.65625,\n y: 0.40625,\n },\n {\n x: 0.65625,\n y: 0.40625,\n },\n {\n x: 0.71875,\n y: 0.40625,\n },\n {\n x: 0.71875,\n y: 0.40625,\n },\n {\n x: 0.78125,\n y: 0.40625,\n },\n {\n x: 0.78125,\n y: 0.40625,\n },\n {\n x: 0.84375,\n y: 0.40625,\n },\n {\n x: 0.84375,\n y: 0.40625,\n },\n {\n x: 0.90625,\n y: 0.40625,\n },\n {\n x: 0.90625,\n y: 0.40625,\n },\n {\n x: 0.96875,\n y: 0.40625,\n },\n {\n x: 0.96875,\n y: 0.40625,\n },\n {\n x: 0.03125,\n y: 0.46875,\n },\n {\n x: 0.03125,\n y: 0.46875,\n },\n {\n x: 0.09375,\n y: 0.46875,\n },\n {\n x: 0.09375,\n y: 0.46875,\n },\n {\n x: 0.15625,\n y: 0.46875,\n },\n {\n x: 0.15625,\n y: 0.46875,\n },\n {\n x: 0.21875,\n y: 0.46875,\n },\n {\n x: 0.21875,\n y: 0.46875,\n },\n {\n x: 0.28125,\n y: 0.46875,\n },\n {\n x: 0.28125,\n y: 0.46875,\n },\n {\n x: 0.34375,\n y: 0.46875,\n },\n {\n x: 0.34375,\n y: 0.46875,\n },\n {\n x: 0.40625,\n y: 0.46875,\n },\n {\n x: 0.40625,\n y: 0.46875,\n },\n {\n x: 0.46875,\n y: 0.46875,\n },\n {\n x: 0.46875,\n y: 0.46875,\n },\n {\n x: 0.53125,\n y: 0.46875,\n },\n {\n x: 0.53125,\n y: 0.46875,\n },\n {\n x: 0.59375,\n y: 0.46875,\n },\n {\n x: 0.59375,\n y: 0.46875,\n },\n {\n x: 0.65625,\n y: 0.46875,\n },\n {\n x: 0.65625,\n y: 0.46875,\n },\n {\n x: 0.71875,\n y: 0.46875,\n },\n {\n x: 0.71875,\n y: 0.46875,\n },\n {\n x: 0.78125,\n y: 0.46875,\n },\n {\n x: 0.78125,\n y: 0.46875,\n },\n {\n x: 0.84375,\n y: 0.46875,\n },\n {\n x: 0.84375,\n y: 0.46875,\n },\n {\n x: 0.90625,\n y: 0.46875,\n },\n {\n x: 0.90625,\n y: 0.46875,\n },\n {\n x: 0.96875,\n y: 0.46875,\n },\n {\n x: 0.96875,\n y: 0.46875,\n },\n {\n x: 0.03125,\n y: 0.53125,\n },\n {\n x: 0.03125,\n y: 0.53125,\n },\n {\n x: 0.09375,\n y: 0.53125,\n },\n {\n x: 0.09375,\n y: 0.53125,\n },\n {\n x: 0.15625,\n y: 0.53125,\n },\n {\n x: 0.15625,\n y: 0.53125,\n },\n {\n x: 0.21875,\n y: 0.53125,\n },\n {\n x: 0.21875,\n y: 0.53125,\n },\n {\n x: 0.28125,\n y: 0.53125,\n },\n {\n x: 0.28125,\n y: 0.53125,\n },\n {\n x: 0.34375,\n y: 0.53125,\n },\n {\n x: 0.34375,\n y: 0.53125,\n },\n {\n x: 0.40625,\n y: 0.53125,\n },\n {\n x: 0.40625,\n y: 0.53125,\n },\n {\n x: 0.46875,\n y: 0.53125,\n },\n {\n x: 0.46875,\n y: 0.53125,\n },\n {\n x: 0.53125,\n y: 0.53125,\n },\n {\n x: 0.53125,\n y: 0.53125,\n },\n {\n x: 0.59375,\n y: 0.53125,\n },\n {\n x: 0.59375,\n y: 0.53125,\n },\n {\n x: 0.65625,\n y: 0.53125,\n },\n {\n x: 0.65625,\n y: 0.53125,\n },\n {\n x: 0.71875,\n y: 0.53125,\n },\n {\n x: 0.71875,\n y: 0.53125,\n },\n {\n x: 0.78125,\n y: 0.53125,\n },\n {\n x: 0.78125,\n y: 0.53125,\n },\n {\n x: 0.84375,\n y: 0.53125,\n },\n {\n x: 0.84375,\n y: 0.53125,\n },\n {\n x: 0.90625,\n y: 0.53125,\n },\n {\n x: 0.90625,\n y: 0.53125,\n },\n {\n x: 0.96875,\n y: 0.53125,\n },\n {\n x: 0.96875,\n y: 0.53125,\n },\n {\n x: 0.03125,\n y: 0.59375,\n },\n {\n x: 0.03125,\n y: 0.59375,\n },\n {\n x: 0.09375,\n y: 0.59375,\n },\n {\n x: 0.09375,\n y: 0.59375,\n },\n {\n x: 0.15625,\n y: 0.59375,\n },\n {\n x: 0.15625,\n y: 0.59375,\n },\n {\n x: 0.21875,\n y: 0.59375,\n },\n {\n x: 0.21875,\n y: 0.59375,\n },\n {\n x: 0.28125,\n y: 0.59375,\n },\n {\n x: 0.28125,\n y: 0.59375,\n },\n {\n x: 0.34375,\n y: 0.59375,\n },\n {\n x: 0.34375,\n y: 0.59375,\n },\n {\n x: 0.40625,\n y: 0.59375,\n },\n {\n x: 0.40625,\n y: 0.59375,\n },\n {\n x: 0.46875,\n y: 0.59375,\n },\n {\n x: 0.46875,\n y: 0.59375,\n },\n {\n x: 0.53125,\n y: 0.59375,\n },\n {\n x: 0.53125,\n y: 0.59375,\n },\n {\n x: 0.59375,\n y: 0.59375,\n },\n {\n x: 0.59375,\n y: 0.59375,\n },\n {\n x: 0.65625,\n y: 0.59375,\n },\n {\n x: 0.65625,\n y: 0.59375,\n },\n {\n x: 0.71875,\n y: 0.59375,\n },\n {\n x: 0.71875,\n y: 0.59375,\n },\n {\n x: 0.78125,\n y: 0.59375,\n },\n {\n x: 0.78125,\n y: 0.59375,\n },\n {\n x: 0.84375,\n y: 0.59375,\n },\n {\n x: 0.84375,\n y: 0.59375,\n },\n {\n x: 0.90625,\n y: 0.59375,\n },\n {\n x: 0.90625,\n y: 0.59375,\n },\n {\n x: 0.96875,\n y: 0.59375,\n },\n {\n x: 0.96875,\n y: 0.59375,\n },\n {\n x: 0.03125,\n y: 0.65625,\n },\n {\n x: 0.03125,\n y: 0.65625,\n },\n {\n x: 0.09375,\n y: 0.65625,\n },\n {\n x: 0.09375,\n y: 0.65625,\n },\n {\n x: 0.15625,\n y: 0.65625,\n },\n {\n x: 0.15625,\n y: 0.65625,\n },\n {\n x: 0.21875,\n y: 0.65625,\n },\n {\n x: 0.21875,\n y: 0.65625,\n },\n {\n x: 0.28125,\n y: 0.65625,\n },\n {\n x: 0.28125,\n y: 0.65625,\n },\n {\n x: 0.34375,\n y: 0.65625,\n },\n {\n x: 0.34375,\n y: 0.65625,\n },\n {\n x: 0.40625,\n y: 0.65625,\n },\n {\n x: 0.40625,\n y: 0.65625,\n },\n {\n x: 0.46875,\n y: 0.65625,\n },\n {\n x: 0.46875,\n y: 0.65625,\n },\n {\n x: 0.53125,\n y: 0.65625,\n },\n {\n x: 0.53125,\n y: 0.65625,\n },\n {\n x: 0.59375,\n y: 0.65625,\n },\n {\n x: 0.59375,\n y: 0.65625,\n },\n {\n x: 0.65625,\n y: 0.65625,\n },\n {\n x: 0.65625,\n y: 0.65625,\n },\n {\n x: 0.71875,\n y: 0.65625,\n },\n {\n x: 0.71875,\n y: 0.65625,\n },\n {\n x: 0.78125,\n y: 0.65625,\n },\n {\n x: 0.78125,\n y: 0.65625,\n },\n {\n x: 0.84375,\n y: 0.65625,\n },\n {\n x: 0.84375,\n y: 0.65625,\n },\n {\n x: 0.90625,\n y: 0.65625,\n },\n {\n x: 0.90625,\n y: 0.65625,\n },\n {\n x: 0.96875,\n y: 0.65625,\n },\n {\n x: 0.96875,\n y: 0.65625,\n },\n {\n x: 0.03125,\n y: 0.71875,\n },\n {\n x: 0.03125,\n y: 0.71875,\n },\n {\n x: 0.09375,\n y: 0.71875,\n },\n {\n x: 0.09375,\n y: 0.71875,\n },\n {\n x: 0.15625,\n y: 0.71875,\n },\n {\n x: 0.15625,\n y: 0.71875,\n },\n {\n x: 0.21875,\n y: 0.71875,\n },\n {\n x: 0.21875,\n y: 0.71875,\n },\n {\n x: 0.28125,\n y: 0.71875,\n },\n {\n x: 0.28125,\n y: 0.71875,\n },\n {\n x: 0.34375,\n y: 0.71875,\n },\n {\n x: 0.34375,\n y: 0.71875,\n },\n {\n x: 0.40625,\n y: 0.71875,\n },\n {\n x: 0.40625,\n y: 0.71875,\n },\n {\n x: 0.46875,\n y: 0.71875,\n },\n {\n x: 0.46875,\n y: 0.71875,\n },\n {\n x: 0.53125,\n y: 0.71875,\n },\n {\n x: 0.53125,\n y: 0.71875,\n },\n {\n x: 0.59375,\n y: 0.71875,\n },\n {\n x: 0.59375,\n y: 0.71875,\n },\n {\n x: 0.65625,\n y: 0.71875,\n },\n {\n x: 0.65625,\n y: 0.71875,\n },\n {\n x: 0.71875,\n y: 0.71875,\n },\n {\n x: 0.71875,\n y: 0.71875,\n },\n {\n x: 0.78125,\n y: 0.71875,\n },\n {\n x: 0.78125,\n y: 0.71875,\n },\n {\n x: 0.84375,\n y: 0.71875,\n },\n {\n x: 0.84375,\n y: 0.71875,\n },\n {\n x: 0.90625,\n y: 0.71875,\n },\n {\n x: 0.90625,\n y: 0.71875,\n },\n {\n x: 0.96875,\n y: 0.71875,\n },\n {\n x: 0.96875,\n y: 0.71875,\n },\n {\n x: 0.03125,\n y: 0.78125,\n },\n {\n x: 0.03125,\n y: 0.78125,\n },\n {\n x: 0.09375,\n y: 0.78125,\n },\n {\n x: 0.09375,\n y: 0.78125,\n },\n {\n x: 0.15625,\n y: 0.78125,\n },\n {\n x: 0.15625,\n y: 0.78125,\n },\n {\n x: 0.21875,\n y: 0.78125,\n },\n {\n x: 0.21875,\n y: 0.78125,\n },\n {\n x: 0.28125,\n y: 0.78125,\n },\n {\n x: 0.28125,\n y: 0.78125,\n },\n {\n x: 0.34375,\n y: 0.78125,\n },\n {\n x: 0.34375,\n y: 0.78125,\n },\n {\n x: 0.40625,\n y: 0.78125,\n },\n {\n x: 0.40625,\n y: 0.78125,\n },\n {\n x: 0.46875,\n y: 0.78125,\n },\n {\n x: 0.46875,\n y: 0.78125,\n },\n {\n x: 0.53125,\n y: 0.78125,\n },\n {\n x: 0.53125,\n y: 0.78125,\n },\n {\n x: 0.59375,\n y: 0.78125,\n },\n {\n x: 0.59375,\n y: 0.78125,\n },\n {\n x: 0.65625,\n y: 0.78125,\n },\n {\n x: 0.65625,\n y: 0.78125,\n },\n {\n x: 0.71875,\n y: 0.78125,\n },\n {\n x: 0.71875,\n y: 0.78125,\n },\n {\n x: 0.78125,\n y: 0.78125,\n },\n {\n x: 0.78125,\n y: 0.78125,\n },\n {\n x: 0.84375,\n y: 0.78125,\n },\n {\n x: 0.84375,\n y: 0.78125,\n },\n {\n x: 0.90625,\n y: 0.78125,\n },\n {\n x: 0.90625,\n y: 0.78125,\n },\n {\n x: 0.96875,\n y: 0.78125,\n },\n {\n x: 0.96875,\n y: 0.78125,\n },\n {\n x: 0.03125,\n y: 0.84375,\n },\n {\n x: 0.03125,\n y: 0.84375,\n },\n {\n x: 0.09375,\n y: 0.84375,\n },\n {\n x: 0.09375,\n y: 0.84375,\n },\n {\n x: 0.15625,\n y: 0.84375,\n },\n {\n x: 0.15625,\n y: 0.84375,\n },\n {\n x: 0.21875,\n y: 0.84375,\n },\n {\n x: 0.21875,\n y: 0.84375,\n },\n {\n x: 0.28125,\n y: 0.84375,\n },\n {\n x: 0.28125,\n y: 0.84375,\n },\n {\n x: 0.34375,\n y: 0.84375,\n },\n {\n x: 0.34375,\n y: 0.84375,\n },\n {\n x: 0.40625,\n y: 0.84375,\n },\n {\n x: 0.40625,\n y: 0.84375,\n },\n {\n x: 0.46875,\n y: 0.84375,\n },\n {\n x: 0.46875,\n y: 0.84375,\n },\n {\n x: 0.53125,\n y: 0.84375,\n },\n {\n x: 0.53125,\n y: 0.84375,\n },\n {\n x: 0.59375,\n y: 0.84375,\n },\n {\n x: 0.59375,\n y: 0.84375,\n },\n {\n x: 0.65625,\n y: 0.84375,\n },\n {\n x: 0.65625,\n y: 0.84375,\n },\n {\n x: 0.71875,\n y: 0.84375,\n },\n {\n x: 0.71875,\n y: 0.84375,\n },\n {\n x: 0.78125,\n y: 0.84375,\n },\n {\n x: 0.78125,\n y: 0.84375,\n },\n {\n x: 0.84375,\n y: 0.84375,\n },\n {\n x: 0.84375,\n y: 0.84375,\n },\n {\n x: 0.90625,\n y: 0.84375,\n },\n {\n x: 0.90625,\n y: 0.84375,\n },\n {\n x: 0.96875,\n y: 0.84375,\n },\n {\n x: 0.96875,\n y: 0.84375,\n },\n {\n x: 0.03125,\n y: 0.90625,\n },\n {\n x: 0.03125,\n y: 0.90625,\n },\n {\n x: 0.09375,\n y: 0.90625,\n },\n {\n x: 0.09375,\n y: 0.90625,\n },\n {\n x: 0.15625,\n y: 0.90625,\n },\n {\n x: 0.15625,\n y: 0.90625,\n },\n {\n x: 0.21875,\n y: 0.90625,\n },\n {\n x: 0.21875,\n y: 0.90625,\n },\n {\n x: 0.28125,\n y: 0.90625,\n },\n {\n x: 0.28125,\n y: 0.90625,\n },\n {\n x: 0.34375,\n y: 0.90625,\n },\n {\n x: 0.34375,\n y: 0.90625,\n },\n {\n x: 0.40625,\n y: 0.90625,\n },\n {\n x: 0.40625,\n y: 0.90625,\n },\n {\n x: 0.46875,\n y: 0.90625,\n },\n {\n x: 0.46875,\n y: 0.90625,\n },\n {\n x: 0.53125,\n y: 0.90625,\n },\n {\n x: 0.53125,\n y: 0.90625,\n },\n {\n x: 0.59375,\n y: 0.90625,\n },\n {\n x: 0.59375,\n y: 0.90625,\n },\n {\n x: 0.65625,\n y: 0.90625,\n },\n {\n x: 0.65625,\n y: 0.90625,\n },\n {\n x: 0.71875,\n y: 0.90625,\n },\n {\n x: 0.71875,\n y: 0.90625,\n },\n {\n x: 0.78125,\n y: 0.90625,\n },\n {\n x: 0.78125,\n y: 0.90625,\n },\n {\n x: 0.84375,\n y: 0.90625,\n },\n {\n x: 0.84375,\n y: 0.90625,\n },\n {\n x: 0.90625,\n y: 0.90625,\n },\n {\n x: 0.90625,\n y: 0.90625,\n },\n {\n x: 0.96875,\n y: 0.90625,\n },\n {\n x: 0.96875,\n y: 0.90625,\n },\n {\n x: 0.03125,\n y: 0.96875,\n },\n {\n x: 0.03125,\n y: 0.96875,\n },\n {\n x: 0.09375,\n y: 0.96875,\n },\n {\n x: 0.09375,\n y: 0.96875,\n },\n {\n x: 0.15625,\n y: 0.96875,\n },\n {\n x: 0.15625,\n y: 0.96875,\n },\n {\n x: 0.21875,\n y: 0.96875,\n },\n {\n x: 0.21875,\n y: 0.96875,\n },\n {\n x: 0.28125,\n y: 0.96875,\n },\n {\n x: 0.28125,\n y: 0.96875,\n },\n {\n x: 0.34375,\n y: 0.96875,\n },\n {\n x: 0.34375,\n y: 0.96875,\n },\n {\n x: 0.40625,\n y: 0.96875,\n },\n {\n x: 0.40625,\n y: 0.96875,\n },\n {\n x: 0.46875,\n y: 0.96875,\n },\n {\n x: 0.46875,\n y: 0.96875,\n },\n {\n x: 0.53125,\n y: 0.96875,\n },\n {\n x: 0.53125,\n y: 0.96875,\n },\n {\n x: 0.59375,\n y: 0.96875,\n },\n {\n x: 0.59375,\n y: 0.96875,\n },\n {\n x: 0.65625,\n y: 0.96875,\n },\n {\n x: 0.65625,\n y: 0.96875,\n },\n {\n x: 0.71875,\n y: 0.96875,\n },\n {\n x: 0.71875,\n y: 0.96875,\n },\n {\n x: 0.78125,\n y: 0.96875,\n },\n {\n x: 0.78125,\n y: 0.96875,\n },\n {\n x: 0.84375,\n y: 0.96875,\n },\n {\n x: 0.84375,\n y: 0.96875,\n },\n {\n x: 0.90625,\n y: 0.96875,\n },\n {\n x: 0.90625,\n y: 0.96875,\n },\n {\n x: 0.96875,\n y: 0.96875,\n },\n {\n x: 0.96875,\n y: 0.96875,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.1875,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.3125,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.4375,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.5625,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.6875,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.8125,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.9375,\n y: 0.0625,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.1875,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.3125,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.4375,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.5625,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.6875,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.8125,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.9375,\n y: 0.1875,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.1875,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.3125,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.4375,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.5625,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.6875,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.8125,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.9375,\n y: 0.3125,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.1875,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.3125,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.4375,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.5625,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.6875,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.8125,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.9375,\n y: 0.4375,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.1875,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.3125,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.4375,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.5625,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.6875,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.8125,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.9375,\n y: 0.5625,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.1875,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.3125,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.4375,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.5625,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.6875,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.8125,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.9375,\n y: 0.6875,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.1875,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.3125,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.4375,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.5625,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.6875,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.8125,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.9375,\n y: 0.8125,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.0625,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.1875,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.3125,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.4375,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.5625,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.6875,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.8125,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n {\n x: 0.9375,\n y: 0.9375,\n },\n];\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as anchors from './anchors';\n\nexport class HandDetector {\n model: any;\n anchors: any;\n anchorsTensor: any;\n inputSize: number;\n inputSizeTensor: any;\n doubleInputSizeTensor: any;\n\n constructor(model) {\n this.model = model;\n this.anchors = anchors.anchors.map((anchor) => [anchor.x, anchor.y]);\n this.anchorsTensor = tf.tensor2d(this.anchors);\n this.inputSize = this.model?.inputs[0].shape[2];\n this.inputSizeTensor = tf.tensor1d([this.inputSize, this.inputSize]);\n this.doubleInputSizeTensor = tf.tensor1d([this.inputSize * 2, this.inputSize * 2]);\n }\n\n normalizeBoxes(boxes) {\n return tf.tidy(() => {\n const boxOffsets = tf.slice(boxes, [0, 0], [-1, 2]);\n const boxSizes = tf.slice(boxes, [0, 2], [-1, 2]);\n const boxCenterPoints = tf.add(tf.div(boxOffsets, this.inputSizeTensor), this.anchorsTensor);\n const halfBoxSizes = tf.div(boxSizes, this.doubleInputSizeTensor);\n const startPoints = tf.mul(tf.sub(boxCenterPoints, halfBoxSizes), this.inputSizeTensor);\n const endPoints = tf.mul(tf.add(boxCenterPoints, halfBoxSizes), this.inputSizeTensor);\n return tf.concat2d([startPoints, endPoints], 1);\n });\n }\n\n normalizeLandmarks(rawPalmLandmarks, index) {\n return tf.tidy(() => {\n const landmarks = tf.add(tf.div(rawPalmLandmarks.reshape([-1, 7, 2]), this.inputSizeTensor), this.anchors[index]);\n return tf.mul(landmarks, this.inputSizeTensor);\n });\n }\n\n async getBoxes(input, config) {\n const batched = this.model.predict(input);\n const predictions = batched.squeeze();\n batched.dispose();\n const scoresT = tf.tidy(() => tf.sigmoid(tf.slice(predictions, [0, 0], [-1, 1])).squeeze());\n const scores = scoresT.dataSync();\n const rawBoxes = tf.slice(predictions, [0, 1], [-1, 4]);\n const boxes = this.normalizeBoxes(rawBoxes);\n rawBoxes.dispose();\n const filteredT = await tf.image.nonMaxSuppressionAsync(boxes, scores, config.hand.maxDetected, config.hand.iouThreshold, config.hand.minConfidence);\n const filtered = filteredT.arraySync();\n\n scoresT.dispose();\n filteredT.dispose();\n const hands: Array<{ box: any, palmLandmarks: any, confidence: number }> = [];\n for (const index of filtered) {\n if (scores[index] >= config.hand.minConfidence) {\n const matchingBox = tf.slice(boxes, [index, 0], [1, -1]);\n const rawPalmLandmarks = tf.slice(predictions, [index, 5], [1, 14]);\n const palmLandmarks = tf.tidy(() => this.normalizeLandmarks(rawPalmLandmarks, index).reshape([-1, 2]));\n rawPalmLandmarks.dispose();\n hands.push({ box: matchingBox, palmLandmarks, confidence: scores[index] });\n }\n }\n predictions.dispose();\n boxes.dispose();\n return hands;\n }\n\n async estimateHandBounds(input, config) {\n const inputHeight = input.shape[1];\n const inputWidth = input.shape[2];\n const image = tf.tidy(() => input.resizeBilinear([this.inputSize, this.inputSize]).div(127.5).sub(1));\n const predictions = await this.getBoxes(image, config);\n image.dispose();\n const hands: Array<{}> = [];\n if (!predictions || predictions.length === 0) return hands;\n for (const prediction of predictions) {\n const boxes = prediction.box.dataSync();\n const startPoint = boxes.slice(0, 2);\n const endPoint = boxes.slice(2, 4);\n const palmLandmarks = prediction.palmLandmarks.arraySync();\n prediction.box.dispose();\n prediction.palmLandmarks.dispose();\n hands.push(box.scaleBoxCoordinates({ startPoint, endPoint, palmLandmarks, confidence: prediction.confidence }, [inputWidth / this.inputSize, inputHeight / this.inputSize]));\n }\n return hands;\n }\n}\n", "export function normalizeRadians(angle) {\n return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI));\n}\n\nexport function computeRotation(point1, point2) {\n const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]);\n return normalizeRadians(radians);\n}\n\nexport const buildTranslationMatrix = (x, y) => [[1, 0, x], [0, 1, y], [0, 0, 1]];\n\nexport function dot(v1, v2) {\n let product = 0;\n for (let i = 0; i < v1.length; i++) {\n product += v1[i] * v2[i];\n }\n return product;\n}\n\nexport function getColumnFrom2DArr(arr, columnIndex) {\n const column: Array = [];\n for (let i = 0; i < arr.length; i++) {\n column.push(arr[i][columnIndex]);\n }\n return column;\n}\n\nexport function multiplyTransformMatrices(mat1, mat2) {\n const product: Array = [];\n const size = mat1.length;\n for (let row = 0; row < size; row++) {\n product.push([]);\n for (let col = 0; col < size; col++) {\n product[row].push(dot(mat1[row], getColumnFrom2DArr(mat2, col)));\n }\n }\n return product;\n}\n\nexport function buildRotationMatrix(rotation, center) {\n const cosA = Math.cos(rotation);\n const sinA = Math.sin(rotation);\n const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]];\n const translationMatrix = buildTranslationMatrix(center[0], center[1]);\n const translationTimesRotation = multiplyTransformMatrices(translationMatrix, rotationMatrix);\n const negativeTranslationMatrix = buildTranslationMatrix(-center[0], -center[1]);\n return multiplyTransformMatrices(translationTimesRotation, negativeTranslationMatrix);\n}\n\nexport function invertTransformMatrix(matrix) {\n const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]];\n const translationComponent = [matrix[0][2], matrix[1][2]];\n const invertedTranslation = [\n -dot(rotationComponent[0], translationComponent),\n -dot(rotationComponent[1], translationComponent),\n ];\n return [\n rotationComponent[0].concat(invertedTranslation[0]),\n rotationComponent[1].concat(invertedTranslation[1]),\n [0, 0, 1],\n ];\n}\n\nexport function rotatePoint(homogeneousCoordinate, rotationMatrix) {\n return [\n dot(homogeneousCoordinate, rotationMatrix[0]),\n dot(homogeneousCoordinate, rotationMatrix[1]),\n ];\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as box from './box';\nimport * as util from './util';\n\nconst palmBoxEnlargeFactor = 5; // default 3\nconst handBoxEnlargeFactor = 1.65; // default 1.65\nconst palmLandmarkIds = [0, 5, 9, 13, 17, 1, 2];\nconst palmLandmarksPalmBase = 0;\nconst palmLandmarksMiddleFingerBase = 2;\n\nexport class HandPipeline {\n handDetector: any;\n landmarkDetector: any;\n inputSize: number;\n storedBoxes: any;\n skipped: number;\n detectedHands: number;\n\n constructor(handDetector, landmarkDetector) {\n this.handDetector = handDetector;\n this.landmarkDetector = landmarkDetector;\n this.inputSize = this.landmarkDetector?.inputs[0].shape[2];\n this.storedBoxes = [];\n this.skipped = 0;\n this.detectedHands = 0;\n }\n\n // eslint-disable-next-line class-methods-use-this\n calculateLandmarksBoundingBox(landmarks) {\n const xs = landmarks.map((d) => d[0]);\n const ys = landmarks.map((d) => d[1]);\n const startPoint = [Math.min(...xs), Math.min(...ys)];\n const endPoint = [Math.max(...xs), Math.max(...ys)];\n return { startPoint, endPoint };\n }\n\n getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) {\n const rotatedPalmLandmarks = palmLandmarks.map((coord) => util.rotatePoint([...coord, 1], rotationMatrix));\n const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks);\n return box.enlargeBox(box.squarifyBox(boxAroundPalm), palmBoxEnlargeFactor);\n }\n\n getBoxForHandLandmarks(landmarks) {\n const boundingBox = this.calculateLandmarksBoundingBox(landmarks);\n const boxAroundHand = box.enlargeBox(box.squarifyBox(boundingBox), handBoxEnlargeFactor);\n boxAroundHand.palmLandmarks = [];\n for (let i = 0; i < palmLandmarkIds.length; i++) {\n boxAroundHand.palmLandmarks.push(landmarks[palmLandmarkIds[i]].slice(0, 2));\n }\n return boxAroundHand;\n }\n\n transformRawCoords(rawCoords, box2, angle, rotationMatrix) {\n const boxSize = box.getBoxSize(box2);\n const scaleFactor = [boxSize[0] / this.inputSize, boxSize[1] / this.inputSize, (boxSize[0] + boxSize[1]) / this.inputSize / 2];\n const coordsScaled = rawCoords.map((coord) => [\n scaleFactor[0] * (coord[0] - this.inputSize / 2),\n scaleFactor[1] * (coord[1] - this.inputSize / 2),\n scaleFactor[2] * coord[2],\n ]);\n const coordsRotationMatrix = util.buildRotationMatrix(angle, [0, 0]);\n const coordsRotated = coordsScaled.map((coord) => {\n const rotated = util.rotatePoint(coord, coordsRotationMatrix);\n return [...rotated, coord[2]];\n });\n const inverseRotationMatrix = util.invertTransformMatrix(rotationMatrix);\n const boxCenter = [...box.getBoxCenter(box2), 1];\n const originalBoxCenter = [\n util.dot(boxCenter, inverseRotationMatrix[0]),\n util.dot(boxCenter, inverseRotationMatrix[1]),\n ];\n return coordsRotated.map((coord) => [\n coord[0] + originalBoxCenter[0],\n coord[1] + originalBoxCenter[1],\n coord[2],\n ]);\n }\n\n async estimateHands(image, config) {\n let useFreshBox = false;\n\n // run new detector every skipFrames unless we only want box to start with\n let boxes;\n\n if ((this.skipped === 0) || (this.skipped > config.hand.skipFrames) || !config.hand.landmarks || !config.skipFrame) {\n boxes = await this.handDetector.estimateHandBounds(image, config);\n this.skipped = 0;\n }\n if (config.skipFrame) this.skipped++;\n\n // if detector result count doesn't match current working set, use it to reset current working set\n if (boxes && (boxes.length > 0) && ((boxes.length !== this.detectedHands) && (this.detectedHands !== config.hand.maxDetected) || !config.hand.landmarks)) {\n this.detectedHands = 0;\n this.storedBoxes = [...boxes];\n // for (const possible of boxes) this.storedBoxes.push(possible);\n if (this.storedBoxes.length > 0) useFreshBox = true;\n }\n const hands: Array<{}> = [];\n\n // go through working set of boxes\n for (let i = 0; i < this.storedBoxes.length; i++) {\n const currentBox = this.storedBoxes[i];\n if (!currentBox) continue;\n if (config.hand.landmarks) {\n const angle = config.hand.rotation ? util.computeRotation(currentBox.palmLandmarks[palmLandmarksPalmBase], currentBox.palmLandmarks[palmLandmarksMiddleFingerBase]) : 0;\n const palmCenter = box.getBoxCenter(currentBox);\n const palmCenterNormalized = [palmCenter[0] / image.shape[2], palmCenter[1] / image.shape[1]];\n const rotatedImage = config.hand.rotation ? tf.image.rotateWithOffset(image, angle, 0, palmCenterNormalized) : image.clone();\n const rotationMatrix = util.buildRotationMatrix(-angle, palmCenter);\n const newBox = useFreshBox ? this.getBoxForPalmLandmarks(currentBox.palmLandmarks, rotationMatrix) : currentBox;\n const croppedInput = box.cutBoxFromImageAndResize(newBox, rotatedImage, [this.inputSize, this.inputSize]);\n const handImage = croppedInput.div(255);\n croppedInput.dispose();\n rotatedImage.dispose();\n const [confidenceT, keypoints] = await this.landmarkDetector.predict(handImage);\n handImage.dispose();\n const confidence = confidenceT.dataSync()[0];\n confidenceT.dispose();\n if (confidence >= config.hand.minConfidence) {\n const keypointsReshaped = tf.reshape(keypoints, [-1, 3]);\n const rawCoords = keypointsReshaped.arraySync();\n keypoints.dispose();\n keypointsReshaped.dispose();\n const coords = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix);\n const nextBoundingBox = this.getBoxForHandLandmarks(coords);\n this.storedBoxes[i] = nextBoundingBox;\n const result = {\n landmarks: coords,\n confidence,\n box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint },\n };\n hands.push(result);\n } else {\n this.storedBoxes[i] = null;\n }\n keypoints.dispose();\n } else {\n // const enlarged = box.enlargeBox(box.squarifyBox(box.shiftBox(currentBox, HAND_BOX_SHIFT_VECTOR)), handBoxEnlargeFactor);\n const enlarged = box.enlargeBox(box.squarifyBox(currentBox), handBoxEnlargeFactor);\n const result = {\n confidence: currentBox.confidence,\n box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint },\n };\n hands.push(result);\n }\n }\n this.storedBoxes = this.storedBoxes.filter((a) => a !== null);\n this.detectedHands = hands.length;\n return hands;\n }\n}\n", "// paper: https://ai.googleblog.com/2020/08/on-device-real-time-body-pose-tracking.html\n\nimport { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport * as annotations from './annotations';\n\nlet model;\n\nexport async function load(config) {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.body.modelPath));\n model.width = parseInt(model.signature.inputs['input_1:0'].tensorShape.dim[2].size);\n model.height = parseInt(model.signature.inputs['input_1:0'].tensorShape.dim[1].size);\n if (!model || !model.modelUrl) log('load model failed:', config.body.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nexport async function predict(image, config) {\n if (!model) return null;\n if (!config.body.enabled) return null;\n const imgSize = { width: image.shape[2], height: image.shape[1] };\n const resize = tf.image.resizeBilinear(image, [model.width, model.height], false);\n const normalize = tf.div(resize, [255.0]);\n resize.dispose();\n const resT = await model.predict(normalize);\n const points = resT.find((t) => (t.size === 195 || t.size === 155)).dataSync(); // order of output tensors may change between models, full has 195 and upper has 155 items\n resT.forEach((t) => t.dispose());\n normalize.dispose();\n const keypoints: Array<{ id, part, position: { x, y, z }, score, presence }> = [];\n const labels = points.length === 195 ? annotations.full : annotations.upper; // full model has 39 keypoints, upper has 31 keypoints\n const depth = 5; // each points has x,y,z,visibility,presence\n for (let i = 0; i < points.length / depth; i++) {\n keypoints.push({\n id: i,\n part: labels[i],\n position: {\n x: Math.trunc(imgSize.width * points[depth * i + 0] / 255), // return normalized x value istead of 0..255\n y: Math.trunc(imgSize.height * points[depth * i + 1] / 255), // return normalized y value istead of 0..255\n z: Math.trunc(points[depth * i + 2]) + 0, // fix negative zero\n },\n score: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 3])))) / 100, // reverse sigmoid value\n presence: (100 - Math.trunc(100 / (1 + Math.exp(points[depth * i + 4])))) / 100, // reverse sigmoid value\n });\n }\n const score = keypoints.reduce((prev, curr) => (curr.score > prev ? curr.score : prev), 0);\n return [{ score, keypoints }];\n}\n", "export const full = [\n 'nose',\n 'leftEyeInside',\n 'leftEye',\n 'leftEyeOutside',\n 'rightEyeInside',\n 'rightEye',\n 'rightEyeOutside',\n 'leftEar',\n 'rightEar',\n 'leftMouth',\n 'rightMouth',\n 'leftShoulder',\n 'rightShoulder',\n 'leftElbow',\n 'rightElbow',\n 'leftWrist',\n 'rightWrist',\n 'leftPalm',\n 'rightPalm',\n 'leftIndex',\n 'rightIndex',\n 'leftPinky',\n 'rightPinky',\n 'leftHip',\n 'rightHip',\n 'leftKnee',\n 'rightKnee',\n 'leftAnkle',\n 'rightAnkle',\n 'leftHeel',\n 'rightHeel',\n 'leftFoot',\n 'rightFoot',\n 'midHip',\n 'forehead',\n 'leftThumb',\n 'leftHand',\n 'rightThumb',\n 'rightHand',\n];\n\nexport const upper = [\n 'nose',\n 'leftEyeInside',\n 'leftEye',\n 'leftEyeOutside',\n 'rightEyeInside',\n 'rightEye',\n 'rightEyeOutside',\n 'leftEar',\n 'rightEar',\n 'leftMouth',\n 'rightMouth',\n 'leftShoulder',\n 'rightShoulder',\n 'leftElbow',\n 'rightElbow',\n 'left:15',\n 'right:16',\n 'left:17',\n 'right:18',\n 'left:19',\n 'right:20',\n 'left:21',\n 'right:22',\n 'leftChest',\n 'rightChest',\n 'neck',\n 'forehead',\n 'left:27',\n 'right:28',\n 'left:29',\n 'right:30',\n];\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { labels } from './labels';\nimport { Item } from '../result';\n\nlet model;\nlet last: Array = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nconst scaleBox = 2.5; // increase box size\n\nexport async function load(config) {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.object.modelPath));\n const inputs = Object.values(model.modelSignature['inputs']);\n model.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null;\n if (!model.inputSize) throw new Error(`Human: Cannot determine model inputSize: ${config.object.modelPath}`);\n if (!model || !model.modelUrl) log('load model failed:', config.object.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nasync function process(res, inputSize, outputShape, config) {\n let id = 0;\n let results: Array<{ score: number, strideSize: number, class: number, label: string, center: number[], centerRaw: number[], box: number[], boxRaw: number[] }> = [];\n for (const strideSize of [1, 2, 4]) { // try each stride size as it detects large/medium/small objects\n // find scores, boxes, classes\n tf.tidy(() => { // wrap in tidy to automatically deallocate temp tensors\n const baseSize = strideSize * 13; // 13x13=169, 26x26=676, 52x52=2704\n // find boxes and scores output depending on stride\n const scoresT = res.find((a) => (a.shape[1] === (baseSize ** 2) && a.shape[2] === labels.length))?.squeeze();\n const featuresT = res.find((a) => (a.shape[1] === (baseSize ** 2) && a.shape[2] < labels.length))?.squeeze();\n const boxesMax = featuresT.reshape([-1, 4, featuresT.shape[1] / 4]); // reshape [output] to [4, output / 4] where number is number of different features inside each stride\n const boxIdx = boxesMax.argMax(2).arraySync(); // what we need is indexes of features with highest scores, not values itself\n const scores = scoresT.arraySync(); // optionally use exponential scores or just as-is\n for (let i = 0; i < scoresT.shape[0]; i++) { // total strides (x * y matrix)\n for (let j = 0; j < scoresT.shape[1]; j++) { // one score for each class\n const score = scores[i][j]; // get score for current position\n if (score > config.object.minConfidence && j !== 61) {\n const cx = (0.5 + Math.trunc(i % baseSize)) / baseSize; // center.x normalized to range 0..1\n const cy = (0.5 + Math.trunc(i / baseSize)) / baseSize; // center.y normalized to range 0..1\n const boxOffset = boxIdx[i].map((a) => a * (baseSize / strideSize / inputSize)); // just grab indexes of features with highest scores\n const [x, y] = [\n cx - (scaleBox / strideSize * boxOffset[0]),\n cy - (scaleBox / strideSize * boxOffset[1]),\n ];\n const [w, h] = [\n cx + (scaleBox / strideSize * boxOffset[2]) - x,\n cy + (scaleBox / strideSize * boxOffset[3]) - y,\n ];\n let boxRaw = [x, y, w, h]; // results normalized to range 0..1\n boxRaw = boxRaw.map((a) => Math.max(0, Math.min(a, 1))); // fix out-of-bounds coords\n const box = [ // results normalized to input image pixels\n boxRaw[0] * outputShape[0],\n boxRaw[1] * outputShape[1],\n boxRaw[2] * outputShape[0],\n boxRaw[3] * outputShape[1],\n ];\n const result = {\n id: id++,\n strideSize,\n score: Math.round(100 * score) / 100,\n class: j + 1,\n label: labels[j].label,\n center: [Math.trunc(outputShape[0] * cx), Math.trunc(outputShape[1] * cy)],\n centerRaw: [cx, cy],\n box: box.map((a) => Math.trunc(a)),\n boxRaw,\n };\n results.push(result);\n }\n }\n }\n });\n }\n // deallocate tensors\n res.forEach((t) => tf.dispose(t));\n\n // normally nms is run on raw results, but since boxes need to be calculated this way we skip calulcation of\n // unnecessary boxes and run nms only on good candidates (basically it just does IOU analysis as scores are already filtered)\n const nmsBoxes = results.map((a) => [a.boxRaw[1], a.boxRaw[0], a.boxRaw[3], a.boxRaw[2]]); // switches coordinates from x,y to y,x as expected by tf.nms\n const nmsScores = results.map((a) => a.score);\n let nmsIdx: any[] = [];\n if (nmsBoxes && nmsBoxes.length > 0) {\n const nms = await tf.image.nonMaxSuppressionAsync(nmsBoxes, nmsScores, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence);\n nmsIdx = nms.dataSync();\n tf.dispose(nms);\n }\n\n // filter & sort results\n results = results\n .filter((a, idx) => nmsIdx.includes(idx))\n .sort((a, b) => (b.score - a.score));\n\n return results;\n}\n\nexport async function predict(image, config): Promise {\n if ((skipped < config.object.skipFrames) && config.skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const outputSize = [image.shape[2], image.shape[1]];\n const resize = tf.image.resizeBilinear(image, [model.inputSize, model.inputSize], false);\n const norm = resize.div(255);\n const transpose = norm.transpose([0, 3, 1, 2]);\n norm.dispose();\n resize.dispose();\n\n let objectT;\n if (config.object.enabled) objectT = await model.predict(transpose);\n transpose.dispose();\n\n const obj = await process(objectT, model.inputSize, outputSize, config);\n last = obj;\n resolve(obj);\n });\n}\n", "export const labels = [\n { class: 1, label: 'person' },\n { class: 2, label: 'bicycle' },\n { class: 3, label: 'car' },\n { class: 4, label: 'motorcycle' },\n { class: 5, label: 'airplane' },\n { class: 6, label: 'bus' },\n { class: 7, label: 'train' },\n { class: 8, label: 'truck' },\n { class: 9, label: 'boat' },\n { class: 10, label: 'traffic light' },\n { class: 11, label: 'fire hydrant' },\n { class: 12, label: 'stop sign' },\n { class: 13, label: 'parking meter' },\n { class: 14, label: 'bench' },\n { class: 15, label: 'bird' },\n { class: 16, label: 'cat' },\n { class: 17, label: 'dog' },\n { class: 18, label: 'horse' },\n { class: 19, label: 'sheep' },\n { class: 20, label: 'cow' },\n { class: 21, label: 'elephant' },\n { class: 22, label: 'bear' },\n { class: 23, label: 'zebra' },\n { class: 24, label: 'giraffe' },\n { class: 25, label: 'backpack' },\n { class: 26, label: 'umbrella' },\n { class: 27, label: 'handbag' },\n { class: 28, label: 'tie' },\n { class: 29, label: 'suitcase' },\n { class: 30, label: 'frisbee' },\n { class: 31, label: 'skis' },\n { class: 32, label: 'snowboard' },\n { class: 33, label: 'sports ball' },\n { class: 34, label: 'kite' },\n { class: 35, label: 'baseball bat' },\n { class: 36, label: 'baseball glove' },\n { class: 37, label: 'skateboard' },\n { class: 38, label: 'surfboard' },\n { class: 39, label: 'tennis racket' },\n { class: 40, label: 'bottle' },\n { class: 41, label: 'wine glass' },\n { class: 42, label: 'cup' },\n { class: 43, label: 'fork' },\n { class: 44, label: 'knife' },\n { class: 45, label: 'spoon' },\n { class: 46, label: 'bowl' },\n { class: 47, label: 'banana' },\n { class: 48, label: 'apple' },\n { class: 49, label: 'sandwich' },\n { class: 50, label: 'orange' },\n { class: 51, label: 'broccoli' },\n { class: 52, label: 'carrot' },\n { class: 53, label: 'hot dog' },\n { class: 54, label: 'pizza' },\n { class: 55, label: 'donut' },\n { class: 56, label: 'cake' },\n { class: 57, label: 'chair' },\n { class: 58, label: 'couch' },\n { class: 59, label: 'potted plant' },\n { class: 60, label: 'bed' },\n { class: 61, label: 'dining table' },\n { class: 62, label: 'toilet' },\n { class: 63, label: 'tv' },\n { class: 64, label: 'laptop' },\n { class: 65, label: 'mouse' },\n { class: 66, label: 'remote' },\n { class: 67, label: 'keyboard' },\n { class: 68, label: 'cell phone' },\n { class: 69, label: 'microwave' },\n { class: 70, label: 'oven' },\n { class: 71, label: 'toaster' },\n { class: 72, label: 'sink' },\n { class: 73, label: 'refrigerator' },\n { class: 74, label: 'book' },\n { class: 75, label: 'clock' },\n { class: 76, label: 'vase' },\n { class: 77, label: 'scissors' },\n { class: 78, label: 'teddy bear' },\n { class: 79, label: 'hair drier' },\n { class: 80, label: 'toothbrush' },\n];\n", "import { log, join } from '../helpers';\nimport * as tf from '../../dist/tfjs.esm.js';\nimport { labels } from './labels';\nimport { Item } from '../result';\n\nlet model;\nlet last: Item[] = [];\nlet skipped = Number.MAX_SAFE_INTEGER;\n\nexport async function load(config) {\n if (!model) {\n model = await tf.loadGraphModel(join(config.modelBasePath, config.object.modelPath));\n const inputs = Object.values(model.modelSignature['inputs']);\n model.inputSize = Array.isArray(inputs) ? parseInt(inputs[0].tensorShape.dim[2].size) : null;\n if (!model.inputSize) throw new Error(`Human: Cannot determine model inputSize: ${config.object.modelPath}`);\n if (!model || !model.modelUrl) log('load model failed:', config.object.modelPath);\n else if (config.debug) log('load model:', model.modelUrl);\n } else if (config.debug) log('cached model:', model.modelUrl);\n return model;\n}\n\nasync function process(res, inputSize, outputShape, config) {\n const results: Array<{ score: number, class: number, label: string, box: number[], boxRaw: number[] }> = [];\n const detections = res.arraySync();\n const squeezeT = tf.squeeze(res);\n res.dispose();\n const arr = tf.split(squeezeT, 6, 1); // x1, y1, x2, y2, score, class\n squeezeT.dispose();\n const stackT = tf.stack([arr[1], arr[0], arr[3], arr[2]], 1); // tf.nms expects y, x\n const boxesT = stackT.squeeze();\n const scoresT = arr[4].squeeze();\n const classesT = arr[5].squeeze();\n arr.forEach((t) => t.dispose());\n // @ts-ignore boxesT type is not correctly inferred\n const nmsT = await tf.image.nonMaxSuppressionAsync(boxesT, scoresT, config.object.maxDetected, config.object.iouThreshold, config.object.minConfidence);\n boxesT.dispose();\n scoresT.dispose();\n classesT.dispose();\n const nms = nmsT.dataSync();\n nmsT.dispose();\n for (const id of nms) {\n const score = detections[0][id][4];\n const classVal = detections[0][id][5];\n const label = labels[classVal].label;\n const boxRaw = [\n detections[0][id][0] / inputSize,\n detections[0][id][1] / inputSize,\n detections[0][id][2] / inputSize,\n detections[0][id][3] / inputSize,\n ];\n const box = [\n Math.trunc(boxRaw[0] * outputShape[0]),\n Math.trunc(boxRaw[1] * outputShape[1]),\n Math.trunc(boxRaw[2] * outputShape[0]),\n Math.trunc(boxRaw[3] * outputShape[1]),\n ];\n results.push({ score, class: classVal, label, box, boxRaw });\n }\n return results;\n}\n\nexport async function predict(image, config): Promise {\n if ((skipped < config.object.skipFrames) && config.skipFrame && (last.length > 0)) {\n skipped++;\n return last;\n }\n skipped = 0;\n return new Promise(async (resolve) => {\n const outputSize = [image.shape[2], image.shape[1]];\n const resize = tf.image.resizeBilinear(image, [model.inputSize, model.inputSize], false);\n\n let objectT;\n if (config.object.enabled) objectT = model.execute(resize, 'tower_0/detections');\n resize.dispose();\n\n const obj = await process(objectT, model.inputSize, outputSize, config);\n last = obj;\n resolve(obj);\n });\n}\n", "import { Gesture } from '../result';\n\nexport const body = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ body: number, gesture: string }> = [];\n for (let i = 0; i < res.length; i++) {\n // raising hands\n const leftWrist = res[i].keypoints.find((a) => (a.part === 'leftWrist'));\n const rightWrist = res[i].keypoints.find((a) => (a.part === 'rightWrist'));\n const nose = res[i].keypoints.find((a) => (a.part === 'nose'));\n if (nose && leftWrist && rightWrist && (leftWrist.position.y < nose.position.y) && (rightWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'i give up' });\n else if (nose && leftWrist && (leftWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'raise left hand' });\n else if (nose && rightWrist && (rightWrist.position.y < nose.position.y)) gestures.push({ body: i, gesture: 'raise right hand' });\n\n // leaning\n const leftShoulder = res[i].keypoints.find((a) => (a.part === 'leftShoulder'));\n const rightShoulder = res[i].keypoints.find((a) => (a.part === 'rightShoulder'));\n if (leftShoulder && rightShoulder) gestures.push({ body: i, gesture: `leaning ${(leftShoulder.position.y > rightShoulder.position.y) ? 'left' : 'right'}` });\n }\n return gestures;\n};\n\nexport const face = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ face: number, gesture: string }> = [];\n for (let i = 0; i < res.length; i++) {\n if (res[i].mesh && res[i].mesh.length > 0) {\n const eyeFacing = res[i].mesh[33][2] - res[i].mesh[263][2];\n if (Math.abs(eyeFacing) < 10) gestures.push({ face: i, gesture: 'facing center' });\n else gestures.push({ face: i, gesture: `facing ${eyeFacing < 0 ? 'left' : 'right'}` });\n const openLeft = Math.abs(res[i].mesh[374][1] - res[i].mesh[386][1]) / Math.abs(res[i].mesh[443][1] - res[i].mesh[450][1]); // center of eye inner lid y coord div center of wider eye border y coord\n if (openLeft < 0.2) gestures.push({ face: i, gesture: 'blink left eye' });\n const openRight = Math.abs(res[i].mesh[145][1] - res[i].mesh[159][1]) / Math.abs(res[i].mesh[223][1] - res[i].mesh[230][1]); // center of eye inner lid y coord div center of wider eye border y coord\n if (openRight < 0.2) gestures.push({ face: i, gesture: 'blink right eye' });\n const mouthOpen = Math.min(100, 500 * Math.abs(res[i].mesh[13][1] - res[i].mesh[14][1]) / Math.abs(res[i].mesh[10][1] - res[i].mesh[152][1]));\n if (mouthOpen > 10) gestures.push({ face: i, gesture: `mouth ${Math.trunc(mouthOpen)}% open` });\n const chinDepth = res[i].mesh[152][2];\n if (Math.abs(chinDepth) > 10) gestures.push({ face: i, gesture: `head ${chinDepth < 0 ? 'up' : 'down'}` });\n }\n }\n return gestures;\n};\n\nexport const iris = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ iris: number, gesture: string }> = [];\n for (let i = 0; i < res.length; i++) {\n if (!res[i].annotations || !res[i].annotations.leftEyeIris || !res[i].annotations.rightEyeIris) continue;\n const sizeXLeft = res[i].annotations.leftEyeIris[3][0] - res[i].annotations.leftEyeIris[1][0];\n const sizeYLeft = res[i].annotations.leftEyeIris[4][1] - res[i].annotations.leftEyeIris[2][1];\n const areaLeft = Math.abs(sizeXLeft * sizeYLeft);\n\n const sizeXRight = res[i].annotations.rightEyeIris[3][0] - res[i].annotations.rightEyeIris[1][0];\n const sizeYRight = res[i].annotations.rightEyeIris[4][1] - res[i].annotations.rightEyeIris[2][1];\n const areaRight = Math.abs(sizeXRight * sizeYRight);\n\n let center = false;\n const difference = Math.abs(areaLeft - areaRight) / Math.max(areaLeft, areaRight);\n if (difference < 0.25) {\n center = true;\n gestures.push({ iris: i, gesture: 'facing center' });\n }\n\n const rightIrisCenterX = Math.abs(res[i].mesh[33][0] - res[i].annotations.rightEyeIris[0][0]) / res[i].annotations.rightEyeIris[0][0];\n const leftIrisCenterX = Math.abs(res[i].mesh[263][0] - res[i].annotations.leftEyeIris[0][0]) / res[i].annotations.leftEyeIris[0][0];\n if (leftIrisCenterX > 0.033 || rightIrisCenterX > 0.033) center = false;\n if (leftIrisCenterX > 0.033) gestures.push({ iris: i, gesture: 'looking right' });\n if (rightIrisCenterX > 0.033) gestures.push({ iris: i, gesture: 'looking left' });\n\n const rightIrisCenterY = Math.abs(res[i].mesh[145][1] - res[i].annotations.rightEyeIris[0][1]) / res[i].annotations.rightEyeIris[0][1];\n const leftIrisCenterY = Math.abs(res[i].mesh[374][1] - res[i].annotations.leftEyeIris[0][1]) / res[i].annotations.leftEyeIris[0][1];\n if (leftIrisCenterY < 0.015 || rightIrisCenterY < 0.015 || leftIrisCenterY > 0.030 || rightIrisCenterY > 0.030) center = false;\n if (leftIrisCenterY < 0.015 || rightIrisCenterY < 0.015) gestures.push({ iris: i, gesture: 'looking down' });\n if (leftIrisCenterY > 0.030 || rightIrisCenterY > 0.030) gestures.push({ iris: i, gesture: 'looking up' });\n\n // still center;\n if (center) gestures.push({ iris: i, gesture: 'looking center' });\n }\n return gestures;\n};\n\nexport const hand = (res): Gesture[] => {\n if (!res) return [];\n const gestures: Array<{ hand: number, gesture: string }> = [];\n for (let i = 0; i < res.length; i++) {\n const fingers: Array<{ name: string, position: number }> = [];\n for (const [finger, pos] of Object.entries(res[i]['annotations'])) {\n if (finger !== 'palmBase' && Array.isArray(pos)) fingers.push({ name: finger.toLowerCase(), position: pos[0] }); // get tip of each finger\n }\n if (fingers && fingers.length > 0) {\n const closest = fingers.reduce((best, a) => (best.position[2] < a.position[2] ? best : a));\n const highest = fingers.reduce((best, a) => (best.position[1] < a.position[1] ? best : a));\n gestures.push({ hand: i, gesture: `${closest.name} forward ${highest.name} up` });\n }\n }\n return gestures;\n};\n", "/*\nWebGLImageFilter - MIT Licensed\n2013, Dominic Szablewski - phoboslab.org\n\n*/\n\nfunction GLProgram(gl, vertexSource, fragmentSource) {\n const _collect = function (source, prefix, collection) {\n const r = new RegExp('\\\\b' + prefix + ' \\\\w+ (\\\\w+)', 'ig');\n source.replace(r, (match, name) => {\n collection[name] = 0;\n return match;\n });\n };\n\n const _compile = function (source, type) {\n const shader = gl.createShader(type);\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) throw new Error('Filter: GL compile failed', gl.getShaderInfoLog(shader));\n return shader;\n };\n\n this.uniform = {};\n this.attribute = {};\n const _vsh = _compile(vertexSource, gl.VERTEX_SHADER);\n const _fsh = _compile(fragmentSource, gl.FRAGMENT_SHADER);\n this.id = gl.createProgram();\n gl.attachShader(this.id, _vsh);\n gl.attachShader(this.id, _fsh);\n gl.linkProgram(this.id);\n\n if (!gl.getProgramParameter(this.id, gl.LINK_STATUS)) throw new Error('Filter: GL link failed', gl.getProgramInfoLog(this.id));\n\n gl.useProgram(this.id);\n // Collect attributes\n _collect(vertexSource, 'attribute', this.attribute);\n for (const a in this.attribute) this.attribute[a] = gl.getAttribLocation(this.id, a);\n // Collect uniforms\n _collect(vertexSource, 'uniform', this.uniform);\n _collect(fragmentSource, 'uniform', this.uniform);\n for (const u in this.uniform) this.uniform[u] = gl.getUniformLocation(this.id, u);\n}\n\n// export const GLImageFilter = function (params) {\nexport function GLImageFilter(params) {\n if (!params) params = { };\n let _drawCount = 0;\n let _sourceTexture = null;\n let _lastInChain = false;\n let _currentFramebufferIndex = -1;\n let _tempFramebuffers = [null, null];\n let _filterChain = [];\n let _width = -1;\n let _height = -1;\n let _vertexBuffer = null;\n let _currentProgram = null;\n const _filter = {};\n const _canvas = params.canvas || document.createElement('canvas');\n // key is the shader program source, value is the compiled program\n const _shaderProgramCache = { };\n const DRAW = { INTERMEDIATE: 1 };\n const gl = _canvas.getContext('webgl');\n if (!gl) throw new Error('Filter: getContext() failed');\n\n this.addFilter = function (name) {\n // eslint-disable-next-line prefer-rest-params\n const args = Array.prototype.slice.call(arguments, 1);\n const filter = _filter[name];\n _filterChain.push({ func: filter, args });\n };\n\n this.reset = function () {\n _filterChain = [];\n };\n\n const _resize = function (width, height) {\n // Same width/height? Nothing to do here\n if (width === _width && height === _height) { return; }\n _canvas.width = width;\n _width = width;\n _canvas.height = height;\n _height = height;\n // Create the context if we don't have it yet\n if (!_vertexBuffer) {\n // Create the vertex buffer for the two triangles [x, y, u, v] * 6\n const vertices = new Float32Array([\n -1, -1, 0, 1, 1, -1, 1, 1, -1, 1, 0, 0,\n -1, 1, 0, 0, 1, -1, 1, 1, 1, 1, 1, 0,\n ]);\n // eslint-disable-next-line no-unused-expressions\n (_vertexBuffer = gl.createBuffer(), gl.bindBuffer(gl.ARRAY_BUFFER, _vertexBuffer));\n gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n }\n gl.viewport(0, 0, _width, _height);\n // Delete old temp framebuffers\n _tempFramebuffers = [null, null];\n };\n\n const _createFramebufferTexture = function (width, height) {\n const fbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n const renderbuffer = gl.createRenderbuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);\n const texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return { fbo, texture };\n };\n\n const _getTempFramebuffer = function (index) {\n _tempFramebuffers[index] = _tempFramebuffers[index] || _createFramebufferTexture(_width, _height);\n return _tempFramebuffers[index];\n };\n\n const _draw = function (flags = null) {\n let source = null;\n let target = null;\n let flipY = false;\n // Set up the source\n if (_drawCount === 0) {\n // First draw call - use the source texture\n source = _sourceTexture;\n } else {\n // All following draw calls use the temp buffer last drawn to\n source = _getTempFramebuffer(_currentFramebufferIndex)?.texture;\n }\n _drawCount++;\n // Set up the target\n if (_lastInChain && !(flags & DRAW.INTERMEDIATE)) {\n // Last filter in our chain - draw directly to the WebGL Canvas. We may\n // also have to flip the image vertically now\n target = null;\n flipY = _drawCount % 2 === 0;\n } else {\n // Intermediate draw call - get a temp buffer to draw to\n _currentFramebufferIndex = (_currentFramebufferIndex + 1) % 2;\n target = _getTempFramebuffer(_currentFramebufferIndex)?.fbo;\n }\n // Bind the source and target and draw the two triangles\n gl.bindTexture(gl.TEXTURE_2D, source);\n gl.bindFramebuffer(gl.FRAMEBUFFER, target);\n gl.uniform1f(_currentProgram.uniform.flipY, (flipY ? -1 : 1));\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n };\n\n this.apply = function (image) {\n _resize(image.width, image.height);\n _drawCount = 0;\n // Create the texture for the input image if we haven't yet\n if (!_sourceTexture) _sourceTexture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, _sourceTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n // No filters? Just draw\n if (_filterChain.length === 0) {\n // const program = _compileShader(SHADER.FRAGMENT_IDENTITY);\n _draw();\n return _canvas;\n }\n for (let i = 0; i < _filterChain.length; i++) {\n _lastInChain = (i === _filterChain.length - 1);\n const f = _filterChain[i];\n f.func.apply(this, f.args || []);\n }\n return _canvas;\n };\n\n const _compileShader = function (fragmentSource) {\n if (_shaderProgramCache[fragmentSource]) {\n _currentProgram = _shaderProgramCache[fragmentSource];\n gl.useProgram(_currentProgram.id);\n return _currentProgram;\n }\n // Compile shaders\n const SHADER = {};\n SHADER.VERTEX_IDENTITY = [\n 'precision highp float;',\n 'attribute vec2 pos;',\n 'attribute vec2 uv;',\n 'varying vec2 vUv;',\n 'uniform float flipY;',\n 'void main(void) {',\n 'vUv = uv;',\n 'gl_Position = vec4(pos.x, pos.y*flipY, 0.0, 1.);',\n '}',\n ].join('\\n');\n SHADER.FRAGMENT_IDENTITY = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'void main(void) {',\n 'gl_FragColor = texture2D(texture, vUv);',\n '}',\n ].join('\\n');\n _currentProgram = new GLProgram(gl, SHADER.VERTEX_IDENTITY, fragmentSource);\n const floatSize = Float32Array.BYTES_PER_ELEMENT;\n const vertSize = 4 * floatSize;\n gl.enableVertexAttribArray(_currentProgram.attribute.pos);\n gl.vertexAttribPointer(_currentProgram.attribute.pos, 2, gl.FLOAT, false, vertSize, 0 * floatSize);\n gl.enableVertexAttribArray(_currentProgram.attribute.uv);\n gl.vertexAttribPointer(_currentProgram.attribute.uv, 2, gl.FLOAT, false, vertSize, 2 * floatSize);\n _shaderProgramCache[fragmentSource] = _currentProgram;\n return _currentProgram;\n };\n\n // -------------------------------------------------------------------------\n // Color Matrix Filter\n _filter.colorMatrix = function (matrix) {\n // Create a Float32 Array and normalize the offset component to 0-1\n const m = new Float32Array(matrix);\n m[4] /= 255;\n m[9] /= 255;\n m[14] /= 255;\n m[19] /= 255;\n // Can we ignore the alpha value? Makes things a bit faster.\n const shader = (m[18] === 1 && m[3] === 0 && m[8] === 0 && m[13] === 0 && m[15] === 0 && m[16] === 0 && m[17] === 0 && m[19] === 0)\n ? _filter.colorMatrix.SHADER.WITHOUT_ALPHA\n : _filter.colorMatrix.SHADER.WITH_ALPHA;\n const program = _compileShader(shader);\n gl.uniform1fv(program.uniform.m, m);\n _draw();\n };\n _filter.colorMatrix.SHADER = {};\n _filter.colorMatrix.SHADER.WITH_ALPHA = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'uniform float m[20];',\n 'void main(void) {',\n 'vec4 c = texture2D(texture, vUv);',\n 'gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[3] * c.a + m[4];',\n 'gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[8] * c.a + m[9];',\n 'gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[13] * c.a + m[14];',\n 'gl_FragColor.a = m[15] * c.r + m[16] * c.g + m[17] * c.b + m[18] * c.a + m[19];',\n '}',\n ].join('\\n');\n _filter.colorMatrix.SHADER.WITHOUT_ALPHA = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'uniform float m[20];',\n 'void main(void) {',\n 'vec4 c = texture2D(texture, vUv);',\n 'gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[4];',\n 'gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[9];',\n 'gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[14];',\n 'gl_FragColor.a = c.a;',\n '}',\n ].join('\\n');\n\n _filter.brightness = function (brightness) {\n const b = (brightness || 0) + 1;\n _filter.colorMatrix([\n b, 0, 0, 0, 0,\n 0, b, 0, 0, 0,\n 0, 0, b, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.saturation = function (amount) {\n const x = (amount || 0) * 2 / 3 + 1;\n const y = ((x - 1) * -0.5);\n _filter.colorMatrix([\n x, y, y, 0, 0,\n y, x, y, 0, 0,\n y, y, x, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.desaturate = function () {\n _filter.saturation(-1);\n };\n\n _filter.contrast = function (amount) {\n const v = (amount || 0) + 1;\n const o = -128 * (v - 1);\n\n _filter.colorMatrix([\n v, 0, 0, 0, o,\n 0, v, 0, 0, o,\n 0, 0, v, 0, o,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.negative = function () {\n _filter.contrast(-2);\n };\n\n _filter.hue = function (rotation) {\n rotation = (rotation || 0) / 180 * Math.PI;\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const lumR = 0.213;\n const lumG = 0.715;\n const lumB = 0.072;\n\n _filter.colorMatrix([\n lumR + cos * (1 - lumR) + sin * (-lumR), lumG + cos * (-lumG) + sin * (-lumG), lumB + cos * (-lumB) + sin * (1 - lumB), 0, 0,\n lumR + cos * (-lumR) + sin * (0.143), lumG + cos * (1 - lumG) + sin * (0.140), lumB + cos * (-lumB) + sin * (-0.283), 0, 0,\n lumR + cos * (-lumR) + sin * (-(1 - lumR)), lumG + cos * (-lumG) + sin * (lumG), lumB + cos * (1 - lumB) + sin * (lumB), 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.desaturateLuminance = function () {\n _filter.colorMatrix([\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0.2764723, 0.9297080, 0.0938197, 0, -37.1,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.sepia = function () {\n _filter.colorMatrix([\n 0.393, 0.7689999, 0.18899999, 0, 0,\n 0.349, 0.6859999, 0.16799999, 0, 0,\n 0.272, 0.5339999, 0.13099999, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.brownie = function () {\n _filter.colorMatrix([\n 0.5997023498159715, 0.34553243048391263, -0.2708298674538042, 0, 47.43192855600873,\n -0.037703249837783157, 0.8609577587992641, 0.15059552388459913, 0, -36.96841498319127,\n 0.24113635128153335, -0.07441037908422492, 0.44972182064877153, 0, -7.562075277591283,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.vintagePinhole = function () {\n _filter.colorMatrix([\n 0.6279345635605994, 0.3202183420819367, -0.03965408211312453, 0, 9.651285835294123,\n 0.02578397704808868, 0.6441188644374771, 0.03259127616149294, 0, 7.462829176470591,\n 0.0466055556782719, -0.0851232987247891, 0.5241648018700465, 0, 5.159190588235296,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.kodachrome = function () {\n _filter.colorMatrix([\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.technicolor = function () {\n _filter.colorMatrix([\n 1.9125277891456083, -0.8545344976951645, -0.09155508482755585, 0, 11.793603434377337,\n -0.3087833385928097, 1.7658908555458428, -0.10601743074722245, 0, -70.35205161461398,\n -0.231103377548616, -0.7501899197440212, 1.847597816108189, 0, 30.950940869491138,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.polaroid = function () {\n _filter.colorMatrix([\n 1.438, -0.062, -0.062, 0, 0,\n -0.122, 1.378, -0.122, 0, 0,\n -0.016, -0.016, 1.483, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n _filter.shiftToBGR = function () {\n _filter.colorMatrix([\n 0, 0, 1, 0, 0,\n 0, 1, 0, 0, 0,\n 1, 0, 0, 0, 0,\n 0, 0, 0, 1, 0,\n ]);\n };\n\n // -------------------------------------------------------------------------\n // Convolution Filter\n _filter.convolution = function (matrix) {\n const m = new Float32Array(matrix);\n const pixelSizeX = 1 / _width;\n const pixelSizeY = 1 / _height;\n const program = _compileShader(_filter.convolution.SHADER);\n gl.uniform1fv(program.uniform.m, m);\n gl.uniform2f(program.uniform.px, pixelSizeX, pixelSizeY);\n _draw();\n };\n\n _filter.convolution.SHADER = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'uniform vec2 px;',\n 'uniform float m[9];',\n 'void main(void) {',\n 'vec4 c11 = texture2D(texture, vUv - px);', // top left\n 'vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y));', // top center\n 'vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y));', // top right\n 'vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) );', // mid left\n 'vec4 c22 = texture2D(texture, vUv);', // mid center\n 'vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) );', // mid right\n 'vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) );', // bottom left\n 'vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) );', // bottom center\n 'vec4 c33 = texture2D(texture, vUv + px );', // bottom right\n 'gl_FragColor = ',\n 'c11 * m[0] + c12 * m[1] + c22 * m[2] +',\n 'c21 * m[3] + c22 * m[4] + c23 * m[5] +',\n 'c31 * m[6] + c32 * m[7] + c33 * m[8];',\n 'gl_FragColor.a = c22.a;',\n '}',\n ].join('\\n');\n\n _filter.detectEdges = function () {\n _filter.convolution.call(this, [\n 0, 1, 0,\n 1, -4, 1,\n 0, 1, 0,\n ]);\n };\n\n _filter.sobelX = function () {\n _filter.convolution.call(this, [\n -1, 0, 1,\n -2, 0, 2,\n -1, 0, 1,\n ]);\n };\n\n _filter.sobelY = function () {\n _filter.convolution.call(this, [\n -1, -2, -1,\n 0, 0, 0,\n 1, 2, 1,\n ]);\n };\n\n _filter.sharpen = function (amount) {\n const a = amount || 1;\n _filter.convolution.call(this, [\n 0, -1 * a, 0,\n -1 * a, 1 + 4 * a, -1 * a,\n 0, -1 * a, 0,\n ]);\n };\n\n _filter.emboss = function (size) {\n const s = size || 1;\n _filter.convolution.call(this, [\n -2 * s, -1 * s, 0,\n -1 * s, 1, 1 * s,\n 0, 1 * s, 2 * s,\n ]);\n };\n\n // -------------------------------------------------------------------------\n // Blur Filter\n _filter.blur = function (size) {\n const blurSizeX = (size / 7) / _width;\n const blurSizeY = (size / 7) / _height;\n const program = _compileShader(_filter.blur.SHADER);\n // Vertical\n gl.uniform2f(program.uniform.px, 0, blurSizeY);\n _draw(DRAW.INTERMEDIATE);\n // Horizontal\n gl.uniform2f(program.uniform.px, blurSizeX, 0);\n _draw();\n };\n\n _filter.blur.SHADER = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform sampler2D texture;',\n 'uniform vec2 px;',\n 'void main(void) {',\n 'gl_FragColor = vec4(0.0);',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-7.0*px.x, -7.0*px.y))*0.0044299121055113265;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-6.0*px.x, -6.0*px.y))*0.00895781211794;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-5.0*px.x, -5.0*px.y))*0.0215963866053;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-4.0*px.x, -4.0*px.y))*0.0443683338718;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-3.0*px.x, -3.0*px.y))*0.0776744219933;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-2.0*px.x, -2.0*px.y))*0.115876621105;',\n 'gl_FragColor += texture2D(texture, vUv + vec2(-1.0*px.x, -1.0*px.y))*0.147308056121;',\n 'gl_FragColor += texture2D(texture, vUv )*0.159576912161;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 1.0*px.x, 1.0*px.y))*0.147308056121;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 2.0*px.x, 2.0*px.y))*0.115876621105;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 3.0*px.x, 3.0*px.y))*0.0776744219933;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 4.0*px.x, 4.0*px.y))*0.0443683338718;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 5.0*px.x, 5.0*px.y))*0.0215963866053;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 6.0*px.x, 6.0*px.y))*0.00895781211794;',\n 'gl_FragColor += texture2D(texture, vUv + vec2( 7.0*px.x, 7.0*px.y))*0.0044299121055113265;',\n '}',\n ].join('\\n');\n\n // -------------------------------------------------------------------------\n // Pixelate Filter\n _filter.pixelate = function (size) {\n const blurSizeX = (size) / _width;\n const blurSizeY = (size) / _height;\n const program = _compileShader(_filter.pixelate.SHADER);\n // Horizontal\n gl.uniform2f(program.uniform.size, blurSizeX, blurSizeY);\n _draw();\n };\n\n _filter.pixelate.SHADER = [\n 'precision highp float;',\n 'varying vec2 vUv;',\n 'uniform vec2 size;',\n 'uniform sampler2D texture;',\n 'vec2 pixelate(vec2 coord, vec2 size) {',\n 'return floor( coord / size ) * size;',\n '}',\n 'void main(void) {',\n 'gl_FragColor = vec4(0.0);',\n 'vec2 coord = pixelate(vUv, size);',\n 'gl_FragColor += texture2D(texture, coord);',\n '}',\n ].join('\\n');\n}\n", "import * as tf from '../../dist/tfjs.esm.js';\nimport * as fxImage from './imagefx';\n\nconst maxSize = 2048;\n// internal temp canvases\nlet inCanvas;\nlet outCanvas;\n// instance of fximage\nlet fx;\n\n// process input image and return tensor\n// input can be tensor, imagedata, htmlimageelement, htmlvideoelement\n// input is resized and run through imagefx filter\nexport function process(input, config): { tensor: typeof tf.Tensor | null, canvas: OffscreenCanvas | HTMLCanvasElement } {\n let tensor;\n if (!input) throw new Error('Human: Input is missing');\n // sanity checks since different browsers do not implement all dom elements\n if (\n !(input instanceof tf.Tensor)\n && !(typeof Image !== 'undefined' && input instanceof Image)\n && !(typeof ImageData !== 'undefined' && input instanceof ImageData)\n && !(typeof ImageBitmap !== 'undefined' && input instanceof ImageBitmap)\n && !(typeof HTMLImageElement !== 'undefined' && input instanceof HTMLImageElement)\n && !(typeof HTMLMediaElement !== 'undefined' && input instanceof HTMLMediaElement)\n && !(typeof HTMLVideoElement !== 'undefined' && input instanceof HTMLVideoElement)\n && !(typeof HTMLCanvasElement !== 'undefined' && input instanceof HTMLCanvasElement)\n && !(typeof OffscreenCanvas !== 'undefined' && input instanceof OffscreenCanvas)\n ) {\n throw new Error('Human: Input type is not recognized');\n }\n if (input instanceof tf.Tensor) {\n // if input is tensor, use as-is\n if (input.shape && input.shape.length === 4 && input.shape[0] === 1 && input.shape[3] === 3) tensor = tf.clone(input);\n else throw new Error(`Human: Input tensor shape must be [1, height, width, 3] and instead was ${input.shape}`);\n } else {\n // check if resizing will be needed\n const originalWidth = input['naturalWidth'] || input['videoWidth'] || input['width'] || (input['shape'] && (input['shape'][1] > 0));\n const originalHeight = input['naturalHeight'] || input['videoHeight'] || input['height'] || (input['shape'] && (input['shape'][2] > 0));\n let targetWidth = originalWidth;\n let targetHeight = originalHeight;\n if (targetWidth > maxSize) {\n targetWidth = maxSize;\n targetHeight = targetWidth * originalHeight / originalWidth;\n }\n if (targetHeight > maxSize) {\n targetHeight = maxSize;\n targetWidth = targetHeight * originalWidth / originalHeight;\n }\n\n // create our canvas and resize it if needed\n if (config.filter.width > 0) targetWidth = config.filter.width;\n else if (config.filter.height > 0) targetWidth = originalWidth * (config.filter.height / originalHeight);\n if (config.filter.height > 0) targetHeight = config.filter.height;\n else if (config.filter.width > 0) targetHeight = originalHeight * (config.filter.width / originalWidth);\n if (!targetWidth || !targetHeight) throw new Error('Human: Input cannot determine dimension');\n if (!inCanvas || (inCanvas?.width !== targetWidth) || (inCanvas?.height !== targetHeight)) {\n inCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n if (inCanvas?.width !== targetWidth) inCanvas.width = targetWidth;\n if (inCanvas?.height !== targetHeight) inCanvas.height = targetHeight;\n }\n\n // draw input to our canvas\n const ctx = inCanvas.getContext('2d');\n if (input instanceof ImageData) {\n ctx.putImageData(input, 0, 0);\n } else {\n if (config.filter.flip && typeof ctx.translate !== 'undefined') {\n ctx.translate(originalWidth, 0);\n ctx.scale(-1, 1);\n ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n ctx.setTransform(1, 0, 0, 1, 0, 0); // resets transforms to defaults\n } else {\n ctx.drawImage(input, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas?.width, inCanvas?.height);\n }\n }\n\n // imagefx transforms using gl\n if (config.filter.enabled) {\n if (!fx || !outCanvas || (inCanvas.width !== outCanvas.width) || (inCanvas?.height !== outCanvas?.height)) {\n outCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(inCanvas?.width, inCanvas?.height) : document.createElement('canvas');\n if (outCanvas?.width !== inCanvas?.width) outCanvas.width = inCanvas?.width;\n if (outCanvas?.height !== inCanvas?.height) outCanvas.height = inCanvas?.height;\n // log('created FX filter');\n fx = tf.ENV.flags.IS_BROWSER ? new fxImage.GLImageFilter({ canvas: outCanvas }) : null; // && (typeof document !== 'undefined')\n }\n if (!fx) return { tensor: null, canvas: inCanvas };\n fx.reset();\n fx.addFilter('brightness', config.filter.brightness); // must have at least one filter enabled\n if (config.filter.contrast !== 0) fx.addFilter('contrast', config.filter.contrast);\n if (config.filter.sharpness !== 0) fx.addFilter('sharpen', config.filter.sharpness);\n if (config.filter.blur !== 0) fx.addFilter('blur', config.filter.blur);\n if (config.filter.saturation !== 0) fx.addFilter('saturation', config.filter.saturation);\n if (config.filter.hue !== 0) fx.addFilter('hue', config.filter.hue);\n if (config.filter.negative) fx.addFilter('negative');\n if (config.filter.sepia) fx.addFilter('sepia');\n if (config.filter.vintage) fx.addFilter('brownie');\n if (config.filter.sepia) fx.addFilter('sepia');\n if (config.filter.kodachrome) fx.addFilter('kodachrome');\n if (config.filter.technicolor) fx.addFilter('technicolor');\n if (config.filter.polaroid) fx.addFilter('polaroid');\n if (config.filter.pixelate !== 0) fx.addFilter('pixelate', config.filter.pixelate);\n fx.apply(inCanvas);\n // read pixel data\n /*\n const gl = outCanvas.getContext('webgl');\n if (gl) {\n const glBuffer = new Uint8Array(outCanvas.width * outCanvas.height * 4);\n const pixBuffer = new Uint8Array(outCanvas.width * outCanvas.height * 3);\n gl.readPixels(0, 0, outCanvas.width, outCanvas.height, gl.RGBA, gl.UNSIGNED_BYTE, glBuffer);\n // gl returns rbga while we only need rgb, so discarding alpha channel\n // gl returns starting point as lower left, so need to invert vertical\n let i = 0;\n for (let y = outCanvas.height - 1; y >= 0; y--) {\n for (let x = 0; x < outCanvas.width; x++) {\n const index = (x + y * outCanvas.width) * 4;\n pixBuffer[i++] = glBuffer[index + 0];\n pixBuffer[i++] = glBuffer[index + 1];\n pixBuffer[i++] = glBuffer[index + 2];\n }\n }\n outCanvas.data = pixBuffer;\n }\n */\n } else {\n outCanvas = inCanvas;\n if (fx) fx = null;\n }\n\n // create tensor from image\n let pixels;\n if (outCanvas.data) { // if we have data, just convert to tensor\n const shape = [outCanvas.height, outCanvas.width, 3];\n pixels = tf.tensor3d(outCanvas.data, shape, 'int32');\n } else if (outCanvas instanceof ImageData) { // if input is imagedata, just use it\n pixels = tf.browser.fromPixels(outCanvas);\n } else if (config.backend === 'webgl' || config.backend === 'humangl') { // tf kernel-optimized method to get imagedata\n // we can use canvas as-is as it already has a context, so we do a silly one more canvas\n const tempCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n tempCanvas.width = targetWidth;\n tempCanvas.height = targetHeight;\n const tempCtx = tempCanvas.getContext('2d');\n tempCtx?.drawImage(outCanvas, 0, 0);\n pixels = tf.browser.fromPixels(tempCanvas);\n } else { // cpu and wasm kernel does not implement efficient fromPixels method\n // we can use canvas as-is as it already has a context, so we do a silly one more canvas\n const tempCanvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement('canvas');\n tempCanvas.width = targetWidth;\n tempCanvas.height = targetHeight;\n const tempCtx = tempCanvas.getContext('2d');\n tempCtx?.drawImage(outCanvas, 0, 0);\n const data = tempCtx?.getImageData(0, 0, targetWidth, targetHeight);\n pixels = tf.browser.fromPixels(data);\n }\n const casted = pixels.toFloat();\n tensor = casted.expandDims(0);\n pixels.dispose();\n casted.dispose();\n }\n const canvas = config.filter.return ? outCanvas : null;\n return { tensor, canvas };\n}\n", "import { TRI468 as triangulation } from '../blazeface/coords';\nimport { mergeDeep } from '../helpers';\nimport type { Result, Face, Body, Hand, Item, Gesture } from '../result';\n\n/**\n * Draw Options\n * Accessed via `human.draw.options` or provided per each draw method as the drawOptions optional parameter\n * -color: draw color\n * -labelColor: color for labels\n * -shadowColor: optional shadow color for labels\n * -font: font for labels\n * -lineHeight: line height for labels, used for multi-line labels,\n * -lineWidth: width of any lines,\n * -pointSize: size of any point,\n * -roundRect: for boxes, round corners by this many pixels,\n * -drawPoints: should points be drawn,\n * -drawLabels: should labels be drawn,\n * -drawBoxes: should boxes be drawn,\n * -drawPolygons: should polygons be drawn,\n * -fillPolygons: should drawn polygons be filled,\n * -useDepth: use z-axis coordinate as color shade,\n * -useCurves: draw polygons as cures or as lines,\n * -bufferedOutput: experimental: allows to call draw methods multiple times for each detection and interpolate results between results thus achieving smoother animations\n * -useRawBoxes: Boolean: internal: use non-normalized coordinates when performing draw methods,\n */\nexport interface DrawOptions {\n color: string,\n labelColor: string,\n shadowColor: string,\n font: string,\n lineHeight: number,\n lineWidth: number,\n pointSize: number,\n roundRect: number,\n drawPoints: Boolean,\n drawLabels: Boolean,\n drawBoxes: Boolean,\n drawPolygons: Boolean,\n fillPolygons: Boolean,\n useDepth: Boolean,\n useCurves: Boolean,\n bufferedOutput: Boolean,\n useRawBoxes: Boolean,\n calculateHandBox: Boolean,\n}\n\nexport const options: DrawOptions = {\n color: 'rgba(173, 216, 230, 0.3)', // 'lightblue' with light alpha channel\n labelColor: 'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel\n shadowColor: 'black',\n font: 'small-caps 16px \"Segoe UI\"',\n lineHeight: 24,\n lineWidth: 6,\n pointSize: 2,\n roundRect: 28,\n drawPoints: false,\n drawLabels: true,\n drawBoxes: true,\n drawPolygons: true,\n fillPolygons: false,\n useDepth: true,\n useCurves: false,\n bufferedOutput: false, // not yet implemented\n useRawBoxes: false,\n calculateHandBox: true,\n};\n\nlet bufferedResult: Result;\n\nfunction point(ctx, x, y, z = 0, localOptions) {\n ctx.fillStyle = localOptions.useDepth && z ? `rgba(${127.5 + (2 * z)}, ${127.5 - (2 * z)}, 255, 0.3)` : localOptions.color;\n ctx.beginPath();\n ctx.arc(x, y, localOptions.pointSize, 0, 2 * Math.PI);\n ctx.fill();\n}\n\nfunction rect(ctx, x, y, width, height, localOptions) {\n ctx.beginPath();\n if (localOptions.useCurves) {\n const cx = (x + x + width) / 2;\n const cy = (y + y + height) / 2;\n ctx.ellipse(cx, cy, width / 2, height / 2, 0, 0, 2 * Math.PI);\n } else {\n ctx.lineWidth = localOptions.lineWidth;\n ctx.moveTo(x + localOptions.roundRect, y);\n ctx.lineTo(x + width - localOptions.roundRect, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + localOptions.roundRect);\n ctx.lineTo(x + width, y + height - localOptions.roundRect);\n ctx.quadraticCurveTo(x + width, y + height, x + width - localOptions.roundRect, y + height);\n ctx.lineTo(x + localOptions.roundRect, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - localOptions.roundRect);\n ctx.lineTo(x, y + localOptions.roundRect);\n ctx.quadraticCurveTo(x, y, x + localOptions.roundRect, y);\n ctx.closePath();\n }\n ctx.stroke();\n}\n\nfunction lines(ctx, points: [number, number, number][] = [], localOptions) {\n if (points === undefined || points.length === 0) return;\n ctx.beginPath();\n ctx.moveTo(points[0][0], points[0][1]);\n for (const pt of points) {\n ctx.strokeStyle = localOptions.useDepth && pt[2] ? `rgba(${127.5 + (2 * pt[2])}, ${127.5 - (2 * pt[2])}, 255, 0.3)` : localOptions.color;\n ctx.fillStyle = localOptions.useDepth && pt[2] ? `rgba(${127.5 + (2 * pt[2])}, ${127.5 - (2 * pt[2])}, 255, 0.3)` : localOptions.color;\n ctx.lineTo(pt[0], Math.round(pt[1]));\n }\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nfunction curves(ctx, points: [number, number, number][] = [], localOptions) {\n if (points === undefined || points.length === 0) return;\n if (!localOptions.useCurves || points.length <= 2) {\n lines(ctx, points, localOptions);\n return;\n }\n ctx.moveTo(points[0][0], points[0][1]);\n for (let i = 0; i < points.length - 2; i++) {\n const xc = (points[i][0] + points[i + 1][0]) / 2;\n const yc = (points[i][1] + points[i + 1][1]) / 2;\n ctx.quadraticCurveTo(points[i][0], points[i][1], xc, yc);\n }\n ctx.quadraticCurveTo(points[points.length - 2][0], points[points.length - 2][1], points[points.length - 1][0], points[points.length - 1][1]);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.closePath();\n ctx.fill();\n }\n}\n\nexport async function gesture(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\n ctx.font = localOptions.font;\n ctx.fillStyle = localOptions.color;\n let i = 1;\n for (let j = 0; j < result.length; j++) {\n let where:any[] = [];\n let what:any[] = [];\n [where, what] = Object.entries(result[j]);\n if ((what.length > 1) && (what[1].length > 0)) {\n const person = where[1] > 0 ? `#${where[1]}` : '';\n const label = `${where[0]} ${person}: ${what[1]}`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, 8, 2 + (i * localOptions.lineHeight));\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, 6, 0 + (i * localOptions.lineHeight));\n i += 1;\n }\n }\n}\n\nexport async function face(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\n for (const f of result) {\n ctx.font = localOptions.font;\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n if (localOptions.drawBoxes) {\n if (localOptions.useRawBoxes) rect(ctx, inCanvas.width * f.boxRaw[0], inCanvas.height * f.boxRaw[1], inCanvas.width * f.boxRaw[2], inCanvas.height * f.boxRaw[3], localOptions);\n else rect(ctx, f.box[0], f.box[1], f.box[2], f.box[3], localOptions);\n }\n // silly hack since fillText does not suport new line\n const labels:string[] = [];\n labels.push(`face confidence: ${Math.trunc(100 * f.confidence)}%`);\n if (f.genderConfidence) labels.push(`${f.gender || ''} ${Math.trunc(100 * f.genderConfidence)}% confident`);\n // if (f.genderConfidence) labels.push(f.gender);\n if (f.age) labels.push(`age: ${f.age || ''}`);\n if (f.iris) labels.push(`iris distance: ${f.iris}`);\n if (f.emotion && f.emotion.length > 0) {\n const emotion = f.emotion.map((a) => `${Math.trunc(100 * a.score)}% ${a.emotion}`);\n labels.push(emotion.join(' '));\n }\n if (f.rotation && f.rotation.angle && f.rotation.angle.roll) labels.push(`roll: ${Math.trunc(100 * f.rotation.angle.roll) / 100} yaw:${Math.trunc(100 * f.rotation.angle.yaw) / 100} pitch:${Math.trunc(100 * f.rotation.angle.pitch) / 100}`);\n if (labels.length === 0) labels.push('face');\n ctx.fillStyle = localOptions.color;\n for (let i = labels.length - 1; i >= 0; i--) {\n const x = Math.max(f.box[0], 0);\n const y = i * localOptions.lineHeight + f.box[1];\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(labels[i], x + 5, y + 16);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(labels[i], x + 4, y + 15);\n }\n ctx.lineWidth = 1;\n if (f.mesh && f.mesh.length > 0) {\n if (localOptions.drawPoints) {\n for (const pt of f.mesh) point(ctx, pt[0], pt[1], pt[2], localOptions);\n // for (const pt of f.meshRaw) point(ctx, pt[0] * inCanvas.offsetWidth, pt[1] * inCanvas.offsetHeight, pt[2]);\n }\n if (localOptions.drawPolygons) {\n ctx.lineWidth = 1;\n for (let i = 0; i < triangulation.length / 3; i++) {\n const points = [\n triangulation[i * 3 + 0],\n triangulation[i * 3 + 1],\n triangulation[i * 3 + 2],\n ].map((index) => f.mesh[index]);\n lines(ctx, points, localOptions);\n }\n // iris: array[center, left, top, right, bottom]\n if (f.annotations && f.annotations['leftEyeIris']) {\n ctx.strokeStyle = localOptions.useDepth ? 'rgba(255, 200, 255, 0.3)' : localOptions.color;\n ctx.beginPath();\n const sizeX = Math.abs(f.annotations['leftEyeIris'][3][0] - f.annotations['leftEyeIris'][1][0]) / 2;\n const sizeY = Math.abs(f.annotations['leftEyeIris'][4][1] - f.annotations['leftEyeIris'][2][1]) / 2;\n ctx.ellipse(f.annotations['leftEyeIris'][0][0], f.annotations['leftEyeIris'][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.fillStyle = localOptions.useDepth ? 'rgba(255, 255, 200, 0.3)' : localOptions.color;\n ctx.fill();\n }\n }\n if (f.annotations && f.annotations['rightEyeIris']) {\n ctx.strokeStyle = localOptions.useDepth ? 'rgba(255, 200, 255, 0.3)' : localOptions.color;\n ctx.beginPath();\n const sizeX = Math.abs(f.annotations['rightEyeIris'][3][0] - f.annotations['rightEyeIris'][1][0]) / 2;\n const sizeY = Math.abs(f.annotations['rightEyeIris'][4][1] - f.annotations['rightEyeIris'][2][1]) / 2;\n ctx.ellipse(f.annotations['rightEyeIris'][0][0], f.annotations['rightEyeIris'][0][1], sizeX, sizeY, 0, 0, 2 * Math.PI);\n ctx.stroke();\n if (localOptions.fillPolygons) {\n ctx.fillStyle = localOptions.useDepth ? 'rgba(255, 255, 200, 0.3)' : localOptions.color;\n ctx.fill();\n }\n }\n }\n }\n }\n}\n\nexport async function body(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\n ctx.lineJoin = 'round';\n for (let i = 0; i < result.length; i++) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n ctx.lineWidth = localOptions.lineWidth;\n ctx.font = localOptions.font;\n if (localOptions.drawBoxes && result[i].box && result[i].box?.length === 4) {\n // @ts-ignore box may not exist\n rect(ctx, result[i].box[0], result[i].box[1], result[i].box[2], result[i].box[3], localOptions);\n if (localOptions.drawLabels) {\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n // @ts-ignore box may not exist\n ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 3, 1 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n // @ts-ignore box may not exist\n ctx.fillText(`body ${100 * result[i].score}%`, result[i].box[0] + 2, 0 + result[i].box[1] + localOptions.lineHeight, result[i].box[2]);\n }\n }\n if (localOptions.drawPoints) {\n for (let pt = 0; pt < result[i].keypoints.length; pt++) {\n ctx.fillStyle = localOptions.useDepth && result[i].keypoints[pt].position.z ? `rgba(${127.5 + (2 * result[i].keypoints[pt].position.z)}, ${127.5 - (2 * result[i].keypoints[pt].position.z)}, 255, 0.5)` : localOptions.color;\n point(ctx, result[i].keypoints[pt].position.x, result[i].keypoints[pt].position.y, 0, localOptions);\n }\n }\n if (localOptions.drawLabels) {\n ctx.font = localOptions.font;\n if (result[i].keypoints) {\n for (const pt of result[i].keypoints) {\n ctx.fillStyle = localOptions.useDepth && pt.position.z ? `rgba(${127.5 + (2 * pt.position.z)}, ${127.5 - (2 * pt.position.z)}, 255, 0.5)` : localOptions.color;\n ctx.fillText(`${pt.part} ${Math.trunc(100 * pt.score)}%`, pt.position.x + 4, pt.position.y + 4);\n }\n }\n }\n if (localOptions.drawPolygons && result[i].keypoints) {\n let part;\n const points: any[] = [];\n // shoulder line\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position.x, part.position.y]);\n curves(ctx, points, localOptions);\n // torso main\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightHip');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftHip');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position.x, part.position.y]);\n if (points.length === 4) lines(ctx, points, localOptions); // only draw if we have complete torso\n // leg left\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftHip');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftKnee');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftAnkle');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftHeel');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftFoot');\n if (part) points.push([part.position.x, part.position.y]);\n curves(ctx, points, localOptions);\n // leg right\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'rightHip');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightKnee');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightAnkle');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightHeel');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightFoot');\n if (part) points.push([part.position.x, part.position.y]);\n curves(ctx, points, localOptions);\n // arm left\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'leftShoulder');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftElbow');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftWrist');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'leftPalm');\n if (part) points.push([part.position.x, part.position.y]);\n curves(ctx, points, localOptions);\n // arm right\n points.length = 0;\n part = result[i].keypoints.find((a) => a.part === 'rightShoulder');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightElbow');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightWrist');\n if (part) points.push([part.position.x, part.position.y]);\n part = result[i].keypoints.find((a) => a.part === 'rightPalm');\n if (part) points.push([part.position.x, part.position.y]);\n curves(ctx, points, localOptions);\n // draw all\n }\n }\n}\n\nexport async function hand(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n for (const h of result) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n let box;\n if (!localOptions.calculateHandBox) {\n box = localOptions.useRawBoxes ? h.boxRaw : h.box;\n } else {\n box = [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, 0, 0];\n if (h.landmarks && h.landmarks.length > 0) {\n for (const pt of h.landmarks) {\n if (pt[0] < box[0]) box[0] = pt[0];\n if (pt[1] < box[1]) box[1] = pt[1];\n if (pt[0] > box[2]) box[2] = pt[0];\n if (pt[1] > box[3]) box[3] = pt[1];\n }\n box[2] -= box[0];\n box[3] -= box[1];\n }\n }\n if (localOptions.useRawBoxes) rect(ctx, inCanvas.width * box[0], inCanvas.height * box[1], inCanvas.width * box[2], inCanvas.height * box[3], localOptions);\n else rect(ctx, box[0], box[1], box[2], box[3], localOptions);\n if (localOptions.drawLabels) {\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText('hand', box[0] + 3, 1 + box[1] + localOptions.lineHeight, box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText('hand', box[0] + 2, 0 + box[1] + localOptions.lineHeight, box[2]);\n }\n ctx.stroke();\n }\n if (localOptions.drawPoints) {\n if (h.landmarks && h.landmarks.length > 0) {\n for (const pt of h.landmarks) {\n ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * pt[2])}, ${127.5 - (2 * pt[2])}, 255, 0.5)` : localOptions.color;\n point(ctx, pt[0], pt[1], 0, localOptions);\n }\n }\n }\n if (localOptions.drawLabels) {\n const addHandLabel = (part, title) => {\n ctx.fillStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * part[part.length - 1][2])}, ${127.5 - (2 * part[part.length - 1][2])}, 255, 0.5)` : localOptions.color;\n ctx.fillText(title, part[part.length - 1][0] + 4, part[part.length - 1][1] + 4);\n };\n ctx.font = localOptions.font;\n addHandLabel(h.annotations['indexFinger'], 'index');\n addHandLabel(h.annotations['middleFinger'], 'middle');\n addHandLabel(h.annotations['ringFinger'], 'ring');\n addHandLabel(h.annotations['pinky'], 'pinky');\n addHandLabel(h.annotations['thumb'], 'thumb');\n addHandLabel(h.annotations['palmBase'], 'palm');\n }\n if (localOptions.drawPolygons) {\n const addHandLine = (part) => {\n if (!part) return;\n for (let i = 0; i < part.length; i++) {\n ctx.beginPath();\n ctx.strokeStyle = localOptions.useDepth ? `rgba(${127.5 + (2 * part[i][2])}, ${127.5 - (2 * part[i][2])}, 255, 0.5)` : localOptions.color;\n ctx.moveTo(part[i > 0 ? i - 1 : 0][0], part[i > 0 ? i - 1 : 0][1]);\n ctx.lineTo(part[i][0], part[i][1]);\n ctx.stroke();\n }\n };\n ctx.lineWidth = localOptions.lineWidth;\n addHandLine(h.annotations['indexFinger']);\n addHandLine(h.annotations['middleFinger']);\n addHandLine(h.annotations['ringFinger']);\n addHandLine(h.annotations['pinky']);\n addHandLine(h.annotations['thumb']);\n // addPart(h.annotations.palmBase);\n }\n }\n}\n\nexport async function object(inCanvas: HTMLCanvasElement, result: Array, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n const ctx = inCanvas.getContext('2d');\n if (!ctx) return;\n ctx.lineJoin = 'round';\n ctx.font = localOptions.font;\n for (const h of result) {\n if (localOptions.drawBoxes) {\n ctx.strokeStyle = localOptions.color;\n ctx.fillStyle = localOptions.color;\n if (localOptions.useRawBoxes) rect(ctx, inCanvas.width * h.boxRaw[0], inCanvas.height * h.boxRaw[1], inCanvas.width * h.boxRaw[2], inCanvas.height * h.boxRaw[3], localOptions);\n else rect(ctx, h.box[0], h.box[1], h.box[2], h.box[3], localOptions);\n if (localOptions.drawLabels) {\n const label = `${Math.round(100 * h.score)}% ${h.label}`;\n if (localOptions.shadowColor && localOptions.shadowColor !== '') {\n ctx.fillStyle = localOptions.shadowColor;\n ctx.fillText(label, h.box[0] + 3, 1 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.fillStyle = localOptions.labelColor;\n ctx.fillText(label, h.box[0] + 2, 0 + h.box[1] + localOptions.lineHeight, h.box[2]);\n }\n ctx.stroke();\n }\n }\n}\n\nexport async function canvas(inCanvas: HTMLCanvasElement, outCanvas: HTMLCanvasElement) {\n if (!inCanvas || !outCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement) || !(outCanvas instanceof HTMLCanvasElement)) return;\n const outCtx = inCanvas.getContext('2d');\n outCtx?.drawImage(inCanvas, 0, 0);\n}\n\nexport async function all(inCanvas: HTMLCanvasElement, result: Result, drawOptions?: DrawOptions) {\n const localOptions = mergeDeep(options, drawOptions);\n if (!result || !inCanvas) return;\n if (!(inCanvas instanceof HTMLCanvasElement)) return;\n if (localOptions.bufferedOutput) {\n if (result.timestamp !== bufferedResult?.timestamp) bufferedResult = result;\n } else {\n bufferedResult = result;\n }\n face(inCanvas, bufferedResult.face, localOptions);\n body(inCanvas, bufferedResult.body, localOptions);\n hand(inCanvas, bufferedResult.hand, localOptions);\n gesture(inCanvas, bufferedResult.gesture, localOptions);\n object(inCanvas, bufferedResult.object, localOptions);\n}\n", "// data:image/jpeg;base64,\nexport const face = `\n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`;\n\n// data:image/jpeg;base64,\nexport const body = `\n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\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAa2p1UYo5adbz+xbxMlvqJ1OqjDHLXree0ejmzNrWm953tPmTPWbWneZ7yoy5YhjrXXTjH8s75N\nmtkyxt0VZM2/m175N1V03yTKubMLXVXybeYLLX2VXy7eam+b0bOg4VquJW+rry4/O9uyZOq3UjVm\n9r25axMzPaIdvhns1kzbZddM0p5Y47z8/R2+HcF03Doi1a8+Xzvbv+TotJnjDXkt+K8ODHp8cY8N\nIpSO0RCwF2YAAAAAAAAACvUZYw6fJkntWN3k8dfHz2vLucdz8mkjFE9bz1+UOZosX1UzPm0nqI/W\nMYo9FlcPNklfFGeH/NshLGun+Cz6PtHZtVZWlRLS+jxPkRpIn7rdoupHTdA5s6SI+7H6Mfo+32Y2\n+To3neSIiZ7A0IjPXpXLePlMotGW3272t85datKzHZjbTVnsDj+FG/2Y/RlGP4R+jo20u7H6N1Ql\no+H8I/REY957R+jpfReiK6eOYHLtj2tttH6KrY/6Y/R2c+kjeJiFVtLG24hxpw7/AHY/RRkw9O37\nO99Hrt1YX0tfOBLjcGp4XF8c+u8fs9c4dcVcGemSI61nd3IneN1orQAAAAAAAAAAAAABFqxes1tE\nTE9JiUgPKcX4RbRXnNgiZwWnrH4XPi28PdXpW9JraImsxtMS8pxXhF9DecuGJtgmf+1TWW2N/la1\nL7N7T5e3Vy6W3hsYcvLbqzbO9jvvCzvDR0+XeO7crO6FmGSvRThy/RtVXJ92elvk2rRvDUzU7pl4\nizsd2J3jeBpcNz+Lg5LT7+Pp+Xk3W7js5eAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs0NTrN96Yp6edkW8Wzm6+LNTq4pvTHO9vOfRoWtt\n1mes95YWvs1s2fZldddOczLPLn2ju0MmebT3YZc2/mpm3qqllN1drsbZIhr3yzvtHf4AsvlYYseb\nV5Yx4KTe0+UQ6nDvZ3UazbJqd8OKeu33peq0eh0+hxcmnxxWPOfOfm0mP+steT/ji8N9mKY9suum\nL37+HHaPm9DSlaVitKxWsdohI0Y22gAgAAAAAAAAAABXnyRhw3yT92Nwef4xm8bVzET0rPJH5d12\n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\nAOZE/OsPS29nuH27YrV+VpeV9pdPXhOtw49NG9Mld55+vXcTPd42I47qo7xSfyWV9oM8d8VJ/VxM\nd8l46xWF9cV7en6o/qLfxp2I9ob+eCv/AHMo9op89P8A/wBORGmyT5R+qfo2X8P7n9Q/jTsx7RR5\n6ef+4/8AuHftg/8A6cWcOSO9J/WEbWr3pY7Efzp2Lcfv5YK/9zWy8d1E/ZpSv5Oba1/+Hb9lc+LP\nbFt87I7E/wAabWbiurvEx4nL/pjZzc2bJkn372t85ZXx55/BX85lucC0vPxnTxlnnjm32mOiZqUu\nLJ2p4TwnVavNWaYbRTfre0bQ99pcH0bT0xb78vmtiIiNojaErMwAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAHnfarF7umzRHaZrLjYrdIen9ocPi8JyTt1xzF4eUw23rCm3R4r6bMy\nwt6kdTaWLdjswmNoZontsCm0K5XWjopnuDC0dGpqG5bs08/daKV672MjbSaif6oh6Z5f2LtvptRX\n0tEvUN3Jfo8f7cYve0eX4zV7B5z20xc/C8eSPuZIRficfXlcPaG7ino08HWIbePpLF2NuiyOyrHK\n3fZFSwuovHVfaVF4QK5YWTM9UT0EKry6Ps1Tn4zjn8NZn9nOtLseydObiWW34cf918fWfk+PYANn\nKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq1WKM+ly4p+/WYeBxTNd6zG0xO0\nvobw3FcP0bi2em20Tbmj5Srr418V9sa2Z7qKyzi07MXUylhaU7yjqhLCeiq3ddaFNxFYW7NLNG8t\nzya+WO6Va9J7FW66mvwidnrXiPY3Ny8RyUn71Jj9Ht3RPjk19HK9pMHj8D1ER3rHN+jqqtTjjNps\nuOe16zAifXzfTz7kNyndpYazS9qT0mszDdoxrsi6m8LazMq6zDOsq1ZEyrt1WWlXaUCqyq0rbKbi\nFdp6PReyFd8uqv8ACsfy83aXrPZHHto89/xX2/SP/dpj6y8vx6EBq5gAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAB5n2q03LfDqqx39y39npmlxbS/TOG5se29tuavzgWzeV4mtui2\nO3RRSY2hdVhqO2MvI36iu9lUsrSrvDHn6spnmSiq5jooyV6tq1VV69RC32byTh43h8otMx+r6I+Z\naK/g8TwX7bXh9Mid4iW+fjl8n1ICWb57xLBOm4zqse20Tbmj8+qKdnS9q8PhcTw5tumSm0/OHMxz\n0Za+uzx3sX1t0Zxurr1ZxvspWiZYWZbsbT0QK7KLrZVZJFaqt5vbezNOTg9J/FaZeJns93wCvLwb\nT/GJn92uGHldIBowAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADuAPA67F9H4l\nqMW20VvO3yRWW97T4fC4rXJHSMtI/WGhVlue3b473K2KzMML4+62tujG9pnozXaOSOVFMnVbmq1t\ntrJRW5E7wwvUxTvCyY6CHOt7moxz6Wh9PxTzYaT61h8x1MbZK/OH0zTf+Fxf6I/htj45vL9WgLMn\nmvbPFvocGWO9L7fq85p5maw9d7VYvE4JkmPu2if3eW0+PasdFNOnxfF1Y2hlykRsmY+LJ0MZjZXa\neq2eyi8oQTO0KLdZWzPRjWu6VaqtHR73g0bcI0sf0Q8Nkq93wqNuFaWP+XDTDDytwBowAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAef9q8HNpcGaI60vtPyl56k9Iew49j8ThGe\nPwxFv0l4zH2U26fDfTYiyJljvsjf4sm6vJ1hrXjq2MkqLdZEVbgbMx0auGdmzNt6iHN1Ub5af6of\nTdPG2nxx6Vj+HzaaTm1+nx/iyVj930ysbViPRrj45vL9SAuyc7j1efguqj+jd4/T33rD3HEcPj8O\n1GP8WOY/Z4TTT7sKadHhbcsZnaCJ3TPZk6VdrKbTutmP0U2nqgrGOsr8deiuI2X09EqKM1dt3uuG\nf/jdN/06/wAPE546S9rwud+Gaaf+XH8NMMPK2wGjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAABrcRp4nDtRWPPHP8PCYusPoWSvNjtX1iYfPuWaXtX8MzCuvjfw32siu8ptXoxi\n0wy5t4YulReqmazu2skbquURWFInddM7VYRGyL291KFnCcfj8e0le/Lbmn8n0N4b2Ur4nHLWmPsY\n5e5a5+OXyXugBZmiY3iY9Xz7NjnTa3Ph/BeYj5PoTxftFg8Hjk2iOmWkW/Psrr418V5WrWd2faFc\nV2jdnEMXWxntupmN7NiYU27iWML6dVMVnddjgVqMsdHr+CW5uE6f4Rt+7yuSsTDv+zWXn0WTHP3L\n/tK+GHl+O0A1c4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8Dn93W56/wDM\nt/L3z59qp24jn+OS38lnpr4r7ZxHQ2TEstt3PXUrt27K57rr1VT0BjKnJPRbMqMs7QlV2fYvHvrd\nVknyrEfu9m8f7FZI8fVU85iJewbT45NfQBKo817W4eulzxHaZrL0rje09ItwqbfhtBVs3leai8RD\nKLw1sduesL606dWFdsZT1jdhNeq6K9DlhCVUU6s4jZnt1YzAhnM71dH2bycmszY/K1d/0c6OzY4R\nfwuK4p8rTstn6z8k7HrwGzkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHz3\nVxvr80/8y38voTwGpj/F5/8AqT/JfjTx/WVeyY6FPspc9dZPVXaOq2WEwIUTVRmjo2rNfLHRI3vZ\nDJycXtX8dZh7t879nsnhcbwz23tt+r6I2nxyb+gCVBzuPY/E4PqI9K7ui19fTxNBnp60n+Aj5/pJ\n3jZu1aOnnltMNussdfXbm+l3ZM9URHREdZVXTuT1Nk7boQiOkJw28PU47/htEp5eivJPLMTCZ9Vv\nx7mJ3iJ9UqNHk8XR4b+tIXuhxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD\nweqjbWZ4/wCZP8vePCaz/wDIaiP+Zb+UX408f0r9lOxWOifJhXWjfyYWllPRXYQxnrCrJHRd3YZI\n6A1NJecHEsN/S0T+76bE7xE+r5dk93LW3pL6ZpMni6PDf8VIn9m2fjm8s9rgFmQxvHNS0esbMiew\nPnHLyai9fS0w2aNfUTtrs3+uf5bGPqy068fF227KtSsdFlKqNGMV6myyY6sbdIQI8tlOWOi6Jhhk\nj3RD0vA8nicMx9etZmHRcT2Zyb6XNT8N9/2dt0T449T2AJVAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAHhdfG3E9TH9cvdPEcXjk4zqI/q3L8aeP6xr2TsxpLOekMK6mFo6qpXSrm\nOqBixvHSVmzC4OfqK7S9/wAByeLwbTW9K7fo8Fqo6Paeyl+fglI/Da0NcMPK7QC7AAB8313TiOf/\nAKk/y2MHWrX4jG3E9R/1Lfyv0/aFNOrHxuU7LI7MMayGTVlHWUXhNe6Z6wIUsb9d1m20q7dkDpez\nN9tRqKT5xEvRvKez9+Xis1/FSYerb5+OTyf6AFlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAB43j9eXjN/jWJ/Z7J5L2mry8Upb8VIF8f6aGOey2eynHvOy7bowrrYSxZSwQJ2YXZ\n92N4BoanrEvVexmTm4blr+HJ/aHltRHSXofYm/1Wrp5RaJaYY+X49WA0c4AD51xONuKan/qW/lbp\n+0MOLRtxbU/9SU4J7KadWPjep2WQrr2WRPRk1TvsndXMpiRCb9FNu0rbTuqvKBscCjfi9PhWZeue\nV9n434rafTHL1TfPxy+T/QAszAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHmv\navHtfTZfnV6VxPajHzcNrf8ABeJFs/XnMcr4no18c+6vr2YadkY2YM57sEDLyY37Mo7MMnYGlqO0\nvQ+xNfqNVb1tEfs87qZ2rL0/sVX/AHdnt65P7Q0wx8vx6UBo5wAHz/jUbcX1PT78qtO2vaCnJxjP\n8Zif2amnnspp04+OjWejKJ6MKdmcMmyJn4m5ZHzEVPMwtJv0VZLbQDqezcb8RzT6Y/7vUPM+ytZt\nn1OTyiIh6Ztn45N/6AFlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABocbxeLw\nnUR5xXm/Rvq8+OMuDJjntaswEeBxT0bNZ6NatZpNqz3rO0rqsdO3PxlaWEMpY+aqWXkryT0ZT2V3\n7A0dVPuy9f7G124NM/iyT/Z4zWT7sw957MYfB4Fp4/FE2/WWmGHldcBowAAeM9qKcvFeb8VIly9P\n0nq7ntbTbVYL+tJj93CwT76unR4/jo0nozhhTsy3Y1sWljM9Ce7HyQIm3RRlttVbaWrnt0Sh6n2U\nx8vD8mSfv3/h3XN4Bi8Lg2nj8Uc36y6TeOPXugCUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAPD8RxeBxXUU26Tbmj8+quro+02Lw+I4ssdslNvzhzazvDPbq8d7GW7Dfqz2VzG\n0s2qd+iu/Zn5Ksk9BVztX1mI8930zh2LwOHabH+HHWP2fNYp4+vwYvxXiP3fUqxtWIjyjZtj45/L\nfaQFmQADzftfj3w6fJ6WmHmsP23rvaqnNwqLfhvEvIYZ+sV038bo0noy36MK9oZQxrdMyrlnMbMZ\nQKrS1M07zEestq/RRjr4utwY/wAV4j91p9V18fQdJj8LR4ccfdpEfsuREbREJbuMAAAAAAAAAAAA\nBAJAAAAEAJEAJQAJQAJEAJQAJQAJEACUJAQlAJEAJQAJQJAAAEAJEAJBAAAJAABAJEJAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwvanDzaPFmjvjv8A\ntLztJ3h7HjGHx+FainnFeaPnHV4vFbeIU038VbHeGF+kso7Mb9mTdhKnLK3dRm7SIrHhGPxeP6Sv\n9cT/AHfSnz72Zx+J7Q45/BWZ/Z9BbZ+OXyfQBZQABzeP4/E4NqI9Ii36S8Ng/wAx9C4jTxOH6ivr\njn+Hz3B/mQi/GvjdCnWNlsdI2V07LIlg6USrt2ZzZXMoFV+zPhGLxeOaavpbm/RVltEN72Yx+Jxm\nb7dKUmf7L5+s9/HtRA2cqRACRACRACRACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQCQQCRACRACRCQBCQBCQB\nACRACRACRACRACL1i9LVntMbPATTwdRkxT3pea/u+gPE8Xx+DxrPHlaYt+qNfGvjvtXXsi0dOrKk\ndEXjZg6VMtbP2bMtXUdpEV0/Y2nNxbNf8OP+727xvsXH+N1U/wBEfy9k3nxyb+gCVQAGOWvNivX1\nrMPnGGOXNNfOJ2fSZ6w+dZKeHxDPX8N7R+6L8a+L63KdoZ7q6zvEMpnowdKJ6ywmWUyqvIKM0vQ+\nx+D6rU55+9aKx+TzWa36vbezmDwODYenW+95/Nphj5L6dQBo5wAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEiAAAEoA\nAAAAAAAAAAAAAEAkEAkRuAkQbgkQAkQAkQAkQAl5T2nx8nEMOT8dNv0l6pwfarHvpcGWPu32/WCr\nYvK4mOem6b9mGKd4Z3idmFdka0y1c892zfpMtLPaNpEV6D2Kj/Eauf6YeweQ9ieuTVz8K/3evbT4\n5NfQBKoAA8FxCvJxrUx/XMvevD8Zry8fz/Haf2RfjTx/6RSOnRMyypHu9kXjowrqVSrvPRnZVl6V\nkK0775MsUjvadn0nT4ow6bFijtSsVfPuFYvpPGtNTy54mfy6vorXDm8l9pEC7JIgBIgBIgBIgBIg\nBIgBIhIAgBIhIAgBIgBIIBIAAhIAhIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAA\nAAAAAAAAABAJQkAEAAAAAAAAAAjc3BIjdG4Mkbo5kcwMjdhzHMDPc3V8xzAs3N1fMjmBZubq+Y5g\nWbm6vmOYFm5ur5jmBZubq+Y5gWbm6vmOYFm5ur5jmBZubq+Y5gWbm6vmTzAz3N2HMnmBlu5ftFTx\nOEZJ/DMW/d0t2rxKni8N1FPWkiZ9eS08e7Cy8dGGn6UhZaJljXZGnmc3UT3dPP2cnUT78xCIV6j2\nH/8A9c/6f7vXPI+w8bU1U+vL/d63du5NfUiDcVSIAS8b7RV5eOb/AIqRL2TyXtNX/e2KfXH/AHlF\n+NPH/pr4+2xcxx0hFpY11K7R16KM32ZWz3UaidqSgrc9kcPicWyZJjfw6T+727y3sXh2xarN+K0V\nh6lvPjj3e0ASqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQAAAAAkQAkQAkAAAAAAAAAAAAAAA\nEgAAAAAAAAAAAAAAAAAAAAAgAAABKDcAN0bgkY8xzAyRux5kcwM9zdXNkTcFm6OZXzMeYFvMibKu\nZHMC2bo51U2RuC2bom6rc3BZzom6sBZzI52ADPnOdggFnMc6skFnMc6rc3BbznOp3RzAv50c6nml\nHMC/nOf4qOY5wX85zqOc5wbHOc7X5znBsc6edr85zg2ec52vzpi4NjmY5bROG+/bllVzsNTk5dLl\nn0pP8BHmMHWNmzt0aum8obm08vVjfrtnxztR0mXHzTvaZdjVRMTLkZo6yiFen9iZ2pqY/wBP93rN\n3kPY+/LfPX1rE/u9XzN3HfqzdO6vmTuIZ7m7Hc3Bnu8t7TR/vHBP9E/y9Pu837SV31umn+if5Rfi\n/j/01MMb1hjkrtKzBG0bMsmOZY11tOYamr6Und0LUc7XT7u3rJPqL8er9lcPhcFpbzyWm39v7O00\n+FYvA4Zpsc94xxu227jv1IAgAAAAAAAAABKAAAASgASgBIgBIgBIgBIhIAAAAAAAAAAAAAAAAAAC\nUACUJAAAAAAAAAAAABIAAAAAAAAAAAAAAAAAAAAg3AEbomQZbo3YzLGbAz3RNlc3YzcFs2YzdVN2\nM2Bdzom6nmNwW86JurTAMuY3REJ2BB1ZRVMVBhsbSsiqeUFXLucq3lTygp5TlXcpygp5TlXcpygp\n5TlXcqOUFXKjlXcrGYBXysdlswiYBVMdUTCyY6sZBWxlnMMZgGLGZZSwkDdHMiWO4MuY5mEyjcFn\nN1OdVzHMC3nTzqeY5gX85zqOZPMC+Lqdbk20eb/RKOZr8QybaK/XvtH7iZ9aGlp2luzT3fg19NHS\nOjbmPcYX67XH1XSZ9XIzRvMuzrK7zLkZYmYnciunb9lZ5dTk+OP+71cXeP8AZnJ/ip2nf3J/l6iL\n/Fu5L9bMWZczXi6YuIbEWTzKIuyiwLt3nuO25uI4a/hx7/rLuczg8TicvFLbfdpEK6+NPH/phhjo\nstLGkctUWnoxrrU3j1cnWTzZq1jzl1clo5Zcu8c+txR63iP3Tn6pv4+g4o5cVI9IiGe7CJ2iE7t3\nGyN2O6dwSINwSISAlAAlACRAAlAAlACRACRCQAAAAAAAAAASgASISAAAAAAAAAAAAACQAAAAAAAA\nAAAAAASAAAAAAAAAAAAAAAAIAAAQCAJljuljsCJlhMs9mOwMJYys5TkBVsjZdyHICrZPKt5E8oK4\nqmKrOVOwMIqyirPY2Bjyp2ZbAI2NmSARsbMgEbI2ZAMdjZICNkbMkSCNmOzJEgx2YyzljMAwlhKy\nWEwCuWErJhhMArlhLOWEgxljMpljIImWMyTKJA3N0IBO5vux3NwZbnMx3NwZczT4jf3MdPW27a3a\nfJOq1XNP2KdIRfi+J2trSYfcjeF+Wm1OicVeWIiN9kai8xjY12ORqultnI1Ecsujq79XP1FovWYI\nrTgeq+j8QrWZ+3Mx+r2UXeC0WG2Ti2kiN5mL807eUREvbzbaejefHJv62Iv8WUXa0WTFhVtRdlF2\nrz9WUXBtc7jR9dqc2T1ttHyhvZMvJitb0jdq6XHNcNenWVN3028U99WRj6Kb02be3Tq18/SN2Lpc\n3UdN9nOmZrqKX/DaJ/d0svvTLRzV3jomK6+Pd1vvWJj0ZczT0mXxNJht60hfFnQ4qu3N1cWTEgs3\nTur5k7gz3N2O5uDM3Y7m4MtxBuCQASIASIASAAAAAAACRCQAAAAAAAAEoSAAAAAAAAAAAlAAlCQA\nAAAAAAAAAAASAAAAAAAAAAAAIASgAAAEJAQJQCNkbMgGOyOVnsAw5TlZ7GwMOVPKy2NgY7GzIBGx\nskA2AAAAAAAAAAQkBAEghEskAxYzDPZGwK5hjMLJhjMAqmGEwumrCagomFcw2JqqtUFEsLLrV82F\no7gqljKyYYTGwMZRKUSCAQAboJnaN5Bjkneu0d5W4ccViIiOzHFWbTzNumP1Zarr8eeRMbxDW1Mx\nNO67NbkhzNVnmInqzaOZrL93JyZeV0M1++7S02jvxDWxhxx033tPpC8Z6rrezWjmZyazJG2/u03h\n2vFibTHoqvamiwVwY+nLGzV0+SZ1Mx8G0/45tOhzJ5lXMc3UVXRdlF1HP+iYsDPLPPy49/tz1+Te\npSIr0ho6ak5Ms5J8o2q6NImOrHV7XX488ypzTtHXo0s9t6zG7c1G1qz6ubeZiZ3UatXJG3yauSO7\ncvMTEx5tPLb3prPRMVr0HB8vicNxf0+7+kt+LOJwTJyY/Bnz3tH93X36N58cWvq6LSyiyndMSlC7\nmZcymLJiwLosmJVRLKLAtiU7q4lMSCzc3YxJuDMRuAlKAEgAAAlAkAAAAAABKAEgAAAAAJAAAAAA\nAAAAAAAEgAAAAAAAAAAAAAkAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAhIAAACAAAASgAAAAAAEAAAA\nhGzJAImGMwzQDDZjNVuyNgUTVhNGxysZqDVmiu1G5NN2M4waM0+DCaN2cbGcQNGaMZq3JxMJxA1J\nqx2bU4kU09slorWNwa20z02RXHbJbl26QvtFovbHWkxEdJt5y2MOHlr2U1W3jx+1hiw8vSO63lmI\nXRTaEWmtY6snRHO1VpmJ+DjavpSZl2s8b7y4HFcnh0n0gha5ebJN55KRM2mdoiPN6fh+kpwXh0Wy\nRHj5Otp/s5Ps1p62y31+em9aTMYt/OfVfxTiPjZ52naI7fBrI5t66xz5+a1rW7yx0eSL6iZjtEOX\nqNbSletom3lENjh2fbHzbbWt3iVozruc+5ztWubf4M4ybpQ2Oboyrva0Vjza8WdDR4OkXt3n9ldX\nkaePP9VtYqctYhdvt5oivTeCZ2YOxXk6ubqMfV0b9mrljfqlFcq88k7z2U5axeItDa1OPessuC8P\nya7XRWYnwqdbT/ZMilvIu4dpslNdixXja8Y5tt85djZdbDWnGOesRtXFtuw6T27No5Kx2OrKYQlC\nExKJgBnEpiyvdlEgsizKLKollFgWxLKJVRLKJBbEp3VxLKJBnuMWQJEbpBIAAAJAAAABIAAAAAAA\nlAJAAAAAAAAAAAAAASAAAAAAAAAAAAAJAAAABAJABAlAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAA\nAAABAJQAAAAgAABAAI2EoBGyJhkgGPKxmqxAKpownHC+YRMdN5BrTj67R3bOn01o7p01Iv71u89o\n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\n2Q==`;\n", "import { log, now, mergeDeep } from './helpers';\nimport { Config, defaults } from './config';\nimport { Result } from './result';\nimport * as sysinfo from './sysinfo';\nimport * as tf from '../dist/tfjs.esm.js';\nimport * as backend from './tfjs/backend';\nimport * as face from './face';\nimport * as facemesh from './blazeface/facemesh';\nimport * as faceres from './faceres/faceres';\nimport * as emotion from './emotion/emotion';\nimport * as posenet from './posenet/posenet';\nimport * as handpose from './handpose/handpose';\nimport * as blazepose from './blazepose/blazepose';\nimport * as nanodet from './object/nanodet';\nimport * as centernet from './object/centernet';\nimport * as gesture from './gesture/gesture';\nimport * as image from './image/image';\nimport * as draw from './draw/draw';\nimport * as sample from './sample';\nimport * as app from '../package.json';\n\n/** Generic Tensor object type */\nexport type Tensor = typeof tf.Tensor;\n\nexport type { Config } from './config';\nexport type { Result, Face, Hand, Body, Item, Gesture } from './result';\nexport type { DrawOptions } from './draw/draw';\n\n/** Defines all possible input types for **Human** detection */\nexport type Input = Tensor | typeof Image | ImageData | ImageBitmap | HTMLImageElement | HTMLMediaElement | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas;\n\n/** Error message */\nexport type Error = { error: string };\n\n/** Instance of TensorFlow/JS */\nexport type TensorFlow = typeof tf;\n\n/** Generic Model object type, holds instance of individual models */\ntype Model = Object;\n\n/**\n * **Human** library main class\n *\n * All methods and properties are available only as members of Human class\n *\n * - Configuration object definition: {@link Config}\n * - Results object definition: {@link Result}\n * - Possible inputs: {@link Input}\n */\nexport class Human {\n /** Current version of Human library in semver format */\n version: string;\n /** Current configuration\n * - Details: {@link Config}\n */\n config: Config;\n /** Current state of Human library\n * - Can be polled to determine operations that are currently executed\n */\n state: string;\n /** Internal: Instance of current image being processed */\n image: { tensor: Tensor | null, canvas: OffscreenCanvas | HTMLCanvasElement | null };\n /** Internal: Instance of TensorFlow/JS used by Human\n * - Can be embedded or externally provided\n */\n tf: TensorFlow;\n /** Draw helper classes that can draw detected objects on canvas using specified draw styles\n * - options: global settings for all draw operations, can be overriden for each draw method, for details see {@link DrawOptions}\n * - face: draw detected faces\n * - body: draw detected people and body parts\n * - hand: draw detected hands and hand parts\n * - canvas: draw processed canvas which is a processed copy of the input\n * - all: meta-function that performs: canvas, face, body, hand\n */\n draw: {\n options: draw.DrawOptions,\n gesture: typeof draw.gesture,\n face: typeof draw.face,\n body: typeof draw.body,\n hand: typeof draw.hand,\n canvas: typeof draw.canvas,\n all: typeof draw.all,\n };\n /** Internal: Currently loaded models */\n models: {\n face: [Model, Model, Model] | null,\n posenet: Model | null,\n blazepose: Model | null,\n efficientpose: Model | null,\n handpose: [Model, Model] | null,\n iris: Model | null,\n age: Model | null,\n gender: Model | null,\n emotion: Model | null,\n embedding: Model | null,\n nanodet: Model | null,\n centernet: Model | null,\n faceres: Model | null,\n };\n /** Internal: Currently loaded classes */\n classes: {\n facemesh: typeof facemesh;\n emotion: typeof emotion;\n body: typeof posenet | typeof blazepose;\n hand: typeof handpose;\n nanodet: typeof nanodet;\n centernet: typeof centernet;\n faceres: typeof faceres;\n };\n /** Face triangualtion array of 468 points, used for triangle references between points */\n faceTriangulation: typeof facemesh.triangulation;\n /** UV map of 468 values, used for 3D mapping of the face mesh */\n faceUVMap: typeof facemesh.uvmap;\n /** Platform and agent information detected by Human */\n sysinfo: { platform: string, agent: string };\n /** Performance object that contains values for all recently performed operations */\n perf: any;\n #numTensors: number;\n #analyzeMemoryLeaks: boolean;\n #checkSanity: boolean;\n #firstRun: boolean;\n #lastInputSum: number;\n #lastCacheDiff: number;\n\n // definition end\n\n /**\n * Creates instance of Human library that is futher used for all operations\n * - @param userConfig: {@link Config}\n */\n constructor(userConfig: Config | Object = {}) {\n this.tf = tf;\n this.draw = draw;\n this.version = app.version;\n this.config = mergeDeep(defaults, userConfig);\n this.state = 'idle';\n this.#numTensors = 0;\n this.#analyzeMemoryLeaks = false;\n this.#checkSanity = false;\n this.#firstRun = true;\n this.#lastCacheDiff = 0;\n this.perf = {};\n // object that contains all initialized models\n this.models = {\n face: null,\n posenet: null,\n blazepose: null,\n efficientpose: null,\n handpose: null,\n iris: null,\n age: null,\n gender: null,\n emotion: null,\n embedding: null,\n nanodet: null,\n centernet: null,\n faceres: null,\n };\n // export access to image processing\n // @ts-ignore eslint-typescript cannot correctly infer type in anonymous function\n this.image = (input: Input) => image.process(input, this.config);\n // export raw access to underlying models\n this.classes = {\n facemesh,\n emotion,\n faceres,\n body: this.config.body.modelPath.includes('posenet') ? posenet : blazepose,\n hand: handpose,\n nanodet,\n centernet,\n };\n this.faceTriangulation = facemesh.triangulation;\n this.faceUVMap = facemesh.uvmap;\n // include platform info\n this.sysinfo = sysinfo.info();\n this.#lastInputSum = 1;\n }\n\n // helper function: measure tensor leak\n /** @hidden */\n analyze = (...msg) => {\n if (!this.#analyzeMemoryLeaks) return;\n const current = this.tf.engine().state.numTensors;\n const previous = this.#numTensors;\n this.#numTensors = current;\n const leaked = current - previous;\n if (leaked !== 0) log(...msg, leaked);\n }\n\n // quick sanity check on inputs\n /** @hidden */\n #sanity = (input): null | string => {\n if (!this.#checkSanity) return null;\n if (!input) return 'input is not defined';\n if (this.tf.ENV.flags.IS_NODE && !(input instanceof tf.Tensor)) return 'input must be a tensor';\n try {\n this.tf.getBackend();\n } catch {\n return 'backend not loaded';\n }\n return null;\n }\n\n /** Simmilarity method calculates simmilarity between two provided face descriptors (face embeddings)\n * - Calculation is based on normalized Minkowski distance between\n */\n // eslint-disable-next-line class-methods-use-this\n similarity(embedding1: Array, embedding2: Array): number {\n return faceres.similarity(embedding1, embedding2);\n }\n\n /** Enhance method performs additional enhacements to face image previously detected for futher processing\n * @param input Tensor as provided in human.result.face[n].tensor\n * @returns Tensor\n */\n // eslint-disable-next-line class-methods-use-this\n enhance(input: Tensor): Tensor | null {\n return faceres.enhance(input);\n }\n\n /**\n * Math method find best match between provided face descriptor and predefined database of known descriptors\n * @param faceEmbedding: face descriptor previsouly calculated on any face\n * @param db: array of mapping of face descriptors to known values\n * @param threshold: minimum score for matching to be considered in the result\n * @returns best match\n */\n // eslint-disable-next-line class-methods-use-this\n match(faceEmbedding: Array, db: Array<{ name: string, source: string, embedding: number[] }>, threshold = 0): { name: string, source: string, similarity: number, embedding: number[] } {\n return faceres.match(faceEmbedding, db, threshold);\n }\n\n /** Load method preloads all configured models on-demand\n * - Not explicitly required as any required model is load implicitly on it's first run\n */\n async load(userConfig: Config | Object = {}) {\n this.state = 'load';\n const timeStamp = now();\n if (userConfig) this.config = mergeDeep(this.config, userConfig);\n\n if (this.#firstRun) { // print version info on first run and check for correct backend setup\n if (this.config.debug) log(`version: ${this.version}`);\n if (this.config.debug) log(`tfjs version: ${this.tf.version_core}`);\n if (this.config.debug) log('platform:', this.sysinfo.platform);\n if (this.config.debug) log('agent:', this.sysinfo.agent);\n\n await this.#checkBackend(true);\n if (this.tf.ENV.flags.IS_BROWSER) {\n if (this.config.debug) log('configuration:', this.config);\n if (this.config.debug) log('tf flags:', this.tf.ENV.flags);\n }\n }\n if (this.config.async) { // load models concurrently\n [\n this.models.face,\n this.models.emotion,\n this.models.handpose,\n this.models.posenet,\n this.models.blazepose,\n this.models.nanodet,\n this.models.centernet,\n this.models.faceres,\n ] = await Promise.all([\n this.models.face || (this.config.face.enabled ? facemesh.load(this.config) : null),\n this.models.emotion || ((this.config.face.enabled && this.config.face.emotion.enabled) ? emotion.load(this.config) : null),\n this.models.handpose || (this.config.hand.enabled ? handpose.load(this.config) : null),\n this.models.posenet || (this.config.body.enabled && this.config.body.modelPath.includes('posenet') ? posenet.load(this.config) : null),\n this.models.blazepose || (this.config.body.enabled && this.config.body.modelPath.includes('blazepose') ? blazepose.load(this.config) : null),\n this.models.nanodet || (this.config.object.enabled && this.config.object.modelPath.includes('nanodet') ? nanodet.load(this.config) : null),\n this.models.centernet || (this.config.object.enabled && this.config.object.modelPath.includes('centernet') ? centernet.load(this.config) : null),\n this.models.faceres || ((this.config.face.enabled && this.config.face.description.enabled) ? faceres.load(this.config) : null),\n ]);\n } else { // load models sequentially\n if (this.config.face.enabled && !this.models.face) this.models.face = await facemesh.load(this.config);\n if (this.config.face.enabled && this.config.face.emotion.enabled && !this.models.emotion) this.models.emotion = await emotion.load(this.config);\n if (this.config.hand.enabled && !this.models.handpose) this.models.handpose = await handpose.load(this.config);\n if (this.config.body.enabled && !this.models.posenet && this.config.body.modelPath.includes('posenet')) this.models.posenet = await posenet.load(this.config);\n if (this.config.body.enabled && !this.models.blazepose && this.config.body.modelPath.includes('blazepose')) this.models.blazepose = await blazepose.load(this.config);\n if (this.config.object.enabled && !this.models.nanodet && this.config.object.modelPath.includes('nanodet')) this.models.nanodet = await nanodet.load(this.config);\n if (this.config.object.enabled && !this.models.centernet && this.config.object.modelPath.includes('centernet')) this.models.centernet = await centernet.load(this.config);\n if (this.config.face.enabled && this.config.face.description.enabled && !this.models.faceres) this.models.faceres = await faceres.load(this.config);\n }\n\n if (this.#firstRun) { // print memory stats on first run\n if (this.config.debug) log('tf engine state:', this.tf.engine().state.numBytes, 'bytes', this.tf.engine().state.numTensors, 'tensors');\n this.#firstRun = false;\n }\n\n const current = Math.trunc(now() - timeStamp);\n if (current > (this.perf.load || 0)) this.perf.load = current;\n }\n\n // check if backend needs initialization if it changed\n /** @hidden */\n #checkBackend = async (force = false) => {\n if (this.config.backend && (this.config.backend.length > 0) && force || (this.tf.getBackend() !== this.config.backend)) {\n const timeStamp = now();\n this.state = 'backend';\n /* force backend reload\n if (this.config.backend in tf.engine().registry) {\n const backendFactory = tf.findBackendFactory(this.config.backend);\n tf.removeBackend(this.config.backend);\n tf.registerBackend(this.config.backend, backendFactory);\n } else {\n log('Backend not registred:', this.config.backend);\n }\n */\n\n if (this.config.backend && this.config.backend.length > 0) {\n // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (typeof window === 'undefined' && typeof WorkerGlobalScope !== 'undefined' && this.config.debug) log('running inside web worker');\n\n // force browser vs node backend\n if (this.tf.ENV.flags.IS_BROWSER && this.config.backend === 'tensorflow') this.config.backend = 'webgl';\n if (this.tf.ENV.flags.IS_NODE && (this.config.backend === 'webgl' || this.config.backend === 'humangl')) this.config.backend = 'tensorflow';\n\n if (this.config.debug) log('setting backend:', this.config.backend);\n\n if (this.config.backend === 'wasm') {\n if (this.config.debug) log('wasm path:', this.config.wasmPath);\n if (typeof this.tf?.setWasmPaths !== 'undefined') this.tf.setWasmPaths(this.config.wasmPath);\n else throw new Error('Human: WASM backend is not loaded');\n const simd = await this.tf.env().getAsync('WASM_HAS_SIMD_SUPPORT');\n const mt = await this.tf.env().getAsync('WASM_HAS_MULTITHREAD_SUPPORT');\n if (this.config.debug) log(`wasm execution: ${simd ? 'SIMD' : 'no SIMD'} ${mt ? 'multithreaded' : 'singlethreaded'}`);\n if (this.config.debug && !simd) log('warning: wasm simd support is not enabled');\n }\n\n if (this.config.backend === 'humangl') backend.register();\n try {\n await this.tf.setBackend(this.config.backend);\n } catch (err) {\n log('error: cannot set backend:', this.config.backend, err);\n }\n }\n this.tf.enableProdMode();\n // this.tf.enableDebugMode();\n if (this.tf.getBackend() === 'webgl' || this.tf.getBackend() === 'humangl') {\n this.tf.ENV.set('CHECK_COMPUTATION_FOR_ERRORS', false);\n this.tf.ENV.set('WEBGL_CPU_FORWARD', true);\n tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true);\n this.tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', true);\n if (typeof this.config['deallocate'] !== 'undefined') {\n log('changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:', true);\n this.tf.ENV.set('WEBGL_DELETE_TEXTURE_THRESHOLD', 0);\n }\n const gl = await this.tf.backend().getGPGPUContext().gl;\n if (this.config.debug) log(`gl version:${gl.getParameter(gl.VERSION)} renderer:${gl.getParameter(gl.RENDERER)}`);\n }\n await this.tf.ready();\n this.perf.backend = Math.trunc(now() - timeStamp);\n }\n }\n\n // check if input changed sufficiently to trigger new detections\n /** @hidden */\n #skipFrame = async (input) => {\n if (this.config.cacheSensitivity === 0) return false;\n const resizeFact = 40;\n const reduced = input.resizeBilinear([Math.trunc(input.shape[1] / resizeFact), Math.trunc(input.shape[2] / resizeFact)]);\n // use tensor sum\n const sumT = this.tf.sum(reduced);\n const sum = sumT.dataSync()[0] as number;\n sumT.dispose();\n // use js loop sum\n /*\n const reducedData = reduced.dataSync();\n let sum = 0;\n for (let i = 0; i < reducedData.length; i++) sum += reducedData[i];\n */\n reduced.dispose();\n const diff = Math.max(sum, this.#lastInputSum) / Math.min(sum, this.#lastInputSum) - 1;\n this.#lastInputSum = sum;\n // if previous frame was skipped, skip this frame if changed more than cacheSensitivity\n // if previous frame was not skipped, then look for cacheSensitivity or difference larger than one in previous frame to avoid resetting cache in subsequent frames unnecessarily\n const skipFrame = diff < Math.max(this.config.cacheSensitivity, this.#lastCacheDiff);\n // if difference is above 4x threshold, don't use last value to force reset cache for significant change of scenes or images\n this.#lastCacheDiff = diff > 4 * this.config.cacheSensitivity ? 0 : diff;\n return skipFrame;\n }\n\n /** Main detection method\n * - Analyze configuration: {@link Config}\n * - Pre-process input: {@link Input}\n * - Run inference for all configured models\n * - Process and return result: {@link Result}\n */\n async detect(input: Input, userConfig: Config | Object = {}): Promise {\n // detection happens inside a promise\n return new Promise(async (resolve) => {\n this.state = 'config';\n let timeStamp;\n\n // update configuration\n this.config = mergeDeep(this.config, userConfig);\n\n // sanity checks\n this.state = 'check';\n const error = this.#sanity(input);\n if (error) {\n log(error, input);\n resolve({ error });\n }\n\n const timeStart = now();\n\n // configure backend\n await this.#checkBackend();\n\n // load models if enabled\n await this.load();\n\n /*\n // function disabled in favor of inputChanged\n // disable video optimization for inputs of type image, but skip if inside worker thread\n let previousVideoOptimized;\n // @ts-ignore ignore missing type for WorkerGlobalScope as that is the point\n if (input && this.config.videoOptimized && (typeof window !== 'undefined') && (typeof WorkerGlobalScope !== 'undefined') && (\n (typeof HTMLImageElement !== 'undefined' && input instanceof HTMLImageElement)\n || (typeof Image !== 'undefined' && input instanceof Image)\n || (typeof ImageData !== 'undefined' && input instanceof ImageData)\n || (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap))\n ) {\n log('disabling video optimization');\n previousVideoOptimized = this.config.videoOptimized;\n this.config.videoOptimized = false;\n }\n */\n\n timeStamp = now();\n const process = image.process(input, this.config);\n if (!process || !process.tensor) {\n log('could not convert input to tensor');\n resolve({ error: 'could not convert input to tensor' });\n return;\n }\n this.perf.image = Math.trunc(now() - timeStamp);\n this.analyze('Get Image:');\n\n timeStamp = now();\n // @ts-ignore hidden dynamic property that is not part of definitions\n this.config.skipFrame = await this.#skipFrame(process.tensor);\n if (!this.perf.frames) this.perf.frames = 0;\n if (!this.perf.cached) this.perf.cached = 0;\n this.perf.frames++;\n // @ts-ignore hidden dynamic property that is not part of definitions\n if (this.config.skipFrame) this.perf.cached++;\n this.perf.changed = Math.trunc(now() - timeStamp);\n this.analyze('Check Changed:');\n\n // prepare where to store model results\n let bodyRes;\n let handRes;\n let faceRes;\n let objectRes;\n let current;\n\n // run face detection followed by all models that rely on face bounding box: face mesh, age, gender, emotion\n if (this.config.async) {\n faceRes = this.config.face.enabled ? face.detectFace(this, process.tensor) : [];\n if (this.perf.face) delete this.perf.face;\n } else {\n this.state = 'run:face';\n timeStamp = now();\n faceRes = this.config.face.enabled ? await face.detectFace(this, process.tensor) : [];\n current = Math.trunc(now() - timeStamp);\n if (current > 0) this.perf.face = current;\n }\n\n // run body: can be posenet or blazepose\n this.analyze('Start Body:');\n if (this.config.async) {\n if (this.config.body.modelPath.includes('posenet')) bodyRes = this.config.body.enabled ? posenet.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('blazepose')) bodyRes = this.config.body.enabled ? blazepose.predict(process.tensor, this.config) : [];\n if (this.perf.body) delete this.perf.body;\n } else {\n this.state = 'run:body';\n timeStamp = now();\n if (this.config.body.modelPath.includes('posenet')) bodyRes = this.config.body.enabled ? await posenet.predict(process.tensor, this.config) : [];\n else if (this.config.body.modelPath.includes('blazepose')) bodyRes = this.config.body.enabled ? await blazepose.predict(process.tensor, this.config) : [];\n current = Math.trunc(now() - timeStamp);\n if (current > 0) this.perf.body = current;\n }\n this.analyze('End Body:');\n\n // run handpose\n this.analyze('Start Hand:');\n if (this.config.async) {\n handRes = this.config.hand.enabled ? handpose.predict(process.tensor, this.config) : [];\n if (this.perf.hand) delete this.perf.hand;\n } else {\n this.state = 'run:hand';\n timeStamp = now();\n handRes = this.config.hand.enabled ? await handpose.predict(process.tensor, this.config) : [];\n current = Math.trunc(now() - timeStamp);\n if (current > 0) this.perf.hand = current;\n }\n this.analyze('End Hand:');\n\n // run nanodet\n this.analyze('Start Object:');\n if (this.config.async) {\n if (this.config.object.modelPath.includes('nanodet')) objectRes = this.config.object.enabled ? nanodet.predict(process.tensor, this.config) : [];\n else if (this.config.object.modelPath.includes('centernet')) objectRes = this.config.object.enabled ? centernet.predict(process.tensor, this.config) : [];\n if (this.perf.object) delete this.perf.object;\n } else {\n this.state = 'run:object';\n timeStamp = now();\n if (this.config.object.modelPath.includes('nanodet')) objectRes = this.config.object.enabled ? await nanodet.predict(process.tensor, this.config) : [];\n else if (this.config.object.modelPath.includes('centernet')) objectRes = this.config.object.enabled ? await centernet.predict(process.tensor, this.config) : [];\n current = Math.trunc(now() - timeStamp);\n if (current > 0) this.perf.object = current;\n }\n this.analyze('End Object:');\n\n // if async wait for results\n if (this.config.async) {\n [faceRes, bodyRes, handRes, objectRes] = await Promise.all([faceRes, bodyRes, handRes, objectRes]);\n }\n tf.dispose(process.tensor);\n\n // run gesture analysis last\n let gestureRes: any[] = [];\n if (this.config.gesture.enabled) {\n timeStamp = now();\n gestureRes = [...gesture.face(faceRes), ...gesture.body(bodyRes), ...gesture.hand(handRes), ...gesture.iris(faceRes)];\n if (!this.config.async) this.perf.gesture = Math.trunc(now() - timeStamp);\n else if (this.perf.gesture) delete this.perf.gesture;\n }\n\n this.perf.total = Math.trunc(now() - timeStart);\n this.state = 'idle';\n const res = {\n face: faceRes,\n body: bodyRes,\n hand: handRes,\n gesture: gestureRes,\n object: objectRes,\n performance: this.perf,\n canvas: process.canvas,\n timestamp: Date.now(),\n };\n // log('Result:', result);\n resolve(res);\n });\n }\n\n /** @hidden */\n #warmupBitmap = async () => {\n const b64toBlob = (base64, type = 'application/octet-stream') => fetch(`data:${type};base64,${base64}`).then((res) => res.blob());\n let blob;\n let res;\n switch (this.config.warmup) {\n case 'face': blob = await b64toBlob(sample.face); break;\n case 'full': blob = await b64toBlob(sample.body); break;\n default: blob = null;\n }\n if (blob) {\n const bitmap = await createImageBitmap(blob);\n res = await this.detect(bitmap, this.config);\n bitmap.close();\n }\n return res;\n }\n\n /** @hidden */\n #warmupCanvas = async () => new Promise((resolve) => {\n let src;\n let size = 0;\n switch (this.config.warmup) {\n case 'face':\n size = 256;\n src = 'data:image/jpeg;base64,' + sample.face;\n break;\n case 'full':\n case 'body':\n size = 1200;\n src = 'data:image/jpeg;base64,' + sample.body;\n break;\n default:\n src = null;\n }\n // src = encodeURI('../assets/human-sample-upper.jpg');\n const img = new Image();\n img.onload = async () => {\n const canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(size, size) : document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n ctx?.drawImage(img, 0, 0);\n // const data = ctx?.getImageData(0, 0, canvas.height, canvas.width);\n const res = await this.detect(canvas, this.config);\n resolve(res);\n };\n if (src) img.src = src;\n else resolve(null);\n });\n\n /** @hidden */\n #warmupNode = async () => {\n const atob = (str) => Buffer.from(str, 'base64');\n let img;\n if (this.config.warmup === 'face') img = atob(sample.face);\n if (this.config.warmup === 'body' || this.config.warmup === 'full') img = atob(sample.body);\n if (!img) return null;\n let res;\n if (typeof tf['node'] !== 'undefined') {\n const data = tf['node'].decodeJpeg(img);\n const expanded = data.expandDims(0);\n this.tf.dispose(data);\n // log('Input:', expanded);\n res = await this.detect(expanded, this.config);\n this.tf.dispose(expanded);\n } else {\n if (this.config.debug) log('Warmup tfjs-node not loaded');\n /*\n const input = await canvasJS.loadImage(img);\n const canvas = canvasJS.createCanvas(input.width, input.height);\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, input.width, input.height);\n res = await this.detect(input, this.config);\n */\n }\n return res;\n }\n\n /** Warmup metho pre-initializes all models for faster inference\n * - can take significant time on startup\n * - only used for `webgl` and `humangl` backends\n */\n async warmup(userConfig: Config | Object = {}): Promise {\n const t0 = now();\n if (userConfig) this.config = mergeDeep(this.config, userConfig);\n if (!this.config.warmup || this.config.warmup === 'none') return { error: 'null' };\n let res;\n if (typeof createImageBitmap === 'function') res = await this.#warmupBitmap();\n else if (typeof Image !== 'undefined') res = await this.#warmupCanvas();\n else res = await this.#warmupNode();\n const t1 = now();\n if (this.config.debug) log('Warmup', this.config.warmup, Math.round(t1 - t0), 'ms', res);\n return res;\n }\n}\n\n/**\n * Class Human is also available as default export\n */\nexport { Human as default };\n"], + "mappings": "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mB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,iBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,iBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,iBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,gBAAkB,kBACnB,CAAC,cAAgB,kBACjB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,gBAAkB,kBACnB,CAAC,eAAiB,kBAClB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,kBACpB,CAAC,iBAAmB,mBAGT,GAAS,CACpB,IAAK,GAAI,IAAK,GAAI,EAAG,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,EACtJ,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAClJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GACrJ,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAC7I,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAClJ,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GACrJ,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GACpJ,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GACjJ,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,EAAG,IAC/I,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,EAAG,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IACnJ,IAAK,GAAI,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IACnJ,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,IAAK,IAAK,GAAI,EAAG,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAC9I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GACtJ,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAClJ,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GACnJ,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GACrJ,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IACpJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,IAClJ,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,IACnJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IACnJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,EAAG,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAC7I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAClJ,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAC7I,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,EAAG,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GACnJ,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GACpJ,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAClJ,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAClJ,GAAI,GAAI,GAAI,GAAI,GAAI,IA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K,EAAG,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAC9I,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAC9I,IAAK,GAAI,IAAK,EAAG,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC/I,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAChJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjJ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IA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CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,QACH,EAAG,SAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,OACH,EAAG,QAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,CACE,EAAG,MACH,EAAG,OAEL,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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kEA0JP,GAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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", "names": [] } diff --git a/dist/human.esm.js b/dist/human.esm.js index 4baadf1c..7f8e7018 100644 --- a/dist/human.esm.js +++ b/dist/human.esm.js @@ -5,22438 +5,41 @@ author: ' */ -var __defProp = Object.defineProperty; -var __require = (x) => { - if (typeof require !== "undefined") - return require(x); - throw new Error('Dynamic require of "' + x + '" is not supported'); -}; -var __export = (target, all6) => { - for (var name6 in all6) - __defProp(target, name6, { get: all6[name6], enumerable: true }); -}; -var __accessCheck = (obj, member, msg) => { - if (!member.has(obj)) - throw TypeError("Cannot " + msg); -}; -var __privateGet = (obj, member, getter) => { - __accessCheck(obj, member, "read from private field"); - return getter ? getter.call(obj) : member.get(obj); -}; -var __privateAdd = (obj, member, value) => { - if (member.has(obj)) - throw TypeError("Cannot add the same private member more than once"); - member instanceof WeakSet ? member.add(obj) : member.set(obj, value); -}; -var __privateSet = (obj, member, value, setter) => { - __accessCheck(obj, member, "write to private field"); - setter ? setter.call(obj, value) : member.set(obj, value); - return value; -}; - -// src/helpers.ts -function join(folder, file) { - const separator = folder.endsWith("/") ? "" : "/"; - const skipJoin = file.startsWith(".") || file.startsWith("/") || file.startsWith("http:") || file.startsWith("https:") || file.startsWith("file:"); - const path = skipJoin ? `${file}` : `${folder}${separator}${file}`; - if (!path.toLocaleLowerCase().includes(".json")) - throw new Error(`Human: ModelPath Error: ${path} Expecting JSON file`); - return path; -} -function log(...msg) { - const dt = new Date(); - const ts = `${dt.getHours().toString().padStart(2, "0")}:${dt.getMinutes().toString().padStart(2, "0")}:${dt.getSeconds().toString().padStart(2, "0")}.${dt.getMilliseconds().toString().padStart(3, "0")}`; - if (msg) - console.log(ts, "Human:", ...msg); -} -var now = () => { - if (typeof performance !== "undefined") - return performance.now(); - return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString()); -}; -function mergeDeep(...objects) { - const isObject = (obj) => obj && typeof obj === "object"; - return objects.reduce((prev, obj) => { - Object.keys(obj || {}).forEach((key) => { - const pVal = prev[key]; - const oVal = obj[key]; - if (Array.isArray(pVal) && Array.isArray(oVal)) - prev[key] = pVal.concat(...oVal); - else if (isObject(pVal) && isObject(oVal)) - prev[key] = mergeDeep(pVal, oVal); - else - prev[key] = oVal; - }); - return prev; - }, {}); -} - -// src/config.ts -var config = { - backend: "webgl", - modelBasePath: "../models/", - wasmPath: "../node_modules/@tensorflow/tfjs-backend-wasm/dist//", - debug: true, - async: true, - warmup: "full", - cacheSensitivity: 0.01, - filter: { - enabled: true, - width: 0, - height: 0, - flip: false, - return: true, - brightness: 0, - contrast: 0, - sharpness: 0, - blur: 0, - saturation: 0, - hue: 0, - negative: false, - sepia: false, - vintage: false, - kodachrome: false, - technicolor: false, - polaroid: false, - pixelate: 0 - }, - gesture: { - enabled: true - }, - face: { - enabled: true, - detector: { - modelPath: "blazeface.json", - rotation: false, - maxDetected: 10, - skipFrames: 21, - minConfidence: 0.2, - iouThreshold: 0.1, - return: false - }, - mesh: { - enabled: true, - modelPath: "facemesh.json" - }, - iris: { - enabled: true, - modelPath: "iris.json" - }, - description: { - enabled: true, - modelPath: "faceres.json", - skipFrames: 31, - minConfidence: 0.1 - }, - emotion: { - enabled: true, - minConfidence: 0.1, - skipFrames: 32, - modelPath: "emotion.json" - } - }, - body: { - enabled: true, - modelPath: "posenet.json", - maxDetected: 1, - minConfidence: 0.1 - }, - hand: { - enabled: true, - rotation: false, - skipFrames: 32, - minConfidence: 0.1, - iouThreshold: 0.1, - maxDetected: 2, - landmarks: true, - detector: { - modelPath: "handdetect.json" - }, - skeleton: { - modelPath: "handskeleton.json" - } - }, - object: { - enabled: false, - modelPath: "mb3-centernet.json", - minConfidence: 0.2, - iouThreshold: 0.4, - maxDetected: 10, - skipFrames: 41 - } -}; - -// src/sysinfo.ts -function info() { - let platform; - let agent; - if (typeof navigator !== "undefined") { - const raw = navigator.userAgent.match(/\(([^()]+)\)/g); - if (raw && raw[0]) { - const platformMatch = raw[0].match(/\(([^()]+)\)/g); - platform = platformMatch ? platformMatch[0].replace(/\(|\)/g, "") : ""; - agent = navigator.userAgent.replace(raw[0], ""); - if (platform[1]) - agent = agent.replace(raw[1], ""); - agent = agent.replace(/ /g, " "); - } - } else if (typeof process !== "undefined") { - platform = `${process.platform} ${process.arch}`; - agent = `NodeJS ${process.version}`; - } - return { platform, agent }; -} - -// dist/tfjs.esm.js -var tfjs_esm_exports = {}; -__export(tfjs_esm_exports, { - Abs: () => Abs, - Acos: () => Acos, - Acosh: () => Acosh, - AdadeltaOptimizer: () => AdadeltaOptimizer, - AdagradOptimizer: () => AdagradOptimizer, - AdamOptimizer: () => AdamOptimizer, - AdamaxOptimizer: () => AdamaxOptimizer, - Add: () => Add, - AddN: () => AddN, - All: () => All, - Any: () => Any, - ArgMax: () => ArgMax, - ArgMin: () => ArgMin, - Asin: () => Asin, - Asinh: () => Asinh, - Atan: () => Atan, - Atan2: () => Atan2, - Atanh: () => Atanh, - AvgPool: () => AvgPool, - AvgPool3D: () => AvgPool3D, - AvgPool3DGrad: () => AvgPool3DGrad, - AvgPoolGrad: () => AvgPoolGrad, - BackendWasm: () => BackendWasm, - BatchMatMul: () => BatchMatMul, - BatchToSpaceND: () => BatchToSpaceND, - Bincount: () => Bincount, - BroadcastTo: () => BroadcastTo, - Callback: () => Callback, - CallbackList: () => CallbackList, - Cast: () => Cast, - Ceil: () => Ceil, - ClipByValue: () => ClipByValue, - Complex: () => Complex, - ComplexAbs: () => ComplexAbs, - Concat: () => Concat, - Conv2D: () => Conv2D, - Conv2DBackpropFilter: () => Conv2DBackpropFilter, - Conv2DBackpropInput: () => Conv2DBackpropInput, - Conv3D: () => Conv3D, - Conv3DBackpropFilterV2: () => Conv3DBackpropFilterV2, - Conv3DBackpropInputV2: () => Conv3DBackpropInputV2, - Cos: () => Cos, - Cosh: () => Cosh, - CropAndResize: () => CropAndResize, - Cumsum: () => Cumsum, - CustomCallback: () => CustomCallback, - DataStorage: () => DataStorage, - DenseBincount: () => DenseBincount, - DepthToSpace: () => DepthToSpace, - DepthwiseConv2dNative: () => DepthwiseConv2dNative, - DepthwiseConv2dNativeBackpropFilter: () => DepthwiseConv2dNativeBackpropFilter, - DepthwiseConv2dNativeBackpropInput: () => DepthwiseConv2dNativeBackpropInput, - Diag: () => Diag, - Dilation2D: () => Dilation2D, - Dilation2DBackpropFilter: () => Dilation2DBackpropFilter, - Dilation2DBackpropInput: () => Dilation2DBackpropInput, - ENV: () => ENV, - EarlyStopping: () => EarlyStopping, - Einsum: () => Einsum, - Elu: () => Elu, - EluGrad: () => EluGrad, - Environment: () => Environment, - Equal: () => Equal, - Erf: () => Erf, - Exp: () => Exp, - ExpandDims: () => ExpandDims, - Expm1: () => Expm1, - FFT: () => FFT, - Fill: () => Fill, - FlipLeftRight: () => FlipLeftRight, - Floor: () => Floor, - FloorDiv: () => FloorDiv, - FromPixels: () => FromPixels, - FusedBatchNorm: () => FusedBatchNorm, - FusedConv2D: () => FusedConv2D, - FusedDepthwiseConv2D: () => FusedDepthwiseConv2D, - GPGPUContext: () => GPGPUContext, - GatherNd: () => GatherNd, - GatherV2: () => GatherV2, - GraphModel: () => GraphModel, - Greater: () => Greater, - GreaterEqual: () => GreaterEqual, - History: () => History, - IFFT: () => IFFT, - Identity: () => Identity, - Imag: () => Imag, - InputSpec: () => InputSpec, - IsFinite: () => IsFinite, - IsInf: () => IsInf, - IsNan: () => IsNan, - KernelBackend: () => KernelBackend, - LRN: () => LRN, - LRNGrad: () => LRNGrad, - LayerVariable: () => LayerVariable, - LayersModel: () => LayersModel, - LeakyRelu: () => LeakyRelu, - Less: () => Less, - LessEqual: () => LessEqual, - LinSpace: () => LinSpace, - Log: () => Log, - Log1p: () => Log1p, - LogSoftmax: () => LogSoftmax, - LogicalAnd: () => LogicalAnd, - LogicalNot: () => LogicalNot, - LogicalOr: () => LogicalOr, - MathBackendCPU: () => MathBackendCPU, - MathBackendWebGL: () => MathBackendWebGL, - Max: () => Max, - MaxPool: () => MaxPool, - MaxPool3D: () => MaxPool3D, - MaxPool3DGrad: () => MaxPool3DGrad, - MaxPoolGrad: () => MaxPoolGrad, - MaxPoolWithArgmax: () => MaxPoolWithArgmax, - Maximum: () => Maximum, - Mean: () => Mean, - Min: () => Min, - Minimum: () => Minimum, - MirrorPad: () => MirrorPad, - Mod: () => Mod, - MomentumOptimizer: () => MomentumOptimizer, - Multinomial: () => Multinomial, - Multiply: () => Multiply, - Neg: () => Neg, - NonMaxSuppressionV3: () => NonMaxSuppressionV3, - NonMaxSuppressionV4: () => NonMaxSuppressionV4, - NonMaxSuppressionV5: () => NonMaxSuppressionV5, - NotEqual: () => NotEqual, - OP_SCOPE_SUFFIX: () => OP_SCOPE_SUFFIX, - OneHot: () => OneHot, - OnesLike: () => OnesLike, - Optimizer: () => Optimizer, - Pack: () => Pack, - PadV2: () => PadV2, - Pool: () => Pool, - Pow: () => Pow, - Prelu: () => Prelu, - Prod: () => Prod, - RMSPropOptimizer: () => RMSPropOptimizer, - RNN: () => RNN, - Range: () => Range, - Rank: () => Rank, - Real: () => Real, - RealDiv: () => RealDiv, - Reciprocal: () => Reciprocal, - Reduction: () => Reduction, - Relu: () => Relu, - Relu6: () => Relu6, - Reshape: () => Reshape, - ResizeBilinear: () => ResizeBilinear, - ResizeBilinearGrad: () => ResizeBilinearGrad, - ResizeNearestNeighbor: () => ResizeNearestNeighbor, - ResizeNearestNeighborGrad: () => ResizeNearestNeighborGrad, - Reverse: () => Reverse, - RotateWithOffset: () => RotateWithOffset, - Round: () => Round, - Rsqrt: () => Rsqrt, - SGDOptimizer: () => SGDOptimizer, - ScatterNd: () => ScatterNd, - Select: () => Select, - Selu: () => Selu, - Sequential: () => Sequential, - Sigmoid: () => Sigmoid, - Sign: () => Sign, - Sin: () => Sin, - Sinh: () => Sinh, - Slice: () => Slice, - Softmax: () => Softmax, - Softplus: () => Softplus, - SpaceToBatchND: () => SpaceToBatchND, - SparseFillEmptyRows: () => SparseFillEmptyRows, - SparseReshape: () => SparseReshape, - SparseToDense: () => SparseToDense, - SplitV: () => SplitV, - Sqrt: () => Sqrt, - Square: () => Square, - SquaredDifference: () => SquaredDifference, - Step: () => Step, - StridedSlice: () => StridedSlice, - Sub: () => Sub, - Sum: () => Sum, - SymbolicTensor: () => SymbolicTensor, - Tan: () => Tan, - Tanh: () => Tanh, - Tensor: () => Tensor, - TensorBuffer: () => TensorBuffer, - Tile: () => Tile, - TopK: () => TopK, - Transform: () => Transform, - Transpose: () => Transpose, - Unique: () => Unique, - Unpack: () => Unpack, - UnsortedSegmentSum: () => UnsortedSegmentSum, - Variable: () => Variable, - ZerosLike: () => ZerosLike, - _FusedMatMul: () => _FusedMatMul, - abs: () => abs, - acos: () => acos, - acosh: () => acosh, - add: () => add2, - addN: () => addN, - all: () => all, - any: () => any, - argMax: () => argMax, - argMin: () => argMin, - asin: () => asin, - asinh: () => asinh, - atan: () => atan, - atan2: () => atan2, - atanh: () => atanh, - avgPool: () => avgPool, - avgPool3d: () => avgPool3d, - backend: () => backend, - backend_util: () => backend_util_exports, - basicLSTMCell: () => basicLSTMCell, - batchNorm: () => batchNorm, - batchNorm2d: () => batchNorm2d, - batchNorm3d: () => batchNorm3d, - batchNorm4d: () => batchNorm4d, - batchToSpaceND: () => batchToSpaceND, - bincount: () => bincount, - booleanMaskAsync: () => booleanMaskAsync, - broadcastTo: () => broadcastTo, - browser: () => browser_exports, - buffer: () => buffer, - callbacks: () => callbacks, - cast: () => cast, - ceil: () => ceil, - clipByValue: () => clipByValue, - clone: () => clone, - complex: () => complex, - concat: () => concat, - concat1d: () => concat1d, - concat2d: () => concat2d, - concat3d: () => concat3d, - concat4d: () => concat4d, - constraints: () => exports_constraints_exports, - conv1d: () => conv1d, - conv2d: () => conv2d, - conv2dTranspose: () => conv2dTranspose, - conv3d: () => conv3d, - conv3dTranspose: () => conv3dTranspose, - copyRegisteredKernels: () => copyRegisteredKernels, - cos: () => cos, - cosh: () => cosh, - cosineWindow: () => cosineWindow, - cumsum: () => cumsum, - customGrad: () => customGrad, - data: () => dist_exports, - denseBincount: () => denseBincount, - deprecationWarn: () => deprecationWarn, - depthToSpace: () => depthToSpace, - depthwiseConv2d: () => depthwiseConv2d, - deregisterOp: () => deregisterOp, - device_util: () => device_util_exports, - diag: () => diag, - dilation2d: () => dilation2d, - disableDeprecationWarnings: () => disableDeprecationWarnings, - dispose: () => dispose, - disposeVariables: () => disposeVariables, - div: () => div, - divNoNan: () => divNoNan, - dot: () => dot, - dropout: () => dropout, - einsum: () => einsum, - elu: () => elu, - enableDebugMode: () => enableDebugMode, - enableProdMode: () => enableProdMode, - enclosingPowerOfTwo: () => enclosingPowerOfTwo, - engine: () => engine, - env: () => env, - equal: () => equal, - erf: () => erf, - exp: () => exp, - expandDims: () => expandDims, - expm1: () => expm1, - eye: () => eye, - fft: () => fft, - fill: () => fill, - findBackend: () => findBackend, - findBackendFactory: () => findBackendFactory, - floor: () => floor, - floorDiv: () => floorDiv, - forceHalfFloat: () => forceHalfFloat, - fused: () => fused_ops_exports, - gather: () => gather, - gatherND: () => gatherND, - gather_util: () => gather_nd_util_exports, - getBackend: () => getBackend, - getGradient: () => getGradient, - getKernel: () => getKernel, - getKernelsForBackend: () => getKernelsForBackend, - gpgpu_util: () => gpgpu_util_exports, - grad: () => grad, - grads: () => grads, - greater: () => greater, - greaterEqual: () => greaterEqual, - ifft: () => ifft, - imag: () => imag, - image: () => image, - inTopKAsync: () => inTopKAsync, - initializers: () => exports_initializers_exports, - input: () => input, - io: () => io_exports, - irfft: () => irfft, - isFinite: () => isFinite2, - isInf: () => isInf, - isNaN: () => isNaN2, - keep: () => keep, - kernel_impls: () => kernel_impls_exports, - layers: () => exports_layers_exports, - leakyRelu: () => leakyRelu, - less: () => less, - lessEqual: () => lessEqual, - linalg: () => linalg, - linspace: () => linspace, - loadGraphModel: () => loadGraphModel, - loadLayersModel: () => loadLayersModel, - localResponseNormalization: () => localResponseNormalization, - log: () => log2, - log1p: () => log1p, - logSigmoid: () => logSigmoid, - logSoftmax: () => logSoftmax, - logSumExp: () => logSumExp, - logicalAnd: () => logicalAnd, - logicalNot: () => logicalNot, - logicalOr: () => logicalOr, - logicalXor: () => logicalXor, - losses: () => losses, - matMul: () => matMul, - math: () => math_exports, - max: () => max, - maxPool: () => maxPool, - maxPool3d: () => maxPool3d, - maxPoolWithArgmax: () => maxPoolWithArgmax, - maximum: () => maximum, - mean: () => mean, - memory: () => memory, - meshgrid: () => meshgrid, - metrics: () => exports_metrics_exports, - min: () => min, - minimum: () => minimum, - mirrorPad: () => mirrorPad, - mod: () => mod, - model: () => model, - models: () => exports_models_exports, - moments: () => moments, - movingAverage: () => movingAverage, - mul: () => mul, - multiRNNCell: () => multiRNNCell, - multinomial: () => multinomial, - neg: () => neg, - nextFrame: () => nextFrame, - norm: () => norm, - notEqual: () => notEqual, - oneHot: () => oneHot, - ones: () => ones2, - onesLike: () => onesLike, - op: () => op, - outerProduct: () => outerProduct, - pad: () => pad, - pad1d: () => pad1d, - pad2d: () => pad2d, - pad3d: () => pad3d, - pad4d: () => pad4d, - pool: () => pool, - pow: () => pow, - prelu: () => prelu, - print: () => print2, - prod: () => prod, - profile: () => profile, - rand: () => rand, - randomGamma: () => randomGamma, - randomNormal: () => randomNormal, - randomUniform: () => randomUniform, - range: () => range, - ready: () => ready, - real: () => real, - reciprocal: () => reciprocal, - registerBackend: () => registerBackend, - registerCallbackConstructor: () => registerCallbackConstructor, - registerGradient: () => registerGradient, - registerKernel: () => registerKernel, - registerOp: () => registerOp, - regularizers: () => exports_regularizers_exports, - relu: () => relu, - relu6: () => relu6, - removeBackend: () => removeBackend, - reshape: () => reshape, - reverse: () => reverse, - reverse1d: () => reverse1d, - reverse2d: () => reverse2d, - reverse3d: () => reverse3d, - reverse4d: () => reverse4d, - rfft: () => rfft, - round: () => round2, - rsqrt: () => rsqrt, - scalar: () => scalar, - scatterND: () => scatterND, - scatter_util: () => scatter_nd_util_exports, - selu: () => selu, - separableConv2d: () => separableConv2d, - sequential: () => sequential, - serialization: () => serialization_exports, - setBackend: () => setBackend, - setPlatform: () => setPlatform, - setWasmPath: () => setWasmPath, - setWasmPaths: () => setWasmPaths, - setWebGLContext: () => setWebGLContext, - setdiff1dAsync: () => setdiff1dAsync, - shared: () => shared_exports, - sigmoid: () => sigmoid, - sign: () => sign, - signal: () => signal, - sin: () => sin, - sinh: () => sinh, - slice: () => slice, - slice1d: () => slice1d, - slice2d: () => slice2d, - slice3d: () => slice3d, - slice4d: () => slice4d, - slice_util: () => slice_util_exports, - softmax: () => softmax, - softplus: () => softplus, - spaceToBatchND: () => spaceToBatchND, - sparse: () => sparse, - sparseToDense: () => sparseToDense, - spectral: () => spectral, - split: () => split, - sqrt: () => sqrt, - square: () => square, - squaredDifference: () => squaredDifference, - squeeze: () => squeeze, - stack: () => stack, - step: () => step, - stridedSlice: () => stridedSlice, - sub: () => sub, - sum: () => sum2, - sumOutType: () => sumOutType, - tan: () => tan, - tanh: () => tanh2, - tensor: () => tensor, - tensor1d: () => tensor1d, - tensor2d: () => tensor2d, - tensor3d: () => tensor3d, - tensor4d: () => tensor4d, - tensor5d: () => tensor5d, - tensor6d: () => tensor6d, - tensor_util: () => tensor_util_exports, - test_util: () => test_util_exports, - tidy: () => tidy, - tile: () => tile, - time: () => time, - topk: () => topk, - train: () => train, - transpose: () => transpose, - truncatedNormal: () => truncatedNormal, - unique: () => unique, - unregisterGradient: () => unregisterGradient, - unregisterKernel: () => unregisterKernel, - unsortedSegmentSum: () => unsortedSegmentSum, - unstack: () => unstack, - upcastType: () => upcastType, - util: () => util_exports, - valueAndGrad: () => valueAndGrad, - valueAndGrads: () => valueAndGrads, - variable: () => variable, - variableGrads: () => variableGrads, - version: () => version13, - version_converter: () => version11, - version_core: () => version6, - version_cpu: () => version7, - version_layers: () => version10, - version_wasm: () => version9, - version_webgl: () => version8, - webgl: () => webgl, - webgl_util: () => webgl_util_exports, - where: () => where, - whereAsync: () => whereAsync, - zeros: () => zeros, - zerosLike: () => zerosLike -}); -var __create = Object.create; -var __defProp2 = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __markAsModule = (target) => __defProp2(target, "__esModule", { value: true }); -var __require2 = (x) => { - if (typeof __require !== "undefined") - return __require(x); - throw new Error('Dynamic require of "' + x + '" is not supported'); -}; -var __commonJS = (cb, mod4) => function __require22() { - return mod4 || (0, cb[Object.keys(cb)[0]])((mod4 = { exports: {} }).exports, mod4), mod4.exports; -}; -var __export2 = (target, all52) => { - for (var name6 in all52) - __defProp2(target, name6, { get: all52[name6], enumerable: true }); -}; -var __reExport = (target, module6, desc) => { - if (module6 && typeof module6 === "object" || typeof module6 === "function") { - for (let key of __getOwnPropNames(module6)) - if (!__hasOwnProp.call(target, key) && key !== "default") - __defProp2(target, key, { get: () => module6[key], enumerable: !(desc = __getOwnPropDesc(module6, key)) || desc.enumerable }); - } - return target; -}; -var __toModule = (module6) => { - return __reExport(__markAsModule(__defProp2(module6 != null ? __create(__getProtoOf(module6)) : {}, "default", module6 && module6.__esModule && "default" in module6 ? { get: () => module6.default, enumerable: true } : { value: module6, enumerable: true })), module6); -}; -var require_browser = __commonJS({ - "(disabled):node_modules/.pnpm/node-fetch@2.6.1/node_modules/node-fetch/browser.js"() { - } -}); -var require_alea = __commonJS({ - "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/alea.js"(exports, module6) { - (function(global2, module7, define2) { - function Alea(seed) { - var me = this, mash = Mash(); - me.next = function() { - var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; - me.s0 = me.s1; - me.s1 = me.s2; - return me.s2 = t - (me.c = t | 0); - }; - me.c = 1; - me.s0 = mash(" "); - me.s1 = mash(" "); - me.s2 = mash(" "); - me.s0 -= mash(seed); - if (me.s0 < 0) { - me.s0 += 1; - } - me.s1 -= mash(seed); - if (me.s1 < 0) { - me.s1 += 1; - } - me.s2 -= mash(seed); - if (me.s2 < 0) { - me.s2 += 1; - } - mash = null; - } - function copy(f, t) { - t.c = f.c; - t.s0 = f.s0; - t.s1 = f.s1; - t.s2 = f.s2; - return t; - } - function impl(seed, opts) { - var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; - prng.int32 = function() { - return xg.next() * 4294967296 | 0; - }; - prng.double = function() { - return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; - }; - prng.quick = prng; - if (state) { - if (typeof state == "object") - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - function Mash() { - var n = 4022871197; - var mash = function(data) { - data = data.toString(); - for (var i = 0; i < data.length; i++) { - n += data.charCodeAt(i); - var h = 0.02519603282416938 * n; - n = h >>> 0; - h -= n; - h *= n; - n = h >>> 0; - h -= n; - n += h * 4294967296; - } - return (n >>> 0) * 23283064365386963e-26; - }; - return mash; - } - if (module7 && module7.exports) { - module7.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.alea = impl; - } - })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); - } -}); -var require_xor128 = __commonJS({ - "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xor128.js"(exports, module6) { - (function(global2, module7, define2) { - function XorGen(seed) { - var me = this, strseed = ""; - me.x = 0; - me.y = 0; - me.z = 0; - me.w = 0; - me.next = function() { - var t = me.x ^ me.x << 11; - me.x = me.y; - me.y = me.z; - me.z = me.w; - return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; - }; - if (seed === (seed | 0)) { - me.x = seed; - } else { - strseed += seed; - } - for (var k = 0; k < strseed.length + 64; k++) { - me.x ^= strseed.charCodeAt(k) | 0; - me.next(); - } - } - function copy(f, t) { - t.x = f.x; - t.y = f.y; - t.z = f.z; - t.w = f.w; - return t; - } - function impl(seed, opts) { - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (typeof state == "object") - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module7 && module7.exports) { - module7.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.xor128 = impl; - } - })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); - } -}); -var require_xorwow = __commonJS({ - "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xorwow.js"(exports, module6) { - (function(global2, module7, define2) { - function XorGen(seed) { - var me = this, strseed = ""; - me.next = function() { - var t = me.x ^ me.x >>> 2; - me.x = me.y; - me.y = me.z; - me.z = me.w; - me.w = me.v; - return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; - }; - me.x = 0; - me.y = 0; - me.z = 0; - me.w = 0; - me.v = 0; - if (seed === (seed | 0)) { - me.x = seed; - } else { - strseed += seed; - } - for (var k = 0; k < strseed.length + 64; k++) { - me.x ^= strseed.charCodeAt(k) | 0; - if (k == strseed.length) { - me.d = me.x << 10 ^ me.x >>> 4; - } - me.next(); - } - } - function copy(f, t) { - t.x = f.x; - t.y = f.y; - t.z = f.z; - t.w = f.w; - t.v = f.v; - t.d = f.d; - return t; - } - function impl(seed, opts) { - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (typeof state == "object") - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module7 && module7.exports) { - module7.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.xorwow = impl; - } - })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); - } -}); -var require_xorshift7 = __commonJS({ - "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xorshift7.js"(exports, module6) { - (function(global2, module7, define2) { - function XorGen(seed) { - var me = this; - me.next = function() { - var X = me.x, i = me.i, t, v, w; - t = X[i]; - t ^= t >>> 7; - v = t ^ t << 24; - t = X[i + 1 & 7]; - v ^= t ^ t >>> 10; - t = X[i + 3 & 7]; - v ^= t ^ t >>> 3; - t = X[i + 4 & 7]; - v ^= t ^ t << 7; - t = X[i + 7 & 7]; - t = t ^ t << 13; - v ^= t ^ t << 9; - X[i] = v; - me.i = i + 1 & 7; - return v; - }; - function init2(me2, seed2) { - var j, w, X = []; - if (seed2 === (seed2 | 0)) { - w = X[0] = seed2; - } else { - seed2 = "" + seed2; - for (j = 0; j < seed2.length; ++j) { - X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; - } - } - while (X.length < 8) - X.push(0); - for (j = 0; j < 8 && X[j] === 0; ++j) - ; - if (j == 8) - w = X[7] = -1; - else - w = X[j]; - me2.x = X; - me2.i = 0; - for (j = 256; j > 0; --j) { - me2.next(); - } - } - init2(me, seed); - } - function copy(f, t) { - t.x = f.x.slice(); - t.i = f.i; - return t; - } - function impl(seed, opts) { - if (seed == null) - seed = +new Date(); - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (state.x) - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module7 && module7.exports) { - module7.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.xorshift7 = impl; - } - })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); - } -}); -var require_xor4096 = __commonJS({ - "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/xor4096.js"(exports, module6) { - (function(global2, module7, define2) { - function XorGen(seed) { - var me = this; - me.next = function() { - var w = me.w, X = me.X, i = me.i, t, v; - me.w = w = w + 1640531527 | 0; - v = X[i + 34 & 127]; - t = X[i = i + 1 & 127]; - v ^= v << 13; - t ^= t << 17; - v ^= v >>> 15; - t ^= t >>> 12; - v = X[i] = v ^ t; - me.i = i; - return v + (w ^ w >>> 16) | 0; - }; - function init2(me2, seed2) { - var t, v, i, j, w, X = [], limit = 128; - if (seed2 === (seed2 | 0)) { - v = seed2; - seed2 = null; - } else { - seed2 = seed2 + "\0"; - v = 0; - limit = Math.max(limit, seed2.length); - } - for (i = 0, j = -32; j < limit; ++j) { - if (seed2) - v ^= seed2.charCodeAt((j + 32) % seed2.length); - if (j === 0) - w = v; - v ^= v << 10; - v ^= v >>> 15; - v ^= v << 4; - v ^= v >>> 13; - if (j >= 0) { - w = w + 1640531527 | 0; - t = X[j & 127] ^= v + w; - i = t == 0 ? i + 1 : 0; - } - } - if (i >= 128) { - X[(seed2 && seed2.length || 0) & 127] = -1; - } - i = 127; - for (j = 4 * 128; j > 0; --j) { - v = X[i + 34 & 127]; - t = X[i = i + 1 & 127]; - v ^= v << 13; - t ^= t << 17; - v ^= v >>> 15; - t ^= t >>> 12; - X[i] = v ^ t; - } - me2.w = w; - me2.X = X; - me2.i = i; - } - init2(me, seed); - } - function copy(f, t) { - t.i = f.i; - t.w = f.w; - t.X = f.X.slice(); - return t; - } - ; - function impl(seed, opts) { - if (seed == null) - seed = +new Date(); - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (state.X) - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module7 && module7.exports) { - module7.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.xor4096 = impl; - } - })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); - } -}); -var require_tychei = __commonJS({ - "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/lib/tychei.js"(exports, module6) { - (function(global2, module7, define2) { - function XorGen(seed) { - var me = this, strseed = ""; - me.next = function() { - var b = me.b, c = me.c, d = me.d, a = me.a; - b = b << 25 ^ b >>> 7 ^ c; - c = c - d | 0; - d = d << 24 ^ d >>> 8 ^ a; - a = a - b | 0; - me.b = b = b << 20 ^ b >>> 12 ^ c; - me.c = c = c - d | 0; - me.d = d << 16 ^ c >>> 16 ^ a; - return me.a = a - b | 0; - }; - me.a = 0; - me.b = 0; - me.c = 2654435769 | 0; - me.d = 1367130551; - if (seed === Math.floor(seed)) { - me.a = seed / 4294967296 | 0; - me.b = seed | 0; - } else { - strseed += seed; - } - for (var k = 0; k < strseed.length + 20; k++) { - me.b ^= strseed.charCodeAt(k) | 0; - me.next(); - } - } - function copy(f, t) { - t.a = f.a; - t.b = f.b; - t.c = f.c; - t.d = f.d; - return t; - } - ; - function impl(seed, opts) { - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (typeof state == "object") - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module7 && module7.exports) { - module7.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.tychei = impl; - } - })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); - } -}); -var require_crypto = __commonJS({ - "(disabled):crypto"() { - } -}); -var require_seedrandom = __commonJS({ - "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/seedrandom.js"(exports, module6) { - (function(pool3, math) { - var global2 = this, width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; - function seedrandom5(seed, options2, callback) { - var key = []; - options2 = options2 == true ? { entropy: true } : options2 || {}; - var shortseed = mixkey(flatten4(options2.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); - var arc4 = new ARC4(key); - var prng = function() { - var n = arc4.g(chunks), d = startdenom, x = 0; - while (n < significance) { - n = (n + x) * width; - d *= width; - x = arc4.g(1); - } - while (n >= overflow) { - n /= 2; - d /= 2; - x >>>= 1; - } - return (n + x) / d; - }; - prng.int32 = function() { - return arc4.g(4) | 0; - }; - prng.quick = function() { - return arc4.g(4) / 4294967296; - }; - prng.double = prng; - mixkey(tostring(arc4.S), pool3); - return (options2.pass || callback || function(prng2, seed2, is_math_call, state) { - if (state) { - if (state.S) { - copy(state, arc4); - } - prng2.state = function() { - return copy(arc4, {}); - }; - } - if (is_math_call) { - math[rngname] = prng2; - return seed2; - } else - return prng2; - })(prng, shortseed, "global" in options2 ? options2.global : this == math, options2.state); - } - math["seed" + rngname] = seedrandom5; - function ARC4(key) { - var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; - if (!keylen) { - key = [keylen++]; - } - while (i < width) { - s[i] = i++; - } - for (i = 0; i < width; i++) { - s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; - s[j] = t; - } - (me.g = function(count22) { - var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; - while (count22--) { - t2 = s2[i2 = mask & i2 + 1]; - r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; - } - me.i = i2; - me.j = j2; - return r; - })(width); - } - function copy(f, t) { - t.i = f.i; - t.j = f.j; - t.S = f.S.slice(); - return t; - } - ; - function flatten4(obj, depth) { - var result = [], typ = typeof obj, prop; - if (depth && typ == "object") { - for (prop in obj) { - try { - result.push(flatten4(obj[prop], depth - 1)); - } catch (e) { - } - } - } - return result.length ? result : typ == "string" ? obj : obj + "\0"; - } - function mixkey(seed, key) { - var stringseed = seed + "", smear, j = 0; - while (j < stringseed.length) { - key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); - } - return tostring(key); - } - function autoseed() { - try { - var out; - if (nodecrypto && (out = nodecrypto.randomBytes)) { - out = out(width); - } else { - out = new Uint8Array(width); - (global2.crypto || global2.msCrypto).getRandomValues(out); - } - return tostring(out); - } catch (e) { - var browser4 = global2.navigator, plugins = browser4 && browser4.plugins; - return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; - } - } - function tostring(a) { - return String.fromCharCode.apply(0, a); - } - mixkey(math.random(), pool3); - if (typeof module6 == "object" && module6.exports) { - module6.exports = seedrandom5; - try { - nodecrypto = require_crypto(); - } catch (ex) { - } - } else if (typeof define == "function" && define.amd) { - define(function() { - return seedrandom5; - }); - } - })([], Math); - } -}); -var require_seedrandom2 = __commonJS({ - "node_modules/.pnpm/seedrandom@2.4.3/node_modules/seedrandom/index.js"(exports, module6) { - var alea5 = require_alea(); - var xor128 = require_xor128(); - var xorwow = require_xorwow(); - var xorshift7 = require_xorshift7(); - var xor4096 = require_xor4096(); - var tychei = require_tychei(); - var sr = require_seedrandom(); - sr.alea = alea5; - sr.xor128 = xor128; - sr.xorwow = xorwow; - sr.xorshift7 = xorshift7; - sr.xor4096 = xor4096; - sr.tychei = tychei; - module6.exports = sr; - } -}); -var require_path = __commonJS({ - "(disabled):path"() { - } -}); -var require_worker_threads = __commonJS({ - "(disabled):worker_threads"() { - } -}); -var require_perf_hooks = __commonJS({ - "(disabled):perf_hooks"() { - } -}); -var require_tfjs_backend_wasm_threaded_simd = __commonJS({ - "node_modules/.pnpm/@tensorflow+tfjs-backend-wasm@3.6.0_@tensorflow+tfjs-core@3.6.0/node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js"(exports, module6) { - var WasmBackendModuleThreadedSimd = function() { - var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; - if (typeof __filename !== "undefined") - _scriptDir = _scriptDir || __filename; - return function(WasmBackendModuleThreadedSimd2) { - WasmBackendModuleThreadedSimd2 = WasmBackendModuleThreadedSimd2 || {}; - function GROWABLE_HEAP_I8() { - if (wasmMemory.buffer != buffer2) { - updateGlobalBufferAndViews(wasmMemory.buffer); - } - return HEAP8; - } - function GROWABLE_HEAP_U8() { - if (wasmMemory.buffer != buffer2) { - updateGlobalBufferAndViews(wasmMemory.buffer); - } - return HEAPU8; - } - function GROWABLE_HEAP_I32() { - if (wasmMemory.buffer != buffer2) { - updateGlobalBufferAndViews(wasmMemory.buffer); - } - return HEAP32; - } - function GROWABLE_HEAP_U32() { - if (wasmMemory.buffer != buffer2) { - updateGlobalBufferAndViews(wasmMemory.buffer); - } - return HEAPU32; - } - function GROWABLE_HEAP_F64() { - if (wasmMemory.buffer != buffer2) { - updateGlobalBufferAndViews(wasmMemory.buffer); - } - return HEAPF64; - } - var Module = typeof WasmBackendModuleThreadedSimd2 !== "undefined" ? WasmBackendModuleThreadedSimd2 : {}; - var readyPromiseResolve, readyPromiseReject; - Module["ready"] = new Promise(function(resolve, reject) { - readyPromiseResolve = resolve; - readyPromiseReject = reject; - }); - var moduleOverrides = {}; - var key; - for (key in Module) { - if (Module.hasOwnProperty(key)) { - moduleOverrides[key] = Module[key]; - } - } - var arguments_ = []; - var thisProgram = "./this.program"; - var quit_ = function(status, toThrow) { - throw toThrow; - }; - var ENVIRONMENT_IS_WEB = false; - var ENVIRONMENT_IS_WORKER = false; - var ENVIRONMENT_IS_NODE = false; - var ENVIRONMENT_IS_SHELL = false; - ENVIRONMENT_IS_WEB = typeof window === "object"; - ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; - ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; - ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; - var ENVIRONMENT_IS_PTHREAD = Module["ENVIRONMENT_IS_PTHREAD"] || false; - if (ENVIRONMENT_IS_PTHREAD) { - buffer2 = Module["buffer"]; - } - var scriptDirectory = ""; - function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; - } - var read_, readAsync, readBinary, setWindowTitle; - var nodeFS; - var nodePath; - if (ENVIRONMENT_IS_NODE) { - if (ENVIRONMENT_IS_WORKER) { - scriptDirectory = require_path().dirname(scriptDirectory) + "/"; - } else { - scriptDirectory = __dirname + "/"; - } - read_ = function shell_read(filename, binary) { - if (!nodeFS) - nodeFS = __require2("fs"); - if (!nodePath) - nodePath = require_path(); - filename = nodePath["normalize"](filename); - return nodeFS["readFileSync"](filename, binary ? null : "utf8"); - }; - readBinary = function readBinary2(filename) { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - assert3(ret.buffer); - return ret; - }; - if (process["argv"].length > 1) { - thisProgram = process["argv"][1].replace(/\\/g, "/"); - } - arguments_ = process["argv"].slice(2); - process["on"]("uncaughtException", function(ex) { - if (!(ex instanceof ExitStatus)) { - throw ex; - } - }); - process["on"]("unhandledRejection", abort); - quit_ = function(status) { - process["exit"](status); - }; - Module["inspect"] = function() { - return "[Emscripten Module object]"; - }; - var nodeWorkerThreads; - try { - nodeWorkerThreads = require_worker_threads(); - } catch (e) { - console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'); - throw e; - } - global.Worker = nodeWorkerThreads.Worker; - } else if (ENVIRONMENT_IS_SHELL) { - if (typeof read != "undefined") { - read_ = function shell_read(f) { - return read(f); - }; - } - readBinary = function readBinary2(f) { - var data; - if (typeof readbuffer === "function") { - return new Uint8Array(readbuffer(f)); - } - data = read(f, "binary"); - assert3(typeof data === "object"); - return data; - }; - if (typeof scriptArgs != "undefined") { - arguments_ = scriptArgs; - } else if (typeof arguments != "undefined") { - arguments_ = arguments; - } - if (typeof quit === "function") { - quit_ = function(status) { - quit(status); - }; - } - if (typeof print !== "undefined") { - if (typeof console === "undefined") - console = {}; - console.log = print; - console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; - } - } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { - if (ENVIRONMENT_IS_WORKER) { - scriptDirectory = self.location.href; - } else if (typeof document !== "undefined" && document.currentScript) { - scriptDirectory = document.currentScript.src; - } - if (typeof _scriptDir !== "undefined" && _scriptDir) { - scriptDirectory = _scriptDir; - } - if (scriptDirectory.indexOf("blob:") !== 0) { - scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); - } else { - scriptDirectory = ""; - } - if (ENVIRONMENT_IS_NODE) { - read_ = function shell_read(filename, binary) { - if (!nodeFS) - nodeFS = __require2("fs"); - if (!nodePath) - nodePath = require_path(); - filename = nodePath["normalize"](filename); - return nodeFS["readFileSync"](filename, binary ? null : "utf8"); - }; - readBinary = function readBinary2(filename) { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - assert3(ret.buffer); - return ret; - }; - } else { - read_ = function(url) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, false); - xhr.send(null); - return xhr.responseText; - }; - if (ENVIRONMENT_IS_WORKER) { - readBinary = function(url) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, false); - xhr.responseType = "arraybuffer"; - xhr.send(null); - return new Uint8Array(xhr.response); - }; - } - readAsync = function(url, onload, onerror) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, true); - xhr.responseType = "arraybuffer"; - xhr.onload = function() { - if (xhr.status == 200 || xhr.status == 0 && xhr.response) { - onload(xhr.response); - return; - } - onerror(); - }; - xhr.onerror = onerror; - xhr.send(null); - }; - } - setWindowTitle = function(title) { - document.title = title; - }; - } else { - } - if (ENVIRONMENT_IS_NODE) { - if (typeof performance === "undefined") { - global.performance = require_perf_hooks().performance; - } - } - var out = Module["print"] || console.log.bind(console); - var err = Module["printErr"] || console.warn.bind(console); - for (key in moduleOverrides) { - if (moduleOverrides.hasOwnProperty(key)) { - Module[key] = moduleOverrides[key]; - } - } - moduleOverrides = null; - if (Module["arguments"]) - arguments_ = Module["arguments"]; - if (Module["thisProgram"]) - thisProgram = Module["thisProgram"]; - if (Module["quit"]) - quit_ = Module["quit"]; - var Atomics_load = Atomics.load; - var Atomics_store = Atomics.store; - var Atomics_compareExchange = Atomics.compareExchange; - var wasmBinary; - if (Module["wasmBinary"]) - wasmBinary = Module["wasmBinary"]; - var noExitRuntime = Module["noExitRuntime"] || true; - if (typeof WebAssembly !== "object") { - abort("no native wasm support detected"); - } - var wasmMemory; - var wasmModule; - var ABORT = false; - var EXITSTATUS; - function assert3(condition, text) { - if (!condition) { - abort("Assertion failed: " + text); - } - } - function getCFunc(ident) { - var func2 = Module["_" + ident]; - assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); - return func2; - } - function ccall(ident, returnType, argTypes, args, opts) { - var toC = { "string": function(str) { - var ret2 = 0; - if (str !== null && str !== void 0 && str !== 0) { - var len = (str.length << 2) + 1; - ret2 = stackAlloc(len); - stringToUTF8(str, ret2, len); - } - return ret2; - }, "array": function(arr) { - var ret2 = stackAlloc(arr.length); - writeArrayToMemory(arr, ret2); - return ret2; - } }; - function convertReturnValue(ret2) { - if (returnType === "string") - return UTF8ToString(ret2); - if (returnType === "boolean") - return Boolean(ret2); - return ret2; - } - var func2 = getCFunc(ident); - var cArgs = []; - var stack2 = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack2 === 0) - stack2 = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func2.apply(null, cArgs); - ret = convertReturnValue(ret); - if (stack2 !== 0) - stackRestore(stack2); - return ret; - } - function cwrap(ident, returnType, argTypes, opts) { - argTypes = argTypes || []; - var numericArgs = argTypes.every(function(type) { - return type === "number"; - }); - var numericRet = returnType !== "string"; - if (numericRet && numericArgs && !opts) { - return getCFunc(ident); - } - return function() { - return ccall(ident, returnType, argTypes, arguments, opts); - }; - } - function UTF8ArrayToString(heap, idx, maxBytesToRead) { - var endIdx = idx + maxBytesToRead; - var str = ""; - while (!(idx >= endIdx)) { - var u0 = heap[idx++]; - if (!u0) - return str; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heap[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode((u0 & 31) << 6 | u1); - continue; - } - var u2 = heap[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = (u0 & 15) << 12 | u1 << 6 | u2; - } else { - u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); - } - } - return str; - } - function UTF8ToString(ptr, maxBytesToRead) { - return ptr ? UTF8ArrayToString(GROWABLE_HEAP_U8(), ptr, maxBytesToRead) : ""; - } - function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { - if (!(maxBytesToWrite > 0)) - return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | u1 & 1023; - } - if (u <= 127) { - if (outIdx >= endIdx) - break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) - break; - heap[outIdx++] = 192 | u >> 6; - heap[outIdx++] = 128 | u & 63; - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) - break; - heap[outIdx++] = 224 | u >> 12; - heap[outIdx++] = 128 | u >> 6 & 63; - heap[outIdx++] = 128 | u & 63; - } else { - if (outIdx + 3 >= endIdx) - break; - heap[outIdx++] = 240 | u >> 18; - heap[outIdx++] = 128 | u >> 12 & 63; - heap[outIdx++] = 128 | u >> 6 & 63; - heap[outIdx++] = 128 | u & 63; - } - } - heap[outIdx] = 0; - return outIdx - startIdx; - } - function stringToUTF8(str, outPtr, maxBytesToWrite) { - return stringToUTF8Array(str, GROWABLE_HEAP_U8(), outPtr, maxBytesToWrite); - } - function lengthBytesUTF8(str) { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) - u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023; - if (u <= 127) - ++len; - else if (u <= 2047) - len += 2; - else if (u <= 65535) - len += 3; - else - len += 4; - } - return len; - } - function writeArrayToMemory(array2, buffer3) { - GROWABLE_HEAP_I8().set(array2, buffer3); - } - function alignUp(x, multiple) { - if (x % multiple > 0) { - x += multiple - x % multiple; - } - return x; - } - var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; - function updateGlobalBufferAndViews(buf) { - buffer2 = buf; - Module["HEAP8"] = HEAP8 = new Int8Array(buf); - Module["HEAP16"] = HEAP16 = new Int16Array(buf); - Module["HEAP32"] = HEAP32 = new Int32Array(buf); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); - Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); - Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); - } - var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; - if (ENVIRONMENT_IS_PTHREAD) { - wasmMemory = Module["wasmMemory"]; - buffer2 = Module["buffer"]; - } else { - if (Module["wasmMemory"]) { - wasmMemory = Module["wasmMemory"]; - } else { - wasmMemory = new WebAssembly.Memory({ "initial": INITIAL_MEMORY / 65536, "maximum": 2147483648 / 65536, "shared": true }); - if (!(wasmMemory.buffer instanceof SharedArrayBuffer)) { - err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"); - if (ENVIRONMENT_IS_NODE) { - console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"); - } - throw Error("bad memory"); - } - } - } - if (wasmMemory) { - buffer2 = wasmMemory.buffer; - } - INITIAL_MEMORY = buffer2.byteLength; - updateGlobalBufferAndViews(buffer2); - var wasmTable; - var __ATPRERUN__ = []; - var __ATINIT__ = []; - var __ATMAIN__ = []; - var __ATEXIT__ = []; - var __ATPOSTRUN__ = []; - var runtimeInitialized = false; - var runtimeExited = false; - if (!ENVIRONMENT_IS_PTHREAD) - __ATINIT__.push({ func: function() { - ___wasm_call_ctors(); - } }); - function preRun() { - if (ENVIRONMENT_IS_PTHREAD) - return; - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") - Module["preRun"] = [Module["preRun"]]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); - } - function initRuntime() { - runtimeInitialized = true; - if (ENVIRONMENT_IS_PTHREAD) - return; - callRuntimeCallbacks(__ATINIT__); - } - function preMain() { - if (ENVIRONMENT_IS_PTHREAD) - return; - callRuntimeCallbacks(__ATMAIN__); - } - function exitRuntime() { - if (ENVIRONMENT_IS_PTHREAD) - return; - runtimeExited = true; - } - function postRun() { - if (ENVIRONMENT_IS_PTHREAD) - return; - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") - Module["postRun"] = [Module["postRun"]]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); - } - function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); - } - function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); - } - var runDependencies = 0; - var runDependencyWatcher = null; - var dependenciesFulfilled = null; - function addRunDependency(id) { - assert3(!ENVIRONMENT_IS_PTHREAD, "addRunDependency cannot be used in a pthread worker"); - runDependencies++; - if (Module["monitorRunDependencies"]) { - Module["monitorRunDependencies"](runDependencies); - } - } - function removeRunDependency(id) { - runDependencies--; - if (Module["monitorRunDependencies"]) { - Module["monitorRunDependencies"](runDependencies); - } - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } - } - Module["preloadedImages"] = {}; - Module["preloadedAudios"] = {}; - function abort(what) { - if (Module["onAbort"]) { - Module["onAbort"](what); - } - if (ENVIRONMENT_IS_PTHREAD) - console.error("Pthread aborting at " + new Error().stack); - what += ""; - err(what); - ABORT = true; - EXITSTATUS = 1; - what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; - var e = new WebAssembly.RuntimeError(what); - readyPromiseReject(e); - throw e; - } - function hasPrefix(str, prefix) { - return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; - } - var dataURIPrefix = "data:application/octet-stream;base64,"; - function isDataURI(filename) { - return hasPrefix(filename, dataURIPrefix); - } - var fileURIPrefix = "file://"; - function isFileURI(filename) { - return hasPrefix(filename, fileURIPrefix); - } - var wasmBinaryFile = "tfjs-backend-wasm-threaded-simd.wasm"; - if (!isDataURI(wasmBinaryFile)) { - wasmBinaryFile = locateFile(wasmBinaryFile); - } - function getBinary(file) { - try { - if (file == wasmBinaryFile && wasmBinary) { - return new Uint8Array(wasmBinary); - } - if (readBinary) { - return readBinary(file); - } else { - throw "both async and sync fetching of the wasm failed"; - } - } catch (err2) { - abort(err2); - } - } - function getBinaryPromise() { - if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { - if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { - return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(function(response) { - if (!response["ok"]) { - throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; - } - return response["arrayBuffer"](); - }).catch(function() { - return getBinary(wasmBinaryFile); - }); - } else { - if (readAsync) { - return new Promise(function(resolve, reject) { - readAsync(wasmBinaryFile, function(response) { - resolve(new Uint8Array(response)); - }, reject); - }); - } - } - } - return Promise.resolve().then(function() { - return getBinary(wasmBinaryFile); - }); - } - function createWasm() { - var info2 = { "a": asmLibraryArg }; - function receiveInstance(instance, module7) { - var exports3 = instance.exports; - Module["asm"] = exports3; - wasmTable = Module["asm"]["F"]; - wasmModule = module7; - if (!ENVIRONMENT_IS_PTHREAD) { - var numWorkersToLoad = PThread.unusedWorkers.length; - PThread.unusedWorkers.forEach(function(w) { - PThread.loadWasmModuleToWorker(w, function() { - if (!--numWorkersToLoad) - removeRunDependency("wasm-instantiate"); - }); - }); - } - } - if (!ENVIRONMENT_IS_PTHREAD) { - addRunDependency("wasm-instantiate"); - } - function receiveInstantiatedSource(output) { - receiveInstance(output["instance"], output["module"]); - } - function instantiateArrayBuffer(receiver) { - return getBinaryPromise().then(function(binary) { - return WebAssembly.instantiate(binary, info2); - }).then(receiver, function(reason) { - err("failed to asynchronously prepare wasm: " + reason); - abort(reason); - }); - } - function instantiateAsync() { - if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { - return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(function(response) { - var result = WebAssembly.instantiateStreaming(response, info2); - return result.then(receiveInstantiatedSource, function(reason) { - err("wasm streaming compile failed: " + reason); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(receiveInstantiatedSource); - }); - }); - } else { - return instantiateArrayBuffer(receiveInstantiatedSource); - } - } - if (Module["instantiateWasm"]) { - try { - var exports2 = Module["instantiateWasm"](info2, receiveInstance); - return exports2; - } catch (e) { - err("Module.instantiateWasm callback failed with error: " + e); - return false; - } - } - instantiateAsync().catch(readyPromiseReject); - return {}; - } - var ASM_CONSTS = { 9816: function() { - throw "Canceled!"; - }, 9834: function($0, $1) { - setTimeout(function() { - __emscripten_do_dispatch_to_thread($0, $1); - }, 0); - } }; - function initPthreadsJS() { - PThread.initRuntime(); - } - function callRuntimeCallbacks(callbacks2) { - while (callbacks2.length > 0) { - var callback = callbacks2.shift(); - if (typeof callback == "function") { - callback(Module); - continue; - } - var func2 = callback.func; - if (typeof func2 === "number") { - if (callback.arg === void 0) { - wasmTable.get(func2)(); - } else { - wasmTable.get(func2)(callback.arg); - } - } else { - func2(callback.arg === void 0 ? null : callback.arg); - } - } - } - function _emscripten_futex_wake(addr, count22) { - if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true || count22 < 0) - return -28; - if (count22 == 0) - return 0; - if (count22 >= 2147483647) - count22 = Infinity; - var mainThreadWaitAddress = Atomics.load(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2); - var mainThreadWoken = 0; - if (mainThreadWaitAddress == addr) { - var loadedAddr = Atomics.compareExchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, mainThreadWaitAddress, 0); - if (loadedAddr == mainThreadWaitAddress) { - --count22; - mainThreadWoken = 1; - if (count22 <= 0) - return 1; - } - } - var ret = Atomics.notify(GROWABLE_HEAP_I32(), addr >> 2, count22); - if (ret >= 0) - return ret + mainThreadWoken; - throw "Atomics.notify returned an unexpected value " + ret; - } - Module["_emscripten_futex_wake"] = _emscripten_futex_wake; - function killThread(pthread_ptr) { - if (ENVIRONMENT_IS_PTHREAD) - throw "Internal Error! killThread() can only ever be called from main application thread!"; - if (!pthread_ptr) - throw "Internal Error! Null pthread_ptr in killThread!"; - GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; - var pthread = PThread.pthreads[pthread_ptr]; - pthread.worker.terminate(); - PThread.freeThreadData(pthread); - PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker), 1); - pthread.worker.pthread = void 0; - } - function cancelThread(pthread_ptr) { - if (ENVIRONMENT_IS_PTHREAD) - throw "Internal Error! cancelThread() can only ever be called from main application thread!"; - if (!pthread_ptr) - throw "Internal Error! Null pthread_ptr in cancelThread!"; - var pthread = PThread.pthreads[pthread_ptr]; - pthread.worker.postMessage({ "cmd": "cancel" }); - } - function cleanupThread(pthread_ptr) { - if (ENVIRONMENT_IS_PTHREAD) - throw "Internal Error! cleanupThread() can only ever be called from main application thread!"; - if (!pthread_ptr) - throw "Internal Error! Null pthread_ptr in cleanupThread!"; - var pthread = PThread.pthreads[pthread_ptr]; - if (pthread) { - GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; - var worker = pthread.worker; - PThread.returnWorkerToPool(worker); - } - } - var PThread = { unusedWorkers: [], runningWorkers: [], initMainThreadBlock: function() { - var pthreadPoolSize = Math.min(4, Math.max(1, (navigator.hardwareConcurrency || 1) / 2)); - for (var i = 0; i < pthreadPoolSize; ++i) { - PThread.allocateUnusedWorker(); - } - }, initRuntime: function() { - var tb = _malloc(228); - for (var i = 0; i < 228 / 4; ++i) - GROWABLE_HEAP_U32()[tb / 4 + i] = 0; - GROWABLE_HEAP_I32()[tb + 12 >> 2] = tb; - var headPtr = tb + 152; - GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; - var tlsMemory = _malloc(512); - for (var i = 0; i < 128; ++i) - GROWABLE_HEAP_U32()[tlsMemory / 4 + i] = 0; - Atomics.store(GROWABLE_HEAP_U32(), tb + 100 >> 2, tlsMemory); - Atomics.store(GROWABLE_HEAP_U32(), tb + 40 >> 2, tb); - __emscripten_thread_init(tb, !ENVIRONMENT_IS_WORKER, 1); - _emscripten_register_main_browser_thread_id(tb); - }, initWorker: function() { - }, pthreads: {}, threadExitHandlers: [], setThreadStatus: function() { - }, runExitHandlers: function() { - while (PThread.threadExitHandlers.length > 0) { - PThread.threadExitHandlers.pop()(); - } - if (ENVIRONMENT_IS_PTHREAD && _pthread_self()) - ___pthread_tsd_run_dtors(); - }, runExitHandlersAndDeinitThread: function(tb, exitCode) { - Atomics.store(GROWABLE_HEAP_U32(), tb + 56 >> 2, 1); - Atomics.store(GROWABLE_HEAP_U32(), tb + 60 >> 2, 0); - PThread.runExitHandlers(); - Atomics.store(GROWABLE_HEAP_U32(), tb + 4 >> 2, exitCode); - Atomics.store(GROWABLE_HEAP_U32(), tb + 0 >> 2, 1); - _emscripten_futex_wake(tb + 0, 2147483647); - __emscripten_thread_init(0, 0, 0); - }, threadExit: function(exitCode) { - var tb = _pthread_self(); - if (tb) { - PThread.runExitHandlersAndDeinitThread(tb, exitCode); - if (ENVIRONMENT_IS_PTHREAD) { - postMessage({ "cmd": "exit" }); - } - } - }, threadCancel: function() { - PThread.runExitHandlersAndDeinitThread(_pthread_self(), -1); - postMessage({ "cmd": "cancelDone" }); - }, terminateAllThreads: function() { - for (var t in PThread.pthreads) { - var pthread = PThread.pthreads[t]; - if (pthread && pthread.worker) { - PThread.returnWorkerToPool(pthread.worker); - } - } - PThread.pthreads = {}; - for (var i = 0; i < PThread.unusedWorkers.length; ++i) { - var worker = PThread.unusedWorkers[i]; - worker.terminate(); - } - PThread.unusedWorkers = []; - for (var i = 0; i < PThread.runningWorkers.length; ++i) { - var worker = PThread.runningWorkers[i]; - var pthread = worker.pthread; - PThread.freeThreadData(pthread); - worker.terminate(); - } - PThread.runningWorkers = []; - }, freeThreadData: function(pthread) { - if (!pthread) - return; - if (pthread.threadInfoStruct) { - var tlsMemory = GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2]; - GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2] = 0; - _free(tlsMemory); - _free(pthread.threadInfoStruct); - } - pthread.threadInfoStruct = 0; - if (pthread.allocatedOwnStack && pthread.stackBase) - _free(pthread.stackBase); - pthread.stackBase = 0; - if (pthread.worker) - pthread.worker.pthread = null; - }, returnWorkerToPool: function(worker) { - PThread.runWithoutMainThreadQueuedCalls(function() { - delete PThread.pthreads[worker.pthread.threadInfoStruct]; - PThread.unusedWorkers.push(worker); - PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker), 1); - PThread.freeThreadData(worker.pthread); - worker.pthread = void 0; - }); - }, runWithoutMainThreadQueuedCalls: function(func2) { - GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 0; - try { - func2(); - } finally { - GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 1; - } - }, receiveObjectTransfer: function(data) { - }, loadWasmModuleToWorker: function(worker, onFinishedLoading) { - worker.onmessage = function(e) { - var d = e["data"]; - var cmd = d["cmd"]; - if (worker.pthread) - PThread.currentProxiedOperationCallerThread = worker.pthread.threadInfoStruct; - if (d["targetThread"] && d["targetThread"] != _pthread_self()) { - var thread = PThread.pthreads[d.targetThread]; - if (thread) { - thread.worker.postMessage(e.data, d["transferList"]); - } else { - console.error('Internal error! Worker sent a message "' + cmd + '" to target pthread ' + d["targetThread"] + ", but that thread no longer exists!"); - } - PThread.currentProxiedOperationCallerThread = void 0; - return; - } - if (cmd === "processQueuedMainThreadWork") { - _emscripten_main_thread_process_queued_calls(); - } else if (cmd === "spawnThread") { - spawnThread(e.data); - } else if (cmd === "cleanupThread") { - cleanupThread(d["thread"]); - } else if (cmd === "killThread") { - killThread(d["thread"]); - } else if (cmd === "cancelThread") { - cancelThread(d["thread"]); - } else if (cmd === "loaded") { - worker.loaded = true; - if (onFinishedLoading) - onFinishedLoading(worker); - if (worker.runPthread) { - worker.runPthread(); - delete worker.runPthread; - } - } else if (cmd === "print") { - out("Thread " + d["threadId"] + ": " + d["text"]); - } else if (cmd === "printErr") { - err("Thread " + d["threadId"] + ": " + d["text"]); - } else if (cmd === "alert") { - alert("Thread " + d["threadId"] + ": " + d["text"]); - } else if (cmd === "exit") { - var detached = worker.pthread && Atomics.load(GROWABLE_HEAP_U32(), worker.pthread.threadInfoStruct + 64 >> 2); - if (detached) { - PThread.returnWorkerToPool(worker); - } - } else if (cmd === "exitProcess") { - try { - exit(d["returnCode"]); - } catch (e2) { - if (e2 instanceof ExitStatus) - return; - throw e2; - } - } else if (cmd === "cancelDone") { - PThread.returnWorkerToPool(worker); - } else if (cmd === "objectTransfer") { - PThread.receiveObjectTransfer(e.data); - } else if (e.data.target === "setimmediate") { - worker.postMessage(e.data); - } else { - err("worker sent an unknown command " + cmd); - } - PThread.currentProxiedOperationCallerThread = void 0; - }; - worker.onerror = function(e) { - err("pthread sent an error! " + e.filename + ":" + e.lineno + ": " + e.message); - }; - if (ENVIRONMENT_IS_NODE) { - worker.on("message", function(data) { - worker.onmessage({ data }); - }); - worker.on("error", function(data) { - worker.onerror(data); - }); - worker.on("exit", function(data) { - }); - } - worker.postMessage({ "cmd": "load", "urlOrBlob": Module["mainScriptUrlOrBlob"] || _scriptDir, "wasmMemory": wasmMemory, "wasmModule": wasmModule }); - }, allocateUnusedWorker: function() { - var pthreadMainJs = locateFile("tfjs-backend-wasm-threaded-simd.worker.js"); - PThread.unusedWorkers.push(new Worker(pthreadMainJs)); - }, getNewWorker: function() { - if (PThread.unusedWorkers.length == 0) { - PThread.allocateUnusedWorker(); - PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0]); - } - if (PThread.unusedWorkers.length > 0) - return PThread.unusedWorkers.pop(); - else - return null; - }, busySpinWait: function(msecs) { - var t = performance.now() + msecs; - while (performance.now() < t) { - } - } }; - function establishStackSpace(stackTop, stackMax) { - _emscripten_stack_set_limits(stackTop, stackMax); - stackRestore(stackTop); - } - Module["establishStackSpace"] = establishStackSpace; - function getNoExitRuntime() { - return noExitRuntime; - } - Module["getNoExitRuntime"] = getNoExitRuntime; - function invokeEntryPoint(ptr, arg) { - return wasmTable.get(ptr)(arg); - } - Module["invokeEntryPoint"] = invokeEntryPoint; - function ___assert_fail(condition, filename, line, func2) { - abort("Assertion failed: " + UTF8ToString(condition) + ", at: " + [filename ? UTF8ToString(filename) : "unknown filename", line, func2 ? UTF8ToString(func2) : "unknown function"]); - } - function ___call_main(argc, argv) { - var returnCode = _main(argc, argv); - } - var _emscripten_get_now; - if (ENVIRONMENT_IS_NODE) { - _emscripten_get_now = function() { - var t = process["hrtime"](); - return t[0] * 1e3 + t[1] / 1e6; - }; - } else if (ENVIRONMENT_IS_PTHREAD) { - _emscripten_get_now = function() { - return performance.now() - Module["__performance_now_clock_drift"]; - }; - } else if (typeof dateNow !== "undefined") { - _emscripten_get_now = dateNow; - } else - _emscripten_get_now = function() { - return performance.now(); - }; - function setErrNo(value) { - GROWABLE_HEAP_I32()[___errno_location() >> 2] = value; - return value; - } - function _atexit(func2, arg) { - if (ENVIRONMENT_IS_PTHREAD) - return _emscripten_proxy_to_main_thread_js(1, 1, func2, arg); - } - function __emscripten_notify_thread_queue(targetThreadId, mainThreadId) { - if (targetThreadId == mainThreadId) { - postMessage({ "cmd": "processQueuedMainThreadWork" }); - } else if (ENVIRONMENT_IS_PTHREAD) { - postMessage({ "targetThread": targetThreadId, "cmd": "processThreadQueue" }); - } else { - var pthread = PThread.pthreads[targetThreadId]; - var worker = pthread && pthread.worker; - if (!worker) { - return; - } - worker.postMessage({ "cmd": "processThreadQueue" }); - } - return 1; - } - function _abort() { - abort(); - } - function _emscripten_asm_const_int(code, sigPtr, argbuf) { - var args = readAsmConstArgs(sigPtr, argbuf); - return ASM_CONSTS[code].apply(null, args); - } - function _emscripten_conditional_set_current_thread_status(expectedStatus, newStatus) { - } - function _emscripten_futex_wait(addr, val, timeout) { - if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true) - return -28; - if (!ENVIRONMENT_IS_WEB) { - var ret = Atomics.wait(GROWABLE_HEAP_I32(), addr >> 2, val, timeout); - if (ret === "timed-out") - return -73; - if (ret === "not-equal") - return -6; - if (ret === "ok") - return 0; - throw "Atomics.wait returned an unexpected value " + ret; - } else { - if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { - return -6; - } - var tNow = performance.now(); - var tEnd = tNow + timeout; - var lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); - while (1) { - tNow = performance.now(); - if (tNow > tEnd) { - lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); - return -73; - } - lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); - if (lastAddr == 0) { - break; - } - _emscripten_main_thread_process_queued_calls(); - if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { - return -6; - } - lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); - } - return 0; - } - } - function _emscripten_memcpy_big(dest, src, num) { - GROWABLE_HEAP_U8().copyWithin(dest, src, src + num); - } - function _emscripten_num_logical_cores() { - if (ENVIRONMENT_IS_NODE) - return __require2("os").cpus().length; - return navigator["hardwareConcurrency"]; - } - function _emscripten_proxy_to_main_thread_js(index, sync) { - var numCallArgs = arguments.length - 2; - var stack2 = stackSave(); - var serializedNumCallArgs = numCallArgs; - var args = stackAlloc(serializedNumCallArgs * 8); - var b = args >> 3; - for (var i = 0; i < numCallArgs; i++) { - var arg = arguments[2 + i]; - GROWABLE_HEAP_F64()[b + i] = arg; - } - var ret = _emscripten_run_in_main_runtime_thread_js(index, serializedNumCallArgs, args, sync); - stackRestore(stack2); - return ret; - } - var _emscripten_receive_on_main_thread_js_callArgs = []; - var readAsmConstArgsArray = []; - function readAsmConstArgs(sigPtr, buf) { - readAsmConstArgsArray.length = 0; - var ch; - buf >>= 2; - while (ch = GROWABLE_HEAP_U8()[sigPtr++]) { - var double = ch < 105; - if (double && buf & 1) - buf++; - readAsmConstArgsArray.push(double ? GROWABLE_HEAP_F64()[buf++ >> 1] : GROWABLE_HEAP_I32()[buf]); - ++buf; - } - return readAsmConstArgsArray; - } - function _emscripten_receive_on_main_thread_js(index, numCallArgs, args) { - _emscripten_receive_on_main_thread_js_callArgs.length = numCallArgs; - var b = args >> 3; - for (var i = 0; i < numCallArgs; i++) { - _emscripten_receive_on_main_thread_js_callArgs[i] = GROWABLE_HEAP_F64()[b + i]; - } - var isEmAsmConst = index < 0; - var func2 = !isEmAsmConst ? proxiedFunctionTable[index] : ASM_CONSTS[-index - 1]; - return func2.apply(null, _emscripten_receive_on_main_thread_js_callArgs); - } - function _emscripten_get_heap_size() { - return GROWABLE_HEAP_U8().length; - } - function emscripten_realloc_buffer(size) { - try { - wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); - updateGlobalBufferAndViews(wasmMemory.buffer); - return 1; - } catch (e) { - } - } - function _emscripten_resize_heap(requestedSize) { - var oldSize = _emscripten_get_heap_size(); - if (requestedSize <= oldSize) { - return false; - } - var maxHeapSize = 2147483648; - if (requestedSize > maxHeapSize) { - return false; - } - for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { - var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); - overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); - var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = emscripten_realloc_buffer(newSize); - if (replacement) { - return true; - } - } - return false; - } - var JSEvents = { inEventHandler: 0, removeAllEventListeners: function() { - for (var i = JSEvents.eventHandlers.length - 1; i >= 0; --i) { - JSEvents._removeHandler(i); - } - JSEvents.eventHandlers = []; - JSEvents.deferredCalls = []; - }, registerRemoveEventListeners: function() { - if (!JSEvents.removeEventListenersRegistered) { - __ATEXIT__.push(JSEvents.removeAllEventListeners); - JSEvents.removeEventListenersRegistered = true; - } - }, deferredCalls: [], deferCall: function(targetFunction, precedence, argsList) { - function arraysHaveEqualContent(arrA, arrB) { - if (arrA.length != arrB.length) - return false; - for (var i2 in arrA) { - if (arrA[i2] != arrB[i2]) - return false; - } - return true; - } - for (var i in JSEvents.deferredCalls) { - var call = JSEvents.deferredCalls[i]; - if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) { - return; - } - } - JSEvents.deferredCalls.push({ targetFunction, precedence, argsList }); - JSEvents.deferredCalls.sort(function(x, y) { - return x.precedence < y.precedence; - }); - }, removeDeferredCalls: function(targetFunction) { - for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { - if (JSEvents.deferredCalls[i].targetFunction == targetFunction) { - JSEvents.deferredCalls.splice(i, 1); - --i; - } - } - }, canPerformEventHandlerRequests: function() { - return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls; - }, runDeferredCalls: function() { - if (!JSEvents.canPerformEventHandlerRequests()) { - return; - } - for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { - var call = JSEvents.deferredCalls[i]; - JSEvents.deferredCalls.splice(i, 1); - --i; - call.targetFunction.apply(null, call.argsList); - } - }, eventHandlers: [], removeAllHandlersOnTarget: function(target, eventTypeString) { - for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { - if (JSEvents.eventHandlers[i].target == target && (!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) { - JSEvents._removeHandler(i--); - } - } - }, _removeHandler: function(i) { - var h = JSEvents.eventHandlers[i]; - h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture); - JSEvents.eventHandlers.splice(i, 1); - }, registerOrRemoveHandler: function(eventHandler) { - var jsEventHandler = function jsEventHandler2(event) { - ++JSEvents.inEventHandler; - JSEvents.currentEventHandler = eventHandler; - JSEvents.runDeferredCalls(); - eventHandler.handlerFunc(event); - JSEvents.runDeferredCalls(); - --JSEvents.inEventHandler; - }; - if (eventHandler.callbackfunc) { - eventHandler.eventListenerFunc = jsEventHandler; - eventHandler.target.addEventListener(eventHandler.eventTypeString, jsEventHandler, eventHandler.useCapture); - JSEvents.eventHandlers.push(eventHandler); - JSEvents.registerRemoveEventListeners(); - } else { - for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { - if (JSEvents.eventHandlers[i].target == eventHandler.target && JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) { - JSEvents._removeHandler(i--); - } - } - } - }, queueEventHandlerOnThread_iiii: function(targetThread, eventHandlerFunc, eventTypeId, eventData, userData) { - var stackTop = stackSave(); - var varargs = stackAlloc(12); - GROWABLE_HEAP_I32()[varargs >> 2] = eventTypeId; - GROWABLE_HEAP_I32()[varargs + 4 >> 2] = eventData; - GROWABLE_HEAP_I32()[varargs + 8 >> 2] = userData; - __emscripten_call_on_thread(0, targetThread, 637534208, eventHandlerFunc, eventData, varargs); - stackRestore(stackTop); - }, getTargetThreadForEventCallback: function(targetThread) { - switch (targetThread) { - case 1: - return 0; - case 2: - return PThread.currentProxiedOperationCallerThread; - default: - return targetThread; - } - }, getNodeNameForTarget: function(target) { - if (!target) - return ""; - if (target == window) - return "#window"; - if (target == screen) - return "#screen"; - return target && target.nodeName ? target.nodeName : ""; - }, fullscreenEnabled: function() { - return document.fullscreenEnabled || document.webkitFullscreenEnabled; - } }; - function stringToNewUTF8(jsString) { - var length = lengthBytesUTF8(jsString) + 1; - var cString = _malloc(length); - stringToUTF8(jsString, cString, length); - return cString; - } - function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height) { - var stackTop = stackSave(); - var varargs = stackAlloc(12); - var targetCanvasPtr = 0; - if (targetCanvas) { - targetCanvasPtr = stringToNewUTF8(targetCanvas); - } - GROWABLE_HEAP_I32()[varargs >> 2] = targetCanvasPtr; - GROWABLE_HEAP_I32()[varargs + 4 >> 2] = width; - GROWABLE_HEAP_I32()[varargs + 8 >> 2] = height; - __emscripten_call_on_thread(0, targetThread, 657457152, 0, targetCanvasPtr, varargs); - stackRestore(stackTop); - } - function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, targetCanvas, width, height) { - targetCanvas = targetCanvas ? UTF8ToString(targetCanvas) : ""; - _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height); - } - function maybeCStringToJsString(cString) { - return cString > 2 ? UTF8ToString(cString) : cString; - } - var specialHTMLTargets = [0, typeof document !== "undefined" ? document : 0, typeof window !== "undefined" ? window : 0]; - function findEventTarget(target) { - target = maybeCStringToJsString(target); - var domElement = specialHTMLTargets[target] || (typeof document !== "undefined" ? document.querySelector(target) : void 0); - return domElement; - } - function findCanvasEventTarget(target) { - return findEventTarget(target); - } - function _emscripten_set_canvas_element_size_calling_thread(target, width, height) { - var canvas2 = findCanvasEventTarget(target); - if (!canvas2) - return -4; - if (canvas2.canvasSharedPtr) { - GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr >> 2] = width; - GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr + 4 >> 2] = height; - } - if (canvas2.offscreenCanvas || !canvas2.controlTransferredOffscreen) { - if (canvas2.offscreenCanvas) - canvas2 = canvas2.offscreenCanvas; - var autoResizeViewport = false; - if (canvas2.GLctxObject && canvas2.GLctxObject.GLctx) { - var prevViewport = canvas2.GLctxObject.GLctx.getParameter(2978); - autoResizeViewport = prevViewport[0] === 0 && prevViewport[1] === 0 && prevViewport[2] === canvas2.width && prevViewport[3] === canvas2.height; - } - canvas2.width = width; - canvas2.height = height; - if (autoResizeViewport) { - canvas2.GLctxObject.GLctx.viewport(0, 0, width, height); - } - } else if (canvas2.canvasSharedPtr) { - var targetThread = GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr + 8 >> 2]; - _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, target, width, height); - return 1; - } else { - return -4; - } - return 0; - } - function _emscripten_set_canvas_element_size_main_thread(target, width, height) { - if (ENVIRONMENT_IS_PTHREAD) - return _emscripten_proxy_to_main_thread_js(2, 1, target, width, height); - return _emscripten_set_canvas_element_size_calling_thread(target, width, height); - } - function _emscripten_set_canvas_element_size(target, width, height) { - var canvas2 = findCanvasEventTarget(target); - if (canvas2) { - return _emscripten_set_canvas_element_size_calling_thread(target, width, height); - } else { - return _emscripten_set_canvas_element_size_main_thread(target, width, height); - } - } - function _emscripten_set_current_thread_status(newStatus) { - } - function _emscripten_set_thread_name(threadId, name6) { - } - function __webgl_enable_ANGLE_instanced_arrays(ctx) { - var ext = ctx.getExtension("ANGLE_instanced_arrays"); - if (ext) { - ctx["vertexAttribDivisor"] = function(index, divisor) { - ext["vertexAttribDivisorANGLE"](index, divisor); - }; - ctx["drawArraysInstanced"] = function(mode, first, count22, primcount) { - ext["drawArraysInstancedANGLE"](mode, first, count22, primcount); - }; - ctx["drawElementsInstanced"] = function(mode, count22, type, indices, primcount) { - ext["drawElementsInstancedANGLE"](mode, count22, type, indices, primcount); - }; - return 1; - } - } - function __webgl_enable_OES_vertex_array_object(ctx) { - var ext = ctx.getExtension("OES_vertex_array_object"); - if (ext) { - ctx["createVertexArray"] = function() { - return ext["createVertexArrayOES"](); - }; - ctx["deleteVertexArray"] = function(vao) { - ext["deleteVertexArrayOES"](vao); - }; - ctx["bindVertexArray"] = function(vao) { - ext["bindVertexArrayOES"](vao); - }; - ctx["isVertexArray"] = function(vao) { - return ext["isVertexArrayOES"](vao); - }; - return 1; - } - } - function __webgl_enable_WEBGL_draw_buffers(ctx) { - var ext = ctx.getExtension("WEBGL_draw_buffers"); - if (ext) { - ctx["drawBuffers"] = function(n, bufs) { - ext["drawBuffersWEBGL"](n, bufs); - }; - return 1; - } - } - function __webgl_enable_WEBGL_multi_draw(ctx) { - return !!(ctx.multiDrawWebgl = ctx.getExtension("WEBGL_multi_draw")); - } - var GL = { counter: 1, buffers: [], programs: [], framebuffers: [], renderbuffers: [], textures: [], uniforms: [], shaders: [], vaos: [], contexts: {}, offscreenCanvases: {}, timerQueriesEXT: [], programInfos: {}, stringCache: {}, unpackAlignment: 4, recordError: function recordError(errorCode) { - if (!GL.lastError) { - GL.lastError = errorCode; - } - }, getNewId: function(table) { - var ret = GL.counter++; - for (var i = table.length; i < ret; i++) { - table[i] = null; - } - return ret; - }, getSource: function(shader, count22, string, length) { - var source = ""; - for (var i = 0; i < count22; ++i) { - var len = length ? GROWABLE_HEAP_I32()[length + i * 4 >> 2] : -1; - source += UTF8ToString(GROWABLE_HEAP_I32()[string + i * 4 >> 2], len < 0 ? void 0 : len); - } - return source; - }, createContext: function(canvas2, webGLContextAttributes) { - var ctx = canvas2.getContext("webgl", webGLContextAttributes); - if (!ctx) - return 0; - var handle = GL.registerContext(ctx, webGLContextAttributes); - return handle; - }, registerContext: function(ctx, webGLContextAttributes) { - var handle = _malloc(8); - GROWABLE_HEAP_I32()[handle + 4 >> 2] = _pthread_self(); - var context = { handle, attributes: webGLContextAttributes, version: webGLContextAttributes.majorVersion, GLctx: ctx }; - if (ctx.canvas) - ctx.canvas.GLctxObject = context; - GL.contexts[handle] = context; - if (typeof webGLContextAttributes.enableExtensionsByDefault === "undefined" || webGLContextAttributes.enableExtensionsByDefault) { - GL.initExtensions(context); - } - return handle; - }, makeContextCurrent: function(contextHandle) { - GL.currentContext = GL.contexts[contextHandle]; - Module.ctx = GLctx = GL.currentContext && GL.currentContext.GLctx; - return !(contextHandle && !GLctx); - }, getContext: function(contextHandle) { - return GL.contexts[contextHandle]; - }, deleteContext: function(contextHandle) { - if (GL.currentContext === GL.contexts[contextHandle]) - GL.currentContext = null; - if (typeof JSEvents === "object") - JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas); - if (GL.contexts[contextHandle] && GL.contexts[contextHandle].GLctx.canvas) - GL.contexts[contextHandle].GLctx.canvas.GLctxObject = void 0; - _free(GL.contexts[contextHandle].handle); - GL.contexts[contextHandle] = null; - }, initExtensions: function(context) { - if (!context) - context = GL.currentContext; - if (context.initExtensionsDone) - return; - context.initExtensionsDone = true; - var GLctx2 = context.GLctx; - __webgl_enable_ANGLE_instanced_arrays(GLctx2); - __webgl_enable_OES_vertex_array_object(GLctx2); - __webgl_enable_WEBGL_draw_buffers(GLctx2); - GLctx2.disjointTimerQueryExt = GLctx2.getExtension("EXT_disjoint_timer_query"); - __webgl_enable_WEBGL_multi_draw(GLctx2); - var exts = GLctx2.getSupportedExtensions() || []; - exts.forEach(function(ext) { - if (ext.indexOf("lose_context") < 0 && ext.indexOf("debug") < 0) { - GLctx2.getExtension(ext); - } - }); - }, populateUniformTable: function(program) { - var p2 = GL.programs[program]; - var ptable = GL.programInfos[program] = { uniforms: {}, maxUniformLength: 0, maxAttributeLength: -1, maxUniformBlockNameLength: -1 }; - var utable = ptable.uniforms; - var numUniforms = GLctx.getProgramParameter(p2, 35718); - for (var i = 0; i < numUniforms; ++i) { - var u = GLctx.getActiveUniform(p2, i); - var name6 = u.name; - ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name6.length + 1); - if (name6.slice(-1) == "]") { - name6 = name6.slice(0, name6.lastIndexOf("[")); - } - var loc = GLctx.getUniformLocation(p2, name6); - if (loc) { - var id = GL.getNewId(GL.uniforms); - utable[name6] = [u.size, id]; - GL.uniforms[id] = loc; - for (var j = 1; j < u.size; ++j) { - var n = name6 + "[" + j + "]"; - loc = GLctx.getUniformLocation(p2, n); - id = GL.getNewId(GL.uniforms); - GL.uniforms[id] = loc; - } - } - } - } }; - var __emscripten_webgl_power_preferences = ["default", "low-power", "high-performance"]; - function _emscripten_webgl_do_create_context(target, attributes) { - var a = attributes >> 2; - var powerPreference = GROWABLE_HEAP_I32()[a + (24 >> 2)]; - var contextAttributes = { "alpha": !!GROWABLE_HEAP_I32()[a + (0 >> 2)], "depth": !!GROWABLE_HEAP_I32()[a + (4 >> 2)], "stencil": !!GROWABLE_HEAP_I32()[a + (8 >> 2)], "antialias": !!GROWABLE_HEAP_I32()[a + (12 >> 2)], "premultipliedAlpha": !!GROWABLE_HEAP_I32()[a + (16 >> 2)], "preserveDrawingBuffer": !!GROWABLE_HEAP_I32()[a + (20 >> 2)], "powerPreference": __emscripten_webgl_power_preferences[powerPreference], "failIfMajorPerformanceCaveat": !!GROWABLE_HEAP_I32()[a + (28 >> 2)], majorVersion: GROWABLE_HEAP_I32()[a + (32 >> 2)], minorVersion: GROWABLE_HEAP_I32()[a + (36 >> 2)], enableExtensionsByDefault: GROWABLE_HEAP_I32()[a + (40 >> 2)], explicitSwapControl: GROWABLE_HEAP_I32()[a + (44 >> 2)], proxyContextToMainThread: GROWABLE_HEAP_I32()[a + (48 >> 2)], renderViaOffscreenBackBuffer: GROWABLE_HEAP_I32()[a + (52 >> 2)] }; - var canvas2 = findCanvasEventTarget(target); - if (!canvas2) { - return 0; - } - if (contextAttributes.explicitSwapControl) { - return 0; - } - var contextHandle = GL.createContext(canvas2, contextAttributes); - return contextHandle; - } - function _emscripten_webgl_create_context(a0, a12) { - return _emscripten_webgl_do_create_context(a0, a12); - } - var SYSCALLS = { mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { - var buffer3 = SYSCALLS.buffers[stream]; - if (curr === 0 || curr === 10) { - (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); - buffer3.length = 0; - } else { - buffer3.push(curr); - } - }, varargs: void 0, get: function() { - SYSCALLS.varargs += 4; - var ret = GROWABLE_HEAP_I32()[SYSCALLS.varargs - 4 >> 2]; - return ret; - }, getStr: function(ptr) { - var ret = UTF8ToString(ptr); - return ret; - }, get64: function(low, high) { - return low; - } }; - function _fd_close(fd) { - if (ENVIRONMENT_IS_PTHREAD) - return _emscripten_proxy_to_main_thread_js(3, 1, fd); - return 0; - } - function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - if (ENVIRONMENT_IS_PTHREAD) - return _emscripten_proxy_to_main_thread_js(4, 1, fd, offset_low, offset_high, whence, newOffset); - } - function _fd_write(fd, iov, iovcnt, pnum) { - if (ENVIRONMENT_IS_PTHREAD) - return _emscripten_proxy_to_main_thread_js(5, 1, fd, iov, iovcnt, pnum); - var num = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = GROWABLE_HEAP_I32()[iov + i * 8 >> 2]; - var len = GROWABLE_HEAP_I32()[iov + (i * 8 + 4) >> 2]; - for (var j = 0; j < len; j++) { - SYSCALLS.printChar(fd, GROWABLE_HEAP_U8()[ptr + j]); - } - num += len; - } - GROWABLE_HEAP_I32()[pnum >> 2] = num; - return 0; - } - function _pthread_cleanup_pop(execute2) { - var routine = PThread.threadExitHandlers.pop(); - if (execute2) - routine(); - } - function _pthread_cleanup_push(routine, arg) { - PThread.threadExitHandlers.push(function() { - wasmTable.get(routine)(arg); - }); - } - function spawnThread(threadParams) { - if (ENVIRONMENT_IS_PTHREAD) - throw "Internal Error! spawnThread() can only ever be called from main application thread!"; - var worker = PThread.getNewWorker(); - if (worker.pthread !== void 0) - throw "Internal error!"; - if (!threadParams.pthread_ptr) - throw "Internal error, no pthread ptr!"; - PThread.runningWorkers.push(worker); - var tlsMemory = _malloc(128 * 4); - for (var i = 0; i < 128; ++i) { - GROWABLE_HEAP_I32()[tlsMemory + i * 4 >> 2] = 0; - } - var stackHigh = threadParams.stackBase + threadParams.stackSize; - var pthread = PThread.pthreads[threadParams.pthread_ptr] = { worker, stackBase: threadParams.stackBase, stackSize: threadParams.stackSize, allocatedOwnStack: threadParams.allocatedOwnStack, threadInfoStruct: threadParams.pthread_ptr }; - var tis = pthread.threadInfoStruct >> 2; - Atomics.store(GROWABLE_HEAP_U32(), tis + (64 >> 2), threadParams.detached); - Atomics.store(GROWABLE_HEAP_U32(), tis + (100 >> 2), tlsMemory); - Atomics.store(GROWABLE_HEAP_U32(), tis + (40 >> 2), pthread.threadInfoStruct); - Atomics.store(GROWABLE_HEAP_U32(), tis + (80 >> 2), threadParams.stackSize); - Atomics.store(GROWABLE_HEAP_U32(), tis + (76 >> 2), stackHigh); - Atomics.store(GROWABLE_HEAP_U32(), tis + (104 >> 2), threadParams.stackSize); - Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 8 >> 2), stackHigh); - Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 12 >> 2), threadParams.detached); - var global_libc = _emscripten_get_global_libc(); - var global_locale = global_libc + 40; - Atomics.store(GROWABLE_HEAP_U32(), tis + (172 >> 2), global_locale); - worker.pthread = pthread; - var msg = { "cmd": "run", "start_routine": threadParams.startRoutine, "arg": threadParams.arg, "threadInfoStruct": threadParams.pthread_ptr, "stackBase": threadParams.stackBase, "stackSize": threadParams.stackSize }; - worker.runPthread = function() { - msg.time = performance.now(); - worker.postMessage(msg, threadParams.transferList); - }; - if (worker.loaded) { - worker.runPthread(); - delete worker.runPthread; - } - } - function _pthread_create(pthread_ptr, attr, start_routine, arg) { - if (typeof SharedArrayBuffer === "undefined") { - err("Current environment does not support SharedArrayBuffer, pthreads are not available!"); - return 6; - } - if (!pthread_ptr) { - err("pthread_create called with a null thread pointer!"); - return 28; - } - var transferList = []; - var error = 0; - if (ENVIRONMENT_IS_PTHREAD && (transferList.length === 0 || error)) { - return _emscripten_sync_run_in_main_thread_4(687865856, pthread_ptr, attr, start_routine, arg); - } - if (error) - return error; - var stackSize = 0; - var stackBase = 0; - var detached = 0; - if (attr && attr != -1) { - stackSize = GROWABLE_HEAP_I32()[attr >> 2]; - stackSize += 81920; - stackBase = GROWABLE_HEAP_I32()[attr + 8 >> 2]; - detached = GROWABLE_HEAP_I32()[attr + 12 >> 2] !== 0; - } else { - stackSize = 2097152; - } - var allocatedOwnStack = stackBase == 0; - if (allocatedOwnStack) { - stackBase = _memalign(16, stackSize); - } else { - stackBase -= stackSize; - assert3(stackBase > 0); - } - var threadInfoStruct = _malloc(228); - for (var i = 0; i < 228 >> 2; ++i) - GROWABLE_HEAP_U32()[(threadInfoStruct >> 2) + i] = 0; - GROWABLE_HEAP_I32()[pthread_ptr >> 2] = threadInfoStruct; - GROWABLE_HEAP_I32()[threadInfoStruct + 12 >> 2] = threadInfoStruct; - var headPtr = threadInfoStruct + 152; - GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; - var threadParams = { stackBase, stackSize, allocatedOwnStack, detached, startRoutine: start_routine, pthread_ptr: threadInfoStruct, arg, transferList }; - if (ENVIRONMENT_IS_PTHREAD) { - threadParams.cmd = "spawnThread"; - postMessage(threadParams, transferList); - } else { - spawnThread(threadParams); - } - return 0; - } - function _sysconf(name6) { - if (ENVIRONMENT_IS_PTHREAD) - return _emscripten_proxy_to_main_thread_js(6, 1, name6); - switch (name6) { - case 30: - return 16384; - case 85: - var maxHeapSize = 2147483648; - return maxHeapSize / 16384; - case 132: - case 133: - case 12: - case 137: - case 138: - case 15: - case 235: - case 16: - case 17: - case 18: - case 19: - case 20: - case 149: - case 13: - case 10: - case 236: - case 153: - case 9: - case 21: - case 22: - case 159: - case 154: - case 14: - case 77: - case 78: - case 139: - case 82: - case 68: - case 67: - case 164: - case 11: - case 29: - case 47: - case 48: - case 95: - case 52: - case 51: - case 46: - return 200809; - case 27: - case 246: - case 127: - case 128: - case 23: - case 24: - case 160: - case 161: - case 181: - case 182: - case 242: - case 183: - case 184: - case 243: - case 244: - case 245: - case 165: - case 178: - case 179: - case 49: - case 50: - case 168: - case 169: - case 175: - case 170: - case 171: - case 172: - case 97: - case 76: - case 32: - case 173: - case 35: - case 80: - case 81: - case 79: - return -1; - case 176: - case 177: - case 7: - case 155: - case 8: - case 157: - case 125: - case 126: - case 92: - case 93: - case 129: - case 130: - case 131: - case 94: - case 91: - return 1; - case 74: - case 60: - case 69: - case 70: - case 4: - return 1024; - case 31: - case 42: - case 72: - return 32; - case 87: - case 26: - case 33: - return 2147483647; - case 34: - case 1: - return 47839; - case 38: - case 36: - return 99; - case 43: - case 37: - return 2048; - case 0: - return 2097152; - case 3: - return 65536; - case 28: - return 32768; - case 44: - return 32767; - case 75: - return 16384; - case 39: - return 1e3; - case 89: - return 700; - case 71: - return 256; - case 40: - return 255; - case 2: - return 100; - case 180: - return 64; - case 25: - return 20; - case 5: - return 16; - case 6: - return 6; - case 73: - return 4; - case 84: { - if (typeof navigator === "object") - return navigator["hardwareConcurrency"] || 1; - return 1; - } - } - setErrNo(28); - return -1; - } - if (!ENVIRONMENT_IS_PTHREAD) - PThread.initMainThreadBlock(); - var GLctx; - var proxiedFunctionTable = [null, _atexit, _emscripten_set_canvas_element_size_main_thread, _fd_close, _fd_seek, _fd_write, _sysconf]; - var asmLibraryArg = { "e": ___assert_fail, "r": ___call_main, "x": __emscripten_notify_thread_queue, "b": _abort, "y": _emscripten_asm_const_int, "j": _emscripten_conditional_set_current_thread_status, "c": _emscripten_futex_wait, "d": _emscripten_futex_wake, "f": _emscripten_get_now, "p": _emscripten_memcpy_big, "z": _emscripten_num_logical_cores, "u": _emscripten_receive_on_main_thread_js, "q": _emscripten_resize_heap, "v": _emscripten_set_canvas_element_size, "i": _emscripten_set_current_thread_status, "t": _emscripten_set_thread_name, "w": _emscripten_webgl_create_context, "m": _fd_close, "n": _fd_seek, "g": _fd_write, "o": initPthreadsJS, "a": wasmMemory || Module["wasmMemory"], "k": _pthread_cleanup_pop, "l": _pthread_cleanup_push, "h": _pthread_create, "s": _sysconf }; - var asm = createWasm(); - var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { - return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["A"]).apply(null, arguments); - }; - var _init = Module["_init"] = function() { - return (_init = Module["_init"] = Module["asm"]["B"]).apply(null, arguments); - }; - var _register_tensor = Module["_register_tensor"] = function() { - return (_register_tensor = Module["_register_tensor"] = Module["asm"]["C"]).apply(null, arguments); - }; - var _dispose_data = Module["_dispose_data"] = function() { - return (_dispose_data = Module["_dispose_data"] = Module["asm"]["D"]).apply(null, arguments); - }; - var _dispose = Module["_dispose"] = function() { - return (_dispose = Module["_dispose"] = Module["asm"]["E"]).apply(null, arguments); - }; - var _Abs = Module["_Abs"] = function() { - return (_Abs = Module["_Abs"] = Module["asm"]["G"]).apply(null, arguments); - }; - var _Add = Module["_Add"] = function() { - return (_Add = Module["_Add"] = Module["asm"]["H"]).apply(null, arguments); - }; - var _AddN = Module["_AddN"] = function() { - return (_AddN = Module["_AddN"] = Module["asm"]["I"]).apply(null, arguments); - }; - var _All = Module["_All"] = function() { - return (_All = Module["_All"] = Module["asm"]["J"]).apply(null, arguments); - }; - var _Any = Module["_Any"] = function() { - return (_Any = Module["_Any"] = Module["asm"]["K"]).apply(null, arguments); - }; - var _ArgMax = Module["_ArgMax"] = function() { - return (_ArgMax = Module["_ArgMax"] = Module["asm"]["L"]).apply(null, arguments); - }; - var _AvgPool = Module["_AvgPool"] = function() { - return (_AvgPool = Module["_AvgPool"] = Module["asm"]["M"]).apply(null, arguments); - }; - var _BatchMatMul = Module["_BatchMatMul"] = function() { - return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["N"]).apply(null, arguments); - }; - var _Ceil = Module["_Ceil"] = function() { - return (_Ceil = Module["_Ceil"] = Module["asm"]["O"]).apply(null, arguments); - }; - var _ClipByValue = Module["_ClipByValue"] = function() { - return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["P"]).apply(null, arguments); - }; - var _Conv2D = Module["_Conv2D"] = function() { - return (_Conv2D = Module["_Conv2D"] = Module["asm"]["Q"]).apply(null, arguments); - }; - var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { - return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["R"]).apply(null, arguments); - }; - var _Cos = Module["_Cos"] = function() { - return (_Cos = Module["_Cos"] = Module["asm"]["S"]).apply(null, arguments); - }; - var _CropAndResize = Module["_CropAndResize"] = function() { - return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["T"]).apply(null, arguments); - }; - var _Cumsum = Module["_Cumsum"] = function() { - return (_Cumsum = Module["_Cumsum"] = Module["asm"]["U"]).apply(null, arguments); - }; - var _DepthToSpace = Module["_DepthToSpace"] = function() { - return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["V"]).apply(null, arguments); - }; - var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { - return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["W"]).apply(null, arguments); - }; - var _Equal = Module["_Equal"] = function() { - return (_Equal = Module["_Equal"] = Module["asm"]["X"]).apply(null, arguments); - }; - var _Exp = Module["_Exp"] = function() { - return (_Exp = Module["_Exp"] = Module["asm"]["Y"]).apply(null, arguments); - }; - var _FlipLeftRight = Module["_FlipLeftRight"] = function() { - return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["Z"]).apply(null, arguments); - }; - var _Floor = Module["_Floor"] = function() { - return (_Floor = Module["_Floor"] = Module["asm"]["_"]).apply(null, arguments); - }; - var _FloorDiv = Module["_FloorDiv"] = function() { - return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["$"]).apply(null, arguments); - }; - var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { - return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["aa"]).apply(null, arguments); - }; - var _FusedConv2D = Module["_FusedConv2D"] = function() { - return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["ba"]).apply(null, arguments); - }; - var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { - return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["ca"]).apply(null, arguments); - }; - var _Gather = Module["_Gather"] = function() { - return (_Gather = Module["_Gather"] = Module["asm"]["da"]).apply(null, arguments); - }; - var _GatherNd = Module["_GatherNd"] = function() { - return (_GatherNd = Module["_GatherNd"] = Module["asm"]["ea"]).apply(null, arguments); - }; - var _Greater = Module["_Greater"] = function() { - return (_Greater = Module["_Greater"] = Module["asm"]["fa"]).apply(null, arguments); - }; - var _GreaterEqual = Module["_GreaterEqual"] = function() { - return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["ga"]).apply(null, arguments); - }; - var _LeakyRelu = Module["_LeakyRelu"] = function() { - return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["ha"]).apply(null, arguments); - }; - var _Less = Module["_Less"] = function() { - return (_Less = Module["_Less"] = Module["asm"]["ia"]).apply(null, arguments); - }; - var _LessEqual = Module["_LessEqual"] = function() { - return (_LessEqual = Module["_LessEqual"] = Module["asm"]["ja"]).apply(null, arguments); - }; - var _Log = Module["_Log"] = function() { - return (_Log = Module["_Log"] = Module["asm"]["ka"]).apply(null, arguments); - }; - var _LogicalAnd = Module["_LogicalAnd"] = function() { - return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["la"]).apply(null, arguments); - }; - var _Max = Module["_Max"] = function() { - return (_Max = Module["_Max"] = Module["asm"]["ma"]).apply(null, arguments); - }; - var _MaxPool = Module["_MaxPool"] = function() { - return (_MaxPool = Module["_MaxPool"] = Module["asm"]["na"]).apply(null, arguments); - }; - var _Maximum = Module["_Maximum"] = function() { - return (_Maximum = Module["_Maximum"] = Module["asm"]["oa"]).apply(null, arguments); - }; - var _Mean = Module["_Mean"] = function() { - return (_Mean = Module["_Mean"] = Module["asm"]["pa"]).apply(null, arguments); - }; - var _Min = Module["_Min"] = function() { - return (_Min = Module["_Min"] = Module["asm"]["qa"]).apply(null, arguments); - }; - var _Minimum = Module["_Minimum"] = function() { - return (_Minimum = Module["_Minimum"] = Module["asm"]["ra"]).apply(null, arguments); - }; - var _MirrorPad = Module["_MirrorPad"] = function() { - return (_MirrorPad = Module["_MirrorPad"] = Module["asm"]["sa"]).apply(null, arguments); - }; - var _Multiply = Module["_Multiply"] = function() { - return (_Multiply = Module["_Multiply"] = Module["asm"]["ta"]).apply(null, arguments); - }; - var _Neg = Module["_Neg"] = function() { - return (_Neg = Module["_Neg"] = Module["asm"]["ua"]).apply(null, arguments); - }; - var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { - return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["va"]).apply(null, arguments); - }; - var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { - return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["wa"]).apply(null, arguments); - }; - var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { - return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["xa"]).apply(null, arguments); - }; - var _NotEqual = Module["_NotEqual"] = function() { - return (_NotEqual = Module["_NotEqual"] = Module["asm"]["ya"]).apply(null, arguments); - }; - var _OneHot = Module["_OneHot"] = function() { - return (_OneHot = Module["_OneHot"] = Module["asm"]["za"]).apply(null, arguments); - }; - var _PadV2 = Module["_PadV2"] = function() { - return (_PadV2 = Module["_PadV2"] = Module["asm"]["Aa"]).apply(null, arguments); - }; - var _Pow = Module["_Pow"] = function() { - return (_Pow = Module["_Pow"] = Module["asm"]["Ba"]).apply(null, arguments); - }; - var _Prelu = Module["_Prelu"] = function() { - return (_Prelu = Module["_Prelu"] = Module["asm"]["Ca"]).apply(null, arguments); - }; - var _Prod = Module["_Prod"] = function() { - return (_Prod = Module["_Prod"] = Module["asm"]["Da"]).apply(null, arguments); - }; - var _RealDiv = Module["_RealDiv"] = function() { - return (_RealDiv = Module["_RealDiv"] = Module["asm"]["Ea"]).apply(null, arguments); - }; - var _Relu = Module["_Relu"] = function() { - return (_Relu = Module["_Relu"] = Module["asm"]["Fa"]).apply(null, arguments); - }; - var _Relu6 = Module["_Relu6"] = function() { - return (_Relu6 = Module["_Relu6"] = Module["asm"]["Ga"]).apply(null, arguments); - }; - var _ResizeBilinear = Module["_ResizeBilinear"] = function() { - return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["Ha"]).apply(null, arguments); - }; - var _Reverse = Module["_Reverse"] = function() { - return (_Reverse = Module["_Reverse"] = Module["asm"]["Ia"]).apply(null, arguments); - }; - var _RotateWithOffset = Module["_RotateWithOffset"] = function() { - return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["Ja"]).apply(null, arguments); - }; - var _Round = Module["_Round"] = function() { - return (_Round = Module["_Round"] = Module["asm"]["Ka"]).apply(null, arguments); - }; - var _Rsqrt = Module["_Rsqrt"] = function() { - return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["La"]).apply(null, arguments); - }; - var _ScatterNd = Module["_ScatterNd"] = function() { - return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["Ma"]).apply(null, arguments); - }; - var _SelectV2 = Module["_SelectV2"] = function() { - return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["Na"]).apply(null, arguments); - }; - var _Sigmoid = Module["_Sigmoid"] = function() { - return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["Oa"]).apply(null, arguments); - }; - var _Sin = Module["_Sin"] = function() { - return (_Sin = Module["_Sin"] = Module["asm"]["Pa"]).apply(null, arguments); - }; - var _Softmax = Module["_Softmax"] = function() { - return (_Softmax = Module["_Softmax"] = Module["asm"]["Qa"]).apply(null, arguments); - }; - var _Sqrt = Module["_Sqrt"] = function() { - return (_Sqrt = Module["_Sqrt"] = Module["asm"]["Ra"]).apply(null, arguments); - }; - var _Square = Module["_Square"] = function() { - return (_Square = Module["_Square"] = Module["asm"]["Sa"]).apply(null, arguments); - }; - var _SquaredDifference = Module["_SquaredDifference"] = function() { - return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["Ta"]).apply(null, arguments); - }; - var _Step = Module["_Step"] = function() { - return (_Step = Module["_Step"] = Module["asm"]["Ua"]).apply(null, arguments); - }; - var _StridedSlice = Module["_StridedSlice"] = function() { - return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["Va"]).apply(null, arguments); - }; - var _Sub = Module["_Sub"] = function() { - return (_Sub = Module["_Sub"] = Module["asm"]["Wa"]).apply(null, arguments); - }; - var _Sum = Module["_Sum"] = function() { - return (_Sum = Module["_Sum"] = Module["asm"]["Xa"]).apply(null, arguments); - }; - var _Tan = Module["_Tan"] = function() { - return (_Tan = Module["_Tan"] = Module["asm"]["Ya"]).apply(null, arguments); - }; - var _Tanh = Module["_Tanh"] = function() { - return (_Tanh = Module["_Tanh"] = Module["asm"]["Za"]).apply(null, arguments); - }; - var _Tile = Module["_Tile"] = function() { - return (_Tile = Module["_Tile"] = Module["asm"]["_a"]).apply(null, arguments); - }; - var _TopK = Module["_TopK"] = function() { - return (_TopK = Module["_TopK"] = Module["asm"]["$a"]).apply(null, arguments); - }; - var _Transform = Module["_Transform"] = function() { - return (_Transform = Module["_Transform"] = Module["asm"]["ab"]).apply(null, arguments); - }; - var _Transpose = Module["_Transpose"] = function() { - return (_Transpose = Module["_Transpose"] = Module["asm"]["bb"]).apply(null, arguments); - }; - var __FusedMatMul = Module["__FusedMatMul"] = function() { - return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["cb"]).apply(null, arguments); - }; - var _malloc = Module["_malloc"] = function() { - return (_malloc = Module["_malloc"] = Module["asm"]["db"]).apply(null, arguments); - }; - var _free = Module["_free"] = function() { - return (_free = Module["_free"] = Module["asm"]["eb"]).apply(null, arguments); - }; - var ___errno_location = Module["___errno_location"] = function() { - return (___errno_location = Module["___errno_location"] = Module["asm"]["fb"]).apply(null, arguments); - }; - var _emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = function() { - return (_emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = Module["asm"]["gb"]).apply(null, arguments); - }; - var _pthread_self = Module["_pthread_self"] = function() { - return (_pthread_self = Module["_pthread_self"] = Module["asm"]["hb"]).apply(null, arguments); - }; - var ___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = function() { - return (___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = Module["asm"]["ib"]).apply(null, arguments); - }; - var _emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = function() { - return (_emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = Module["asm"]["jb"]).apply(null, arguments); - }; - var _emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = function() { - return (_emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = Module["asm"]["kb"]).apply(null, arguments); - }; - var _emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = function() { - return (_emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = Module["asm"]["lb"]).apply(null, arguments); - }; - var __emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = function() { - return (__emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = Module["asm"]["mb"]).apply(null, arguments); - }; - var _emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = function() { - return (_emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = Module["asm"]["nb"]).apply(null, arguments); - }; - var _emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = function() { - return (_emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = Module["asm"]["ob"]).apply(null, arguments); - }; - var __emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = function() { - return (__emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = Module["asm"]["pb"]).apply(null, arguments); - }; - var _emscripten_tls_init = Module["_emscripten_tls_init"] = function() { - return (_emscripten_tls_init = Module["_emscripten_tls_init"] = Module["asm"]["qb"]).apply(null, arguments); - }; - var __emscripten_thread_init = Module["__emscripten_thread_init"] = function() { - return (__emscripten_thread_init = Module["__emscripten_thread_init"] = Module["asm"]["rb"]).apply(null, arguments); - }; - var stackSave = Module["stackSave"] = function() { - return (stackSave = Module["stackSave"] = Module["asm"]["sb"]).apply(null, arguments); - }; - var stackRestore = Module["stackRestore"] = function() { - return (stackRestore = Module["stackRestore"] = Module["asm"]["tb"]).apply(null, arguments); - }; - var stackAlloc = Module["stackAlloc"] = function() { - return (stackAlloc = Module["stackAlloc"] = Module["asm"]["ub"]).apply(null, arguments); - }; - var _emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = function() { - return (_emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = Module["asm"]["vb"]).apply(null, arguments); - }; - var _memalign = Module["_memalign"] = function() { - return (_memalign = Module["_memalign"] = Module["asm"]["wb"]).apply(null, arguments); - }; - var __emscripten_allow_main_runtime_queued_calls = Module["__emscripten_allow_main_runtime_queued_calls"] = 9808; - var __emscripten_main_thread_futex = Module["__emscripten_main_thread_futex"] = 11432; - Module["cwrap"] = cwrap; - Module["PThread"] = PThread; - Module["PThread"] = PThread; - Module["wasmMemory"] = wasmMemory; - Module["ExitStatus"] = ExitStatus; - var calledRun; - function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - dependenciesFulfilled = function runCaller() { - if (!calledRun) - run(); - if (!calledRun) - dependenciesFulfilled = runCaller; - }; - function run(args) { - args = args || arguments_; - if (runDependencies > 0) { - return; - } - if (ENVIRONMENT_IS_PTHREAD) { - readyPromiseResolve(Module); - initRuntime(); - postMessage({ "cmd": "loaded" }); - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) - return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) - return; - initRuntime(); - preMain(); - readyPromiseResolve(Module); - if (Module["onRuntimeInitialized"]) - Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } - } - Module["run"] = run; - function exit(status, implicit) { - if (implicit && noExitRuntime && status === 0) { - return; - } - if (!implicit) { - if (ENVIRONMENT_IS_PTHREAD) { - postMessage({ "cmd": "exitProcess", "returnCode": status }); - throw new ExitStatus(status); - } else { - } - } - if (noExitRuntime) { - } else { - PThread.terminateAllThreads(); - EXITSTATUS = status; - exitRuntime(); - if (Module["onExit"]) - Module["onExit"](status); - ABORT = true; - } - quit_(status, new ExitStatus(status)); - } - if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") - Module["preInit"] = [Module["preInit"]]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } - } - if (ENVIRONMENT_IS_PTHREAD) { - noExitRuntime = false; - PThread.initWorker(); - } - run(); - return WasmBackendModuleThreadedSimd2.ready; - }; - }(); - if (typeof exports === "object" && typeof module6 === "object") - module6.exports = WasmBackendModuleThreadedSimd; - else if (typeof define === "function" && define["amd"]) - define([], function() { - return WasmBackendModuleThreadedSimd; - }); - else if (typeof exports === "object") - exports["WasmBackendModuleThreadedSimd"] = WasmBackendModuleThreadedSimd; - } -}); -var require_tfjs_backend_wasm = __commonJS({ - "node_modules/.pnpm/@tensorflow+tfjs-backend-wasm@3.6.0_@tensorflow+tfjs-core@3.6.0/node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js"(exports, module6) { - var WasmBackendModule = function() { - var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; - if (typeof __filename !== "undefined") - _scriptDir = _scriptDir || __filename; - return function(WasmBackendModule2) { - WasmBackendModule2 = WasmBackendModule2 || {}; - var Module = typeof WasmBackendModule2 !== "undefined" ? WasmBackendModule2 : {}; - var readyPromiseResolve, readyPromiseReject; - Module["ready"] = new Promise(function(resolve, reject) { - readyPromiseResolve = resolve; - readyPromiseReject = reject; - }); - var moduleOverrides = {}; - var key; - for (key in Module) { - if (Module.hasOwnProperty(key)) { - moduleOverrides[key] = Module[key]; - } - } - var arguments_ = []; - var thisProgram = "./this.program"; - var quit_ = function(status, toThrow) { - throw toThrow; - }; - var ENVIRONMENT_IS_WEB = false; - var ENVIRONMENT_IS_WORKER = false; - var ENVIRONMENT_IS_NODE = false; - var ENVIRONMENT_IS_SHELL = false; - ENVIRONMENT_IS_WEB = typeof window === "object"; - ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; - ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; - ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; - var scriptDirectory = ""; - function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; - } - var read_, readAsync, readBinary, setWindowTitle; - var nodeFS; - var nodePath; - if (ENVIRONMENT_IS_NODE) { - if (ENVIRONMENT_IS_WORKER) { - scriptDirectory = require_path().dirname(scriptDirectory) + "/"; - } else { - scriptDirectory = __dirname + "/"; - } - read_ = function shell_read(filename, binary) { - if (!nodeFS) - nodeFS = __require2("fs"); - if (!nodePath) - nodePath = require_path(); - filename = nodePath["normalize"](filename); - return nodeFS["readFileSync"](filename, binary ? null : "utf8"); - }; - readBinary = function readBinary2(filename) { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - assert3(ret.buffer); - return ret; - }; - if (process["argv"].length > 1) { - thisProgram = process["argv"][1].replace(/\\/g, "/"); - } - arguments_ = process["argv"].slice(2); - process["on"]("uncaughtException", function(ex) { - if (!(ex instanceof ExitStatus)) { - throw ex; - } - }); - process["on"]("unhandledRejection", abort); - quit_ = function(status) { - process["exit"](status); - }; - Module["inspect"] = function() { - return "[Emscripten Module object]"; - }; - } else if (ENVIRONMENT_IS_SHELL) { - if (typeof read != "undefined") { - read_ = function shell_read(f) { - return read(f); - }; - } - readBinary = function readBinary2(f) { - var data; - if (typeof readbuffer === "function") { - return new Uint8Array(readbuffer(f)); - } - data = read(f, "binary"); - assert3(typeof data === "object"); - return data; - }; - if (typeof scriptArgs != "undefined") { - arguments_ = scriptArgs; - } else if (typeof arguments != "undefined") { - arguments_ = arguments; - } - if (typeof quit === "function") { - quit_ = function(status) { - quit(status); - }; - } - if (typeof print !== "undefined") { - if (typeof console === "undefined") - console = {}; - console.log = print; - console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; - } - } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { - if (ENVIRONMENT_IS_WORKER) { - scriptDirectory = self.location.href; - } else if (typeof document !== "undefined" && document.currentScript) { - scriptDirectory = document.currentScript.src; - } - if (_scriptDir) { - scriptDirectory = _scriptDir; - } - if (scriptDirectory.indexOf("blob:") !== 0) { - scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); - } else { - scriptDirectory = ""; - } - { - read_ = function(url) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, false); - xhr.send(null); - return xhr.responseText; - }; - if (ENVIRONMENT_IS_WORKER) { - readBinary = function(url) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, false); - xhr.responseType = "arraybuffer"; - xhr.send(null); - return new Uint8Array(xhr.response); - }; - } - readAsync = function(url, onload, onerror) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, true); - xhr.responseType = "arraybuffer"; - xhr.onload = function() { - if (xhr.status == 200 || xhr.status == 0 && xhr.response) { - onload(xhr.response); - return; - } - onerror(); - }; - xhr.onerror = onerror; - xhr.send(null); - }; - } - setWindowTitle = function(title) { - document.title = title; - }; - } else { - } - var out = Module["print"] || console.log.bind(console); - var err = Module["printErr"] || console.warn.bind(console); - for (key in moduleOverrides) { - if (moduleOverrides.hasOwnProperty(key)) { - Module[key] = moduleOverrides[key]; - } - } - moduleOverrides = null; - if (Module["arguments"]) - arguments_ = Module["arguments"]; - if (Module["thisProgram"]) - thisProgram = Module["thisProgram"]; - if (Module["quit"]) - quit_ = Module["quit"]; - var wasmBinary; - if (Module["wasmBinary"]) - wasmBinary = Module["wasmBinary"]; - var noExitRuntime = Module["noExitRuntime"] || true; - if (typeof WebAssembly !== "object") { - abort("no native wasm support detected"); - } - var wasmMemory; - var ABORT = false; - var EXITSTATUS; - function assert3(condition, text) { - if (!condition) { - abort("Assertion failed: " + text); - } - } - function getCFunc(ident) { - var func2 = Module["_" + ident]; - assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); - return func2; - } - function ccall(ident, returnType, argTypes, args, opts) { - var toC = { "string": function(str) { - var ret2 = 0; - if (str !== null && str !== void 0 && str !== 0) { - var len = (str.length << 2) + 1; - ret2 = stackAlloc(len); - stringToUTF8(str, ret2, len); - } - return ret2; - }, "array": function(arr) { - var ret2 = stackAlloc(arr.length); - writeArrayToMemory(arr, ret2); - return ret2; - } }; - function convertReturnValue(ret2) { - if (returnType === "string") - return UTF8ToString(ret2); - if (returnType === "boolean") - return Boolean(ret2); - return ret2; - } - var func2 = getCFunc(ident); - var cArgs = []; - var stack2 = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack2 === 0) - stack2 = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func2.apply(null, cArgs); - ret = convertReturnValue(ret); - if (stack2 !== 0) - stackRestore(stack2); - return ret; - } - function cwrap(ident, returnType, argTypes, opts) { - argTypes = argTypes || []; - var numericArgs = argTypes.every(function(type) { - return type === "number"; - }); - var numericRet = returnType !== "string"; - if (numericRet && numericArgs && !opts) { - return getCFunc(ident); - } - return function() { - return ccall(ident, returnType, argTypes, arguments, opts); - }; - } - var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : void 0; - function UTF8ArrayToString(heap, idx, maxBytesToRead) { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heap[endPtr] && !(endPtr >= endIdx)) - ++endPtr; - if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { - return UTF8Decoder.decode(heap.subarray(idx, endPtr)); - } else { - var str = ""; - while (idx < endPtr) { - var u0 = heap[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heap[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode((u0 & 31) << 6 | u1); - continue; - } - var u2 = heap[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = (u0 & 15) << 12 | u1 << 6 | u2; - } else { - u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); - } - } - } - return str; - } - function UTF8ToString(ptr, maxBytesToRead) { - return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - } - function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { - if (!(maxBytesToWrite > 0)) - return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | u1 & 1023; - } - if (u <= 127) { - if (outIdx >= endIdx) - break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) - break; - heap[outIdx++] = 192 | u >> 6; - heap[outIdx++] = 128 | u & 63; - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) - break; - heap[outIdx++] = 224 | u >> 12; - heap[outIdx++] = 128 | u >> 6 & 63; - heap[outIdx++] = 128 | u & 63; - } else { - if (outIdx + 3 >= endIdx) - break; - heap[outIdx++] = 240 | u >> 18; - heap[outIdx++] = 128 | u >> 12 & 63; - heap[outIdx++] = 128 | u >> 6 & 63; - heap[outIdx++] = 128 | u & 63; - } - } - heap[outIdx] = 0; - return outIdx - startIdx; - } - function stringToUTF8(str, outPtr, maxBytesToWrite) { - return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - } - function writeArrayToMemory(array2, buffer3) { - HEAP8.set(array2, buffer3); - } - function alignUp(x, multiple) { - if (x % multiple > 0) { - x += multiple - x % multiple; - } - return x; - } - var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; - function updateGlobalBufferAndViews(buf) { - buffer2 = buf; - Module["HEAP8"] = HEAP8 = new Int8Array(buf); - Module["HEAP16"] = HEAP16 = new Int16Array(buf); - Module["HEAP32"] = HEAP32 = new Int32Array(buf); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); - Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); - Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); - Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); - Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); - } - var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; - var wasmTable; - var __ATPRERUN__ = []; - var __ATINIT__ = []; - var __ATMAIN__ = []; - var __ATPOSTRUN__ = []; - var runtimeInitialized = false; - __ATINIT__.push({ func: function() { - ___wasm_call_ctors(); - } }); - function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") - Module["preRun"] = [Module["preRun"]]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); - } - function initRuntime() { - runtimeInitialized = true; - callRuntimeCallbacks(__ATINIT__); - } - function preMain() { - callRuntimeCallbacks(__ATMAIN__); - } - function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") - Module["postRun"] = [Module["postRun"]]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); - } - function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); - } - function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); - } - var runDependencies = 0; - var runDependencyWatcher = null; - var dependenciesFulfilled = null; - function addRunDependency(id) { - runDependencies++; - if (Module["monitorRunDependencies"]) { - Module["monitorRunDependencies"](runDependencies); - } - } - function removeRunDependency(id) { - runDependencies--; - if (Module["monitorRunDependencies"]) { - Module["monitorRunDependencies"](runDependencies); - } - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } - } - Module["preloadedImages"] = {}; - Module["preloadedAudios"] = {}; - function abort(what) { - if (Module["onAbort"]) { - Module["onAbort"](what); - } - what += ""; - err(what); - ABORT = true; - EXITSTATUS = 1; - what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; - var e = new WebAssembly.RuntimeError(what); - readyPromiseReject(e); - throw e; - } - function hasPrefix(str, prefix) { - return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; - } - var dataURIPrefix = "data:application/octet-stream;base64,"; - function isDataURI(filename) { - return hasPrefix(filename, dataURIPrefix); - } - var fileURIPrefix = "file://"; - function isFileURI(filename) { - return hasPrefix(filename, fileURIPrefix); - } - var wasmBinaryFile = "tfjs-backend-wasm.wasm"; - if (!isDataURI(wasmBinaryFile)) { - wasmBinaryFile = locateFile(wasmBinaryFile); - } - function getBinary(file) { - try { - if (file == wasmBinaryFile && wasmBinary) { - return new Uint8Array(wasmBinary); - } - if (readBinary) { - return readBinary(file); - } else { - throw "both async and sync fetching of the wasm failed"; - } - } catch (err2) { - abort(err2); - } - } - function getBinaryPromise() { - if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { - if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { - return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(function(response) { - if (!response["ok"]) { - throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; - } - return response["arrayBuffer"](); - }).catch(function() { - return getBinary(wasmBinaryFile); - }); - } else { - if (readAsync) { - return new Promise(function(resolve, reject) { - readAsync(wasmBinaryFile, function(response) { - resolve(new Uint8Array(response)); - }, reject); - }); - } - } - } - return Promise.resolve().then(function() { - return getBinary(wasmBinaryFile); - }); - } - function createWasm() { - var info2 = { "a": asmLibraryArg }; - function receiveInstance(instance, module7) { - var exports3 = instance.exports; - Module["asm"] = exports3; - wasmMemory = Module["asm"]["i"]; - updateGlobalBufferAndViews(wasmMemory.buffer); - wasmTable = Module["asm"]["o"]; - removeRunDependency("wasm-instantiate"); - } - addRunDependency("wasm-instantiate"); - function receiveInstantiatedSource(output) { - receiveInstance(output["instance"]); - } - function instantiateArrayBuffer(receiver) { - return getBinaryPromise().then(function(binary) { - return WebAssembly.instantiate(binary, info2); - }).then(receiver, function(reason) { - err("failed to asynchronously prepare wasm: " + reason); - abort(reason); - }); - } - function instantiateAsync() { - if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { - return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(function(response) { - var result = WebAssembly.instantiateStreaming(response, info2); - return result.then(receiveInstantiatedSource, function(reason) { - err("wasm streaming compile failed: " + reason); - err("falling back to ArrayBuffer instantiation"); - return instantiateArrayBuffer(receiveInstantiatedSource); - }); - }); - } else { - return instantiateArrayBuffer(receiveInstantiatedSource); - } - } - if (Module["instantiateWasm"]) { - try { - var exports2 = Module["instantiateWasm"](info2, receiveInstance); - return exports2; - } catch (e) { - err("Module.instantiateWasm callback failed with error: " + e); - return false; - } - } - instantiateAsync().catch(readyPromiseReject); - return {}; - } - function callRuntimeCallbacks(callbacks2) { - while (callbacks2.length > 0) { - var callback = callbacks2.shift(); - if (typeof callback == "function") { - callback(Module); - continue; - } - var func2 = callback.func; - if (typeof func2 === "number") { - if (callback.arg === void 0) { - wasmTable.get(func2)(); - } else { - wasmTable.get(func2)(callback.arg); - } - } else { - func2(callback.arg === void 0 ? null : callback.arg); - } - } - } - function _abort() { - abort(); - } - function _emscripten_memcpy_big(dest, src, num) { - HEAPU8.copyWithin(dest, src, src + num); - } - function _emscripten_get_heap_size() { - return HEAPU8.length; - } - function emscripten_realloc_buffer(size) { - try { - wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); - updateGlobalBufferAndViews(wasmMemory.buffer); - return 1; - } catch (e) { - } - } - function _emscripten_resize_heap(requestedSize) { - var oldSize = _emscripten_get_heap_size(); - var maxHeapSize = 2147483648; - if (requestedSize > maxHeapSize) { - return false; - } - for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { - var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); - overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); - var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); - var replacement = emscripten_realloc_buffer(newSize); - if (replacement) { - return true; - } - } - return false; - } - var SYSCALLS = { mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { - var buffer3 = SYSCALLS.buffers[stream]; - if (curr === 0 || curr === 10) { - (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); - buffer3.length = 0; - } else { - buffer3.push(curr); - } - }, varargs: void 0, get: function() { - SYSCALLS.varargs += 4; - var ret = HEAP32[SYSCALLS.varargs - 4 >> 2]; - return ret; - }, getStr: function(ptr) { - var ret = UTF8ToString(ptr); - return ret; - }, get64: function(low, high) { - return low; - } }; - function _fd_close(fd) { - return 0; - } - function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - } - function _fd_write(fd, iov, iovcnt, pnum) { - var num = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAP32[iov + i * 8 >> 2]; - var len = HEAP32[iov + (i * 8 + 4) >> 2]; - for (var j = 0; j < len; j++) { - SYSCALLS.printChar(fd, HEAPU8[ptr + j]); - } - num += len; - } - HEAP32[pnum >> 2] = num; - return 0; - } - function _pthread_create() { - return 6; - } - function setErrNo(value) { - HEAP32[___errno_location() >> 2] = value; - return value; - } - function _sysconf(name6) { - switch (name6) { - case 30: - return 16384; - case 85: - var maxHeapSize = 2147483648; - return maxHeapSize / 16384; - case 132: - case 133: - case 12: - case 137: - case 138: - case 15: - case 235: - case 16: - case 17: - case 18: - case 19: - case 20: - case 149: - case 13: - case 10: - case 236: - case 153: - case 9: - case 21: - case 22: - case 159: - case 154: - case 14: - case 77: - case 78: - case 139: - case 82: - case 68: - case 67: - case 164: - case 11: - case 29: - case 47: - case 48: - case 95: - case 52: - case 51: - case 46: - return 200809; - case 27: - case 246: - case 127: - case 128: - case 23: - case 24: - case 160: - case 161: - case 181: - case 182: - case 242: - case 183: - case 184: - case 243: - case 244: - case 245: - case 165: - case 178: - case 179: - case 49: - case 50: - case 168: - case 169: - case 175: - case 170: - case 171: - case 172: - case 97: - case 76: - case 32: - case 173: - case 35: - case 80: - case 81: - case 79: - return -1; - case 176: - case 177: - case 7: - case 155: - case 8: - case 157: - case 125: - case 126: - case 92: - case 93: - case 129: - case 130: - case 131: - case 94: - case 91: - return 1; - case 74: - case 60: - case 69: - case 70: - case 4: - return 1024; - case 31: - case 42: - case 72: - return 32; - case 87: - case 26: - case 33: - return 2147483647; - case 34: - case 1: - return 47839; - case 38: - case 36: - return 99; - case 43: - case 37: - return 2048; - case 0: - return 2097152; - case 3: - return 65536; - case 28: - return 32768; - case 44: - return 32767; - case 75: - return 16384; - case 39: - return 1e3; - case 89: - return 700; - case 71: - return 256; - case 40: - return 255; - case 2: - return 100; - case 180: - return 64; - case 25: - return 20; - case 5: - return 16; - case 6: - return 6; - case 73: - return 4; - case 84: { - if (typeof navigator === "object") - return navigator["hardwareConcurrency"] || 1; - return 1; - } - } - setErrNo(28); - return -1; - } - var asmLibraryArg = { "a": _abort, "d": _emscripten_memcpy_big, "e": _emscripten_resize_heap, "f": _fd_close, "c": _fd_seek, "b": _fd_write, "g": _pthread_create, "h": _sysconf }; - var asm = createWasm(); - var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { - return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["j"]).apply(null, arguments); - }; - var _init = Module["_init"] = function() { - return (_init = Module["_init"] = Module["asm"]["k"]).apply(null, arguments); - }; - var _register_tensor = Module["_register_tensor"] = function() { - return (_register_tensor = Module["_register_tensor"] = Module["asm"]["l"]).apply(null, arguments); - }; - var _dispose_data = Module["_dispose_data"] = function() { - return (_dispose_data = Module["_dispose_data"] = Module["asm"]["m"]).apply(null, arguments); - }; - var _dispose = Module["_dispose"] = function() { - return (_dispose = Module["_dispose"] = Module["asm"]["n"]).apply(null, arguments); - }; - var _Abs = Module["_Abs"] = function() { - return (_Abs = Module["_Abs"] = Module["asm"]["p"]).apply(null, arguments); - }; - var _Add = Module["_Add"] = function() { - return (_Add = Module["_Add"] = Module["asm"]["q"]).apply(null, arguments); - }; - var _AddN = Module["_AddN"] = function() { - return (_AddN = Module["_AddN"] = Module["asm"]["r"]).apply(null, arguments); - }; - var _All = Module["_All"] = function() { - return (_All = Module["_All"] = Module["asm"]["s"]).apply(null, arguments); - }; - var _Any = Module["_Any"] = function() { - return (_Any = Module["_Any"] = Module["asm"]["t"]).apply(null, arguments); - }; - var _ArgMax = Module["_ArgMax"] = function() { - return (_ArgMax = Module["_ArgMax"] = Module["asm"]["u"]).apply(null, arguments); - }; - var _AvgPool = Module["_AvgPool"] = function() { - return (_AvgPool = Module["_AvgPool"] = Module["asm"]["v"]).apply(null, arguments); - }; - var _BatchMatMul = Module["_BatchMatMul"] = function() { - return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["w"]).apply(null, arguments); - }; - var _Ceil = Module["_Ceil"] = function() { - return (_Ceil = Module["_Ceil"] = Module["asm"]["x"]).apply(null, arguments); - }; - var _ClipByValue = Module["_ClipByValue"] = function() { - return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["y"]).apply(null, arguments); - }; - var _Conv2D = Module["_Conv2D"] = function() { - return (_Conv2D = Module["_Conv2D"] = Module["asm"]["z"]).apply(null, arguments); - }; - var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { - return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["A"]).apply(null, arguments); - }; - var _Cos = Module["_Cos"] = function() { - return (_Cos = Module["_Cos"] = Module["asm"]["B"]).apply(null, arguments); - }; - var _CropAndResize = Module["_CropAndResize"] = function() { - return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["C"]).apply(null, arguments); - }; - var _Cumsum = Module["_Cumsum"] = function() { - return (_Cumsum = Module["_Cumsum"] = Module["asm"]["D"]).apply(null, arguments); - }; - var _DepthToSpace = Module["_DepthToSpace"] = function() { - return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["E"]).apply(null, arguments); - }; - var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { - return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["F"]).apply(null, arguments); - }; - var _Equal = Module["_Equal"] = function() { - return (_Equal = Module["_Equal"] = Module["asm"]["G"]).apply(null, arguments); - }; - var _Exp = Module["_Exp"] = function() { - return (_Exp = Module["_Exp"] = Module["asm"]["H"]).apply(null, arguments); - }; - var _FlipLeftRight = Module["_FlipLeftRight"] = function() { - return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["I"]).apply(null, arguments); - }; - var _Floor = Module["_Floor"] = function() { - return (_Floor = Module["_Floor"] = Module["asm"]["J"]).apply(null, arguments); - }; - var _FloorDiv = Module["_FloorDiv"] = function() { - return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["K"]).apply(null, arguments); - }; - var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { - return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["L"]).apply(null, arguments); - }; - var _FusedConv2D = Module["_FusedConv2D"] = function() { - return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["M"]).apply(null, arguments); - }; - var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { - return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["N"]).apply(null, arguments); - }; - var _Gather = Module["_Gather"] = function() { - return (_Gather = Module["_Gather"] = Module["asm"]["O"]).apply(null, arguments); - }; - var _GatherNd = Module["_GatherNd"] = function() { - return (_GatherNd = Module["_GatherNd"] = Module["asm"]["P"]).apply(null, arguments); - }; - var _Greater = Module["_Greater"] = function() { - return (_Greater = Module["_Greater"] = Module["asm"]["Q"]).apply(null, arguments); - }; - var _GreaterEqual = Module["_GreaterEqual"] = function() { - return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["R"]).apply(null, arguments); - }; - var _LeakyRelu = Module["_LeakyRelu"] = function() { - return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["S"]).apply(null, arguments); - }; - var _Less = Module["_Less"] = function() { - return (_Less = Module["_Less"] = Module["asm"]["T"]).apply(null, arguments); - }; - var _LessEqual = Module["_LessEqual"] = function() { - return (_LessEqual = Module["_LessEqual"] = Module["asm"]["U"]).apply(null, arguments); - }; - var _Log = Module["_Log"] = function() { - return (_Log = Module["_Log"] = Module["asm"]["V"]).apply(null, arguments); - }; - var _LogicalAnd = Module["_LogicalAnd"] = function() { - return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["W"]).apply(null, arguments); - }; - var _Max = Module["_Max"] = function() { - return (_Max = Module["_Max"] = Module["asm"]["X"]).apply(null, arguments); - }; - var _MaxPool = Module["_MaxPool"] = function() { - return (_MaxPool = Module["_MaxPool"] = Module["asm"]["Y"]).apply(null, arguments); - }; - var _Maximum = Module["_Maximum"] = function() { - return (_Maximum = Module["_Maximum"] = Module["asm"]["Z"]).apply(null, arguments); - }; - var _Mean = Module["_Mean"] = function() { - return (_Mean = Module["_Mean"] = Module["asm"]["_"]).apply(null, arguments); - }; - var _Min = Module["_Min"] = function() { - return (_Min = Module["_Min"] = Module["asm"]["$"]).apply(null, arguments); - }; - var _Minimum = Module["_Minimum"] = function() { - return (_Minimum = Module["_Minimum"] = Module["asm"]["aa"]).apply(null, arguments); - }; - var _MirrorPad = Module["_MirrorPad"] = function() { - return (_MirrorPad = Module["_MirrorPad"] = Module["asm"]["ba"]).apply(null, arguments); - }; - var _Multiply = Module["_Multiply"] = function() { - return (_Multiply = Module["_Multiply"] = Module["asm"]["ca"]).apply(null, arguments); - }; - var _Neg = Module["_Neg"] = function() { - return (_Neg = Module["_Neg"] = Module["asm"]["da"]).apply(null, arguments); - }; - var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { - return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["ea"]).apply(null, arguments); - }; - var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { - return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["fa"]).apply(null, arguments); - }; - var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { - return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["ga"]).apply(null, arguments); - }; - var _NotEqual = Module["_NotEqual"] = function() { - return (_NotEqual = Module["_NotEqual"] = Module["asm"]["ha"]).apply(null, arguments); - }; - var _OneHot = Module["_OneHot"] = function() { - return (_OneHot = Module["_OneHot"] = Module["asm"]["ia"]).apply(null, arguments); - }; - var _PadV2 = Module["_PadV2"] = function() { - return (_PadV2 = Module["_PadV2"] = Module["asm"]["ja"]).apply(null, arguments); - }; - var _Pow = Module["_Pow"] = function() { - return (_Pow = Module["_Pow"] = Module["asm"]["ka"]).apply(null, arguments); - }; - var _Prelu = Module["_Prelu"] = function() { - return (_Prelu = Module["_Prelu"] = Module["asm"]["la"]).apply(null, arguments); - }; - var _Prod = Module["_Prod"] = function() { - return (_Prod = Module["_Prod"] = Module["asm"]["ma"]).apply(null, arguments); - }; - var _RealDiv = Module["_RealDiv"] = function() { - return (_RealDiv = Module["_RealDiv"] = Module["asm"]["na"]).apply(null, arguments); - }; - var _Relu = Module["_Relu"] = function() { - return (_Relu = Module["_Relu"] = Module["asm"]["oa"]).apply(null, arguments); - }; - var _Relu6 = Module["_Relu6"] = function() { - return (_Relu6 = Module["_Relu6"] = Module["asm"]["pa"]).apply(null, arguments); - }; - var _ResizeBilinear = Module["_ResizeBilinear"] = function() { - return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["qa"]).apply(null, arguments); - }; - var _Reverse = Module["_Reverse"] = function() { - return (_Reverse = Module["_Reverse"] = Module["asm"]["ra"]).apply(null, arguments); - }; - var _RotateWithOffset = Module["_RotateWithOffset"] = function() { - return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["sa"]).apply(null, arguments); - }; - var _Round = Module["_Round"] = function() { - return (_Round = Module["_Round"] = Module["asm"]["ta"]).apply(null, arguments); - }; - var _Rsqrt = Module["_Rsqrt"] = function() { - return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["ua"]).apply(null, arguments); - }; - var _ScatterNd = Module["_ScatterNd"] = function() { - return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["va"]).apply(null, arguments); - }; - var _SelectV2 = Module["_SelectV2"] = function() { - return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["wa"]).apply(null, arguments); - }; - var _Sigmoid = Module["_Sigmoid"] = function() { - return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["xa"]).apply(null, arguments); - }; - var _Sin = Module["_Sin"] = function() { - return (_Sin = Module["_Sin"] = Module["asm"]["ya"]).apply(null, arguments); - }; - var _Softmax = Module["_Softmax"] = function() { - return (_Softmax = Module["_Softmax"] = Module["asm"]["za"]).apply(null, arguments); - }; - var _Sqrt = Module["_Sqrt"] = function() { - return (_Sqrt = Module["_Sqrt"] = Module["asm"]["Aa"]).apply(null, arguments); - }; - var _Square = Module["_Square"] = function() { - return (_Square = Module["_Square"] = Module["asm"]["Ba"]).apply(null, arguments); - }; - var _SquaredDifference = Module["_SquaredDifference"] = function() { - return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["Ca"]).apply(null, arguments); - }; - var _Step = Module["_Step"] = function() { - return (_Step = Module["_Step"] = Module["asm"]["Da"]).apply(null, arguments); - }; - var _StridedSlice = Module["_StridedSlice"] = function() { - return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["Ea"]).apply(null, arguments); - }; - var _Sub = Module["_Sub"] = function() { - return (_Sub = Module["_Sub"] = Module["asm"]["Fa"]).apply(null, arguments); - }; - var _Sum = Module["_Sum"] = function() { - return (_Sum = Module["_Sum"] = Module["asm"]["Ga"]).apply(null, arguments); - }; - var _Tan = Module["_Tan"] = function() { - return (_Tan = Module["_Tan"] = Module["asm"]["Ha"]).apply(null, arguments); - }; - var _Tanh = Module["_Tanh"] = function() { - return (_Tanh = Module["_Tanh"] = Module["asm"]["Ia"]).apply(null, arguments); - }; - var _Tile = Module["_Tile"] = function() { - return (_Tile = Module["_Tile"] = Module["asm"]["Ja"]).apply(null, arguments); - }; - var _TopK = Module["_TopK"] = function() { - return (_TopK = Module["_TopK"] = Module["asm"]["Ka"]).apply(null, arguments); - }; - var _Transform = Module["_Transform"] = function() { - return (_Transform = Module["_Transform"] = Module["asm"]["La"]).apply(null, arguments); - }; - var _Transpose = Module["_Transpose"] = function() { - return (_Transpose = Module["_Transpose"] = Module["asm"]["Ma"]).apply(null, arguments); - }; - var __FusedMatMul = Module["__FusedMatMul"] = function() { - return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["Na"]).apply(null, arguments); - }; - var _malloc = Module["_malloc"] = function() { - return (_malloc = Module["_malloc"] = Module["asm"]["Oa"]).apply(null, arguments); - }; - var _free = Module["_free"] = function() { - return (_free = Module["_free"] = Module["asm"]["Pa"]).apply(null, arguments); - }; - var ___errno_location = Module["___errno_location"] = function() { - return (___errno_location = Module["___errno_location"] = Module["asm"]["Qa"]).apply(null, arguments); - }; - var stackSave = Module["stackSave"] = function() { - return (stackSave = Module["stackSave"] = Module["asm"]["Ra"]).apply(null, arguments); - }; - var stackRestore = Module["stackRestore"] = function() { - return (stackRestore = Module["stackRestore"] = Module["asm"]["Sa"]).apply(null, arguments); - }; - var stackAlloc = Module["stackAlloc"] = function() { - return (stackAlloc = Module["stackAlloc"] = Module["asm"]["Ta"]).apply(null, arguments); - }; - Module["cwrap"] = cwrap; - var calledRun; - function ExitStatus(status) { - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - } - dependenciesFulfilled = function runCaller() { - if (!calledRun) - run(); - if (!calledRun) - dependenciesFulfilled = runCaller; - }; - function run(args) { - args = args || arguments_; - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) - return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) - return; - initRuntime(); - preMain(); - readyPromiseResolve(Module); - if (Module["onRuntimeInitialized"]) - Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } - } - Module["run"] = run; - if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") - Module["preInit"] = [Module["preInit"]]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } - } - run(); - return WasmBackendModule2.ready; - }; - }(); - if (typeof exports === "object" && typeof module6 === "object") - module6.exports = WasmBackendModule; - else if (typeof define === "function" && define["amd"]) - define([], function() { - return WasmBackendModule; - }); - else if (typeof exports === "object") - exports["WasmBackendModule"] = WasmBackendModule; - } -}); -var require_alea2 = __commonJS({ - "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/alea.js"(exports, module6) { - (function(global2, module7, define2) { - function Alea(seed) { - var me = this, mash = Mash(); - me.next = function() { - var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; - me.s0 = me.s1; - me.s1 = me.s2; - return me.s2 = t - (me.c = t | 0); - }; - me.c = 1; - me.s0 = mash(" "); - me.s1 = mash(" "); - me.s2 = mash(" "); - me.s0 -= mash(seed); - if (me.s0 < 0) { - me.s0 += 1; - } - me.s1 -= mash(seed); - if (me.s1 < 0) { - me.s1 += 1; - } - me.s2 -= mash(seed); - if (me.s2 < 0) { - me.s2 += 1; - } - mash = null; - } - function copy(f, t) { - t.c = f.c; - t.s0 = f.s0; - t.s1 = f.s1; - t.s2 = f.s2; - return t; - } - function impl(seed, opts) { - var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; - prng.int32 = function() { - return xg.next() * 4294967296 | 0; - }; - prng.double = function() { - return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; - }; - prng.quick = prng; - if (state) { - if (typeof state == "object") - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - function Mash() { - var n = 4022871197; - var mash = function(data) { - data = String(data); - for (var i = 0; i < data.length; i++) { - n += data.charCodeAt(i); - var h = 0.02519603282416938 * n; - n = h >>> 0; - h -= n; - h *= n; - n = h >>> 0; - h -= n; - n += h * 4294967296; - } - return (n >>> 0) * 23283064365386963e-26; - }; - return mash; - } - if (module7 && module7.exports) { - module7.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.alea = impl; - } - })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); - } -}); -var require_xor1282 = __commonJS({ - "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xor128.js"(exports, module6) { - (function(global2, module7, define2) { - function XorGen(seed) { - var me = this, strseed = ""; - me.x = 0; - me.y = 0; - me.z = 0; - me.w = 0; - me.next = function() { - var t = me.x ^ me.x << 11; - me.x = me.y; - me.y = me.z; - me.z = me.w; - return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; - }; - if (seed === (seed | 0)) { - me.x = seed; - } else { - strseed += seed; - } - for (var k = 0; k < strseed.length + 64; k++) { - me.x ^= strseed.charCodeAt(k) | 0; - me.next(); - } - } - function copy(f, t) { - t.x = f.x; - t.y = f.y; - t.z = f.z; - t.w = f.w; - return t; - } - function impl(seed, opts) { - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (typeof state == "object") - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module7 && module7.exports) { - module7.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.xor128 = impl; - } - })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); - } -}); -var require_xorwow2 = __commonJS({ - "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xorwow.js"(exports, module6) { - (function(global2, module7, define2) { - function XorGen(seed) { - var me = this, strseed = ""; - me.next = function() { - var t = me.x ^ me.x >>> 2; - me.x = me.y; - me.y = me.z; - me.z = me.w; - me.w = me.v; - return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; - }; - me.x = 0; - me.y = 0; - me.z = 0; - me.w = 0; - me.v = 0; - if (seed === (seed | 0)) { - me.x = seed; - } else { - strseed += seed; - } - for (var k = 0; k < strseed.length + 64; k++) { - me.x ^= strseed.charCodeAt(k) | 0; - if (k == strseed.length) { - me.d = me.x << 10 ^ me.x >>> 4; - } - me.next(); - } - } - function copy(f, t) { - t.x = f.x; - t.y = f.y; - t.z = f.z; - t.w = f.w; - t.v = f.v; - t.d = f.d; - return t; - } - function impl(seed, opts) { - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (typeof state == "object") - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module7 && module7.exports) { - module7.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.xorwow = impl; - } - })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); - } -}); -var require_xorshift72 = __commonJS({ - "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xorshift7.js"(exports, module6) { - (function(global2, module7, define2) { - function XorGen(seed) { - var me = this; - me.next = function() { - var X = me.x, i = me.i, t, v, w; - t = X[i]; - t ^= t >>> 7; - v = t ^ t << 24; - t = X[i + 1 & 7]; - v ^= t ^ t >>> 10; - t = X[i + 3 & 7]; - v ^= t ^ t >>> 3; - t = X[i + 4 & 7]; - v ^= t ^ t << 7; - t = X[i + 7 & 7]; - t = t ^ t << 13; - v ^= t ^ t << 9; - X[i] = v; - me.i = i + 1 & 7; - return v; - }; - function init2(me2, seed2) { - var j, w, X = []; - if (seed2 === (seed2 | 0)) { - w = X[0] = seed2; - } else { - seed2 = "" + seed2; - for (j = 0; j < seed2.length; ++j) { - X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; - } - } - while (X.length < 8) - X.push(0); - for (j = 0; j < 8 && X[j] === 0; ++j) - ; - if (j == 8) - w = X[7] = -1; - else - w = X[j]; - me2.x = X; - me2.i = 0; - for (j = 256; j > 0; --j) { - me2.next(); - } - } - init2(me, seed); - } - function copy(f, t) { - t.x = f.x.slice(); - t.i = f.i; - return t; - } - function impl(seed, opts) { - if (seed == null) - seed = +new Date(); - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (state.x) - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module7 && module7.exports) { - module7.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.xorshift7 = impl; - } - })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); - } -}); -var require_xor40962 = __commonJS({ - "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/xor4096.js"(exports, module6) { - (function(global2, module7, define2) { - function XorGen(seed) { - var me = this; - me.next = function() { - var w = me.w, X = me.X, i = me.i, t, v; - me.w = w = w + 1640531527 | 0; - v = X[i + 34 & 127]; - t = X[i = i + 1 & 127]; - v ^= v << 13; - t ^= t << 17; - v ^= v >>> 15; - t ^= t >>> 12; - v = X[i] = v ^ t; - me.i = i; - return v + (w ^ w >>> 16) | 0; - }; - function init2(me2, seed2) { - var t, v, i, j, w, X = [], limit = 128; - if (seed2 === (seed2 | 0)) { - v = seed2; - seed2 = null; - } else { - seed2 = seed2 + "\0"; - v = 0; - limit = Math.max(limit, seed2.length); - } - for (i = 0, j = -32; j < limit; ++j) { - if (seed2) - v ^= seed2.charCodeAt((j + 32) % seed2.length); - if (j === 0) - w = v; - v ^= v << 10; - v ^= v >>> 15; - v ^= v << 4; - v ^= v >>> 13; - if (j >= 0) { - w = w + 1640531527 | 0; - t = X[j & 127] ^= v + w; - i = t == 0 ? i + 1 : 0; - } - } - if (i >= 128) { - X[(seed2 && seed2.length || 0) & 127] = -1; - } - i = 127; - for (j = 4 * 128; j > 0; --j) { - v = X[i + 34 & 127]; - t = X[i = i + 1 & 127]; - v ^= v << 13; - t ^= t << 17; - v ^= v >>> 15; - t ^= t >>> 12; - X[i] = v ^ t; - } - me2.w = w; - me2.X = X; - me2.i = i; - } - init2(me, seed); - } - function copy(f, t) { - t.i = f.i; - t.w = f.w; - t.X = f.X.slice(); - return t; - } - ; - function impl(seed, opts) { - if (seed == null) - seed = +new Date(); - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (state.X) - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module7 && module7.exports) { - module7.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.xor4096 = impl; - } - })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); - } -}); -var require_tychei2 = __commonJS({ - "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/lib/tychei.js"(exports, module6) { - (function(global2, module7, define2) { - function XorGen(seed) { - var me = this, strseed = ""; - me.next = function() { - var b = me.b, c = me.c, d = me.d, a = me.a; - b = b << 25 ^ b >>> 7 ^ c; - c = c - d | 0; - d = d << 24 ^ d >>> 8 ^ a; - a = a - b | 0; - me.b = b = b << 20 ^ b >>> 12 ^ c; - me.c = c = c - d | 0; - me.d = d << 16 ^ c >>> 16 ^ a; - return me.a = a - b | 0; - }; - me.a = 0; - me.b = 0; - me.c = 2654435769 | 0; - me.d = 1367130551; - if (seed === Math.floor(seed)) { - me.a = seed / 4294967296 | 0; - me.b = seed | 0; - } else { - strseed += seed; - } - for (var k = 0; k < strseed.length + 20; k++) { - me.b ^= strseed.charCodeAt(k) | 0; - me.next(); - } - } - function copy(f, t) { - t.a = f.a; - t.b = f.b; - t.c = f.c; - t.d = f.d; - return t; - } - ; - function impl(seed, opts) { - var xg = new XorGen(seed), state = opts && opts.state, prng = function() { - return (xg.next() >>> 0) / 4294967296; - }; - prng.double = function() { - do { - var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - prng.int32 = xg.next; - prng.quick = prng; - if (state) { - if (typeof state == "object") - copy(state, xg); - prng.state = function() { - return copy(xg, {}); - }; - } - return prng; - } - if (module7 && module7.exports) { - module7.exports = impl; - } else if (define2 && define2.amd) { - define2(function() { - return impl; - }); - } else { - this.tychei = impl; - } - })(exports, typeof module6 == "object" && module6, typeof define == "function" && define); - } -}); -var require_seedrandom3 = __commonJS({ - "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/seedrandom.js"(exports, module6) { - (function(global2, pool3, math) { - var width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; - function seedrandom5(seed, options2, callback) { - var key = []; - options2 = options2 == true ? { entropy: true } : options2 || {}; - var shortseed = mixkey(flatten4(options2.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); - var arc4 = new ARC4(key); - var prng = function() { - var n = arc4.g(chunks), d = startdenom, x = 0; - while (n < significance) { - n = (n + x) * width; - d *= width; - x = arc4.g(1); - } - while (n >= overflow) { - n /= 2; - d /= 2; - x >>>= 1; - } - return (n + x) / d; - }; - prng.int32 = function() { - return arc4.g(4) | 0; - }; - prng.quick = function() { - return arc4.g(4) / 4294967296; - }; - prng.double = prng; - mixkey(tostring(arc4.S), pool3); - return (options2.pass || callback || function(prng2, seed2, is_math_call, state) { - if (state) { - if (state.S) { - copy(state, arc4); - } - prng2.state = function() { - return copy(arc4, {}); - }; - } - if (is_math_call) { - math[rngname] = prng2; - return seed2; - } else - return prng2; - })(prng, shortseed, "global" in options2 ? options2.global : this == math, options2.state); - } - function ARC4(key) { - var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; - if (!keylen) { - key = [keylen++]; - } - while (i < width) { - s[i] = i++; - } - for (i = 0; i < width; i++) { - s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; - s[j] = t; - } - (me.g = function(count22) { - var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; - while (count22--) { - t2 = s2[i2 = mask & i2 + 1]; - r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; - } - me.i = i2; - me.j = j2; - return r; - })(width); - } - function copy(f, t) { - t.i = f.i; - t.j = f.j; - t.S = f.S.slice(); - return t; - } - ; - function flatten4(obj, depth) { - var result = [], typ = typeof obj, prop; - if (depth && typ == "object") { - for (prop in obj) { - try { - result.push(flatten4(obj[prop], depth - 1)); - } catch (e) { - } - } - } - return result.length ? result : typ == "string" ? obj : obj + "\0"; - } - function mixkey(seed, key) { - var stringseed = seed + "", smear, j = 0; - while (j < stringseed.length) { - key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); - } - return tostring(key); - } - function autoseed() { - try { - var out; - if (nodecrypto && (out = nodecrypto.randomBytes)) { - out = out(width); - } else { - out = new Uint8Array(width); - (global2.crypto || global2.msCrypto).getRandomValues(out); - } - return tostring(out); - } catch (e) { - var browser4 = global2.navigator, plugins = browser4 && browser4.plugins; - return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; - } - } - function tostring(a) { - return String.fromCharCode.apply(0, a); - } - mixkey(math.random(), pool3); - if (typeof module6 == "object" && module6.exports) { - module6.exports = seedrandom5; - try { - nodecrypto = require_crypto(); - } catch (ex) { - } - } else if (typeof define == "function" && define.amd) { - define(function() { - return seedrandom5; - }); - } else { - math["seed" + rngname] = seedrandom5; - } - })(typeof self !== "undefined" ? self : exports, [], Math); - } -}); -var require_seedrandom4 = __commonJS({ - "node_modules/.pnpm/seedrandom@3.0.5/node_modules/seedrandom/index.js"(exports, module6) { - var alea5 = require_alea2(); - var xor128 = require_xor1282(); - var xorwow = require_xorwow2(); - var xorshift7 = require_xorshift72(); - var xor4096 = require_xor40962(); - var tychei = require_tychei2(); - var sr = require_seedrandom3(); - sr.alea = alea5; - sr.xor128 = xor128; - sr.xorwow = xorwow; - sr.xorshift7 = xorshift7; - sr.xor4096 = xor4096; - sr.tychei = tychei; - module6.exports = sr; - } -}); -var require_string_decoder = __commonJS({ - "(disabled):node_modules/.pnpm/string_decoder@1.1.1/node_modules/string_decoder/lib/string_decoder.js"() { - } -}); -var package_exports = {}; -__export2(package_exports, { - bin: () => bin, - browser: () => browser, - default: () => package_default, - dependencies: () => dependencies, - description: () => description, - devDependencies: () => devDependencies, - jsdelivr: () => jsdelivr, - license: () => license, - main: () => main, - miniprogram: () => miniprogram, - module: () => module, - name: () => name, - private: () => private2, - repository: () => repository, - scripts: () => scripts, - types: () => types, - unpkg: () => unpkg, - version: () => version -}); -var name = "@tensorflow/tfjs"; -var version = "3.6.0"; -var description = "An open-source machine learning framework."; -var private2 = false; -var main = "dist/tf.node.js"; -var module = "dist/index.js"; -var jsdelivr = "dist/tf.min.js"; -var unpkg = "dist/tf.min.js"; -var types = "dist/index.d.ts"; -var miniprogram = "dist/miniprogram"; -var bin = { - "tfjs-custom-module": "dist/tools/custom_module/cli.js" -}; -var repository = { - type: "git", - url: "https://github.com/tensorflow/tfjs.git" -}; -var license = "Apache-2.0"; -var devDependencies = { - "@babel/core": "^7.9.0", - "@babel/polyfill": "^7.10.4", - "@babel/preset-env": "^7.9.5", - "@rollup/plugin-commonjs": "^11.0.2", - "@rollup/plugin-node-resolve": "^7.1.1", - "@rollup/plugin-typescript": "^3.0.0", - "@types/argparse": "^1.0.38", - "@types/jasmine": "2.8.7", - "@types/node": "~10.17.50", - "@types/shelljs": "^0.8.4", - "@types/yargs": "^15.0.7", - "clang-format": "~1.2.2", - commander: "~2.14.1", - jasmine: "3.1.0", - "jasmine-core": "~3.1.0", - karma: "~6.3.2", - "karma-browserstack-launcher": "~1.6.0", - "karma-chrome-launcher": "~2.2.0", - "karma-firefox-launcher": "~1.1.0", - "karma-jasmine": "~1.1.1", - "karma-typescript": "~5.5.1", - "karma-typescript-es6-transform": "^5.5.1", - "npm-run-all": "~4.1.3", - rimraf: "~2.6.2", - rollup: "~2.3.2", - "rollup-plugin-babel": "^4.4.0", - "rollup-plugin-terser": "~7.0.2", - "rollup-plugin-visualizer": "~4.2.2", - shelljs: "~0.8.1", - "ts-node": "~8.8.2", - tslint: "~5.11.0", - "tslint-no-circular-imports": "~0.5.0", - typescript: "3.5.3", - yalc: "1.0.0-pre.50" -}; -var scripts = { - build: "tsc && yarn build-cli && yarn bundle", - "build-ci": "tsc && yarn build-cli && yarn bundle-ci", - bundle: "rollup -c", - "bundle-ci": "rollup -c --ci", - "build-core": "cd ../tfjs-core && yarn && yarn build", - "build-core-ci": "cd ../tfjs-core && yarn && yarn build-ci", - "build-layers": "cd ../tfjs-layers && yarn && yarn build", - "build-layers-ci": "cd ../tfjs-layers && yarn && yarn build-ci", - "build-converter": "cd ../tfjs-converter && yarn && yarn build", - "build-converter-ci": "cd ../tfjs-converter && yarn && yarn build-ci", - "build-data": "cd ../tfjs-data && yarn && yarn build", - "build-data-ci": "cd ../tfjs-data && yarn && yarn build-ci", - "build-backend-cpu": "cd ../tfjs-backend-cpu && yarn && yarn build", - "build-backend-cpu-ci": "cd ../tfjs-backend-cpu && yarn && yarn build-ci", - "build-backend-webgl": "cd ../tfjs-backend-webgl && yarn && yarn build", - "build-backend-webgl-ci": "cd ../tfjs-backend-webgl && yarn && yarn build-ci", - "build-deps": "yarn build-core && yarn build-layers && yarn build-converter && yarn build-data && yarn build-backend-cpu && yarn build-backend-webgl", - "build-deps-ci": "yarn build-core-ci && yarn build-layers-ci && yarn build-converter-ci && yarn build-data-ci && yarn build-backend-cpu-ci && yarn build-backend-webgl-ci", - "build-cli": "tsc --project ./tools/custom_module/tsconfig.json && chmod +x ./dist/tools/custom_module/cli.js", - "run-custom-build": "ts-node -s ./tools/custom_module/cli.ts", - "build-npm": "./scripts/build-npm.sh", - "link-local": "yalc link", - "publish-local": "yarn build-npm && yalc push", - "publish-npm": "npm publish", - lint: "tslint -p . -t verbose", - coverage: "KARMA_COVERAGE=1 karma start --browsers='Chrome' --singleRun", - test: "yarn && yarn build-deps && yarn build && karma start", - "test-dev": "karma start", - "test-tools": "ts-node --project ./tools/custom_module/tsconfig.json run_tools_tests.ts", - "test-ci": "./scripts/test-ci.sh" -}; -var dependencies = { - "@tensorflow/tfjs-backend-cpu": "3.6.0", - "@tensorflow/tfjs-backend-webgl": "3.6.0", - "@tensorflow/tfjs-converter": "3.6.0", - "@tensorflow/tfjs-core": "3.6.0", - "@tensorflow/tfjs-data": "3.6.0", - "@tensorflow/tfjs-layers": "3.6.0", - argparse: "^1.0.10", - chalk: "^4.1.0", - "core-js": "3", - "regenerator-runtime": "^0.13.5", - yargs: "^16.0.3" -}; -var browser = { - "node-fetch": false, - util: false, - crypto: false -}; -var package_default = { - name, - version, - description, - private: private2, - main, - module, - jsdelivr, - unpkg, - types, - miniprogram, - bin, - repository, - license, - devDependencies, - scripts, - dependencies, - browser -}; -var package_exports2 = {}; -__export2(package_exports2, { - browser: () => browser2, - default: () => package_default2, - dependencies: () => dependencies2, - description: () => description2, - devDependencies: () => devDependencies2, - engines: () => engines, - jsdelivr: () => jsdelivr2, - "jsnext:main": () => jsnext_main, - license: () => license2, - main: () => main2, - miniprogram: () => miniprogram2, - module: () => module2, - name: () => name2, - private: () => private3, - repository: () => repository2, - scripts: () => scripts2, - sideEffects: () => sideEffects, - types: () => types2, - unpkg: () => unpkg2, - version: () => version2 -}); -var name2 = "@tensorflow/tfjs-core"; -var version2 = "3.6.0"; -var description2 = "Hardware-accelerated JavaScript library for machine intelligence"; -var private3 = false; -var main2 = "dist/tf-core.node.js"; -var jsdelivr2 = "dist/tf-core.min.js"; -var unpkg2 = "dist/tf-core.min.js"; -var types2 = "dist/index.d.ts"; -var jsnext_main = "dist/index.js"; -var module2 = "dist/index.js"; -var miniprogram2 = "dist/miniprogram"; -var engines = { - yarn: ">= 1.3.2" -}; -var repository2 = { - type: "git", - url: "https://github.com/tensorflow/tfjs-core.git" -}; -var license2 = "Apache-2.0"; -var devDependencies2 = { - "@bazel/bazelisk": "^1.3.0", - "@bazel/typescript": "^0.27.8", - "@rollup/plugin-commonjs": "^11.0.2", - "@rollup/plugin-node-resolve": "^7.1.1", - "@rollup/plugin-typescript": "^3.0.0", - "@tensorflow/tfjs-backend-cpu": "link:../tfjs-backend-cpu", - "@types/jasmine": "~3.0.0", - "@types/node": "~9.6.0", - "@types/node-fetch": "~2.1.2", - "clang-format": "~1.2.4", - jasmine: "~3.1.0", - "jasmine-core": "~3.1.0", - karma: "6.3.2", - "karma-browserstack-launcher": "~1.6.0", - "karma-chrome-launcher": "~3.1.0", - "karma-jasmine": "~4.0.1", - "karma-typescript": "~5.5.1", - "npm-run-all": "~4.1.3", - rimraf: "~2.6.2", - rollup: "~2.3.2", - "rollup-plugin-terser": "~5.3.0", - "rollup-plugin-visualizer": "~3.3.2", - shelljs: "~0.8.3", - "ts-node": "~8.8.2", - tslint: "~5.11.0", - "tslint-no-circular-imports": "~0.5.0", - typescript: "3.5.3", - yalc: "~1.0.0-pre.21", - yargs: "~13.2.2" -}; -var scripts2 = { - "build-ci": "./scripts/enumerate-tests.js --ci && tsc && yarn bundle-ci && yarn build-test-snippets", - build: "node ./scripts/enumerate-tests.js && tsc && yarn bundle", - bundle: "rollup -c", - "bundle-ci": "rollup -c --ci", - "build-npm": "./scripts/build-npm.sh", - "build-deps": "yarn build && yarn build-cpu-backend", - "build-cpu-backend": "cd ../tfjs-backend-cpu && yarn && yarn build", - "build-cpu-backend-ci": "cd ../tfjs-backend-cpu && yarn && yarn build-ci", - "build:bazel": "bazelisk build //...", - "build-test-snippets": "yarn tsc --project ./scripts/test_snippets/tsconfig.json", - "format-all": "clang-format -i -style=Google --glob=src/**/*.ts", - "link-local": "yalc link", - "publish-local": "rimraf dist/ && yarn build && rollup -c && yalc push", - "publish-npm": "npm publish", - lint: "tslint -p . -t verbose", - coverage: "KARMA_COVERAGE=1 karma start --browsers='Chrome' --singleRun", - test: "yarn && yarn build-deps && karma start", - "test-dev": "karma start", - "test-ci": "./scripts/test-ci.sh", - "test-webworker": "karma start --worker", - "run-browserstack": "karma start --browserstack", - "test-bundle-size": "./scripts/test-bundle-size.js", - "test-node": "rimraf dist/ && yarn build-deps && yarn build && ts-node --transpile-only --skip-ignore -P tsconfig.test.json dist/test_node.js", - "test-node-dev": "tsc && ts-node --transpile-only --skip-ignore -P tsconfig.test.json dist/test_node.js", - "test-node-ci": "ts-node --transpile-only -P tsconfig.test.json dist/test_node.js", - "test-async-backends": "rimraf dist/ && yarn build && ts-node --transpile-only -P tsconfig.test.json dist/test_async_backends.js", - "test-async-backends-ci": "ts-node --transpile-only -P tsconfig.test.json dist/test_async_backends.js", - "test-snippets": "yarn build && yarn build-cpu-backend && ts-node -P tsconfig.test.json ./scripts/test_snippets/test_snippets.ts", - "test-snippets-ci": "ts-node -P tsconfig.test.json ./scripts/test_snippets/test_snippets.ts" -}; -var dependencies2 = { - "@types/offscreencanvas": "~2019.3.0", - "@types/seedrandom": "2.4.27", - "@types/webgl-ext": "0.0.30", - "node-fetch": "~2.6.1", - seedrandom: "2.4.3" -}; -var browser2 = { - "node-fetch": false, - util: false, - crypto: false, - worker_threads: false -}; -var sideEffects = [ - "./dist/index.js", - "./dist/engine.js", - "./dist/tensor.js", - "./dist/base_side_effects.js", - "./dist/flags.js", - "./dist/platforms/*.js", - "./dist/register_all_gradients.js", - "./dist/public/chained_ops/*.js", - "./dist/io/*.js" -]; -var package_default2 = { - name: name2, - version: version2, - description: description2, - private: private3, - main: main2, - jsdelivr: jsdelivr2, - unpkg: unpkg2, - types: types2, - "jsnext:main": jsnext_main, - module: module2, - miniprogram: miniprogram2, - engines, - repository: repository2, - license: license2, - devDependencies: devDependencies2, - scripts: scripts2, - dependencies: dependencies2, - browser: browser2, - sideEffects -}; -var package_exports3 = {}; -__export2(package_exports3, { - browser: () => browser3, - default: () => package_default3, - dependencies: () => dependencies3, - description: () => description3, - devDependencies: () => devDependencies3, - jsdelivr: () => jsdelivr3, - "jsnext:main": () => jsnext_main2, - license: () => license3, - main: () => main3, - miniprogram: () => miniprogram3, - module: () => module3, - name: () => name3, - peerDependencies: () => peerDependencies, - private: () => private4, - scripts: () => scripts3, - types: () => types3, - unpkg: () => unpkg3, - version: () => version3 -}); -var name3 = "@tensorflow/tfjs-data"; -var version3 = "3.6.0"; -var description3 = "TensorFlow Data API in JavaScript"; -var private4 = false; -var main3 = "dist/tf-data.node.js"; -var jsdelivr3 = "dist/tf-data.min.js"; -var unpkg3 = "dist/tf-data.min.js"; -var types3 = "dist/index.d.ts"; -var jsnext_main2 = "dist/index.js"; -var module3 = "dist/index.js"; -var miniprogram3 = "dist/miniprogram"; -var license3 = "Apache-2.0"; -var devDependencies3 = { - "@rollup/plugin-commonjs": "^11.0.2", - "@rollup/plugin-node-resolve": "^7.1.1", - "@rollup/plugin-typescript": "^3.0.0", - "@tensorflow/tfjs-backend-cpu": "3.6.0", - "@tensorflow/tfjs-core": "3.6.0", - "@tensorflow/tfjs-layers": "3.6.0", - "@types/jasmine": "~2.5.53", - "@types/seedrandom": "^2.4.27", - "@types/utf8": "~2.1.6", - "clang-format": "~1.2.2", - "http-server": "~0.12.3", - jasmine: "3.1.0", - "jasmine-core": "~3.1.0", - karma: "~6.3.1", - "karma-chrome-launcher": "~2.2.0", - "karma-firefox-launcher": "~1.1.0", - "karma-jasmine": "~1.1.1", - "karma-typescript": "~5.5.1", - "karma-typescript-es6-transform": "^5.0.2", - nyc: "^15.1.0", - rimraf: "~2.6.2", - rollup: "~2.3.2", - "rollup-plugin-terser": "~7.0.2", - "rollup-plugin-visualizer": "~3.3.2", - "ts-node": "~7.0.0", - tslint: "~6.1.3", - "tslint-no-circular-imports": "^0.7.0", - typescript: "3.5.3", - yalc: "^1.0.0-pre.50" -}; -var scripts3 = { - build: "tsc && yarn bundle", - "build-ci": "tsc && yarn bundle-ci", - bundle: "rollup -c", - "bundle-ci": "rollup -c --ci", - "build-core": "cd ../tfjs-core && yarn && yarn build", - "build-core-ci": "cd ../tfjs-core && yarn && yarn build-ci", - "build-layers": "cd ../tfjs-layers && yarn && yarn build", - "build-backend-cpu": "cd ../tfjs-backend-cpu && yarn && yarn build", - "build-backend-cpu-ci": "cd ../tfjs-backend-cpu && yarn && yarn build-ci", - "build-layers-ci": "cd ../tfjs-layers && yarn && yarn build-ci", - "build-deps": "yarn build-core && yarn build-layers && yarn build-backend-cpu", - "build-deps-ci": "yarn build-core-ci && yarn build-layers-ci && yarn build-backend-cpu-ci", - "build-npm": "./scripts/build-npm.sh", - "link-local": "yalc link", - "publish-local": "rimraf dist/ && yarn build-npm && yalc push", - "publish-npm": "npm publish", - test: "yarn && yarn build-deps && yarn build && ts-node --transpile-only --project tsconfig.test.json src/test_node.ts", - "test-dev": "tsc && ts-node --transpile-only --project tsconfig.test.json src/test_node.ts", - "test-browsers": "karma start --browsers='Chrome,Firefox'", - "test-ci": "ts-node --transpile-only --skip-ignore -P tsconfig.test.json src/test_node.ts", - "test-snippets": "yarn && yarn build-deps && yarn build && ts-node --skip-ignore --project tsconfig.test.json ./scripts/test_snippets.ts", - "test-snippets-ci": "ts-node --skip-ignore --project tsconfig.test.json ./scripts/test_snippets.ts", - coverage: "yarn nyc yarn ts-node --transpile-only -P tsconfig.test.json src/test_node.ts", - lint: "tslint -p . -t verbose" -}; -var peerDependencies = { - "@tensorflow/tfjs-core": "3.6.0", - seedrandom: "~2.4.3" -}; -var dependencies3 = { - "@types/node-fetch": "^2.1.2", - "node-fetch": "~2.6.1" -}; -var browser3 = { - fs: false, - "node-fetch": false, - string_decoder: false, - crypto: false -}; -var package_default3 = { - name: name3, - version: version3, - description: description3, - private: private4, - main: main3, - jsdelivr: jsdelivr3, - unpkg: unpkg3, - types: types3, - "jsnext:main": jsnext_main2, - module: module3, - miniprogram: miniprogram3, - license: license3, - devDependencies: devDependencies3, - scripts: scripts3, - peerDependencies, - dependencies: dependencies3, - browser: browser3 -}; -var package_exports4 = {}; -__export2(package_exports4, { - default: () => package_default4, - description: () => description4, - devDependencies: () => devDependencies4, - jsdelivr: () => jsdelivr4, - "jsnext:main": () => jsnext_main3, - license: () => license4, - main: () => main4, - miniprogram: () => miniprogram4, - module: () => module4, - name: () => name4, - peerDependencies: () => peerDependencies2, - private: () => private5, - scripts: () => scripts4, - types: () => types4, - unpkg: () => unpkg4, - version: () => version4 -}); -var name4 = "@tensorflow/tfjs-layers"; -var version4 = "3.6.0"; -var description4 = "TensorFlow layers API in JavaScript"; -var license4 = "Apache-2.0 AND MIT"; -var private5 = false; -var main4 = "dist/tf-layers.node.js"; -var types4 = "dist/index.d.ts"; -var jsnext_main3 = "dist/index.js"; -var module4 = "dist/index.js"; -var jsdelivr4 = "dist/tf-layers.min.js"; -var unpkg4 = "dist/tf-layers.min.js"; -var miniprogram4 = "dist/miniprogram"; -var devDependencies4 = { - "@babel/polyfill": "^7.8.7", - "@rollup/plugin-commonjs": "^11.0.2", - "@rollup/plugin-node-resolve": "^7.1.1", - "@rollup/plugin-typescript": "^3.0.0", - "@tensorflow/tfjs-backend-cpu": "3.6.0", - "@tensorflow/tfjs-backend-webgl": "3.6.0", - "@tensorflow/tfjs-core": "3.6.0", - "@types/jasmine": "~2.5.53", - "clang-format": "~1.2.2", - "http-server": "~0.12.3", - jasmine: "~3.1.0", - "jasmine-core": "~3.1.0", - karma: "~6.3.1", - "karma-browserstack-launcher": "~1.6.0", - "karma-chrome-launcher": "~2.2.0", - "karma-firefox-launcher": "~1.1.0", - "karma-jasmine": "~1.1.1", - "karma-typescript": "~5.5.1", - "karma-typescript-es6-transform": "^5.0.2", - rimraf: "~2.6.2", - rollup: "~2.3.2", - "rollup-plugin-terser": "~7.0.2", - "rollup-plugin-visualizer": "~3.3.2", - "ts-node": "~8.8.2", - tslint: "~6.1.3", - "tslint-no-circular-imports": "^0.7.0", - typescript: "3.5.3", - yalc: "~1.0.0-pre.50" -}; -var scripts4 = { - prep: "yarn install && yarn build-ci", - build: "tsc && yarn bundle", - "build-ci": "tsc && yarn bundle-ci", - bundle: "rollup -c", - "bundle-ci": "rollup -c --ci", - "build-core": "cd ../tfjs-core && yarn && yarn build", - "build-backend-cpu": "cd ../tfjs-backend-cpu && yarn && yarn build", - "build-backend-cpu-ci": "cd ../tfjs-backend-cpu && yarn && yarn build-ci", - "build-backend-webgl": "cd ../tfjs-backend-webgl && yarn && yarn build", - "build-backend-webgl-ci": "cd ../tfjs-backend-webgl && yarn && yarn build-ci", - "build-core-ci": "cd ../tfjs-core && yarn && yarn build-ci", - "build-deps": "yarn build-core && yarn build-backend-cpu && yarn build-backend-webgl", - "build-deps-ci": "yarn build-core-ci && yarn build-backend-cpu-ci && yarn build-backend-webgl-ci", - "build-npm": "./scripts/build-npm.sh", - format: "./tools/clang_format_ts.sh", - "link-local": "yalc link", - "publish-local": "yarn build-npm && yalc push", - "publish-npm": "npm publish", - coverage: "KARMA_COVERAGE=1 karma start --browsers='Chrome' --singleRun", - test: "yarn && yarn build-deps && karma start", - "test-dev": "karma start", - "test-ci": "./scripts/test-ci.sh", - "test-snippets": "yarn && yarn build-deps && yarn build && ts-node --skip-ignore -s ./scripts/test_snippets.ts", - "test-snippets-ci": "ts-node --skip-ignore -s ./scripts/test_snippets.ts", - "run-browserstack": "karma start --browsers='bs_chrome_mac' --singleRun --reporters='dots,karma-typescript'", - lint: "tslint -p . -t verbose" -}; -var peerDependencies2 = { - "@tensorflow/tfjs-core": "3.6.0" -}; -var package_default4 = { - name: name4, - version: version4, - description: description4, - license: license4, - private: private5, - main: main4, - types: types4, - "jsnext:main": jsnext_main3, - module: module4, - jsdelivr: jsdelivr4, - unpkg: unpkg4, - miniprogram: miniprogram4, - devDependencies: devDependencies4, - scripts: scripts4, - peerDependencies: peerDependencies2 -}; -var package_exports5 = {}; -__export2(package_exports5, { - default: () => package_default5, - description: () => description5, - devDependencies: () => devDependencies5, - jsdelivr: () => jsdelivr5, - "jsnext:main": () => jsnext_main4, - license: () => license5, - main: () => main5, - miniprogram: () => miniprogram5, - module: () => module5, - name: () => name5, - peerDependencies: () => peerDependencies3, - repository: () => repository3, - scripts: () => scripts5, - types: () => types5, - unpkg: () => unpkg5, - version: () => version5 -}); -var name5 = "@tensorflow/tfjs-converter"; -var version5 = "3.6.0"; -var description5 = "Tensorflow model converter for javascript"; -var main5 = "dist/tf-converter.node.js"; -var jsnext_main4 = "dist/index.js"; -var module5 = "dist/index.js"; -var types5 = "dist/index.d.ts"; -var unpkg5 = "dist/tf-converter.min.js"; -var jsdelivr5 = "dist/tf-converter.min.js"; -var miniprogram5 = "dist/miniprogram"; -var repository3 = { - type: "git", - url: "https://github.com/tensorflow/tfjs-converter.git" -}; -var license5 = "Apache-2.0"; -var peerDependencies3 = { - "@tensorflow/tfjs-core": "3.6.0" -}; -var devDependencies5 = { - "@rollup/plugin-commonjs": "^11.0.2", - "@rollup/plugin-node-resolve": "^7.1.1", - "@rollup/plugin-replace": "^2.3.3", - "@rollup/plugin-typescript": "^3.0.0", - "@tensorflow/tfjs-backend-cpu": "3.6.0", - "@tensorflow/tfjs-core": "3.6.0", - "@types/argparse": "^1.0.38", - "@types/deep-equal": "^1.0.1", - "@types/jasmine": "~2.8.6", - "@types/long": "~3.0.32", - "@types/node-fetch": "1.6.9", - ajv: "~6.3.0", - argparse: "^1.0.10", - "babel-core": "~6.26.3", - "babel-plugin-external-helpers": "~6.22.0", - "babel-preset-env": "~1.7.0", - "clang-format": "~1.2.2", - copyfiles: "~1.2.0", - "deep-equal": "^1.0.1", - "jasmine-core": "~3.5.0", - "node-fetch": "~2.6.1", - opn: "~5.1.0", - protobufjs: "~6.8.6", - rimraf: "~2.6.2", - rollup: "~2.3.2", - "rollup-plugin-terser": "~7.0.2", - "rollup-plugin-visualizer": "~3.3.2", - "ts-morph": "^7.1.3", - "ts-node": "~8.8.2", - tslint: "~6.1.3", - "tslint-no-circular-imports": "~0.7.0", - typescript: "3.5.3", - yalc: "~1.0.0-pre.50" -}; -var scripts5 = { - build: "yarn gen-json --test && yarn gen-kernel2ops && tsc && yarn bundle", - "build-ci": "yarn gen-json --test && yarn gen-kernel2ops && tsc && yarn bundle-ci", - bundle: "rollup -c", - "bundle-ci": "rollup -c --ci", - "build-core": "cd ../tfjs-core && yarn && yarn build", - "build-backend-cpu": "cd ../tfjs-backend-cpu && yarn && yarn build", - "build-backend-cpu-ci": "cd ../tfjs-backend-cpu && yarn && yarn build-ci", - "build-core-ci": "cd ../tfjs-core && yarn && yarn build-ci", - "build-deps": "yarn build-core && yarn build-backend-cpu", - "build-deps-ci": "yarn build-core-ci && yarn build-backend-cpu", - "build-npm": "./scripts/build-npm.sh", - "link-local": "yalc link", - "publish-local": "yarn build-npm && yalc push", - "publish-npm": "npm publish", - test: "yarn && yarn build-deps && yarn build && yarn gen-json --test && yarn gen-kernel2ops && ts-node --transpile-only -P tsconfig.test.json src/run_tests.ts", - "test-ci": "ts-node --transpile-only --skip-ignore -P tsconfig.test.json src/run_tests.ts", - "test-dev": "tsc && ts-node --transpile-only -P tsconfig.test.json src/run_tests.ts", - "test-snippets": "yarn && yarn build-deps && yarn build && ts-node --skip-ignore -s ./scripts/test_snippets.ts", - "test-snippets-ci": "ts-node --skip-ignore -s ./scripts/test_snippets.ts", - lint: "tslint -p . -t verbose", - "make-version": "sh -c ./scripts/make-version", - "gen-doc": "ts-node -s ./scripts/gen_doc.ts", - "gen-json": "ts-node -s ./scripts/gen_json.ts", - "model-summary": "ts-node -s ./tools/model_summary.ts", - pb2json: "ts-node -s ./tools/pb2json_converter.ts", - "build-pip-package": "yarn gen-json --test && cd python && ./build-pip-package.sh --test /tmp/tfjs-pips", - "run-python-tests": "yarn gen-json --test && cd python && ./run-python-tests.sh", - "gen-kernel2ops": "ts-node -s scripts/kernels_to_ops.ts --out metadata/kernel2op.json" -}; -var package_default5 = { - name: name5, - version: version5, - description: description5, - main: main5, - "jsnext:main": jsnext_main4, - module: module5, - types: types5, - unpkg: unpkg5, - jsdelivr: jsdelivr5, - miniprogram: miniprogram5, - repository: repository3, - license: license5, - peerDependencies: peerDependencies3, - devDependencies: devDependencies5, - scripts: scripts5 -}; -var EPSILON_FLOAT32 = 1e-7; -var EPSILON_FLOAT16 = 1e-4; -var DataStorage = class { - constructor(backend22, dataMover) { - this.backend = backend22; - this.dataMover = dataMover; - this.data = new WeakMap(); - this.dataIdsCount = 0; - } - get(dataId) { - if (!this.data.has(dataId)) { - this.dataMover.moveData(this.backend, dataId); - } - return this.data.get(dataId); - } - set(dataId, value) { - this.dataIdsCount++; - this.data.set(dataId, value); - } - has(dataId) { - return this.data.has(dataId); - } - delete(dataId) { - this.dataIdsCount--; - return this.data.delete(dataId); - } - numDataIds() { - return this.dataIdsCount; - } -}; -var KernelBackend = class { - refCount(dataId) { - return notYetImplemented("refCount"); - } - incRef(dataId) { - return notYetImplemented("incRef"); - } - timerAvailable() { - return true; - } - time(f) { - return notYetImplemented("time"); - } - read(dataId) { - return notYetImplemented("read"); - } - readSync(dataId) { - return notYetImplemented("readSync"); - } - numDataIds() { - return notYetImplemented("numDataIds"); - } - disposeData(dataId, force) { - return notYetImplemented("disposeData"); - } - write(values, shape, dtype) { - return notYetImplemented("write"); - } - move(dataId, values, shape, dtype, refCount) { - return notYetImplemented("move"); - } - memory() { - return notYetImplemented("memory"); - } - floatPrecision() { - return notYetImplemented("floatPrecision"); - } - epsilon() { - return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16; - } - dispose() { - return notYetImplemented("dispose"); - } -}; -function notYetImplemented(kernelName) { - throw new Error(`'${kernelName}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`); -} -function shuffle(array2) { - let counter = array2.length; - let temp = 0; - let index = 0; - while (counter > 0) { - index = Math.random() * counter | 0; - counter--; - temp = array2[counter]; - array2[counter] = array2[index]; - array2[index] = temp; - } -} -function shuffleCombo(array2, array22) { - if (array2.length !== array22.length) { - throw new Error(`Array sizes must match to be shuffled together First array length was ${array2.length}Second array length was ${array22.length}`); - } - let counter = array2.length; - let temp, temp2; - let index = 0; - while (counter > 0) { - index = Math.random() * counter | 0; - counter--; - temp = array2[counter]; - temp2 = array22[counter]; - array2[counter] = array2[index]; - array22[counter] = array22[index]; - array2[index] = temp; - array22[index] = temp2; - } -} -function clamp(min6, x, max6) { - return Math.max(min6, Math.min(x, max6)); -} -function nearestLargerEven(val) { - return val % 2 === 0 ? val : val + 1; -} -function sum(arr) { - let sum6 = 0; - for (let i = 0; i < arr.length; i++) { - sum6 += arr[i]; - } - return sum6; -} -function randUniform(a, b) { - const r = Math.random(); - return b * r + (1 - r) * a; -} -function distSquared(a, b) { - let result = 0; - for (let i = 0; i < a.length; i++) { - const diff = Number(a[i]) - Number(b[i]); - result += diff * diff; - } - return result; -} -function assert(expr, msg) { - if (!expr) { - throw new Error(typeof msg === "string" ? msg : msg()); - } -} -function assertShapesMatch(shapeA, shapeB, errorMessagePrefix = "") { - assert(arraysEqual(shapeA, shapeB), () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`); -} -function assertNonNull(a) { - assert(a != null, () => `The input to the tensor constructor must be a non-null value.`); -} -function flatten(arr, result = [], skipTypedArray = false) { - if (result == null) { - result = []; - } - if (Array.isArray(arr) || isTypedArray(arr) && !skipTypedArray) { - for (let i = 0; i < arr.length; ++i) { - flatten(arr[i], result, skipTypedArray); - } - } else { - result.push(arr); - } - return result; -} -function sizeFromShape(shape) { - if (shape.length === 0) { - return 1; - } - let size = shape[0]; - for (let i = 1; i < shape.length; i++) { - size *= shape[i]; - } - return size; -} -function isScalarShape(shape) { - return shape.length === 0; -} -function arraysEqual(n1, n2) { - if (n1 === n2) { - return true; - } - if (n1 == null || n2 == null) { - return false; - } - if (n1.length !== n2.length) { - return false; - } - for (let i = 0; i < n1.length; i++) { - if (n1[i] !== n2[i]) { - return false; - } - } - return true; -} -function isInt(a) { - return a % 1 === 0; -} -function tanh(x) { - if (Math.tanh != null) { - return Math.tanh(x); - } - if (x === Infinity) { - return 1; - } else if (x === -Infinity) { - return -1; - } else { - const e2x = Math.exp(2 * x); - return (e2x - 1) / (e2x + 1); - } -} -function sizeToSquarishShape(size) { - const width = Math.ceil(Math.sqrt(size)); - return [width, Math.ceil(size / width)]; -} -function createShuffledIndices(n) { - const shuffledIndices = new Uint32Array(n); - for (let i = 0; i < n; ++i) { - shuffledIndices[i] = i; - } - shuffle(shuffledIndices); - return shuffledIndices; -} -function rightPad(a, size) { - if (size <= a.length) { - return a; - } - return a + " ".repeat(size - a.length); -} -function repeatedTry(checkFn, delayFn = (counter) => 0, maxCounter) { - return new Promise((resolve, reject) => { - let tryCount = 0; - const tryFn = () => { - if (checkFn()) { - resolve(); - return; - } - tryCount++; - const nextBackoff = delayFn(tryCount); - if (maxCounter != null && tryCount >= maxCounter) { - reject(); - return; - } - setTimeout(tryFn, nextBackoff); - }; - tryFn(); - }); -} -function inferFromImplicitShape(shape, size) { - let shapeProd = 1; - let implicitIdx = -1; - for (let i = 0; i < shape.length; ++i) { - if (shape[i] >= 0) { - shapeProd *= shape[i]; - } else if (shape[i] === -1) { - if (implicitIdx !== -1) { - throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${implicitIdx} and dim ${i}`); - } - implicitIdx = i; - } else if (shape[i] < 0) { - throw Error(`Shapes can not be < 0. Found ${shape[i]} at dim ${i}`); - } - } - if (implicitIdx === -1) { - if (size > 0 && size !== shapeProd) { - throw Error(`Size(${size}) must match the product of shape ${shape}`); - } - return shape; - } - if (shapeProd === 0) { - throw Error(`Cannot infer the missing size in [${shape}] when there are 0 elements`); - } - if (size % shapeProd !== 0) { - throw Error(`The implicit shape can't be a fractional number. Got ${size} / ${shapeProd}`); - } - const newShape = shape.slice(); - newShape[implicitIdx] = size / shapeProd; - return newShape; -} -function parseAxisParam(axis, shape) { - const rank = shape.length; - axis = axis == null ? shape.map((s, i) => i) : [].concat(axis); - assert(axis.every((ax) => ax >= -rank && ax < rank), () => `All values in axis param must be in range [-${rank}, ${rank}) but got axis ${axis}`); - assert(axis.every((ax) => isInt(ax)), () => `All values in axis param must be integers but got axis ${axis}`); - return axis.map((a) => a < 0 ? rank + a : a); -} -function squeezeShape(shape, axis) { - const newShape = []; - const keptDims = []; - const isEmptyArray = axis != null && Array.isArray(axis) && axis.length === 0; - const axes = axis == null || isEmptyArray ? null : parseAxisParam(axis, shape).sort(); - let j = 0; - for (let i = 0; i < shape.length; ++i) { - if (axes != null) { - if (axes[j] === i && shape[i] !== 1) { - throw new Error(`Can't squeeze axis ${i} since its dim '${shape[i]}' is not 1`); - } - if ((axes[j] == null || axes[j] > i) && shape[i] === 1) { - newShape.push(shape[i]); - keptDims.push(i); - } - if (axes[j] <= i) { - j++; - } - } - if (shape[i] !== 1) { - newShape.push(shape[i]); - keptDims.push(i); - } - } - return { newShape, keptDims }; -} -function getTypedArrayFromDType(dtype, size) { - let values = null; - if (dtype == null || dtype === "float32") { - values = new Float32Array(size); - } else if (dtype === "int32") { - values = new Int32Array(size); - } else if (dtype === "bool") { - values = new Uint8Array(size); - } else { - throw new Error(`Unknown data type ${dtype}`); - } - return values; -} -function getArrayFromDType(dtype, size) { - let values = null; - if (dtype == null || dtype === "float32") { - values = new Float32Array(size); - } else if (dtype === "int32") { - values = new Int32Array(size); - } else if (dtype === "bool") { - values = new Uint8Array(size); - } else if (dtype === "string") { - values = new Array(size); - } else { - throw new Error(`Unknown data type ${dtype}`); - } - return values; -} -function checkConversionForErrors(vals, dtype) { - for (let i = 0; i < vals.length; i++) { - const num = vals[i]; - if (isNaN(num) || !isFinite(num)) { - throw Error(`A tensor of type ${dtype} being uploaded contains ${num}.`); - } - } -} -function isValidDtype(dtype) { - return dtype === "bool" || dtype === "complex64" || dtype === "float32" || dtype === "int32" || dtype === "string"; -} -function hasEncodingLoss(oldType, newType) { - if (newType === "complex64") { - return false; - } - if (newType === "float32" && oldType !== "complex64") { - return false; - } - if (newType === "int32" && oldType !== "float32" && oldType !== "complex64") { - return false; - } - if (newType === "bool" && oldType === "bool") { - return false; - } - return true; -} -function isTypedArray(a) { - return a instanceof Float32Array || a instanceof Int32Array || a instanceof Uint8Array; -} -function bytesPerElement(dtype) { - if (dtype === "float32" || dtype === "int32") { - return 4; - } else if (dtype === "complex64") { - return 8; - } else if (dtype === "bool") { - return 1; - } else { - throw new Error(`Unknown dtype ${dtype}`); - } -} -function bytesFromStringArray(arr) { - if (arr == null) { - return 0; - } - let bytes = 0; - arr.forEach((x) => bytes += x.length); - return bytes; -} -function isString(value) { - return typeof value === "string" || value instanceof String; -} -function isBoolean(value) { - return typeof value === "boolean"; -} -function isNumber(value) { - return typeof value === "number"; -} -function inferDtype(values) { - if (Array.isArray(values)) { - return inferDtype(values[0]); - } - if (values instanceof Float32Array) { - return "float32"; - } else if (values instanceof Int32Array || values instanceof Uint8Array) { - return "int32"; - } else if (isNumber(values)) { - return "float32"; - } else if (isString(values)) { - return "string"; - } else if (isBoolean(values)) { - return "bool"; - } - return "float32"; -} -function isFunction(f) { - return !!(f && f.constructor && f.call && f.apply); -} -function nearestDivisor(size, start) { - for (let i = start; i < size; ++i) { - if (size % i === 0) { - return i; - } - } - return size; -} -function computeStrides(shape) { - const rank = shape.length; - if (rank < 2) { - return []; - } - const strides = new Array(rank - 1); - strides[rank - 2] = shape[rank - 1]; - for (let i = rank - 3; i >= 0; --i) { - strides[i] = strides[i + 1] * shape[i + 1]; - } - return strides; -} -function createNestedArray(offset, shape, a, isComplex = false) { - const ret = new Array(); - if (shape.length === 1) { - const d = shape[0] * (isComplex ? 2 : 1); - for (let i = 0; i < d; i++) { - ret[i] = a[offset + i]; - } - } else { - const d = shape[0]; - const rest = shape.slice(1); - const len = rest.reduce((acc, c) => acc * c) * (isComplex ? 2 : 1); - for (let i = 0; i < d; i++) { - ret[i] = createNestedArray(offset + i * len, rest, a, isComplex); - } - } - return ret; -} -function toNestedArray(shape, a, isComplex = false) { - if (shape.length === 0) { - return a[0]; - } - const size = shape.reduce((acc, c) => acc * c) * (isComplex ? 2 : 1); - if (size === 0) { - return []; - } - if (size !== a.length) { - throw new Error(`[${shape}] does not match the input size ${a.length}${isComplex ? " for a complex tensor" : ""}.`); - } - return createNestedArray(0, shape, a, isComplex); -} -function makeOnesTypedArray(size, dtype) { - const array2 = makeZerosTypedArray(size, dtype); - for (let i = 0; i < array2.length; i++) { - array2[i] = 1; - } - return array2; -} -function makeZerosTypedArray(size, dtype) { - if (dtype == null || dtype === "float32" || dtype === "complex64") { - return new Float32Array(size); - } else if (dtype === "int32") { - return new Int32Array(size); - } else if (dtype === "bool") { - return new Uint8Array(size); - } else { - throw new Error(`Unknown data type ${dtype}`); - } -} -function makeZerosNestedTypedArray(shape, dtype) { - const size = shape.reduce((prev, curr) => prev * curr, 1); - if (dtype == null || dtype === "float32") { - return toNestedArray(shape, new Float32Array(size)); - } else if (dtype === "int32") { - return toNestedArray(shape, new Int32Array(size)); - } else if (dtype === "bool") { - return toNestedArray(shape, new Uint8Array(size)); - } else { - throw new Error(`Unknown data type ${dtype}`); - } -} -function assertNonNegativeIntegerDimensions(shape) { - shape.forEach((dimSize) => { - assert(Number.isInteger(dimSize) && dimSize >= 0, () => `Tensor must have a shape comprised of positive integers but got shape [${shape}].`); - }); -} -function locToIndex(locs, rank, strides) { - if (rank === 0) { - return 0; - } else if (rank === 1) { - return locs[0]; - } - let index = locs[locs.length - 1]; - for (let i = 0; i < locs.length - 1; ++i) { - index += strides[i] * locs[i]; - } - return index; -} -function indexToLoc(index, rank, strides) { - if (rank === 0) { - return []; - } else if (rank === 1) { - return [index]; - } - const locs = new Array(rank); - for (let i = 0; i < locs.length - 1; ++i) { - locs[i] = Math.floor(index / strides[i]); - index -= locs[i] * strides[i]; - } - locs[locs.length - 1] = index; - return locs; -} -function isPromise(object2) { - return object2 && object2.then && typeof object2.then === "function"; -} -var TENSORFLOWJS_FLAGS_PREFIX = "tfjsflags"; -var Environment = class { - constructor(global2) { - this.global = global2; - this.flags = {}; - this.flagRegistry = {}; - this.urlFlags = {}; - this.getQueryParams = getQueryParams; - this.populateURLFlags(); - } - setPlatform(platformName, platform) { - if (this.platform != null) { - console.warn(`Platform ${this.platformName} has already been set. Overwriting the platform with ${platform}.`); - } - this.platformName = platformName; - this.platform = platform; - } - registerFlag(flagName, evaluationFn, setHook) { - this.flagRegistry[flagName] = { evaluationFn, setHook }; - if (this.urlFlags[flagName] != null) { - const flagValue = this.urlFlags[flagName]; - console.warn(`Setting feature override from URL ${flagName}: ${flagValue}.`); - this.set(flagName, flagValue); - } - } - async getAsync(flagName) { - if (flagName in this.flags) { - return this.flags[flagName]; - } - this.flags[flagName] = await this.evaluateFlag(flagName); - return this.flags[flagName]; - } - get(flagName) { - if (flagName in this.flags) { - return this.flags[flagName]; - } - const flagValue = this.evaluateFlag(flagName); - if (isPromise(flagValue)) { - throw new Error(`Flag ${flagName} cannot be synchronously evaluated. Please use getAsync() instead.`); - } - this.flags[flagName] = flagValue; - return this.flags[flagName]; - } - getNumber(flagName) { - return this.get(flagName); - } - getBool(flagName) { - return this.get(flagName); - } - getFlags() { - return this.flags; - } - get features() { - return this.flags; - } - set(flagName, value) { - if (this.flagRegistry[flagName] == null) { - throw new Error(`Cannot set flag ${flagName} as it has not been registered.`); - } - this.flags[flagName] = value; - if (this.flagRegistry[flagName].setHook != null) { - this.flagRegistry[flagName].setHook(value); - } - } - evaluateFlag(flagName) { - if (this.flagRegistry[flagName] == null) { - throw new Error(`Cannot evaluate flag '${flagName}': no evaluation function found.`); - } - return this.flagRegistry[flagName].evaluationFn(); - } - setFlags(flags) { - this.flags = Object.assign({}, flags); - } - reset() { - this.flags = {}; - this.urlFlags = {}; - this.populateURLFlags(); - } - populateURLFlags() { - if (typeof this.global === "undefined" || typeof this.global.location === "undefined" || typeof this.global.location.search === "undefined") { - return; - } - const urlParams = this.getQueryParams(this.global.location.search); - if (TENSORFLOWJS_FLAGS_PREFIX in urlParams) { - const keyValues = urlParams[TENSORFLOWJS_FLAGS_PREFIX].split(","); - keyValues.forEach((keyValue) => { - const [key, value] = keyValue.split(":"); - this.urlFlags[key] = parseValue(key, value); - }); - } - } -}; -function getQueryParams(queryString) { - const params = {}; - queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (s, ...t) => { - decodeParam(params, t[0], t[1]); - return t.join("="); - }); - return params; -} -function decodeParam(params, name6, value) { - params[decodeURIComponent(name6)] = decodeURIComponent(value || ""); -} -function parseValue(flagName, value) { - value = value.toLowerCase(); - if (value === "true" || value === "false") { - return value === "true"; - } else if (`${+value}` === value) { - return +value; - } - throw new Error(`Could not parse value flag value ${value} for flag ${flagName}.`); -} -function env() { - return ENV; -} -var ENV = null; -function setEnvironmentGlobal(environment) { - ENV = environment; -} -var globalNameSpace; -function getGlobalNamespace() { - if (globalNameSpace == null) { - let ns; - if (typeof window !== "undefined") { - ns = window; - } else if (typeof global !== "undefined") { - ns = global; - } else if (typeof process !== "undefined") { - ns = process; - } else if (typeof self !== "undefined") { - ns = self; - } else { - throw new Error("Could not find a global object"); - } - globalNameSpace = ns; - } - return globalNameSpace; -} -function getGlobalMap() { - const ns = getGlobalNamespace(); - if (ns._tfGlobals == null) { - ns._tfGlobals = new Map(); - } - return ns._tfGlobals; -} -function getGlobal(key, init2) { - const globalMap = getGlobalMap(); - if (globalMap.has(key)) { - return globalMap.get(key); - } else { - const singleton = init2(); - globalMap.set(key, singleton); - return globalMap.get(key); - } -} -var Abs = "Abs"; -var Acos = "Acos"; -var Acosh = "Acosh"; -var Add = "Add"; -var AddN = "AddN"; -var All = "All"; -var Any = "Any"; -var ArgMax = "ArgMax"; -var ArgMin = "ArgMin"; -var Asin = "Asin"; -var Asinh = "Asinh"; -var Atan = "Atan"; -var Atanh = "Atanh"; -var Atan2 = "Atan2"; -var AvgPool = "AvgPool"; -var AvgPoolGrad = "AvgPoolGrad"; -var AvgPool3D = "AvgPool3D"; -var AvgPool3DGrad = "AvgPool3DGrad"; -var BatchMatMul = "BatchMatMul"; -var BatchToSpaceND = "BatchToSpaceND"; -var Bincount = "Bincount"; -var BroadcastTo = "BroadcastTo"; -var Cast = "Cast"; -var Ceil = "Ceil"; -var ClipByValue = "ClipByValue"; -var Complex = "Complex"; -var ComplexAbs = "ComplexAbs"; -var Concat = "Concat"; -var Conv2D = "Conv2D"; -var Conv2DBackpropFilter = "Conv2DBackpropFilter"; -var Conv2DBackpropInput = "Conv2DBackpropInput"; -var Conv3D = "Conv3D"; -var Conv3DBackpropFilterV2 = "Conv3DBackpropFilterV2"; -var Conv3DBackpropInputV2 = "Conv3DBackpropInputV2"; -var Cos = "Cos"; -var Cosh = "Cosh"; -var Cumsum = "Cumsum"; -var CropAndResize = "CropAndResize"; -var DenseBincount = "DenseBincount"; -var DepthToSpace = "DepthToSpace"; -var DepthwiseConv2dNative = "DepthwiseConv2dNative"; -var DepthwiseConv2dNativeBackpropFilter = "DepthwiseConv2dNativeBackpropFilter"; -var DepthwiseConv2dNativeBackpropInput = "DepthwiseConv2dNativeBackpropInput"; -var Diag = "Diag"; -var Dilation2D = "Dilation2D"; -var Dilation2DBackpropInput = "Dilation2DBackpropInput"; -var Dilation2DBackpropFilter = "Dilation2DBackpropFilter"; -var RealDiv = "RealDiv"; -var Einsum = "Einsum"; -var Elu = "Elu"; -var EluGrad = "EluGrad"; -var Erf = "Erf"; -var Equal = "Equal"; -var Exp = "Exp"; -var ExpandDims = "ExpandDims"; -var Expm1 = "Expm1"; -var FFT = "FFT"; -var Fill = "Fill"; -var FlipLeftRight = "FlipLeftRight"; -var Floor = "Floor"; -var FloorDiv = "FloorDiv"; -var FusedBatchNorm = "FusedBatchNorm"; -var GatherV2 = "GatherV2"; -var GatherNd = "GatherNd"; -var Greater = "Greater"; -var GreaterEqual = "GreaterEqual"; -var Identity = "Identity"; -var IFFT = "IFFT"; -var Imag = "Imag"; -var IsFinite = "IsFinite"; -var IsInf = "IsInf"; -var IsNan = "IsNan"; -var LeakyRelu = "LeakyRelu"; -var Less = "Less"; -var LessEqual = "LessEqual"; -var LinSpace = "LinSpace"; -var Log = "Log"; -var Log1p = "Log1p"; -var LogicalAnd = "LogicalAnd"; -var LogicalNot = "LogicalNot"; -var LogicalOr = "LogicalOr"; -var LogSoftmax = "LogSoftmax"; -var LRN = "LRN"; -var LRNGrad = "LRNGrad"; -var Max = "Max"; -var Maximum = "Maximum"; -var MaxPool = "MaxPool"; -var MaxPoolGrad = "MaxPoolGrad"; -var MaxPool3D = "MaxPool3D"; -var MaxPool3DGrad = "MaxPool3DGrad"; -var MaxPoolWithArgmax = "MaxPoolWithArgmax"; -var Mean = "Mean"; -var Min = "Min"; -var Minimum = "Minimum"; -var MirrorPad = "MirrorPad"; -var Mod = "Mod"; -var Multinomial = "Multinomial"; -var Multiply = "Multiply"; -var Neg = "Neg"; -var NotEqual = "NotEqual"; -var NonMaxSuppressionV3 = "NonMaxSuppressionV3"; -var NonMaxSuppressionV4 = "NonMaxSuppressionV4"; -var NonMaxSuppressionV5 = "NonMaxSuppressionV5"; -var OnesLike = "OnesLike"; -var OneHot = "OneHot"; -var Pack = "Pack"; -var PadV2 = "PadV2"; -var Pool = "Pool"; -var Pow = "Pow"; -var Prelu = "Prelu"; -var Prod = "Prod"; -var Range = "Range"; -var Real = "Real"; -var Reciprocal = "Reciprocal"; -var Relu = "Relu"; -var Reshape = "Reshape"; -var ResizeNearestNeighbor = "ResizeNearestNeighbor"; -var ResizeNearestNeighborGrad = "ResizeNearestNeighborGrad"; -var ResizeBilinear = "ResizeBilinear"; -var ResizeBilinearGrad = "ResizeBilinearGrad"; -var Relu6 = "Relu6"; -var Reverse = "Reverse"; -var Round = "Round"; -var Rsqrt = "Rsqrt"; -var ScatterNd = "ScatterNd"; -var Select = "Select"; -var Selu = "Selu"; -var Slice = "Slice"; -var Sin = "Sin"; -var Sinh = "Sinh"; -var Sign = "Sign"; -var Sigmoid = "Sigmoid"; -var Softplus = "Softplus"; -var Sqrt = "Sqrt"; -var Sum = "Sum"; -var SpaceToBatchND = "SpaceToBatchND"; -var SplitV = "SplitV"; -var Softmax = "Softmax"; -var SparseFillEmptyRows = "SparseFillEmptyRows"; -var SparseReshape = "SparseReshape"; -var SparseToDense = "SparseToDense"; -var SquaredDifference = "SquaredDifference"; -var Square = "Square"; -var StridedSlice = "StridedSlice"; -var Sub = "Sub"; -var Tan = "Tan"; -var Tanh = "Tanh"; -var Tile = "Tile"; -var TopK = "TopK"; -var Transform = "Transform"; -var Transpose = "Transpose"; -var Unique = "Unique"; -var Unpack = "Unpack"; -var UnsortedSegmentSum = "UnsortedSegmentSum"; -var ZerosLike = "ZerosLike"; -var Step = "Step"; -var FromPixels = "FromPixels"; -var RotateWithOffset = "RotateWithOffset"; -var _FusedMatMul = "_FusedMatMul"; -var FusedConv2D = "FusedConv2D"; -var FusedDepthwiseConv2D = "FusedDepthwiseConv2D"; -var kernelRegistry = getGlobal("kernelRegistry", () => new Map()); -var gradRegistry = getGlobal("gradRegistry", () => new Map()); -function getKernel(kernelName, backendName) { - const key = makeKey(kernelName, backendName); - return kernelRegistry.get(key); -} -function getGradient(kernelName) { - return gradRegistry.get(kernelName); -} -function getKernelsForBackend(backendName) { - const it = kernelRegistry.entries(); - const result = []; - while (true) { - const { done, value } = it.next(); - if (done) { - break; - } - const [key, config3] = value; - const [backend22] = key.split("_"); - if (backend22 === backendName) { - result.push(config3); - } - } - return result; -} -function registerKernel(config3) { - const { kernelName, backendName } = config3; - const key = makeKey(kernelName, backendName); - if (kernelRegistry.has(key)) { - console.warn(`The kernel '${kernelName}' for backend '${backendName}' is already registered`); - } - kernelRegistry.set(key, config3); -} -function registerGradient(config3) { - const { kernelName } = config3; - if (gradRegistry.has(kernelName)) { - if (env().getBool("DEBUG")) { - console.warn(`Overriding the gradient for '${kernelName}'`); - } - } - gradRegistry.set(kernelName, config3); -} -function unregisterKernel(kernelName, backendName) { - const key = makeKey(kernelName, backendName); - if (!kernelRegistry.has(key)) { - throw new Error(`The kernel '${kernelName}' for backend '${backendName}' is not registered`); - } - kernelRegistry.delete(key); -} -function unregisterGradient(kernelName) { - if (!gradRegistry.has(kernelName)) { - throw new Error(`The gradient '${kernelName}' for backend is not registered`); - } - gradRegistry.delete(kernelName); -} -function copyRegisteredKernels(registeredBackendName, newBackendName) { - const kernels = getKernelsForBackend(registeredBackendName); - kernels.forEach((kernelConfig) => { - const newKernelConfig = Object.assign({}, kernelConfig, { backendName: newBackendName }); - registerKernel(newKernelConfig); - }); -} -function makeKey(kernelName, backendName) { - return `${backendName}_${kernelName}`; -} -var util_exports = {}; -__export2(util_exports, { - arraysEqual: () => arraysEqual, - assert: () => assert, - assertNonNegativeIntegerDimensions: () => assertNonNegativeIntegerDimensions, - assertNonNull: () => assertNonNull, - assertShapesMatch: () => assertShapesMatch, - bytesFromStringArray: () => bytesFromStringArray, - bytesPerElement: () => bytesPerElement, - checkConversionForErrors: () => checkConversionForErrors, - clamp: () => clamp, - computeStrides: () => computeStrides, - createScalarValue: () => createScalarValue, - createShuffledIndices: () => createShuffledIndices, - decodeString: () => decodeString, - distSquared: () => distSquared, - encodeString: () => encodeString, - fetch: () => fetch2, - flatten: () => flatten, - getArrayFromDType: () => getArrayFromDType, - getTypedArrayFromDType: () => getTypedArrayFromDType, - hasEncodingLoss: () => hasEncodingLoss, - indexToLoc: () => indexToLoc, - inferDtype: () => inferDtype, - inferFromImplicitShape: () => inferFromImplicitShape, - isBoolean: () => isBoolean, - isFunction: () => isFunction, - isInt: () => isInt, - isNumber: () => isNumber, - isPromise: () => isPromise, - isScalarShape: () => isScalarShape, - isString: () => isString, - isTypedArray: () => isTypedArray, - isValidDtype: () => isValidDtype, - locToIndex: () => locToIndex, - makeOnesTypedArray: () => makeOnesTypedArray, - makeZerosNestedTypedArray: () => makeZerosNestedTypedArray, - makeZerosTypedArray: () => makeZerosTypedArray, - nearestDivisor: () => nearestDivisor, - nearestLargerEven: () => nearestLargerEven, - now: () => now2, - parseAxisParam: () => parseAxisParam, - randUniform: () => randUniform, - repeatedTry: () => repeatedTry, - rightPad: () => rightPad, - shuffle: () => shuffle, - shuffleCombo: () => shuffleCombo, - sizeFromShape: () => sizeFromShape, - sizeToSquarishShape: () => sizeToSquarishShape, - squeezeShape: () => squeezeShape, - sum: () => sum, - tanh: () => tanh, - toNestedArray: () => toNestedArray, - toTypedArray: () => toTypedArray -}); -function createScalarValue(value, dtype) { - if (dtype === "string") { - return encodeString(value); - } - return toTypedArray([value], dtype); -} -function noConversionNeeded(a, dtype) { - return a instanceof Float32Array && dtype === "float32" || a instanceof Int32Array && dtype === "int32" || a instanceof Uint8Array && dtype === "bool"; -} -function toTypedArray(a, dtype) { - if (dtype === "string") { - throw new Error("Cannot convert a string[] to a TypedArray"); - } - if (Array.isArray(a)) { - a = flatten(a); - } - if (env().getBool("DEBUG")) { - checkConversionForErrors(a, dtype); - } - if (noConversionNeeded(a, dtype)) { - return a; - } - if (dtype == null || dtype === "float32" || dtype === "complex64") { - return new Float32Array(a); - } else if (dtype === "int32") { - return new Int32Array(a); - } else if (dtype === "bool") { - const bool = new Uint8Array(a.length); - for (let i = 0; i < bool.length; ++i) { - if (Math.round(a[i]) !== 0) { - bool[i] = 1; - } - } - return bool; - } else { - throw new Error(`Unknown data type ${dtype}`); - } -} -function now2() { - return env().platform.now(); -} -function fetch2(path, requestInits) { - return env().platform.fetch(path, requestInits); -} -function encodeString(s, encoding = "utf-8") { - encoding = encoding || "utf-8"; - return env().platform.encode(s, encoding); -} -function decodeString(bytes, encoding = "utf-8") { - encoding = encoding || "utf-8"; - return env().platform.decode(bytes, encoding); -} -var Profiler = class { - constructor(backendTimer, logger) { - this.backendTimer = backendTimer; - this.logger = logger; - if (logger == null) { - this.logger = new Logger(); - } - } - profileKernel(kernelName, inputs, f) { - let outputs; - const holdResultWrapperFn = () => { - outputs = f(); - }; - let timer; - const start = now2(); - if (this.backendTimer.timerAvailable()) { - timer = this.backendTimer.time(holdResultWrapperFn); - } else { - holdResultWrapperFn(); - for (const output of outputs) { - output.dataSync(); - } - timer = Promise.resolve({ kernelMs: now2() - start }); - } - if (env().getBool("CHECK_COMPUTATION_FOR_ERRORS")) { - for (let i = 0; i < outputs.length; i++) { - const output = outputs[i]; - output.data().then((tensorVals) => { - checkComputationForErrors(tensorVals, output.dtype, kernelName); - }); - } - } - const kernelProfile = { - kernelName, - outputs, - inputs, - timeMs: timer.then((timing) => timing.kernelMs), - extraInfo: timer.then((timing) => timing.getExtraProfileInfo != null ? timing.getExtraProfileInfo() : "") - }; - return kernelProfile; - } - logKernelProfile(kernelProfile) { - const { kernelName, outputs, timeMs, inputs, extraInfo } = kernelProfile; - outputs.forEach((result) => { - Promise.all([result.data(), timeMs, extraInfo]).then((valueContainer) => { - this.logger.logKernelProfile(kernelName, result, valueContainer[0], valueContainer[1], inputs, valueContainer[2]); - }); - }); - } -}; -function checkComputationForErrors(vals, dtype, kernelName) { - if (dtype !== "float32") { - return false; - } - for (let i = 0; i < vals.length; i++) { - const num = vals[i]; - if (isNaN(num) || !isFinite(num)) { - console.warn(`Found ${num} in the result of '${kernelName}'`); - return true; - } - } - return false; -} -var Logger = class { - logKernelProfile(name6, result, vals, timeMs, inputs, extraInfo) { - const time2 = typeof timeMs === "number" ? rightPad(`${timeMs}ms`, 9) : timeMs["error"]; - const paddedName = rightPad(name6, 25); - const rank = result.rank; - const size = result.size; - const shape = rightPad(result.shape.toString(), 14); - let inputShapesDescription = ""; - for (const name7 in inputs) { - const input2 = inputs[name7]; - if (input2 != null) { - const inputShape = input2.shape || result.shape; - const inputRank = inputShape.length; - inputShapesDescription += `${name7}: ${inputRank}D ${inputRank > 0 ? inputShape : ""} `; - } - } - console.log(`%c${paddedName} %c${time2} %c${rank}D ${shape} %c${size} %c${inputShapesDescription} %c${extraInfo}`, "font-weight:bold", "color:red", "color:blue", "color: orange", "color: green", "color: steelblue"); - } -}; -function getFilteredNodesXToY(tape, xs, y) { - const tensorsFromX = {}; - const nodesFromX = {}; - for (let i = 0; i < xs.length; i++) { - tensorsFromX[xs[i].id] = true; - } - for (let i = 0; i < tape.length; i++) { - const node = tape[i]; - const nodeInputs = node.inputs; - for (const inputName in nodeInputs) { - const input2 = nodeInputs[inputName]; - let anyInputFromX = false; - for (let j = 0; j < xs.length; j++) { - if (tensorsFromX[input2.id]) { - node.outputs.forEach((output) => tensorsFromX[output.id] = true); - anyInputFromX = true; - nodesFromX[node.id] = true; - break; - } - } - if (anyInputFromX) { - break; - } - } - } - const tensorsLeadToY = {}; - tensorsLeadToY[y.id] = true; - const nodesToY = {}; - for (let i = tape.length - 1; i >= 0; i--) { - const node = tape[i]; - const nodeInputs = node.inputs; - for (let j = 0; j < node.outputs.length; j++) { - if (tensorsLeadToY[node.outputs[j].id]) { - for (const inputName in nodeInputs) { - tensorsLeadToY[nodeInputs[inputName].id] = true; - nodesToY[node.id] = true; - } - break; - } - } - } - const filteredTape = []; - for (let i = 0; i < tape.length; i++) { - const node = tape[i]; - if (nodesFromX[node.id] && nodesToY[node.id]) { - const prunedInputs = {}; - for (const inputName in node.inputs) { - const nodeInput = node.inputs[inputName]; - if (tensorsFromX[nodeInput.id]) { - prunedInputs[inputName] = nodeInput; - } - } - const prunedNode = Object.assign({}, node); - prunedNode.inputs = prunedInputs; - prunedNode.outputs = node.outputs; - filteredTape.push(prunedNode); - } - } - return filteredTape; -} -function backpropagateGradients(tensorAccumulatedGradientMap, filteredTape, tidy2, add5) { - for (let i = filteredTape.length - 1; i >= 0; i--) { - const node = filteredTape[i]; - const dys = []; - node.outputs.forEach((o) => { - const gradTensor = tensorAccumulatedGradientMap[o.id]; - if (gradTensor != null) { - dys.push(gradTensor); - } else { - dys.push(null); - } - }); - if (node.gradient == null) { - throw new Error(`Cannot compute gradient: gradient function not found for ${node.kernelName}.`); - } - const inputGradients = node.gradient(dys); - for (const inputName in node.inputs) { - if (!(inputName in inputGradients)) { - throw new Error(`Cannot backprop through input ${inputName}. Available gradients found: ${Object.keys(inputGradients)}.`); - } - const dx = tidy2(() => inputGradients[inputName]()); - if (dx.dtype !== "float32") { - throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input ${inputName} must have 'float32' dtype, but has '${dx.dtype}'`); - } - const x = node.inputs[inputName]; - if (!arraysEqual(dx.shape, x.shape)) { - throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input '${inputName}' has shape '${dx.shape}', which does not match the shape of the input '${x.shape}'`); - } - if (tensorAccumulatedGradientMap[x.id] == null) { - tensorAccumulatedGradientMap[x.id] = dx; - } else { - const curGradient = tensorAccumulatedGradientMap[x.id]; - tensorAccumulatedGradientMap[x.id] = add5(curGradient, dx); - curGradient.dispose(); - } - } - } -} -var FORMAT_LIMIT_NUM_VALS = 20; -var FORMAT_NUM_FIRST_LAST_VALS = 3; -var FORMAT_NUM_SIG_DIGITS = 7; -function tensorToString(vals, shape, dtype, verbose) { - const strides = computeStrides(shape); - const padPerCol = computeMaxSizePerColumn(vals, shape, dtype, strides); - const rank = shape.length; - const valsLines = subTensorToString(vals, shape, dtype, strides, padPerCol); - const lines2 = ["Tensor"]; - if (verbose) { - lines2.push(` dtype: ${dtype}`); - lines2.push(` rank: ${rank}`); - lines2.push(` shape: [${shape}]`); - lines2.push(` values:`); - } - lines2.push(valsLines.map((l) => " " + l).join("\n")); - return lines2.join("\n"); -} -function computeMaxSizePerColumn(vals, shape, dtype, strides) { - const n = sizeFromShape(shape); - const numCols = strides[strides.length - 1]; - const padPerCol = new Array(numCols).fill(0); - const rank = shape.length; - const valuesOrTuples = dtype === "complex64" ? createComplexTuples(vals) : vals; - if (rank > 1) { - for (let row = 0; row < n / numCols; row++) { - const offset = row * numCols; - for (let j = 0; j < numCols; j++) { - padPerCol[j] = Math.max(padPerCol[j], valToString(valuesOrTuples[offset + j], 0, dtype).length); - } - } - } - return padPerCol; -} -function valToString(val, pad3, dtype) { - let valStr; - if (Array.isArray(val)) { - valStr = `${parseFloat(val[0].toFixed(FORMAT_NUM_SIG_DIGITS))} + ${parseFloat(val[1].toFixed(FORMAT_NUM_SIG_DIGITS))}j`; - } else if (isString(val)) { - valStr = `'${val}'`; - } else if (dtype === "bool") { - valStr = boolNumToString(val); - } else { - valStr = parseFloat(val.toFixed(FORMAT_NUM_SIG_DIGITS)).toString(); - } - return rightPad(valStr, pad3); -} -function boolNumToString(v) { - return v === 0 ? "false" : "true"; -} -function subTensorToString(vals, shape, dtype, strides, padPerCol, isLast = true) { - const storagePerElement = dtype === "complex64" ? 2 : 1; - const size = shape[0]; - const rank = shape.length; - if (rank === 0) { - if (dtype === "complex64") { - const complexTuple = createComplexTuples(vals); - return [valToString(complexTuple[0], 0, dtype)]; - } - if (dtype === "bool") { - return [boolNumToString(vals[0])]; - } - return [vals[0].toString()]; - } - if (rank === 1) { - if (size > FORMAT_LIMIT_NUM_VALS) { - const firstValsSize = FORMAT_NUM_FIRST_LAST_VALS * storagePerElement; - let firstVals = Array.from(vals.slice(0, firstValsSize)); - let lastVals = Array.from(vals.slice((size - FORMAT_NUM_FIRST_LAST_VALS) * storagePerElement, size * storagePerElement)); - if (dtype === "complex64") { - firstVals = createComplexTuples(firstVals); - lastVals = createComplexTuples(lastVals); - } - return [ - "[" + firstVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + ", ..., " + lastVals.map((x, i) => valToString(x, padPerCol[size - FORMAT_NUM_FIRST_LAST_VALS + i], dtype)).join(", ") + "]" - ]; - } - const displayVals = dtype === "complex64" ? createComplexTuples(vals) : Array.from(vals); - return [ - "[" + displayVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + "]" - ]; - } - const subshape = shape.slice(1); - const substrides = strides.slice(1); - const stride = strides[0] * storagePerElement; - const lines2 = []; - if (size > FORMAT_LIMIT_NUM_VALS) { - for (let i = 0; i < FORMAT_NUM_FIRST_LAST_VALS; i++) { - const start = i * stride; - const end = start + stride; - lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, false)); - } - lines2.push("..."); - for (let i = size - FORMAT_NUM_FIRST_LAST_VALS; i < size; i++) { - const start = i * stride; - const end = start + stride; - lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); - } - } else { - for (let i = 0; i < size; i++) { - const start = i * stride; - const end = start + stride; - lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); - } - } - const sep = rank === 2 ? "," : ""; - lines2[0] = "[" + lines2[0] + sep; - for (let i = 1; i < lines2.length - 1; i++) { - lines2[i] = " " + lines2[i] + sep; - } - let newLineSep = ",\n"; - for (let i = 2; i < rank; i++) { - newLineSep += "\n"; - } - lines2[lines2.length - 1] = " " + lines2[lines2.length - 1] + "]" + (isLast ? "" : newLineSep); - return lines2; -} -function createComplexTuples(vals) { - const complexTuples = []; - for (let i = 0; i < vals.length; i += 2) { - complexTuples.push([vals[i], vals[i + 1]]); - } - return complexTuples; -} -var TensorBuffer = class { - constructor(shape, dtype, values) { - this.dtype = dtype; - this.shape = shape.slice(); - this.size = sizeFromShape(shape); - if (values != null) { - const n = values.length; - assert(n === this.size, () => `Length of values '${n}' does not match the size inferred by the shape '${this.size}'.`); - } - if (dtype === "complex64") { - throw new Error(`complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).`); - } - this.values = values || getArrayFromDType(dtype, this.size); - this.strides = computeStrides(shape); - } - set(value, ...locs) { - if (locs.length === 0) { - locs = [0]; - } - assert(locs.length === this.rank, () => `The number of provided coordinates (${locs.length}) must match the rank (${this.rank})`); - const index = this.locToIndex(locs); - this.values[index] = value; - } - get(...locs) { - if (locs.length === 0) { - locs = [0]; - } - let i = 0; - for (const loc of locs) { - if (loc < 0 || loc >= this.shape[i]) { - const msg = `Requested out of range element at ${locs}. Buffer shape=${this.shape}`; - throw new Error(msg); - } - i++; - } - let index = locs[locs.length - 1]; - for (let i2 = 0; i2 < locs.length - 1; ++i2) { - index += this.strides[i2] * locs[i2]; - } - return this.values[index]; - } - locToIndex(locs) { - if (this.rank === 0) { - return 0; - } else if (this.rank === 1) { - return locs[0]; - } - let index = locs[locs.length - 1]; - for (let i = 0; i < locs.length - 1; ++i) { - index += this.strides[i] * locs[i]; - } - return index; - } - indexToLoc(index) { - if (this.rank === 0) { - return []; - } else if (this.rank === 1) { - return [index]; - } - const locs = new Array(this.shape.length); - for (let i = 0; i < locs.length - 1; ++i) { - locs[i] = Math.floor(index / this.strides[i]); - index -= locs[i] * this.strides[i]; - } - locs[locs.length - 1] = index; - return locs; - } - get rank() { - return this.shape.length; - } - toTensor() { - return trackerFn().makeTensor(this.values, this.shape, this.dtype); - } -}; -var trackerFn = null; -var opHandler = null; -var deprecationWarningFn = null; -function setTensorTracker(fn) { - trackerFn = fn; -} -function setOpHandler(handler) { - opHandler = handler; -} -function setDeprecationWarningFn(fn) { - deprecationWarningFn = fn; -} -var Tensor = class { - constructor(shape, dtype, dataId, id) { - this.kept = false; - this.isDisposedInternal = false; - this.shape = shape.slice(); - this.dtype = dtype || "float32"; - this.size = sizeFromShape(shape); - this.strides = computeStrides(shape); - this.dataId = dataId; - this.id = id; - this.rankType = this.rank < 5 ? this.rank.toString() : "higher"; - } - get rank() { - return this.shape.length; - } - async buffer() { - const vals = await this.data(); - return opHandler.buffer(this.shape, this.dtype, vals); - } - bufferSync() { - return opHandler.buffer(this.shape, this.dtype, this.dataSync()); - } - async array() { - const vals = await this.data(); - return toNestedArray(this.shape, vals, this.dtype === "complex64"); - } - arraySync() { - return toNestedArray(this.shape, this.dataSync(), this.dtype === "complex64"); - } - async data() { - this.throwIfDisposed(); - const data = trackerFn().read(this.dataId); - if (this.dtype === "string") { - const bytes = await data; - try { - return bytes.map((b) => decodeString(b)); - } catch (_a) { - throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); - } - } - return data; - } - dataSync() { - this.throwIfDisposed(); - const data = trackerFn().readSync(this.dataId); - if (this.dtype === "string") { - try { - return data.map((b) => decodeString(b)); - } catch (_a) { - throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); - } - } - return data; - } - async bytes() { - this.throwIfDisposed(); - const data = await trackerFn().read(this.dataId); - if (this.dtype === "string") { - return data; - } else { - return new Uint8Array(data.buffer); - } - } - dispose() { - if (this.isDisposed) { - return; - } - trackerFn().disposeTensor(this); - this.isDisposedInternal = true; - } - get isDisposed() { - return this.isDisposedInternal; - } - throwIfDisposed() { - if (this.isDisposed) { - throw new Error(`Tensor is disposed.`); - } - } - print(verbose = false) { - return opHandler.print(this, verbose); - } - clone() { - this.throwIfDisposed(); - return opHandler.clone(this); - } - toString(verbose = false) { - const vals = this.dataSync(); - return tensorToString(vals, this.shape, this.dtype, verbose); - } - cast(dtype) { - this.throwIfDisposed(); - return opHandler.cast(this, dtype); - } - variable(trainable = true, name6, dtype) { - this.throwIfDisposed(); - return trackerFn().makeVariable(this, trainable, name6, dtype); - } -}; -Object.defineProperty(Tensor, Symbol.hasInstance, { - value: (instance) => { - return !!instance && instance.data != null && instance.dataSync != null && instance.throwIfDisposed != null; - } -}); -function getGlobalTensorClass() { - return getGlobal("Tensor", () => { - return Tensor; - }); -} -getGlobalTensorClass(); -var Variable = class extends Tensor { - constructor(initialValue, trainable, name6, tensorId) { - super(initialValue.shape, initialValue.dtype, initialValue.dataId, tensorId); - this.trainable = trainable; - this.name = name6; - } - assign(newValue) { - if (newValue.dtype !== this.dtype) { - throw new Error(`dtype of the new value (${newValue.dtype}) and previous value (${this.dtype}) must match`); - } - if (!arraysEqual(newValue.shape, this.shape)) { - throw new Error(`shape of the new value (${newValue.shape}) and previous value (${this.shape}) must match`); - } - trackerFn().disposeTensor(this); - this.dataId = newValue.dataId; - trackerFn().incRef(this, null); - } - dispose() { - trackerFn().disposeVariable(this); - this.isDisposedInternal = true; - } -}; -Object.defineProperty(Variable, Symbol.hasInstance, { - value: (instance) => { - return instance instanceof Tensor && instance.assign != null && instance.assign instanceof Function; - } -}); -var tensor_util_exports = {}; -__export2(tensor_util_exports, { - assertTypesMatch: () => assertTypesMatch, - getTensorsInContainer: () => getTensorsInContainer, - isTensorInList: () => isTensorInList, - makeTypesMatch: () => makeTypesMatch -}); -var Rank; -(function(Rank2) { - Rank2["R0"] = "R0"; - Rank2["R1"] = "R1"; - Rank2["R2"] = "R2"; - Rank2["R3"] = "R3"; - Rank2["R4"] = "R4"; - Rank2["R5"] = "R5"; - Rank2["R6"] = "R6"; -})(Rank || (Rank = {})); -var UpcastInt32AndMap; -(function(UpcastInt32AndMap2) { - UpcastInt32AndMap2["float32"] = "float32"; - UpcastInt32AndMap2["int32"] = "int32"; - UpcastInt32AndMap2["bool"] = "int32"; - UpcastInt32AndMap2["complex64"] = "complex64"; -})(UpcastInt32AndMap || (UpcastInt32AndMap = {})); -var UpcastBoolAndMap; -(function(UpcastBoolAndMap2) { - UpcastBoolAndMap2["float32"] = "float32"; - UpcastBoolAndMap2["int32"] = "int32"; - UpcastBoolAndMap2["bool"] = "bool"; - UpcastBoolAndMap2["complex64"] = "complex64"; -})(UpcastBoolAndMap || (UpcastBoolAndMap = {})); -var UpcastFloat32AndMap; -(function(UpcastFloat32AndMap2) { - UpcastFloat32AndMap2["float32"] = "float32"; - UpcastFloat32AndMap2["int32"] = "float32"; - UpcastFloat32AndMap2["bool"] = "float32"; - UpcastFloat32AndMap2["complex64"] = "complex64"; -})(UpcastFloat32AndMap || (UpcastFloat32AndMap = {})); -var UpcastComplex64AndMap; -(function(UpcastComplex64AndMap2) { - UpcastComplex64AndMap2["float32"] = "complex64"; - UpcastComplex64AndMap2["int32"] = "complex64"; - UpcastComplex64AndMap2["bool"] = "complex64"; - UpcastComplex64AndMap2["complex64"] = "complex64"; -})(UpcastComplex64AndMap || (UpcastComplex64AndMap = {})); -var upcastTypeMap = { - "float32": UpcastFloat32AndMap, - "int32": UpcastInt32AndMap, - "bool": UpcastBoolAndMap, - "complex64": UpcastComplex64AndMap -}; -function upcastType(typeA, typeB) { - if (typeA === "string" || typeB === "string") { - if (typeA === "string" && typeB === "string") { - return "string"; - } - throw new Error(`Can not upcast ${typeA} with ${typeB}`); - } - return upcastTypeMap[typeA][typeB]; -} -function sumOutType(type) { - return upcastType(type, "int32"); -} -function makeTypesMatch(a, b) { - if (a.dtype === b.dtype) { - return [a, b]; - } - const dtype = upcastType(a.dtype, b.dtype); - return [a.cast(dtype), b.cast(dtype)]; -} -function assertTypesMatch(a, b) { - assert(a.dtype === b.dtype, () => `The dtypes of the first(${a.dtype}) and second(${b.dtype}) input must match`); -} -function isTensorInList(tensor2, tensorList) { - return tensorList.some((x) => x.id === tensor2.id); -} -function getTensorsInContainer(result) { - const list = []; - const seen = new Set(); - walkTensorContainer(result, list, seen); - return list; -} -function walkTensorContainer(container, list, seen) { - if (container == null) { - return; - } - if (container instanceof Tensor) { - list.push(container); - return; - } - if (!isIterable(container)) { - return; - } - const iterable = container; - for (const k in iterable) { - const val = iterable[k]; - if (!seen.has(val)) { - seen.add(val); - walkTensorContainer(val, list, seen); - } - } -} -function isIterable(obj) { - return Array.isArray(obj) || typeof obj === "object"; -} -function isRegisteredKernelInvocation(kernelInvocation) { - return kernelInvocation.kernelName != null; -} -var EngineState = class { - constructor() { - this.registeredVariables = {}; - this.nextTapeNodeId = 0; - this.numBytes = 0; - this.numTensors = 0; - this.numStringTensors = 0; - this.numDataBuffers = 0; - this.gradientDepth = 0; - this.kernelDepth = 0; - this.scopeStack = []; - this.numDataMovesStack = []; - this.nextScopeId = 0; - this.tensorInfo = new WeakMap(); - this.profiling = false; - this.activeProfile = { - newBytes: 0, - newTensors: 0, - peakBytes: 0, - kernels: [], - result: null, - get kernelNames() { - return Array.from(new Set(this.kernels.map((k) => k.name))); - } - }; - } - dispose() { - for (const variableName in this.registeredVariables) { - this.registeredVariables[variableName].dispose(); - } - } -}; -var Engine = class { - constructor(ENV5) { - this.ENV = ENV5; - this.registry = {}; - this.registryFactory = {}; - this.pendingBackendInitId = 0; - this.state = new EngineState(); - } - async ready() { - if (this.pendingBackendInit != null) { - return this.pendingBackendInit.then(() => { - }); - } - if (this.backendInstance != null) { - return; - } - const sortedBackends = this.getSortedBackends(); - for (let i = 0; i < sortedBackends.length; i++) { - const backendName = sortedBackends[i]; - const success = await this.initializeBackend(backendName).success; - if (success) { - await this.setBackend(backendName); - return; - } - } - throw new Error(`Could not initialize any backends, all backend initializations failed.`); - } - get backend() { - if (this.pendingBackendInit != null) { - throw new Error(`Backend '${this.backendName}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); - } - if (this.backendInstance == null) { - const { name: name6, asyncInit } = this.initializeBackendsAndReturnBest(); - if (asyncInit) { - throw new Error(`The highest priority backend '${name6}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); - } - this.setBackend(name6); - } - return this.backendInstance; - } - backendNames() { - return Object.keys(this.registryFactory); - } - findBackend(backendName) { - if (!(backendName in this.registry)) { - if (backendName in this.registryFactory) { - const { asyncInit } = this.initializeBackend(backendName); - if (asyncInit) { - return null; - } - } else { - return null; - } - } - return this.registry[backendName]; - } - findBackendFactory(backendName) { - if (!(backendName in this.registryFactory)) { - return null; - } - return this.registryFactory[backendName].factory; - } - registerBackend(backendName, factory, priority = 1) { - if (backendName in this.registryFactory) { - console.warn(`${backendName} backend was already registered. Reusing existing backend factory.`); - return false; - } - this.registryFactory[backendName] = { factory, priority }; - return true; - } - async setBackend(backendName) { - if (this.registryFactory[backendName] == null) { - throw new Error(`Backend name '${backendName}' not found in registry`); - } - this.backendName = backendName; - if (this.registry[backendName] == null) { - this.backendInstance = null; - const { success, asyncInit } = this.initializeBackend(backendName); - const result = asyncInit ? await success : success; - if (!result) { - return false; - } - } - this.backendInstance = this.registry[backendName]; - this.setupRegisteredKernels(); - this.profiler = new Profiler(this.backendInstance); - return true; - } - setupRegisteredKernels() { - const kernels = getKernelsForBackend(this.backendName); - kernels.forEach((kernel) => { - if (kernel.setupFunc != null) { - kernel.setupFunc(this.backendInstance); - } - }); - } - disposeRegisteredKernels(backendName) { - const kernels = getKernelsForBackend(backendName); - kernels.forEach((kernel) => { - if (kernel.disposeFunc != null) { - kernel.disposeFunc(this.registry[backendName]); - } - }); - } - initializeBackend(backendName) { - const registryFactoryEntry = this.registryFactory[backendName]; - if (registryFactoryEntry == null) { - throw new Error(`Cannot initialize backend ${backendName}, no registration found.`); - } - try { - const backend22 = registryFactoryEntry.factory(); - if (backend22 && !(backend22 instanceof KernelBackend) && typeof backend22.then === "function") { - const promiseId = ++this.pendingBackendInitId; - const success = backend22.then((backendInstance) => { - if (promiseId < this.pendingBackendInitId) { - return false; - } - this.registry[backendName] = backendInstance; - this.pendingBackendInit = null; - return true; - }).catch((err) => { - if (promiseId < this.pendingBackendInitId) { - return false; - } - this.pendingBackendInit = null; - console.warn(`Initialization of backend ${backendName} failed`); - console.warn(err.stack || err.message); - return false; - }); - this.pendingBackendInit = success; - return { success, asyncInit: true }; - } else { - this.registry[backendName] = backend22; - return { success: true, asyncInit: false }; - } - } catch (err) { - console.warn(`Initialization of backend ${backendName} failed`); - console.warn(err.stack || err.message); - return { success: false, asyncInit: false }; - } - } - removeBackend(backendName) { - if (!(backendName in this.registryFactory)) { - throw new Error(`${backendName} backend not found in registry`); - } - if (this.backendName === backendName && this.pendingBackendInit != null) { - this.pendingBackendInitId++; - } - if (backendName in this.registry) { - this.disposeRegisteredKernels(backendName); - this.registry[backendName].dispose(); - delete this.registry[backendName]; - } - delete this.registryFactory[backendName]; - if (this.backendName === backendName) { - this.pendingBackendInit = null; - this.backendName = null; - this.backendInstance = null; - } - } - getSortedBackends() { - if (Object.keys(this.registryFactory).length === 0) { - throw new Error("No backend found in registry."); - } - return Object.keys(this.registryFactory).sort((a, b) => { - return this.registryFactory[b].priority - this.registryFactory[a].priority; - }); - } - initializeBackendsAndReturnBest() { - const sortedBackends = this.getSortedBackends(); - for (let i = 0; i < sortedBackends.length; i++) { - const backendName = sortedBackends[i]; - const { success, asyncInit } = this.initializeBackend(backendName); - if (asyncInit || success) { - return { name: backendName, asyncInit }; - } - } - throw new Error(`Could not initialize any backends, all backend initializations failed.`); - } - moveData(backend22, dataId) { - const info2 = this.state.tensorInfo.get(dataId); - const srcBackend = info2.backend; - const values = this.readSync(dataId); - const refCount = srcBackend.refCount(dataId); - srcBackend.disposeData(dataId, true); - info2.backend = backend22; - backend22.move(dataId, values, info2.shape, info2.dtype, refCount); - if (this.shouldCheckForMemLeaks()) { - this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]++; - } - } - tidy(nameOrFn, fn) { - let name6 = null; - if (fn == null) { - if (typeof nameOrFn !== "function") { - throw new Error("Please provide a function to tidy()"); - } - fn = nameOrFn; - } else { - if (typeof nameOrFn !== "string" && !(nameOrFn instanceof String)) { - throw new Error("When calling with two arguments, the first argument to tidy() must be a string"); - } - if (typeof fn !== "function") { - throw new Error("When calling with two arguments, the 2nd argument to tidy() must be a function"); - } - name6 = nameOrFn; - } - let result; - return this.scopedRun(() => this.startScope(name6), () => this.endScope(result), () => { - result = fn(); - if (result instanceof Promise) { - console.error("Cannot return a Promise inside of tidy."); - } - return result; - }); - } - scopedRun(start, end, f) { - start(); - try { - const res = f(); - end(); - return res; - } catch (ex) { - end(); - throw ex; - } - } - nextTensorId() { - return Engine.nextTensorId++; - } - nextVariableId() { - return Engine.nextVariableId++; - } - clone(x) { - const y = ENGINE.runKernel(Identity, { x }); - const inputs = { x }; - const grad2 = (dy) => ({ - x: () => { - const dtype = "float32"; - const gradInputs = { x: dy }; - const attrs = { dtype }; - return ENGINE.runKernel(Cast, gradInputs, attrs); - } - }); - const saved = []; - this.addTapeNode(this.state.activeScope.name, inputs, [y], grad2, saved, {}); - return y; - } - runKernel(kernelName, inputs, attrs) { - const hasKernel = getKernel(kernelName, this.backendName) != null; - if (!hasKernel) { - throw new Error(`Kernel '${kernelName}' not registered for backend '${this.backendName}'`); - } - return this.runKernelFunc({ kernelName, inputs, attrs }); - } - shouldCheckForMemLeaks() { - return this.ENV.getBool("IS_TEST"); - } - checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos) { - const numDataIdsAfter = this.backend.numDataIds(); - let numOutputDataIds = 0; - outInfos.forEach((info2) => { - numOutputDataIds += info2.dtype === "complex64" ? 3 : 1; - }); - const numMoves = this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]; - const dataIdsLeaked = numDataIdsAfter - numDataIdsBefore - numOutputDataIds - numMoves; - if (dataIdsLeaked > 0) { - throw new Error(`Backend '${this.backendName}' has an internal memory leak (${dataIdsLeaked} data ids) after running '${kernelName}'`); - } - } - runKernelFunc(kernelParams) { - let outputs; - let saved = []; - const isTapeOn = this.isTapeOn(); - const startingBytecount = this.state.numBytes; - const startingNumTensors = this.state.numTensors; - if (this.shouldCheckForMemLeaks()) { - this.state.numDataMovesStack.push(0); - } - let kernelFunc3; - if (this.backendName == null) { - this.backend; - } - let out; - const kernelOrScopeName = isRegisteredKernelInvocation(kernelParams) ? kernelParams.kernelName : this.state.activeScope != null ? this.state.activeScope.name : ""; - if (isRegisteredKernelInvocation(kernelParams)) { - const { kernelName, inputs: inputs2, attrs: attrs2 } = kernelParams; - if (this.backendName == null) { - this.backend; - } - const kernel = getKernel(kernelName, this.backendName); - assert(kernel != null, () => `Cannot find registered kernel '${kernelName}' for backend '${this.backendName}'`); - kernelFunc3 = () => { - const numDataIdsBefore = this.backend.numDataIds(); - out = kernel.kernelFunc({ inputs: inputs2, attrs: attrs2, backend: this.backend }); - const outInfos = Array.isArray(out) ? out : [out]; - if (this.shouldCheckForMemLeaks()) { - this.checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos); - } - const outTensors = outInfos.map((outInfo) => { - if (outInfo.rank != null) { - return outInfo; - } - const { dataId, shape, dtype } = outInfo; - return this.makeTensorFromDataId(dataId, shape, dtype); - }); - if (isTapeOn) { - const tensorsToSave = this.getTensorsForGradient(kernelName, inputs2, outTensors); - saved = this.saveTensorsForBackwardMode(tensorsToSave); - } - return outTensors; - }; - } else { - const { forwardFunc } = kernelParams; - const saveFunc = (tensors) => { - if (!isTapeOn) { - return; - } - saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); - }; - kernelFunc3 = () => { - const numDataIdsBefore = this.backend.numDataIds(); - out = this.tidy(() => forwardFunc(this.backend, saveFunc)); - const outs = Array.isArray(out) ? out : [out]; - if (this.shouldCheckForMemLeaks()) { - this.checkKernelForMemLeak(kernelOrScopeName, numDataIdsBefore, outs); - } - return outs; - }; - } - const { inputs, attrs } = kernelParams; - const backwardsFunc = isRegisteredKernelInvocation(kernelParams) ? null : kernelParams.backwardsFunc; - let kernelProfile; - this.scopedRun(() => this.state.kernelDepth++, () => this.state.kernelDepth--, () => { - if (!this.ENV.getBool("DEBUG") && !this.state.profiling) { - outputs = kernelFunc3(); - } else { - kernelProfile = this.profiler.profileKernel(kernelOrScopeName, inputs, () => kernelFunc3()); - if (this.ENV.getBool("DEBUG")) { - this.profiler.logKernelProfile(kernelProfile); - } - outputs = kernelProfile.outputs; - } - }); - if (isTapeOn) { - this.addTapeNode(kernelOrScopeName, inputs, outputs, backwardsFunc, saved, attrs); - } - if (this.state.profiling) { - this.state.activeProfile.kernels.push({ - name: kernelOrScopeName, - bytesAdded: this.state.numBytes - startingBytecount, - totalBytesSnapshot: this.state.numBytes, - tensorsAdded: this.state.numTensors - startingNumTensors, - totalTensorsSnapshot: this.state.numTensors, - inputShapes: Object.keys(inputs).map((key) => inputs[key] != null ? inputs[key].shape : null), - outputShapes: outputs.map((item) => item.shape), - kernelTimeMs: kernelProfile.timeMs, - extraInfo: kernelProfile.extraInfo - }); - } - return Array.isArray(out) ? outputs : outputs[0]; - } - saveTensorsForBackwardMode(tensors) { - const saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); - return saved; - } - getTensorsForGradient(kernelName, inputs, outputs) { - const gradConfig = getGradient(kernelName); - if (gradConfig != null) { - const inputsToSave = gradConfig.inputsToSave || []; - const outputsToSave = gradConfig.outputsToSave || []; - let inputTensorsToSave; - if (gradConfig.saveAllInputs) { - assert(Array.isArray(inputs), () => "saveAllInputs is true, expected inputs to be an array."); - inputTensorsToSave = Object.keys(inputs).map((key) => inputs[key]); - } else { - inputTensorsToSave = inputsToSave.map((inputName) => inputs[inputName]); - } - const outputTensorsToSave = outputs.filter((_, i) => outputsToSave[i]); - return inputTensorsToSave.concat(outputTensorsToSave); - } - return []; - } - makeTensor(values, shape, dtype, backend22) { - if (values == null) { - throw new Error("Values passed to engine.makeTensor() are null"); - } - dtype = dtype || "float32"; - backend22 = backend22 || this.backend; - let backendVals = values; - if (dtype === "string" && isString(values[0])) { - backendVals = values.map((d) => encodeString(d)); - } - const dataId = backend22.write(backendVals, shape, dtype); - const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); - this.trackTensor(t, backend22); - if (dtype === "string") { - const info2 = this.state.tensorInfo.get(dataId); - const newBytes = bytesFromStringArray(backendVals); - this.state.numBytes += newBytes - info2.bytes; - info2.bytes = newBytes; - } - return t; - } - makeTensorFromDataId(dataId, shape, dtype, backend22) { - dtype = dtype || "float32"; - const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); - this.trackTensor(t, backend22); - return t; - } - makeVariable(initialValue, trainable = true, name6, dtype) { - name6 = name6 || this.nextVariableId().toString(); - if (dtype != null && dtype !== initialValue.dtype) { - initialValue = initialValue.cast(dtype); - } - const v = new Variable(initialValue, trainable, name6, this.nextTensorId()); - if (this.state.registeredVariables[v.name] != null) { - throw new Error(`Variable with name ${v.name} was already registered`); - } - this.state.registeredVariables[v.name] = v; - this.incRef(v, this.backend); - return v; - } - trackTensor(a, backend22) { - this.state.numTensors++; - if (a.dtype === "string") { - this.state.numStringTensors++; - } - let bytes = 0; - if (a.dtype !== "complex64" && a.dtype !== "string") { - bytes = a.size * bytesPerElement(a.dtype); - } - this.state.numBytes += bytes; - if (!this.state.tensorInfo.has(a.dataId)) { - this.state.numDataBuffers++; - this.state.tensorInfo.set(a.dataId, { - backend: backend22 || this.backend, - dtype: a.dtype, - shape: a.shape, - bytes - }); - } - if (!(a instanceof Variable)) { - this.track(a); - } - } - incRef(a, backend22) { - this.trackTensor(a, backend22); - this.backend.incRef(a.dataId); - } - removeDataId(dataId, backend22) { - if (this.state.tensorInfo.has(dataId) && this.state.tensorInfo.get(dataId).backend === backend22) { - this.state.tensorInfo.delete(dataId); - this.state.numDataBuffers--; - } - } - disposeTensor(a) { - if (!this.state.tensorInfo.has(a.dataId)) { - return; - } - const info2 = this.state.tensorInfo.get(a.dataId); - this.state.numTensors--; - if (a.dtype === "string") { - this.state.numStringTensors--; - this.state.numBytes -= info2.bytes; - } - if (a.dtype !== "complex64" && a.dtype !== "string") { - const bytes = a.size * bytesPerElement(a.dtype); - this.state.numBytes -= bytes; - } - if (info2.backend.disposeData(a.dataId)) { - this.removeDataId(a.dataId, info2.backend); - } - } - disposeVariables() { - for (const varName in this.state.registeredVariables) { - const v = this.state.registeredVariables[varName]; - this.disposeVariable(v); - } - } - disposeVariable(v) { - this.disposeTensor(v); - if (this.state.registeredVariables[v.name] != null) { - delete this.state.registeredVariables[v.name]; - } - } - memory() { - const info2 = this.backend.memory(); - info2.numTensors = this.state.numTensors; - info2.numDataBuffers = this.state.numDataBuffers; - info2.numBytes = this.state.numBytes; - if (this.state.numStringTensors > 0) { - info2.unreliable = true; - if (info2.reasons == null) { - info2.reasons = []; - } - info2.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)"); - } - return info2; - } - async profile(query) { - this.state.profiling = true; - const startBytes = this.state.numBytes; - const startNumTensors = this.state.numTensors; - this.state.activeProfile.kernels = []; - this.state.activeProfile.result = await query(); - this.state.profiling = false; - this.state.activeProfile.peakBytes = Math.max(...this.state.activeProfile.kernels.map((d) => d.totalBytesSnapshot)); - this.state.activeProfile.newBytes = this.state.numBytes - startBytes; - this.state.activeProfile.newTensors = this.state.numTensors - startNumTensors; - for (const kernel of this.state.activeProfile.kernels) { - kernel.kernelTimeMs = await kernel.kernelTimeMs; - kernel.extraInfo = await kernel.extraInfo; - } - return this.state.activeProfile; - } - isTapeOn() { - return this.state.gradientDepth > 0 && this.state.kernelDepth === 0; - } - addTapeNode(kernelName, inputs, outputs, gradientsFunc, saved, attrs) { - const tapeNode = { id: this.state.nextTapeNodeId++, kernelName, inputs, outputs, saved }; - const gradConfig = getGradient(kernelName); - if (gradConfig != null) { - gradientsFunc = gradConfig.gradFunc; - } - if (gradientsFunc != null) { - tapeNode.gradient = (dys) => { - dys = dys.map((dy, i) => { - if (dy == null) { - const output = outputs[i]; - const vals = makeZerosTypedArray(output.size, output.dtype); - return this.makeTensor(vals, output.shape, output.dtype); - } - return dy; - }); - return gradientsFunc(dys.length > 1 ? dys : dys[0], saved, attrs); - }; - } - this.state.activeTape.push(tapeNode); - } - keep(result) { - result.kept = true; - return result; - } - startTape() { - if (this.state.gradientDepth === 0) { - this.state.activeTape = []; - } - this.state.gradientDepth++; - } - endTape() { - this.state.gradientDepth--; - } - startScope(name6) { - const scopeInfo = { - track: [], - name: "unnamed scope", - id: this.state.nextScopeId++ - }; - if (name6) { - scopeInfo.name = name6; - } - this.state.scopeStack.push(scopeInfo); - this.state.activeScope = scopeInfo; - } - endScope(result) { - const tensorsToTrackInParent = getTensorsInContainer(result); - const tensorsToTrackInParentSet = new Set(tensorsToTrackInParent.map((t) => t.id)); - for (let i = 0; i < this.state.activeScope.track.length; i++) { - const tensor2 = this.state.activeScope.track[i]; - if (!tensor2.kept && !tensorsToTrackInParentSet.has(tensor2.id)) { - tensor2.dispose(); - } - } - const oldScope = this.state.scopeStack.pop(); - this.state.activeScope = this.state.scopeStack.length === 0 ? null : this.state.scopeStack[this.state.scopeStack.length - 1]; - tensorsToTrackInParent.forEach((tensor2) => { - if (!tensor2.kept && tensor2.scopeId === oldScope.id) { - this.track(tensor2); - } - }); - } - gradients(f, xs, dy, allowNoGradients = false) { - assert(xs.length > 0, () => "gradients() received an empty list of xs."); - if (dy != null && dy.dtype !== "float32") { - throw new Error(`dy must have 'float32' dtype, but has '${dy.dtype}'`); - } - const y = this.scopedRun(() => this.startTape(), () => this.endTape(), () => this.tidy("forward", f)); - assert(y instanceof Tensor, () => "The result y returned by f() must be a tensor."); - const filteredTape = getFilteredNodesXToY(this.state.activeTape, xs, y); - if (!allowNoGradients && filteredTape.length === 0 && xs.length > 0) { - throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y."); - } - return this.tidy("backward", () => { - const accumulatedGradientMap = {}; - accumulatedGradientMap[y.id] = dy == null ? ones(y.shape) : dy; - backpropagateGradients(accumulatedGradientMap, filteredTape, (f2) => this.tidy(f2), add); - const grads2 = xs.map((x) => accumulatedGradientMap[x.id]); - if (this.state.gradientDepth === 0) { - this.state.activeTape.forEach((node) => { - for (const tensor2 of node.saved) { - tensor2.dispose(); - } - }); - this.state.activeTape = null; - } - return { value: y, grads: grads2 }; - }); - } - customGrad(f) { - assert(isFunction(f), () => "The f passed in customGrad(f) must be a function."); - return (...inputs) => { - assert(inputs.every((t) => t instanceof Tensor), () => "The args passed in customGrad(f)(x1, x2,...) must all be tensors"); - let res; - const inputMap = {}; - inputs.forEach((input2, i) => { - inputMap[i] = input2; - }); - const forwardFunc = (_, save) => { - res = f(...[...inputs, save]); - assert(res.value instanceof Tensor, () => "The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"); - assert(isFunction(res.gradFunc), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."); - return res.value; - }; - const backwardsFunc = (dy, saved) => { - const gradRes = res.gradFunc(dy, saved); - const grads2 = Array.isArray(gradRes) ? gradRes : [gradRes]; - assert(grads2.length === inputs.length, () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...)."); - assert(grads2.every((t) => t instanceof Tensor), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors."); - const gradMap = {}; - grads2.forEach((grad2, i) => { - gradMap[i] = () => grad2; - }); - return gradMap; - }; - return this.runKernelFunc({ - forwardFunc, - backwardsFunc, - inputs: inputMap - }); - }; - } - readSync(dataId) { - const info2 = this.state.tensorInfo.get(dataId); - return info2.backend.readSync(dataId); - } - read(dataId) { - const info2 = this.state.tensorInfo.get(dataId); - return info2.backend.read(dataId); - } - async time(query) { - const start = now2(); - const timingInfo = await this.backend.time(query); - timingInfo.wallMs = now2() - start; - return timingInfo; - } - track(result) { - if (this.state.activeScope != null) { - result.scopeId = this.state.activeScope.id; - this.state.activeScope.track.push(result); - } - return result; - } - get registeredVariables() { - return this.state.registeredVariables; - } - reset() { - this.pendingBackendInitId++; - this.state.dispose(); - this.ENV.reset(); - this.state = new EngineState(); - for (const backendName in this.registry) { - this.disposeRegisteredKernels(backendName); - this.registry[backendName].dispose(); - delete this.registry[backendName]; - } - this.backendName = null; - this.backendInstance = null; - this.pendingBackendInit = null; - } -}; -Engine.nextTensorId = 0; -Engine.nextVariableId = 0; -function ones(shape) { - const values = makeOnesTypedArray(sizeFromShape(shape), "float32"); - return ENGINE.makeTensor(values, shape, "float32"); -} -function getOrMakeEngine() { - const ns = getGlobalNamespace(); - if (ns._tfengine == null) { - const environment = new Environment(ns); - ns._tfengine = new Engine(environment); - } - setEnvironmentGlobal(ns._tfengine.ENV); - setTensorTracker(() => ns._tfengine); - return ns._tfengine; -} -var ENGINE = getOrMakeEngine(); -function add(a, b) { - const inputs = { a, b }; - return ENGINE.runKernel(Add, inputs); -} -var device_util_exports = {}; -__export2(device_util_exports, { - isBrowser: () => isBrowser, - isMobile: () => isMobile -}); -function _isNavigatorDefined() { - return typeof navigator !== "undefined" && navigator != null; -} -function isMobile(nav) { - if (nav || _isNavigatorDefined()) { - if (!nav) { - nav = navigator; - } - if (nav.product === "ReactNative") { - return true; - } - const a = nav.userAgent || nav.vendor || window.opera; - return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)); - } - return false; -} -function isBrowser() { - return typeof window !== "undefined" && window.document != null || typeof WorkerGlobalScope !== "undefined"; -} -var ENV2 = env(); -ENV2.registerFlag("DEBUG", () => false, (debugValue) => { - if (debugValue) { - console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance."); - } -}); -ENV2.registerFlag("IS_BROWSER", () => isBrowser()); -ENV2.registerFlag("IS_NODE", () => typeof process !== "undefined" && typeof process.versions !== "undefined" && typeof process.versions.node !== "undefined"); -ENV2.registerFlag("IS_CHROME", () => typeof navigator !== "undefined" && navigator != null && navigator.userAgent != null && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor)); -ENV2.registerFlag("PROD", () => false); -ENV2.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY", () => ENV2.getBool("DEBUG")); -ENV2.registerFlag("DEPRECATION_WARNINGS_ENABLED", () => true); -ENV2.registerFlag("IS_TEST", () => false); -ENV2.registerFlag("CHECK_COMPUTATION_FOR_ERRORS", () => true); -ENV2.registerFlag("WRAP_TO_IMAGEBITMAP", () => false); -function inferShape(val, dtype) { - let firstElem = val; - if (isTypedArray(val)) { - return dtype === "string" ? [] : [val.length]; - } - if (!Array.isArray(val)) { - return []; - } - const shape = []; - while (Array.isArray(firstElem) || isTypedArray(firstElem) && dtype !== "string") { - shape.push(firstElem.length); - firstElem = firstElem[0]; - } - if (Array.isArray(val) && env().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")) { - deepAssertShapeConsistency(val, shape, []); - } - return shape; -} -function deepAssertShapeConsistency(val, shape, indices) { - indices = indices || []; - if (!Array.isArray(val) && !isTypedArray(val)) { - assert(shape.length === 0, () => `Element arr[${indices.join("][")}] is a primitive, but should be an array/TypedArray of ${shape[0]} elements`); - return; - } - assert(shape.length > 0, () => `Element arr[${indices.join("][")}] should be a primitive, but is an array of ${val.length} elements`); - assert(val.length === shape[0], () => `Element arr[${indices.join("][")}] should have ${shape[0]} elements, but has ${val.length} elements`); - const subShape = shape.slice(1); - for (let i = 0; i < val.length; ++i) { - deepAssertShapeConsistency(val[i], subShape, indices.concat(i)); - } -} -function assertDtype(expectedDtype, actualDType, argName, functionName) { - if (expectedDtype === "string_or_numeric") { - return; - } - if (expectedDtype == null) { - throw new Error(`Expected dtype cannot be null.`); - } - if (expectedDtype !== "numeric" && expectedDtype !== actualDType || expectedDtype === "numeric" && actualDType === "string") { - throw new Error(`Argument '${argName}' passed to '${functionName}' must be ${expectedDtype} tensor, but got ${actualDType} tensor`); - } -} -function convertToTensor(x, argName, functionName, parseAsDtype = "numeric") { - if (x instanceof Tensor) { - assertDtype(parseAsDtype, x.dtype, argName, functionName); - return x; - } - let inferredDtype = inferDtype(x); - if (inferredDtype !== "string" && ["bool", "int32", "float32"].indexOf(parseAsDtype) >= 0) { - inferredDtype = parseAsDtype; - } - assertDtype(parseAsDtype, inferredDtype, argName, functionName); - if (x == null || !isTypedArray(x) && !Array.isArray(x) && typeof x !== "number" && typeof x !== "boolean" && typeof x !== "string") { - const type = x == null ? "null" : x.constructor.name; - throw new Error(`Argument '${argName}' passed to '${functionName}' must be a Tensor or TensorLike, but got '${type}'`); - } - const inferredShape = inferShape(x, inferredDtype); - if (!isTypedArray(x) && !Array.isArray(x)) { - x = [x]; - } - const skipTypedArray = true; - const values = inferredDtype !== "string" ? toTypedArray(x, inferredDtype) : flatten(x, [], skipTypedArray); - return ENGINE.makeTensor(values, inferredShape, inferredDtype); -} -function convertToTensorArray(arg, argName, functionName, parseAsDtype = "numeric") { - if (!Array.isArray(arg)) { - throw new Error(`Argument ${argName} passed to ${functionName} must be a \`Tensor[]\` or \`TensorLike[]\``); - } - const tensors = arg; - return tensors.map((t, i) => convertToTensor(t, `${argName}[${i}]`, functionName, parseAsDtype)); -} -var OP_SCOPE_SUFFIX = "__op"; -function op(f) { - const keys = Object.keys(f); - if (keys.length !== 1) { - throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${keys.length} keys.`); - } - let opName = keys[0]; - const fn = f[opName]; - if (opName.endsWith("_")) { - opName = opName.substring(0, opName.length - 1); - } - opName = opName + OP_SCOPE_SUFFIX; - const f2 = (...args) => { - ENGINE.startScope(opName); - try { - const result = fn(...args); - if (isPromise(result)) { - console.error("Cannot return a Promise inside of tidy."); - } - ENGINE.endScope(result); - return result; - } catch (ex) { - ENGINE.endScope(null); - throw ex; - } - }; - Object.defineProperty(f2, "name", { value: opName, configurable: true }); - return f2; -} -function complex_(real4, imag4) { - const $real = convertToTensor(real4, "real", "complex"); - const $imag = convertToTensor(imag4, "imag", "complex"); - assertShapesMatch($real.shape, $imag.shape, `real and imag shapes, ${$real.shape} and ${$imag.shape}, must match in call to tf.complex().`); - const inputs = { real: $real, imag: $imag }; - return ENGINE.runKernel(Complex, inputs); -} -var complex = op({ complex_ }); -function makeTensor(values, shape, inferredShape, dtype) { - if (dtype == null) { - dtype = inferDtype(values); - } - if (dtype === "complex64") { - throw new Error(`Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).`); - } - if (!isTypedArray(values) && !Array.isArray(values) && typeof values !== "number" && typeof values !== "boolean" && typeof values !== "string") { - throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray"); - } - if (shape != null) { - assertNonNegativeIntegerDimensions(shape); - const providedSize = sizeFromShape(shape); - const inferredSize = sizeFromShape(inferredShape); - assert(providedSize === inferredSize, () => `Based on the provided shape, [${shape}], the tensor should have ${providedSize} values but has ${inferredSize}`); - for (let i = 0; i < inferredShape.length; ++i) { - const inferred = inferredShape[i]; - const flatDimsDontMatch = i === inferredShape.length - 1 ? inferred !== sizeFromShape(shape.slice(i)) : true; - assert(inferredShape[i] === shape[i] || !flatDimsDontMatch, () => `Error creating a new Tensor. Inferred shape (${inferredShape}) does not match the provided shape (${shape}). `); - } - } - if (!isTypedArray(values) && !Array.isArray(values)) { - values = [values]; - } - shape = shape || inferredShape; - values = dtype !== "string" ? toTypedArray(values, dtype) : flatten(values, [], true); - return ENGINE.makeTensor(values, shape, dtype); -} -function tensor(values, shape, dtype) { - const inferredShape = inferShape(values, dtype); - return makeTensor(values, shape, inferredShape, dtype); -} -var DTYPE_VALUE_SIZE_MAP = { - "float32": 4, - "float16": 2, - "int32": 4, - "uint16": 2, - "uint8": 1, - "bool": 1, - "complex64": 8 -}; -var NUM_BYTES_STRING_LENGTH = 4; -async function encodeWeights(tensors, group) { - const specs = []; - const dataPromises = []; - const names = Array.isArray(tensors) ? tensors.map((tensor2) => tensor2.name) : Object.keys(tensors); - for (let i = 0; i < names.length; ++i) { - const name6 = names[i]; - const t = Array.isArray(tensors) ? tensors[i].tensor : tensors[name6]; - if (t.dtype !== "float32" && t.dtype !== "int32" && t.dtype !== "bool" && t.dtype !== "string" && t.dtype !== "complex64") { - throw new Error(`Unsupported dtype in weight '${name6}': ${t.dtype}`); - } - const spec = { name: name6, shape: t.shape, dtype: t.dtype }; - if (t.dtype === "string") { - const utf8bytes = new Promise(async (resolve) => { - const vals = await t.bytes(); - const totalNumBytes = vals.reduce((p2, c) => p2 + c.length, 0) + NUM_BYTES_STRING_LENGTH * vals.length; - const bytes = new Uint8Array(totalNumBytes); - let offset = 0; - for (let i2 = 0; i2 < vals.length; i2++) { - const val = vals[i2]; - const bytesOfLength = new Uint8Array(new Uint32Array([val.length]).buffer); - bytes.set(bytesOfLength, offset); - offset += NUM_BYTES_STRING_LENGTH; - bytes.set(val, offset); - offset += val.length; - } - resolve(bytes); - }); - dataPromises.push(utf8bytes); - } else { - dataPromises.push(t.data()); - } - if (group != null) { - spec.group = group; - } - specs.push(spec); - } - const tensorValues = await Promise.all(dataPromises); - return { data: concatenateTypedArrays(tensorValues), specs }; -} -function decodeWeights(buffer2, specs) { - const out = {}; - let float16Decode; - let offset = 0; - for (const spec of specs) { - const name6 = spec.name; - const dtype = spec.dtype; - const shape = spec.shape; - const size = sizeFromShape(shape); - let values; - if ("quantization" in spec) { - const quantization = spec.quantization; - if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { - if (!("min" in quantization && "scale" in quantization)) { - throw new Error(`Weight ${spec.name} with quantization ${quantization.dtype} doesn't have corresponding metadata min and scale.`); - } - } else if (quantization.dtype === "float16") { - if (dtype !== "float32") { - throw new Error(`Weight ${spec.name} is quantized with ${quantization.dtype} which only supports weights of type float32 not ${dtype}.`); - } - } else { - throw new Error(`Weight ${spec.name} has unknown quantization dtype ${quantization.dtype}. Supported quantization dtypes are: 'uint8', 'uint16', and 'float16'.`); - } - const quantizationSizeFactor = DTYPE_VALUE_SIZE_MAP[quantization.dtype]; - const byteBuffer = buffer2.slice(offset, offset + size * quantizationSizeFactor); - const quantizedArray = quantization.dtype === "uint8" ? new Uint8Array(byteBuffer) : new Uint16Array(byteBuffer); - if (dtype === "float32") { - if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { - values = new Float32Array(quantizedArray.length); - for (let i = 0; i < quantizedArray.length; i++) { - const v = quantizedArray[i]; - values[i] = v * quantization.scale + quantization.min; - } - } else if (quantization.dtype === "float16") { - if (float16Decode === void 0) { - float16Decode = getFloat16Decoder(); - } - values = float16Decode(quantizedArray); - } else { - throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type float32.`); - } - } else if (dtype === "int32") { - if (quantization.dtype !== "uint8" && quantization.dtype !== "uint16") { - throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type int32.`); - } - values = new Int32Array(quantizedArray.length); - for (let i = 0; i < quantizedArray.length; i++) { - const v = quantizedArray[i]; - values[i] = Math.round(v * quantization.scale + quantization.min); - } - } else { - throw new Error(`Unsupported dtype in weight '${name6}': ${dtype}`); - } - offset += size * quantizationSizeFactor; - } else if (dtype === "string") { - const size2 = sizeFromShape(spec.shape); - values = []; - for (let i = 0; i < size2; i++) { - const byteLength = new Uint32Array(buffer2.slice(offset, offset + NUM_BYTES_STRING_LENGTH))[0]; - offset += NUM_BYTES_STRING_LENGTH; - const bytes = new Uint8Array(buffer2.slice(offset, offset + byteLength)); - values.push(bytes); - offset += byteLength; - } - } else { - const dtypeFactor = DTYPE_VALUE_SIZE_MAP[dtype]; - const byteBuffer = buffer2.slice(offset, offset + size * dtypeFactor); - if (dtype === "float32") { - values = new Float32Array(byteBuffer); - } else if (dtype === "int32") { - values = new Int32Array(byteBuffer); - } else if (dtype === "bool") { - values = new Uint8Array(byteBuffer); - } else if (dtype === "complex64") { - values = new Float32Array(byteBuffer); - const real4 = new Float32Array(values.length / 2); - const image3 = new Float32Array(values.length / 2); - for (let i = 0; i < real4.length; i++) { - real4[i] = values[i * 2]; - image3[i] = values[i * 2 + 1]; - } - const realTensor = tensor(real4, shape, "float32"); - const imageTensor = tensor(image3, shape, "float32"); - out[name6] = complex(realTensor, imageTensor); - realTensor.dispose(); - imageTensor.dispose(); - } else { - throw new Error(`Unsupported dtype in weight '${name6}': ${dtype}`); - } - offset += size * dtypeFactor; - } - if (dtype !== "complex64") { - out[name6] = tensor(values, shape, dtype); - } - } - return out; -} -function concatenateTypedArrays(xs) { - if (xs === null) { - throw new Error(`Invalid input value: ${JSON.stringify(xs)}`); - } - let totalByteLength = 0; - const normalizedXs = []; - xs.forEach((x) => { - totalByteLength += x.byteLength; - normalizedXs.push(x.byteLength === x.buffer.byteLength ? x : new x.constructor(x)); - if (!(x instanceof Float32Array || x instanceof Int32Array || x instanceof Uint8Array)) { - throw new Error(`Unsupported TypedArray subtype: ${x.constructor.name}`); - } - }); - const y = new Uint8Array(totalByteLength); - let offset = 0; - normalizedXs.forEach((x) => { - y.set(new Uint8Array(x.buffer), offset); - offset += x.byteLength; - }); - return y.buffer; -} -var useNodeBuffer = typeof Buffer !== "undefined" && (typeof Blob === "undefined" || typeof atob === "undefined" || typeof btoa === "undefined"); -function stringByteLength(str) { - if (useNodeBuffer) { - return Buffer.byteLength(str); - } - return new Blob([str]).size; -} -function arrayBufferToBase64String(buffer2) { - if (useNodeBuffer) { - return Buffer.from(buffer2).toString("base64"); - } - const buf = new Uint8Array(buffer2); - let s = ""; - for (let i = 0, l = buf.length; i < l; i++) { - s += String.fromCharCode(buf[i]); - } - return btoa(s); -} -function base64StringToArrayBuffer(str) { - if (useNodeBuffer) { - const buf = Buffer.from(str, "base64"); - return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); - } - const s = atob(str); - const buffer2 = new Uint8Array(s.length); - for (let i = 0; i < s.length; ++i) { - buffer2.set([s.charCodeAt(i)], i); - } - return buffer2.buffer; -} -function concatenateArrayBuffers(buffers) { - if (buffers.length === 1) { - return buffers[0]; - } - let totalByteLength = 0; - buffers.forEach((buffer2) => { - totalByteLength += buffer2.byteLength; - }); - const temp = new Uint8Array(totalByteLength); - let offset = 0; - buffers.forEach((buffer2) => { - temp.set(new Uint8Array(buffer2), offset); - offset += buffer2.byteLength; - }); - return temp.buffer; -} -function basename(path) { - const SEPARATOR = "/"; - path = path.trim(); - while (path.endsWith(SEPARATOR)) { - path = path.slice(0, path.length - 1); - } - const items = path.split(SEPARATOR); - return items[items.length - 1]; -} -function getModelArtifactsInfoForJSON(modelArtifacts) { - if (modelArtifacts.modelTopology instanceof ArrayBuffer) { - throw new Error("Expected JSON model topology, received ArrayBuffer."); - } - return { - dateSaved: new Date(), - modelTopologyType: "JSON", - modelTopologyBytes: modelArtifacts.modelTopology == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.modelTopology)), - weightSpecsBytes: modelArtifacts.weightSpecs == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.weightSpecs)), - weightDataBytes: modelArtifacts.weightData == null ? 0 : modelArtifacts.weightData.byteLength - }; -} -function computeFloat16MantisaTable() { - const convertMantissa = (i) => { - let m = i << 13; - let e = 0; - while ((m & 8388608) === 0) { - e -= 8388608; - m <<= 1; - } - m &= ~8388608; - e += 947912704; - return m | e; - }; - const mantisaTable = new Uint32Array(2048); - mantisaTable[0] = 0; - for (let i = 1; i < 1024; i++) { - mantisaTable[i] = convertMantissa(i); - } - for (let i = 1024; i < 2048; i++) { - mantisaTable[i] = 939524096 + (i - 1024 << 13); - } - return mantisaTable; -} -function computeFloat16ExponentTable() { - const exponentTable = new Uint32Array(64); - exponentTable[0] = 0; - exponentTable[31] = 1199570944; - exponentTable[32] = 2147483648; - exponentTable[63] = 3347054592; - for (let i = 1; i < 31; i++) { - exponentTable[i] = i << 23; - } - for (let i = 33; i < 63; i++) { - exponentTable[i] = 2147483648 + (i - 32 << 23); - } - return exponentTable; -} -function computeFloat16OffsetTable() { - const offsetTable = new Uint32Array(64); - for (let i = 0; i < 64; i++) { - offsetTable[i] = 1024; - } - offsetTable[0] = offsetTable[32] = 0; - return offsetTable; -} -function getFloat16Decoder() { - const mantisaTable = computeFloat16MantisaTable(); - const exponentTable = computeFloat16ExponentTable(); - const offsetTable = computeFloat16OffsetTable(); - return (quantizedArray) => { - const buffer2 = new ArrayBuffer(4 * quantizedArray.length); - const bufferUint32View = new Uint32Array(buffer2); - for (let index = 0; index < quantizedArray.length; index++) { - const float16Bits = quantizedArray[index]; - const float32Bits = mantisaTable[offsetTable[float16Bits >> 10] + (float16Bits & 1023)] + exponentTable[float16Bits >> 10]; - bufferUint32View[index] = float32Bits; - } - return new Float32Array(buffer2); - }; -} -var IORouterRegistry = class { - constructor() { - this.saveRouters = []; - this.loadRouters = []; - } - static getInstance() { - if (IORouterRegistry.instance == null) { - IORouterRegistry.instance = new IORouterRegistry(); - } - return IORouterRegistry.instance; - } - static registerSaveRouter(saveRouter) { - IORouterRegistry.getInstance().saveRouters.push(saveRouter); - } - static registerLoadRouter(loadRouter) { - IORouterRegistry.getInstance().loadRouters.push(loadRouter); - } - static getSaveHandlers(url) { - return IORouterRegistry.getHandlers(url, "save"); - } - static getLoadHandlers(url, loadOptions) { - return IORouterRegistry.getHandlers(url, "load", loadOptions); - } - static getHandlers(url, handlerType, loadOptions) { - const validHandlers = []; - const routers = handlerType === "load" ? IORouterRegistry.getInstance().loadRouters : IORouterRegistry.getInstance().saveRouters; - routers.forEach((router) => { - const handler = router(url, loadOptions); - if (handler !== null) { - validHandlers.push(handler); - } - }); - return validHandlers; - } -}; -var registerSaveRouter = (loudRouter) => IORouterRegistry.registerSaveRouter(loudRouter); -var registerLoadRouter = (loudRouter) => IORouterRegistry.registerLoadRouter(loudRouter); -var getSaveHandlers = (url) => IORouterRegistry.getSaveHandlers(url); -var getLoadHandlers = (url, loadOptions) => IORouterRegistry.getLoadHandlers(url, loadOptions); -var DATABASE_NAME = "tensorflowjs"; -var DATABASE_VERSION = 1; -var MODEL_STORE_NAME = "models_store"; -var INFO_STORE_NAME = "model_info_store"; -function getIndexedDBFactory() { - if (!env().getBool("IS_BROWSER")) { - throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser."); - } - const theWindow = typeof window === "undefined" ? self : window; - const factory = theWindow.indexedDB || theWindow.mozIndexedDB || theWindow.webkitIndexedDB || theWindow.msIndexedDB || theWindow.shimIndexedDB; - if (factory == null) { - throw new Error("The current browser does not appear to support IndexedDB."); - } - return factory; -} -function setUpDatabase(openRequest) { - const db = openRequest.result; - db.createObjectStore(MODEL_STORE_NAME, { keyPath: "modelPath" }); - db.createObjectStore(INFO_STORE_NAME, { keyPath: "modelPath" }); -} -var BrowserIndexedDB = class { - constructor(modelPath) { - this.indexedDB = getIndexedDBFactory(); - if (modelPath == null || !modelPath) { - throw new Error("For IndexedDB, modelPath must not be null, undefined or empty."); - } - this.modelPath = modelPath; - } - async save(modelArtifacts) { - if (modelArtifacts.modelTopology instanceof ArrayBuffer) { - throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); - } - return this.databaseAction(this.modelPath, modelArtifacts); - } - async load() { - return this.databaseAction(this.modelPath); - } - databaseAction(modelPath, modelArtifacts) { - return new Promise((resolve, reject) => { - const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); - openRequest.onupgradeneeded = () => setUpDatabase(openRequest); - openRequest.onsuccess = () => { - const db = openRequest.result; - if (modelArtifacts == null) { - const modelTx = db.transaction(MODEL_STORE_NAME, "readonly"); - const modelStore = modelTx.objectStore(MODEL_STORE_NAME); - const getRequest = modelStore.get(this.modelPath); - getRequest.onsuccess = () => { - if (getRequest.result == null) { - db.close(); - return reject(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`)); - } else { - resolve(getRequest.result.modelArtifacts); - } - }; - getRequest.onerror = (error) => { - db.close(); - return reject(getRequest.error); - }; - modelTx.oncomplete = () => db.close(); - } else { - const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); - const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); - let infoStore = infoTx.objectStore(INFO_STORE_NAME); - const putInfoRequest = infoStore.put({ modelPath: this.modelPath, modelArtifactsInfo }); - let modelTx; - putInfoRequest.onsuccess = () => { - modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); - const modelStore = modelTx.objectStore(MODEL_STORE_NAME); - const putModelRequest = modelStore.put({ - modelPath: this.modelPath, - modelArtifacts, - modelArtifactsInfo - }); - putModelRequest.onsuccess = () => resolve({ modelArtifactsInfo }); - putModelRequest.onerror = (error) => { - infoStore = infoTx.objectStore(INFO_STORE_NAME); - const deleteInfoRequest = infoStore.delete(this.modelPath); - deleteInfoRequest.onsuccess = () => { - db.close(); - return reject(putModelRequest.error); - }; - deleteInfoRequest.onerror = (error2) => { - db.close(); - return reject(putModelRequest.error); - }; - }; - }; - putInfoRequest.onerror = (error) => { - db.close(); - return reject(putInfoRequest.error); - }; - infoTx.oncomplete = () => { - if (modelTx == null) { - db.close(); - } else { - modelTx.oncomplete = () => db.close(); - } - }; - } - }; - openRequest.onerror = (error) => reject(openRequest.error); - }); - } -}; -BrowserIndexedDB.URL_SCHEME = "indexeddb://"; -var indexedDBRouter = (url) => { - if (!env().getBool("IS_BROWSER")) { - return null; - } else { - if (!Array.isArray(url) && url.startsWith(BrowserIndexedDB.URL_SCHEME)) { - return browserIndexedDB(url.slice(BrowserIndexedDB.URL_SCHEME.length)); - } else { - return null; - } - } -}; -IORouterRegistry.registerSaveRouter(indexedDBRouter); -IORouterRegistry.registerLoadRouter(indexedDBRouter); -function browserIndexedDB(modelPath) { - return new BrowserIndexedDB(modelPath); -} -function maybeStripScheme(key) { - return key.startsWith(BrowserIndexedDB.URL_SCHEME) ? key.slice(BrowserIndexedDB.URL_SCHEME.length) : key; -} -var BrowserIndexedDBManager = class { - constructor() { - this.indexedDB = getIndexedDBFactory(); - } - async listModels() { - return new Promise((resolve, reject) => { - const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); - openRequest.onupgradeneeded = () => setUpDatabase(openRequest); - openRequest.onsuccess = () => { - const db = openRequest.result; - const tx = db.transaction(INFO_STORE_NAME, "readonly"); - const store = tx.objectStore(INFO_STORE_NAME); - const getAllInfoRequest = store.getAll(); - getAllInfoRequest.onsuccess = () => { - const out = {}; - for (const item of getAllInfoRequest.result) { - out[item.modelPath] = item.modelArtifactsInfo; - } - resolve(out); - }; - getAllInfoRequest.onerror = (error) => { - db.close(); - return reject(getAllInfoRequest.error); - }; - tx.oncomplete = () => db.close(); - }; - openRequest.onerror = (error) => reject(openRequest.error); - }); - } - async removeModel(path) { - path = maybeStripScheme(path); - return new Promise((resolve, reject) => { - const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); - openRequest.onupgradeneeded = () => setUpDatabase(openRequest); - openRequest.onsuccess = () => { - const db = openRequest.result; - const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); - const infoStore = infoTx.objectStore(INFO_STORE_NAME); - const getInfoRequest = infoStore.get(path); - let modelTx; - getInfoRequest.onsuccess = () => { - if (getInfoRequest.result == null) { - db.close(); - return reject(new Error(`Cannot find model with path '${path}' in IndexedDB.`)); - } else { - const deleteInfoRequest = infoStore.delete(path); - const deleteModelData = () => { - modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); - const modelStore = modelTx.objectStore(MODEL_STORE_NAME); - const deleteModelRequest = modelStore.delete(path); - deleteModelRequest.onsuccess = () => resolve(getInfoRequest.result.modelArtifactsInfo); - deleteModelRequest.onerror = (error) => reject(getInfoRequest.error); - }; - deleteInfoRequest.onsuccess = deleteModelData; - deleteInfoRequest.onerror = (error) => { - deleteModelData(); - db.close(); - return reject(getInfoRequest.error); - }; - } - }; - getInfoRequest.onerror = (error) => { - db.close(); - return reject(getInfoRequest.error); - }; - infoTx.oncomplete = () => { - if (modelTx == null) { - db.close(); - } else { - modelTx.oncomplete = () => db.close(); - } - }; - }; - openRequest.onerror = (error) => reject(openRequest.error); - }); - } -}; -var PATH_SEPARATOR = "/"; -var PATH_PREFIX = "tensorflowjs_models"; -var INFO_SUFFIX = "info"; -var MODEL_TOPOLOGY_SUFFIX = "model_topology"; -var WEIGHT_SPECS_SUFFIX = "weight_specs"; -var WEIGHT_DATA_SUFFIX = "weight_data"; -var MODEL_METADATA_SUFFIX = "model_metadata"; -function getModelKeys(path) { - return { - info: [PATH_PREFIX, path, INFO_SUFFIX].join(PATH_SEPARATOR), - topology: [PATH_PREFIX, path, MODEL_TOPOLOGY_SUFFIX].join(PATH_SEPARATOR), - weightSpecs: [PATH_PREFIX, path, WEIGHT_SPECS_SUFFIX].join(PATH_SEPARATOR), - weightData: [PATH_PREFIX, path, WEIGHT_DATA_SUFFIX].join(PATH_SEPARATOR), - modelMetadata: [PATH_PREFIX, path, MODEL_METADATA_SUFFIX].join(PATH_SEPARATOR) - }; -} -function getModelPathFromKey(key) { - const items = key.split(PATH_SEPARATOR); - if (items.length < 3) { - throw new Error(`Invalid key format: ${key}`); - } - return items.slice(1, items.length - 1).join(PATH_SEPARATOR); -} -function maybeStripScheme2(key) { - return key.startsWith(BrowserLocalStorage.URL_SCHEME) ? key.slice(BrowserLocalStorage.URL_SCHEME.length) : key; -} -var BrowserLocalStorage = class { - constructor(modelPath) { - if (!env().getBool("IS_BROWSER") || typeof window === "undefined" || typeof window.localStorage === "undefined") { - throw new Error("The current environment does not support local storage."); - } - this.LS = window.localStorage; - if (modelPath == null || !modelPath) { - throw new Error("For local storage, modelPath must not be null, undefined or empty."); - } - this.modelPath = modelPath; - this.keys = getModelKeys(this.modelPath); - } - async save(modelArtifacts) { - if (modelArtifacts.modelTopology instanceof ArrayBuffer) { - throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); - } else { - const topology = JSON.stringify(modelArtifacts.modelTopology); - const weightSpecs = JSON.stringify(modelArtifacts.weightSpecs); - const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); - try { - this.LS.setItem(this.keys.info, JSON.stringify(modelArtifactsInfo)); - this.LS.setItem(this.keys.topology, topology); - this.LS.setItem(this.keys.weightSpecs, weightSpecs); - this.LS.setItem(this.keys.weightData, arrayBufferToBase64String(modelArtifacts.weightData)); - const result = { - format: modelArtifacts.format, - generatedBy: modelArtifacts.generatedBy, - convertedBy: modelArtifacts.convertedBy - }; - if (modelArtifacts.signature != null) { - result.signature = modelArtifacts.signature; - } - if (modelArtifacts.userDefinedMetadata != null) { - result.userDefinedMetadata = modelArtifacts.userDefinedMetadata; - } - if (modelArtifacts.modelInitializer != null) { - result.modelInitializer = modelArtifacts.modelInitializer; - } - this.LS.setItem(this.keys.modelMetadata, JSON.stringify(result)); - return { modelArtifactsInfo }; - } catch (err) { - this.LS.removeItem(this.keys.info); - this.LS.removeItem(this.keys.topology); - this.LS.removeItem(this.keys.weightSpecs); - this.LS.removeItem(this.keys.weightData); - this.LS.removeItem(this.keys.modelMetadata); - throw new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${modelArtifactsInfo.modelTopologyBytes}, weightSpecsBytes=${modelArtifactsInfo.weightSpecsBytes}, weightDataBytes=${modelArtifactsInfo.weightDataBytes}.`); - } - } - } - async load() { - const info2 = JSON.parse(this.LS.getItem(this.keys.info)); - if (info2 == null) { - throw new Error(`In local storage, there is no model with name '${this.modelPath}'`); - } - if (info2.modelTopologyType !== "JSON") { - throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet."); - } - const out = {}; - const topology = JSON.parse(this.LS.getItem(this.keys.topology)); - if (topology == null) { - throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`); - } - out.modelTopology = topology; - const weightSpecs = JSON.parse(this.LS.getItem(this.keys.weightSpecs)); - if (weightSpecs == null) { - throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`); - } - out.weightSpecs = weightSpecs; - const metadataString = this.LS.getItem(this.keys.modelMetadata); - if (metadataString != null) { - const metadata = JSON.parse(metadataString); - out.format = metadata["format"]; - out.generatedBy = metadata["generatedBy"]; - out.convertedBy = metadata["convertedBy"]; - if (metadata["signature"] != null) { - out.signature = metadata["signature"]; - } - if (metadata["userDefinedMetadata"] != null) { - out.userDefinedMetadata = metadata["userDefinedMetadata"]; - } - if (metadata["modelInitializer"] != null) { - out.modelInitializer = metadata["modelInitializer"]; - } - } - const weightDataBase64 = this.LS.getItem(this.keys.weightData); - if (weightDataBase64 == null) { - throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`); - } - out.weightData = base64StringToArrayBuffer(weightDataBase64); - return out; - } -}; -BrowserLocalStorage.URL_SCHEME = "localstorage://"; -var localStorageRouter = (url) => { - if (!env().getBool("IS_BROWSER")) { - return null; - } else { - if (!Array.isArray(url) && url.startsWith(BrowserLocalStorage.URL_SCHEME)) { - return browserLocalStorage(url.slice(BrowserLocalStorage.URL_SCHEME.length)); - } else { - return null; - } - } -}; -IORouterRegistry.registerSaveRouter(localStorageRouter); -IORouterRegistry.registerLoadRouter(localStorageRouter); -function browserLocalStorage(modelPath) { - return new BrowserLocalStorage(modelPath); -} -var BrowserLocalStorageManager = class { - constructor() { - assert(env().getBool("IS_BROWSER"), () => "Current environment is not a web browser"); - assert(typeof window === "undefined" || typeof window.localStorage !== "undefined", () => "Current browser does not appear to support localStorage"); - this.LS = window.localStorage; - } - async listModels() { - const out = {}; - const prefix = PATH_PREFIX + PATH_SEPARATOR; - const suffix = PATH_SEPARATOR + INFO_SUFFIX; - for (let i = 0; i < this.LS.length; ++i) { - const key = this.LS.key(i); - if (key.startsWith(prefix) && key.endsWith(suffix)) { - const modelPath = getModelPathFromKey(key); - out[modelPath] = JSON.parse(this.LS.getItem(key)); - } - } - return out; - } - async removeModel(path) { - path = maybeStripScheme2(path); - const keys = getModelKeys(path); - if (this.LS.getItem(keys.info) == null) { - throw new Error(`Cannot find model at path '${path}'`); - } - const info2 = JSON.parse(this.LS.getItem(keys.info)); - this.LS.removeItem(keys.info); - this.LS.removeItem(keys.topology); - this.LS.removeItem(keys.weightSpecs); - this.LS.removeItem(keys.weightData); - return info2; - } -}; -var URL_SCHEME_SUFFIX = "://"; -var ModelStoreManagerRegistry = class { - constructor() { - this.managers = {}; - } - static getInstance() { - if (ModelStoreManagerRegistry.instance == null) { - ModelStoreManagerRegistry.instance = new ModelStoreManagerRegistry(); - } - return ModelStoreManagerRegistry.instance; - } - static registerManager(scheme, manager) { - assert(scheme != null, () => "scheme must not be undefined or null."); - if (scheme.endsWith(URL_SCHEME_SUFFIX)) { - scheme = scheme.slice(0, scheme.indexOf(URL_SCHEME_SUFFIX)); - } - assert(scheme.length > 0, () => "scheme must not be an empty string."); - const registry = ModelStoreManagerRegistry.getInstance(); - assert(registry.managers[scheme] == null, () => `A model store manager is already registered for scheme '${scheme}'.`); - registry.managers[scheme] = manager; - } - static getManager(scheme) { - const manager = this.getInstance().managers[scheme]; - if (manager == null) { - throw new Error(`Cannot find model manager for scheme '${scheme}'`); - } - return manager; - } - static getSchemes() { - return Object.keys(this.getInstance().managers); - } -}; -function parseURL(url) { - if (url.indexOf(URL_SCHEME_SUFFIX) === -1) { - throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${ModelStoreManagerRegistry.getSchemes().join(",")}`); - } - return { - scheme: url.split(URL_SCHEME_SUFFIX)[0], - path: url.split(URL_SCHEME_SUFFIX)[1] - }; -} -async function cloneModelInternal(sourceURL, destURL, deleteSource = false) { - assert(sourceURL !== destURL, () => `Old path and new path are the same: '${sourceURL}'`); - const loadHandlers = IORouterRegistry.getLoadHandlers(sourceURL); - assert(loadHandlers.length > 0, () => `Copying failed because no load handler is found for source URL ${sourceURL}.`); - assert(loadHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) load handlers for source URL ${sourceURL}.`); - const loadHandler = loadHandlers[0]; - const saveHandlers = IORouterRegistry.getSaveHandlers(destURL); - assert(saveHandlers.length > 0, () => `Copying failed because no save handler is found for destination URL ${destURL}.`); - assert(saveHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) save handlers for destination URL ${destURL}.`); - const saveHandler = saveHandlers[0]; - const sourceScheme = parseURL(sourceURL).scheme; - const sourcePath = parseURL(sourceURL).path; - const sameMedium = sourceScheme === parseURL(sourceURL).scheme; - const modelArtifacts = await loadHandler.load(); - if (deleteSource && sameMedium) { - await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); - } - const saveResult = await saveHandler.save(modelArtifacts); - if (deleteSource && !sameMedium) { - await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); - } - return saveResult.modelArtifactsInfo; -} -async function listModels() { - const schemes = ModelStoreManagerRegistry.getSchemes(); - const out = {}; - for (const scheme of schemes) { - const schemeOut = await ModelStoreManagerRegistry.getManager(scheme).listModels(); - for (const path in schemeOut) { - const url = scheme + URL_SCHEME_SUFFIX + path; - out[url] = schemeOut[path]; - } - } - return out; -} -async function removeModel(url) { - const schemeAndPath = parseURL(url); - const manager = ModelStoreManagerRegistry.getManager(schemeAndPath.scheme); - return manager.removeModel(schemeAndPath.path); -} -async function copyModel(sourceURL, destURL) { - const deleteSource = false; - return cloneModelInternal(sourceURL, destURL, deleteSource); -} -async function moveModel(sourceURL, destURL) { - const deleteSource = true; - return cloneModelInternal(sourceURL, destURL, deleteSource); -} -var PlatformBrowser = class { - fetch(path, init2) { - return fetch(path, init2); - } - now() { - return performance.now(); - } - encode(text, encoding) { - if (encoding !== "utf-8" && encoding !== "utf8") { - throw new Error(`Browser's encoder only supports utf-8, but got ${encoding}`); - } - if (this.textEncoder == null) { - this.textEncoder = new TextEncoder(); - } - return this.textEncoder.encode(text); - } - decode(bytes, encoding) { - return new TextDecoder(encoding).decode(bytes); - } -}; -if (env().get("IS_BROWSER")) { - env().setPlatform("browser", new PlatformBrowser()); - try { - ModelStoreManagerRegistry.registerManager(BrowserLocalStorage.URL_SCHEME, new BrowserLocalStorageManager()); - } catch (err) { - } - try { - ModelStoreManagerRegistry.registerManager(BrowserIndexedDB.URL_SCHEME, new BrowserIndexedDBManager()); - } catch (err) { - } -} -var getNodeFetch = { - importFetch: () => require_browser() -}; -var systemFetch; -var PlatformNode = class { - constructor() { - this.util = __require2("util"); - this.textEncoder = new this.util.TextEncoder(); - } - fetch(path, requestInits) { - if (env().global.fetch != null) { - return env().global.fetch(path, requestInits); - } - if (systemFetch == null) { - systemFetch = getNodeFetch.importFetch(); - } - return systemFetch(path, requestInits); - } - now() { - const time2 = process.hrtime(); - return time2[0] * 1e3 + time2[1] / 1e6; - } - encode(text, encoding) { - if (encoding !== "utf-8" && encoding !== "utf8") { - throw new Error(`Node built-in encoder only supports utf-8, but got ${encoding}`); - } - return this.textEncoder.encode(text); - } - decode(bytes, encoding) { - if (bytes.length === 0) { - return ""; - } - return new this.util.TextDecoder(encoding).decode(bytes); - } -}; -if (env().get("IS_NODE")) { - env().setPlatform("node", new PlatformNode()); -} -function buffer(shape, dtype = "float32", values) { - dtype = dtype || "float32"; - assertNonNegativeIntegerDimensions(shape); - return new TensorBuffer(shape, dtype, values); -} -function cast_(x, dtype) { - const $x = convertToTensor(x, "x", "cast"); - if (!isValidDtype(dtype)) { - throw new Error(`Failed to cast to unknown dtype ${dtype}`); - } - if (dtype === "string" && $x.dtype !== "string" || dtype !== "string" && $x.dtype === "string") { - throw new Error("Only strings can be casted to strings"); - } - const inputs = { x: $x }; - const attrs = { dtype }; - return ENGINE.runKernel(Cast, inputs, attrs); -} -var cast = op({ cast_ }); -function clone_(x) { - const $x = convertToTensor(x, "x", "clone", "string_or_numeric"); - const inputs = { x: $x }; - return ENGINE.runKernel(Identity, inputs); -} -var clone = op({ clone_ }); -function print2(x, verbose = false) { - console.log(x.toString(verbose)); -} -getOrMakeEngine(); -var opHandler2 = { - buffer, - cast, - clone, - print: print2 -}; -setOpHandler(opHandler2); -var io_exports = {}; -__export2(io_exports, { - browserFiles: () => browserFiles, - browserHTTPRequest: () => browserHTTPRequest, - concatenateArrayBuffers: () => concatenateArrayBuffers, - copyModel: () => copyModel, - decodeWeights: () => decodeWeights, - encodeWeights: () => encodeWeights, - fromMemory: () => fromMemory, - getLoadHandlers: () => getLoadHandlers, - getModelArtifactsInfoForJSON: () => getModelArtifactsInfoForJSON, - getSaveHandlers: () => getSaveHandlers, - http: () => http, - isHTTPScheme: () => isHTTPScheme, - listModels: () => listModels, - loadWeights: () => loadWeights, - moveModel: () => moveModel, - registerLoadRouter: () => registerLoadRouter, - registerSaveRouter: () => registerSaveRouter, - removeModel: () => removeModel, - weightsLoaderFactory: () => weightsLoaderFactory, - withSaveHandler: () => withSaveHandler -}); -var DEFAULT_FILE_NAME_PREFIX = "model"; -var DEFAULT_JSON_EXTENSION_NAME = ".json"; -var DEFAULT_WEIGHT_DATA_EXTENSION_NAME = ".weights.bin"; -function defer(f) { - return new Promise((resolve) => setTimeout(resolve)).then(f); -} -var BrowserDownloads = class { - constructor(fileNamePrefix) { - if (!env().getBool("IS_BROWSER")) { - throw new Error("browserDownloads() cannot proceed because the current environment is not a browser."); - } - if (fileNamePrefix.startsWith(BrowserDownloads.URL_SCHEME)) { - fileNamePrefix = fileNamePrefix.slice(BrowserDownloads.URL_SCHEME.length); - } - if (fileNamePrefix == null || fileNamePrefix.length === 0) { - fileNamePrefix = DEFAULT_FILE_NAME_PREFIX; - } - this.modelTopologyFileName = fileNamePrefix + DEFAULT_JSON_EXTENSION_NAME; - this.weightDataFileName = fileNamePrefix + DEFAULT_WEIGHT_DATA_EXTENSION_NAME; - } - async save(modelArtifacts) { - if (typeof document === "undefined") { - throw new Error("Browser downloads are not supported in this environment since `document` is not present"); - } - const weightsURL = window.URL.createObjectURL(new Blob([modelArtifacts.weightData], { type: "application/octet-stream" })); - if (modelArtifacts.modelTopology instanceof ArrayBuffer) { - throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet."); - } else { - const weightsManifest = [{ - paths: ["./" + this.weightDataFileName], - weights: modelArtifacts.weightSpecs - }]; - const modelTopologyAndWeightManifest = { - modelTopology: modelArtifacts.modelTopology, - format: modelArtifacts.format, - generatedBy: modelArtifacts.generatedBy, - convertedBy: modelArtifacts.convertedBy, - weightsManifest - }; - if (modelArtifacts.signature != null) { - modelTopologyAndWeightManifest.signature = modelArtifacts.signature; - } - if (modelArtifacts.userDefinedMetadata != null) { - modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata; - } - if (modelArtifacts.modelInitializer != null) { - modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer; - } - const modelTopologyAndWeightManifestURL = window.URL.createObjectURL(new Blob([JSON.stringify(modelTopologyAndWeightManifest)], { type: "application/json" })); - const jsonAnchor = this.jsonAnchor == null ? document.createElement("a") : this.jsonAnchor; - jsonAnchor.download = this.modelTopologyFileName; - jsonAnchor.href = modelTopologyAndWeightManifestURL; - await defer(() => jsonAnchor.dispatchEvent(new MouseEvent("click"))); - if (modelArtifacts.weightData != null) { - const weightDataAnchor = this.weightDataAnchor == null ? document.createElement("a") : this.weightDataAnchor; - weightDataAnchor.download = this.weightDataFileName; - weightDataAnchor.href = weightsURL; - await defer(() => weightDataAnchor.dispatchEvent(new MouseEvent("click"))); - } - return { modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts) }; - } - } -}; -BrowserDownloads.URL_SCHEME = "downloads://"; -var BrowserFiles = class { - constructor(files) { - if (files == null || files.length < 1) { - throw new Error(`When calling browserFiles, at least 1 file is required, but received ${files}`); - } - this.files = files; - } - async load() { - const jsonFile = this.files[0]; - const weightFiles = this.files.slice(1); - return new Promise((resolve, reject) => { - const jsonReader = new FileReader(); - jsonReader.onload = (event) => { - const modelJSON = JSON.parse(event.target.result); - const modelTopology = modelJSON.modelTopology; - if (modelTopology == null) { - reject(new Error(`modelTopology field is missing from file ${jsonFile.name}`)); - return; - } - if (weightFiles.length === 0) { - resolve({ modelTopology }); - } - const weightsManifest = modelJSON.weightsManifest; - if (weightsManifest == null) { - reject(new Error(`weightManifest field is missing from file ${jsonFile.name}`)); - return; - } - let pathToFile; - try { - pathToFile = this.checkManifestAndWeightFiles(weightsManifest, weightFiles); - } catch (err) { - reject(err); - return; - } - const weightSpecs = []; - const paths = []; - const perFileBuffers = []; - weightsManifest.forEach((weightsGroup) => { - weightsGroup.paths.forEach((path) => { - paths.push(path); - perFileBuffers.push(null); - }); - weightSpecs.push(...weightsGroup.weights); - }); - weightsManifest.forEach((weightsGroup) => { - weightsGroup.paths.forEach((path) => { - const weightFileReader = new FileReader(); - weightFileReader.onload = (event2) => { - const weightData = event2.target.result; - const index = paths.indexOf(path); - perFileBuffers[index] = weightData; - if (perFileBuffers.indexOf(null) === -1) { - const result = { - modelTopology, - weightSpecs, - weightData: concatenateArrayBuffers(perFileBuffers), - format: modelJSON.format, - generatedBy: modelJSON.generatedBy, - convertedBy: modelJSON.convertedBy - }; - if (modelJSON.signature != null) { - result.signature = modelJSON.signature; - } - if (modelJSON.userDefinedMetadata != null) { - result.userDefinedMetadata = modelJSON.userDefinedMetadata; - } - if (modelJSON.modelInitializer != null) { - result.modelInitializer = modelJSON.modelInitializer; - } - resolve(result); - } - }; - weightFileReader.onerror = (error) => reject(`Failed to weights data from file of path '${path}'.`); - weightFileReader.readAsArrayBuffer(pathToFile[path]); - }); - }); - }; - jsonReader.onerror = (error) => reject(`Failed to read model topology and weights manifest JSON from file '${jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`); - jsonReader.readAsText(jsonFile); - }); - } - checkManifestAndWeightFiles(manifest, files) { - const basenames = []; - const fileNames = files.map((file) => basename(file.name)); - const pathToFile = {}; - for (const group of manifest) { - group.paths.forEach((path) => { - const pathBasename = basename(path); - if (basenames.indexOf(pathBasename) !== -1) { - throw new Error(`Duplicate file basename found in weights manifest: '${pathBasename}'`); - } - basenames.push(pathBasename); - if (fileNames.indexOf(pathBasename) === -1) { - throw new Error(`Weight file with basename '${pathBasename}' is not provided.`); - } else { - pathToFile[path] = files[fileNames.indexOf(pathBasename)]; - } - }); - } - if (basenames.length !== files.length) { - throw new Error(`Mismatch in the number of files in weights manifest (${basenames.length}) and the number of weight files provided (${files.length}).`); - } - return pathToFile; - } -}; -var browserDownloadsRouter = (url) => { - if (!env().getBool("IS_BROWSER")) { - return null; - } else { - if (!Array.isArray(url) && url.startsWith(BrowserDownloads.URL_SCHEME)) { - return browserDownloads(url.slice(BrowserDownloads.URL_SCHEME.length)); - } else { - return null; - } - } -}; -IORouterRegistry.registerSaveRouter(browserDownloadsRouter); -function browserDownloads(fileNamePrefix = "model") { - return new BrowserDownloads(fileNamePrefix); -} -function browserFiles(files) { - return new BrowserFiles(files); -} -function monitorPromisesProgress(promises, onProgress, startFraction, endFraction) { - checkPromises(promises); - startFraction = startFraction == null ? 0 : startFraction; - endFraction = endFraction == null ? 1 : endFraction; - checkFraction(startFraction, endFraction); - let resolvedPromise = 0; - const registerMonitor = (promise) => { - promise.then((value) => { - const fraction = startFraction + ++resolvedPromise / promises.length * (endFraction - startFraction); - onProgress(fraction); - return value; - }); - return promise; - }; - function checkPromises(promises2) { - assert(promises2 != null && Array.isArray(promises2) && promises2.length > 0, () => "promises must be a none empty array"); - } - function checkFraction(startFraction2, endFraction2) { - assert(startFraction2 >= 0 && startFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got startFraction ${startFraction2}`); - assert(endFraction2 >= 0 && endFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got endFraction ${endFraction2}`); - assert(endFraction2 >= startFraction2, () => `startFraction must be no more than endFraction, but got startFraction ${startFraction2} and endFraction ${endFraction2}`); - } - return Promise.all(promises.map(registerMonitor)); -} -async function loadWeightsAsArrayBuffer(fetchURLs, loadOptions) { - if (loadOptions == null) { - loadOptions = {}; - } - const fetchFunc = loadOptions.fetchFunc == null ? env().platform.fetch : loadOptions.fetchFunc; - const requests = fetchURLs.map((fetchURL) => fetchFunc(fetchURL, loadOptions.requestInit, { isBinary: true })); - const fetchStartFraction = 0; - const fetchEndFraction = 0.5; - const responses = loadOptions.onProgress == null ? await Promise.all(requests) : await monitorPromisesProgress(requests, loadOptions.onProgress, fetchStartFraction, fetchEndFraction); - const bufferPromises = responses.map((response) => response.arrayBuffer()); - const bufferStartFraction = 0.5; - const bufferEndFraction = 1; - const buffers = loadOptions.onProgress == null ? await Promise.all(bufferPromises) : await monitorPromisesProgress(bufferPromises, loadOptions.onProgress, bufferStartFraction, bufferEndFraction); - return buffers; -} -async function loadWeights(manifest, filePathPrefix = "", weightNames, requestInit) { - const fetchWeights = (fetchUrls) => loadWeightsAsArrayBuffer(fetchUrls, { requestInit }); - const loadWeights2 = weightsLoaderFactory(fetchWeights); - return loadWeights2(manifest, filePathPrefix, weightNames); -} -function weightsLoaderFactory(fetchWeightsFunction) { - return async (manifest, filePathPrefix = "", weightNames) => { - const groupIndicesToFetchMap = manifest.map(() => false); - const groupWeightsToFetch = {}; - const weightsFound = weightNames != null ? weightNames.map(() => false) : []; - const allManifestWeightNames = []; - manifest.forEach((manifestGroupConfig, groupIndex) => { - let groupOffset = 0; - manifestGroupConfig.weights.forEach((weightsEntry) => { - const rawDtype = "quantization" in weightsEntry ? weightsEntry.quantization.dtype : weightsEntry.dtype; - const weightsBytes = DTYPE_VALUE_SIZE_MAP[rawDtype] * sizeFromShape(weightsEntry.shape); - const enqueueWeightsForFetchingFn = () => { - groupIndicesToFetchMap[groupIndex] = true; - if (groupWeightsToFetch[groupIndex] == null) { - groupWeightsToFetch[groupIndex] = []; - } - groupWeightsToFetch[groupIndex].push({ - manifestEntry: weightsEntry, - groupOffset, - sizeBytes: weightsBytes - }); - }; - if (weightNames != null) { - weightNames.forEach((weightName, weightIndex) => { - if (weightName === weightsEntry.name) { - enqueueWeightsForFetchingFn(); - weightsFound[weightIndex] = true; - } - }); - } else { - enqueueWeightsForFetchingFn(); - } - allManifestWeightNames.push(weightsEntry.name); - groupOffset += weightsBytes; - }); - }); - if (!weightsFound.every((found) => found)) { - const weightsNotFound = weightNames.filter((_, i) => !weightsFound[i]); - throw new Error(`Could not find weights in manifest with names: ${weightsNotFound.join(", ")}. -Manifest JSON has weights with names: ${allManifestWeightNames.join(", ")}.`); - } - const groupIndicesToFetch = groupIndicesToFetchMap.reduce((accumulator, shouldFetch, i) => { - if (shouldFetch) { - accumulator.push(i); - } - return accumulator; - }, []); - const fetchUrls = []; - groupIndicesToFetch.forEach((i) => { - manifest[i].paths.forEach((filepath) => { - const fetchUrl = filePathPrefix + (!filePathPrefix.endsWith("/") ? "/" : "") + filepath; - fetchUrls.push(fetchUrl); - }); - }); - const buffers = await fetchWeightsFunction(fetchUrls); - const weightsTensorMap = {}; - let bufferIndexOffset = 0; - groupIndicesToFetch.forEach((i) => { - const numBuffers = manifest[i].paths.length; - let groupBytes = 0; - for (let i2 = 0; i2 < numBuffers; i2++) { - groupBytes += buffers[bufferIndexOffset + i2].byteLength; - } - const groupBuffer = new ArrayBuffer(groupBytes); - const groupByteBuffer = new Uint8Array(groupBuffer); - let groupBufferOffset = 0; - for (let i2 = 0; i2 < numBuffers; i2++) { - const buffer2 = new Uint8Array(buffers[bufferIndexOffset + i2]); - groupByteBuffer.set(buffer2, groupBufferOffset); - groupBufferOffset += buffer2.byteLength; - } - const weightsEntries = groupWeightsToFetch[i]; - weightsEntries.forEach((weightsEntry) => { - const byteBuffer = groupBuffer.slice(weightsEntry.groupOffset, weightsEntry.groupOffset + weightsEntry.sizeBytes); - const nameToTensorMap = decodeWeights(byteBuffer, [weightsEntry.manifestEntry]); - for (const name6 in nameToTensorMap) { - weightsTensorMap[name6] = nameToTensorMap[name6]; - } - }); - bufferIndexOffset += numBuffers; - }); - return weightsTensorMap; - }; -} -var OCTET_STREAM_MIME_TYPE = "application/octet-stream"; -var JSON_TYPE = "application/json"; -var HTTPRequest = class { - constructor(path, loadOptions) { - this.DEFAULT_METHOD = "POST"; - if (loadOptions == null) { - loadOptions = {}; - } - this.weightPathPrefix = loadOptions.weightPathPrefix; - this.onProgress = loadOptions.onProgress; - this.weightUrlConverter = loadOptions.weightUrlConverter; - if (loadOptions.fetchFunc != null) { - assert(typeof loadOptions.fetchFunc === "function", () => "Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)"); - this.fetch = loadOptions.fetchFunc; - } else { - this.fetch = env().platform.fetch; - } - assert(path != null && path.length > 0, () => "URL path for http must not be null, undefined or empty."); - if (Array.isArray(path)) { - assert(path.length === 2, () => `URL paths for http must have a length of 2, (actual length is ${path.length}).`); - } - this.path = path; - if (loadOptions.requestInit != null && loadOptions.requestInit.body != null) { - throw new Error("requestInit is expected to have no pre-existing body, but has one."); - } - this.requestInit = loadOptions.requestInit || {}; - } - async save(modelArtifacts) { - if (modelArtifacts.modelTopology instanceof ArrayBuffer) { - throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet."); - } - const init2 = Object.assign({ method: this.DEFAULT_METHOD }, this.requestInit); - init2.body = new FormData(); - const weightsManifest = [{ - paths: ["./model.weights.bin"], - weights: modelArtifacts.weightSpecs - }]; - const modelTopologyAndWeightManifest = { - modelTopology: modelArtifacts.modelTopology, - format: modelArtifacts.format, - generatedBy: modelArtifacts.generatedBy, - convertedBy: modelArtifacts.convertedBy, - weightsManifest - }; - if (modelArtifacts.signature != null) { - modelTopologyAndWeightManifest.signature = modelArtifacts.signature; - } - if (modelArtifacts.userDefinedMetadata != null) { - modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata; - } - if (modelArtifacts.modelInitializer != null) { - modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer; - } - init2.body.append("model.json", new Blob([JSON.stringify(modelTopologyAndWeightManifest)], { type: JSON_TYPE }), "model.json"); - if (modelArtifacts.weightData != null) { - init2.body.append("model.weights.bin", new Blob([modelArtifacts.weightData], { type: OCTET_STREAM_MIME_TYPE }), "model.weights.bin"); - } - const response = await this.fetch(this.path, init2); - if (response.ok) { - return { - modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts), - responses: [response] - }; - } else { - throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${response.status}.`); - } - } - async load() { - const modelConfigRequest = await this.fetch(this.path, this.requestInit); - if (!modelConfigRequest.ok) { - throw new Error(`Request to ${this.path} failed with status code ${modelConfigRequest.status}. Please verify this URL points to the model JSON of the model to load.`); - } - let modelConfig; - try { - modelConfig = await modelConfigRequest.json(); - } catch (e) { - let message = `Failed to parse model JSON of response from ${this.path}.`; - if (this.path.endsWith(".pb")) { - message += " Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository."; - } else { - message += " Please make sure the server is serving valid JSON for this request."; - } - throw new Error(message); - } - const modelTopology = modelConfig.modelTopology; - const weightsManifest = modelConfig.weightsManifest; - const generatedBy = modelConfig.generatedBy; - const convertedBy = modelConfig.convertedBy; - const format = modelConfig.format; - const signature = modelConfig.signature; - const userDefinedMetadata = modelConfig.userDefinedMetadata; - if (modelTopology == null && weightsManifest == null) { - throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`); - } - let weightSpecs; - let weightData; - if (weightsManifest != null) { - const results = await this.loadWeights(weightsManifest); - [weightSpecs, weightData] = results; - } - const artifacts = { - modelTopology, - weightSpecs, - weightData, - generatedBy, - convertedBy, - format - }; - if (signature != null) { - artifacts.signature = signature; - } - if (userDefinedMetadata != null) { - artifacts.userDefinedMetadata = userDefinedMetadata; - } - const initializer = modelConfig.modelInitializer; - if (initializer) { - artifacts.modelInitializer = initializer; - } - return artifacts; - } - async loadWeights(weightsManifest) { - const weightPath = Array.isArray(this.path) ? this.path[1] : this.path; - const [prefix, suffix] = parseUrl(weightPath); - const pathPrefix = this.weightPathPrefix || prefix; - const weightSpecs = []; - for (const entry of weightsManifest) { - weightSpecs.push(...entry.weights); - } - const fetchURLs = []; - const urlPromises = []; - for (const weightsGroup of weightsManifest) { - for (const path of weightsGroup.paths) { - if (this.weightUrlConverter != null) { - urlPromises.push(this.weightUrlConverter(path)); - } else { - fetchURLs.push(pathPrefix + path + suffix); - } - } - } - if (this.weightUrlConverter) { - fetchURLs.push(...await Promise.all(urlPromises)); - } - const buffers = await loadWeightsAsArrayBuffer(fetchURLs, { - requestInit: this.requestInit, - fetchFunc: this.fetch, - onProgress: this.onProgress - }); - return [weightSpecs, concatenateArrayBuffers(buffers)]; - } -}; -HTTPRequest.URL_SCHEME_REGEX = /^https?:\/\//; -function parseUrl(url) { - const lastSlash = url.lastIndexOf("/"); - const lastSearchParam = url.lastIndexOf("?"); - const prefix = url.substring(0, lastSlash); - const suffix = lastSearchParam > lastSlash ? url.substring(lastSearchParam) : ""; - return [prefix + "/", suffix]; -} -function isHTTPScheme(url) { - return url.match(HTTPRequest.URL_SCHEME_REGEX) != null; -} -var httpRouter = (url, loadOptions) => { - if (typeof fetch === "undefined" && (loadOptions == null || loadOptions.fetchFunc == null)) { - return null; - } else { - let isHTTP = true; - if (Array.isArray(url)) { - isHTTP = url.every((urlItem) => isHTTPScheme(urlItem)); - } else { - isHTTP = isHTTPScheme(url); - } - if (isHTTP) { - return http(url, loadOptions); - } - } - return null; -}; -IORouterRegistry.registerSaveRouter(httpRouter); -IORouterRegistry.registerLoadRouter(httpRouter); -function http(path, loadOptions) { - return new HTTPRequest(path, loadOptions); -} -function browserHTTPRequest(path, loadOptions) { - return http(path, loadOptions); -} -var PassthroughLoader = class { - constructor(modelArtifacts) { - this.modelArtifacts = modelArtifacts; - } - async load() { - return this.modelArtifacts; - } -}; -var PassthroughSaver = class { - constructor(saveHandler) { - this.saveHandler = saveHandler; - } - async save(modelArtifacts) { - return this.saveHandler(modelArtifacts); - } -}; -function fromMemory(modelArtifacts, weightSpecs, weightData, trainingConfig) { - if (arguments.length === 1) { - const isModelArtifacts = modelArtifacts.modelTopology != null || modelArtifacts.weightSpecs != null; - if (isModelArtifacts) { - return new PassthroughLoader(modelArtifacts); - } else { - console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."); - return new PassthroughLoader({ modelTopology: modelArtifacts }); - } - } else { - console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."); - return new PassthroughLoader({ - modelTopology: modelArtifacts, - weightSpecs, - weightData, - trainingConfig - }); - } -} -function withSaveHandler(saveHandler) { - return new PassthroughSaver(saveHandler); -} -var math_exports = {}; -__export2(math_exports, { - confusionMatrix: () => confusionMatrix -}); -function matMul_(a, b, transposeA = false, transposeB = false) { - let $a = convertToTensor(a, "a", "matMul"); - let $b = convertToTensor(b, "b", "matMul"); - [$a, $b] = makeTypesMatch($a, $b); - const inputs = { a: $a, b: $b }; - const attrs = { transposeA, transposeB }; - return ENGINE.runKernel(BatchMatMul, inputs, attrs); -} -var matMul = op({ matMul_ }); -function oneHot_(indices, depth, onValue = 1, offValue = 0) { - if (depth < 2) { - throw new Error(`Error in oneHot: depth must be >=2, but it is ${depth}`); - } - const $indices = convertToTensor(indices, "indices", "oneHot", "int32"); - const inputs = { indices: $indices }; - const attrs = { depth, onValue, offValue }; - return ENGINE.runKernel(OneHot, inputs, attrs); -} -var oneHot = op({ oneHot_ }); -function transpose_(x, perm) { - const $x = convertToTensor(x, "x", "transpose"); - if (perm == null) { - perm = $x.shape.map((s, i) => i).reverse(); - } - assert($x.rank === perm.length, () => `Error in transpose: rank of input ${$x.rank} must match length of perm ${perm}.`); - perm.forEach((axis) => { - assert(axis >= 0 && axis < $x.rank, () => `All entries in 'perm' must be between 0 and ${$x.rank - 1} but got ${perm}`); - }); - if ($x.rank <= 1) { - return $x.clone(); - } - const inputs = { x: $x }; - const attrs = { perm }; - return ENGINE.runKernel(Transpose, inputs, attrs); -} -var transpose = op({ transpose_ }); -function confusionMatrix_(labels2, predictions, numClasses) { - const $labels = convertToTensor(labels2, "labels", "confusionMatrix"); - const $predictions = convertToTensor(predictions, "predictions", "confusionMatrix"); - assert(numClasses == null || numClasses > 0 && Number.isInteger(numClasses), () => `If provided, numClasses must be a positive integer, but got ${numClasses}`); - assert($labels.rank === 1, () => `Expected the rank of labels to be 1, but got ${$labels.rank}`); - assert($predictions.rank === 1, () => `Expected the rank of predictions to be 1, but got ${$predictions.rank}`); - assert($labels.shape[0] === $predictions.shape[0], () => `Mismatch in the number of examples: ${$labels.shape[0]} vs. ${$predictions.shape[0]}. Labels and predictions should have the same number of elements.`); - assert(numClasses > 0 && Number.isInteger(numClasses), () => `numClasses is required to be a positive integer, but got ${numClasses}`); - const oneHotLabels = oneHot(cast($labels, "int32"), numClasses); - const oneHotPredictions = oneHot(cast($predictions, "int32"), numClasses); - const oneHotLabelsT = transpose(oneHotLabels); - const product = matMul(oneHotLabelsT, oneHotPredictions); - return cast(product, "int32"); -} -var confusionMatrix = op({ confusionMatrix_ }); -var browser_exports = {}; -__export2(browser_exports, { - fromPixels: () => fromPixels, - fromPixelsAsync: () => fromPixelsAsync, - toPixels: () => toPixels -}); -function tensor3d(values, shape, dtype) { - assertNonNull(values); - if (shape != null && shape.length !== 3) { - throw new Error("tensor3d() requires shape to have three numbers"); - } - const inferredShape = inferShape(values, dtype); - if (inferredShape.length !== 3 && inferredShape.length !== 1) { - throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray"); - } - if (inferredShape.length === 1 && shape == null) { - throw new Error("tensor3d() requires shape to be provided when `values` are a flat array"); - } - return makeTensor(values, shape, inferredShape, dtype); -} -var fromPixels2DContext; -function fromPixels_(pixels, numChannels = 3) { - if (numChannels > 4) { - throw new Error("Cannot construct Tensor with more than 4 channels from pixels."); - } - if (pixels == null) { - throw new Error("pixels passed to tf.browser.fromPixels() can not be null"); - } - let isPixelData2 = false; - let isImageData = false; - let isVideo = false; - let isImage = false; - let isCanvasLike = false; - let isImageBitmap = false; - if (pixels.data instanceof Uint8Array) { - isPixelData2 = true; - } else if (typeof ImageData !== "undefined" && pixels instanceof ImageData) { - isImageData = true; - } else if (typeof HTMLVideoElement !== "undefined" && pixels instanceof HTMLVideoElement) { - isVideo = true; - } else if (typeof HTMLImageElement !== "undefined" && pixels instanceof HTMLImageElement) { - isImage = true; - } else if (pixels.getContext != null) { - isCanvasLike = true; - } else if (typeof ImageBitmap !== "undefined" && pixels instanceof ImageBitmap) { - isImageBitmap = true; - } else { - throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${pixels.constructor.name}`); - } - if (isVideo) { - const HAVE_CURRENT_DATA_READY_STATE = 2; - if (isVideo && pixels.readyState < HAVE_CURRENT_DATA_READY_STATE) { - throw new Error("The video element has not loaded data yet. Please wait for `loadeddata` event on the