commit bc0c412f30e18f2069e1b9081f2f7728261c12ed Author: Bojan Mojsilovic Date: Fri Jul 7 16:14:22 2023 +0200 Opening my eyes diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..76add87 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +dist \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a14b6f6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 PRIMAL SYSTEMS INC. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..2643c2a --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# Primal Web Client + +This repo holds the web client of the Primal Nostr. + +## Setup + +- Clone this repo +- run `npm install` +- run `npm run dev` to stand a local instance + +## Development + +This code is still very much a work-in-progress. Expect major changes of structure and logic to be happening somewhat frequently. +Major features are still missing. + +This code is provided as-is. diff --git a/fonts-google.css b/fonts-google.css new file mode 100644 index 0000000..823d09a --- /dev/null +++ b/fonts-google.css @@ -0,0 +1,181 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 100; + font-stretch: 100%; + font-display: swap; + src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-wmF9lp.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 100; + font-stretch: 100%; + font-display: swap; + src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-UmF9lp.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 100; + font-stretch: 100%; + font-display: swap; + src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-ImF9lp.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 100; + font-stretch: 100%; + font-display: swap; + src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-4mF9lp.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 100; + font-stretch: 100%; + font-display: swap; + src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-8mF9lp.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 100; + font-stretch: 100%; + font-display: swap; + src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-EmFw.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-wmF9lp.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-UmF9lp.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-ImF9lp.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-4mF9lp.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-8mF9lp.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: swap; + src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-EmFw.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-wmF9lp.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-UmF9lp.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-ImF9lp.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-4mF9lp.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-8mF9lp.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: swap; + src: url(https://fonts.gstatic.com/s/robotoflex/v9/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-EmFw.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + diff --git a/index.html b/index.html new file mode 100644 index 0000000..4bcad56 --- /dev/null +++ b/index.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + Primal + + + +
+ + + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..d112be7 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2298 @@ +{ + "name": "vite-template-solid", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vite-template-solid", + "version": "0.0.0", + "license": "MIT", + "dependencies": { + "@cookbook/solid-intl": "^0.1.2", + "@jukben/emoji-search": "^2.0.1", + "@picocss/pico": "^1.5.7", + "@scure/base": "^1.1.1", + "@solidjs/router": "^0.7.0", + "@thisbeyond/solid-select": "^0.13.0", + "@types/dompurify": "^2.4.0", + "dompurify": "^3.0.0", + "link-preview-js": "^3.0.4", + "nostr-tools": "^1.4.1", + "sass": "^1.58.0", + "solid-js": "^1.6.6" + }, + "devDependencies": { + "@formatjs/cli": "^6.0.4", + "typescript": "^4.9.4", + "vite": "^4.0.3", + "vite-plugin-solid": "^2.5.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", + "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", + "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz", + "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", + "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.13.tgz", + "integrity": "sha512-O7I/THxarGcDZxkgWKMUrk7NK1/WbHAg3Xx86gqS6x9MTrNL6AwIluuZ96ms4xeDe6AVx6rjHbWHP7x26EPQBA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.20.12", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", + "dependencies": { + "regenerator-runtime": "^0.13.2" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", + "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.13", + "@babel/types": "^7.20.7", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cookbook/solid-intl": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@cookbook/solid-intl/-/solid-intl-0.1.2.tgz", + "integrity": "sha512-mrnm8MJ+rskAF0txqs0mxBU4tra3HAnoxjqlcGMH3Bnfkgj90HycpNND7bLYeCMsTQm93Kz5C1AidbHwoSYppA==", + "dependencies": { + "@formatjs/intl": "^2.6.3" + }, + "peerDependencies": { + "solid-js": ">=1.0.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@formatjs/cli": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@formatjs/cli/-/cli-6.0.4.tgz", + "integrity": "sha512-ivb+uUcYmHnffBkXM7OM4NDofxyfnVvW5G52p+M9Cg3DGMz3wVBm3TwW3SXgGGTft7CMWHeGQGXjxTOwBYKeEA==", + "dev": true, + "bin": { + "formatjs": "bin/formatjs" + }, + "engines": { + "node": ">= 16" + }, + "peerDependencies": { + "@vue/compiler-sfc": "^3.2.34" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + } + } + }, + "node_modules/@formatjs/ecma402-abstract": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.14.3.tgz", + "integrity": "sha512-SlsbRC/RX+/zg4AApWIFNDdkLtFbkq3LNoZWXZCE/nHVKqoIJyaoQyge/I0Y38vLxowUn9KTtXgusLD91+orbg==", + "dependencies": { + "@formatjs/intl-localematcher": "0.2.32", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.0.1.tgz", + "integrity": "sha512-M2GgV+qJn5WJQAYewz7q2Cdl6fobQa69S1AzSM2y0P68ZDbK5cWrJIcPCO395Of1ksftGZoOt4LYCO/j9BKBSA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.3.0.tgz", + "integrity": "sha512-xqtlqYAbfJDF4b6e4O828LBNOWXrFcuYadqAbYORlDRwhyJ2bH+xpUBPldZbzRGUN2mxlZ4Ykhm7jvERtmI8NQ==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.14.3", + "@formatjs/icu-skeleton-parser": "1.3.18", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.18.tgz", + "integrity": "sha512-ND1ZkZfmLPcHjAH1sVpkpQxA+QYfOX3py3SjKWMUVGDow18gZ0WPqz3F+pJLYQMpS2LnnQ5zYR2jPVYTbRwMpg==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.14.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.6.9.tgz", + "integrity": "sha512-EtcMZ9O24YSASu/jGOaTQtArx7XROjlKiO4KmkxJ/3EyAQLCr5hrS+KKvNud0a7GIwBucOb3IFrZ7WiSm2A/Cw==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.14.3", + "@formatjs/fast-memoize": "2.0.1", + "@formatjs/icu-messageformat-parser": "2.3.0", + "@formatjs/intl-displaynames": "6.2.6", + "@formatjs/intl-listformat": "7.1.9", + "intl-messageformat": "10.3.3", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "typescript": "^4.7" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@formatjs/intl-displaynames": { + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-6.2.6.tgz", + "integrity": "sha512-scf5AQTk9EjpvPhboo5sizVOvidTdMOnajv9z+0cejvl7JNl9bl/aMrNBgC72UH+bP3l45usPUKAGskV6sNIrA==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.14.3", + "@formatjs/intl-localematcher": "0.2.32", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-listformat": { + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.1.9.tgz", + "integrity": "sha512-5YikxwRqRXTVWVujhswDOTCq6gs+m9IcNbNZLa6FLtyBStAjEsuE2vAU+lPsbz9ZTST57D5fodjIh2JXT6sMWQ==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.14.3", + "@formatjs/intl-localematcher": "0.2.32", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.2.32", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.32.tgz", + "integrity": "sha512-k/MEBstff4sttohyEpXxCmC3MqbUn9VvHGlZ8fauLzkbwXmVrEeyzS+4uhrvAk9DWU9/7otYWxyDox4nT/KVLQ==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jukben/emoji-search": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@jukben/emoji-search/-/emoji-search-2.0.1.tgz", + "integrity": "sha512-jXVcJGTBl+uOsGld+6J+hcHlRt3Vhm9ffvkrb1IeSVXuFCuyklY2XPI2wvSHG1uMGXfgmKbuUe1MCh1ZV3CXNg==", + "dependencies": { + "@babel/runtime": "7.5.5", + "emojilib": "2.4.0", + "match-sorter": "4.0.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@picocss/pico": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@picocss/pico/-/pico-1.5.7.tgz", + "integrity": "sha512-RygdXNlSXieAs9jMw/AeqA1ki1kldgEYbRn8BnYZIPfRTM5NWZ4uVzMK6uMPhYlRjoT5wD/OplZvIefnCqyDCQ==" + }, + "node_modules/@scure/base": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", + "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@scure/bip32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.4.tgz", + "integrity": "sha512-m925ACYK0wPELsF7Z/VdLGmKj1StIeHraPMYB9xiAFiq/PnvqWd/99I0TQ2OZhjjlMDsDJeZlyXMWi0beaA7NA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/@solidjs/router": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@solidjs/router/-/router-0.7.0.tgz", + "integrity": "sha512-8HI84twe5FjYRebSLMAhtkL9bRuTDIlxJK56kjfjU9WKGoUCTaWpCnkuj8Hqde1bWZ0X+GOZxKDfNkn1CjtjxA==", + "peerDependencies": { + "solid-js": "^1.5.3" + } + }, + "node_modules/@thisbeyond/solid-select": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@thisbeyond/solid-select/-/solid-select-0.13.0.tgz", + "integrity": "sha512-eION+Xf8TGLs1NZrvRo1NRKOl4plYMbY7UswHhh5bEUY8oMltjrBhUWF0hzaFViEc1zZpkCQyafaD89iofG6Tg==", + "peerDependencies": { + "solid-js": "^1.5" + } + }, + "node_modules/@types/dompurify": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.4.0.tgz", + "integrity": "sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg==", + "dependencies": { + "@types/trusted-types": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", + "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/babel-plugin-jsx-dom-expressions": { + "version": "0.35.15", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.35.15.tgz", + "integrity": "sha512-33GQnanjYKefOTO2lQK6EaKXPJ1W8vtzvBneGfhKaOZHQJLqe61P93jP0TLTz67sqsA0m1ph1cNdGpLc/Nx2Xg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "7.18.6", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.20.7", + "html-entities": "2.3.3", + "validate-html-nesting": "^1.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.20.12" + } + }, + "node_modules/babel-preset-solid": { + "version": "1.6.10", + "resolved": "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.6.10.tgz", + "integrity": "sha512-qBLjzeWmgY5jX11sJg/lriXABYdClfJrJJrIHaT6G5EuGhxhm6jn7XjqXjLBZHBgy5n/Z+iqJ5YfQj8KG2jKTA==", + "dev": true, + "dependencies": { + "babel-plugin-jsx-dom-expressions": "^0.35.15" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001449", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001449.tgz", + "integrity": "sha512-CPB+UL9XMT/Av+pJxCKGhdx+yg1hzplvFJQlJ2n68PyQGMz9L/E2zCyLdOL8uasbouTUgnPl+y0tccI/se+BEw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.11", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz", + "integrity": "sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.0.tgz", + "integrity": "sha512-0g/yr2IJn4nTbxwL785YxS7/AvvgGFJw6LLWP+BzWzB1+BYOqPUT9Hy0rXrZh5HLdHnxH72aDdzvC9SdTjsuaA==" + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "dev": true + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/immutable": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.2.tgz", + "integrity": "sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og==" + }, + "node_modules/intl-messageformat": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.3.3.tgz", + "integrity": "sha512-un/f07/g2e/3Q8e1ghDKET+el22Bi49M7O/rHxd597R+oLpPOMykSv5s51cABVfu3FZW+fea4hrzf2MHu1W4hw==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.14.3", + "@formatjs/fast-memoize": "2.0.1", + "@formatjs/icu-messageformat-parser": "2.3.0", + "tslib": "^2.4.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-what": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.8.tgz", + "integrity": "sha512-yq8gMao5upkPoGEU9LsB2P+K3Kt8Q3fQFCGyNCWOAnJAMzEXVV9drYb0TXr42TTliLLhKIBvulgAXgtLLnwzGA==", + "dev": true, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/link-preview-js": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/link-preview-js/-/link-preview-js-3.0.4.tgz", + "integrity": "sha512-xsuxMigAZd4xmj6BIwMNuQjjpJdh0DWeIo1NXQgaoWSi9Z/dzz/Kxy6vzzsUonFlMTPJ1i0EC8aeOg/xrOMidg==", + "dependencies": { + "abort-controller": "^3.0.0", + "cheerio": "1.0.0-rc.11", + "cross-fetch": "3.1.5", + "url": "0.11.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/match-sorter": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-4.0.0.tgz", + "integrity": "sha512-E4DWje5l7+VvDUlqnACXy1iecuD6ZNiqUFw/DUYdFQljRIskZVHoT+76lLv5zz2BQOTxF2CUEgP1/Xu9Xn3MyQ==", + "dependencies": { + "remove-accents": "0.4.2" + } + }, + "node_modules/merge-anything": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-5.1.4.tgz", + "integrity": "sha512-7PWKwGOs5WWcpw+/OvbiFiAvEP6bv/QHiicigpqMGKIqPPAtGhBLR8LFJW+Zu6m9TXiR/a8+AiPlGG0ko1ruoQ==", + "dev": true, + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz", + "integrity": "sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nostr-tools": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-1.10.1.tgz", + "integrity": "sha512-zgTYJeuZQ3CDASsmBEcB5i6V6l0IaA6cjnll6OVik3FoZcvbCaL7yP8I40hYnOIi3KlJykV7jEF9fn8h1NzMnA==", + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/base": "1.1.1", + "@scure/bip32": "1.1.4", + "@scure/bip39": "1.1.1" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/remove-accents": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", + "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.12.0.tgz", + "integrity": "sha512-4MZ8kA2HNYahIjz63rzrMMRvDqQDeS9LoriJvMuV0V6zIGysP36e9t4yObUfwdT9h/szXoHQideICftcdZklWg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/sass": { + "version": "1.58.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.0.tgz", + "integrity": "sha512-PiMJcP33DdKtZ/1jSjjqVIKihoDc6yWmYr9K/4r3fVVIEDAluD0q7XZiRKrNJcPK3qkLRF/79DND1H5q1LBjgg==", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/solid-js": { + "version": "1.6.10", + "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.6.10.tgz", + "integrity": "sha512-Sf0e6PQCEFkFtbPq0L+93Ua81YQOefBEbvDJ0YXT92b6Lzw0k7UvzSd2l1BbYM+yzE3UmepU1tyMDc/3nIByjA==", + "dependencies": { + "csstype": "^3.1.0" + } + }, + "node_modules/solid-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/solid-refresh/-/solid-refresh-0.4.3.tgz", + "integrity": "sha512-7+4/gYsVi0BlM4PzT1PU1TB5nW3Hv8FWuB+Kw/ofWui7KQkWBf+dVZOrReQYHEmLCzytHUa2JysUXgzVALJmSw==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.18.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/types": "^7.18.4" + }, + "peerDependencies": { + "solid-js": "^1.3" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/validate-html-nesting": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/validate-html-nesting/-/validate-html-nesting-1.2.0.tgz", + "integrity": "sha512-sI65QUd3T/e5wbQkdPKjikFsIVLPIaOQK+9uowPp6/k609SN8hs5eqBLrnN5DeW9Kd932Q4Imo0fzK2dxoOsCA==", + "dev": true + }, + "node_modules/vite": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz", + "integrity": "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==", + "dev": true, + "dependencies": { + "esbuild": "^0.16.3", + "postcss": "^8.4.20", + "resolve": "^1.22.1", + "rollup": "^3.7.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-solid": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/vite-plugin-solid/-/vite-plugin-solid-2.5.0.tgz", + "integrity": "sha512-VneGd3RyFJvwaiffsqgymeMaofn0IzQLPwDzafTV2f1agoWeeJlk5VrI5WqT9BTtLe69vNNbCJWqLhHr9fOdDw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.5", + "@babel/preset-typescript": "^7.18.6", + "babel-preset-solid": "^1.6.3", + "merge-anything": "^5.1.4", + "solid-refresh": "^0.4.1", + "vitefu": "^0.2.3" + }, + "peerDependencies": { + "solid-js": "^1.3.17 || ^1.4.0 || ^1.5.0 || ^1.6.0", + "vite": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/vitefu": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", + "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", + "dev": true, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..4e5b601 --- /dev/null +++ b/package.json @@ -0,0 +1,37 @@ +{ + "name": "vite-template-solid", + "version": "0.0.0", + "description": "", + "scripts": { + "start": "vite", + "dev": "vite", + "dev:host": "vite --host", + "build": "vite build", + "build:unminified": "vite build --minify=false", + "serve": "vite preview", + "host": "vite preview --host", + "extract": "formatjs extract", + "compile": "formatjs compile" + }, + "license": "MIT", + "devDependencies": { + "@formatjs/cli": "^6.0.4", + "typescript": "^4.9.4", + "vite": "^4.0.3", + "vite-plugin-solid": "^2.5.0" + }, + "dependencies": { + "@cookbook/solid-intl": "^0.1.2", + "@jukben/emoji-search": "^2.0.1", + "@picocss/pico": "^1.5.7", + "@scure/base": "^1.1.1", + "@solidjs/router": "^0.7.0", + "@thisbeyond/solid-select": "^0.13.0", + "@types/dompurify": "^2.4.0", + "dompurify": "^3.0.0", + "link-preview-js": "^3.0.4", + "nostr-tools": "^1.4.1", + "sass": "^1.58.0", + "solid-js": "^1.6.6" + } +} diff --git a/public/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-4mF9lp.woff2 b/public/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-4mF9lp.woff2 new file mode 100644 index 0000000..210269a Binary files /dev/null and b/public/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-4mF9lp.woff2 differ diff --git a/public/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-8mF9lp.woff2 b/public/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-8mF9lp.woff2 new file mode 100644 index 0000000..5460715 Binary files /dev/null and b/public/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-8mF9lp.woff2 differ diff --git a/public/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-EmFw.woff2 b/public/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-EmFw.woff2 new file mode 100644 index 0000000..e1159ed Binary files /dev/null and b/public/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-EmFw.woff2 differ diff --git a/public/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-ImF9lp.woff2 b/public/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-ImF9lp.woff2 new file mode 100644 index 0000000..b3e3f79 Binary files /dev/null and b/public/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-ImF9lp.woff2 differ diff --git a/public/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-UmF9lp.woff2 b/public/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-UmF9lp.woff2 new file mode 100644 index 0000000..eab4010 Binary files /dev/null and b/public/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-UmF9lp.woff2 differ diff --git a/public/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-wmF9lp.woff2 b/public/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-wmF9lp.woff2 new file mode 100644 index 0000000..4f52153 Binary files /dev/null and b/public/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-wmF9lp.woff2 differ diff --git a/public/public/fonts.css b/public/public/fonts.css new file mode 100644 index 0000000..e8e8c97 --- /dev/null +++ b/public/public/fonts.css @@ -0,0 +1,180 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 100; + font-stretch: 100%; + font-display: block; + src: url(/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-wmF9lp.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 100; + font-stretch: 100%; + font-display: block; + src: url(/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-UmF9lp.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 100; + font-stretch: 100%; + font-display: block; + src: url(/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-ImF9lp.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 100; + font-stretch: 100%; + font-display: block; + src: url(/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-4mF9lp.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 100; + font-stretch: 100%; + font-display: block; + src: url(/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-8mF9lp.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 100; + font-stretch: 100%; + font-display: block; + src: url(/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-EmFw.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: block; + src: url(/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-wmF9lp.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: block; + src: url(/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-UmF9lp.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: block; + src: url(/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-ImF9lp.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: block; + src: url(/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-4mF9lp.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: block; + src: url(/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-8mF9lp.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 400; + font-stretch: 100%; + font-display: block; + src: url(/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-EmFw.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: block; + src: url(/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-wmF9lp.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: block; + src: url(/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-UmF9lp.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: block; + src: url(/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-ImF9lp.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: block; + src: url(/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-4mF9lp.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: block; + src: url(/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-8mF9lp.woff2) format('woff2'); + unicode-range: U+0100-02AF, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Flex'; + font-style: normal; + font-weight: 700; + font-stretch: 100%; + font-display: block; + src: url(/public/NaNeepOXO_NexZs0b5QrzlOHb8wCikXpYqmZsWI-__OGfttPZktqc2VdZ80KvCLZaPcSBZtOx2MifRuWR28sPJtUMbsFEK6cRrleUx9Xgbm3WLHa_F4Ep4Fm0PN19Ik5Dntczx0wZGzhPlL1YNMYKbv9_1IQXOw7AiUJVXRrV8cWW4O8LJCoXjCnwSRSaLshNP1d9-EmFw.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/public/public/primal-thumbnail.png b/public/public/primal-thumbnail.png new file mode 100644 index 0000000..d5bcf74 Binary files /dev/null and b/public/public/primal-thumbnail.png differ diff --git a/src/App.module.scss b/src/App.module.scss new file mode 100644 index 0000000..2e9bc94 --- /dev/null +++ b/src/App.module.scss @@ -0,0 +1,6 @@ +.invisible { + position: fixed; + width: 0px !important; + height: 0px !important; + opacity: 0; +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..c700e37 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,64 @@ +import { Component, onCleanup, onMount } from 'solid-js'; +import { AccountProvider } from './contexts/AccountContext'; +import { connect, disconnect } from './sockets'; +import { connect as uploadConnect, disconnect as uploadDisconnet } from './uploadSocket'; +import styles from './App.module.scss'; +import Toaster from './components/Toaster/Toaster'; +import { HomeProvider } from './contexts/HomeContext'; +import { ExploreProvider } from './contexts/ExploreContext'; +import { ThreadProvider } from './contexts/ThreadContext'; +import Router from './Router'; +import { ProfileProvider } from './contexts/ProfileContext'; +import { SettingsProvider } from './contexts/SettingsContext'; +import { TranslatorProvider } from './contexts/TranslatorContext'; +import { NotificationsProvider } from './contexts/NotificationsContext'; +import { SearchProvider } from './contexts/SearchContext'; +import { MessagesProvider } from './contexts/MessagesContext'; +import { MediaProvider } from './contexts/MediaContext'; + + +export const APP_ID = `${Math.floor(Math.random()*10000000000)}`; + +const App: Component = () => { + + onMount(() => { + connect(); + uploadConnect(); + }); + + onCleanup(() => { + disconnect(); + uploadDisconnet(); + }) + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default App; diff --git a/src/Router.tsx b/src/Router.tsx new file mode 100644 index 0000000..a0ac3f3 --- /dev/null +++ b/src/Router.tsx @@ -0,0 +1,91 @@ +import { Component, createReaction, createResource, lazy, Resource } from 'solid-js'; +import { Routes, Route, Navigate, RouteDataFuncArgs } from "@solidjs/router" +import Home from './pages/Home'; +import Layout from './components/Layout/Layout'; +import Explore from './pages/Explore'; +import Thread from './pages/Thread'; +import Messages from './pages/Messages'; +import Notifications from './pages/Notifications'; +import Downloads from './pages/Downloads'; +import Settings from './pages/Settings'; +import Help from './pages/Help'; +// import Profile from './pages/Profile'; +import { PrimalWindow } from './types/primal'; +import { useHomeContext } from './contexts/HomeContext'; +import { useExploreContext } from './contexts/ExploreContext'; +import { useThreadContext } from './contexts/ThreadContext'; +import { useAccountContext } from './contexts/AccountContext'; +import { useProfileContext } from './contexts/ProfileContext'; +import { useSettingsContext } from './contexts/SettingsContext'; +import NotFound from './pages/NotFound'; +import { fetchKnownProfiles } from './lib/profile'; +import Search from './pages/Search'; +import { useMessagesContext } from './contexts/MessagesContext'; +import { useMediaContext } from './contexts/MediaContext'; +import { useNotificationsContext } from './contexts/NotificationsContext'; +import { useSearchContext } from './contexts/SearchContext'; + +const primalWindow = window as PrimalWindow; + +const Router: Component = () => { + + const account = useAccountContext(); + const profile = useProfileContext(); + const settings = useSettingsContext(); + const home = useHomeContext(); + const explore = useExploreContext(); + const thread = useThreadContext(); + const messages = useMessagesContext(); + const media = useMediaContext(); + const notifications = useNotificationsContext(); + const search = useSearchContext(); + + const loadPrimalStores = () => { + primalWindow.primal = { + account, + explore, + home, + media, + messages, + notifications, + profile, + search, + settings, + thread, + }; + }; + + primalWindow.loadPrimalStores = loadPrimalStores; + + const Profile = lazy(() => import('./pages/Profile')) + + const getKnownProfiles = ({ params }: RouteDataFuncArgs) => { + const [profiles] = createResource(params.vanityName, fetchKnownProfiles) + return profiles; + } + + return ( + <> + + + } /> + + + + + + + + + + + + + + + + + ); +}; + +export default Router; diff --git a/src/assets/favicon.ico b/src/assets/favicon.ico new file mode 100644 index 0000000..d98a7c0 Binary files /dev/null and b/src/assets/favicon.ico differ diff --git a/src/assets/icons/attach_media.svg b/src/assets/icons/attach_media.svg new file mode 100644 index 0000000..4909985 --- /dev/null +++ b/src/assets/icons/attach_media.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/back.svg b/src/assets/icons/back.svg new file mode 100644 index 0000000..aaa6f47 --- /dev/null +++ b/src/assets/icons/back.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/caret.svg b/src/assets/icons/caret.svg new file mode 100644 index 0000000..ddb1e2f --- /dev/null +++ b/src/assets/icons/caret.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/check-black.svg b/src/assets/icons/check-black.svg new file mode 100644 index 0000000..8740937 --- /dev/null +++ b/src/assets/icons/check-black.svg @@ -0,0 +1,41 @@ + + + + + + diff --git a/src/assets/icons/check.svg b/src/assets/icons/check.svg new file mode 100644 index 0000000..67d6e1d --- /dev/null +++ b/src/assets/icons/check.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/close.svg b/src/assets/icons/close.svg new file mode 100644 index 0000000..39660b3 --- /dev/null +++ b/src/assets/icons/close.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/context.svg b/src/assets/icons/context.svg new file mode 100644 index 0000000..b7c0e51 --- /dev/null +++ b/src/assets/icons/context.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/copy.svg b/src/assets/icons/copy.svg new file mode 100644 index 0000000..6b579e0 --- /dev/null +++ b/src/assets/icons/copy.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/corner_left.svg b/src/assets/icons/corner_left.svg new file mode 100644 index 0000000..8b09421 --- /dev/null +++ b/src/assets/icons/corner_left.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/corner_right.svg b/src/assets/icons/corner_right.svg new file mode 100644 index 0000000..e6746a9 --- /dev/null +++ b/src/assets/icons/corner_right.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/default_avatar.svg b/src/assets/icons/default_avatar.svg new file mode 100644 index 0000000..d6dffe6 --- /dev/null +++ b/src/assets/icons/default_avatar.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/default_nostrich.svg b/src/assets/icons/default_nostrich.svg new file mode 100644 index 0000000..521fbbe --- /dev/null +++ b/src/assets/icons/default_nostrich.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/delete.svg b/src/assets/icons/delete.svg new file mode 100644 index 0000000..d15a3f4 --- /dev/null +++ b/src/assets/icons/delete.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/download.svg b/src/assets/icons/download.svg new file mode 100644 index 0000000..87d8a81 --- /dev/null +++ b/src/assets/icons/download.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/drag_handle.svg b/src/assets/icons/drag_handle.svg new file mode 100644 index 0000000..8eea3e9 --- /dev/null +++ b/src/assets/icons/drag_handle.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/edit.svg b/src/assets/icons/edit.svg new file mode 100644 index 0000000..ccaa264 --- /dev/null +++ b/src/assets/icons/edit.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/explore.svg b/src/assets/icons/explore.svg new file mode 100644 index 0000000..4472d74 --- /dev/null +++ b/src/assets/icons/explore.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/explore/clock.svg b/src/assets/icons/explore/clock.svg new file mode 100644 index 0000000..a83a8e8 --- /dev/null +++ b/src/assets/icons/explore/clock.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/explore/flame.svg b/src/assets/icons/explore/flame.svg new file mode 100644 index 0000000..48f1b12 --- /dev/null +++ b/src/assets/icons/explore/flame.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/explore/follows.svg b/src/assets/icons/explore/follows.svg new file mode 100644 index 0000000..8e5be78 --- /dev/null +++ b/src/assets/icons/explore/follows.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/icons/explore/global.svg b/src/assets/icons/explore/global.svg new file mode 100644 index 0000000..4ad5abf --- /dev/null +++ b/src/assets/icons/explore/global.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/explore/likes.svg b/src/assets/icons/explore/likes.svg new file mode 100644 index 0000000..f78c6f6 --- /dev/null +++ b/src/assets/icons/explore/likes.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/explore/network.svg b/src/assets/icons/explore/network.svg new file mode 100644 index 0000000..552fe89 --- /dev/null +++ b/src/assets/icons/explore/network.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/explore/tribe.svg b/src/assets/icons/explore/tribe.svg new file mode 100644 index 0000000..19328bb --- /dev/null +++ b/src/assets/icons/explore/tribe.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/explore/zaps.svg b/src/assets/icons/explore/zaps.svg new file mode 100644 index 0000000..a081611 --- /dev/null +++ b/src/assets/icons/explore/zaps.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/explore/zaps_hollow.svg b/src/assets/icons/explore/zaps_hollow.svg new file mode 100644 index 0000000..be8c07b --- /dev/null +++ b/src/assets/icons/explore/zaps_hollow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/feed_add.svg b/src/assets/icons/feed_add.svg new file mode 100644 index 0000000..88a50c7 --- /dev/null +++ b/src/assets/icons/feed_add.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/feed_like.svg b/src/assets/icons/feed_like.svg new file mode 100644 index 0000000..bd34559 --- /dev/null +++ b/src/assets/icons/feed_like.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/feed_like_fill.svg b/src/assets/icons/feed_like_fill.svg new file mode 100644 index 0000000..ff5ad67 --- /dev/null +++ b/src/assets/icons/feed_like_fill.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/feed_picker.svg b/src/assets/icons/feed_picker.svg new file mode 100644 index 0000000..259fd56 --- /dev/null +++ b/src/assets/icons/feed_picker.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/feed_remove.svg b/src/assets/icons/feed_remove.svg new file mode 100644 index 0000000..e588f73 --- /dev/null +++ b/src/assets/icons/feed_remove.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/feed_reply.svg b/src/assets/icons/feed_reply.svg new file mode 100644 index 0000000..2f254a0 --- /dev/null +++ b/src/assets/icons/feed_reply.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/feed_reply_fill.svg b/src/assets/icons/feed_reply_fill.svg new file mode 100644 index 0000000..2964b56 --- /dev/null +++ b/src/assets/icons/feed_reply_fill.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/feed_repost.svg b/src/assets/icons/feed_repost.svg new file mode 100644 index 0000000..106e48d --- /dev/null +++ b/src/assets/icons/feed_repost.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/feed_repost_fill.svg b/src/assets/icons/feed_repost_fill.svg new file mode 100644 index 0000000..93467cb --- /dev/null +++ b/src/assets/icons/feed_repost_fill.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/feed_zap.svg b/src/assets/icons/feed_zap.svg new file mode 100644 index 0000000..472277d --- /dev/null +++ b/src/assets/icons/feed_zap.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/feed_zap_fill.svg b/src/assets/icons/feed_zap_fill.svg new file mode 100644 index 0000000..dbf907e --- /dev/null +++ b/src/assets/icons/feed_zap_fill.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/follows.svg b/src/assets/icons/follows.svg new file mode 100644 index 0000000..3ea8590 --- /dev/null +++ b/src/assets/icons/follows.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/follows_latest.svg b/src/assets/icons/follows_latest.svg new file mode 100644 index 0000000..cd65369 --- /dev/null +++ b/src/assets/icons/follows_latest.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/follows_latest_light.svg b/src/assets/icons/follows_latest_light.svg new file mode 100644 index 0000000..1c3298d --- /dev/null +++ b/src/assets/icons/follows_latest_light.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/follows_light.svg b/src/assets/icons/follows_light.svg new file mode 100644 index 0000000..a31768e --- /dev/null +++ b/src/assets/icons/follows_light.svg @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/follows_popular.svg b/src/assets/icons/follows_popular.svg new file mode 100644 index 0000000..a392ac5 --- /dev/null +++ b/src/assets/icons/follows_popular.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/follows_popular_light.svg b/src/assets/icons/follows_popular_light.svg new file mode 100644 index 0000000..6d51af2 --- /dev/null +++ b/src/assets/icons/follows_popular_light.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/follows_trending.svg b/src/assets/icons/follows_trending.svg new file mode 100644 index 0000000..e5f3c37 --- /dev/null +++ b/src/assets/icons/follows_trending.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/follows_trending_light.svg b/src/assets/icons/follows_trending_light.svg new file mode 100644 index 0000000..2857de7 --- /dev/null +++ b/src/assets/icons/follows_trending_light.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/forward.svg b/src/assets/icons/forward.svg new file mode 100644 index 0000000..89ef8db --- /dev/null +++ b/src/assets/icons/forward.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/get_started.svg b/src/assets/icons/get_started.svg new file mode 100644 index 0000000..c1837d0 --- /dev/null +++ b/src/assets/icons/get_started.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/assets/icons/github.svg b/src/assets/icons/github.svg new file mode 100644 index 0000000..0223dcb --- /dev/null +++ b/src/assets/icons/github.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/github_light.svg b/src/assets/icons/github_light.svg new file mode 100644 index 0000000..4669af8 --- /dev/null +++ b/src/assets/icons/github_light.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/global.svg b/src/assets/icons/global.svg new file mode 100644 index 0000000..7bdfc32 --- /dev/null +++ b/src/assets/icons/global.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/global_latest.svg b/src/assets/icons/global_latest.svg new file mode 100644 index 0000000..43d050e --- /dev/null +++ b/src/assets/icons/global_latest.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/global_latest_light.svg b/src/assets/icons/global_latest_light.svg new file mode 100644 index 0000000..5aec3ea --- /dev/null +++ b/src/assets/icons/global_latest_light.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/global_light.svg b/src/assets/icons/global_light.svg new file mode 100644 index 0000000..b806c34 --- /dev/null +++ b/src/assets/icons/global_light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/global_popular.svg b/src/assets/icons/global_popular.svg new file mode 100644 index 0000000..990407b --- /dev/null +++ b/src/assets/icons/global_popular.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/global_popular_light.svg b/src/assets/icons/global_popular_light.svg new file mode 100644 index 0000000..b1ab616 --- /dev/null +++ b/src/assets/icons/global_popular_light.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/global_trending.svg b/src/assets/icons/global_trending.svg new file mode 100644 index 0000000..04a40fe --- /dev/null +++ b/src/assets/icons/global_trending.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/global_trending_light.svg b/src/assets/icons/global_trending_light.svg new file mode 100644 index 0000000..734fa7e --- /dev/null +++ b/src/assets/icons/global_trending_light.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/golbal_popular.svg b/src/assets/icons/golbal_popular.svg new file mode 100644 index 0000000..d00562f --- /dev/null +++ b/src/assets/icons/golbal_popular.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/help.svg b/src/assets/icons/help.svg new file mode 100644 index 0000000..d624030 --- /dev/null +++ b/src/assets/icons/help.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/home.svg b/src/assets/icons/home.svg new file mode 100644 index 0000000..5843407 --- /dev/null +++ b/src/assets/icons/home.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/key.svg b/src/assets/icons/key.svg new file mode 100644 index 0000000..de44eba --- /dev/null +++ b/src/assets/icons/key.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/like.svg b/src/assets/icons/like.svg new file mode 100644 index 0000000..d3a038c --- /dev/null +++ b/src/assets/icons/like.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/like_filled.svg b/src/assets/icons/like_filled.svg new file mode 100644 index 0000000..58c9777 --- /dev/null +++ b/src/assets/icons/like_filled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/link.svg b/src/assets/icons/link.svg new file mode 100644 index 0000000..1f7d157 --- /dev/null +++ b/src/assets/icons/link.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/logo.svg b/src/assets/icons/logo.svg new file mode 100644 index 0000000..d43e531 --- /dev/null +++ b/src/assets/icons/logo.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/logo_fire.svg b/src/assets/icons/logo_fire.svg new file mode 100644 index 0000000..d584495 --- /dev/null +++ b/src/assets/icons/logo_fire.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/logo_ice.svg b/src/assets/icons/logo_ice.svg new file mode 100644 index 0000000..04dcdcd --- /dev/null +++ b/src/assets/icons/logo_ice.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/messages.svg b/src/assets/icons/messages.svg new file mode 100644 index 0000000..113406f --- /dev/null +++ b/src/assets/icons/messages.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/miljan.jpg b/src/assets/icons/miljan.jpg new file mode 100644 index 0000000..2e088d6 Binary files /dev/null and b/src/assets/icons/miljan.jpg differ diff --git a/src/assets/icons/network.svg b/src/assets/icons/network.svg new file mode 100644 index 0000000..fe9e268 --- /dev/null +++ b/src/assets/icons/network.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/network_latest.svg b/src/assets/icons/network_latest.svg new file mode 100644 index 0000000..aebb78d --- /dev/null +++ b/src/assets/icons/network_latest.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/network_latest_light.svg b/src/assets/icons/network_latest_light.svg new file mode 100644 index 0000000..d5e9566 --- /dev/null +++ b/src/assets/icons/network_latest_light.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/network_light.svg b/src/assets/icons/network_light.svg new file mode 100644 index 0000000..b931d10 --- /dev/null +++ b/src/assets/icons/network_light.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/network_popular.svg b/src/assets/icons/network_popular.svg new file mode 100644 index 0000000..c1d8ebd --- /dev/null +++ b/src/assets/icons/network_popular.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/network_popular_light.svg b/src/assets/icons/network_popular_light.svg new file mode 100644 index 0000000..a2ca1d3 --- /dev/null +++ b/src/assets/icons/network_popular_light.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/network_trending.svg b/src/assets/icons/network_trending.svg new file mode 100644 index 0000000..8842ef5 --- /dev/null +++ b/src/assets/icons/network_trending.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/network_trending_light.svg b/src/assets/icons/network_trending_light.svg new file mode 100644 index 0000000..b37ac28 --- /dev/null +++ b/src/assets/icons/network_trending_light.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/notifications.svg b/src/assets/icons/notifications.svg new file mode 100644 index 0000000..8812646 --- /dev/null +++ b/src/assets/icons/notifications.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/notifications/at.svg b/src/assets/icons/notifications/at.svg new file mode 100644 index 0000000..3baca47 --- /dev/null +++ b/src/assets/icons/notifications/at.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/notifications/follows.svg b/src/assets/icons/notifications/follows.svg new file mode 100644 index 0000000..921d9c4 --- /dev/null +++ b/src/assets/icons/notifications/follows.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/notifications/mention.svg b/src/assets/icons/notifications/mention.svg new file mode 100644 index 0000000..ac59246 --- /dev/null +++ b/src/assets/icons/notifications/mention.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/notifications/mention_liked.svg b/src/assets/icons/notifications/mention_liked.svg new file mode 100644 index 0000000..e48e710 --- /dev/null +++ b/src/assets/icons/notifications/mention_liked.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/notifications/mention_replied.svg b/src/assets/icons/notifications/mention_replied.svg new file mode 100644 index 0000000..89bb4ae --- /dev/null +++ b/src/assets/icons/notifications/mention_replied.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/notifications/mention_reposted.svg b/src/assets/icons/notifications/mention_reposted.svg new file mode 100644 index 0000000..7ba4683 --- /dev/null +++ b/src/assets/icons/notifications/mention_reposted.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/notifications/mention_zapped.svg b/src/assets/icons/notifications/mention_zapped.svg new file mode 100644 index 0000000..30d51be --- /dev/null +++ b/src/assets/icons/notifications/mention_zapped.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/notifications/mentioned_post.svg b/src/assets/icons/notifications/mentioned_post.svg new file mode 100644 index 0000000..14f0397 --- /dev/null +++ b/src/assets/icons/notifications/mentioned_post.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/notifications/mentioned_post_liked.svg b/src/assets/icons/notifications/mentioned_post_liked.svg new file mode 100644 index 0000000..3a049cf --- /dev/null +++ b/src/assets/icons/notifications/mentioned_post_liked.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/notifications/mentioned_post_replied.svg b/src/assets/icons/notifications/mentioned_post_replied.svg new file mode 100644 index 0000000..6614cac --- /dev/null +++ b/src/assets/icons/notifications/mentioned_post_replied.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/notifications/mentioned_post_reposted.svg b/src/assets/icons/notifications/mentioned_post_reposted.svg new file mode 100644 index 0000000..c5a52aa --- /dev/null +++ b/src/assets/icons/notifications/mentioned_post_reposted.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/notifications/mentioned_post_zapped.svg b/src/assets/icons/notifications/mentioned_post_zapped.svg new file mode 100644 index 0000000..f48f526 --- /dev/null +++ b/src/assets/icons/notifications/mentioned_post_zapped.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/notifications/post_liked.svg b/src/assets/icons/notifications/post_liked.svg new file mode 100644 index 0000000..b2a1f57 --- /dev/null +++ b/src/assets/icons/notifications/post_liked.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/notifications/post_replied.svg b/src/assets/icons/notifications/post_replied.svg new file mode 100644 index 0000000..e1badbe --- /dev/null +++ b/src/assets/icons/notifications/post_replied.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/notifications/post_reposted.svg b/src/assets/icons/notifications/post_reposted.svg new file mode 100644 index 0000000..3244ed9 --- /dev/null +++ b/src/assets/icons/notifications/post_reposted.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/notifications/post_zapped.svg b/src/assets/icons/notifications/post_zapped.svg new file mode 100644 index 0000000..ff69da8 --- /dev/null +++ b/src/assets/icons/notifications/post_zapped.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/icons/notifications/user_followed.svg b/src/assets/icons/notifications/user_followed.svg new file mode 100644 index 0000000..802cb5f --- /dev/null +++ b/src/assets/icons/notifications/user_followed.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/icons/notifications/user_unfollowed.svg b/src/assets/icons/notifications/user_unfollowed.svg new file mode 100644 index 0000000..8dc46a2 --- /dev/null +++ b/src/assets/icons/notifications/user_unfollowed.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/icons/old/download_filled.svg b/src/assets/icons/old/download_filled.svg new file mode 100644 index 0000000..839e888 --- /dev/null +++ b/src/assets/icons/old/download_filled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/old/downloads.svg b/src/assets/icons/old/downloads.svg new file mode 100644 index 0000000..7acd348 --- /dev/null +++ b/src/assets/icons/old/downloads.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/old/explore.svg b/src/assets/icons/old/explore.svg new file mode 100644 index 0000000..a535d40 --- /dev/null +++ b/src/assets/icons/old/explore.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/old/explore_filled.svg b/src/assets/icons/old/explore_filled.svg new file mode 100644 index 0000000..41daf35 --- /dev/null +++ b/src/assets/icons/old/explore_filled.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/icons/old/help.svg b/src/assets/icons/old/help.svg new file mode 100644 index 0000000..8e8620d --- /dev/null +++ b/src/assets/icons/old/help.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/old/help_filled.svg b/src/assets/icons/old/help_filled.svg new file mode 100644 index 0000000..2d7d9dd --- /dev/null +++ b/src/assets/icons/old/help_filled.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/old/home-only.svg b/src/assets/icons/old/home-only.svg new file mode 100644 index 0000000..204b650 --- /dev/null +++ b/src/assets/icons/old/home-only.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/old/home.svg b/src/assets/icons/old/home.svg new file mode 100644 index 0000000..74adf86 --- /dev/null +++ b/src/assets/icons/old/home.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/assets/icons/old/home_filled.svg b/src/assets/icons/old/home_filled.svg new file mode 100644 index 0000000..29e2d3c --- /dev/null +++ b/src/assets/icons/old/home_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/old/messages.svg b/src/assets/icons/old/messages.svg new file mode 100644 index 0000000..1f71691 --- /dev/null +++ b/src/assets/icons/old/messages.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/old/messages_filled.svg b/src/assets/icons/old/messages_filled.svg new file mode 100644 index 0000000..e842aab --- /dev/null +++ b/src/assets/icons/old/messages_filled.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/old/notifications.svg b/src/assets/icons/old/notifications.svg new file mode 100644 index 0000000..c9798a0 --- /dev/null +++ b/src/assets/icons/old/notifications.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/icons/old/notifications_filled.svg b/src/assets/icons/old/notifications_filled.svg new file mode 100644 index 0000000..c64db85 --- /dev/null +++ b/src/assets/icons/old/notifications_filled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/old/settings.svg b/src/assets/icons/old/settings.svg new file mode 100644 index 0000000..418b7f1 --- /dev/null +++ b/src/assets/icons/old/settings.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/old/settings_filled.svg b/src/assets/icons/old/settings_filled.svg new file mode 100644 index 0000000..78d2ca1 --- /dev/null +++ b/src/assets/icons/old/settings_filled.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/post.svg b/src/assets/icons/post.svg new file mode 100644 index 0000000..dd75152 --- /dev/null +++ b/src/assets/icons/post.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/reply.svg b/src/assets/icons/reply.svg new file mode 100644 index 0000000..3179623 --- /dev/null +++ b/src/assets/icons/reply.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/reply_filled.svg b/src/assets/icons/reply_filled.svg new file mode 100644 index 0000000..b34b012 --- /dev/null +++ b/src/assets/icons/reply_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/reposts.svg b/src/assets/icons/reposts.svg new file mode 100644 index 0000000..eee660d --- /dev/null +++ b/src/assets/icons/reposts.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/search.svg b/src/assets/icons/search.svg new file mode 100644 index 0000000..8390f42 --- /dev/null +++ b/src/assets/icons/search.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/search_filled.svg b/src/assets/icons/search_filled.svg new file mode 100644 index 0000000..2df437e --- /dev/null +++ b/src/assets/icons/search_filled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/settings.svg b/src/assets/icons/settings.svg new file mode 100644 index 0000000..ae9a0f0 --- /dev/null +++ b/src/assets/icons/settings.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/tribe.svg b/src/assets/icons/tribe.svg new file mode 100644 index 0000000..06731e7 --- /dev/null +++ b/src/assets/icons/tribe.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/tribe_latest.svg b/src/assets/icons/tribe_latest.svg new file mode 100644 index 0000000..bdb499f --- /dev/null +++ b/src/assets/icons/tribe_latest.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/tribe_latest_light.svg b/src/assets/icons/tribe_latest_light.svg new file mode 100644 index 0000000..05a8360 --- /dev/null +++ b/src/assets/icons/tribe_latest_light.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/tribe_light.svg b/src/assets/icons/tribe_light.svg new file mode 100644 index 0000000..cbe8e2e --- /dev/null +++ b/src/assets/icons/tribe_light.svg @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/tribe_popular.svg b/src/assets/icons/tribe_popular.svg new file mode 100644 index 0000000..0416909 --- /dev/null +++ b/src/assets/icons/tribe_popular.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/tribe_popular_light.svg b/src/assets/icons/tribe_popular_light.svg new file mode 100644 index 0000000..d72b333 --- /dev/null +++ b/src/assets/icons/tribe_popular_light.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/tribe_trending.svg b/src/assets/icons/tribe_trending.svg new file mode 100644 index 0000000..2d11698 --- /dev/null +++ b/src/assets/icons/tribe_trending.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/tribe_trending_light.svg b/src/assets/icons/tribe_trending_light.svg new file mode 100644 index 0000000..aed8840 --- /dev/null +++ b/src/assets/icons/tribe_trending_light.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/verified.svg b/src/assets/icons/verified.svg new file mode 100644 index 0000000..4a94d12 --- /dev/null +++ b/src/assets/icons/verified.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/zaps.svg b/src/assets/icons/zaps.svg new file mode 100644 index 0000000..bbcb0ad --- /dev/null +++ b/src/assets/icons/zaps.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/zaps_filled.svg b/src/assets/icons/zaps_filled.svg new file mode 100644 index 0000000..7fa2904 --- /dev/null +++ b/src/assets/icons/zaps_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/lottie/like.json b/src/assets/lottie/like.json new file mode 100644 index 0000000..6f816c7 --- /dev/null +++ b/src/assets/lottie/like.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.4.3","a":"","k":"","d":"","tc":""},"fr":30,"ip":0,"op":44,"w":1600,"h":1600,"nm":"Icon - Like","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Like Color 2","parent":5,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":7,"s":[-2,434.828,0],"to":[0.333,-72.471,0],"ti":[-0.333,72.471,0]},{"t":14,"s":[0,0,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"t":7,"s":[36,36,100]},{"t":14,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.19,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0.934,0.862],[3.208,3.137],[9.951,11.279],[19.234,37.944],[-4.372,48.876],[-50.933,43.057],[-48.268,-3.073],[-30.424,-24.711],[-15.223,-20.401],[-25.28,20.533],[-47.222,3.006],[-50.09,-42.34],[-10.435,-44.105],[13.083,-33.182],[15.403,-18.231],[5.198,-5.073],[1.581,-1.425],[0.436,-0.383],[0,0],[9.529,9.397]],"o":[[0,0],[-0.542,-0.487],[-1.866,-1.722],[-6.406,-6.266],[-19.739,-22.371],[-19.146,-37.773],[4.485,-50.144],[50.086,-42.341],[47.221,3.006],[25.28,20.534],[15.222,-20.401],[30.424,-24.711],[48.264,-3.073],[48.974,41.395],[10.396,43.936],[-12.985,32.927],[-7.782,9.213],[-2.604,2.542],[-0.622,0.563],[0,0],[-9.529,9.397],[0,0]],"v":[[-284.573,97.974],[-284.622,97.93],[-286.845,95.904],[-294.535,88.584],[-319.71,62.021],[-383.67,-30.448],[-413.106,-163.021],[-333.514,-305.328],[-184.822,-361.596],[-67.552,-312.007],[-6.532,-247.313],[54.486,-312.006],[171.757,-361.596],[320.45,-305.329],[407.082,-175.984],[397.234,-58.463],[349.699,19.47],[329.671,41.044],[323.328,47.014],[321.737,48.434],[10.655,355.271],[-23.716,355.271]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":5,"s":[{"i":[[15.537,10.805],[0,0],[0,0],[0,0],[0,0],[24.175,34.947],[-4.877,38.506],[-56.821,33.922],[-53.848,-2.421],[-33.941,-19.469],[-16.983,-16.073],[-28.203,16.177],[-52.681,2.369],[-55.881,-33.356],[-11.642,-34.748],[13.993,-26.374],[0,0],[0,0],[1.764,-1.123],[0,0],[204.541,-93.271],[15.378,6.376]],"o":[[-15.537,-10.805],[-0.604,-0.383],[0,0],[0,0],[0,0],[-20.785,-30.046],[5.004,-39.505],[55.876,-33.358],[52.68,2.368],[28.203,16.177],[16.981,-16.073],[33.941,-19.469],[53.844,-2.421],[54.635,32.613],[11.597,34.614],[-31.498,59.367],[0,0],[0,0],[-0.694,0.444],[0,0],[-11.329,3.018],[-202.799,-88.104]],"v":[[-303.824,211.323],[-330.653,190.152],[-350.982,173.525],[-368.486,159.303],[-397.687,131.331],[-435.015,80.555],[-465.623,-46.906],[-371.81,-163.249],[-205.928,-207.579],[-75.101,-168.51],[-7.027,-117.542],[61.045,-168.51],[191.873,-207.579],[357.756,-163.25],[454.403,-61.346],[449.552,41.575],[348.551,159.808],[313.936,186.669],[294.309,201.001],[271.896,217.15],[12.146,357.199],[-26.197,357.199]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[0.819,0.913],[2.814,3.325],[8.731,11.953],[16.875,40.213],[-3.836,51.798],[-44.687,45.632],[-42.348,-3.257],[-26.693,-26.189],[-13.356,-21.621],[-22.18,21.761],[-41.431,3.186],[-43.948,-44.871],[-9.156,-46.742],[11.481,-35.165],[13.512,-19.323],[4.56,-5.377],[1.387,-1.51],[0.382,-0.406],[0,0],[8.36,9.959]],"o":[[0,0],[-0.475,-0.516],[-1.637,-1.825],[-5.62,-6.641],[-17.318,-23.709],[-16.798,-40.031],[3.935,-53.142],[43.943,-44.873],[41.43,3.186],[22.18,21.761],[13.355,-21.621],[26.693,-26.189],[42.345,-3.257],[42.968,43.87],[9.121,46.563],[-11.393,34.896],[-6.828,9.764],[-2.285,2.694],[-0.545,0.597],[0,0],[-8.361,9.959],[0,0]],"v":[[-249.674,103.832],[-249.717,103.786],[-251.667,101.638],[-258.414,93.88],[-280.502,65.729],[-336.618,-32.269],[-362.443,-172.769],[-292.613,-323.585],[-162.156,-383.217],[-59.268,-330.662],[-5.731,-262.1],[47.804,-330.662],[150.693,-383.217],[281.151,-323.586],[357.159,-186.507],[348.519,-61.958],[306.813,20.634],[289.241,43.499],[283.676,49.825],[282.28,51.33],[9.348,376.514],[-20.807,376.514]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[{"i":[[0,0],[0,0],[0.934,0.862],[3.208,3.137],[9.951,11.279],[19.234,37.944],[-4.372,48.876],[-50.933,43.057],[-48.268,-3.073],[-30.424,-24.711],[-15.223,-20.401],[-25.28,20.533],[-47.222,3.006],[-50.09,-42.34],[-10.435,-44.105],[13.083,-33.182],[15.403,-18.231],[5.198,-5.073],[1.581,-1.425],[0.436,-0.383],[0,0],[9.529,9.397]],"o":[[0,0],[-0.542,-0.487],[-1.866,-1.722],[-6.406,-6.266],[-19.739,-22.371],[-19.146,-37.773],[4.485,-50.144],[50.086,-42.341],[47.221,3.006],[25.28,20.534],[15.222,-20.401],[30.424,-24.711],[48.264,-3.073],[48.974,41.395],[10.396,43.936],[-12.985,32.927],[-7.782,9.213],[-2.604,2.542],[-0.622,0.563],[0,0],[-9.529,9.397],[0,0]],"v":[[-284.573,97.974],[-284.622,97.93],[-286.845,95.904],[-294.535,88.584],[-319.71,62.021],[-383.67,-30.448],[-413.106,-163.021],[-333.514,-305.328],[-184.822,-361.596],[-67.552,-312.007],[-6.532,-247.313],[54.486,-312.006],[171.757,-361.596],[320.45,-305.329],[407.082,-175.984],[397.234,-58.463],[349.699,19.47],[329.671,41.044],[323.328,47.014],[321.737,48.434],[10.655,355.271],[-23.716,355.271]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":20,"s":[{"i":[[14.574,11.501],[0,0],[0,0],[0,0],[0,0],[22.678,37.202],[-4.575,40.99],[-53.302,36.11],[-50.513,-2.577],[-31.839,-20.725],[-15.931,-17.11],[-26.456,17.221],[-49.418,2.521],[-52.421,-35.508],[-10.921,-36.989],[13.127,-28.076],[0,0],[0,0],[1.654,-1.195],[0,0],[191.873,-99.288],[14.425,6.788]],"o":[[-14.574,-11.502],[-0.567,-0.408],[0,0],[0,0],[0,0],[-19.497,-31.985],[4.694,-42.054],[52.415,-35.51],[49.418,2.521],[26.456,17.221],[15.93,-17.11],[31.839,-20.725],[50.509,-2.577],[51.252,34.716],[10.879,36.847],[-29.547,63.196],[0,0],[0,0],[-0.651,0.473],[0,0],[-10.627,3.212],[-190.239,-93.788]],"v":[[-285.147,201.501],[-310.314,178.965],[-329.384,161.265],[-345.804,146.126],[-373.197,116.349],[-408.213,62.298],[-436.925,-73.386],[-348.922,-197.233],[-193.314,-244.423],[-70.589,-202.834],[-6.731,-148.578],[57.125,-202.834],[179.85,-244.423],[335.46,-197.234],[426.121,-88.757],[421.571,20.804],[326.825,146.664],[294.354,175.257],[275.942,190.513],[254.917,207.705],[21.255,356.575],[-42.714,356.575]],"c":true}]},{"t":24,"s":[{"i":[[0,0],[0,0],[0.934,0.862],[3.208,3.137],[9.951,11.279],[19.234,37.944],[-4.372,48.876],[-50.933,43.057],[-48.268,-3.073],[-30.424,-24.711],[-15.223,-20.401],[-25.28,20.533],[-47.222,3.006],[-50.09,-42.34],[-10.435,-44.105],[13.083,-33.182],[15.403,-18.231],[5.198,-5.073],[1.581,-1.425],[0.436,-0.383],[0,0],[9.529,9.397]],"o":[[0,0],[-0.542,-0.487],[-1.866,-1.722],[-6.406,-6.266],[-19.739,-22.371],[-19.146,-37.773],[4.485,-50.144],[50.086,-42.341],[47.221,3.006],[25.28,20.534],[15.222,-20.401],[30.424,-24.711],[48.264,-3.073],[48.974,41.395],[10.396,43.936],[-12.985,32.927],[-7.782,9.213],[-2.604,2.542],[-0.622,0.563],[0,0],[-9.529,9.397],[0,0]],"v":[[-284.573,97.974],[-284.622,97.93],[-286.845,95.904],[-294.535,88.584],[-319.71,62.021],[-383.67,-30.448],[-413.106,-163.021],[-333.514,-305.328],[-184.822,-361.596],[-67.552,-312.007],[-6.532,-247.313],[54.486,-312.006],[171.757,-361.596],[320.45,-305.329],[407.082,-175.984],[397.234,-58.463],[349.699,19.47],[329.671,41.044],[323.328,47.014],[321.737,48.434],[10.655,355.271],[-23.716,355.271]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.792156862745,0.027450980392,0.623529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":62,"st":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Like Color","parent":5,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.19,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0.934,0.862],[3.208,3.137],[9.951,11.279],[19.234,37.944],[-4.372,48.876],[-50.933,43.057],[-48.268,-3.073],[-30.424,-24.711],[-15.223,-20.401],[-25.28,20.533],[-47.222,3.006],[-50.09,-42.34],[-10.435,-44.105],[13.083,-33.182],[15.403,-18.231],[5.198,-5.073],[1.581,-1.425],[0.436,-0.383],[0,0],[9.529,9.397]],"o":[[0,0],[-0.542,-0.487],[-1.866,-1.722],[-6.406,-6.266],[-19.739,-22.371],[-19.146,-37.773],[4.485,-50.144],[50.086,-42.341],[47.221,3.006],[25.28,20.534],[15.222,-20.401],[30.424,-24.711],[48.264,-3.073],[48.974,41.395],[10.396,43.936],[-12.985,32.927],[-7.782,9.213],[-2.604,2.542],[-0.622,0.563],[0,0],[-9.529,9.397],[0,0]],"v":[[-284.573,97.974],[-284.622,97.93],[-286.845,95.904],[-294.535,88.584],[-319.71,62.021],[-383.67,-30.448],[-413.106,-163.021],[-333.514,-305.328],[-184.822,-361.596],[-67.552,-312.007],[-6.532,-247.313],[54.486,-312.006],[171.757,-361.596],[320.45,-305.329],[407.082,-175.984],[397.234,-58.463],[349.699,19.47],[329.671,41.044],[323.328,47.014],[321.737,48.434],[10.655,355.271],[-23.716,355.271]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":5,"s":[{"i":[[15.537,10.805],[0,0],[0,0],[0,0],[0,0],[24.175,34.947],[-4.877,38.506],[-56.821,33.922],[-53.848,-2.421],[-33.941,-19.469],[-16.983,-16.073],[-28.203,16.177],[-52.681,2.369],[-55.881,-33.356],[-11.642,-34.748],[13.993,-26.374],[0,0],[0,0],[1.764,-1.123],[0,0],[204.541,-93.271],[15.378,6.376]],"o":[[-15.537,-10.805],[-0.604,-0.383],[0,0],[0,0],[0,0],[-20.785,-30.046],[5.004,-39.505],[55.876,-33.358],[52.68,2.368],[28.203,16.177],[16.981,-16.073],[33.941,-19.469],[53.844,-2.421],[54.635,32.613],[11.597,34.614],[-31.498,59.367],[0,0],[0,0],[-0.694,0.444],[0,0],[-11.329,3.018],[-202.799,-88.104]],"v":[[-303.824,211.323],[-330.653,190.152],[-350.982,173.525],[-368.486,159.303],[-397.687,131.331],[-435.015,80.555],[-465.623,-46.906],[-371.81,-163.249],[-205.928,-207.579],[-75.101,-168.51],[-7.027,-117.542],[61.045,-168.51],[191.873,-207.579],[357.756,-163.25],[454.403,-61.346],[449.552,41.575],[348.551,159.808],[313.936,186.669],[294.309,201.001],[271.896,217.15],[12.146,357.199],[-26.197,357.199]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[0.819,0.913],[2.814,3.325],[8.731,11.953],[16.875,40.213],[-3.836,51.798],[-44.687,45.632],[-42.348,-3.257],[-26.693,-26.189],[-13.356,-21.621],[-22.18,21.761],[-41.431,3.186],[-43.948,-44.871],[-9.156,-46.742],[11.481,-35.165],[13.512,-19.323],[4.56,-5.377],[1.387,-1.51],[0.382,-0.406],[0,0],[8.36,9.959]],"o":[[0,0],[-0.475,-0.516],[-1.637,-1.825],[-5.62,-6.641],[-17.318,-23.709],[-16.798,-40.031],[3.935,-53.142],[43.943,-44.873],[41.43,3.186],[22.18,21.761],[13.355,-21.621],[26.693,-26.189],[42.345,-3.257],[42.968,43.87],[9.121,46.563],[-11.393,34.896],[-6.828,9.764],[-2.285,2.694],[-0.545,0.597],[0,0],[-8.361,9.959],[0,0]],"v":[[-249.674,103.832],[-249.717,103.786],[-251.667,101.638],[-258.414,93.88],[-280.502,65.729],[-336.618,-32.269],[-362.443,-172.769],[-292.613,-323.585],[-162.156,-383.217],[-59.268,-330.662],[-5.731,-262.1],[47.804,-330.662],[150.693,-383.217],[281.151,-323.586],[357.159,-186.507],[348.519,-61.958],[306.813,20.634],[289.241,43.499],[283.676,49.825],[282.28,51.33],[9.348,376.514],[-20.807,376.514]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[{"i":[[0,0],[0,0],[0.934,0.862],[3.208,3.137],[9.951,11.279],[19.234,37.944],[-4.372,48.876],[-50.933,43.057],[-48.268,-3.073],[-30.424,-24.711],[-15.223,-20.401],[-25.28,20.533],[-47.222,3.006],[-50.09,-42.34],[-10.435,-44.105],[13.083,-33.182],[15.403,-18.231],[5.198,-5.073],[1.581,-1.425],[0.436,-0.383],[0,0],[9.529,9.397]],"o":[[0,0],[-0.542,-0.487],[-1.866,-1.722],[-6.406,-6.266],[-19.739,-22.371],[-19.146,-37.773],[4.485,-50.144],[50.086,-42.341],[47.221,3.006],[25.28,20.534],[15.222,-20.401],[30.424,-24.711],[48.264,-3.073],[48.974,41.395],[10.396,43.936],[-12.985,32.927],[-7.782,9.213],[-2.604,2.542],[-0.622,0.563],[0,0],[-9.529,9.397],[0,0]],"v":[[-284.573,97.974],[-284.622,97.93],[-286.845,95.904],[-294.535,88.584],[-319.71,62.021],[-383.67,-30.448],[-413.106,-163.021],[-333.514,-305.328],[-184.822,-361.596],[-67.552,-312.007],[-6.532,-247.313],[54.486,-312.006],[171.757,-361.596],[320.45,-305.329],[407.082,-175.984],[397.234,-58.463],[349.699,19.47],[329.671,41.044],[323.328,47.014],[321.737,48.434],[10.655,355.271],[-23.716,355.271]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":20,"s":[{"i":[[14.574,11.501],[0,0],[0,0],[0,0],[0,0],[22.678,37.202],[-4.575,40.99],[-53.302,36.11],[-50.513,-2.577],[-31.839,-20.725],[-15.931,-17.11],[-26.456,17.221],[-49.418,2.521],[-52.421,-35.508],[-10.921,-36.989],[13.127,-28.076],[0,0],[0,0],[1.654,-1.195],[0,0],[191.873,-99.288],[14.425,6.788]],"o":[[-14.574,-11.502],[-0.567,-0.408],[0,0],[0,0],[0,0],[-19.497,-31.985],[4.694,-42.054],[52.415,-35.51],[49.418,2.521],[26.456,17.221],[15.93,-17.11],[31.839,-20.725],[50.509,-2.577],[51.252,34.716],[10.879,36.847],[-29.547,63.196],[0,0],[0,0],[-0.651,0.473],[0,0],[-10.627,3.212],[-190.239,-93.788]],"v":[[-285.147,201.501],[-310.314,178.965],[-329.384,161.265],[-345.804,146.126],[-373.197,116.349],[-408.213,62.298],[-436.925,-73.386],[-348.922,-197.233],[-193.314,-244.423],[-70.589,-202.834],[-6.731,-148.578],[57.125,-202.834],[179.85,-244.423],[335.46,-197.234],[426.121,-88.757],[421.571,20.804],[326.825,146.664],[294.354,175.257],[275.942,190.513],[254.917,207.705],[21.255,356.575],[-42.714,356.575]],"c":true}]},{"t":24,"s":[{"i":[[0,0],[0,0],[0.934,0.862],[3.208,3.137],[9.951,11.279],[19.234,37.944],[-4.372,48.876],[-50.933,43.057],[-48.268,-3.073],[-30.424,-24.711],[-15.223,-20.401],[-25.28,20.533],[-47.222,3.006],[-50.09,-42.34],[-10.435,-44.105],[13.083,-33.182],[15.403,-18.231],[5.198,-5.073],[1.581,-1.425],[0.436,-0.383],[0,0],[9.529,9.397]],"o":[[0,0],[-0.542,-0.487],[-1.866,-1.722],[-6.406,-6.266],[-19.739,-22.371],[-19.146,-37.773],[4.485,-50.144],[50.086,-42.341],[47.221,3.006],[25.28,20.534],[15.222,-20.401],[30.424,-24.711],[48.264,-3.073],[48.974,41.395],[10.396,43.936],[-12.985,32.927],[-7.782,9.213],[-2.604,2.542],[-0.622,0.563],[0,0],[-9.529,9.397],[0,0]],"v":[[-284.573,97.974],[-284.622,97.93],[-286.845,95.904],[-294.535,88.584],[-319.71,62.021],[-383.67,-30.448],[-413.106,-163.021],[-333.514,-305.328],[-184.822,-361.596],[-67.552,-312.007],[-6.532,-247.313],[54.486,-312.006],[171.757,-361.596],[320.45,-305.329],[407.082,-175.984],[397.234,-58.463],[349.699,19.47],[329.671,41.044],[323.328,47.014],[321.737,48.434],[10.655,355.271],[-23.716,355.271]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.792156862745,0.027450980392,0.623529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":62,"st":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Like Color 4","parent":5,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":5,"s":[-2,434.828,0],"to":[0.333,-72.471,0],"ti":[-0.333,72.471,0]},{"t":12,"s":[0,0,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"t":5,"s":[36,36,100]},{"t":12,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.19,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0.934,0.862],[3.208,3.137],[9.951,11.279],[19.234,37.944],[-4.372,48.876],[-50.933,43.057],[-48.268,-3.073],[-30.424,-24.711],[-15.223,-20.401],[-25.28,20.533],[-47.222,3.006],[-50.09,-42.34],[-10.435,-44.105],[13.083,-33.182],[15.403,-18.231],[5.198,-5.073],[1.581,-1.425],[0.436,-0.383],[0,0],[9.529,9.397]],"o":[[0,0],[-0.542,-0.487],[-1.866,-1.722],[-6.406,-6.266],[-19.739,-22.371],[-19.146,-37.773],[4.485,-50.144],[50.086,-42.341],[47.221,3.006],[25.28,20.534],[15.222,-20.401],[30.424,-24.711],[48.264,-3.073],[48.974,41.395],[10.396,43.936],[-12.985,32.927],[-7.782,9.213],[-2.604,2.542],[-0.622,0.563],[0,0],[-9.529,9.397],[0,0]],"v":[[-284.573,97.974],[-284.622,97.93],[-286.845,95.904],[-294.535,88.584],[-319.71,62.021],[-383.67,-30.448],[-413.106,-163.021],[-333.514,-305.328],[-184.822,-361.596],[-67.552,-312.007],[-6.532,-247.313],[54.486,-312.006],[171.757,-361.596],[320.45,-305.329],[407.082,-175.984],[397.234,-58.463],[349.699,19.47],[329.671,41.044],[323.328,47.014],[321.737,48.434],[10.655,355.271],[-23.716,355.271]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":5,"s":[{"i":[[15.537,10.805],[0,0],[0,0],[0,0],[0,0],[24.175,34.947],[-4.877,38.506],[-56.821,33.922],[-53.848,-2.421],[-33.941,-19.469],[-16.983,-16.073],[-28.203,16.177],[-52.681,2.369],[-55.881,-33.356],[-11.642,-34.748],[13.993,-26.374],[0,0],[0,0],[1.764,-1.123],[0,0],[204.541,-93.271],[15.378,6.376]],"o":[[-15.537,-10.805],[-0.604,-0.383],[0,0],[0,0],[0,0],[-20.785,-30.046],[5.004,-39.505],[55.876,-33.358],[52.68,2.368],[28.203,16.177],[16.981,-16.073],[33.941,-19.469],[53.844,-2.421],[54.635,32.613],[11.597,34.614],[-31.498,59.367],[0,0],[0,0],[-0.694,0.444],[0,0],[-11.329,3.018],[-202.799,-88.104]],"v":[[-303.824,211.323],[-330.653,190.152],[-350.982,173.525],[-368.486,159.303],[-397.687,131.331],[-435.015,80.555],[-465.623,-46.906],[-371.81,-163.249],[-205.928,-207.579],[-75.101,-168.51],[-7.027,-117.542],[61.045,-168.51],[191.873,-207.579],[357.756,-163.25],[454.403,-61.346],[449.552,41.575],[348.551,159.808],[313.936,186.669],[294.309,201.001],[271.896,217.15],[12.146,357.199],[-26.197,357.199]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[0.819,0.913],[2.814,3.325],[8.731,11.953],[16.875,40.213],[-3.836,51.798],[-44.687,45.632],[-42.348,-3.257],[-26.693,-26.189],[-13.356,-21.621],[-22.18,21.761],[-41.431,3.186],[-43.948,-44.871],[-9.156,-46.742],[11.481,-35.165],[13.512,-19.323],[4.56,-5.377],[1.387,-1.51],[0.382,-0.406],[0,0],[8.36,9.959]],"o":[[0,0],[-0.475,-0.516],[-1.637,-1.825],[-5.62,-6.641],[-17.318,-23.709],[-16.798,-40.031],[3.935,-53.142],[43.943,-44.873],[41.43,3.186],[22.18,21.761],[13.355,-21.621],[26.693,-26.189],[42.345,-3.257],[42.968,43.87],[9.121,46.563],[-11.393,34.896],[-6.828,9.764],[-2.285,2.694],[-0.545,0.597],[0,0],[-8.361,9.959],[0,0]],"v":[[-249.674,103.832],[-249.717,103.786],[-251.667,101.638],[-258.414,93.88],[-280.502,65.729],[-336.618,-32.269],[-362.443,-172.769],[-292.613,-323.585],[-162.156,-383.217],[-59.268,-330.662],[-5.731,-262.1],[47.804,-330.662],[150.693,-383.217],[281.151,-323.586],[357.159,-186.507],[348.519,-61.958],[306.813,20.634],[289.241,43.499],[283.676,49.825],[282.28,51.33],[9.348,376.514],[-20.807,376.514]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[{"i":[[0,0],[0,0],[0.934,0.862],[3.208,3.137],[9.951,11.279],[19.234,37.944],[-4.372,48.876],[-50.933,43.057],[-48.268,-3.073],[-30.424,-24.711],[-15.223,-20.401],[-25.28,20.533],[-47.222,3.006],[-50.09,-42.34],[-10.435,-44.105],[13.083,-33.182],[15.403,-18.231],[5.198,-5.073],[1.581,-1.425],[0.436,-0.383],[0,0],[9.529,9.397]],"o":[[0,0],[-0.542,-0.487],[-1.866,-1.722],[-6.406,-6.266],[-19.739,-22.371],[-19.146,-37.773],[4.485,-50.144],[50.086,-42.341],[47.221,3.006],[25.28,20.534],[15.222,-20.401],[30.424,-24.711],[48.264,-3.073],[48.974,41.395],[10.396,43.936],[-12.985,32.927],[-7.782,9.213],[-2.604,2.542],[-0.622,0.563],[0,0],[-9.529,9.397],[0,0]],"v":[[-284.573,97.974],[-284.622,97.93],[-286.845,95.904],[-294.535,88.584],[-319.71,62.021],[-383.67,-30.448],[-413.106,-163.021],[-333.514,-305.328],[-184.822,-361.596],[-67.552,-312.007],[-6.532,-247.313],[54.486,-312.006],[171.757,-361.596],[320.45,-305.329],[407.082,-175.984],[397.234,-58.463],[349.699,19.47],[329.671,41.044],[323.328,47.014],[321.737,48.434],[10.655,355.271],[-23.716,355.271]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":20,"s":[{"i":[[14.574,11.501],[0,0],[0,0],[0,0],[0,0],[22.678,37.202],[-4.575,40.99],[-53.302,36.11],[-50.513,-2.577],[-31.839,-20.725],[-15.931,-17.11],[-26.456,17.221],[-49.418,2.521],[-52.421,-35.508],[-10.921,-36.989],[13.127,-28.076],[0,0],[0,0],[1.654,-1.195],[0,0],[191.873,-99.288],[14.425,6.788]],"o":[[-14.574,-11.502],[-0.567,-0.408],[0,0],[0,0],[0,0],[-19.497,-31.985],[4.694,-42.054],[52.415,-35.51],[49.418,2.521],[26.456,17.221],[15.93,-17.11],[31.839,-20.725],[50.509,-2.577],[51.252,34.716],[10.879,36.847],[-29.547,63.196],[0,0],[0,0],[-0.651,0.473],[0,0],[-10.627,3.212],[-190.239,-93.788]],"v":[[-285.147,201.501],[-310.314,178.965],[-329.384,161.265],[-345.804,146.126],[-373.197,116.349],[-408.213,62.298],[-436.925,-73.386],[-348.922,-197.233],[-193.314,-244.423],[-70.589,-202.834],[-6.731,-148.578],[57.125,-202.834],[179.85,-244.423],[335.46,-197.234],[426.121,-88.757],[421.571,20.804],[326.825,146.664],[294.354,175.257],[275.942,190.513],[254.917,207.705],[21.255,356.575],[-42.714,356.575]],"c":true}]},{"t":24,"s":[{"i":[[0,0],[0,0],[0.934,0.862],[3.208,3.137],[9.951,11.279],[19.234,37.944],[-4.372,48.876],[-50.933,43.057],[-48.268,-3.073],[-30.424,-24.711],[-15.223,-20.401],[-25.28,20.533],[-47.222,3.006],[-50.09,-42.34],[-10.435,-44.105],[13.083,-33.182],[15.403,-18.231],[5.198,-5.073],[1.581,-1.425],[0.436,-0.383],[0,0],[9.529,9.397]],"o":[[0,0],[-0.542,-0.487],[-1.866,-1.722],[-6.406,-6.266],[-19.739,-22.371],[-19.146,-37.773],[4.485,-50.144],[50.086,-42.341],[47.221,3.006],[25.28,20.534],[15.222,-20.401],[30.424,-24.711],[48.264,-3.073],[48.974,41.395],[10.396,43.936],[-12.985,32.927],[-7.782,9.213],[-2.604,2.542],[-0.622,0.563],[0,0],[-9.529,9.397],[0,0]],"v":[[-284.573,97.974],[-284.622,97.93],[-286.845,95.904],[-294.535,88.584],[-319.71,62.021],[-383.67,-30.448],[-413.106,-163.021],[-333.514,-305.328],[-184.822,-361.596],[-67.552,-312.007],[-6.532,-247.313],[54.486,-312.006],[171.757,-361.596],[320.45,-305.329],[407.082,-175.984],[397.234,-58.463],[349.699,19.47],[329.671,41.044],[323.328,47.014],[321.737,48.434],[10.655,355.271],[-23.716,355.271]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.792156862745,0.027450980392,0.623529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":61,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Like Color 3","parent":5,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.19,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0.934,0.862],[3.208,3.137],[9.951,11.279],[19.234,37.944],[-4.372,48.876],[-50.933,43.057],[-48.268,-3.073],[-30.424,-24.711],[-15.223,-20.401],[-25.28,20.533],[-47.222,3.006],[-50.09,-42.34],[-10.435,-44.105],[13.083,-33.182],[15.403,-18.231],[5.198,-5.073],[1.581,-1.425],[0.436,-0.383],[0,0],[9.529,9.397]],"o":[[0,0],[-0.542,-0.487],[-1.866,-1.722],[-6.406,-6.266],[-19.739,-22.371],[-19.146,-37.773],[4.485,-50.144],[50.086,-42.341],[47.221,3.006],[25.28,20.534],[15.222,-20.401],[30.424,-24.711],[48.264,-3.073],[48.974,41.395],[10.396,43.936],[-12.985,32.927],[-7.782,9.213],[-2.604,2.542],[-0.622,0.563],[0,0],[-9.529,9.397],[0,0]],"v":[[-284.573,97.974],[-284.622,97.93],[-286.845,95.904],[-294.535,88.584],[-319.71,62.021],[-383.67,-30.448],[-413.106,-163.021],[-333.514,-305.328],[-184.822,-361.596],[-67.552,-312.007],[-6.532,-247.313],[54.486,-312.006],[171.757,-361.596],[320.45,-305.329],[407.082,-175.984],[397.234,-58.463],[349.699,19.47],[329.671,41.044],[323.328,47.014],[321.737,48.434],[10.655,355.271],[-23.716,355.271]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":5,"s":[{"i":[[15.537,10.805],[0,0],[0,0],[0,0],[0,0],[24.175,34.947],[-4.877,38.506],[-56.821,33.922],[-53.848,-2.421],[-33.941,-19.469],[-16.983,-16.073],[-28.203,16.177],[-52.681,2.369],[-55.881,-33.356],[-11.642,-34.748],[13.993,-26.374],[0,0],[0,0],[1.764,-1.123],[0,0],[204.541,-93.271],[15.378,6.376]],"o":[[-15.537,-10.805],[-0.604,-0.383],[0,0],[0,0],[0,0],[-20.785,-30.046],[5.004,-39.505],[55.876,-33.358],[52.68,2.368],[28.203,16.177],[16.981,-16.073],[33.941,-19.469],[53.844,-2.421],[54.635,32.613],[11.597,34.614],[-31.498,59.367],[0,0],[0,0],[-0.694,0.444],[0,0],[-11.329,3.018],[-202.799,-88.104]],"v":[[-303.824,211.323],[-330.653,190.152],[-350.982,173.525],[-368.486,159.303],[-397.687,131.331],[-435.015,80.555],[-465.623,-46.906],[-371.81,-163.249],[-205.928,-207.579],[-75.101,-168.51],[-7.027,-117.542],[61.045,-168.51],[191.873,-207.579],[357.756,-163.25],[454.403,-61.346],[449.552,41.575],[348.551,159.808],[313.936,186.669],[294.309,201.001],[271.896,217.15],[12.146,357.199],[-26.197,357.199]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[0.819,0.913],[2.814,3.325],[8.731,11.953],[16.875,40.213],[-3.836,51.798],[-44.687,45.632],[-42.348,-3.257],[-26.693,-26.189],[-13.356,-21.621],[-22.18,21.761],[-41.431,3.186],[-43.948,-44.871],[-9.156,-46.742],[11.481,-35.165],[13.512,-19.323],[4.56,-5.377],[1.387,-1.51],[0.382,-0.406],[0,0],[8.36,9.959]],"o":[[0,0],[-0.475,-0.516],[-1.637,-1.825],[-5.62,-6.641],[-17.318,-23.709],[-16.798,-40.031],[3.935,-53.142],[43.943,-44.873],[41.43,3.186],[22.18,21.761],[13.355,-21.621],[26.693,-26.189],[42.345,-3.257],[42.968,43.87],[9.121,46.563],[-11.393,34.896],[-6.828,9.764],[-2.285,2.694],[-0.545,0.597],[0,0],[-8.361,9.959],[0,0]],"v":[[-249.674,103.832],[-249.717,103.786],[-251.667,101.638],[-258.414,93.88],[-280.502,65.729],[-336.618,-32.269],[-362.443,-172.769],[-292.613,-323.585],[-162.156,-383.217],[-59.268,-330.662],[-5.731,-262.1],[47.804,-330.662],[150.693,-383.217],[281.151,-323.586],[357.159,-186.507],[348.519,-61.958],[306.813,20.634],[289.241,43.499],[283.676,49.825],[282.28,51.33],[9.348,376.514],[-20.807,376.514]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[{"i":[[0,0],[0,0],[0.934,0.862],[3.208,3.137],[9.951,11.279],[19.234,37.944],[-4.372,48.876],[-50.933,43.057],[-48.268,-3.073],[-30.424,-24.711],[-15.223,-20.401],[-25.28,20.533],[-47.222,3.006],[-50.09,-42.34],[-10.435,-44.105],[13.083,-33.182],[15.403,-18.231],[5.198,-5.073],[1.581,-1.425],[0.436,-0.383],[0,0],[9.529,9.397]],"o":[[0,0],[-0.542,-0.487],[-1.866,-1.722],[-6.406,-6.266],[-19.739,-22.371],[-19.146,-37.773],[4.485,-50.144],[50.086,-42.341],[47.221,3.006],[25.28,20.534],[15.222,-20.401],[30.424,-24.711],[48.264,-3.073],[48.974,41.395],[10.396,43.936],[-12.985,32.927],[-7.782,9.213],[-2.604,2.542],[-0.622,0.563],[0,0],[-9.529,9.397],[0,0]],"v":[[-284.573,97.974],[-284.622,97.93],[-286.845,95.904],[-294.535,88.584],[-319.71,62.021],[-383.67,-30.448],[-413.106,-163.021],[-333.514,-305.328],[-184.822,-361.596],[-67.552,-312.007],[-6.532,-247.313],[54.486,-312.006],[171.757,-361.596],[320.45,-305.329],[407.082,-175.984],[397.234,-58.463],[349.699,19.47],[329.671,41.044],[323.328,47.014],[321.737,48.434],[10.655,355.271],[-23.716,355.271]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":20,"s":[{"i":[[14.574,11.501],[0,0],[0,0],[0,0],[0,0],[22.678,37.202],[-4.575,40.99],[-53.302,36.11],[-50.513,-2.577],[-31.839,-20.725],[-15.931,-17.11],[-26.456,17.221],[-49.418,2.521],[-52.421,-35.508],[-10.921,-36.989],[13.127,-28.076],[0,0],[0,0],[1.654,-1.195],[0,0],[191.873,-99.288],[14.425,6.788]],"o":[[-14.574,-11.502],[-0.567,-0.408],[0,0],[0,0],[0,0],[-19.497,-31.985],[4.694,-42.054],[52.415,-35.51],[49.418,2.521],[26.456,17.221],[15.93,-17.11],[31.839,-20.725],[50.509,-2.577],[51.252,34.716],[10.879,36.847],[-29.547,63.196],[0,0],[0,0],[-0.651,0.473],[0,0],[-10.627,3.212],[-190.239,-93.788]],"v":[[-285.147,201.501],[-310.314,178.965],[-329.384,161.265],[-345.804,146.126],[-373.197,116.349],[-408.213,62.298],[-436.925,-73.386],[-348.922,-197.233],[-193.314,-244.423],[-70.589,-202.834],[-6.731,-148.578],[57.125,-202.834],[179.85,-244.423],[335.46,-197.234],[426.121,-88.757],[421.571,20.804],[326.825,146.664],[294.354,175.257],[275.942,190.513],[254.917,207.705],[21.255,356.575],[-42.714,356.575]],"c":true}]},{"t":24,"s":[{"i":[[0,0],[0,0],[0.934,0.862],[3.208,3.137],[9.951,11.279],[19.234,37.944],[-4.372,48.876],[-50.933,43.057],[-48.268,-3.073],[-30.424,-24.711],[-15.223,-20.401],[-25.28,20.533],[-47.222,3.006],[-50.09,-42.34],[-10.435,-44.105],[13.083,-33.182],[15.403,-18.231],[5.198,-5.073],[1.581,-1.425],[0.436,-0.383],[0,0],[9.529,9.397]],"o":[[0,0],[-0.542,-0.487],[-1.866,-1.722],[-6.406,-6.266],[-19.739,-22.371],[-19.146,-37.773],[4.485,-50.144],[50.086,-42.341],[47.221,3.006],[25.28,20.534],[15.222,-20.401],[30.424,-24.711],[48.264,-3.073],[48.974,41.395],[10.396,43.936],[-12.985,32.927],[-7.782,9.213],[-2.604,2.542],[-0.622,0.563],[0,0],[-9.529,9.397],[0,0]],"v":[[-284.573,97.974],[-284.622,97.93],[-286.845,95.904],[-294.535,88.584],[-319.71,62.021],[-383.67,-30.448],[-413.106,-163.021],[-333.514,-305.328],[-184.822,-361.596],[-67.552,-312.007],[-6.532,-247.313],[54.486,-312.006],[171.757,-361.596],[320.45,-305.329],[407.082,-175.984],[397.234,-58.463],[349.699,19.47],[329.671,41.044],[323.328,47.014],[321.737,48.434],[10.655,355.271],[-23.716,355.271]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874509803922,0.531564749923,0.798880722943,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":61,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Like","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":12,"s":[13]},{"t":17,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":1,"y":0},"t":5,"s":[800,800,0],"to":[1.667,-22.833,0],"ti":[0,0,0]},{"i":{"x":0.999,"y":1},"o":{"x":0.8,"y":0},"t":12,"s":[810,663,0],"to":[0,0,0],"ti":[1.667,-22.833,0]},{"t":17,"s":[800,800,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"t":12,"s":[121,121,100]},{"t":17,"s":[100,100,100]}],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"s","pt":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.19,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[9.287,18.318],[0,0],[0,0],[0.398,0.734],[1.686,2.893],[6.63,9.544],[23.055,18.726],[26.012,1.656],[38.106,-32.213],[2.601,-29.08],[-15.501,-30.58],[-17.271,-19.574],[-5.308,-5.191],[-1.369,-1.263],[-0.306,-0.275],[0,0],[0,0],[0,0],[0,0],[-9.529,9.397],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.87,1.828],[-5.996,7.099],[-9.069,22.999],[6.143,25.967],[39.224,33.159],[24.971,-1.59],[23.126,-18.782],[13.435,-19.34],[3.378,-5.799],[0.795,-1.47],[0.166,-0.318]],"o":[[0,0],[-9.286,18.318],[0,0],[0,0],[-0.166,-0.318],[-0.796,-1.469],[-3.379,-5.799],[-13.437,-19.34],[-23.124,-18.782],[-24.966,-1.59],[-37.259,31.498],[-2.715,30.347],[15.414,30.409],[8.553,9.694],[2.649,2.592],[0.684,0.631],[0,0],[0,0],[0,0],[0,0],[9.529,9.397],[0,0],[0,0],[0,0],[0,0],[0,0],[0.92,-0.833],[3.759,-3.666],[12.163,-14.394],[8.967,-22.744],[-6.103,-25.797],[-38.113,-32.214],[-26.009,1.656],[-23.053,18.726],[-6.629,9.544],[-1.686,2.893],[-0.397,0.734],[0,0]],"v":[[27.765,-160.404],[16.508,-138.198],[-28.568,-138.197],[-39.807,-160.366],[-39.983,-160.704],[-40.829,-162.292],[-44.561,-168.912],[-59.654,-192.529],[-115.107,-253.946],[-189.191,-286.686],[-283.819,-248.212],[-337.301,-155.968],[-315.553,-63.293],[-262.184,13.571],[-240.802,36.139],[-234.701,41.952],[-233.206,43.315],[-232.905,43.584],[-232.862,43.622],[-232.076,44.311],[-23.216,250.321],[11.154,250.321],[270.655,-5.637],[271.658,-6.485],[271.707,-6.527],[271.8,-6.609],[272.759,-7.461],[277.008,-11.469],[292.122,-27.763],[327.279,-84.988],[333.964,-158.54],[271.761,-248.211],[177.122,-286.686],[103.039,-253.947],[47.59,-192.53],[32.5,-168.913],[28.769,-162.293],[27.922,-160.706]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":5,"s":[{"i":[[0,0],[0,0],[10.158,13.194],[0,0],[0,0],[0.435,0.529],[1.844,2.084],[7.253,6.874],[25.217,13.488],[28.451,1.193],[41.679,-23.202],[2.846,-20.945],[-9.356,-17.439],[-11.826,-12.205],[0,0],[0,0],[-0.335,-0.198],[0,0],[0,0],[0,0],[-65.391,-27.115],[-16.238,6.813],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-10.258,10.459],[-7.899,16.306],[6.72,18.703],[42.905,23.881],[27.313,-1.145],[25.294,-13.53],[14.694,-13.932],[3.696,-4.176],[0.87,-1.059],[0.182,-0.229]],"o":[[0,0],[-10.157,13.194],[0,0],[0,0],[-0.182,-0.229],[-0.87,-1.058],[-3.696,-4.177],[-14.697,-13.93],[-25.293,-13.528],[-27.307,-1.145],[-40.753,22.687],[-2.97,21.858],[9.356,17.439],[13.327,13.754],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[16.096,7.029],[73.661,-26.654],[0,0],[0,0],[0,0],[0,0],[1.006,-0.6],[0,0],[10.258,-10.459],[7.899,-16.306],[-6.676,-18.581],[-41.687,-23.203],[-28.448,1.193],[-25.215,13.488],[-7.25,6.874],[-1.844,2.083],[-0.435,0.529],[0,0]],"v":[[30.365,-47.434],[18.052,-36.054],[-31.251,-36.054],[-43.545,-47.407],[-43.737,-47.651],[-44.663,-48.794],[-48.744,-53.562],[-65.253,-70.573],[-125.907,-109.273],[-206.938,-132.855],[-310.441,-105.143],[-368.939,-38.702],[-351.714,36.354],[-317.403,82.027],[-281.438,115.355],[-263.826,128.308],[-251.253,137.134],[-237.798,146.556],[-214.782,160.887],[-176.186,184.454],[-24.304,265.471],[13.29,265.471],[199.233,163.243],[232.051,142.33],[251.792,127.996],[268.301,115.479],[288.491,97.332],[302.982,85.217],[330.451,58.254],[360.702,17.037],[365.28,-40.555],[297.243,-105.143],[193.729,-132.855],[112.699,-109.274],[52.049,-70.574],[35.544,-53.563],[31.463,-48.795],[30.536,-47.652]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[8.613,20.725],[0,0],[0,0],[0.369,0.831],[1.563,3.273],[6.149,10.798],[21.381,21.187],[24.123,1.874],[35.339,-36.447],[2.413,-32.901],[-14.376,-34.599],[-16.016,-22.147],[-4.921,-5.874],[-1.27,-1.429],[-0.284,-0.311],[0,0],[0,0],[0,0],[0,0],[-8.837,10.632],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.736,2.066],[-5.562,8.031],[-8.409,26.022],[5.698,29.379],[36.38,37.513],[23.159,-1.799],[21.446,-21.252],[12.458,-21.883],[3.134,-6.56],[0.738,-1.663],[0.154,-0.359]],"o":[[0,0],[-8.612,20.726],[0,0],[0,0],[-0.154,-0.359],[-0.738,-1.662],[-3.133,-6.561],[-12.461,-21.882],[-21.446,-21.251],[-23.154,-1.799],[-34.554,35.637],[-2.518,34.335],[14.295,34.405],[7.932,10.968],[2.457,2.932],[0.635,0.714],[0,0],[0,0],[0,0],[0,0],[8.837,10.632],[0,0],[0,0],[0,0],[0,0],[0,0],[0.853,-0.942],[3.486,-4.148],[11.28,-16.286],[8.316,-25.733],[-5.66,-29.187],[-35.346,-36.447],[-24.121,1.873],[-21.379,21.186],[-6.147,10.798],[-1.563,3.273],[-0.369,0.831],[0,0]],"v":[[25.753,-179.606],[15.313,-154.482],[-26.491,-154.481],[-36.914,-179.563],[-37.077,-179.946],[-37.862,-181.742],[-41.323,-189.232],[-55.32,-215.952],[-106.748,-285.44],[-175.454,-322.483],[-263.213,-278.953],[-312.813,-174.587],[-292.644,-69.734],[-243.149,17.23],[-223.319,42.765],[-217.66,49.341],[-216.274,50.883],[-215.995,51.188],[-215.955,51.231],[-215.226,52.01],[-21.527,285.091],[10.348,285.091],[251.011,-4.501],[251.941,-5.461],[251.987,-5.509],[252.073,-5.601],[252.963,-6.565],[256.902,-11.1],[270.919,-29.535],[303.524,-94.28],[309.725,-177.497],[252.037,-278.952],[164.267,-322.483],[95.563,-285.441],[44.139,-215.953],[30.144,-189.233],[26.684,-181.743],[25.898,-179.947]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[{"i":[[0,0],[0,0],[9.287,18.318],[0,0],[0,0],[0.398,0.734],[1.686,2.893],[6.63,9.544],[23.055,18.726],[26.012,1.656],[38.106,-32.213],[2.601,-29.08],[-15.501,-30.58],[-17.271,-19.574],[-5.308,-5.191],[-1.369,-1.263],[-0.306,-0.275],[0,0],[0,0],[0,0],[0,0],[-9.529,9.397],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.87,1.828],[-5.996,7.099],[-9.069,22.999],[6.143,25.967],[39.224,33.159],[24.971,-1.59],[23.126,-18.782],[13.435,-19.34],[3.378,-5.799],[0.795,-1.47],[0.166,-0.318]],"o":[[0,0],[-9.286,18.318],[0,0],[0,0],[-0.166,-0.318],[-0.796,-1.469],[-3.379,-5.799],[-13.437,-19.34],[-23.124,-18.782],[-24.966,-1.59],[-37.259,31.498],[-2.715,30.347],[15.414,30.409],[8.553,9.694],[2.649,2.592],[0.684,0.631],[0,0],[0,0],[0,0],[0,0],[9.529,9.397],[0,0],[0,0],[0,0],[0,0],[0,0],[0.92,-0.833],[3.759,-3.666],[12.163,-14.394],[8.967,-22.744],[-6.103,-25.797],[-38.113,-32.214],[-26.009,1.656],[-23.053,18.726],[-6.629,9.544],[-1.686,2.893],[-0.397,0.734],[0,0]],"v":[[27.765,-160.404],[16.508,-138.198],[-28.568,-138.197],[-39.807,-160.366],[-39.983,-160.704],[-40.829,-162.292],[-44.561,-168.912],[-59.654,-192.529],[-115.107,-253.946],[-189.191,-286.686],[-283.819,-248.212],[-337.301,-155.968],[-315.553,-63.293],[-262.184,13.571],[-240.802,36.139],[-234.701,41.952],[-233.206,43.315],[-232.905,43.584],[-232.862,43.622],[-232.076,44.311],[-23.216,250.321],[11.154,250.321],[270.655,-5.637],[271.658,-6.485],[271.707,-6.527],[271.8,-6.609],[272.759,-7.461],[277.008,-11.469],[292.122,-27.763],[327.279,-84.988],[333.964,-158.54],[271.761,-248.211],[177.122,-286.686],[103.039,-253.947],[47.59,-192.53],[32.5,-168.913],[28.769,-162.293],[27.922,-160.706]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":20,"s":[{"i":[[0,0],[0,0],[9.721,14.297],[0,0],[0,0],[0.416,0.573],[1.764,2.258],[6.941,7.449],[24.132,14.616],[27.227,1.293],[39.886,-25.143],[2.723,-22.697],[-8.953,-18.897],[-11.318,-13.226],[0,0],[0,0],[-0.32,-0.215],[0,0],[0,0],[0,0],[-62.578,-29.383],[-15.539,7.383],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-9.816,11.334],[-7.559,17.67],[6.431,20.267],[41.06,25.878],[26.138,-1.241],[24.206,-14.662],[14.062,-15.097],[3.537,-4.525],[0.833,-1.147],[0.174,-0.248]],"o":[[0,0],[-9.72,14.298],[0,0],[0,0],[-0.174,-0.248],[-0.833,-1.147],[-3.537,-4.526],[-14.065,-15.095],[-24.205,-14.66],[-26.133,-1.241],[-39,24.584],[-2.842,23.686],[8.953,18.897],[12.754,14.904],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[15.404,7.617],[70.493,-28.883],[0,0],[0,0],[0,0],[0,0],[0.963,-0.65],[0,0],[9.816,-11.334],[7.559,-17.67],[-6.389,-20.135],[-39.894,-25.144],[-27.225,1.292],[-24.13,14.616],[-6.938,7.449],[-1.764,2.258],[-0.416,0.573],[0,0]],"v":[[29.061,-74.194],[17.278,-61.862],[-29.905,-61.861],[-41.669,-74.164],[-41.853,-74.428],[-42.74,-75.667],[-46.646,-80.834],[-62.444,-99.268],[-120.489,-141.205],[-198.035,-166.759],[-297.085,-136.73],[-353.067,-64.732],[-336.583,16.603],[-303.748,66.096],[-269.329,102.211],[-252.475,116.248],[-240.443,125.812],[-227.567,136.022],[-205.541,151.552],[-168.605,177.09],[-23.256,264.883],[12.72,264.883],[190.665,154.105],[222.071,131.442],[240.963,115.909],[256.762,102.345],[276.083,82.681],[289.951,69.552],[316.239,40.334],[345.188,-4.33],[349.569,-66.739],[284.459,-136.729],[185.397,-166.759],[107.853,-141.206],[49.812,-99.269],[34.017,-80.835],[30.111,-75.668],[29.225,-74.429]],"c":true}]},{"t":24,"s":[{"i":[[0,0],[0,0],[9.287,18.318],[0,0],[0,0],[0.398,0.734],[1.686,2.893],[6.63,9.544],[23.055,18.726],[26.012,1.656],[38.106,-32.213],[2.601,-29.08],[-15.501,-30.58],[-17.271,-19.574],[-5.308,-5.191],[-1.369,-1.263],[-0.306,-0.275],[0,0],[0,0],[0,0],[0,0],[-9.529,9.397],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.87,1.828],[-5.996,7.099],[-9.069,22.999],[6.143,25.967],[39.224,33.159],[24.971,-1.59],[23.126,-18.782],[13.435,-19.34],[3.378,-5.799],[0.795,-1.47],[0.166,-0.318]],"o":[[0,0],[-9.286,18.318],[0,0],[0,0],[-0.166,-0.318],[-0.796,-1.469],[-3.379,-5.799],[-13.437,-19.34],[-23.124,-18.782],[-24.966,-1.59],[-37.259,31.498],[-2.715,30.347],[15.414,30.409],[8.553,9.694],[2.649,2.592],[0.684,0.631],[0,0],[0,0],[0,0],[0,0],[9.529,9.397],[0,0],[0,0],[0,0],[0,0],[0,0],[0.92,-0.833],[3.759,-3.666],[12.163,-14.394],[8.967,-22.744],[-6.103,-25.797],[-38.113,-32.214],[-26.009,1.656],[-23.053,18.726],[-6.629,9.544],[-1.686,2.893],[-0.397,0.734],[0,0]],"v":[[27.765,-160.404],[16.508,-138.198],[-28.568,-138.197],[-39.807,-160.366],[-39.983,-160.704],[-40.829,-162.292],[-44.561,-168.912],[-59.654,-192.529],[-115.107,-253.946],[-189.191,-286.686],[-283.819,-248.212],[-337.301,-155.968],[-315.553,-63.293],[-262.184,13.571],[-240.802,36.139],[-234.701,41.952],[-233.206,43.315],[-232.905,43.584],[-232.862,43.622],[-232.076,44.311],[-23.216,250.321],[11.154,250.321],[270.655,-5.637],[271.658,-6.485],[271.707,-6.527],[271.8,-6.609],[272.759,-7.461],[277.008,-11.469],[292.122,-27.763],[327.279,-84.988],[333.964,-158.54],[271.761,-248.211],[177.122,-286.686],[103.039,-253.947],[47.59,-192.53],[32.5,-168.913],[28.769,-162.293],[27.922,-160.706]],"c":true}]}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.19,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0.934,0.862],[3.208,3.137],[9.951,11.279],[19.234,37.944],[-4.372,48.876],[-50.933,43.057],[-48.268,-3.073],[-30.424,-24.711],[-15.223,-20.401],[-25.28,20.533],[-47.222,3.006],[-50.09,-42.34],[-10.435,-44.105],[13.083,-33.182],[15.403,-18.231],[5.198,-5.073],[1.581,-1.425],[0.436,-0.383],[0,0],[9.529,9.397]],"o":[[0,0],[-0.542,-0.487],[-1.866,-1.722],[-6.406,-6.266],[-19.739,-22.371],[-19.146,-37.773],[4.485,-50.144],[50.086,-42.341],[47.221,3.006],[25.28,20.534],[15.222,-20.401],[30.424,-24.711],[48.264,-3.073],[48.974,41.395],[10.396,43.936],[-12.985,32.927],[-7.782,9.213],[-2.604,2.542],[-0.622,0.563],[0,0],[-9.529,9.397],[0,0]],"v":[[-284.573,97.974],[-284.622,97.93],[-286.845,95.904],[-294.535,88.584],[-319.71,62.021],[-383.67,-30.448],[-413.106,-163.021],[-333.514,-305.328],[-184.822,-361.596],[-67.552,-312.007],[-6.532,-247.313],[54.486,-312.006],[171.757,-361.596],[320.45,-305.329],[407.082,-175.984],[397.234,-58.463],[349.699,19.47],[329.671,41.044],[323.328,47.014],[321.737,48.434],[10.655,355.271],[-23.716,355.271]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":5,"s":[{"i":[[15.537,10.804],[0,0],[0,0],[0,0],[0,0],[24.175,34.947],[-4.877,38.506],[-56.821,33.922],[-53.848,-2.421],[-33.941,-19.469],[-16.983,-16.073],[-28.203,16.177],[-52.681,2.369],[-55.881,-33.356],[-11.642,-34.748],[13.993,-26.374],[0,0],[0,0],[1.764,-1.123],[0,0],[204.541,-93.271],[15.378,6.376]],"o":[[-15.537,-10.805],[-0.604,-0.383],[0,0],[0,0],[0,0],[-20.785,-30.046],[5.004,-39.505],[55.876,-33.358],[52.68,2.368],[28.203,16.177],[16.981,-16.073],[33.941,-19.469],[53.844,-2.421],[54.635,32.613],[11.597,34.614],[-31.498,59.367],[0,0],[0,0],[-0.694,0.444],[0,0],[-11.329,3.018],[-202.799,-88.104]],"v":[[-303.824,211.323],[-330.653,190.152],[-350.982,173.525],[-368.486,159.303],[-397.687,131.331],[-435.015,80.555],[-465.623,-46.906],[-371.81,-163.249],[-205.928,-207.579],[-75.101,-168.51],[-7.027,-117.542],[61.045,-168.51],[191.873,-207.579],[357.756,-163.25],[454.403,-61.346],[449.552,41.575],[348.551,159.808],[313.936,186.669],[294.309,201.001],[271.896,217.15],[30.646,357.295],[-51.197,357.295]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[0.819,0.913],[2.814,3.325],[8.731,11.953],[16.875,40.213],[-3.836,51.798],[-44.687,45.632],[-42.348,-3.257],[-26.693,-26.189],[-13.356,-21.621],[-22.18,21.761],[-41.431,3.186],[-43.948,-44.871],[-9.156,-46.742],[11.481,-35.165],[13.512,-19.323],[4.56,-5.377],[1.387,-1.51],[0.382,-0.406],[0,0],[8.36,9.959]],"o":[[0,0],[-0.475,-0.516],[-1.637,-1.825],[-5.62,-6.641],[-17.318,-23.709],[-16.798,-40.031],[3.935,-53.142],[43.943,-44.873],[41.43,3.186],[22.18,21.761],[13.355,-21.621],[26.693,-26.189],[42.345,-3.257],[42.968,43.87],[9.121,46.563],[-11.393,34.896],[-6.828,9.764],[-2.285,2.694],[-0.545,0.597],[0,0],[-8.361,9.959],[0,0]],"v":[[-249.674,103.832],[-249.717,103.786],[-251.667,101.638],[-258.414,93.88],[-280.502,65.729],[-336.618,-32.269],[-362.443,-172.769],[-292.613,-323.585],[-162.156,-383.217],[-59.268,-330.662],[-5.731,-262.1],[47.804,-330.662],[150.693,-383.217],[281.151,-323.586],[357.159,-186.507],[348.519,-61.958],[306.813,20.634],[289.241,43.499],[283.676,49.825],[282.28,51.33],[9.348,376.514],[-20.807,376.514]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[{"i":[[0,0],[0,0],[0.934,0.862],[3.208,3.137],[9.951,11.279],[19.234,37.944],[-4.372,48.876],[-50.933,43.057],[-48.268,-3.073],[-30.424,-24.711],[-15.223,-20.401],[-25.28,20.533],[-47.222,3.006],[-50.09,-42.34],[-10.435,-44.105],[13.083,-33.182],[15.403,-18.231],[5.198,-5.073],[1.581,-1.425],[0.436,-0.383],[0,0],[9.529,9.397]],"o":[[0,0],[-0.542,-0.487],[-1.866,-1.722],[-6.406,-6.266],[-19.739,-22.371],[-19.146,-37.773],[4.485,-50.144],[50.086,-42.341],[47.221,3.006],[25.28,20.534],[15.222,-20.401],[30.424,-24.711],[48.264,-3.073],[48.974,41.395],[10.396,43.936],[-12.985,32.927],[-7.782,9.213],[-2.604,2.542],[-0.622,0.563],[0,0],[-9.529,9.397],[0,0]],"v":[[-284.573,97.974],[-284.622,97.93],[-286.845,95.904],[-294.535,88.584],[-319.71,62.021],[-383.67,-30.448],[-413.106,-163.021],[-333.514,-305.328],[-184.822,-361.596],[-67.552,-312.007],[-6.532,-247.313],[54.486,-312.006],[171.757,-361.596],[320.45,-305.329],[407.082,-175.984],[397.234,-58.463],[349.699,19.47],[329.671,41.044],[323.328,47.014],[321.737,48.434],[10.655,355.271],[-23.716,355.271]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":20,"s":[{"i":[[14.574,11.501],[0,0],[0,0],[0,0],[0,0],[22.678,37.202],[-4.575,40.99],[-53.302,36.11],[-50.513,-2.577],[-31.839,-20.725],[-15.931,-17.11],[-26.456,17.221],[-49.418,2.521],[-52.421,-35.508],[-10.921,-36.989],[13.127,-28.076],[0,0],[0,0],[1.654,-1.195],[0,0],[191.873,-99.288],[14.425,6.788]],"o":[[-14.574,-11.502],[-0.567,-0.408],[0,0],[0,0],[0,0],[-19.497,-31.985],[4.694,-42.054],[52.415,-35.51],[49.418,2.521],[26.456,17.221],[15.93,-17.11],[31.839,-20.725],[50.509,-2.577],[51.252,34.716],[10.879,36.847],[-29.547,63.196],[0,0],[0,0],[-0.651,0.473],[0,0],[-10.627,3.212],[-190.239,-93.788]],"v":[[-285.147,201.501],[-310.314,178.965],[-329.384,161.265],[-345.804,146.126],[-373.197,116.349],[-408.213,62.298],[-436.925,-73.386],[-348.922,-197.233],[-193.314,-244.423],[-70.589,-202.834],[-6.731,-148.578],[57.125,-202.834],[179.85,-244.423],[335.46,-197.234],[426.121,-88.757],[421.571,20.804],[326.825,146.664],[294.354,175.257],[275.942,190.513],[254.917,207.705],[21.255,356.575],[-42.714,356.575]],"c":true}]},{"t":24,"s":[{"i":[[0,0],[0,0],[0.934,0.862],[3.208,3.137],[9.951,11.279],[19.234,37.944],[-4.372,48.876],[-50.933,43.057],[-48.268,-3.073],[-30.424,-24.711],[-15.223,-20.401],[-25.28,20.533],[-47.222,3.006],[-50.09,-42.34],[-10.435,-44.105],[13.083,-33.182],[15.403,-18.231],[5.198,-5.073],[1.581,-1.425],[0.436,-0.383],[0,0],[9.529,9.397]],"o":[[0,0],[-0.542,-0.487],[-1.866,-1.722],[-6.406,-6.266],[-19.739,-22.371],[-19.146,-37.773],[4.485,-50.144],[50.086,-42.341],[47.221,3.006],[25.28,20.534],[15.222,-20.401],[30.424,-24.711],[48.264,-3.073],[48.974,41.395],[10.396,43.936],[-12.985,32.927],[-7.782,9.213],[-2.604,2.542],[-0.622,0.563],[0,0],[-9.529,9.397],[0,0]],"v":[[-284.573,97.974],[-284.622,97.93],[-286.845,95.904],[-294.535,88.584],[-319.71,62.021],[-383.67,-30.448],[-413.106,-163.021],[-333.514,-305.328],[-184.822,-361.596],[-67.552,-312.007],[-6.532,-247.313],[54.486,-312.006],[171.757,-361.596],[320.45,-305.329],[407.082,-175.984],[397.234,-58.463],[349.699,19.47],[329.671,41.044],[323.328,47.014],[321.737,48.434],[10.655,355.271],[-23.716,355.271]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.4,0.4,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Like Afterglow","parent":5,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[45.556]},{"t":20,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.854]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.999,0.999,0.999],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"t":13,"s":[115.222,115.222,100]},{"t":20,"s":[168,168,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.19,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0.934,0.862],[3.208,3.137],[9.951,11.279],[19.234,37.944],[-4.372,48.876],[-50.933,43.057],[-48.268,-3.073],[-30.424,-24.711],[-15.223,-20.401],[-25.28,20.533],[-47.222,3.006],[-50.09,-42.34],[-10.435,-44.105],[13.083,-33.182],[15.403,-18.231],[5.198,-5.073],[1.581,-1.425],[0.436,-0.383],[0,0],[9.529,9.397]],"o":[[0,0],[-0.542,-0.487],[-1.866,-1.722],[-6.406,-6.266],[-19.739,-22.371],[-19.146,-37.773],[4.485,-50.144],[50.086,-42.341],[47.221,3.006],[25.28,20.534],[15.222,-20.401],[30.424,-24.711],[48.264,-3.073],[48.974,41.395],[10.396,43.936],[-12.985,32.927],[-7.782,9.213],[-2.604,2.542],[-0.622,0.563],[0,0],[-9.529,9.397],[0,0]],"v":[[-284.573,97.974],[-284.622,97.93],[-286.845,95.904],[-294.535,88.584],[-319.71,62.021],[-383.67,-30.448],[-413.106,-163.021],[-333.514,-305.328],[-184.822,-361.596],[-67.552,-312.007],[-6.532,-247.313],[54.486,-312.006],[171.757,-361.596],[320.45,-305.329],[407.082,-175.984],[397.234,-58.463],[349.699,19.47],[329.671,41.044],[323.328,47.014],[321.737,48.434],[10.655,355.271],[-23.716,355.271]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":5,"s":[{"i":[[15.537,10.805],[0,0],[0,0],[0,0],[0,0],[24.175,34.947],[-4.877,38.506],[-56.821,33.922],[-53.848,-2.421],[-33.941,-19.469],[-16.983,-16.073],[-28.203,16.177],[-52.681,2.369],[-55.881,-33.356],[-11.642,-34.748],[13.993,-26.374],[0,0],[0,0],[1.764,-1.123],[0,0],[204.541,-93.271],[15.378,6.376]],"o":[[-15.537,-10.805],[-0.604,-0.383],[0,0],[0,0],[0,0],[-20.785,-30.046],[5.004,-39.505],[55.876,-33.358],[52.68,2.368],[28.203,16.177],[16.981,-16.073],[33.941,-19.469],[53.844,-2.421],[54.635,32.613],[11.597,34.614],[-31.498,59.367],[0,0],[0,0],[-0.694,0.444],[0,0],[-11.329,3.018],[-202.799,-88.104]],"v":[[-303.824,211.323],[-330.653,190.152],[-350.982,173.525],[-368.486,159.303],[-397.687,131.331],[-435.015,80.555],[-465.623,-46.906],[-371.81,-163.249],[-205.928,-207.579],[-75.101,-168.51],[-7.027,-117.542],[61.045,-168.51],[191.873,-207.579],[357.756,-163.25],[454.403,-61.346],[449.552,41.575],[348.551,159.808],[313.936,186.669],[294.309,201.001],[271.896,217.15],[12.146,357.199],[-26.197,357.199]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[0.819,0.913],[2.814,3.325],[8.731,11.953],[16.875,40.213],[-3.836,51.798],[-44.687,45.632],[-42.348,-3.257],[-26.693,-26.189],[-13.356,-21.621],[-22.18,21.761],[-41.431,3.186],[-43.948,-44.871],[-9.156,-46.742],[11.481,-35.165],[13.512,-19.323],[4.56,-5.377],[1.387,-1.51],[0.382,-0.406],[0,0],[8.36,9.959]],"o":[[0,0],[-0.475,-0.516],[-1.637,-1.825],[-5.62,-6.641],[-17.318,-23.709],[-16.798,-40.031],[3.935,-53.142],[43.943,-44.873],[41.43,3.186],[22.18,21.761],[13.355,-21.621],[26.693,-26.189],[42.345,-3.257],[42.968,43.87],[9.121,46.563],[-11.393,34.896],[-6.828,9.764],[-2.285,2.694],[-0.545,0.597],[0,0],[-8.361,9.959],[0,0]],"v":[[-249.674,103.832],[-249.717,103.786],[-251.667,101.638],[-258.414,93.88],[-280.502,65.729],[-336.618,-32.269],[-362.443,-172.769],[-292.613,-323.585],[-162.156,-383.217],[-59.268,-330.662],[-5.731,-262.1],[47.804,-330.662],[150.693,-383.217],[281.151,-323.586],[357.159,-186.507],[348.519,-61.958],[306.813,20.634],[289.241,43.499],[283.676,49.825],[282.28,51.33],[9.348,376.514],[-20.807,376.514]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[{"i":[[0,0],[0,0],[0.934,0.862],[3.208,3.137],[9.951,11.279],[19.234,37.944],[-4.372,48.876],[-50.933,43.057],[-48.268,-3.073],[-30.424,-24.711],[-15.223,-20.401],[-25.28,20.533],[-47.222,3.006],[-50.09,-42.34],[-10.435,-44.105],[13.083,-33.182],[15.403,-18.231],[5.198,-5.073],[1.581,-1.425],[0.436,-0.383],[0,0],[9.529,9.397]],"o":[[0,0],[-0.542,-0.487],[-1.866,-1.722],[-6.406,-6.266],[-19.739,-22.371],[-19.146,-37.773],[4.485,-50.144],[50.086,-42.341],[47.221,3.006],[25.28,20.534],[15.222,-20.401],[30.424,-24.711],[48.264,-3.073],[48.974,41.395],[10.396,43.936],[-12.985,32.927],[-7.782,9.213],[-2.604,2.542],[-0.622,0.563],[0,0],[-9.529,9.397],[0,0]],"v":[[-284.573,97.974],[-284.622,97.93],[-286.845,95.904],[-294.535,88.584],[-319.71,62.021],[-383.67,-30.448],[-413.106,-163.021],[-333.514,-305.328],[-184.822,-361.596],[-67.552,-312.007],[-6.532,-247.313],[54.486,-312.006],[171.757,-361.596],[320.45,-305.329],[407.082,-175.984],[397.234,-58.463],[349.699,19.47],[329.671,41.044],[323.328,47.014],[321.737,48.434],[10.655,355.271],[-23.716,355.271]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":20,"s":[{"i":[[14.574,11.501],[0,0],[0,0],[0,0],[0,0],[22.678,37.202],[-4.575,40.99],[-53.302,36.11],[-50.513,-2.577],[-31.839,-20.725],[-15.931,-17.11],[-26.456,17.221],[-49.418,2.521],[-52.421,-35.508],[-10.921,-36.989],[13.127,-28.076],[0,0],[0,0],[1.654,-1.195],[0,0],[191.873,-99.288],[14.425,6.788]],"o":[[-14.574,-11.502],[-0.567,-0.408],[0,0],[0,0],[0,0],[-19.497,-31.985],[4.694,-42.054],[52.415,-35.51],[49.418,2.521],[26.456,17.221],[15.93,-17.11],[31.839,-20.725],[50.509,-2.577],[51.252,34.716],[10.879,36.847],[-29.547,63.196],[0,0],[0,0],[-0.651,0.473],[0,0],[-10.627,3.212],[-190.239,-93.788]],"v":[[-285.147,201.501],[-310.314,178.965],[-329.384,161.265],[-345.804,146.126],[-373.197,116.349],[-408.213,62.298],[-436.925,-73.386],[-348.922,-197.233],[-193.314,-244.423],[-70.589,-202.834],[-6.731,-148.578],[57.125,-202.834],[179.85,-244.423],[335.46,-197.234],[426.121,-88.757],[421.571,20.804],[326.825,146.664],[294.354,175.257],[275.942,190.513],[254.917,207.705],[21.255,356.575],[-42.714,356.575]],"c":true}]},{"t":24,"s":[{"i":[[0,0],[0,0],[0.934,0.862],[3.208,3.137],[9.951,11.279],[19.234,37.944],[-4.372,48.876],[-50.933,43.057],[-48.268,-3.073],[-30.424,-24.711],[-15.223,-20.401],[-25.28,20.533],[-47.222,3.006],[-50.09,-42.34],[-10.435,-44.105],[13.083,-33.182],[15.403,-18.231],[5.198,-5.073],[1.581,-1.425],[0.436,-0.383],[0,0],[9.529,9.397]],"o":[[0,0],[-0.542,-0.487],[-1.866,-1.722],[-6.406,-6.266],[-19.739,-22.371],[-19.146,-37.773],[4.485,-50.144],[50.086,-42.341],[47.221,3.006],[25.28,20.534],[15.222,-20.401],[30.424,-24.711],[48.264,-3.073],[48.974,41.395],[10.396,43.936],[-12.985,32.927],[-7.782,9.213],[-2.604,2.542],[-0.622,0.563],[0,0],[-9.529,9.397],[0,0]],"v":[[-284.573,97.974],[-284.622,97.93],[-286.845,95.904],[-294.535,88.584],[-319.71,62.021],[-383.67,-30.448],[-413.106,-163.021],[-333.514,-305.328],[-184.822,-361.596],[-67.552,-312.007],[-6.532,-247.313],[54.486,-312.006],[171.757,-361.596],[320.45,-305.329],[407.082,-175.984],[397.234,-58.463],[349.699,19.47],[329.671,41.044],[323.328,47.014],[321.737,48.434],[10.655,355.271],[-23.716,355.271]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.607843137255,0.913524373372,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":12,"op":62,"st":1,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/assets/lottie/zap_md.json b/src/assets/lottie/zap_md.json new file mode 100644 index 0000000..917ce01 --- /dev/null +++ b/src/assets/lottie/zap_md.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.4.5","a":"","k":"","d":"","tc":""},"fr":30,"ip":0,"op":31,"w":1125,"h":300,"nm":"Zap Medium","ddd":0,"assets":[{"id":"image_0","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2bub5DjuM03gz5vQuJfEDYzZOaItMCfmAC6fQOj1RBtVJ3D5BCqdQOgTZMGKDkfMpsETDHiCLtCz8M7gCZpYdITaJvPfiypKoARQAPEp8veLUEgqZGX+C8QGD98PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgvZERQAABT5JREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuzP8CfMIcL2tPJNsAAAAASUVORK5CYII=","e":1},{"id":"image_1","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2buf3LiuLE/Av/vEBHJm1grMnjWQaentIKNWkJHDQsPFiBVU1ApMr6DoFTzSRqKGzVyBQyuokJwF5KyoFZQ4yy5L7/QgwrJkiRJFBv/J3zcxQb6495ISBcTP554DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8P/bgwMCAAAAACH9X90RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADXaipjKuReVtAAAAABJRU5ErkJggg==","e":1},{"id":"image_2","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2bu73DjOLE3A7xdSGXU14qzAvCzAZSl6BZ2zgmJdFoyCkiswd1CcFTS9giBdGMxlsVdQqR0kXd1A3w21ghHnatAjxpmLSNGSRckklfx/HsAWqUxGfPxL4Hv1nXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4P+3BwckAAAAAIL+v25HoAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcBc0kmcTVjB6BAAAAAElFTkSuQmCC","e":1},{"id":"image_3","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2bu35Dau9A7g/9NUMvMUMSsY5G2qPJI6KzC8AiOPqdRYwAqCWcHAKwi9AoB2Tflx4BUEWsGA8kxV3kztgMzTlCP2yQNaF5oXURRvon6/KhdNsvvgiEUJ3V9/FwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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1aOjvrwJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP5fe3BAAgAAACDo/+t2BCoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsBMqmhMjBZshSgAAAABJRU5ErkJggg==","e":1},{"id":"image_4","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2bub5LbOKw3A73fJdmUm9gqMzFIVW7xZgdkrMDPsSiUCViBmBWZWEHoFF0wq49ArCLSChpzuqsxC7oCs6kE6Ee/pAWDaUvQfUiDF5xmJwMXlUYEkcF983zkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz/7cEhAQAAAICg/6/9YAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACmALPbBhk1OHpGAAAAAElFTkSuQmCC","e":1},{"id":"image_5","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2buX5Diu7AzA/03Sds8IrYDwzBGywOwVsHoFQg8dDjWrViD0ClhagaAVZKEVHR4SvQKBK3BBao8NrqABjzo6yDweVBGk+ARBPPj4vggEojKzbt4CqoDMc889FwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPD/twcHJAAAAACC/r9uR6ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwENCA6V0fLp8FAAAAAElFTkSuQmCC","e":1},{"id":"image_6","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2bu75Diu6w7g/9tg4uSJyAo4fnOVLaKzAo5X4NFjKiVhZgVCViB4BYZW0AOlXH4UvAKBK8hQqlTlTeAKTObJjoU+eZgRPyRR4scAQxK/XxWLg57+uCDA6dvnnnsuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAb4W26wYAAACwGzV8MEv2+iQXSc7bYnWx2xbBzSIoAxs19NN0WWbMeVus5rtuDwAAXIUa+v1040mqzZLcfv7Nup9b3Un7aHW2m9bBzSIoA0lq6E/S6pOnG/IwaWdtsTraYbMAALaqhn4/uZwme4/aYnW+6/Zw/WroZ0mWaXU7aUnVw6SdJ+NFuiRj9pNuli7n7dBAJVw1QRluvBruLpNuP924n2r3nn+z/VIKJwDwLltnA4/TjG2WLvtp43H7+OvlrtvF9VoH5HKSVofrDXmYjMdt8eO/C/V5f5TLnLfFanWNzYQbR1AGnlGnBxep3HmyodVpO/xqvrsWAQDvuhr6PhmP02U/Y5ckq+/+XMUDbw39NEmfZJpkmla309r9jJcnbfG1KSlXrIZ+knUmSp/kdloeZqyLp3t0q3Tjo2d+F87bYvXoatv0q0m6fzpL1UGSpLXPMub4565bpwerjG161e2Dm+zWrhsAb5WxHaXVMt/Nra12WEO/lN4LALyO+qLfz6M6T2u3U0laJcmTzNxaHiSt7ifdecZXe0Cv4dd90vaTW9N04yRjJmntXlLrHVoeJm2Zf/zbSfu3/7nY+jf3Cmr4dZ9u7yhjt59cnr0oO+M9MUvSp9oyyaO0JF0lY5KuS8Zxs9u4n66dZGwXWQfQrkQNfZ+uvkzVftIepzJv85esF9PaMuvvZ3lV7YObTqYMfE8NfZ9W53la9Oxxqk2MEAAAr6pO+5PUM3XrXkZr9zNmmfVqOH2S/XWWzdiv3+/6pG6/4NiHGcezpFu+LdNOatkPSc2f35gHSZu/LW3cpu9qFbb5g5d61qqhP0tyfEVZU5OkVmm5vfk3n73K1PwafjNNbk3bYnW87bYBazJldqSGvs+ty0n7SArp961vHpfTZG+apE/bpFk+2WFdhDf5+ZTL1zA+tuAAACAASURBVNEWq9XmBnaeloMkt5M6r6F/pZsYAHCz1Z/6Sf72igGZJKm6l5bv1blL0tozXzz33sN0dZaxW7b52xXkWNfu29QweVbLQSpnSSbX3aZrsErWfdqX7DueZB182/7PrhuXqXY71R4keY1pSB4X4ar5X7Yjm0j4alMBf/aep3D+rHX67d4sXZut57p22XQ4Hqfqfjal4NMlSbuX1CepzOvz/rh9vDrZdns2N6x+2+cFAG6Qv47Lp4GULas8Tmr5NmXEfF8N/fRJUdkf0+pODXeP2+Kr4+tr1bW42Pw9eeb1C7XF6rxO7y6z5SlCNfSzVN1L8jivFZDJ+mnx2/FndwNen6DMNVsXXhvnSXexnliaeVq3nxs4T3OzHN8sqVnadzVckk0Q5iz58Wrv3wWykr2TjPWHGu7Okm4uiwUAeFvU8Ot+Xd9l2yeuPye1fEcK9k7S6n7GPEqySrrzJH0yTpKuT1eTpH1aQ3/2tgaW3tDLB0HGTDZZ2dv7uXbjPNWSaievnV3+bbIZFQWuiKDMdesyTbXDTQ5qnmSD3CDrwFQt0+rpKkfVHibjSdKdtcWDi586fnNTWdbQn6XqJK0dpmpVp/1Jxrz+TQcAYGv25j/YVO00uTzLrb1H64fdJMkkGfukmz3XN3re41Qtk+7k5/pJ2/J0Ge30SZtspnQnlQdt8eClsonbYrXMDwcez5+5xn6So/WAZY7euNFvjbFPtYevFmiqZdb92+nWAlTVpuuMqrx+VvmtJGPNkhxvpU3ADyj0e83q8/4oY/3huY2t7rfDr6a7adH1q9ODVSoHz9SGeaO02xo+mCfdySbb5nGqzpI6S/aufHlBAIAfU8PB6mkgo51mXQvv4qeP6afJOF0X9U2f5FH2uvNcZnn1Syb3ffbGaS4z+0GGT8vDjO0iXU1SuZOq329zytEr1F55J9Rpv8yYtMVq/krHrfu0x5sCyOdv1IbhN9O0vS/T6vft8M1+VrU8qNxu/9I+1K+GqyAoc81q6PfT6iJPV/ZJWvusHa7eo9GBn1bLg0qrz9rhV1v7ntcjLeNRujZP5ekoU8vDjHWWdFdSFBgA4Mes+zvtfsYcvc1Tc2ro50kdPQkgrVedPEtynvx91Rb/vXq67+ZB38qUP6mGg4ukHW8yhV7x2H6SdXbR8lWP3xw7TzJJapYuFxnb69WSee68d5dJ65M3PxfwQ4IyO1JD3yeZJbl4nQ/sd9lm2b++LVaTKzp/n4yzJNNnRnoet/mD/au4HgDAszbTciZvfTCmq+PNYNYm07hb/lyGRg13l2ntMF1btI9vVh/2ZdXyoFLtt2+S7VKnB6uM7ehlz7EuqpyzpG6n5UFSFxm7+TaCKJvBz5OkzZK2zBtmuQPPE5Th2tXQz9Lqi/xD+9f271f7gb6+VpZJ3b6O6wEAvK1q6Pezl1nqmWBMa69Uk6+GX03SfvFNqv7cFl/NrrjJ75wa+klafZNqH75J0d76Uz/J/+U8Y2Y/FwBZB01qlZY7ae1hO7yigc8/9ZP8NbN04yxjm6zLBXRnbzrVCm46QRl2YjOC8FlbXM20rRom+8nt9c0pSVqdtsOv5ldxLQCAt816Kss4TzJdb2mTp/2i9iDt8iSXe2evk0lRQ79Kq4M2f+BZ4kdsq5+7WVL8LN141D7+evni/e6eJG2etNl1BUjqi34//5ujVH2a1v6cMVvJyoGbyPpm7Ea1++lqenUX2D9Ky51UnabGDwVkAICbooZ+nlbfJG2eLhfZ65bJ5Tx1+dtU+2U7XPXt469fv3hwl7P1dX4z3WKz3x+t3U9Xb5xF1Bar81Sb5XJvXqcHFzV88IJztnny8lOdtqF9uHrUDlfH6doiVb9Lcr6Ztge8IktisxtdHqVy7+d3fF01T5K2EIwBuGnq8/4olzl7n1ZzgZdVQ3+cVp+m8iBp03b4YPvZC2NW63x7jxLJpp7hrW/3k1v7+TZ9xjxKy536vJ+/ad2dTaBlWp/387Tuixr6xbP1KDc/79upvPZUqTdq38erZQ19n1afpNpx3qulzeF6+CRlN8ZxldZ+dxWn3szlvbPujABw41xmP62+qaH/LOtliKXU817bLCDRJzlO6k6qTq90YGrvcj+jhPunxpNc7t1Lal0covIgrd3P5eXWrrAOfnyQtG6o07t9uvEs33bztDrcTJXa5efccarN0uqTGno1ZuAVCcqwI92jpFJD32+9evutbye53EvSTrZ6XgDeFSdJjtLqk7TM6o/9TKF33jc19MfpapbKQVKbje1h9tqiffxgeaUXv9ybplWSCHgmSbqL1Ji2+Gp6lVdpi6+XNfQXaXWUsTtOukfZy4fto9cvKLyddq0e1dAfJxnSjcd5UscIeBmCMuzKd53jyTOvt+PbbropYX2x1fMC8E5YPyDcPUlrn6ZyJ3+v/6qh/4+2WAnWv8M29SrmWfcbVjc5A6qGfn8zRSlJHqfaWZKzN1nt5xWuPdlkZzy0LPIT52ltqKGfXPW0yU0WyvlVXuM1naVykrR79ce+FwiHlyfvkJ3YFC57mK6Ot18UbDx/2T1r6Pdr6Kc19LMaPphvXk+22x4ArltbfHWcysOnG+oPNdxViPIdVMNvpjXcXabVX9LqD2n1ZVr9pU7vntfQT3fdvh1ZF3xteZBqk7ZYza8jILM2Hm9eHP/ETjfKX58GSaY7bMZOrYOktf4d/FZdGXgVgjJcifrPflZDf1zDB/MX7nTr8midcpvzzVzoLXmSAPaT59wEX843nbsv0rph8/qbOj24qNO7y3WwRgce4N3U5s9/2e6l1YUVY94NNfTzOj1Ype19mdYOf7hDu5eWL2s4WNXQz6+/hbtRw68m6XKUyuOMbXrtGUOtHabq/rPFZm+6f16sLtLag3SZ7Lotu7UJylTeeOUpuEkEZdi6Gvp5LuuLtPo0rRteNIrVPvr6LDUu0uogqeXWgh97390Qxxeerz7/YJ6W1fraP7ZD7qTa4TpYU3+poT+voT/abvAIgKu0zsqsP39v8+20vS9r6E1legvV0O/X6d3jGg4epdWwGbz5qSOSloO0GmroL+rz9zs4s+6H/GKVqoPcarMdTuE639F1317jeJ5x3HUrdqotvj5L5XFSt2voBWbgJQnK8EQN/aRO++M3GUHczDMevrf5hedri6+X68BMDpJx+f/s3U1SJNmZN/r/cWh1D+7toldQaCYzqUjvFVRoBYWGbW0lIlYgegVFraCpFQSoTPYOi1qBIlfQQUnXrGciV9Dw3jvQKyV+7sAdkswkM/kIIIDfz6ysSIgPh4Dw4895Pm76vG8fxNnzNZfWstZpO07XTJP62ZUfs9Qvh5Tp/6r7L47qtN2r3zvZACy/ZtxfJLyj1N/V/XauZHU51Okv1s9LlGr5JiVXP0efKfXzdHVapy+O+/XMU3xtu92UfJZSfixfP+SEm0YW8XuaY5dWyXm2TDrrZLgi7xz0wZh+IfSXdPWblJU/DnXa1z/hrgwBkb7G+Tf9x/WjGSZ9YKa+TJPFnOC7uplSXl1WW12n7fiSoNH11HyeUrdyWn/oF34bB0M/mme5QKn77d7Qp2H9oY8F4F1lMj/O6jtlTGdqfZFSn1Xpy7Kp01+N6n57kPKPf7m0ROkmSj5Lrd/0Y9E3Dp7Ujn3TrCc5SZfxgx1Drd8Oo49HD3YMS6lbS041t11t9pIkpWw917UxXJegzDNWp21bp20fjDlbCJWzL5Yvk3r9wMxp1wdfurJdJvODlLKf5LPhsS4NzNRpO0opX6Zrbt2grs/UyWe5ZPLSQgIy7yr5LLV8NfSj+Z9h8fdsAjR1urGbWrfSJP2FzYujut8eKPMClkn5en5wSRnTmc/60peNxZXR8kl9v5iNWcrKH1PrV3f2RKV8lVJ/qNMXR3W6sfuYz091urGTWj9PLTsPOXmqb6JdXyb1oO8faFOm17TJyuyhj+Khla/nszdN1jsNf+EKyqdvwlPT7xh12ynly0/fuH5XJj998g11WMiOUupeks9Sy7+cLRjqfrubWn/X37D8mIsjsJuMUuuXKeXHsjW/9U5WnbZtSv2v4bl+fjaWsO5v7KSWb277+Nc7mPpjn8L5/x6UydGTG9s5jOM8Si3zMpmP+s/9apSsrqfpxmXrp9GDHiDABfWH9bWcfHaUfKQsppZXSTaN+b0bdbq+lvzfm2lW+uDCQynlVZKDdH/fK5P/51G81ufrm1oOy2S+FIGlfpjDyk5K/Tw1r9KUebrMs5LjnL6eJ6vJStqcZi1N1yZN2weV6o9l8tPTyV4a1P32YBFr2afgzUZoOUnN+nMeXw9XISjzTPS7GN12UjZTcr2F0IXgxluf3m+30tX/6PvBvHX7/TKZj995/lHSjVPKZi4uiGtOknKQZHtRb9h12p418D1JqbtJs55aF5MSfeODqj9mpTnIaQ6eyompTtvtlPqfqWXy7gSGYaEWkxmAZVK/bzdzWn/45A2b8h/lt3ONgBek37jptpNmO+Ua/dzuQ8mrpB6ka2YfGik9bDgcXbYWug/9JkiOkvpZavnXZQsaDtlHo/6/uv7euvD8huVlSv0ytXxXJvMnlUFRp79sk6Ytkz/tPfSxLIu6/+KoL/lfzMYrPGWCMk9YnbZrWclmajfuy5Fu+kDl5VkmxIXHHnZscpKmztPlOMk8qUefOiENWTVt/ilH5d8Wv8DpA1D14IOLglsrSeot7l5fpuQgp6ezx7JDd5k6fTFPyXoZH16a7l/3N/bS/e/tp5glBDxedbqxm1J+9/FblaTmZfqsGe9hN1Sn7Xqabid1Qb1ibu0T5+9aTpLMktODZGV2MQhTp+0oK12b0yZJjpPMbhKkGUp9ttPUzXRlLU23W7Z+2vnoffY3dlPL7x57MKNOfzXqx5vXbz/1PT82dfrFWEDmbXX6xWZK0wfBV8pvyteXBz0BQZknpw94nG72GTFlcTXatfy6TOZnPWa2k7o99FN5L0tiGZyX1nwsTX0Z9AvAg/SjJW+0wHsIw5Stv3ysvK1+326m60Zl69PlbwD3aQgqXyVwf5JaNsvkIafcPD512o7SZPtOe8Xch1IO03WzrDYHFycd1Wm7npXTUU5X1pKsZTXz/F+Zld98PIBX99ud1NqXUpccpquzpBmnyTzd5QHAOv3Feso//qXv0VHaxxwkvLB2eHLlS3XabpfJ08uuG1oerCfN7CYZWnW6cdD3dcqrsnW4vvgjhKdBUOYJ6DNiTjdTy2bqAgIxNe//Zgxvpm8tZC/JoFkGd58pc4dKDpM6S9ccLPNFQN+cuf7xLFj34dttHCTN+DEvIoGnZzhPzK88dvmRZyjcl36KVTe+Us+6hbll9urVn+cktZslzUHe2USp07bNSkY5TZIu717ADuVbeynlq9RymPx9fJYpW6e/WE/zjwepWU/py6iS10fJarL6Ouma7dTyVWr5zYfKqx6T88BUKftl6+1S98fsKQZl3uoJef7J+jLJPGmOspp5XidJ5h9a550H4pKklkmSo6y+Tl6vJqtJXr9O/8HpelLW0yR99n03z+pq+sc/u03XpmnWki7p+hu+mVnTraVJ++bzSZoLt+mSNMP9miRdN9y16T/+oKa/35vneec+zVAp0CXpZmXy59lHHgw+SFDmkarTX6wnP9tMyvjegg+l7J/3ZumbIS7djk3fu6YeXHmhvexK/bFfoOVGOxR3pU7bzZT6QxkffvQ9pE7b7fQn69n9HBnA1dTvfzXK6cofr36HHCZlvEzvxctgKMcZp8n4QZv33reaV2nOgiiZXVwP9f1F/mFoxnt6PDTDfZFaPlgSV6dfbKZZ6bMSLpacl/IyJXvlt8uXlXxTwxpiL7XMk4wfS5bwh9Q/tG3+ls0yme889LEswltBxIW4r8DpPaj15RCfmQ3Bnlk+EpSCqxKUeUTq9FejNM1m0oxS64NngXzqgvy+3cnI62XSLwBnKXWW05UHbRhcp+1Bmtp+KhW1Ttu1NN2OEiZgGZ03LL/yHcpJkp2ntiN+E0NZw3ihpdKPWSkv+wu012/tlr8p36j7Zeun8YMd35LpmwPXWZLjrJX2U6Vfy6zfgDo9KpM/Pf5Mpj7IejAMzHh+al4l9ShNM0/XHSfNPH0PKYEX7tRSXVTTG94Q15OMkm49TWlTl6wUp9b9MlmOxUV/4Z/dB5+wdN/6Uqcf0nQvy9d3my554XcyWc1aTusPV+2mX6ftbvL6QEonsIzqdGMv5ZqNaPsL8Ee/w39d9Q+/bPN6ZTtd2Vy6jNQ+YLaXnM6SleMk/VCBpmvTlQ9PBHrLAnf0S/kxXZJSv3pqpTqL8qYUennWlDdRpxuzpNl+7Fl0/euRg2TJJqQt1klKGQIumWelHuV05SjJg01Xg0RQ5kHV79tRXp+uJaVNmjZNt3arKUlXsoAFxxLV1tdp26ape0sXtLpvNSdJnWWlmeV0ceVCQ2PnvZR3mjX2o8zbq5zAhsfYTZNR0h0Nqd7zp1AbDzwN12j8e9FJmrLz1EdnD+OOx2nqZmqWszyp1m+TZvdTO9l9iXM3jG8ubco9fj+lvkwyG0Zvz+7teZdc3XtRU+rLsvXT6KGP5WOGtcwoyVry+ihrq/Pym/nxWSCjjOeXTqJ8LOp0YyelfPPQx3Fj/UZl//ffDdktfQ+ZoedLjh970IynTVDmgQz1mjtJGd15T5hSDpPuOF1zlHRHWWmOc5r50DhrLU23ma6Mrrw4ucYF+V3qy5Wy+8Qj+jdXhwVgn3o5u0naZZ22eyl1K7XsJ9m+Tepmf8Jvts9fr1oOk4ykgwIPrT8n1/mNLtL7PiFPKmumH2WdrXR1cq+Bi+s5SSkH6f66Uyb/fXSTB3hzod2N0pTRvW7wvJm+NE+/UfEsLxgfQ1Cm/r7dzmndeSs7rJbDrGQ3p3U3TdktW4+zn8xSD8co5VW/mZfjNE3/99H1AZahWbCSIp4MQZklMJSGjNJklK62H31jrDlMyXpK3UvXHOdCk/Gs5CinQ8f+JNfZiRkWJrMr15DW+rJMHuYEevNypSfUaOwqLk7Rqkma8irp5hcyVWaffIjpi+Okzhf5Wg+7MdtJPkst3z6VxnjA41anbZtSZ8mNynJOUsuj7zUzZJKMr13OdZ9qeZWc7iSL761Wf2jX8v9llNcPEKRJ+gBf083T1XmycvQcMmr6oEz5dlmDGuebU6Xup2t2ymR+1P+dZCepbVL3kmbnMQYHhp5aO7nZe97ilPoyaY6HgMs8fSnRswxS8nwJyiypIUjSDrPgktTjs/GJd/qcpR7lqm/OpX5btn7auctjetcwXWnvTnbuSl6lK22ZzI/Pf/6rWcvrtGm69STrqaXNQ5+8FqnmMKnz5DxQc3GE52ZK/SG1m5TJn/YW+rRndeQpJ6kZvXvyHX7+O8tSJgc8D0Ng5r9u/gDlMH1W4WxhB3XH+vfb081kZXupm3v2GZt79/mzPd80S7f5YA2N+/P0UZqcbao8qd4XyxyUqdN2L8lm+r/pvYc9msUZShL37vTvvZZXaXLUj6/O0DD3fAz1ZrqapGw+pd9luA1BGd5y7QVpLf96X9Hsur+xk3oH9a6l/pg6LLZqXiVl51Mn3+GEtpamG6XLWtK0KWmfRClVX/Y0T8pmkpTJxycs3fhppu1RSv08/Q7zeTlcP8Wg7iT14DE3/gMepzr9YpzS3G6S3yMoaeqnJ2UzZYmb5Je8Slf3rtIv5j7UabuZJpvp6sM3Oq71ZdIcJTlKMssjDdbUvRc1tb7MarOb15kl2UyT7XTZfchASJ1ubCfNTvL30V1vit6XIdN8O7Veby1dy49JDtL/nh0n6ce9r+bN3nHvSr+DQwuHg/6xmu3H+HsLiyYow3vq7ze205WrjQgt5VX+OXc6yrBO29HQzHex2TElh+lOt8vkz7O63+6m1t9d+OpJapllaA6WvJ4nq5882Vw6lruWw6XefbyK80BNnScrC6l97wOAmSX1s6FJ417S7aUMza7vMeAHcNGl7+U3Uep+um5vGabPnfdP6fvIPXxQ4WP66VZ7y5ydcLuR4HdYTl0uBGu65Q/W1Gk7T6kvUsqr1LqWs2zkmpMyOXyQ5rl12q6nZJ76enMZ/nYXoQ8o1t3rraVLUjO5q7/DOm3HSd1NUw7SZWeZf0/hrgnKcKm63x6k1qstNO6ov8xZCUvKW8GSRbh0YkadfrGZrOwO2RsfOKhy0kf3m7dSqIfMmd2U+mZ6Vr/zs1O+7m93Pla6z6654qjzJe6D0+8Ez9IHruY3OZnW79vNnNYf+ubRyflFQimHZWveLuxYAa6p7m/spS6ot0opL9NkN69zfF/lN8M5p02TNulGdz/d8dZOUupBur/duHHvQxjWKptp6vZST4LsS+vOJ9Gkz7A5GtoQJq+v14twYYfVr592zqc8lrKfLmsp9asyPnyQ65Q63dhLclQm91uifxf694Fu99rBw36ox52XbfXZO91uatlKLXcWAHrvOfuMrPEwFfQg//TXefm3x/O+w9MjKMOlhjeso5QrluPU+l2Z/LSw/h91+sU4aXYXvpNX637yv7fL5OiDmT31+3YzyYu87n6dpuk/2dW19xow96VOR0ldf6vHzTV6CrxVLlbLftId9wvoZj31I8Gh5XSSUubDztyVAjV1v925NI22KZPy2+XdIQWeh/Mmnx91w+B5P33nOE3OGlwOmrOL5qsa9XfLWrq0aeraUgcH3lXKq3Td7rDZ8eAlSrcxNEreOc/4pM/c6ZqkH1E8T2mOUzIfApSXZsPW/XYnXUZlMh/d67HmvL/i/6S+/tfHXrZU9zd20pXta6+la93PPzU75d/uL3PlvGz0DrOk67Rt02Scro7T5ChdeVT9v3jaBGX4oPp9O8pp/ePV73C7CPewWzJOqeMsupluKYfpbt98sU43tlM+UNo1TIS4blPcs3rqy7KNhp/JepI2Tdema9YfWSnUSWqdp8msH8meo+Hzo6SOL23YXMqrdGkf++IceBoWmjFzJ5Y4o/Jj+ov13TKZHzz0oSzCkJm0cx7EK+W7dBlfeXPrueozkOdJc9w3M85Rmm40ZE78x31PNBsmEv3nQ2XpLMJQ9r97reBsyauUupvT/733sY3LuzSUje6mlvcGQFzzcc4GdSQraXOaNk0dpebzoQHxN2Vrvr/AQ4dbe7RvONyPa5UxJdfuAzJk5IzT1PEd7eydpKk75bc/LeykXqcbe2+NC63lx+T04KYTivrJAzksW4dXLtepf2jb/G0I1iRtmrr+qHZGP6aWX9u5AJbF0BxzlvqoAuLLqeYkqQf3vQt/194aLdw34N0uk/l8aGi6naaMF94Xb2GWPKhXy2Ga7jjJLF3ST4t8nav0+bvR003bo6Qel0m/JqvTdv2x9Dp5LzB4FaW8Snf9DcW7Un/fjnOa3aFVwPZ1Nuj6LKf8z6W/z0v2fcK7BGX4qBssRk/yD2VU/v3DgZnzWs5+6sPdjZgsdT/d9d7Qr+LNuPLF1F/XvRf92aOWf7ntsb7JrOnaJKOkrF+ajbIwC17MlbpftkxcApZLfy6ss7sPfi/5BfJ11LxZZda8SpZnitIivbVR85HMjjptx2nqzp0EZy7+rJ+jkldJPUqSPiu3myfN/LprtDptRyn1j6llv0zm44Uf5x0Z+rJsX7tUqdbvkmZn2f4mh3X2dpK2TOab17jPXkr9asiOP0rTzdOdD6g4ustjhtt6zm/hj16dfrGZptlNyjzd6UGyclAm8+PhwrxNspl0a0kzK5P5zs2f5xfrKf84z5VLispJajbfaYS7lpxuJit3G4hJ+jr9pmyfNdhddnXaHqTUr+5qEXAhiNQOwZr1pax375vKrS/b4gAguc/AzBNSy36Sg6dSovSu84BMf/66UslFH5zJziPsG/cBSx5ILHmVrsz70qjTo2Tl6LJgzVt/34+kn8yQGTNOqdu5Xtn/SWrZXOas5L4Eq9spWx8fJNL3ccp6mrRDb64D60geI0GZJVf3N3ZSyzfDwmb3PB22yXZq3U6tO0lzPIxlbNO/KZ+k1Hm6Zp6ma1NLm3q7i93zBlzXulN9meQ4adbemkp0d05S606ZLK5U6T680+z33uqn67Rtu2TUlHrWI+cki+7lc60DKr95qgt34Gnog9x19l7j9yftmhfdfVbMk2jc+zEXAjKHSdm87k78nWbOPIS+NG1oUt3M0yRD4/+LzkuOhg3Es5HX60m3nv7iev3eJoWdNSFuMkuymVpfDNOfdu+q2extDYGYfrR9vcE49j6LZLTsf5t1urGdJpuXBWXqtF1P0+30fYfq/pDtc3T/RwmLIyjzCAzd/MdJ2TxPS+zHEW9/6qQxdJE/SqmzsvXTlVIAP/JYB9fKcnk7dfluf9v6k+jCS5XuQ522myn1h5su7G733GeLyj5Lp7/geN0mq6Oka9M067fvo3CFBX2tP5bJ7X4/Ae5Df1FU5wufDvjWk+TxrdBK/XFo3Dt76EO5a+dN//vz9q0ucOu0HSd1525LjReoD7rNkhz1JUP1qEz+PFv400zb9eS0TVbaNBml1rONx/tVy6ukO+r/0czTT5e8NNvmzg5h+sVmsjJKMrrVsIdS9vPP2S6/Wf618nkp2YVpnOdlTaV+k0eQ7QPX8dhO+dzA0M18ett+HcOb4TxliVJuFzRV6SHV/XaWWr9MLT+/34DMkKFTk+Tjz12nvxolTdv/l3ahE6BqXiUn7UN1+we4ruH9c5aHzC5cBjUnacpeur/ulsl/Hz304dyHCxnMh8niMg7q9Itx0lwSnFmC8qBSfhyyXg4eMiPhTZbIUJJd7yUL+8NKeZV0875sppknfz9aRNnTEJAaJWWUUjaziPeZmsOz5sWPRZ22Ryn185TyMl2SMgTmFvy3B8tAUOaZqPvtXmrdSi3f3q6/zBC5fniPslTpMv1I7LwadtuO7u15p+1eSt1KLT9etZHaO/dv+12sMgRqbpBu3AfVxsuaJgzwIXXatmnqh2TDlQAAHL9JREFUwZMpP7mOYZLJWS+7hz6c+zBMUtrts0vrfpncTVP6Jek5c5JaDpIcJJkt82t8oY9iO5TsP3zPvJLDpA4To5okQxnXavrBUe8bpR8tNUpKu/AsvJLDdLfL6HoIw9/cXspQptWPT999ig3DQVDmGblwEX6r3h112u6m1N8t8tiudwB1/7pj8pZZ3d84uFAXfJJSZ+kyu+uAU51uzFLKl4vs5VKnbZuVjFK79XRNm9TLFxd9U8Td9H2SnsTrCDw/9Yd2LcePscfMDbMv+h3r3efU/6v+r3Y9f81mmrqdLmtJNy6TP9359/8APWdOUspBusffmPmtQE269kLPxeV2N2X/J6lXa0INPBxBmWdmKGXaTS3tbbIy6n47v32vkWvqF4M7j7lU6TLnjZu7tGnq+vlkj1q/K5Oftu/uec+CMqe/vot68Lefq22zmrWzHaKn9hoCz1vdb3dS6zcPfRx3ptYfh93p2UMfylXUabubpmv78cjXDzIMO/TjNM04tb7oBxc0e7nnyS5vRgPX6406vtaT5NWwSfKkGzMnZ6XYq0nSpslaum5t+Djpyvqj6etzHfc4QAK4OUGZZ6hON/bSNG3Zmt+4trRO2+28mdpzt2peZaXsnDX6eurOmzMnn6V2kzL5097dPM/Gbkr53X33sgF4iuof2jZ/y96ne259IktlmZr8PsLJJvX37ThdfXta5BWHIyRJnf6yTfmHWWqSJrvpjncfuufZECTaTsrigjP9qOidMnkea6vreGcjqU26tTRN/3GXtTRdlqJM6lNqeVkm89FDHwbwacty2uee1f0X83Tl4Kb9ZfpGd812Uu9y+sRJUnfL5KedO3uOJXU+kSnJsEN3pcXktZ5jf2OWWr4s40PvAwALUqcb233D1js8P961UvfTPa5gzJm6/2Kemhepp79OXh8l/zROqdvpG4ROPhaEOO+b13//S1cmXafra8na9vn3cyPlJE23U377+HvyLYt+Suq5UdIlTZN03aj/f5Jyz02J+zLxW2XFA/fHxdgz9WbyTvnXm1zs1/2NnWQ44dykwesnn6B+N+zOLdWC6D7VP/yyzet/2EmtX6WWwzK5eWbTe489/WWbsjpLKcdla76+qMcFYJie0nS7F/qFPQ6l7A9lwke3faih9KbvxXJWlts3HN25q54lb9Y2bzfiHcaYH6TkxYcCM3XarqfUeWo9uKsmvovypuz5mmVNfRna+DmvrR7aMEFqPcmF0qkuSTcbSquSdKMkt1tfK1uCR0VQ5hmr03YvydoNJ+/sJDlKMkupf1nYQZXyMt1fx89ltOan1P2NvdSylVJflq2fRrd+vIv16UmSMn7sDf0AllWdfrGZNLtL36uiL+8ZL2pXvU7bzTR1NzWf99memQ0ZA9sp9Txj5WKGwW371fSBijpLzYuslN+Ur98+t51/vct6mRyuvX//F/M0Sdl6PGODz4Mz9ZOZMyepT+d8369l/r6+iPHTy65+/8VmurKZrtm8cvbdgjfygLsnKPOMnafp1vIv1901qfsbe+mavTKZz86nOt3OSZoqnfYdde9F33jgBq/Re4/V7xTOkxxnpdvJ6fMZZQrwUPoJTdlOWcJGwDWHST1Isr6I7JB+THi3m65ZS7KXd5rHnmdppgy9c965yLxCQ+H+XHY6SlbW0wyfvJi1W3L4ocBKX3pdvnm3bLdON3ZSyjc3zR5+aOcbLpeVNdUcJmXzKZSx1Gm7mWQnTV1LV8aPpfH0ItRpu5aVbOY0bZLRB3tXlRymez1+DgEreEoEZZ65uveivpkq8Pf5Vd7E3w3mDCm/N8+W6dOZn8SCYdHOgjKL6PtS99udJGPlSgD3byhp2rtyg9C7bfh7klq2h2yV/hx+i3KHPuOl206T4zTdXvn6wxP9+p9Dxum69KUbTdJ0SZc2ZSj3arpJ+e37Te6HIQM7ST4b+s71Gw3JsHap84+Nq67Tdicl35TxvFz43FnJ07ePvYfdhWmOQ0bS4/+ekrPvqztI1yR5XiPZP6QPxJ2O0qyMkmym1s9Tyrdl62a9IoGHJSjzzPW7Dt32+Q5TzUmaepCuuXSEZJ3+apSycpBSD8rWhXrtYffp+gfwNBYMd+VCpsytJyQNr/XmstfKAzxlb5X2PMgBlG+zlt3ymz6D5UKPuZMymb9X1vPBhzkbG52y3QdHmu0FnKfW3/R++T8/v1jKXKcbeylla2hguptcfypSH5Sp36R2vymTPx0M3/ssJUfpyuipZI8OmTNrT2Gzq07bNsksTXYFHICnSlCGJOcn8FGajJI66icX5FWacpQk5ztatXyZWl+Wydv9Tep0fS3ls6NcdRpAP4rxWaWe3kSdbsxSypcf2jW8yeO9+9oBcL8ulJvcX0lTLYfp+8a8lxFb/9cv1vO3f5yl63bK5NPnmiG4sZ1ajtKPmp4t7DCnX4xTmmlq+fXZ49b9di+1bg3fw42DJ/30os9mKVlPLfOktkmOkpPRQ4+95n3nQbMhq+uhjwfgrgjKcKlhwdhmJW1qt9anF2foEP+3vcsa8Z4vpD6l1B/T6f5/FXXa7qbU36XW78rkp+0FPN5B+kW5nz3AA6vTX6yn+dnVS5pu5iRN2Sm//XhpUp1uzNI0KVvz0Ydv064ldTZMMfq2TBabuTA04533DYLLz5McJ91eSvkqteyXyXy8mOfIdrrTo6zWo7xenTsnLp/z34VSdspvBWSAp01QhoWq++089QPNx/qU4yfT/f8+1Gm7mVJ/SMmrsnW4fuvH22930mUmQwlgefQlTdlNrYstaao5TK7W9HPo1/Kf75YNXfj6WpJZUteGxrELbyRa99ud1PpNSjlMl3lK3UzyWZr6HwYBPC91urGXZF4mXnfg6Ws+fRO4hi7jSz9fyndJWReQuaa1zJIkNZ/XaTu+9eN13ZX7BQBwP8pkfpB/Tptavl3Yg9a6n5TR1aewHO/1QZyf7V365aY7SHKUlPbOJhR1OUqS1PoipW6llIPU8nMBmeelzyArIwEZ4LmQKcPC1d9/MU4t49TyZUp9ma7ZfowjJpdF3d/YTS2/S5L+51l3k5XZtceYv6nN3pQpA7Cc+gvSf9pLrTcvabphH7KhZGSW7rxx73G/IVB3krqnMT/3oU7b7eT0+Cr9jQCeAkEZeATeCsxcVMph0h2fjxTtk9+O0nXHSdq+D1CSplnrdx7Lftm6fU0+AHern5iXvZR6tQb6vZNFBN77QEw3GprJHSfN7lOY5MPjoNQaeG4EZeCRqNN2PU3GSTdKV9qUT0y6qjlM6pBN08yTHFjgADweQx+XnZT6flD+vRvnpC9XkpnK49YHBV8flcmfZw99LAD3QVAGAGCJ1WnbJnUvJZc30u8b427KZuGq6rRdW9apU3W6sZOcHly9HxLA4yYoAwDwCJxPJ3rrkzkZGukv5QX2XanTL8ZJGSXNUXJ6pP/I1fWTjZqjRY80X4Q+ANlp8gs8K6YvAQA8AmVrvpNafp5av0stL1PKy6Fk6ZkFZDZ2U5ppStlKqd+kNNO6/+KoTr/YfOhjexya3ZS6/dBH8QFrWXnoQwC4XzJlAAB4NPopUTm4dEJVLd8l2XlugarrqtP2KPnrqEz+++ihj+WiOm3Xk26nTH4aP/BxjB6qD1+dtptp0qY7nZfJnw4e4hiA+yVTBgCAR6NM5sdlaz5K7Sbvf7H+LsmsL4Phg5puL83Pxg99GJc4TrL2UE9ep+1a3W8PUuof696LWvc39vpA0X089xfjuv/iKKX+kFq/SWl+qNONvaHhN/CEyZQBAOBRqvvtbuoHplOVsp/udJasHMiceduQbTTPP6ctv7m/n80QLLsQZHidZDVJ1pO0KRmnZlwm83vPEBmO7SClfv7+F8t+33x4sZkrfcCl205Txql5/3l7J6llL4nR9PBECcoAAPBo1f12nlovn0zVO8nK6Wb52ojli+r+xk66Zr1M5uNP3nbajtJklO6vezcpearTdnOYIPbZB29Uysus/n27/Pv9T12q043tlPKfV7pxKS+TzNOdzpOV2U0CJfX7dpTXGafUrevdsbxMslcm873rPiewvARlAAB49Oq0HSXdKMmoL9BvjtLlKEmymln5+mF6hCyzOm3nabqjdM1emcwPhmyRNn3mypk2pX41fHySWq6VyVKn7TilTvt/5CRN2UuXefL6qL/FapIcPVQWSN3f2Est1wuOvPUA5VXS7SXN7scysuq0XU/TbSdl8yNZMcONc5KSz1Lz4au1Wl8mmWW1med1jh+qBw5we4IyAADwDNXp+lqatcubJr91w5wk5SClbvVBiLRXKQnr+7HUeUo+Syk/psv2MpXg1Gm7d+1slQ8+WA6TMi6T+Xx47PUkbZpulK7ZvLQs6m0nqfUgP2t2y7/P50OAbDPpRinl46/PZUoO05WjNJmnyywPGPgCPk5QBgAAnrk6bdeymjavMy+T+XGd/mqUrI6SzJKzz20cpJSvUst3ZTL/5FjtOt2YpZQvU+p+2XrYiUrvqr//YpyumT70caTWH5N6kLWVg4/196l/+GWb06bN6cp60rVJs5Yma58o3bvwAOUkTTdLmnm6zGTWwPIQlAEAYKn0WQav15PVuSa9y6NOfzVKWflj/48y+Vhvkzpt11Lq//T/+D8/X6bx2/X37Thd/XRApuQwXT1ImnmS9TR1nJqrBUE+/Jiv0pVZ+mCXJtSAoAwAAMuhL9nododyjZPUsu6idbnU79tRTutBks8+Fpip03azH++cwzI5XJoR5XXajlJykNSPNB2uL9M122elSO/cfz1Nt3PFPjQnKXXe99Bp5klu1BgYeNoEZXhQQ/O33ZRyNNQZzz5wuzZNdtLVNslxUnaS18MibTUZ0mrv6bABgHfUaTtOMk7T5UMXtJ+4f5tSZ8kwoaeWb8tkvrPo4+T2+lHOmaVkPTWXBs7e6ifziaya+1J/326nqx+estT3zrlSI+M6/dUozeooXffmkyvNcU5fz5PVKA8CrkpQhgdTp+1OSv3mzSdykpT2sh2EuvfiOPnIGMXkrKHZ+LqLQADg9ur+i6PUfD5kGWxeZ7OkTtvtlLculmXJLLk6bdfS1Hm6OiuTy/vF9Fkp9Y8p5buy9ekeNHdhyL4aJ2Uz5SNTj/pGvZsyWZZXP2Et6/1/3VqSNv2otbMspCtPBYNlsvrQB8Cz1i+0al6dpttZnfxp77Ib9bsx76SYlrxKV4+SJE2TdF1SS5vUvfSjHAGA+9SVzay+Xitf/3l2lZsP2Ra7Sd1Meec8X8tHxwvz8Mpkflz3N/ZSyjdJxh+4zazuvUhuuTYbJhmtJ1n/VMZN/3t1upmsjFLqZr+G/PA+dE05KTW7srKWzzCBapzUUUpeJPXCV89e05okXyb5Xd17cZJSdtPF+wePiqAMD+kgtSZp9lYnf/rIG+frNlnpP+yzaXbKeL777q2Gxd3oTo4UAPio62Sq1t9vbKerO7k8C/YkyXvneZZQlyvm3XefvslHDNkrRx/6ev3+V6N0q5tJHfXTiJq8fQF/2Z3yKikHJdmVHbOcymQ+r9P2IKlJKWupFzOdSi55jT9Lrd+kKeM6bbdlzvBYKF9i6dVpu55S/zIEZEbKkwDg8emzHbpxmjJ+++Lq3RvqJfNYnJei1/pd0h1kZXU9p9160s3K5M+zOv1lm7L6Xynlx7I137yzY0iXPhAz/P/sw8v/PU/fi/DoLo6Hu9OXL3U7QyPwTyv1ZX7WjMu/ea1ZboIyPAp1+sVmsnIkIAMAj1Odtnsp9dMTa2r5F6UHj0NfXlJnKZdlPF3IZFiSRr88DXXabifZea/s8dIb29Rl+QnKAABwL+q03U5Ttz+YKVPLfpnMx/d7VNzG0O9llCbrbz7bJV2znuQ4OZ2XD/QNhJvqG01nL7V+9ekbe19huQnKAABwr+q0bdN0m0nZTM2L4dMnqZdPYQS4TJ22m0nd/ehkraZMym9larG8BGUAAHgwQ6P+NsmRgAxwE0Org82kW08pXw5lS/Osnu6Wr/+k4S8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz/7cEBCQAAAICg/6/bEagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEvh/+iDndezFAAAAABJRU5ErkJggg==","e":1},{"id":"image_7","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2buj5DauKw3A/20qGb+JswLxMVWJ6d6B4BWEeU4lJFZgZgWmVxB6BQ3GCwi1gkA7gJSZqnkbagfi21Qi9pkHQLRkiRIpwgItfV+VqsgGu/uAYgEX5557LgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPD/twcHAgAAAACC/K0XGKECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAVECJ2KTF+vMoAAAAASUVORK5CYII=","e":1},{"id":"image_8","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2bu75CjS7AzA75dgh6+MvIIuX48b5awA9Qpafe2YUdUKrF7BaFbQzAqy1BMTvhz1ClyswCV6HOG7ESuw8JXtQXl8UYWAafEjpFYh8TwRBFRmVuYnJELw8p1zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4P+1B4cEAAAAAIL+v3aDHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvTjDFAAADVklEQVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIArszhGIiqcWxUAAAAASUVORK5CYII=","e":1},{"id":"image_9","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2YMDAQAAAAAg/9dGUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSbs+U0AAAmwSURBVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWkPDkgAAAAABP1/3Y9QAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAlXnQABmyO99QAAAABJRU5ErkJggg==","e":1},{"id":"image_10","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2bub3LjO7AzA73eldHoUcQdmZg10S7pZgSsrMDMMgjZZKwizAtMrCLOCW5QR9LDpFZhaQZfUaSCzUDsQM3IS6Z4MqkSJEkkVKf5Zeh7AsHjr/nwsEhDq1fnOAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/P/twYEAAAAAgCB/6xUGqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI4A9+01LXMbLm4AAAAASUVORK5CYII=","e":1},{"id":"image_11","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2YMDAQAAAAAg/9dGUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSbs+U0AAAmwSURBVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWkPDkgAAAAABP1/3Y9QAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAlXnQABmyO99QAAAABJRU5ErkJggg==","e":1},{"id":"image_12","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2buD7CiyLE3A/zPoqlmiHaCa5TkVIVmuIDxXgHLcp0LuKwjlClCsIBQrMFfkqVPDFCtIZwXloqrGJVbQ0LPOBrs1cAckEAohREjA943kZuZmT8YA+M999wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP9/e3BIAAAAACDo/2tfmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBDlq+xfmS3l8UAAAAASUVORK5CYII=","e":1},{"id":"image_13","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2YMDAQAAAAAg/9dGUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSbs+U0AAAmwSURBVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWkPDkgAAAAABP1/3Y9QAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAlXnQABmyO99QAAAABJRU5ErkJggg==","e":1},{"id":"image_14","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2bub5DayM13A70nRDs/EHRR77Fti1gqEXkGxhg6Hu4AVFL0Cs1ZgegVJVkePzVpBUSswqGpH9OxSK2jyjm60qfx6AFAiRbkkSoT4o+eJYAiZyJ8DIIIU3vjOdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7/9uCQAAAAAEDQ/9eusAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AjYYfDYAmXIWgAAAABJRU5ErkJggg==","e":1},{"id":"image_15","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2YMDAQAAAAAg/9dGUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSbs+U0AAAmwSURBVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWkPDkgAAAAABP1/3Y9QAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAlXnQABmyO99QAAAABJRU5ErkJggg==","e":1},{"id":"image_16","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2bub5DiuKw2g30uye0r0Clgeu0WmV8DyCoQednS4WbUCQytgaQWGV5CAHAoPBa3ApRV0klZH9KzBHYAzt03m7UGVJErin0gChZ9zIhQMZWbluwUiOPjivXsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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dZsuAODDGScv/7XasyTzTVUCAAAglAF2SHecqrP1ENtMb9UxIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1QhXoAAABkNJREFUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4P+3BwckAAAAAIL+v25HoAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHsBSWewQxQK7cEAAAAASUVORK5CYII=","e":1},{"id":"image_17","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2YMDAQAAAAAg/9dGUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVSbs+U0AAAmwSURBVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWkPDkgAAAAABP1/3Y9QAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAlXnQABmyO99QAAAABJRU5ErkJggg==","e":1},{"id":"image_18","w":1125,"h":2436,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABGUAAAmECAYAAACsJdO5AAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAgAElEQVR4nOzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA2buD3LiuKw3A/32UjQwaMHsFrswCJJZeViB6BaGHQeCoagfMCpreAXfwyBhBD7uygpRX4CcnBnpYXkHTs7QjvtMD0rENSx1LIvnI4vcBAlS3qt77wUEVeHjuuQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHh//w/fpuY7+s/s+wAAAABJRU5ErkJggg==","e":1}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"0.ai","cl":"ai","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":0,"op":0.5,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":2,"nm":"1.ai","cl":"ai","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":0.5,"op":1,"st":0.5,"bm":0},{"ddd":0,"ind":3,"ty":2,"nm":"2.ai","cl":"ai","refId":"image_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":1,"op":1.5,"st":1,"bm":0},{"ddd":0,"ind":4,"ty":2,"nm":"3.ai","cl":"ai","refId":"image_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":1.5,"op":2,"st":1.5,"bm":0},{"ddd":0,"ind":5,"ty":2,"nm":"4.ai","cl":"ai","refId":"image_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":2,"op":2.5,"st":2,"bm":0},{"ddd":0,"ind":6,"ty":2,"nm":"5.ai","cl":"ai","refId":"image_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":2.5,"op":3,"st":2.5,"bm":0},{"ddd":0,"ind":7,"ty":2,"nm":"6.ai","cl":"ai","refId":"image_6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":3,"op":3.5,"st":3,"bm":0},{"ddd":0,"ind":8,"ty":2,"nm":"7.ai","cl":"ai","refId":"image_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":3.5,"op":4,"st":3.5,"bm":0},{"ddd":0,"ind":9,"ty":2,"nm":"8.ai","cl":"ai","refId":"image_8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":4,"op":4.5,"st":4,"bm":0},{"ddd":0,"ind":10,"ty":2,"nm":"9.ai","cl":"ai","refId":"image_9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":4.5,"op":5,"st":4.5,"bm":0},{"ddd":0,"ind":11,"ty":2,"nm":"10.ai","cl":"ai","refId":"image_10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":6,"op":6.5,"st":6,"bm":0},{"ddd":0,"ind":12,"ty":2,"nm":"11.ai","cl":"ai","refId":"image_11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":7.5,"op":8,"st":7.5,"bm":0},{"ddd":0,"ind":13,"ty":2,"nm":"12.ai","cl":"ai","refId":"image_12","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":9,"op":9.5,"st":9,"bm":0},{"ddd":0,"ind":14,"ty":2,"nm":"13.ai","cl":"ai","refId":"image_13","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":10.5,"op":11,"st":10.5,"bm":0},{"ddd":0,"ind":15,"ty":2,"nm":"14.ai","cl":"ai","refId":"image_14","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":12,"op":12.5,"st":12,"bm":0},{"ddd":0,"ind":16,"ty":2,"nm":"15.ai","cl":"ai","refId":"image_15","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":13.5,"op":14,"st":13.5,"bm":0},{"ddd":0,"ind":17,"ty":2,"nm":"16.ai","cl":"ai","refId":"image_16","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":15,"op":15.5,"st":15,"bm":0},{"ddd":0,"ind":18,"ty":2,"nm":"17.ai","cl":"ai","refId":"image_17","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":16.5,"op":17,"st":16.5,"bm":0},{"ddd":0,"ind":19,"ty":2,"nm":"18.ai","cl":"ai","refId":"image_18","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[562.5,-372,0],"ix":2},"a":{"a":0,"k":[562.5,1218,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":255,"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":31,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"ip":18,"op":18.5,"st":18,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Star Dash In","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[370.25,142.75,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[6.1,6.1,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[255]},{"t":27,"s":[0]}],"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":23,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,21.291],[-21.288,0],[0,0],[0,-21.286],[21.288,0],[0,0]],"o":[[0,-21.286],[0,0],[21.288,0],[0,21.291],[0,0],[-21.288,0]],"v":[[-399.582,214.731],[-361.038,176.187],[-173.825,176.187],[-135.281,214.731],[-173.825,253.274],[-361.038,253.274]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[1,1,1,1]},{"t":19,"s":[1,0.627451002598,0.184313729405,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 4","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-21.288],[-21.288,0],[0,0],[0,21.288],[21.288,0]],"o":[[-21.288,0],[0,21.288],[0,0],[21.288,0],[0,-21.288],[0,0]],"v":[[-405.088,-44.063],[-443.632,-5.519],[-405.088,33.025],[-305.975,33.025],[-267.432,-5.519],[-305.975,-44.063]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[1,1,1,1]},{"t":19,"s":[1,0.627451002598,0.184313729405,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 3","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,21.288],[-21.288,0],[0,0],[0,-21.288],[21.288,0],[0,0]],"o":[[0,-21.288],[0,0],[21.288,0],[0,21.288],[0,0],[-21.288,0]],"v":[[-355.532,-225.769],[-316.988,-264.313],[-151.8,-264.313],[-113.256,-225.769],[-151.8,-187.225],[-316.988,-187.225]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[1,1,1,1]},{"t":19,"s":[1,0.627451002598,0.184313729405,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":55,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Zap In","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[370.25,142.75,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[6.1,6.1,100],"ix":6}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[1,0.74027967453,0.431372523308,1],"ix":1}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[255]},{"t":27,"s":[0]}],"ix":2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":135,"ix":3}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":27,"ix":5}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0,"ix":6}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[10.401,-14.029],[0,0],[-8.245,44.5],[0,0],[0,0],[-10.998,13.954],[0,0],[8.972,-44.074],[0,0]],"o":[[17.889,0],[0,0],[-27.254,36.782],[0,0],[0,0],[-18.182,0],[0,0],[28.182,-35.766],[0,0],[0,0]],"v":[[415.337,-136.678],[433.231,-103.159],[43.647,422.569],[-35.441,390.471],[18.236,100.739],[-201.349,100.739],[-218.863,66.723],[167.472,-423.584],[245.656,-389.786],[194.166,-136.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[1,1,1,1]},{"t":19,"s":[1,0.627451002598,0.184313729405,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":51,"st":-4,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"Zap Out","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[370.25,142.75,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[6.1,6.1,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"s","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[101.138,-61.986],[143.265,-269.065],[-90.054,27.047],[110.668,27.047],[66.549,265.193],[309.001,-61.986]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[10.401,-14.029],[0,0],[-8.245,44.5],[0,0],[0,0],[-10.998,13.954],[0,0],[8.972,-44.074],[0,0]],"o":[[17.889,0],[0,0],[-27.254,36.782],[0,0],[0,0],[-18.182,0],[0,0],[28.182,-35.766],[0,0],[0,0]],"v":[[415.337,-136.678],[433.231,-103.159],[43.647,422.569],[-35.441,390.471],[18.236,100.739],[-201.349,100.739],[-218.863,66.723],[167.472,-423.584],[245.656,-389.786],[194.166,-136.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.4,0.4,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":4,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"Star Dash Out","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[370.25,142.75,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[6.1,6.1,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,21.291],[-21.288,0],[0,0],[0,-21.286],[21.288,0],[0,0]],"o":[[0,-21.286],[0,0],[21.288,0],[0,21.291],[0,0],[-21.288,0]],"v":[[-399.582,214.731],[-361.038,176.187],[-173.825,176.187],[-135.281,214.731],[-173.825,253.274],[-361.038,253.274]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.4,0.4,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 4","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-21.288],[-21.288,0],[0,0],[0,21.288],[21.288,0]],"o":[[-21.288,0],[0,21.288],[0,0],[21.288,0],[0,-21.288],[0,0]],"v":[[-405.088,-44.063],[-443.632,-5.519],[-405.088,33.025],[-305.975,33.025],[-267.432,-5.519],[-305.975,-44.063]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.4,0.4,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 3","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,21.288],[-21.288,0],[0,0],[0,-21.288],[21.288,0],[0,0]],"o":[[0,-21.288],[0,0],[21.288,0],[0,21.288],[0,0],[-21.288,0]],"v":[[-355.532,-225.769],[-316.988,-264.313],[-151.8,-264.313],[-113.256,-225.769],[-151.8,-187.225],[-316.988,-187.225]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.4,0.4,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":4,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/assets/lottie/zap_sm.json b/src/assets/lottie/zap_sm.json new file mode 100644 index 0000000..da745d4 --- /dev/null +++ b/src/assets/lottie/zap_sm.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.4.3","a":"","k":"","d":"","tc":""},"fr":30,"ip":0,"op":44,"w":1600,"h":1600,"nm":"Icon - Zap","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":3,"ty":4,"nm":"Spark 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":12,"s":[0]},{"t":22,"s":[-12]}],"ix":10},"p":{"a":0,"k":[814,1190,0],"ix":2},"a":{"a":0,"k":[14,390,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.355,6.986],[251,27.5]],"o":[[0,0],[-37.108,-191.324],[-40.756,-4.465]],"v":[[-5,380.5],[-8.892,354.324],[-421,14.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[5]},{"t":20,"s":[1]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":12,"s":[-355]},{"t":21,"s":[-47]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1,1,1,1]},{"t":18,"s":[1,0.627451002598,0.184313729405,1]}],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"t":13,"s":[100]}],"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[43]},{"t":22,"s":[0]}],"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-30,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 6","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[6.11,3.647],[221,-82.5]],"o":[[0,0],[-173.108,-103.324],[-38.411,14.339]],"v":[[-12,395.5],[-18.892,388.324],[-519,368.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[5]},{"t":20,"s":[1]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":12,"s":[-355]},{"t":21,"s":[-47]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1,1,1,1]},{"t":18,"s":[1,0.627451002598,0.184313729405,1]}],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"t":13,"s":[100]}],"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[43]},{"t":22,"s":[0]}],"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-30,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 5","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[7.072,-0.791],[83,-132.5]],"o":[[0,0],[-149.108,16.676],[-21.765,34.746]],"v":[[-12,434.5],[-29.892,436.324],[-321,662.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[5]},{"t":20,"s":[1]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":12,"s":[-355]},{"t":21,"s":[-47]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1,1,1,1]},{"t":18,"s":[1,0.627451002598,0.184313729405,1]}],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"t":13,"s":[100]}],"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[43]},{"t":22,"s":[0]}],"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-30,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 4","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.569,-2.735],[-21,-138.5]],"o":[[0,0],[68.892,28.676],[6.146,40.537]],"v":[[66,444.5],[80.108,450.324],[261,718.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[5]},{"t":20,"s":[1]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":12,"s":[-355]},{"t":21,"s":[-47]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1,1,1,1]},{"t":18,"s":[1,0.627451002598,0.184313729405,1]}],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"t":13,"s":[100]}],"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[43]},{"t":22,"s":[0]}],"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 3","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.478,-20.587],[12.253,-27.582]],"o":[[0,0],[1.054,45.342],[-16.645,37.47]],"v":[[10.212,468.795],[9.733,490.862],[-46.462,797.667]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[5]},{"t":20,"s":[1]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":12,"s":[-355]},{"t":21,"s":[-47]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1,1,1,1]},{"t":18,"s":[1,0.627451002598,0.184313729405,1]}],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"t":13,"s":[100]}],"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[43]},{"t":22,"s":[0]}],"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 7","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-12.773,16.152],[-209,-22.5]],"o":[[0,0],[99.892,-126.324],[40.764,4.388]],"v":[[160,273.5],[164.109,264.324],[645,164.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[5]},{"t":20,"s":[1]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":12,"s":[-355]},{"t":21,"s":[-47]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1,1,1,1]},{"t":18,"s":[1,0.627451002598,0.184313729405,1]}],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"t":13,"s":[100]}],"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[43]},{"t":22,"s":[0]}],"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-19.903,5.284],[-183,-132.5]],"o":[[0,0],[151.892,-40.324],[33.209,24.045]],"v":[[21,430.5],[72.108,360.324],[631,480.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[5]},{"t":20,"s":[1]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":12,"s":[-355]},{"t":21,"s":[-47]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1,1,1,1]},{"t":18,"s":[1,0.627451002598,0.184313729405,1]}],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"t":13,"s":[100]}],"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[43]},{"t":22,"s":[0]}],"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":59,"st":-2,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Spark","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":12,"s":[0]},{"t":22,"s":[-12]}],"ix":10},"p":{"a":0,"k":[814,1190,0],"ix":2},"a":{"a":0,"k":[14,390,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.355,6.986],[251,27.5]],"o":[[0,0],[-37.108,-191.324],[-40.756,-4.465]],"v":[[-5,380.5],[-8.892,354.324],[-421,14.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[5]},{"t":20,"s":[1]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":12,"s":[-336]},{"t":21,"s":[-47]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"t":13,"s":[100]}],"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[43]},{"t":22,"s":[0]}],"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-30,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 6","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[6.11,3.647],[221,-82.5]],"o":[[0,0],[-173.108,-103.324],[-38.411,14.339]],"v":[[-12,395.5],[-18.892,388.324],[-519,368.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[5]},{"t":20,"s":[1]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":12,"s":[-336]},{"t":21,"s":[-47]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"t":13,"s":[100]}],"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[43]},{"t":22,"s":[0]}],"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-30,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 5","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[7.072,-0.791],[83,-132.5]],"o":[[0,0],[-149.108,16.676],[-21.765,34.746]],"v":[[-12,434.5],[-29.892,436.324],[-321,662.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[5]},{"t":20,"s":[1]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":12,"s":[-336]},{"t":21,"s":[-47]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"t":13,"s":[100]}],"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[43]},{"t":22,"s":[0]}],"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-30,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 4","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.569,-2.735],[-21,-138.5]],"o":[[0,0],[68.892,28.676],[6.146,40.537]],"v":[[66,444.5],[80.108,450.324],[261,718.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[5]},{"t":20,"s":[1]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":12,"s":[-336]},{"t":21,"s":[-47]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"t":13,"s":[100]}],"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[43]},{"t":22,"s":[0]}],"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 3","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.478,-20.587],[12.253,-27.582]],"o":[[0,0],[1.054,45.342],[-16.645,37.47]],"v":[[10.212,468.795],[9.733,490.862],[-46.462,797.667]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[5]},{"t":20,"s":[1]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":12,"s":[-336]},{"t":21,"s":[-47]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"t":13,"s":[100]}],"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[43]},{"t":22,"s":[0]}],"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 7","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-12.773,16.152],[-209,-22.5]],"o":[[0,0],[99.892,-126.324],[40.764,4.388]],"v":[[160,273.5],[164.109,264.324],[645,164.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[5]},{"t":20,"s":[1]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":12,"s":[-336]},{"t":21,"s":[-47]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"t":13,"s":[100]}],"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[43]},{"t":22,"s":[0]}],"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-19.903,5.284],[-183,-132.5]],"o":[[0,0],[151.892,-40.324],[33.209,24.045]],"v":[[21,430.5],[72.108,360.324],[631,480.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[5]},{"t":20,"s":[1]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":12,"s":[-336]},{"t":21,"s":[-47]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"t":13,"s":[100]}],"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[43]},{"t":22,"s":[0]}],"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":59,"st":-2,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Star Dash In","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[800,800,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[0,2.35],[-2.35,0],[0,0],[0,-2.349],[2.35,0],[0,0]],"o":[[0,-2.349],[0,0],[2.35,0],[0,2.35],[0,0],[-2.35,0]],"v":[[-363.863,214.731],[-359.609,210.476],[-359.254,210.476],[-355,214.731],[-359.254,218.985],[-359.609,218.985]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":28,"s":[{"i":[[0,21.291],[-21.288,0],[0,0],[0,-21.286],[21.288,0],[0,0]],"o":[[0,-21.286],[0,0],[21.288,0],[0,21.291],[0,0],[-21.288,0]],"v":[[-399.582,214.731],[-361.038,176.187],[-357.825,176.187],[-319.281,214.731],[-357.825,253.274],[-361.038,253.274]],"c":true}]},{"t":33,"s":[{"i":[[0,21.291],[-21.288,0],[0,0],[0,-21.286],[21.288,0],[0,0]],"o":[[0,-21.286],[0,0],[21.288,0],[0,21.291],[0,0],[-21.288,0]],"v":[[-399.582,214.731],[-361.038,176.187],[-173.825,176.187],[-135.281,214.731],[-173.825,253.274],[-361.038,253.274]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.62744140625,0.184295654297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":24,"s":[-60,0],"to":[10,0],"ti":[-10,0]},{"t":33,"s":[0,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[0]},{"t":25,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 4","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":24,"s":[{"i":[[0,0],[0,-2.475],[-2.475,0],[0,0],[0,2.475],[2.475,0]],"o":[[-2.475,0],[0,2.475],[0,0],[2.475,0],[0,-2.475],[0,0]],"v":[[-405.48,-10],[-409.961,-5.519],[-405.48,-1.038],[-405.583,-1.038],[-401.102,-5.519],[-405.583,-10]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":27,"s":[{"i":[[0,0],[0,-21.288],[-21.288,0],[0,0],[0,21.288],[21.288,0]],"o":[[-21.288,0],[0,21.288],[0,0],[21.288,0],[0,-21.288],[0,0]],"v":[[-405.088,-44.063],[-443.632,-5.519],[-405.088,33.025],[-405.975,33.025],[-367.432,-5.519],[-405.975,-44.063]],"c":true}]},{"t":32,"s":[{"i":[[0,0],[0,-21.288],[-21.288,0],[0,0],[0,21.288],[21.288,0]],"o":[[-21.288,0],[0,21.288],[0,0],[21.288,0],[0,-21.288],[0,0]],"v":[[-405.088,-44.063],[-443.632,-5.519],[-405.088,33.025],[-305.975,33.025],[-267.432,-5.519],[-305.975,-44.063]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.62744140625,0.184295654297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":23,"s":[-60,0],"to":[10,0],"ti":[-10,0]},{"t":32,"s":[0,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":23,"s":[0]},{"t":24,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 3","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":23,"s":[{"i":[[0,2.889],[-2.889,0],[0,0],[0,-2.889],[2.889,0],[0,0]],"o":[[0,-2.889],[0,0],[2.889,0],[0,2.889],[0,0],[-2.889,0]],"v":[[-321.705,-225.769],[-316.475,-231],[-316.313,-231],[-311.083,-225.769],[-316.313,-220.539],[-316.475,-220.539]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":26,"s":[{"i":[[0,21.288],[-21.288,0],[0,0],[0,-21.288],[21.288,0],[0,0]],"o":[[0,-21.288],[0,0],[21.288,0],[0,21.288],[0,0],[-21.288,0]],"v":[[-355.532,-225.769],[-316.988,-264.313],[-315.8,-264.313],[-277.256,-225.769],[-315.8,-187.225],[-316.988,-187.225]],"c":true}]},{"t":31,"s":[{"i":[[0,21.288],[-21.288,0],[0,0],[0,-21.288],[21.288,0],[0,0]],"o":[[0,-21.288],[0,0],[21.288,0],[0,21.288],[0,0],[-21.288,0]],"v":[[-355.532,-225.769],[-316.988,-264.313],[-151.8,-264.313],[-113.256,-225.769],[-151.8,-187.225],[-316.988,-187.225]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.62744140625,0.184295654297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":22,"s":[-60,0],"to":[10,0],"ti":[-10,0]},{"t":31,"s":[0,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":22,"s":[0]},{"t":23,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":22,"op":71,"st":16,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Star Dash In 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[800,800,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":24,"s":[{"i":[[0,2.35],[-2.35,0],[0,0],[0,-2.349],[2.35,0],[0,0]],"o":[[0,-2.349],[0,0],[2.35,0],[0,2.35],[0,0],[-2.35,0]],"v":[[-363.863,214.731],[-359.609,210.476],[-359.254,210.476],[-355,214.731],[-359.254,218.985],[-359.609,218.985]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":27,"s":[{"i":[[0,21.291],[-21.288,0],[0,0],[0,-21.286],[21.288,0],[0,0]],"o":[[0,-21.286],[0,0],[21.288,0],[0,21.291],[0,0],[-21.288,0]],"v":[[-399.582,214.731],[-361.038,176.187],[-357.825,176.187],[-319.281,214.731],[-357.825,253.274],[-361.038,253.274]],"c":true}]},{"t":32,"s":[{"i":[[0,21.291],[-21.288,0],[0,0],[0,-21.286],[21.288,0],[0,0]],"o":[[0,-21.286],[0,0],[21.288,0],[0,21.291],[0,0],[-21.288,0]],"v":[[-399.582,214.731],[-361.038,176.187],[-173.825,176.187],[-135.281,214.731],[-173.825,253.274],[-361.038,253.274]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":23,"s":[-60,0],"to":[10,0],"ti":[-10,0]},{"t":32,"s":[0,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":23,"s":[0]},{"t":24,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 4","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":23,"s":[{"i":[[0,0],[0,-2.475],[-2.475,0],[0,0],[0,2.475],[2.475,0]],"o":[[-2.475,0],[0,2.475],[0,0],[2.475,0],[0,-2.475],[0,0]],"v":[[-405.48,-10],[-409.961,-5.519],[-405.48,-1.038],[-405.583,-1.038],[-401.102,-5.519],[-405.583,-10]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":26,"s":[{"i":[[0,0],[0,-21.288],[-21.288,0],[0,0],[0,21.288],[21.288,0]],"o":[[-21.288,0],[0,21.288],[0,0],[21.288,0],[0,-21.288],[0,0]],"v":[[-405.088,-44.063],[-443.632,-5.519],[-405.088,33.025],[-405.975,33.025],[-367.432,-5.519],[-405.975,-44.063]],"c":true}]},{"t":31,"s":[{"i":[[0,0],[0,-21.288],[-21.288,0],[0,0],[0,21.288],[21.288,0]],"o":[[-21.288,0],[0,21.288],[0,0],[21.288,0],[0,-21.288],[0,0]],"v":[[-405.088,-44.063],[-443.632,-5.519],[-405.088,33.025],[-305.975,33.025],[-267.432,-5.519],[-305.975,-44.063]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":22,"s":[-60,0],"to":[10,0],"ti":[-10,0]},{"t":31,"s":[0,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":22,"s":[0]},{"t":23,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 3","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[0,2.889],[-2.889,0],[0,0],[0,-2.889],[2.889,0],[0,0]],"o":[[0,-2.889],[0,0],[2.889,0],[0,2.889],[0,0],[-2.889,0]],"v":[[-321.705,-225.769],[-316.475,-231],[-316.313,-231],[-311.083,-225.769],[-316.313,-220.539],[-316.475,-220.539]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":25,"s":[{"i":[[0,21.288],[-21.288,0],[0,0],[0,-21.288],[21.288,0],[0,0]],"o":[[0,-21.288],[0,0],[21.288,0],[0,21.288],[0,0],[-21.288,0]],"v":[[-355.532,-225.769],[-316.988,-264.313],[-315.8,-264.313],[-277.256,-225.769],[-315.8,-187.225],[-316.988,-187.225]],"c":true}]},{"t":30,"s":[{"i":[[0,21.288],[-21.288,0],[0,0],[0,-21.288],[21.288,0],[0,0]],"o":[[0,-21.288],[0,0],[21.288,0],[0,21.288],[0,0],[-21.288,0]],"v":[[-355.532,-225.769],[-316.988,-264.313],[-151.8,-264.313],[-113.256,-225.769],[-151.8,-187.225],[-316.988,-187.225]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.8,"y":0},"t":21,"s":[-60,0],"to":[10,0],"ti":[-10,0]},{"t":30,"s":[0,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":21,"s":[0]},{"t":22,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":21,"op":34,"st":15,"bm":0},{"ddd":0,"ind":7,"ty":1,"nm":"Zap In Mask","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[800,-250,0],"ix":2},"a":{"a":0,"k":[1000,1000,0],"ix":1},"s":{"a":0,"k":[154.819,50,100],"ix":6}},"ao":0,"sw":2000,"sh":2000,"sc":"#b25151","ip":6,"op":61,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Zap In","tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.712],"y":[1]},"o":{"x":[0.422],"y":[0]},"t":11,"s":[45]},{"t":14,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.998,"y":1},"o":{"x":0.326,"y":0},"t":11,"s":[1400,-66,0],"to":[-320,140.333,0],"ti":[90,-388.333,0]},{"t":14,"s":[800,800,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.001,"y":0},"t":14,"s":[{"i":[[0,0],[11.854,-24.747],[0,0],[-8.245,44.5],[0,0],[0,0],[-6.137,21.277],[-109.472,85.584],[8.971,-44.074],[0,0]],"o":[[17.889,0],[-153.304,171.934],[-27.254,36.782],[0,0],[0,0],[-18.182,0],[44.863,-150.723],[28.39,-29.304],[0,0],[0,0]],"v":[[381.019,-179.626],[398.913,-146.107],[31.329,415.621],[-47.759,383.523],[42.236,108.739],[-79.349,158.739],[-96.863,124.723],[217.472,-397.584],[293.656,-369.786],[218.166,-128.678]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":16,"s":[{"i":[[-74.337,29.678],[2.769,-23.841],[42.415,-34.984],[4.441,20.529],[18.764,41.261],[30.349,19.261],[-16.137,25.277],[-18.528,32.416],[-7.656,-56.214],[0,0]],"o":[[24.663,-8.322],[-33.231,203.16],[-28.647,6.432],[0,0],[-20.236,-0.739],[-20.651,-11.738],[78.863,-66.723],[18.528,-32.416],[10.344,75.786],[0,0]],"v":[[333.337,-17.678],[373.231,16.841],[43.647,438.568],[-36.441,425.471],[-21.764,194.739],[-203.349,156.738],[-218.863,98.723],[83.472,-237.584],[161.656,-203.786],[110.166,23.322]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[{"i":[[-74.337,29.678],[2.769,-23.841],[46.227,-29.766],[-2.559,47.529],[18.764,41.261],[30.349,19.261],[-16.137,25.277],[-18.528,32.416],[-7.656,-56.214],[0,0]],"o":[[24.663,-8.322],[-33.231,203.16],[-44.647,0.432],[0,0],[-20.236,-0.739],[-20.651,-11.739],[78.863,-66.723],[18.528,-32.416],[10.344,75.786],[0,0]],"v":[[303.337,57.322],[343.231,91.841],[40.647,438.568],[-37.441,402.471],[-39.764,242.739],[-221.349,204.738],[-236.863,146.723],[43.472,-126.584],[121.656,-92.786],[80.166,98.322]],"c":true}]},{"t":19,"s":[{"i":[[0,0],[10.401,-14.029],[0,0],[-8.245,44.5],[0,0],[0,0],[-10.998,13.954],[0,0],[8.972,-44.074],[0,0]],"o":[[17.889,0],[0,0],[-27.254,36.782],[0,0],[0,0],[-18.182,0],[0,0],[28.182,-35.766],[0,0],[0,0]],"v":[[415.337,-136.678],[433.231,-103.159],[43.647,422.569],[-35.441,390.471],[18.236,100.739],[-201.349,100.739],[-218.863,66.723],[167.472,-423.584],[245.656,-389.786],[194.166,-136.678]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19,"s":[1,0.627451002598,0.184313729405,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[1,1,1,1]},{"t":21,"s":[1,0.627451002598,0.184313729405,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":6,"op":61,"st":6,"bm":0},{"ddd":0,"ind":9,"ty":1,"nm":"Zap Out Mask","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[800,1774,0],"ix":2},"a":{"a":0,"k":[1000,1000,0],"ix":1},"s":{"a":0,"k":[100,51.6,100],"ix":6}},"ao":0,"sw":2000,"sh":2000,"sc":"#b25151","ip":0,"op":61,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Zap Out","tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":6,"s":[0]},{"t":12,"s":[-12.1]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[800,800,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.999,"y":1},"o":{"x":0.6,"y":0},"t":6,"s":[850,702,0],"to":[0,0,0],"ti":[61.667,-551,0]},{"t":12,"s":[328,1762,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"s","pt":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[101.138,-61.986],[143.265,-269.065],[-90.054,27.047],[110.668,27.047],[66.549,265.193],[309.001,-61.986]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.6,"y":0},"t":6,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[134.138,-96.986],[152.265,-236.065],[-46.054,-38.953],[184.668,-64.953],[137.549,156.193],[329.001,-122.986]],"c":true}]},{"t":9,"s":[{"i":[[0,0],[-1.641,24.148],[0,0],[0,0],[0,0],[-104.081,129.05]],"o":[[0,0],[-78.547,99.038],[0,0],[0,0],[0,0],[-27.838,4.667]],"v":[[101.138,-61.986],[143.265,-269.065],[-36.054,49.047],[110.668,27.047],[66.549,265.193],[287.001,-97.986]],"c":true}]}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[0,0],[10.401,-14.029],[0,0],[-8.245,44.5],[0,0],[0,0],[-10.998,13.954],[0,0],[8.972,-44.074],[0,0]],"o":[[17.889,0],[0,0],[-27.254,36.782],[0,0],[0,0],[-18.182,0],[0,0],[28.182,-35.766],[0,0],[0,0]],"v":[[415.337,-136.678],[433.231,-103.159],[43.647,422.569],[-35.441,390.471],[18.236,100.739],[-201.349,100.739],[-218.863,66.723],[167.472,-423.584],[245.656,-389.786],[194.166,-136.678]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.6,"y":0},"t":6,"s":[{"i":[[0,0],[10.401,-14.029],[0,0],[-8.245,44.5],[0,0],[0,0],[-10.998,13.954],[0,0],[8.972,-44.074],[0,0]],"o":[[17.889,0],[0,0],[-27.254,36.782],[0,0],[0,0],[-18.182,0],[0,0],[28.182,-35.766],[0,0],[0,0]],"v":[[435.337,-197.678],[453.231,-164.159],[114.647,313.569],[35.559,281.471],[92.236,8.739],[-157.349,34.739],[-174.863,0.722],[176.472,-390.584],[254.656,-356.786],[227.166,-171.678]],"c":true}]},{"t":9,"s":[{"i":[[0,0],[11.854,-24.747],[0,0],[-8.245,44.5],[0,0],[0,0],[-10.998,13.954],[-86.31,83.162],[8.972,-44.074],[0,0]],"o":[[17.889,0],[-153.304,171.933],[-27.254,36.782],[0,0],[0,0],[-18.182,0],[0,0],[28.39,-29.304],[0,0],[0,0]],"v":[[393.337,-172.678],[411.231,-139.159],[43.647,422.569],[-35.441,390.471],[18.236,100.739],[-147.349,122.739],[-164.863,88.723],[167.472,-423.584],[245.656,-389.786],[194.166,-136.678]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[0.4,0.4,0.4,1]},{"t":11,"s":[1,1,1,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":61,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Star Dash Out","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[800,800,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":2,"s":[{"i":[[0,21.291],[-21.288,0],[0,0],[0,-21.286],[21.288,0],[0,0]],"o":[[0,-21.286],[0,0],[21.288,0],[0,21.291],[0,0],[-21.288,0]],"v":[[-399.582,214.731],[-361.038,176.187],[-173.825,176.187],[-135.281,214.731],[-173.825,253.274],[-361.038,253.274]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[{"i":[[0,21.291],[-21.288,0],[0,0],[0,-21.286],[21.288,0],[0,0]],"o":[[0,-21.286],[0,0],[21.288,0],[0,21.291],[0,0],[-21.288,0]],"v":[[-219.582,214.01],[-181.038,175.466],[-173.825,176.187],[-135.281,214.731],[-173.825,253.274],[-181.038,252.554]],"c":true}]},{"t":9,"s":[{"i":[[0,3.754],[-3.753,0],[0,0],[0,-3.753],[3.753,0],[0,0]],"o":[[0,-3.753],[0,0],[3.753,0],[0,3.754],[0,0],[-3.753,0]],"v":[[-184.863,214.307],[-178.067,207.511],[-176.796,207.638],[-170,214.434],[-176.796,221.23],[-178.067,221.103]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.4,0.4,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[100]},{"t":10,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 4","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":1,"s":[{"i":[[0,0],[0,-21.288],[-21.288,0],[0,0],[0,21.288],[21.288,0]],"o":[[-21.288,0],[0,21.288],[0,0],[21.288,0],[0,-21.288],[0,0]],"v":[[-405.088,-44.063],[-443.632,-5.519],[-405.088,33.025],[-305.975,33.025],[-267.432,-5.519],[-305.975,-44.063]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[{"i":[[0,0],[0,-21.288],[-21.288,0],[0,0],[0,21.288],[21.288,0]],"o":[[-21.288,0],[0,21.288],[0,0],[21.288,0],[0,-21.288],[0,0]],"v":[[-313.088,-43.582],[-351.632,-5.038],[-313.088,33.506],[-305.975,33.025],[-267.432,-5.519],[-305.975,-44.063]],"c":true}]},{"t":8,"s":[{"i":[[0,0],[0,-3.689],[-3.689,0],[0,0],[0,3.689],[3.689,0]],"o":[[-3.689,0],[0,3.689],[0,0],[3.689,0],[0,-3.689],[0,0]],"v":[[-310.148,-11.917],[-316.828,-5.237],[-310.148,1.443],[-308.915,1.359],[-302.236,-5.32],[-308.915,-12]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.4,0.4,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[100]},{"t":9,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 3","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":0,"s":[{"i":[[0,21.288],[-21.288,0],[0,0],[0,-21.288],[21.288,0],[0,0]],"o":[[0,-21.288],[0,0],[21.288,0],[0,21.288],[0,0],[-21.288,0]],"v":[[-355.532,-225.769],[-316.988,-264.313],[-151.8,-264.313],[-113.256,-225.769],[-151.8,-187.225],[-316.988,-187.225]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[{"i":[[0,21.288],[-21.288,0],[0,0],[0,-21.288],[21.288,0],[0,0]],"o":[[0,-21.288],[0,0],[21.288,0],[0,21.288],[0,0],[-21.288,0]],"v":[[-199.532,-226.495],[-160.988,-265.039],[-151.8,-264.313],[-113.256,-225.769],[-151.8,-187.225],[-160.988,-187.951]],"c":true}]},{"t":7,"s":[{"i":[[0,3.155],[-3.155,0],[0,0],[0,-3.155],[3.155,0],[0,0]],"o":[[0,-3.155],[0,0],[3.155,0],[0,3.155],[0,0],[-3.155,0]],"v":[[-162.788,-226.186],[-157.075,-231.899],[-155.713,-231.791],[-150,-226.078],[-155.713,-220.365],[-157.075,-220.473]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.4,0.4,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[100]},{"t":8,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/components/Avatar/Avatar.module.scss b/src/components/Avatar/Avatar.module.scss new file mode 100644 index 0000000..d41e87e --- /dev/null +++ b/src/components/Avatar/Avatar.module.scss @@ -0,0 +1,282 @@ +@mixin avatar { + position: relative; + background-color: var(--background-site); + border-radius: 50%; + + img { + border-radius: 50%; + width: 100%; + height: 100%; + object-fit: cover; + vertical-align: top; + } +} + +.verifiedIcon { + position: absolute; + top: 0px; + right: 0px; + width: 15px; + height: 15px; + display: inline-block; + margin: 0px 0px; + background-color: var(--accent-2); + -webkit-mask: url(../../assets/icons/verified.svg) no-repeat 0px / 15px; + mask: url(../../assets/icons/verified.svg) no-repeat 0px / 15px; +} + +@mixin iconBackground { + position: absolute; + right: 0px; + bottom: 0px; + width: 15px; + height: 15px; + background-color: var(--background-site); + border-radius: 50%; +} + +.xxsAvatar { + @include avatar; + width: 28px; + height: 28px; + + .missingBack { + width: 28px; + height: 28px; + } + + .iconBackground { + @include iconBackground; + bottom: -6px; + right: -6px; + } +} + +.xssAvatar { + @include avatar; + width: 26px; + height: 26px; + + .missingBack { + width: 26px; + height: 26px; + } + + .iconBackground { + @include iconBackground; + bottom: -6px; + right: -6px; + } +} + +.xsAvatar { + @include avatar; + width: 32px; + height: 32px; + + .missingBack { + width: 32px; + height: 32px; + } + + .iconBackground { + @include iconBackground; + bottom: -6px; + right: -6px; + } +} + +.vsAvatar { + @include avatar; + width: 42px; + height: 42px; + + .missingBack { + width: 42px; + height: 42px; + } + + .iconBackground { + @include iconBackground; + bottom: 0px; + right: 0px; + } +} + +.smallAvatar { + @include avatar; + width: 48px; + height: 48px; + + .missingBack { + width: 44px; + height: 44px; + } + + .iconBackground { + @include iconBackground; + bottom: 0px; + right: 0px; + } +} + +.midAvatar { + @include avatar; + width: 52px; + height: 52px; + + .missingBack { + width: 52px; + height: 52px; + } + + .iconBackground { + @include iconBackground; + bottom: 0px; + right: 0px; + } +} + +.largeAvatar { + @include avatar; + width: 72px; + height: 72px; + + .missingBack { + width: 72px; + height: 72px; + } + + .iconBackground { + @include iconBackground; + bottom: 3px; + right: 3px; + } +} + +.extraLargeAvatar { + @include avatar; + width: 80px; + height: 80px; + + .missingBack { + width: 80px; + height: 80px; + } + + .iconBackground { + @include iconBackground; + bottom: 4px; + right: 4px; + } +} + +.xxlAvatar { + @include avatar; + width: 142px; + height: 142px; + + .missingBack { + width: 142px; + height: 142px; + } + + .iconBackground { + @include iconBackground; + bottom: 4px; + right: 4px; + } +} + +.missingBack { + background-color: var(--background-site); + border-radius: 50%; +} + +@mixin missing { + display: grid; + place-items: center; + color: var(--missing-avatar-text); + background-color: var(--subtile-devider); + border-radius: 50%; + mask-image: url(../../assets/icons/default_nostrich.svg); + mask-repeat: no-repeat; + -webkit-mask-image: url(../../assets/icons/default_nostrich.svg); + -webkit-mask-repeat: no-repeat; + -webkit-mask-size: contain; + mask-size: contain; +} + +.xxsMissing { + @include missing; + width: 28px; + height: 28px; + font-size: 10px; +} + +.xssMissing { + @include missing; + width: 26px; + height: 26px; + font-size: 10px; +} + +.xsMissing { + @include missing; + width: 32px; + height: 32px; + font-size: 10px; +} + +.vsMissing { + @include missing; + width: 42px; + height: 42px; + font-size: 10px; +} + +.smallMissing { + @include missing; + width: 44px; + height: 44px; + font-size: 12px; +} + +.midMissing { + @include missing; + width: 48px; + height: 48px; + font-size: 16px; +} + +.largeMissing { + @include missing; + width: 68px; + height: 68px; + font-size: 18px; +} + +.extraLargeMissing { + @include missing; + width: 76px; + height: 76px; + font-size: 20px; +} + +.xxlMissing { + @include missing; + width: 142px; + height: 142px; + font-size: 20px; +} + +.highlightBorder { + background: var(--brand-gradient); + padding: 2px; +} + +.cacheFlag { + img { + filter: sepia(100%) saturate(300%) brightness(70%) hue-rotate(300deg) blur(0.1rem); + } +} diff --git a/src/components/Avatar/Avatar.tsx b/src/components/Avatar/Avatar.tsx new file mode 100644 index 0000000..df526b2 --- /dev/null +++ b/src/components/Avatar/Avatar.tsx @@ -0,0 +1,121 @@ +import { Component, createMemo, createSignal, Show } from 'solid-js'; +import defaultAvatar from '../../assets/icons/default_nostrich.svg'; +import { useMediaContext } from '../../contexts/MediaContext'; +import { getMediaUrl } from '../../lib/media'; +import { MediaSize } from '../../types/primal'; + +import styles from './Avatar.module.scss'; + +const Avatar: Component<{ + src: string | undefined, + size?: "xxs" | "xss" | "xs" | "vs" | "sm" | "md" | "lg" | "xl" | "xxl", + verified?: string, + highlightBorder?: boolean, +}> = (props) => { + + const media = useMediaContext(); + + const [isCached, setIsCached] = createSignal(false); + + const selectedSize = props.size || 'sm'; + + const avatarClass = { + xxs: styles.xxsAvatar, + xss: styles.xssAvatar, + xs: styles.xsAvatar, + vs: styles.vsAvatar, + sm: styles.smallAvatar, + md: styles.midAvatar, + lg: styles.largeAvatar, + xl: styles.extraLargeAvatar, + xxl: styles.xxlAvatar, + }; + + const missingClass = { + xxs: styles.xxsMissing, + xss: styles.xssMissing, + xs: styles.xsMissing, + vs: styles.vsMissing, + sm: styles.smallMissing, + md: styles.midMissing, + lg: styles.largeMissing, + xl: styles.extraLargeMissing, + xxl: styles.xxlMissing, + }; + + const imgError = (event: any) => { + const image = event.target; + image.onerror = ""; + image.src = defaultAvatar; + return true; + } + + const highlightClass = () => { + if (props.highlightBorder) { + return styles.highlightBorder; + } + + return ''; + }; + + + const imageSrc = createMemo(() => { + let size: MediaSize = 'm'; + + switch (selectedSize) { + case 'xxs': + case 'xss': + case 'xs': + case 'vs': + case 'sm': + case 'md': + case 'lg': + size = 's'; + break; + default: + size = 'm'; + break; + }; + + const url = media?.actions.getMediaUrl(props.src, size, true); + + setIsCached(!!url); + + return url ?? props.src; + }); + + const notCachedFlag = () => { + const dev = JSON.parse(localStorage.getItem('devMode') || 'false'); + + // @ts-ignore + if (isCached() || !dev) { + return ''; + } + + return styles.cacheFlag; + } + + return ( +
+ +
+
+ } + > +
+ avatar +
+ + +
+
+
+
+ + ) +} + +export default Avatar; diff --git a/src/components/Branding/Branding.module.scss b/src/components/Branding/Branding.module.scss new file mode 100644 index 0000000..2b2aec0 --- /dev/null +++ b/src/components/Branding/Branding.module.scss @@ -0,0 +1,53 @@ +.branding { + display: flex; + align-items: center; + .logo { + background-image: var(--logo); + background-size: contain; + margin-right: 12px; + width: 40px; + height: 40px; + } + + span { + // margin-right: 12px; + font-weight: 700; + font-size: 30px; + line-height: 30px; + color: var(--brand-text); + text-transform: lowercase; + } +} + +.brandingSmall { + .logo { + background-image: var(--logo); + background-size: contain; + margin-right: 0px; + width: 36px; + height: 36px; + } +} + +@media only screen and (max-width: 1300px) { + .branding { + .logo { + margin-right: 0px; + width: 32px; + height: 32px; + } + + span { + display: none; + } + } +} + +.logoLink { + text-decoration: none; + border: none; + border-radius: 0px; + margin: 0px; + padding: 0px; + background: unset; +} diff --git a/src/components/Branding/Branding.tsx b/src/components/Branding/Branding.tsx new file mode 100644 index 0000000..15e24ad --- /dev/null +++ b/src/components/Branding/Branding.tsx @@ -0,0 +1,45 @@ +import { Component, Show } from 'solid-js'; + +import styles from './Branding.module.scss'; +import { useNavigate } from '@solidjs/router'; +import { useIntl } from '@cookbook/solid-intl'; +import { branding } from '../../translations'; + +const Branding: Component<{ small: boolean, isHome?: boolean }> = (props) => { + const navigate = useNavigate(); + const intl = useIntl(); + + const onClick = () => { + if (props.isHome) { + window.scrollTo({ top: 0, left: 0, behavior: 'smooth' }); + return; + } + + navigate('/home'); + } + + return ( + + ) +} + +export default Branding; diff --git a/src/components/Checkbox/Checkbox.module.scss b/src/components/Checkbox/Checkbox.module.scss new file mode 100644 index 0000000..66cf765 --- /dev/null +++ b/src/components/Checkbox/Checkbox.module.scss @@ -0,0 +1,19 @@ +.checkbox { + input { + display: inline-block; + vertical-align: middle; + } + + img { + height: 20px; + margin-right: 12px; + } + + label { + display: inline-block; + font-weight: 400; + font-size: 14px; + line-height: 32px; + color: var(--text-secondary); + } +} diff --git a/src/components/Checkbox/Checkbox.tsx b/src/components/Checkbox/Checkbox.tsx new file mode 100644 index 0000000..22b6427 --- /dev/null +++ b/src/components/Checkbox/Checkbox.tsx @@ -0,0 +1,29 @@ +import { Component, Show } from 'solid-js'; + +import styles from './Checkbox.module.scss'; + +const Checkbox: Component<{ + id: string, + onChange: (e: Event) => void, + checked?: boolean, + label: string, + icon?: string, +}> = (props) => { + + return ( +
+ + + + + +
+ ) +} + +export default Checkbox; diff --git a/src/components/CustomZap/CustomZap.module.scss b/src/components/CustomZap/CustomZap.module.scss new file mode 100644 index 0000000..a5d0ad0 --- /dev/null +++ b/src/components/CustomZap/CustomZap.module.scss @@ -0,0 +1,142 @@ +.customZap { + position: fixed; + width: 420px; + height: 285px; + color: var(--text-secondary); + background-color: var(--background-site); + background: linear-gradient(var(--background-site), var(--background-site)) padding-box, + var(--brand-gradient) border-box; + border: 1px solid transparent; + border-radius: 6px; + + display: flex; + flex-direction: column; + padding: 22px; + + .header { + display: flex; + flex-direction: row; + justify-content: space-between; + + .title { + display: flex; + justify-content: flex-start; + align-items: flex-start; + + .caption { + font-weight: 800; + font-size: 18px; + line-height: 18px; + color: var(--text-secondary); + text-transform: uppercase; + + .amount { + color: var(--text-primary); + } + + .units { + font-weight: 800; + font-size: 12px; + line-height: 20px; + } + } + } + + .close { + border: none; + outline: none; + padding: 0; + margin: 0; + box-shadow: none; + width: 20px; + height: 20px; + display: inline-block; + margin: 0px 0px; + background-color: var(--text-secondary); + -webkit-mask: url(../../assets/icons/close.svg) no-repeat center; + mask: url(../../assets/icons/close.svg) no-repeat center; + + &:hover { + background-color: var(--text-primary); + } + } + } + + .options { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + grid-column-gap: 12px; + grid-row-gap: 16px; + margin-top: 24px; + + .zapOption { + height: 40px; + border-radius: 20px; + border: none; + outline: none; + padding: 0; + margin: 0; + box-shadow: none; + background-color: var(--background-input); + color: var(--text-primary); + text-transform: uppercase; + + &.selected, &:hover { + background-color: var(--text-primary); + color: var(--background-site); + } + + } + } + + .comment { + width: 100%; + height: 32px; + border: 2px solid var(--background-input); + border-radius: 6px; + background-color: var(--background-site); + color: var(--text-secondary); + padding-block: 6px; + padding-inline: 13px; + font-weight: 400; + font-size: 14px; + line-height: 20px; + margin-top: 16px; + + &::placeholder { + color: var(--subtile-devider); + opacity: 1; + font-weight: 400; + font-size: 14px; + line-height: 20px; + } + } + + .action { + width: 100%; + height: 32px; + background: var(--brand-gradient-vertical); + border: none; + outline: none; + padding: 0; + margin: 0; + box-shadow: none; + .caption { + font-weight: 700; + font-size: 14px; + line-height: 20px; + color: white; + } + } + +} + +.zapIcon { + width: 22px; + height: 22px; + display: inline-block; + margin-right: 9px; + background: var(--sidebar-section-icon-gradient); + -webkit-mask: url(../../assets/icons/explore/zaps_hollow.svg) no-repeat 2px 0 / 19px 22px; + mask: url(../../assets/icons/explore/zaps_hollow.svg) no-repeat 2px 0 / 19px 22px; +} diff --git a/src/components/CustomZap/CustomZap.tsx b/src/components/CustomZap/CustomZap.tsx new file mode 100644 index 0000000..2ad9858 --- /dev/null +++ b/src/components/CustomZap/CustomZap.tsx @@ -0,0 +1,156 @@ +import { useIntl } from '@cookbook/solid-intl'; +import { Component, createEffect, createSignal, For } from 'solid-js'; +import { useAccountContext } from '../../contexts/AccountContext'; +import { useSettingsContext } from '../../contexts/SettingsContext'; +import { zapNote } from '../../lib/zap'; +import { userName } from '../../stores/profile'; +import { toastZapFail, zapCustomOption } from '../../translations'; +import { PrimalNote } from '../../types/primal'; +import { debounce } from '../../utils'; +import Modal from '../Modal/Modal'; +import { useToastContext } from '../Toaster/Toaster'; + +import styles from './CustomZap.module.scss'; + +const CustomZap: Component<{ + open?: boolean, + note: PrimalNote, + onConfirm: (amount?: number) => void, + onSuccess: (amount?: number) => void, + onFail: (amount?: number) => void +}> = (props) => { + + const toast = useToastContext(); + const account = useAccountContext(); + const intl = useIntl(); + const settings = useSettingsContext(); + + const [selectedValue, setSelectedValue] = createSignal(settings?.availableZapOptions[0] || 10); + + createEffect(() => { + setSelectedValue(settings?.availableZapOptions[0] || 10) + }); + + const isSelected = (value: number) => value === selectedValue(); + + let comment = ''; + + const setComment = (e: InputEvent) => { + debounce(() => { + const target = e.target as HTMLInputElement; + comment = target.value; + }, 500); + }; + + const truncateNumber = (amount: number) => { + const t = 1000; + + if (amount < t) { + return `${amount}`; + } + + if (amount < Math.pow(t, 2)) { + return (amount % t === 0) ? + `${Math.floor(amount / t)}K` : + intl.formatNumber(amount); + } + + if (amount < Math.pow(t, 3)) { + return (amount % t === 0) ? + `${Math.floor(amount / Math.pow(t, 2))}M` : + intl.formatNumber(amount); + } + + if (amount < Math.pow(t, 4)) { + return (amount % t === 0) ? + `${Math.floor(amount / Math.pow(t, 3))}B` : + intl.formatNumber(amount); + } + + if (amount < Math.pow(t, 5)) { + return (amount % t === 0) ? + `${Math.floor(amount / Math.pow(t, 3))}T` : + intl.formatNumber(amount); + } + + return intl.formatNumber(amount); + }; + + const submit = async () => { + if (account?.hasPublicKey()) { + props.onConfirm(selectedValue()); + const success = await zapNote(props.note, account.publicKey, selectedValue(), comment, account.relays); + + if (success) { + props.onSuccess(selectedValue()); + return; + } + + toast?.sendWarning( + intl.formatMessage(toastZapFail), + ); + + props.onFail(selectedValue()) + } + }; + + return ( + +
+
+
+
+
+ {intl.formatMessage(zapCustomOption,{ + user: userName(props.note.user), + })} + + {truncateNumber(selectedValue())} + sats +
+
+ +
+ +
+ + {(value) => + + } + +
+ + + + + +
+
+ ); +} + +export default CustomZap; diff --git a/src/components/EmbeddedNote/EmbeddedNote.module.scss b/src/components/EmbeddedNote/EmbeddedNote.module.scss new file mode 100644 index 0000000..8de8fbe --- /dev/null +++ b/src/components/EmbeddedNote/EmbeddedNote.module.scss @@ -0,0 +1,113 @@ + +.mentionedNote { + border: solid 1px var(--border-embedded-card); + border-radius: 8px; + background-color: var(--background-embedded_card); + margin-block: 6px; + padding: 18px; + display: grid; + grid-template-columns: 1fr; + grid-template-rows: 32px 1fr; + grid-row-gap: 8px; + text-decoration: none; + color: unset; + line-height: 20px; + + &:hover { + text-decoration: none !important; + } + + .mentionedNoteHeader { + display: flex; + justify-content: flex-start; + align-items: center; + color: var(--text-tertiary-2); + + .postInfo { + display: flex; + justify-content: flex-start; + margin-left: 11px; + + .userInfo { + font-size: 16px; + line-height: 16px; + font-weight: 400; + display: flex; + align-items: center; + width: auto; + .userName { + font-size: 16px; + line-height: 16px; + font-weight: 700; + color: var(--text-primary); + max-width: 150px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + .verifiedBy { + max-width: 220px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + } + + .time{ + margin: 0px 2px; + min-width: 40px; + font-size: 14px; + line-height: 16px; + font-weight: 400; + &::before { + content: "|"; + padding: 0px 2px; + } + } + + .contextMenu { + min-width: 5px; + display: inline-block; + text-align: center; + font-weight: bold; + } + } + } +} + +.verifiedIcon { + width: 15px; + height: 15px; + display: inline-block; + margin: 0px 2px; + background-color: var(--text-tertiary-2); + -webkit-mask: url(../../assets/icons/verified.svg) no-repeat 0 / 100%; + mask: url(../../assets/icons/verified.svg) no-repeat 0 / 100%; +} + +@media only screen and (max-width: 720px) { + .mentionedNoteHeader { + width: calc(100vw - 160px); + .postInfo { + width: calc(100vw - 110px); + .userInfo { + max-width: calc(100vw - 100px); + overflow: hidden; + .userName { + max-width: calc(100vw - 180px); + } + } + .verification { + max-width: 220px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + + } + } + } +} + +.noteContent { + overflow: hidden; +} diff --git a/src/components/EmbeddedNote/EmbeddedNote.tsx b/src/components/EmbeddedNote/EmbeddedNote.tsx new file mode 100644 index 0000000..d2d6a88 --- /dev/null +++ b/src/components/EmbeddedNote/EmbeddedNote.tsx @@ -0,0 +1,187 @@ +import { useIntl } from '@cookbook/solid-intl'; +import { A } from '@solidjs/router'; +import { nip19 } from 'nostr-tools'; +import { Component, createMemo, JSXElement, Show } from 'solid-js'; +import { useThreadContext } from '../../contexts/ThreadContext'; +import { date } from '../../lib/dates'; +import { parseNote2 } from '../../lib/notes'; +import { trimVerification } from '../../lib/profile'; +import { nip05Verification, userName } from '../../stores/profile'; +import { note as t } from '../../translations'; +import { PrimalNote, PrimalUser } from '../../types/primal'; +import Avatar from '../Avatar/Avatar'; +import { parseNoteLinks, parseNpubLinks } from '../ParsedNote/ParsedNote'; + +import styles from './EmbeddedNote.module.scss'; + +const EmbeddedNote: Component<{ note: PrimalNote, mentionedUsers?: Record, includeEmbeds?: boolean}> = (props) => { + + const threadContext = useThreadContext(); + const intl = useIntl(); + + const noteId = () => nip19.noteEncode(props.note.post.id); + + const navToThread = () => { + threadContext?.actions.setPrimaryNote(props.note); + }; + + const verification = createMemo(() => { + return trimVerification(props.note.user?.nip05); + }); + + const parsedContent = (text: string) => { + const regex = /\#\[([0-9]*)\]/g; + let parsed = text; + + let refs = []; + let match; + + while((match = regex.exec(text)) !== null) { + refs.push(match[1]); + } + + if (refs.length > 0) { + for(let i =0; i < refs.length; i++) { + let r = parseInt(refs[i]); + + const tag = props.note.post.tags[r]; + if ( + tag[0] === 'e' && + props.note.mentionedNotes && + props.note.mentionedNotes[tag[1]] + ) { + const embeded = ( + + {intl.formatMessage( + t.mentionIndication, + { name: userName(props.note.user) }, + )} + + ); + + // @ts-ignore + parsed = parsed.replace(`#[${r}]`, embeded.outerHTML); + } + + if (tag[0] === 'p' && props.mentionedUsers && props.mentionedUsers[tag[1]]) { + const user = props.mentionedUsers[tag[1]]; + + const link = ( + + @{userName(user)} + + ); + + + // @ts-ignore + parsed = parsed.replace(`#[${r}]`, link.outerHTML); + } + } + } + + return parsed; + + }; + + const highlightHashtags = (text: string) => { + const regex = /(?:\s|^)#[^\s!@#$%^&*(),.?":{}|<>]+/ig; + + return text.replace(regex, (token) => { + const [space, term] = token.split('#'); + const embeded = ( + + {space} + #{term} + + ); + + // @ts-ignore + return embeded.outerHTML; + }); + } + + const wrapper = (children: JSXElement) => { + if (props.includeEmbeds) { + return ( +
+ {children} +
+ ); + } + + return ( + navToThread()} + data-event={props.note.post.id} + data-event-bech32={noteId()} + > + {children} + + ); + }; + + return wrapper( + <> +
+ + + + + {userName(props.note.user)} + + } + > + + {verification()[0]} + + + + {nip05Verification(props.note.user)} + + + + + + {date(props.note.post.created_at || 0).label} + + +
+
+
+ + ); +} + +export default EmbeddedNote; diff --git a/src/components/ExploreMenuItem/ExploreMenuItem.module.scss b/src/components/ExploreMenuItem/ExploreMenuItem.module.scss new file mode 100644 index 0000000..a6daa33 --- /dev/null +++ b/src/components/ExploreMenuItem/ExploreMenuItem.module.scss @@ -0,0 +1,170 @@ +.exploreMenuItem { + display: flex; + width: 100%; + height: 100px; + background-color: var(--background-card); + justify-content: space-between; + padding-left: 24px; + margin-bottom: 16px; + border-radius: 4px; + + .itemInfo { + display: flex; + justify-content: flex-start; + align-items: center; + + .itemData { + display: flex; + flex-direction: column; + + .header { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline; + + .itemCaption { + font-size: 18px; + line-height: 24px; + font-weight: 700; + color: var(--text-primary); + margin-right: 12px; + } + + .itemStat { + font-size: 24px; + line-height: 28px; + font-weight: 300; + color: var(--text-primary); + + } + } + .footer { + display: flex; + + .itemDescription { + font-size: 12px; + line-height: 16px; + font-weight: 300; + color: var(--text-secondary); + } + } + } + + } + + .itemOptions { + display: flex; + flex-direction: row; + margin: 0px; + + .option { + width: 72px; + height: 92px; + border: none; + margin: 4px; + padding: 0px; + outline: none; + text-decoration: none; + background-color: unset; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + cursor: pointer; + + >div { + width: 20px; + height: 20px; + background-color: var(--text-secondary-2); + margin-bottom: 6px; + } + >span { + font-size: 12px; + line-height: 16px; + font-weight: 400; + color: var(--text-secondary-2); + } + + &:hover { + outline: none; + text-decoration: none; + border: solid 1px var(--subtile-devider); + border-radius: 4px; + background-color: var(--background-input); + >div { + background: var(--highlight-gradient); + } + } + } + } +} + +.flameIcon { + width: 20px; + height: 20px; + display: inline-block; + margin: 0px; + -webkit-mask: url(../../assets/icons/explore/flame.svg) no-repeat 0px / 20px; + mask: url(../../assets/icons/explore/flame.svg) no-repeat 0px / 20px; +} + +.zapsIcon { + width: 20px; + height: 20px; + display: inline-block; + margin: 0px; + -webkit-mask: url(../../assets/icons/explore/zaps.svg) no-repeat 0px / 20px; + mask: url(../../assets/icons/explore/zaps.svg) no-repeat 0px / 20px; +} + +.likesIcon { + width: 20px; + height: 20px; + display: inline-block; + margin: 0px; + -webkit-mask: url(../../assets/icons/explore/likes.svg) no-repeat 0px / 20px; + mask: url(../../assets/icons/explore/likes.svg) no-repeat 0px / 20px; +} + +.clockIcon { + width: 20px; + height: 20px; + display: inline-block; + margin: 0px; + -webkit-mask: url(../../assets/icons/explore/clock.svg) no-repeat 0px / 20px; + mask: url(../../assets/icons/explore/clock.svg) no-repeat 0px / 20px; +} + + +@mixin itemIcon { + width: 36px; + height: 36px; + margin-right: 16px; + display: block; + background-color: var(--text-secondary-2); +} + +.followsIcon { + @include itemIcon(); + -webkit-mask: url(../../assets/icons/explore/follows.svg) no-repeat 0px / 36px; + mask: url(../../assets/icons/explore/follows.svg) no-repeat 0px / 36px; +} + +.tribeIcon { + @include itemIcon(); + -webkit-mask: url(../../assets/icons/explore/tribe.svg) no-repeat 0px / 36px; + mask: url(../../assets/icons/explore/tribe.svg) no-repeat 0px / 36px; +} + +.networkIcon { + @include itemIcon(); + -webkit-mask: url(../../assets/icons/explore/network.svg) no-repeat 0px / 36px; + mask: url(../../assets/icons/explore/network.svg) no-repeat 0px / 36px; +} + +.globalIcon { + @include itemIcon(); + -webkit-mask: url(../../assets/icons/explore/global.svg) no-repeat 0px / 36px; + mask: url(../../assets/icons/explore/global.svg) no-repeat 0px / 36px; +} diff --git a/src/components/ExploreMenuItem/ExploreMenuItem.tsx b/src/components/ExploreMenuItem/ExploreMenuItem.tsx new file mode 100644 index 0000000..fbff8e6 --- /dev/null +++ b/src/components/ExploreMenuItem/ExploreMenuItem.tsx @@ -0,0 +1,85 @@ +import { useIntl } from '@cookbook/solid-intl'; +import { A } from '@solidjs/router'; +import type { Component } from 'solid-js'; +import { scopeDescriptors, timeframeDescriptors } from '../../translations'; +import { ScopeDescriptor } from '../../types/primal'; + +import styles from './ExploreMenuItem.module.scss'; + + +const itemInfo: Record = { + follows: { + ...scopeDescriptors.follows, + icon: styles.followsIcon, + }, + tribe: { + ...scopeDescriptors.tribe, + icon: styles.tribeIcon, + }, + network: { + ...scopeDescriptors.network, + icon: styles.networkIcon, + }, + global: { + ...scopeDescriptors.global, + icon: styles.globalIcon, + }, +}; + +const timeframeIcons: Record = { + trending: styles.flameIcon, + mostzapped: styles.zapsIcon, + popular: styles.likesIcon, + latest: styles.clockIcon, +} + +const ExploreMenuItem: Component<{ scope: string, stat: number }> = (props) => { + + const intl = useIntl(); + + const item = () => itemInfo[props.scope]; + + const timeframeOption = (timeframe: string) => { + return ( + +
+ {intl.formatMessage(timeframeDescriptors[timeframe])} +
+ ); + } + + return ( +
+
+
+ +
+
+
+ {intl.formatMessage(item().caption)} +
+
+ {props.stat.toLocaleString()} +
+
+
+
+ {intl.formatMessage(item().description)} +
+
+
+
+
+ {timeframeOption('trending')} + {timeframeOption('mostzapped')} + {timeframeOption('popular')} + {timeframeOption('latest')} +
+
+ ) +} + +export default ExploreMenuItem; diff --git a/src/components/ExploreSidebar/ExploreSidebar.module.scss b/src/components/ExploreSidebar/ExploreSidebar.module.scss new file mode 100644 index 0000000..a1a58fe --- /dev/null +++ b/src/components/ExploreSidebar/ExploreSidebar.module.scss @@ -0,0 +1,43 @@ +.trendingUsers { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr; + + .user { + width: 75px; + height: 85px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + text-decoration: none; + opacity: 0.7; + transition: opacity 0.5s; + + &:hover { + opacity: 1; + transition: opacity 0.5s; + } + + .name { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + text-align: center; + margin-top: 10px; + width: 72px; + font-size: 12px; + line-height: 12px; + font-weight: 400; + color: var(--text-primary); + } + } +} + +.trendingUsersCaption { + margin-bottom: 24px; + font-weight: 800; + font-size: 18px; + line-height: 20px; + text-transform: uppercase; + color: var(--text-secondary); +} diff --git a/src/components/ExploreSidebar/ExploreSidebar.tsx b/src/components/ExploreSidebar/ExploreSidebar.tsx new file mode 100644 index 0000000..c835f51 --- /dev/null +++ b/src/components/ExploreSidebar/ExploreSidebar.tsx @@ -0,0 +1,144 @@ +import { A, useResolvedPath } from '@solidjs/router'; +import { Component, createEffect, createMemo, For, onCleanup } from 'solid-js'; +import { createStore } from 'solid-js/store'; +import { Kind } from '../../constants'; +import { APP_ID } from '../../App'; +import { getExploreFeed } from '../../lib/feed'; +import { isConnected, refreshSocketListeners, removeSocketListeners, socket } from '../../sockets'; +import { sortingPlan, convertToNotes } from '../../stores/note'; +import { convertToUser, emptyUser, truncateNpub } from '../../stores/profile'; +import { FeedPage, NostrEOSE, NostrEvent, NostrEventContent, NostrUserContent, PrimalNote, PrimalUser } from '../../types/primal'; +import Avatar from '../Avatar/Avatar'; + +import styles from './ExploreSidebar.module.scss'; +import { useIntl } from '@cookbook/solid-intl'; +import { getTrendingUsers } from '../../lib/profile'; +import { hexToNpub } from '../../lib/keys'; +import { exploreSidebarCaption } from '../../translations'; + +const ExploreSidebar: Component = () => { + + const intl = useIntl(); + + const [store, setStore] = createStore<{ users: Record, scores: Record }>({ + users: {}, + scores: {}, + }); + + const [trendingUsers, setTrendingUsers] = createStore([]); + + const authorName = (user: PrimalUser) => { + return user.displayName || + user.name || + truncateNpub(user.npub); + } + +// ACTIONS ------------------------------------- + + const processUsers = (type: string, content: NostrEventContent | undefined) => { + + if (type === 'EOSE') { + const sortedKeys = Object.keys(store.scores).sort( + (a, b) => store.scores[b] - store.scores[a]); + + const users = sortedKeys.map(key => { + if (!store.users[key]) { + return emptyUser(key); + } + + return convertToUser(store.users[key]); + }); + + setTrendingUsers(() => [...users]); + return; + } + + if (type === 'EVENT') { + if (content && content.kind === Kind.Metadata) { + setStore('users', (users) => ({ ...users, [content.pubkey]: content})); + return; + } + if (content && content.kind === Kind.UserScore) { + const scores = JSON.parse(content.content); + + setStore('scores', () => ({ ...scores })); + return; + } + } + }; + + +// SOCKET HANDLERS ------------------------------ + + const onSocketClose = (closeEvent: CloseEvent) => { + const webSocket = closeEvent.target as WebSocket; + + webSocket.removeEventListener('message', onMessage); + webSocket.removeEventListener('close', onSocketClose); + }; + + const onMessage = (event: MessageEvent) => { + const message: NostrEvent | NostrEOSE = JSON.parse(event.data); + + const [type, subId, content] = message; + + if (subId === `explore_sidebar_${APP_ID}`) { + processUsers(type, content); + return; + } + }; + +// EFFECTS -------------------------------------- + + onCleanup(() => { + removeSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + }); + + + createEffect(() => { + if (isConnected()) { + refreshSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + + setStore(() => ({ + users: {}, + scores: {}, + })); + + getTrendingUsers(`explore_sidebar_${APP_ID}`); + } + }); + +// RENDER --------------------------------------- + + return ( + <> +
+ {intl.formatMessage(exploreSidebarCaption)} +
+
+ + { + user => ( + + +
{authorName(user)}
+
+ ) + } +
+
+ + ) +} + +export default ExploreSidebar; diff --git a/src/components/FeedSelect/FeedSelect.tsx b/src/components/FeedSelect/FeedSelect.tsx new file mode 100644 index 0000000..f090925 --- /dev/null +++ b/src/components/FeedSelect/FeedSelect.tsx @@ -0,0 +1,91 @@ +import { Component } from 'solid-js'; +import { useHomeContext } from '../../contexts/HomeContext'; +import { useSettingsContext } from '../../contexts/SettingsContext'; +import { FeedOption } from '../../types/primal'; +import SelectBox from '../SelectBox/SelectBox'; + +const FeedSelect: Component<{ isPhone?: boolean}> = (props) => { + + const home = useHomeContext(); + const settings = useSettingsContext(); + + const selectFeed = (option: FeedOption) => { + const hex = option.value; + const selector = document.getElementById('defocus'); + + selector?.focus(); + selector?.blur(); + + if (hex) { + const feed = settings?.availableFeeds.find(p => p.hex === hex); + + if (hex !== initialValue()?.value) { + home?.actions.clearNotes(); + home?.actions.selectFeed(feed); + } + return; + } + + }; + + const isSelected = (option: FeedOption) => { + const selected = home?.selectedFeed; + + if (selected?.hex) { + return selected.hex === option.value; + } + + return false; + } + + const options:() => FeedOption[] = () => { + if (settings?.availableFeeds === undefined) { + return []; + } + + return settings.availableFeeds.map(feed => { + return ({ + label: feed.name, + value: feed.hex, + }); + }); + }; + + const initialValue = () => { + const selected = home?.selectedFeed; + + if (!selected) { + return { + label: '', + value: undefined, + }; + } + + const feed = settings?.availableFeeds.find(f => + f.hex === selected.hex + ); + + if (feed) { + const [scope, timeframe] = feed.hex?.split(';') || []; + + const value = scope && timeframe ? `${scope};${timeframe}` : feed.hex; + + return { + label: feed.name, + value, + }; + } + } + + return ( + + ); +} + +export default FeedSelect; diff --git a/src/components/FeedSorter/FeedSorter.module.scss b/src/components/FeedSorter/FeedSorter.module.scss new file mode 100644 index 0000000..5fb7441 --- /dev/null +++ b/src/components/FeedSorter/FeedSorter.module.scss @@ -0,0 +1,148 @@ +@mixin controlButton { + margin: 0; + padding: 0; + border: none; + background-color: unset; + + opacity: 0.7; + transition: opacity 0.4s; + + &:hover { + opacity: 1; + transition: opacity 0.4s; + } + + &:focus { + box-shadow: none; + } +} + +.feedItem { + width: 100%; + height: 40px; + background-color: var(--background-site); + color: var(--text-tertiary); + font-size: 16px; + line-height: 14px; + font-weight: 400; + padding-inline: 12px; + margin-block: 8px; + + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + cursor: grab; + + .sortControls { + margin-right: 5px; + .sortButton { + @include controlButton(); + width: 16px; + height: 16px; + font-size: 16px; + line-height: 16px; + } + } + + .manageControls { + display: flex; + .mngButton { + @include controlButton(); + width: 32px; + height: 32px; + } + + .deleteButton { + width: 16px; + height: 16px; + display: inline-block; + margin: 0px 0px; + background-color: var(--text-secondary); + -webkit-mask: url(../../assets/icons/delete.svg) no-repeat 0px / 16px; + mask: url(../../assets/icons/delete.svg) no-repeat 0px / 16px; + } + + .editButton { + width: 16px; + height: 16px; + display: inline-block; + margin: 0px 0px; + background-color: var(--text-secondary); + -webkit-mask: url(../../assets/icons/edit.svg) no-repeat 0px / 16px; + mask: url(../../assets/icons/edit.svg) no-repeat 0px / 16px; + } + } + + .feedEdit { + position: relative; + width: 100%; + .feedNameInput { + height: 32px; + background-color: var(--background-site); + color: var(--text-tertiary); + font-size: 16px; + line-height: 14px; + font-weight: 400; + margin: 0; + } + .feedEditControl { + position: absolute; + top: 2px; + right: 0; + height: 32px; + display: flex; + justify-content: flex-end; + align-items: center; + + >button { + @include controlButton(); + width: 32px; + height: 32px; + } + } + + } +} + +.dragIcon { + width: 20px; + height: 20px; + display: inline-block; + margin: 0px 0px; + background-color: var(--text-secondary); + -webkit-mask: url(../../assets/icons/drag_handle.svg) no-repeat center; + mask: url(../../assets/icons/drag_handle.svg) no-repeat center; +} + +.closeIcon { + width: 20px; + height: 20px; + display: inline-block; + margin: 0px 0px; + background-color: var(--text-secondary); + -webkit-mask: url(../../assets/icons/close.svg) no-repeat center; + mask: url(../../assets/icons/close.svg) no-repeat center; +} + +.checkIcon { + width: 20px; + height: 20px; + display: inline-block; + margin: 0px 0px; + background-color: var(--text-secondary); + -webkit-mask: url(../../assets/icons/check.svg) no-repeat 0 / 100%; + mask: url(../../assets/icons/check.svg) no-repeat 0 / 100%; +} + +.draggedBefore { + border-top: solid 1px var(--subtile-devider); +} + +.draggedAfter { + border-bottom: solid 1px var(--subtile-devider); +} + +.draggedItem { + opacity: 0.6; +} diff --git a/src/components/FeedSorter/FeedSorter.tsx b/src/components/FeedSorter/FeedSorter.tsx new file mode 100644 index 0000000..7be3269 --- /dev/null +++ b/src/components/FeedSorter/FeedSorter.tsx @@ -0,0 +1,179 @@ +import { Component, createEffect, createSignal, For, Show } from 'solid-js'; +import { useAccountContext } from '../../contexts/AccountContext'; +import { useSettingsContext } from '../../contexts/SettingsContext'; +import { PrimalFeed } from '../../types/primal'; + +import styles from './FeedSorter.module.scss'; + + +const FeedSorter: Component = () => { + + let sorter: any; + + const settings = useSettingsContext(); + const account = useAccountContext(); + + const [editMode, setEditMode] = createSignal(''); + + const [newName, setNewName] = createSignal(''); + + const availableFeeds = () => { + return settings?.availableFeeds || []; + }; + + const removeFeed = (feed: PrimalFeed) => { + settings?.actions.removeAvailableFeed(feed); + }; + + const editFeed = (feed: PrimalFeed) => { + setEditMode(() => feed.hex || ''); + setNewName(() => feed.name); + const input = document.getElementById(`input_${feed.hex}`); + input && input.focus(); + }; + + const updateFeedName = (feed: PrimalFeed) => { + settings?.actions.renameAvailableFeed(feed, newName()); + setEditMode(''); + } + + const sortList = (target: any) => { + // Get all items + let items = target.getElementsByClassName(styles.feedItem); + // init current item + let current: any = null; + + // (Make items draggable and sortable + for (let i of items) { + i.draggable = true; + + i.ondragstart = (e: DragEvent) => { + current = i; + for (let it of items) { + if (it === current) { + it.classList.add(styles.draggedItem); + } + } + }; + + i.ondragenter = (e: DragEvent) => { + const oldIndex = current.getAttribute('data-index'); + const newIndex = i.getAttribute('data-index'); + + if (oldIndex > newIndex) { + i.classList.add(styles.draggedBefore); + i.classList.remove(styles.draggedAfter); + } + if (oldIndex < newIndex) { + i.classList.add(styles.draggedAfter); + i.classList.remove(styles.draggedBefore); + } + }; + + i.ondragleave = () => { + i.classList.remove(styles.draggedBefore); + i.classList.remove(styles.draggedAfter); + } + + i.ondragend = () => { for (let it of items) { + it.classList.remove(styles.draggedItem); + i.classList.remove(styles.draggedBefore); + i.classList.remove(styles.draggedAfter); + }}; + + // Prevent default "drop", so we can do our own + i.ondragover = (e: DragEvent) => e.preventDefault(); + + i.ondrop = (e: DragEvent) => { + e.preventDefault(); + if (i != current) { + const oldIndex = current.getAttribute('data-index'); + const newIndex = i.getAttribute('data-index'); + + settings?.actions.moveAvailableFeed(oldIndex, newIndex); + + for (let it of items) { + it.classList.remove(styles.draggedBefore); + it.classList.remove(styles.draggedBefore); + it.classList.remove(styles.draggeditem); + } + } + }; + } + } + + createEffect(() => { + if (sorter && availableFeeds().length > 0) { + sortList(sorter); + } + }); + + return ( +
+ 0}> + + {(feed, index) => ( +
+ + +
+
+
+
+ + +
+
+
{feed.name}
+ + } + > +
+ setNewName(() => e.target?.value)} + onKeyUp={(e: KeyboardEvent) => { + if (e.code === 'Enter') { + updateFeedName(feed); + } + + if (e.code === 'Escape') { + setEditMode(''); + } + }} + /> +
+ + +
+
+
+
+ )} +
+
+
+ ) +} + +export default FeedSorter; diff --git a/src/components/FloatingNewPostButton/FloatingNewPostButton.module.scss b/src/components/FloatingNewPostButton/FloatingNewPostButton.module.scss new file mode 100644 index 0000000..619176d --- /dev/null +++ b/src/components/FloatingNewPostButton/FloatingNewPostButton.module.scss @@ -0,0 +1,34 @@ +.newPostButton { + width: 48px; + height: 48px; + padding: 0px; + background: var(--brand-gradient); + border-radius: 50%; +} + +.postIcon { + display: inline-block; + width: 24px; + height: 24px; + vertical-align: middle; + margin-top: -3px; + + background-color: var(--missing-avatar-text); + -webkit-mask: url(../../assets/icons/post.svg) no-repeat center; + mask: url(../../assets/icons/post.svg) no-repeat center; +} + + +@media only screen and (max-width: 1300px) { + .newPostButton { + width: 32px; + height: 32px; + } + + .postIcon { + width: 16px; + height: 16px; + -webkit-mask: url(../../assets/icons/post.svg) no-repeat 0px / 16px; + mask: url(../../assets/icons/post.svg) no-repeat 0px / 16px; + } +} diff --git a/src/components/FloatingNewPostButton/FloatingNewPostButton.tsx b/src/components/FloatingNewPostButton/FloatingNewPostButton.tsx new file mode 100644 index 0000000..5e41ed2 --- /dev/null +++ b/src/components/FloatingNewPostButton/FloatingNewPostButton.tsx @@ -0,0 +1,21 @@ +import { useAccountContext } from "../../contexts/AccountContext"; + +import styles from "./FloatingNewPostButton.module.scss"; + +export default function FloatingNewPostButton() { + const account = useAccountContext(); + + const showNewNoteForm = () => { + account?.actions?.showNewNoteForm(); + }; + + + return ( + + ) +} diff --git a/src/components/FollowButton/FollowButton.module.scss b/src/components/FollowButton/FollowButton.module.scss new file mode 100644 index 0000000..e351027 --- /dev/null +++ b/src/components/FollowButton/FollowButton.module.scss @@ -0,0 +1,57 @@ + + @mixin followButton { + grid-area: follow; + align-items: center; + display: flex; + align-items: center; + button { + background: var(--brand-gradient-vertical); + border-radius: 6px; + padding: 0px; + font-size: 12px; + line-height: 16px; + font-weight: 700; + margin: 0px; + } + } + + .primaryButton { + width: 90px; + height: 40px; + } + + .follow { + @include followButton; + button { + border: none; + } + } + + .unfollow { + @include followButton; + button { + color: var(--text-secondary); + background-color: var(--background-card); + background: linear-gradient(var(--background-card), var(--background-card)) padding-box, + var(--brand-gradient) border-box; + border: 1px solid transparent; + } + } + + .large { + button { + width: 90px; + height: 40px; + margin: 0px 8px; + font-size: 16px; + line-height: 20px; + } + + } + + .small { + button { + width: 64px; + height: 40px; + } + } diff --git a/src/components/FollowButton/FollowButton.tsx b/src/components/FollowButton/FollowButton.tsx new file mode 100644 index 0000000..3573b28 --- /dev/null +++ b/src/components/FollowButton/FollowButton.tsx @@ -0,0 +1,57 @@ +import { useIntl } from '@cookbook/solid-intl'; +import { Component, Show } from 'solid-js'; +import { useAccountContext } from '../../contexts/AccountContext'; +import { account as t } from '../../translations'; +import { PrimalUser } from '../../types/primal'; +import { useToastContext } from '../Toaster/Toaster'; + +import styles from './FollowButton.module.scss'; + + +const FollowButton: Component<{ person: PrimalUser | undefined, large?: boolean }> = (props) => { + + const toast = useToastContext() + const account = useAccountContext(); + const intl = useIntl(); + + const isFollowed = () => { + return props.person && + account?.publicKey && + account?.following.includes(props.person.pubkey); + } + + const onFollow = (e: MouseEvent) => { + e.preventDefault(); + if (!account || !account.hasPublicKey() || !props.person) { + toast?.sendWarning(intl.formatMessage(t.needToLogin)) + return; + } + + const action = isFollowed() ? + account.actions.removeFollow : + account.actions.addFollow; + + action(props.person.pubkey); + } + + const klass = () => { + return `${isFollowed() ? styles.unfollow : styles.follow} ${props.large ? styles.large : styles.small}`; + } + + return ( + +
+ +
+
+ ) +} + +export default FollowButton; diff --git a/src/components/HomeHeader/HomeHeader.module.scss b/src/components/HomeHeader/HomeHeader.module.scss new file mode 100644 index 0000000..14f4e0a --- /dev/null +++ b/src/components/HomeHeader/HomeHeader.module.scss @@ -0,0 +1,168 @@ +.fullHeader { + display: grid; + height: 120px; + padding-top: 26px; +} + +.smallHeader { + display: grid; + height: 32px; + grid-template-rows: 1fr 4px; +} + +.smallHeaderMain { + display: flex; + flex-direction: row; + justify-content: stretch; + align-items: flex-end; + background-color: var(--background-site); +} + +.smallHeaderBottomBorder { + width: 100%; + height: 4px; + display: flex; + justify-content: space-between; + // background-color: red; + + .rightCorner { + display: inline-block; + width: 4px; + height: 4px; + + background-color: var(--background-site); + -webkit-mask: url(../../assets/icons/corner_right.svg) no-repeat center; + mask: url(../../assets/icons/corner_right.svg) no-repeat center; + } + .leftCorner { + display: inline-block; + width: 4px; + height: 4px; + + background-color: var(--background-site); + -webkit-mask: url(../../assets/icons/corner_left.svg) no-repeat center; + mask: url(../../assets/icons/corner_left.svg) no-repeat center; + } +} + +.smallLeft { + width: 100%; + flex-grow: 20; + flex-shrink: 1; + visibility: hidden; +} + +.smallRight { + max-width: 50%; + flex-grow: 1; + margin-bottom: 4px; + // margin: auto; +} + +.fixedSelector { + position:fixed; + top: 0px; + width: 640px; + height: 48px; + // align-items: center; + // background-color: var(--background-site); + z-index: var(--z-index-header); + transition: 0.3s; + transform: translateY(0px); + + .smallHeaderMain { + align-items: center; + } + + .smallLeft { + visibility: visible; + } + + .smallRight { + margin-bottom: 0; + } +} + +.hiddenSelector { + transition: 0.3s; + transform: translateY(-48px); +} + +.instaHide { + top: -48px; +} + +.callToAction { + display: grid; + height: 72px; + grid-template-columns: 72px 1fr; + grid-column-gap: 17px; + align-items: center; + background-color: unset; + margin: 0px; + padding: 0px; + border: none; + outline: none; + + p { + font-size: 34px; + line-height: 34px; + padding: 0px; + margin: 0px; + } + + .border { + height: 36px; + padding: 1px; + background: var(--brand-gradient); + border-radius: 6px; + margin-left: 10px + } + + .input { + height: 34px; + font-size: 18px; + line-height: 20px; + margin: 0px; + border-radius: 6px; + border: none; + color: var(--text-tertiary); + background-color: var(--background-site); + display: flex; + align-items: center; + padding-left: 12px; + } +} + +.welcomeMessage { + display: grid; + align-content: center; + height: 72px; + font-weight: 300; + font-size: 32px; + line-height: 34px; + color: var(--brand-text); + text-transform: lowercase; +} + +.welcomeMessageSmall { + display: grid; + align-content: center; + font-weight: 300; + font-size: 24px; + line-height: 28px; + color: var(--brand-text); + text-transform: lowercase; +} + +@media only screen and (max-width: 720px) { + .fullHeader { + width: 100%; + } + .smallHeader { + width: 100%; + } + .fixedSelector { + width: 100%; + } +} diff --git a/src/components/HomeHeader/HomeHeader.tsx b/src/components/HomeHeader/HomeHeader.tsx new file mode 100644 index 0000000..178a571 --- /dev/null +++ b/src/components/HomeHeader/HomeHeader.tsx @@ -0,0 +1,131 @@ +import { Component, onCleanup, onMount, Show } from 'solid-js'; +import Avatar from '../Avatar/Avatar'; + +import styles from './HomeHeader.module.scss'; +import FeedSelect from '../FeedSelect/FeedSelect'; +import { useAccountContext } from '../../contexts/AccountContext'; +import SmallCallToAction from '../SmallCallToAction/SmallCallToAction'; +import { useHomeContext } from '../../contexts/HomeContext'; +import { useIntl } from '@cookbook/solid-intl'; +import { useSettingsContext } from '../../contexts/SettingsContext'; +import { placeholders as t } from '../../translations'; + +const HomeHeader: Component = () => { + + const account = useAccountContext(); + const home = useHomeContext(); + const settings = useSettingsContext(); + const intl = useIntl(); + + let lastScrollTop = document.body.scrollTop || document.documentElement.scrollTop; + + const onScroll = () => { + const scrollTop = document.body.scrollTop || document.documentElement.scrollTop; + const smallHeader = document.getElementById('small_header'); + const border = document.getElementById('small_bottom_border'); + + home?.actions.updateScrollTop(scrollTop); + + const isScrollingDown = scrollTop > lastScrollTop; + lastScrollTop = scrollTop; + + if (scrollTop < 117) { + if (border) { + border.style.display = 'none'; + } + smallHeader?.classList.remove(styles.hiddenSelector); + smallHeader?.classList.remove(styles.fixedSelector); + return; + } + + if (lastScrollTop < 117) { + smallHeader?.classList.add(styles.instaHide); + return; + } + + if (border) { + border.style.display = 'flex'; + } + + smallHeader?.classList.remove(styles.instaHide); + + if (!isScrollingDown) { + smallHeader?.classList.add(styles.fixedSelector); + smallHeader?.classList.remove(styles.hiddenSelector); + return; + } + + smallHeader?.classList.add(styles.hiddenSelector); + } + + const onShowNewNoteinput = () => { + account?.actions?.showNewNoteForm(); + }; + + onMount(() => { + window.addEventListener('scroll', onScroll); + }); + + onCleanup(() => { + window.removeEventListener('scroll', onScroll); + }); + + const activeUser = () => account?.activeUser; + + return ( +
+ + {intl.formatMessage(t.guestUserGreeting)} +
} + > + + + +
+
+ +
+ {intl.formatMessage(t.welcomeMessage)} +
+
} + > +
+ +
+ + + 0 && home?.selectedFeed}> +
+ +
+
+
+
+
+
+
+ + + ); +} + +export default HomeHeader; diff --git a/src/components/HomeHeaderPhone/HomeHeaderPhone.module.scss b/src/components/HomeHeaderPhone/HomeHeaderPhone.module.scss new file mode 100644 index 0000000..ed87ab3 --- /dev/null +++ b/src/components/HomeHeaderPhone/HomeHeaderPhone.module.scss @@ -0,0 +1,109 @@ +.fullHeader { + display: grid; + width: 100%; + grid-template-columns: 1fr; + grid-template-rows: 48px 4px; + grid-template-areas: "phone_header" "phone_border"; +} +.phoneHeader { + grid-area: phone_header; + display: flex; + flex-direction: row; + position: relative; + width: 100%; + height: 48px; + align-items: center; + justify-content: space-between; + padding-inline: 16px; + padding-top: 4px; +} + +.logo { + width: 36px; + margin-right: 16px; +} + + +.smallHeader { + display: grid; + height: 32px; + grid-template-rows: 1fr 4px; +} + +.smallHeaderMain { + display: flex; + flex-direction: row; + justify-content: stretch; + align-items: flex-end; + background-color: var(--background-site); +} + +.smallHeaderBottomBorder { + grid-area: phone_border; + width: 100%; + height: 4px; + display: flex; + justify-content: space-between; + // background-color: red; + + .rightCorner { + display: inline-block; + width: 4px; + height: 4px; + + background-color: var(--background-site); + -webkit-mask: url(../../assets/icons/corner_right.svg) no-repeat center; + mask: url(../../assets/icons/corner_right.svg) no-repeat center; + } + .leftCorner { + display: inline-block; + width: 4px; + height: 4px; + + background-color: var(--background-site); + -webkit-mask: url(../../assets/icons/corner_left.svg) no-repeat center; + mask: url(../../assets/icons/corner_left.svg) no-repeat center; + } +} + +.smallLeft { + width: 100%; + flex-grow: 20; + flex-shrink: 1; + visibility: hidden; +} + +.smallRight { + max-width: 50%; + flex-grow: 1; + // margin: auto; +} + +.fixedSelector { + position:fixed; + top: 0px; + width: 100%; + height: 48px; + // align-items: center; + background-color: var(--background-site); + z-index: var(--z-index-header); + transition: 0.3s; + transform: translateY(0px); + + .smallHeaderMain { + align-items: center; + } + + .smallLeft { + visibility: visible; + } +} + +.hiddenSelector { + transition: 0.3s; + transform: translateY(-48px); +} + +.instaHide { + top: -48px; +} diff --git a/src/components/HomeHeaderPhone/HomeHeaderPhone.tsx b/src/components/HomeHeaderPhone/HomeHeaderPhone.tsx new file mode 100644 index 0000000..ba1a513 --- /dev/null +++ b/src/components/HomeHeaderPhone/HomeHeaderPhone.tsx @@ -0,0 +1,81 @@ +import { Component, onCleanup, onMount, Show } from 'solid-js'; + +import styles from './HomeHeaderPhone.module.scss'; +import FeedSelect from '../FeedSelect/FeedSelect'; +import Branding from '../Branding/Branding'; +import { useHomeContext } from '../../contexts/HomeContext'; + +const HomeHeaderPhone: Component = () => { + + const home = useHomeContext(); + + let lastScrollTop = document.body.scrollTop || document.documentElement.scrollTop; + + const onScroll = () => { + const scrollTop = document.body.scrollTop || document.documentElement.scrollTop; + const smallHeader = document.getElementById('phone_header'); + const border = document.getElementById('small_bottom_border'); + + home?.actions?.updateScrollTop(scrollTop); + + const isScrollingDown = scrollTop > lastScrollTop; + lastScrollTop = scrollTop; + + if (scrollTop < 117) { + if (border) { + border.style.display = 'none'; + } + smallHeader?.classList.remove(styles.hiddenSelector); + smallHeader?.classList.remove(styles.fixedSelector); + return; + } + + if (lastScrollTop < 117) { + smallHeader?.classList.add(styles.instaHide); + return; + } + + if (border) { + border.style.display = 'flex'; + } + smallHeader?.classList.remove(styles.instaHide); + + if (!isScrollingDown) { + smallHeader?.classList.add(styles.fixedSelector); + smallHeader?.classList.remove(styles.hiddenSelector); + return; + } + + smallHeader?.classList.add(styles.hiddenSelector); + } + + onMount(() => { + window.addEventListener('scroll', onScroll); + }); + + onCleanup(() => { + window.removeEventListener('scroll', onScroll); + }); + + return ( +
+
+
+ +
+ + + +
+
+
+
+
+
+ ); +} + +export default HomeHeaderPhone; diff --git a/src/components/HomeSidebar/HomeSidebar.module.scss b/src/components/HomeSidebar/HomeSidebar.module.scss new file mode 100644 index 0000000..c4c8346 --- /dev/null +++ b/src/components/HomeSidebar/HomeSidebar.module.scss @@ -0,0 +1,59 @@ +@mixin heading { + position: -webkit-sticky; + position: sticky; + top: 0px; + width: 100%; + height: 44px; + // background-color: var(--background-site); + background: var(--fade-gradient-vertical); + z-index: 5; + padding-bottom: 22px; + display:flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + font-size: 18px; + font-weight: 800; + line-height: 22px; + color: var(--text-secondary-2); + text-transform: uppercase; + >div{ + display: flex; + height: 22px; + >span { + color: var(--text-tertiary-2); + text-transform: lowercase; + margin-left: 6px; + } + } +} + +.flameIcon { + width: 22px; + height: 22px; + display: inline-block; + margin-right: 9px; + background: var(--sidebar-section-icon-gradient); + -webkit-mask: url(../../assets/icons/explore/flame.svg) no-repeat 1px 0 / 20px 22px; + mask: url(../../assets/icons/explore/flame.svg) no-repeat 1px 0 / 20px 22px; +} + +.zapIcon { + width: 22px; + height: 22px; + display: inline-block; + margin-right: 9px; + background: var(--sidebar-section-icon-gradient); + -webkit-mask: url(../../assets/icons/explore/zaps_hollow.svg) no-repeat 2px 0 / 19px 22px; + mask: url(../../assets/icons/explore/zaps_hollow.svg) no-repeat 2px 0 / 19px 22px; +} + +.headingTrending { + @include heading(); +} + +.headingZapped { + @include heading(); + margin-top: 34px; + z-index: 10px; +} diff --git a/src/components/HomeSidebar/HomeSidebar.tsx b/src/components/HomeSidebar/HomeSidebar.tsx new file mode 100644 index 0000000..1f21151 --- /dev/null +++ b/src/components/HomeSidebar/HomeSidebar.tsx @@ -0,0 +1,208 @@ +import { Component, createEffect, createSignal, For, onCleanup } from 'solid-js'; +import { createStore } from 'solid-js/store'; +import { APP_ID } from '../../App'; +import { getMostZapped4h, getTrending24h } from '../../lib/feed'; +import { humanizeNumber } from '../../lib/stats'; +import { convertToNotes, sortingPlan } from '../../stores/note'; +import { Kind } from '../../constants'; +import { + isConnected, + refreshSocketListeners, + removeSocketListeners, + socket +} from '../../sockets'; +import { + FeedPage, + NostrEOSE, + NostrEvent, + NostrEventContent, + NostrMentionContent, + PrimalNote +} from '../../types/primal'; + +import styles from './HomeSidebar.module.scss'; +import SmallNote from '../SmallNote/SmallNote'; +import { useIntl } from '@cookbook/solid-intl'; +import { hourNarrow } from '../../formats'; + +const [init, setInit] = createSignal(false); + +const [data, setData] = createStore>({ + trending: { + messages: [], + users: {}, + postStats: {}, + notes: [], + mentions: {}, + }, + mostzapped: { + messages: [], + users: {}, + postStats: {}, + notes: [], + mentions: {}, + }, +}); + +const HomeSidebar: Component = () => { + + const intl = useIntl(); + + onCleanup(() => { + removeSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + }); + + + createEffect(() => { + if (isConnected() && !init()) { + refreshSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + + setData(() => ({ + trending: { + messages: [], + users: {}, + postStats: {}, + notes: [], + mentions: {}, + }, + mostzapped: { + messages: [], + users: {}, + postStats: {}, + notes: [], + mentions: {}, + }, + })); + + getTrending24h(`sidebar_trending_${APP_ID}`); + getMostZapped4h(`sidebar_zapped_${APP_ID}`); + } + }); + + const processNotes = (type: string, key: string, content: NostrEventContent | undefined) => { + + const sort = sortingPlan(key); + + if (type === 'EOSE') { + const newPosts = sort(convertToNotes({ + users: data[key].users, + messages: data[key].messages, + postStats: data[key].postStats, + mentions: data[key].mentions, + })); + + setData(key, 'notes', () => [ ...newPosts ]); + + setInit(true); + return; + } + + if (type === 'EVENT') { + if (content && content.kind === Kind.Metadata) { + setData(key, 'users', (users) => ({ ...users, [content.pubkey]: content})) + } + if (content && (content.kind === Kind.Text || content.kind === Kind.Repost)) { + setData(key, 'messages', (msgs) => [ ...msgs, content]); + } + if (content && content.kind === Kind.NoteStats) { + const stat = JSON.parse(content.content); + setData(key, 'postStats', (stats) => ({ ...stats, [stat.event_id]: stat })) + } + if (content && content.kind === Kind.Mentions) { + const mentionContent = content as NostrMentionContent; + const mention = JSON.parse(mentionContent.content); + + setData(key, 'mentions', + (mentions) => ({ ...mentions, [mention.id]: { ...mention } }) + ); + return; + } + } + }; + +// SOCKET HANDLERS ------------------------------ + + const onSocketClose = (closeEvent: CloseEvent) => { + const webSocket = closeEvent.target as WebSocket; + + webSocket.removeEventListener('message', onMessage); + webSocket.removeEventListener('close', onSocketClose); + }; + + const onMessage = (event: MessageEvent) => { + const message: NostrEvent | NostrEOSE = JSON.parse(event.data); + + const [type, subId, content] = message; + + if (subId === `sidebar_trending_${APP_ID}`) { + processNotes(type, 'trending', content); + return; + } + if (subId === `sidebar_zapped_${APP_ID}`) { + processNotes(type, 'mostzapped', content); + return; + } + }; + + return ( +
+
+
+
+ {intl.formatMessage({ + id: 'home.sidebar.caption.trending', + defaultMessage: 'Trending', + description: 'Caption for the home page sidebar showing a list of trending notes', + })} + + {intl.formatNumber(24, hourNarrow)} + +
+
+ + + {(note) => } + + +
+
+
+ {intl.formatMessage({ + id: 'home.sidebar.caption.mostzapped', + defaultMessage: 'Most Zapped', + description: 'Caption for the home page sidebar showing a list of most zapped notes', + })} + + {intl.formatNumber(4, hourNarrow)} + +
+
+ + { + (note) => + + {intl.formatMessage({ + id: 'home.sidebar.note.zaps', + defaultMessage: '{zaps} zaps, {sats} sats', + description: 'Zaps data for a small note on home sidebar', + }, + { + zaps: humanizeNumber(note.post.zaps, true), + sats: humanizeNumber(note.post.satszapped, true), + })} + + } + +
+ ); +} + +export default HomeSidebar; diff --git a/src/components/Layout/Layout.module.scss b/src/components/Layout/Layout.module.scss new file mode 100644 index 0000000..9c6727d --- /dev/null +++ b/src/components/Layout/Layout.module.scss @@ -0,0 +1,202 @@ +.container { + width: 1240px; + // height: 100vh; + margin: 0px auto; + + display: grid; + grid-template-columns: 176px 640px 300px; + grid-column-gap: 32px; +} + +.leftColumn { + + >div { + position: fixed; + width: 176px; + display: grid; + grid-template-rows: 128px 1fr 82px; + height: 100%; + } + + .leftHeader { + height: 128px; + display: grid; + align-items: center; + justify-content: right; + } + + .leftContent { + display: grid; + height: 100%; + justify-content: right; + } + + .leftFooter { + height: 82px; + display: flex; + justify-content: flex-end; + } +} + + +.centerColumn { + display: grid; + grid-template-rows: 128px 1fr; + position: relative; +} + +.centerHeader { + width: 640px; +} + +.centerContent { + width: 640px; + .headerFloater { + position: fixed; + opacity: 0; + pointer-events: none; + width: 640px; + z-index: var(--z-index-floater); + + &.animatedShow { + opacity: 1; + transition: opacity 0.5s ease; + pointer-events: all; + } + } +} + +.rightColumn { + display: grid; + width: 300px; + grid-template-rows: 128px 1fr; + grid-row-gap: 28px; +} + +.rightHeader { + height: 128px; + display: grid; + align-items: center; + justify-content: left; + position: fixed; + // background-color: var(--background-site); + z-index: var(--z-index-header); +} + +.rightContent { + margin-top: 128px; +} + +.modal { + position: fixed; + z-index: 1200; +} + +.preload { + width: 0px; + height: 0px; + position: absolute; + top:0; + left:0; +} + +@media only screen and (max-width: 1300px) { + .container { + width: 1032px; + grid-template-columns: 48px 640px 300px; + } + + .leftColumn { + >div { + position: fixed; + width: 48px; + } + } + + .rightColumn { + width: 300px; + } +} + +@media only screen and (max-width: 1087px) { + .container { + width: 720px; + grid-template-columns: 48px 640px; + } + + .rightColumn { + display: none; + } +} + +@media only screen and (max-width: 720px) { + .container { + width: 100%; + // height: 100vh; + grid-template-columns: 1fr; + grid-template-rows: 1fr 48px; + grid-template-areas: "content" "footer"; + } + + .centerColumn { + grid-area: content; + width: 100%; + } + + .centerHeader { + width: 100%; + } + + .centerContent { + width: 100%; + + .headerFloater { + width: 100%; + } + } + + .leftColumn { + position: fixed; + left: 0px; + bottom: 0px; + width: 100%; + grid-area: footer; + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + z-index: 20; + background-color: var(--background-site); + + >div { + position: relative; + height: 48px; + } + + .leftHeader { + display: none; + } + + .leftContent { + display: flex; + width: 100%; + } + + .leftFooter { + display: none; + } + + >div { + position: relative; + width: 100%; + } + } + + .rightColumn { + display: none; + } + + // body { + // overflow-x: hidden; + // } +} diff --git a/src/components/Layout/Layout.tsx b/src/components/Layout/Layout.tsx new file mode 100644 index 0000000..a93b027 --- /dev/null +++ b/src/components/Layout/Layout.tsx @@ -0,0 +1,112 @@ +import { Component, createEffect, onCleanup, onMount } from 'solid-js'; + +import styles from './Layout.module.scss'; + +import { Outlet } from '@solidjs/router'; +import NavMenu from '../NavMenu/NavMenu'; +import ProfileWidget from '../ProfileWidget/ProfileWidget'; +import NewNote from '../NewNote/NewNote'; +import { useAccountContext } from '../../contexts/AccountContext'; +import zapSM from '../../assets/lottie/zap_sm.json'; +import zapMD from '../../assets/lottie/zap_md.json'; + + +const Layout: Component = () => { + + const account = useAccountContext(); + + let container: HTMLDivElement | undefined; + + createEffect(() => { + const newNote = document.getElementById('new_note_input'); + const newNoteTextArea = document.getElementById('new_note_text_area') as HTMLTextAreaElement; + + if (account?.showNewNoteForm) { + newNote?.classList.add(styles.animatedShow); + newNoteTextArea?.focus(); + } + else { + newNote?.classList.remove(styles.animatedShow); + newNoteTextArea.value = ''; + } + }); + + const onResize = () => { + container?.style.setProperty('height', `${window.innerHeight}px`); + }; + + onMount(() => { + window.addEventListener('resize', onResize); + }); + + onCleanup(() => { + window.removeEventListener('resize', onResize); + }); + + return ( + <> +
+
+
+
+
+
+
+ + + + +
+ +
+
+
+
+
+ +
+ +
+ +
+ +
+
+
+ + +
+
+
+ +
+ +
+ +
+
+
+ + +
+
+
+
+
+
+ +
+
+
+ + ) +} + +export default Layout; diff --git a/src/components/LinkPreview/LinkPreview.module.scss b/src/components/LinkPreview/LinkPreview.module.scss new file mode 100644 index 0000000..da1f7b7 --- /dev/null +++ b/src/components/LinkPreview/LinkPreview.module.scss @@ -0,0 +1,23 @@ +.linkPreview { + width: 100%; + text-decoration: none; + color: var(--text-tertiary-2); + font-size: 16px; + font-weight: 400; + line-height: 22px; + text-align: left; +} + +.previewInfo { + padding-inline: 14px; + padding-block: 9px; +} + +.previewImage { + overflow: hidden; + max-height: 250px; +} + +.previewTitle { + color: var(--text-primary); +} diff --git a/src/components/LinkPreview/LinkPreview.tsx b/src/components/LinkPreview/LinkPreview.tsx new file mode 100644 index 0000000..14c8202 --- /dev/null +++ b/src/components/LinkPreview/LinkPreview.tsx @@ -0,0 +1,36 @@ +import { A, useLocation, useNavigate } from '@solidjs/router'; +import { Component, Show } from 'solid-js'; + +import styles from './LinkPreview.module.scss'; + +const LinkPreview: Component<{ preview: any }> = (props) => { + + return ( + + +
+ +
+
+ +
+ +
{props.preview.url}
+
+ + +
{props.preview.title}
+
+ + +
{props.preview.description}
+
+
+
+ ); +} + +export default LinkPreview; diff --git a/src/components/Loader/Loader.module.scss b/src/components/Loader/Loader.module.scss new file mode 100644 index 0000000..e0a9d54 --- /dev/null +++ b/src/components/Loader/Loader.module.scss @@ -0,0 +1,51 @@ +.loader { + height: 32px; + width: 32px; +} +.loader span { + display: block; + position: absolute; + top: 0; left: 0; + bottom: 0; right: 0; + margin: auto; + height: 32px; + width: 32px; +} + +.loader span::before, +.loader span::after { + content: ""; + display: block; + position: absolute; + top: 0; left: 0; + bottom: 0; right: 0; + margin: auto; + height: 32px; + width: 32px; + border: 2px solid var(--brand-1); + border-radius: 50%; + opacity: 0; + -webkit-animation: loader-1 1.5s cubic-bezier(0.075, 0.820, 0.165, 1.000) infinite; + animation: loader-1 1.5s cubic-bezier(0.075, 0.820, 0.165, 1.000) infinite; +} +@-webkit-keyframes loader-1 { + 0% { -webkit-transform: translate3d(0, 0, 0) scale(0); opacity: 1; } + 100% { -webkit-transform: translate3d(0, 0, 0) scale(1.5); opacity: 0; } +} +@keyframes loader-1 { + 0% { transform: translate3d(0, 0, 0) scale(0); opacity: 1; } + 100% { transform: translate3d(0, 0, 0) scale(1.5); opacity: 0; } +} + +// .loader span::after { +// -webkit-animation: loader-2 1.5s cubic-bezier(0.075, 0.820, 0.165, 1.000) .25s infinite; +// animation: loader-2 1.5s cubic-bezier(0.075, 0.820, 0.165, 1.000) .25s infinite; +// } +// @-webkit-keyframes loader-2 { +// 0% { -webkit-transform: translate3d(0, 0, 0) scale(0); opacity: 1; } +// 100% { -webkit-transform: translate3d(0, 0, 0) scale(1); opacity: 0; } +// } +// @keyframes loader-2 { +// 0% { transform: translate3d(0, 0, 0) scale(0); opacity: 1; } +// 100% { transform: translate3d(0, 0, 0) scale(1); opacity: 0; } +// } diff --git a/src/components/Loader/Loader.tsx b/src/components/Loader/Loader.tsx new file mode 100644 index 0000000..7741ae9 --- /dev/null +++ b/src/components/Loader/Loader.tsx @@ -0,0 +1,12 @@ +import { Component } from 'solid-js'; + +import styles from './Loader.module.scss'; + +const Loader: Component = () => { + + return ( +
+ ); +} + +export default Loader; diff --git a/src/components/MissingPage/MissingPage.module.scss b/src/components/MissingPage/MissingPage.module.scss new file mode 100644 index 0000000..74d8360 --- /dev/null +++ b/src/components/MissingPage/MissingPage.module.scss @@ -0,0 +1,21 @@ +.fullHeader { + display: grid; + height: 120px; + align-items: center; + justify-content: left; + + >div { + font-weight: 300; + font-size: 32px; + line-height: 34px; + color: var(--brand-text); + text-transform: lowercase; + } +} + +.comingSoon { + font-weight: 300; + font-size: 18px; + line-height: 34px; + color: var(--text-secondary); +} diff --git a/src/components/MissingPage/MissingPage.tsx b/src/components/MissingPage/MissingPage.tsx new file mode 100644 index 0000000..5b488a5 --- /dev/null +++ b/src/components/MissingPage/MissingPage.tsx @@ -0,0 +1,51 @@ +import { useIntl } from '@cookbook/solid-intl'; +import { Component, JSXElement, Show } from 'solid-js'; +import { placeholders as t } from '../../translations'; +import Branding from '../Branding/Branding'; +import Search from '../Search/Search'; +import Wormhole from '../Wormhole/Wormhole'; +import styles from './MissingPage.module.scss'; + + +const MissingPage: Component<{ title: string, children?: JSXElement }> = (props) => { + + const intl = useIntl(); + + return ( + <> + + + + + + + + +
+
+ {intl.formatMessage( + t.pageWIPTitle, + { title: props.title }, + )} +
+
+ + + {intl.formatMessage(t.comingSoon)} + + } + > +
+ {props.children} +
+
+ + ) +} + +export default MissingPage; diff --git a/src/components/Modal/Modal.module.scss b/src/components/Modal/Modal.module.scss new file mode 100644 index 0000000..f5e6042 --- /dev/null +++ b/src/components/Modal/Modal.module.scss @@ -0,0 +1,8 @@ +.modal { + background-color: var(--background-modal); + width: 100vw; + height:100vh; + display: flex; + align-items: center; + justify-content: center; +} diff --git a/src/components/Modal/Modal.tsx b/src/components/Modal/Modal.tsx new file mode 100644 index 0000000..7374fbd --- /dev/null +++ b/src/components/Modal/Modal.tsx @@ -0,0 +1,19 @@ +import { Component, JSXElement, Show } from 'solid-js'; +import { Portal } from 'solid-js/web'; + +import styles from './Modal.module.scss'; + +const Modal: Component<{ children: JSXElement, open?: boolean}> = (props) => { + + return ( + + +
+ {props.children} +
+
+
+ ); +} + +export default Modal; diff --git a/src/components/NavLink/NavLink.module.scss b/src/components/NavLink/NavLink.module.scss new file mode 100644 index 0000000..a2185a0 --- /dev/null +++ b/src/components/NavLink/NavLink.module.scss @@ -0,0 +1,148 @@ +@mixin iconNav { + width: 32px; + height: 32px; + background-color: var(--text-secondary); +} + +.navLink { + position: relative; + text-align: right; + margin: 0px 0px 28px 0px; + padding: 0px; + background: none; + border: none; + border-radius: 0px; + + div { + display: inline; + } + + p { + display: inline; + text-transform: uppercase; + font-size: 18px; + line-height: 20px; + font-weight: 800; + } +} + +.homeIcon { + @include iconNav; + -webkit-mask: url(../../assets/icons/home.svg) no-repeat center; + mask: url(../../assets/icons/home.svg) no-repeat center; +} + +.exploreIcon { + @include iconNav; + -webkit-mask: url(../../assets/icons/explore.svg) no-repeat center; + mask: url(../../assets/icons/explore.svg) no-repeat center; +} +.messagesIcon { + @include iconNav; + -webkit-mask: url(../../assets/icons/messages.svg) no-repeat center; + mask: url(../../assets/icons/messages.svg) no-repeat center; +} +.notificationsIcon { + @include iconNav; + -webkit-mask: url(../../assets/icons/notifications.svg) no-repeat center; + mask: url(../../assets/icons/notifications.svg) no-repeat center; +} +.downloadIcon { + @include iconNav; + -webkit-mask: url(../../assets/icons/download.svg) no-repeat center; + mask: url(../../assets/icons/download.svg) no-repeat center; +} +.settingsIcon { + @include iconNav; + -webkit-mask: url(../../assets/icons/settings.svg) no-repeat center; + mask: url(../../assets/icons/settings.svg) no-repeat center; +} +.helpIcon { + @include iconNav; + -webkit-mask: url(../../assets/icons/help.svg) no-repeat center; + mask: url(../../assets/icons/help.svg) no-repeat center; +} + +.active { + p { + color: var(--active-link); + text-decoration: underline; + } + div { + background-color: var(--active-link); + } + + .homeIcon { + background-color: var(--text-primary); + } + .exploreIcon { + background-color: var(--text-primary); + } + .messagesIcon { + background-color: var(--text-primary); + } + .notificationsIcon { + background-color: var(--text-primary); + } + .downloadIcon { + background-color: var(--text-primary); + } + .settingsIcon { + background-color: var(--text-primary); + } + .helpIcon { + background-color: var(--text-primary); + } +} + +.inactive { + p { + color: var(--inactive-link); + } + div { + background-color: var(--inactive-link); + } +} + +@media only screen and (max-width: 1300px) { + .navLink { + margin-bottom: 22px; + + width: fit-content; + div { + display: inline-block; + } + + p { + display: none; + } + } +} + +.bubble { + position: absolute; + text-align: center; + padding-top: 2px; + padding-inline: 4px; + top: 0; + right: -18px; + min-width: 18px; + min-height: 18px; + border-radius: 8px; + font-weight: 500; + font-size: 12px; + line-height: 12px; + + background: var(--brand-gradient); + border: 1px solid var(--background-site); + + color: white; + text-shadow: 0.5px 0.5px 0px black; + + &.doubleSize { + right: -24px; + } + &.tripleSize { + right: -30px; + } +} diff --git a/src/components/NavLink/NavLink.tsx b/src/components/NavLink/NavLink.tsx new file mode 100644 index 0000000..0bc005d --- /dev/null +++ b/src/components/NavLink/NavLink.tsx @@ -0,0 +1,51 @@ +import { A, useLocation, useNavigate } from '@solidjs/router'; +import { Component, Show } from 'solid-js'; + +import styles from './NavLink.module.scss'; + +const NavLink: Component<{ to: string, label: string, icon: string, bubble?: () => number}> = (props) => { + + const navigate = useNavigate(); + const location = useLocation(); + + const shouldScroll = () => props.to === location.pathname; + + const onClick = (e: Event) => { + if (shouldScroll()) { + e.preventDefault(); + + window.scrollTo({ top: 0, left: 0, behavior: 'smooth' }); + return; + } + + navigate('/home'); + } + + const bubbleClass = () => { + if (!props.bubble || props.bubble() < 10) { + return ''; + } + + if (props.bubble() < 100) { + return styles.doubleSize; + } + + return styles.tripleSize; + } + + return ( + + ) +} + +export default NavLink; diff --git a/src/components/NavMenu/NavMenu.module.scss b/src/components/NavMenu/NavMenu.module.scss new file mode 100644 index 0000000..c1dd630 --- /dev/null +++ b/src/components/NavMenu/NavMenu.module.scss @@ -0,0 +1,43 @@ +.sideNav { + display: flex; + flex-direction: column; + + > div { + margin-bottom: 28px; + } +} + +.callToAction { + display: grid; + justify-content: right; + margin-top: 15px; +} + +@media only screen and (max-width: 720px) { + .navMenu { + width: 100%; + } + + .sideNav { + display: flex; + flex-direction: row; + justify-content: space-around; + align-items: flex-end; + width: 100%; + height: 48px; + + > button { + margin-bottom: 0px; + } + + button:nth-child(n+5) { + display: none; + } + } + + .callToAction { + position: fixed; + bottom: 56px; + right: 24px; + } +} diff --git a/src/components/NavMenu/NavMenu.tsx b/src/components/NavMenu/NavMenu.tsx new file mode 100644 index 0000000..66d2043 --- /dev/null +++ b/src/components/NavMenu/NavMenu.tsx @@ -0,0 +1,79 @@ +import { useIntl } from '@cookbook/solid-intl'; +import { useLocation } from '@solidjs/router'; +import { Component, For, Show } from 'solid-js'; +import { useAccountContext } from '../../contexts/AccountContext'; +import { useMessagesContext } from '../../contexts/MessagesContext'; +import { useNotificationsContext } from '../../contexts/NotificationsContext'; +import { navBar as t } from '../../translations'; +import NavLink from '../NavLink/NavLink'; +import FloatingNewPostButton from '../FloatingNewPostButton/FloatingNewPostButton'; + +import styles from './NavMenu.module.scss'; + +const NavMenu: Component = () => { + const account = useAccountContext(); + const notifications = useNotificationsContext(); + const messages = useMessagesContext(); + const intl = useIntl(); + const loc = useLocation(); + + const links = [ + { + to: '/home', + label: intl.formatMessage(t.home), + icon: 'homeIcon', + }, + { + to: '/explore', + label: intl.formatMessage(t.explore), + icon: 'exploreIcon', + }, + { + to: '/messages', + label: intl.formatMessage(t.messages), + icon: 'messagesIcon', + bubble: () => messages?.messageCount || 0, + }, + { + to: '/notifications', + label: intl.formatMessage(t.notifications), + icon: 'notificationsIcon', + bubble: () => notifications?.notificationCount || 0, + }, + { + to: '/downloads', + label: intl.formatMessage(t.downloads), + icon: 'downloadIcon', + }, + { + to: '/settings', + label: intl.formatMessage(t.settings), + icon: 'settingsIcon', + }, + { + to: '/help', + label: intl.formatMessage(t.help), + icon: 'helpIcon', + }, + ]; + + return ( +
+ + +
+ +
+
+
+ ) +} + +export default NavMenu; diff --git a/src/components/NewNote/EditBox/EditBox.module.scss b/src/components/NewNote/EditBox/EditBox.module.scss new file mode 100644 index 0000000..9f48742 --- /dev/null +++ b/src/components/NewNote/EditBox/EditBox.module.scss @@ -0,0 +1,320 @@ +.noteEditBox { + position: relative; +} + +.newNoteHolder { + min-height: 100px; + max-height: 100vh; + background-color: var(--background-site); + padding-top: 10px; +} + +.holderBottomBorder { + width: 100%; + height: 4px; + display: flex; + justify-content: space-between; + + .rightCorner { + display: inline-block; + width: 4px; + height: 4px; + + background-color: var(--background-site); + -webkit-mask: url(../../assets/icons/corner_right.svg) no-repeat center; + mask: url(../../assets/icons/corner_right.svg) no-repeat center; + } + .leftCorner { + display: inline-block; + width: 4px; + height: 4px; + + background-color: var(--background-site); + -webkit-mask: url(../../assets/icons/corner_left.svg) no-repeat center; + mask: url(../../assets/icons/corner_left.svg) no-repeat center; + } +} + +.newNoteBorder { + width: 100%; + height: 100%; + padding: 1px; + background: var(--brand-gradient); + border-radius: 6px; + display: block; + position: relative; +} + +.newNote { + width: 100%; + height: 100%; + min-height: 122px; + font-size: 18px; + line-height: 20px; + margin: 0px; + border-radius: 6px; + border: none; + color: var(--text-tertiary); + background-color: var(--background-site); + padding-bottom: 11px; + display: grid; + grid-template-columns: 92px 1fr; + + .leftSide { + padding: 20px; + } + +} + +.controls { + position: absolute; + bottom: 4px; + right: 15px; + display: flex; + align-items: center; + justify-content: flex-end; + width: calc(100% - 16px); + // border: solid 1px red; + padding-top: 8px; + background-color: var(--background-site); + >button { + width: 80px; + height: 28px; + min-width: 80px; + margin: 0px 0px 11px 8px; + } + .editorOptions { + width: 100%; + // padding-left: 80px; + + .attachIcon { + width: 26px; + height: 21px; + display: inline-block; + margin-right: 9px; + background-color: var(--text-tertiary); + cursor: pointer; + + &:hover { + background-color: var(--text-secondary); + } + } + + } + +} + +.primaryButton { + border: none; + border-radius: 6px; + margin: 0px 8px; + padding: 0px; + font-size: 14px; + line-height: 20px; + font-weight: 700; + background: var(--brand-gradient-vertical); + color: white; + >span { + opacity: 0.75; + } +} + + +.secondaryButton { + border: none; + border-radius: 6px; + padding: 1px; + font-size: 14px; + line-height: 20px; + font-weight: 700; + background: var(--brand-gradient-vertical); + color: var(--text-tertiary-2); + >div { + width: 100%; + height: 100%; + vertical-align: middle; + border-radius: 6px; + background-color: var(--background-card); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + } +} + +.searchSuggestions { + width: 300px; + background-color: var(--background-site); + border: 1px solid var(--text-tertiary-2); + // box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.8); + border-radius: 4px; + + position: absolute; + top: 0px; + left: 0px; + z-index: var(--z-index-floater); +} + +.highlight { + color: var(--accent-1); +} + +.userReference { + color: var(--accent-1); + &:hover { + text-decoration: underline; + } +} + +textarea { + width: calc(100% - 18px); + max-height: calc(100vh / 3); + margin: 18px 18px 36px 0px; + padding: 0px; + box-sizing: padding-box; + border: none; + border-radius: 0px; + background-color: unset; + font-size: 16px; + line-height: 20px; + font-weight: 400; + color: var(--text-primary); + resize: none; + scrollbar-width: none; /* Firefox */ + + &:focus { + border: none; + outline: none; + } +} + +textarea::-webkit-scrollbar{ + display: none; /* Safari and Chrome */ + } + +.error { + color: var(--brand-1); +} + +.editorWrap { + display: flex; + flex-direction: column; + flex: 1; + cursor: text; + // max-height: calc(100vh - 7px); +} + +.previewCaption { + color: var(--subtile-devider); + font-weight: 400; + font-size: 10px; + line-height: 16px; + text-transform: uppercase; +} + +.editorScroll { + min-height: 60px; + max-height: calc(60vh - 70px); + overflow-y: scroll; + margin-bottom: 48px; + + scrollbar-width: none; /* Firefox */ + +} + +.editorScroll::-webkit-scrollbar { + display: none; /* Safari and Chrome */ +} + +.editor { + max-width: calc(100% - 14px); + min-height: 60px; + outline: 0px solid transparent; + word-wrap: break-word; + word-break: break-all; + font-size: 16px; + line-height: 20px; + font-weight: 400; + color: var(--text-primary); + margin: 0px 14px 32px 0px; + padding: 0px; + background-color: var(--background-card); + border-radius: 4px; + padding: 12px; +} + + +.emojiSuggestions { + position: absolute; + display: grid; + grid-template-columns: 50px 50px 50px 50px 50px 50px; + width: 322px; + max-height: 200px; + overflow-y: scroll; + padding: 4px; + background-color: var(--background-site); + border: 1px solid var(--text-tertiary-2); + // box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.8); + border-radius: 8px; + + top: 0px; + left: 0px; + z-index: var(--z-index-floater); + + .emojiOption { + margin-bottom: 5px; + padding: 2px; + background: none; + font-size: 16px; + line-height: 20px; + font-weight: 400; + border: none; + display: flex; + justify-content: center; + align-items: center; + + &:hover, &.highlight { + background-color: var(--text-tertiary-2); + } + + &:focus { + outline: none; + border: none; + } + } +} + +.uploadLoader { + position: absolute; + pointer-events: none; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: var(--background-site); + opacity: 0.8; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + color: var(--text-secondary); + > div { + position: relative; + min-height: 48px; + } +} + +.dropOverlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: var(--background-site); + opacity: 0.8; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + color: var(--text-secondary); +} diff --git a/src/components/NewNote/EditBox/EditBox.tsx b/src/components/NewNote/EditBox/EditBox.tsx new file mode 100644 index 0000000..ac20bdb --- /dev/null +++ b/src/components/NewNote/EditBox/EditBox.tsx @@ -0,0 +1,1163 @@ +import { useIntl } from "@cookbook/solid-intl"; +import { Router, useLocation } from "@solidjs/router"; +import { nip19 } from "nostr-tools"; +import { Component, createEffect, createSignal, For, onCleanup, onMount, Show } from "solid-js"; +import { createStore } from "solid-js/store"; +import { noteRegex, profileRegex, Kind, editMentionRegex, emojiSearchLimit } from "../../../constants"; +import { useAccountContext } from "../../../contexts/AccountContext"; +import { useSearchContext } from "../../../contexts/SearchContext"; +import { TranslatorProvider } from "../../../contexts/TranslatorContext"; +import { getEvents } from "../../../lib/feed"; +import { parseNote1, sanitize, sendNote, replaceLinkPreviews } from "../../../lib/notes"; +import { getUserProfiles } from "../../../lib/profile"; +import { subscribeTo } from "../../../sockets"; +import { subscribeTo as uploadSub } from "../../../uploadSocket"; +import { convertToNotes, referencesToTags } from "../../../stores/note"; +import { convertToUser, nip05Verification, truncateNpub, userName } from "../../../stores/profile"; +import { EmojiOption, FeedPage, NostrMediaUploaded, NostrMentionContent, NostrNoteContent, NostrStatsContent, NostrUserContent, PrimalNote, PrimalUser } from "../../../types/primal"; +import { debounce, isVisibleInContainer, uuidv4 } from "../../../utils"; +import Avatar from "../../Avatar/Avatar"; +import EmbeddedNote from "../../EmbeddedNote/EmbeddedNote"; +import MentionedUserLink from "../../Note/MentionedUserLink/MentionedUserLink"; +import SearchOption from "../../Search/SearchOption"; +import { useToastContext } from "../../Toaster/Toaster"; +import styles from './EditBox.module.scss'; +import emojiSearch from '@jukben/emoji-search'; +import { getCaretCoordinates } from "../../../lib/textArea"; +import { uploadMedia } from "../../../lib/media"; +import { APP_ID } from "../../../App"; +import Loader from "../../Loader/Loader"; +import { + toast as tToast, + feedback as tFeedback, + note as tNote, + search as tSearch, + actions as tActions, +} from "../../../translations"; + +type AutoSizedTextArea = HTMLTextAreaElement & { _baseScrollHeight: number }; + + +const EditBox: Component<{ replyToNote?: PrimalNote, onClose?: () => void, idPrefix?: string } > = (props) => { + + const intl = useIntl(); + + const instanceId = uuidv4(); + + const search = useSearchContext(); + const account = useAccountContext(); + const toast = useToastContext(); + + let textArea: HTMLTextAreaElement | undefined; + let textPreview: HTMLDivElement | undefined; + let mentionOptions: HTMLDivElement | undefined; + let emojiOptions: HTMLDivElement | undefined; + let editWrap: HTMLDivElement | undefined; + let fileUpload: HTMLInputElement | undefined; + + let mentionCursorPosition = { top: 0, left: 0, height: 0 }; + let emojiCursorPosition = { top: 0, left: 0, height: 0 }; + + const [isMentioning, setMentioning] = createSignal(false); + const [preQuery, setPreQuery] = createSignal(''); + const [query, setQuery] = createSignal(''); + + const [message, setMessage] = createSignal(''); + const [parsedMessage, setParsedMessage] = createSignal(''); + + const [isEmojiInput, setEmojiInput] = createSignal(false); + const [emojiQuery, setEmojiQuery] = createSignal(''); + const [emojiResults, setEmojiResults] = createStore([]); + + const [userRefs, setUserRefs] = createStore>({}); + const [noteRefs, setNoteRefs] = createStore>({}); + + const [highlightedUser, setHighlightedUser] = createSignal(0); + const [highlightedEmoji, setHighlightedEmoji] = createSignal(0); + const [referencedNotes, setReferencedNotes] = createStore>(); + + const location = useLocation(); + + let currentPath = location.pathname; + + const getScrollHeight = (elm: AutoSizedTextArea) => { + var savedValue = elm.value + elm.value = '' + elm._baseScrollHeight = elm.scrollHeight + elm.value = savedValue + } + + const onExpandableTextareaInput: (event: InputEvent) => void = (event) => { + const maxHeight = document.documentElement.clientHeight || window.innerHeight || 0; + + const elm = textArea as AutoSizedTextArea; + const preview = textPreview; + + if(elm.nodeName !== 'TEXTAREA' || elm.id !== `${prefix()}new_note_text_area` || !preview) { + return; + } + + const minRows = parseInt(elm.getAttribute('data-min-rows') || '0'); + + !elm._baseScrollHeight && getScrollHeight(elm); + + + if (elm.scrollHeight >= (maxHeight / 3)) { + return; + } + + elm.rows = minRows; + const rows = Math.ceil((elm.scrollHeight - elm._baseScrollHeight) / 20); + elm.rows = minRows + rows; + + const rect = elm.getBoundingClientRect(); + + preview.style.maxHeight = `${maxHeight - rect.height - 120}px`; + } + + createEffect(() => { + if (emojiQuery().length > emojiSearchLimit) { + setEmojiResults(() => emojiSearch(emojiQuery())); + } + }); + + + createEffect(() => { + if (isEmojiInput() && emojiQuery().length > emojiSearchLimit) { + emojiPositionOptions(); + } + }); + + const onKeyDown = (e: KeyboardEvent) => { + if (!textArea) { + return false; + } + + if (isUploading()) { + return; + } + + const mentionSeparators = ['Enter', 'Space', 'Comma']; + + if (e.code === 'Enter' && e.metaKey) { + e.preventDefault(); + postNote(); + return false; + } + + if (!isMentioning() && !isEmojiInput() && e.key === ':') { + emojiCursorPosition = getCaretCoordinates(textArea, textArea.selectionStart); + setEmojiInput(true); + return false; + } + + if (isEmojiInput()) { + + if (e.code === 'ArrowDown') { + e.preventDefault(); + setHighlightedEmoji(i => { + if (emojiResults.length === 0) { + return 0; + } + + return i < emojiResults.length - 7 ? i + 6 : 0; + }); + + const emojiHolder = document.getElementById(`${instanceId}-${highlightedEmoji()}`); + + if (emojiHolder && emojiOptions && !isVisibleInContainer(emojiHolder, emojiOptions)) { + emojiHolder.scrollIntoView({ block: 'end', behavior: 'smooth' }); + } + + return false; + } + + if (e.code === 'ArrowUp') { + e.preventDefault(); + setHighlightedEmoji(i => { + if (emojiResults.length === 0) { + return 0; + } + + return i >= 6 ? i - 6 : emojiResults.length - 1; + }); + + const emojiHolder = document.getElementById(`${instanceId}-${highlightedEmoji()}`); + + if (emojiHolder && emojiOptions && !isVisibleInContainer(emojiHolder, emojiOptions)) { + emojiHolder.scrollIntoView({ block: 'start', behavior: 'smooth' }); + } + + return false; + } + + if (e.code === 'ArrowRight') { + e.preventDefault(); + setHighlightedEmoji(i => { + if (emojiResults.length === 0) { + return 0; + } + + return i < emojiResults.length - 1 ? i + 1 : 0; + }); + + const emojiHolder = document.getElementById(`${instanceId}-${highlightedEmoji()}`); + + if (emojiHolder && emojiOptions && !isVisibleInContainer(emojiHolder, emojiOptions)) { + emojiHolder.scrollIntoView({ block: 'end', behavior: 'smooth' }); + } + + return false; + } + + if (e.code === 'ArrowLeft') { + e.preventDefault(); + setHighlightedEmoji(i => { + if (emojiResults.length === 0) { + return 0; + } + + return i > 0 ? i - 1 : emojiResults.length - 1; + }); + + const emojiHolder = document.getElementById(`${instanceId}-${highlightedEmoji()}`); + + if (emojiHolder && emojiOptions && !isVisibleInContainer(emojiHolder, emojiOptions)) { + emojiHolder.scrollIntoView({ block: 'start', behavior: 'smooth' }); + } + + return false; + } + + if (mentionSeparators.includes(e.code)) { + if (emojiQuery().trim().length === 0) { + setEmojiInput(false); + return false; + } + e.preventDefault(); + selectEmoji(emojiResults[highlightedEmoji()]); + setHighlightedEmoji(0); + return false; + } + + const cursor = textArea.selectionStart; + const lastEmojiTrigger = textArea.value.slice(0, cursor).lastIndexOf(':'); + + if (e.code === 'Backspace') { + setEmojiQuery(emojiQuery().slice(0, -1)); + + if (lastEmojiTrigger < 0 || cursor - lastEmojiTrigger <= 1) { + setEmojiInput(false); + return false; + } + } else { + setEmojiQuery(q => q + e.key); + return false; + } + + return false; + } + + if (!isMentioning() && e.key === '@') { + mentionCursorPosition = getCaretCoordinates(textArea, textArea.selectionStart); + setPreQuery(''); + setQuery(''); + setMentioning(true); + return false; + } + + if (!isMentioning() && e.code === 'Backspace' && textArea) { + let cursor = textArea.selectionStart; + const textSoFar = textArea.value.slice(0, cursor); + const lastWord = textSoFar.split(/[\s,;\n\r]/).pop(); + + if (lastWord?.startsWith('@`')) { + const index = textSoFar.lastIndexOf(lastWord); + + const newText = textSoFar.slice(0, index) + textArea.value.slice(cursor); + + setMessage(newText); + textArea.value = newText; + + textArea.selectionEnd = index; + } + } + + if (isMentioning()) { + + if (e.code === 'ArrowDown') { + e.preventDefault(); + setHighlightedUser(i => { + if (!search?.users || search.users.length === 0) { + return 0; + } + + return i < search.users.length - 1 ? i + 1 : 0; + }); + return false; + } + + if (e.code === 'ArrowUp') { + e.preventDefault(); + setHighlightedUser(i => { + if (!search?.users || search.users.length === 0) { + return 0; + } + + return i > 0 ? i - 1 : search.users.length - 1; + }); + return false; + } + + if (mentionSeparators.includes(e.code)) { + if (preQuery() === ' ') { + setMentioning(false); + return false; + } + e.preventDefault(); + search?.users && selectUser(search.users[highlightedUser()]) + setMentioning(false); + return false; + } + + const cursor = textArea.selectionStart; + const lastMentionTrigger = textArea.value.slice(0, cursor).lastIndexOf('@'); + + if (e.code === 'Backspace') { + setPreQuery(preQuery().slice(0, -1)); + + if (lastMentionTrigger < 0 || cursor - lastMentionTrigger <= 1) { + setMentioning(false); + return false; + } + } else { + setPreQuery(q => q + e.key); + return false + } + + return false; + } + + return true; + }; + + const [isDroppable, setIsDroppable] = createSignal(false); + + const onDrop = (e: DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + + setIsDroppable(false); + + let draggedData = e.dataTransfer; + let file = draggedData?.files[0]; + + + file && isSupportedFileType(file) && uploadFile(file); + + }; + + const onDragOver = (e: DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + + setIsDroppable(true); + } + + const onDragLeave = (e: DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + + if (!editWrap) { + return; + } + + const rect = editWrap.getBoundingClientRect(); + + const isWider = e.clientX < rect.x || e.clientX > rect.x + rect.width; + const isTaller = e.clientY < rect.y || e.clientY > rect.y + rect.height; + + (isWider || isTaller) && setIsDroppable(false); + } + + const onPaste = (e:ClipboardEvent) => { + if (e.clipboardData?.files && e.clipboardData.files.length > 0) { + e.preventDefault(); + const file = e.clipboardData.files[0]; + file && isSupportedFileType(file) && uploadFile(file); + return false; + } + } + + onMount(() => { + // @ts-expect-error TODO: fix types here + editWrap?.addEventListener('input', onExpandableTextareaInput); + editWrap?.addEventListener('keydown', onKeyDown); + // editWrap?.addEventListener('drop', onDrop, false); + }); + + onCleanup(() => { + // @ts-expect-error TODO: fix types here + editWrap?.removeEventListener('input', onExpandableTextareaInput); + editWrap?.removeEventListener('keydown', onKeyDown); + // editWrap?.removeEventListener('drop', onDrop, false); + }); + + createEffect(() => { + editWrap?.removeEventListener('keyup', onEscape); + editWrap?.addEventListener('keyup', onEscape); + }); + + createEffect(() => { + if (location.pathname !== currentPath) { + closeEditor(); + } + }) + + createEffect(() => { + const preQ = preQuery(); + + debounce(() => { + setQuery(() => preQ) + }, 500); + }) + + const onEscape = (e: KeyboardEvent) => { + if (e.code === 'Escape') { + !isMentioning() && !isEmojiInput() ? + closeEditor() : + closeEmojiAndMentions(); + } + }; + + const closeEditor = () => { + setUserRefs({}); + setMessage(''); + setParsedMessage(''); + setQuery(''); + setMentioning(false); + setEmojiInput(false); + setEmojiQuery('') + setEmojiResults(() => []); + props.onClose && props.onClose(); + }; + + const closeEmojiAndMentions = () => { + setMentioning(false); + setEmojiInput(false); + setEmojiQuery('') + setEmojiResults(() => []); + }; + + const postNote = async () => { + if (!account || !account.hasPublicKey() || isUploading() || isInputting()) { + return; + } + + if (Object.keys(account.relaySettings).length === 0) { + toast?.sendWarning( + intl.formatMessage(tToast.noRelays), + ); + return; + } + + if (account.relays.length === 0) { + toast?.sendWarning( + intl.formatMessage(tToast.noRelaysConnected), + ); + return; + } + + const value = message(); + + if (value.trim() === '') { + return; + } + + const messageToSend = value.replace(editMentionRegex, (url) => { + + const [_, name] = url.split('\`'); + const user = userRefs[name]; + + // @ts-ignore + return ` nostr:${user.npub}`; + }) + + if (account) { + const tags = referencesToTags(messageToSend); + + if (props.replyToNote) { + tags.push(['e', props.replyToNote.post.id, '', 'reply']); + tags.push(['p', props.replyToNote.post.pubkey]); + } + + const success = await sendNote(messageToSend, account.relays, tags); + + if (success) { + toast?.sendSuccess('Message posted successfully'); + } + else { + toast?.sendWarning('Failed to send message'); + } + } + + closeEditor(); + }; + + const mentionPositionOptions = () => { + if (!textArea || !mentionOptions || !editWrap) { + return; + } + + const taRect = textArea.getBoundingClientRect(); + const wRect = editWrap.getBoundingClientRect(); + + let newTop = taRect.top - wRect.top + mentionCursorPosition.top + 22; + let newLeft = mentionCursorPosition.left + 16; + + if (newTop > document.documentElement.clientHeight - 200) { + newTop = taRect.top - 400; + } + + mentionOptions.style.top = `${newTop}px`; + mentionOptions.style.left = `${newLeft}px`; + }; + + const emojiPositionOptions = () => { + if (!textArea || !emojiOptions || !editWrap) { + return; + } + + const taRect = textArea.getBoundingClientRect(); + const wRect = editWrap.getBoundingClientRect(); + + let newTop = taRect.top - wRect.top + emojiCursorPosition.top + 22; + let newLeft = emojiCursorPosition.left; + + if (newTop > document.documentElement.clientHeight - 200) { + newTop = taRect.top - 400; + } + + emojiOptions.style.top = `${newTop}px`; + emojiOptions.style.left = `${newLeft}px`; + }; + + const highlightHashtags = (text: string) => { + const regex = /(?:\s|^)#[^\s!@#$%^&*(),.?":{}|<>]+/ig; + + return text.replace(regex, (token) => { + const [space, term] = token.split('#'); + const embeded = ( + + {space} + + #{term} + + + ); + + // @ts-ignore + return embeded.outerHTML; + }); + } + + const parseUserMentions = (text: string) => { + return text.replace(editMentionRegex, (url) => { + const [_, name] = url.split('\`'); + const user = Object.values(userRefs).find(ref => userName(ref) === name); + + const link = user ? + MentionedUserLink({ user, openInNewTab: true}) : + @{name}; + + // @ts-ignore + return link.outerHTML || ` @${name}`; + }); + }; + + + const subUserRef = (userId: string) => { + + const parsed = parsedMessage().replace(profileRegex, (url) => { + const [_, id] = url.split(':'); + + if (!id) { + return url; + } + + try { + // const profileId = nip19.decode(id).data as string | nip19.ProfilePointer; + + // const hex = typeof profileId === 'string' ? profileId : profileId.pubkey; + // const npub = hexToNpub(hex); + + const user = userRefs[userId]; + + const link = user ? + @{userName(user)} : + @{truncateNpub(id)}; + + // @ts-ignore + return link.outerHTML || url; + } catch (e) { + return `${url}`; + } + }); + + setParsedMessage(parsed); + + }; + + const parseNpubLinks = (text: string) => { + let refs = []; + let match; + + while((match = profileRegex.exec(text)) !== null) { + refs.push(match[1]); + } + + refs.forEach(id => { + if (userRefs[id]) { + setTimeout(() => { + subUserRef(id); + }, 0); + return; + } + + const eventId = nip19.decode(id).data as string | nip19.ProfilePointer; + const hex = typeof eventId === 'string' ? eventId : eventId.pubkey; + + // setReferencedNotes(`nn_${id}`, { messages: [], users: {}, postStats: {}, mentions: {} }) + + const unsub = subscribeTo(`nu_${id}`, (type, subId, content) =>{ + if (type === 'EOSE') { + // // const newNote = convertToNotes(referencedNotes[subId])[0]; + + // // setNoteRefs((refs) => ({ + // // ...refs, + // // [newNote.post.noteId]: newNote + // // })); + + subUserRef(hex); + + unsub(); + return; + } + + if (type === 'EVENT') { + if (!content) { + return; + } + + if (content.kind === Kind.Metadata) { + const user = content as NostrUserContent; + + const u = convertToUser(user) + + setUserRefs(() => ({ [u.pubkey]: u })); + + // setReferencedNotes(subId, 'users', (usrs) => ({ ...usrs, [user.pubkey]: { ...user } })); + return; + } + } + }); + + + getUserProfiles([hex], `nu_${id}`); + + }); + + } + + const parseNoteLinks = (text: string) => { + let refs = []; + let match; + + while((match = noteRegex.exec(text)) !== null) { + refs.push(match[1]); + } + + refs.forEach(id => { + if (noteRefs[id]) { + setTimeout(() => { + subNoteRef(id); + }, 0); + return; + } + + const eventId = nip19.decode(id).data as string | nip19.EventPointer; + const hex = typeof eventId === 'string' ? eventId : eventId.id; + + setReferencedNotes(`nn_${id}`, { messages: [], users: {}, postStats: {}, mentions: {} }) + + const unsub = subscribeTo(`nn_${id}`, (type, subId, content) =>{ + if (type === 'EOSE') { + const newNote = convertToNotes(referencedNotes[subId])[0]; + + setNoteRefs((refs) => ({ + ...refs, + [newNote.post.noteId]: newNote + })); + + subNoteRef(newNote.post.noteId); + + unsub(); + return; + } + + if (type === 'EVENT') { + if (!content) { + return; + } + + if (content.kind === Kind.Metadata) { + const user = content as NostrUserContent; + + setReferencedNotes(subId, 'users', (usrs) => ({ ...usrs, [user.pubkey]: { ...user } })); + return; + } + + if ([Kind.Text, Kind.Repost].includes(content.kind)) { + const message = content as NostrNoteContent; + + setReferencedNotes(subId, 'messages', + (msgs) => [ ...msgs, { ...message }] + ); + + return; + } + + if (content.kind === Kind.NoteStats) { + const statistic = content as NostrStatsContent; + const stat = JSON.parse(statistic.content); + + setReferencedNotes(subId, 'postStats', + (stats) => ({ ...stats, [stat.event_id]: { ...stat } }) + ); + return; + } + + if (content.kind === Kind.Mentions) { + const mentionContent = content as NostrMentionContent; + const mention = JSON.parse(mentionContent.content); + + setReferencedNotes(subId, 'mentions', + (mentions) => ({ ...mentions, [mention.id]: { ...mention } }) + ); + return; + } + } + }); + + + getEvents(account?.publicKey, [hex], `nn_${id}`, true); + + }); + + }; + + const subNoteRef = (noteId: string) => { + + const parsed = parsedMessage().replace(noteRegex, (url) => { + const [_, id] = url.split(':'); + + if (!id || id !== noteId) { + return url; + } + try { + const note = noteRefs[id] + + const link = note ? +
+ + + + + +
: + {url}; + + // @ts-ignore + return link.outerHTML || url; + } catch (e) { + console.log('ERROR: ', e); + return `${url}`; + } + + }); + + setParsedMessage(parsed); + + }; + + + const parseForReferece = (value: string) => { + const content = replaceLinkPreviews(parseUserMentions(highlightHashtags(parseNote1(value)))); + + parseNpubLinks(content); + parseNoteLinks(content); + + return content; + }; + + const [isInputting, setIsInputting] = createSignal(false); + + const onInput = (e: InputEvent) => { + if (isUploading()) { + e.preventDefault(); + return false; + } + setIsInputting(true); + + // debounce(() => { + setIsInputting(false); + textArea && setMessage(textArea.value) + // }, 500) + }; + + let delayForMedia = 0; + + createEffect(() => { + if (delayForMedia) { + window.clearTimeout(delayForMedia); + } + const msg = sanitize(message()); + + delayForMedia = setTimeout(() => { + const p = parseForReferece(msg); + setParsedMessage(p); + }, 500); + + + }) + + createEffect(() => { + if (query().length === 0) { + search?.actions.getRecomendedUsers(); + return; + } + + search?.actions.findUsers(query()); + }); + + createEffect(() => { + if (isMentioning()) { + + mentionPositionOptions(); + + if (search?.users && search.users.length > 0) { + setHighlightedUser(0); + } + } + }); + + createEffect(() => { + if (isEmojiInput()) { + emojiPositionOptions(); + + if (emojiResults.length > 0) { + setHighlightedEmoji(0); + } + } + }); + + const selectEmoji = (emoji: EmojiOption) => { + if (!textArea) { + return; + } + + const msg = message(); + + // Get cursor position to determine insertion point + let cursor = textArea.selectionStart; + + // Get index of the token and insert emoji character + const index = msg.slice(0, cursor).lastIndexOf(':'); + const value = msg.slice(0, index) + emoji.char + msg.slice(cursor); + + // Reset query, update message and text area value + setMessage(value); + textArea.value = message(); + + // Calculate new cursor position + textArea.selectionEnd = index + 1; + textArea.focus(); + + setEmojiInput(false); + setEmojiQuery(''); + setEmojiResults(() => []); + + // Dispatch input event to recalculate UI position + // const e = new Event('input', { bubbles: true, cancelable: true}); + // textArea.dispatchEvent(e); + }; + + const selectUser = (user: PrimalUser | undefined) => { + if (!textArea || !user) { + return; + } + + setMentioning(false); + + const name = userName(user); + + setUserRefs((refs) => ({ + ...refs, + [name]: user, + })); + + const msg = message(); + + // Get cursor position to determine insertion point + let cursor = textArea.selectionStart; + + // Get index of the token and inster user's handle + const index = msg.slice(0, cursor).lastIndexOf('@'); + const value = msg.slice(0, index) + `@\`${name}\`` + msg.slice(cursor); + + // Reset query, update message and text area value + setQuery(''); + setMessage(value); + textArea.value = message(); + + textArea.focus(); + + // Calculate new cursor position + cursor = value.slice(0, cursor).lastIndexOf('@') + name.length + 3; + textArea.selectionEnd = cursor; + + + // Dispatch input event to recalculate UI position + const e = new Event('input', { bubbles: true, cancelable: true}); + textArea.dispatchEvent(e); + }; + + const focusInput = () => { + textArea && textArea.focus(); + }; + + const prefix = () => props.idPrefix ?? ''; + + const insertAtCursor = (text: string) => { + if (!textArea) { + return; + } + + const msg = message(); + + const cursor = textArea.selectionStart; + + const value = msg.slice(0, cursor) + `${text}` + msg.slice(cursor); + + setMessage(() => value); + textArea.value = value; + + textArea.focus(); + }; + + const [isUploading, setIsUploading] = createSignal(false); + + const isSupportedFileType = (file: File) => { + if (!file.type.startsWith('image/') && !file.type.startsWith('video/')) { + toast?.sendWarning(intl.formatMessage(tToast.fileTypeUpsupported)); + return false; + } + + return true; + + } + + const onUpload = () => { + if (!fileUpload) { + return; + } + + const file = fileUpload.files ? fileUpload.files[0] : null; + + // @ts-ignore fileUpload.value assignment + file && isSupportedFileType(file) && uploadFile(file, () => fileUpload.value = null); + + } + + const uploadFile = (file: File, callback?: () => void) => { + setIsUploading(true); + + const reader = new FileReader(); + + reader.onload = (e) => { + if (!e.target?.result) { + return; + } + + const subid = `upload_${APP_ID}`; + + const data = e.target?.result as string; + + const unsub = uploadSub(subid, (type, subId, content) => { + + if (type === 'EVENT') { + if (!content) { + return; + } + + if (content.kind === Kind.Uploaded) { + const uploaded = content as NostrMediaUploaded; + + insertAtCursor(uploaded.content); + return; + } + } + + if (type === 'NOTICE') { + setIsUploading(false); + unsub(); + return; + } + + if (type === 'EOSE') { + setIsUploading(false); + unsub(); + return; + } + }); + + uploadMedia(account?.publicKey, subid, data); + } + + reader.readAsDataURL(file); + + callback && callback(); + } + + return ( +
+ +
+ {intl.formatMessage(tFeedback.dropzone)} +
+
+ + +
+
+ +
+
{intl.formatMessage(tFeedback.uploading)}
+
+
+ +
+
+ +
+ {intl.formatMessage(tNote.newPreview)} +
+
+
+
+
+
+ + +
+ + {(user, index) => ( + } + statNumber={search?.scores[user.pubkey]} + statLabel={intl.formatMessage(tSearch.followers)} + onClick={() => selectUser(user)} + highlighted={highlightedUser() === index()} + /> + )} + +
+
+ + emojiSearchLimit}> +
+ + {(emoji, index) => ( + + )} + +
+
+ +
+
+ + +
+ + +
+
+ ) +} + +export default EditBox; diff --git a/src/components/NewNote/NewNote.module.scss b/src/components/NewNote/NewNote.module.scss new file mode 100644 index 0000000..57a2ed5 --- /dev/null +++ b/src/components/NewNote/NewNote.module.scss @@ -0,0 +1,146 @@ +.newNoteHolder { + min-height: 100px; + background-color: var(--background-site); + padding-top: 10px; +} + +.holderBottomBorder { + width: 100%; + height: 4px; + display: flex; + justify-content: space-between; + + .rightCorner { + display: inline-block; + width: 4px; + height: 4px; + + background-color: var(--background-site); + -webkit-mask: url(../../assets/icons/corner_right.svg) no-repeat center; + mask: url(../../assets/icons/corner_right.svg) no-repeat center; + } + .leftCorner { + display: inline-block; + width: 4px; + height: 4px; + + background-color: var(--background-site); + -webkit-mask: url(../../assets/icons/corner_left.svg) no-repeat center; + mask: url(../../assets/icons/corner_left.svg) no-repeat center; + } +} + +.newNoteBorder { + width: 100%; + height: 100%; + padding: 1px; + background: var(--brand-gradient); + border-radius: 6px; + display: block; + position: relative; +} + +.newNote { + width: 100%; + height: 100%; + min-height: 122px; + font-size: 18px; + line-height: 20px; + margin: 0px; + border-radius: 6px; + border: none; + color: var(--text-tertiary); + background-color: var(--background-site); + padding-bottom: 11px; + display: grid; + grid-template-columns: 92px 1fr; + + .leftSide { + padding: 20px; + } + + + // textarea { + // width: calc(100% - 36px); + // margin: 18px 18px 36px 18px; + // padding: 0px; + // box-sizing: padding-box; + // border: none; + // border-radius: 0px; + // background-color: unset; + // font-size: 16px; + // line-height: 20px; + // font-weight: 400; + // color: var(--text-primary); + // resize: none; + + // &:focus { + // border: none; + // outline: none; + // } + // } +} + +.controls { + position: absolute; + bottom: 0px; + right: 15px; + display: flex; + align-items: center; + >button { + width: 80px; + height: 28px; + margin: 0px 0px 11px 8px; + } +} + +.primaryButton { + border: none; + border-radius: 6px; + margin: 0px 8px; + padding: 0px; + font-size: 14px; + line-height: 20px; + font-weight: 700; + background: var(--brand-gradient-vertical); + color: var(--text-primary); + >span { + opacity: 0.75; + } +} + + +.secondaryButton { + border: none; + border-radius: 6px; + padding: 1px; + font-size: 14px; + line-height: 20px; + font-weight: 700; + background: var(--brand-gradient-vertical); + color: var(--text-tertiary-2); + >div { + width: 100%; + height: 100%; + vertical-align: middle; + border-radius: 6px; + background-color: var(--background-card); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + } +} + +.searchSuggestions { + width: 300px; + background-color: var(--background-site); + border: 1px solid var(--text-tertiary-2); + // box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.8); + border-radius: 4px; + + position: absolute; + top: 0px; + left: 0px; + z-index: 50; +} diff --git a/src/components/NewNote/NewNote.tsx b/src/components/NewNote/NewNote.tsx new file mode 100644 index 0000000..81e9c75 --- /dev/null +++ b/src/components/NewNote/NewNote.tsx @@ -0,0 +1,41 @@ +import { Component } from "solid-js"; +import { useAccountContext } from "../../contexts/AccountContext"; +import Avatar from "../Avatar/Avatar"; +import EditBox from "./EditBox/EditBox"; +import styles from "./NewNote.module.scss"; + +const NewNote: Component = () => { + + const account = useAccountContext(); + + const activeUser = () => account?.activeUser; + + return ( + <> +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+ + ) +} + +export default NewNote; diff --git a/src/components/NostrStats/NostrStats.module.scss b/src/components/NostrStats/NostrStats.module.scss new file mode 100644 index 0000000..d0d93e2 --- /dev/null +++ b/src/components/NostrStats/NostrStats.module.scss @@ -0,0 +1,33 @@ + +.statsCaption { + margin-bottom: 32px; + font-weight: 800; + font-size: 18px; + line-height: 20px; + text-transform: uppercase; + color: var(--text-secondary); +} +.netstats { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr; + grid-template-rows: 1fr 1fr; + grid-column-gap: 24px; + grid-row-gap: 24px; + + .netstat { + .number { + font-size: 24px; + line-height: 28px; + font-weight: 300; + color: var(--text-primary); + } + + .label { + font-size: 16px; + line-height: 20px; + font-weight: 300; + color: var(--text-tertiary); + text-transform: lowercase; + } + } +} diff --git a/src/components/NostrStats/NostrStats.tsx b/src/components/NostrStats/NostrStats.tsx new file mode 100644 index 0000000..00dfd85 --- /dev/null +++ b/src/components/NostrStats/NostrStats.tsx @@ -0,0 +1,45 @@ +import { useIntl } from "@cookbook/solid-intl"; +import { Component } from "solid-js"; +import { PrimalNetStats } from "../../types/primal"; +import styles from "./NostrStats.module.scss"; +import { explore as t } from '../../translations'; + +const NostrStats: Component<{ stats: PrimalNetStats }> = (props) => { + + const intl = useIntl(); + + const statDisplay = ( + stat: number | string | undefined, + key: string, + ) => { + // @ts-ignore Record find entry by key + const label = t.statDisplay[key] || ''; + + return ( +
+
+ {stat?.toLocaleString()} +
+
+ {intl.formatMessage(label)} +
+
+ ); + }; + + + return ( +
+ {statDisplay(props.stats.users, 'users')} + {statDisplay(props.stats.pubkeys, 'pubkeys')} + {statDisplay(props.stats.zaps, 'users')} + {statDisplay((props.stats.satszapped /100000000).toFixed(8), 'btcZapped')} + {statDisplay(props.stats.pubnotes, 'pubnotes')} + {statDisplay(props.stats.reposts, 'reposts')} + {statDisplay(props.stats.reactions, 'reactions')} + {statDisplay(props.stats.any, 'any')} +
+ ) +} + +export default NostrStats; diff --git a/src/components/Note/MentionedUserLink/MentionedUserLink.module.scss b/src/components/Note/MentionedUserLink/MentionedUserLink.module.scss new file mode 100644 index 0000000..8208ede --- /dev/null +++ b/src/components/Note/MentionedUserLink/MentionedUserLink.module.scss @@ -0,0 +1,39 @@ +.userMention { + position: relative; + .userPreview { + display: none; + } + + &:hover { + .userPreview { + position: absolute; + left: 0; + width: 220px; + z-index: var(--z-index-floater); + background-color: var(--background-input); + display: flex; + padding: 4px; + border: 1px solid var(--text-tertiary-2); + border-radius: 8px; + color: var(--text-secondary-2); + font-size: 14px; + line-height: 16px; + font-weight: 400; + margin-top: 1px; + > div { + display: flex; + flex-direction: column; + justify-content: center; + margin-left: 4px; + + > div { + &.userName { + font-weight: 800; + color: var(--text-primary); + } + padding-block: 2px; + } + } + } + } +} diff --git a/src/components/Note/MentionedUserLink/MentionedUserLink.tsx b/src/components/Note/MentionedUserLink/MentionedUserLink.tsx new file mode 100644 index 0000000..f9c56b8 --- /dev/null +++ b/src/components/Note/MentionedUserLink/MentionedUserLink.tsx @@ -0,0 +1,26 @@ +import { A } from "@solidjs/router"; +import { Component, JSXElement } from "solid-js"; +import { userName, nip05Verification } from "../../../stores/profile"; +import { PrimalUser } from "../../../types/primal"; +import Avatar from "../../Avatar/Avatar"; +import styles from "./MentionedUserLink.module.scss"; + +const MentionedUserLink: Component<{ + user: PrimalUser, + openInNewTab?: boolean, +}> = (props) => { + + const LinkComponent: Component<{ children: JSXElement }> = (p) => { + return props.openInNewTab ? + {p.children} : + {p.children}; + }; + + return ( + + @{userName(props.user)} + + ); +} + +export default MentionedUserLink; diff --git a/src/components/Note/Note.module.scss b/src/components/Note/Note.module.scss new file mode 100644 index 0000000..4d801ae --- /dev/null +++ b/src/components/Note/Note.module.scss @@ -0,0 +1,117 @@ +.post { + background-color: var(--background-card); + display: flex; + flex-direction: column; + // grid-template-columns: 60px 1fr; + // grid-template-rows: 1fr; + // grid-template-areas: "avatar content"; + padding: 0px; + border-radius: 8px; + // pointer-events: none; + + .content { + grid-area: content; + display: flex; + flex-direction: column; + margin-top: 21px; + margin-left: 60px; + // grid-template-columns: 1fr; + // grid-template-rows: 48px 1fr 28px; + // grid-row-gap: 16px; + // grid-template-areas: "header" "message" "footer"; + + + .message { + position: relative; + grid-area: message; + color: var(--text-primary); + word-break: break-word; + font-size: 16px; + line-height: 24px; + width: 100%; + // max-height: 650px; + // overflow: hidden; + margin-bottom: 17px; + + a:hover { + text-decoration: underline; + } + + .messageFade { + position: absolute; + z-index: 1; + top: 610px; + left: 0; + pointer-events: none; + background-image: var(--fade-note-vertical); + width: 100%; + height: 40px; + } + + } + } +} + + +.postLink { + text-decoration: none; + color: unset; + margin: 0px; + padding: 16px 20px; + // background: var(--brand-gradient-vertical); + background-color: var(--background-card); + border-radius: 8px; + display: block; + transition: 0.2s padding; + margin-top: 8px; + >div { + border-radius: 4px; + transition: 0.2s border-radius ease-out; + } + + // &:hover { + // padding-left: 4px; + // transition: 0.2s padding; + // border-radius: 4px; + // >div { + // border-radius: 0px 4px 4px 0px; + // transition: 0.2s border-radius ease-out; + // } + // } +} + +.repostedBy { + padding-bottom: 16px; + display: flex; + >span { + >a { + margin-inline: 5px; + } + color: var(--text-tertiary); + font-size: 16px; + line-height: 16px; + font-weight: 400; + >span { + text-transform: lowercase; + } + } +} + + +@media only screen and (max-width: 720px) { + .postLink { + width: 100vw; + .post { + width: 100%; + // grid-template-columns: 62px 1fr; + margin-left: 0px; + margin-right: 0px; + padding-right: 0px; + .content { + margin-left: 0; + } + } + + } + +} diff --git a/src/components/Note/Note.tsx b/src/components/Note/Note.tsx new file mode 100644 index 0000000..6ee064c --- /dev/null +++ b/src/components/Note/Note.tsx @@ -0,0 +1,71 @@ +import { A } from '@solidjs/router'; +import { Component, Show } from 'solid-js'; +import { PrimalNote } from '../../types/primal'; +import ParsedNote from '../ParsedNote/ParsedNote'; +import NoteFooter from './NoteFooter/NoteFooter'; +import NoteHeader from './NoteHeader/NoteHeader'; + +import styles from './Note.module.scss'; +import { useThreadContext } from '../../contexts/ThreadContext'; +import { useIntl } from '@cookbook/solid-intl'; +import { truncateNpub } from '../../stores/profile'; +import { note as t } from '../../translations'; + +const Note: Component<{ note: PrimalNote }> = (props) => { + + const threadContext = useThreadContext(); + const intl = useIntl(); + + const repost = () => props.note.repost; + + const navToThread = (note: PrimalNote) => { + threadContext?.actions.setPrimaryNote(note); + }; + + const reposterName = () => { + const r = repost(); + + if (!r) { + return ''; + } + + return r.user?.displayName || + r.user?.name || + truncateNpub(r.user.npub); + } + + return ( + navToThread(props.note)} + data-event={props.note.post.id} + data-event-bech32={props.note.post.noteId} + > + +
+
+ +
+ {reposterName()} + + + {intl.formatMessage(t.reposted)} + + +
+ +
+ +
+
+ +
+ +
+
+ + ) +} + +export default Note; diff --git a/src/components/Note/NoteFooter/NoteFooter.module.scss b/src/components/Note/NoteFooter/NoteFooter.module.scss new file mode 100644 index 0000000..6466d40 --- /dev/null +++ b/src/components/Note/NoteFooter/NoteFooter.module.scss @@ -0,0 +1,155 @@ +@mixin statIcon { + width: 16px; + height: 16px; + background-color: var(--text-tertiary-2); +} + +@mixin typeDiv { + display: flex; + min-width: 64px; + align-items: center; +} + +.footer { + display: flex; + position: relative; + + .stat { + // display: grid; + // grid-template-columns: 18px 1fr; + // grid-template-rows: 1fr; + // grid-column-gap: 5px; + font-weight: 400; + font-size: 18px; + line-height: 16px; + align-items: center; + margin: 0px; + padding: 0px; + margin-right: 60px; + border: none; + background-color: unset; + width: auto; + min-width: 64px; + position: relative; + + .likeType { + @include typeDiv; + .icon { + @include statIcon; + -webkit-mask: url(../../../assets/icons/feed_like.svg) no-repeat 0 / 100%; + mask: url(../../../assets/icons/feed_like.svg) no-repeat 0 / 100%; + } + } + + .replyType { + @include typeDiv; + .icon { + @include statIcon; + -webkit-mask: url(../../../assets/icons/feed_reply.svg) no-repeat 0 / 100%; + mask: url(../../../assets/icons/feed_reply.svg) no-repeat 0 / 100%; + } + } + + .repostType { + @include typeDiv; + .icon { + @include statIcon; + -webkit-mask: url(../../../assets/icons/feed_repost.svg) no-repeat 0 / 100%; + mask: url(../../../assets/icons/feed_repost.svg) no-repeat 0 / 100%; + } + } + + .zapType { + @include typeDiv; + .icon { + @include statIcon; + -webkit-mask: url(../../../assets/icons/feed_zap.svg) no-repeat 0 / 100%; + mask: url(../../../assets/icons/feed_zap.svg) no-repeat 0 / 100%; + } + } + + &:hover, &.highlighted { + .zapType { + .statNumber { + color: #FF9F2F; + } + .icon { + background-color: #FF9F2F; + -webkit-mask: url(../../../assets/icons/feed_zap_fill.svg) no-repeat 0 / 100%; + mask: url(../../../assets/icons/feed_zap_fill.svg) no-repeat 0 / 100%; + } + } + + .likeType { + .statNumber { + color: #BC1870; + } + .icon { + background-color: #BC1870; + -webkit-mask: url(../../../assets/icons/feed_like_fill.svg) no-repeat 0 / 100%; + mask: url(../../../assets/icons/feed_like_fill.svg) no-repeat 0 / 100%; + } + } + + .replyType { + .statNumber { + color: #CCCCCC; + } + .icon { + background-color: #CCCCCC; + -webkit-mask: url(../../../assets/icons/feed_reply_fill.svg) no-repeat 0 / 100%; + mask: url(../../../assets/icons/feed_reply_fill.svg) no-repeat 0 / 100%; + } + } + + .repostType { + .statNumber { + color: #66E205; + } + .icon { + background-color: #66E205; + -webkit-mask: url(../../../assets/icons/feed_repost_fill.svg) no-repeat 0 / 100%; + mask: url(../../../assets/icons/feed_repost_fill.svg) no-repeat 0 / 100%; + } + } + } + &:focus { + box-shadow: none; + } + + .statNumber { + text-align: left; + color: var(--text-secondary); + margin-left: 7px; + } + } +} + +.smallZapLottie { + width: 32px; + height: 32px; + position: absolute; + z-index: 20; +} + +.mediumZapLottie { + width: 341px; + height: 91px; + position: absolute; + z-index: 20; +} + + +@media only screen and (max-width: 720px) { + .footer { + width: auto; + display: flex; + align-items: center; + justify-content: space-between; + + .stat{ + min-width: 0px; + margin-right: 0; + } + } +} diff --git a/src/components/Note/NoteFooter/NoteFooter.tsx b/src/components/Note/NoteFooter/NoteFooter.tsx new file mode 100644 index 0000000..dd4f460 --- /dev/null +++ b/src/components/Note/NoteFooter/NoteFooter.tsx @@ -0,0 +1,430 @@ +import { Component, createEffect, createSignal, onMount, Show } from 'solid-js'; +import { PrimalNote } from '../../../types/primal'; +import { sendRepost } from '../../../lib/notes'; + +import styles from './NoteFooter.module.scss'; +import { useAccountContext } from '../../../contexts/AccountContext'; +import { useToastContext } from '../../Toaster/Toaster'; +import { useIntl } from '@cookbook/solid-intl'; + +import { truncateNumber } from '../../../lib/notifications'; +import { canUserReceiveZaps, zapNote } from '../../../lib/zap'; +import CustomZap from '../../CustomZap/CustomZap'; +import { useSettingsContext } from '../../../contexts/SettingsContext'; + +import zapSM from '../../../assets/lottie/zap_sm.json'; +import zapMD from '../../../assets/lottie/zap_md.json'; +import { medZapLimit } from '../../../constants'; +import { toast as t } from '../../../translations'; + +const NoteFooter: Component<{ note: PrimalNote}> = (props) => { + + const account = useAccountContext(); + const toast = useToastContext(); + const intl = useIntl(); + const settings = useSettingsContext(); + + let smallZapAnimation: HTMLElement | undefined; + let medZapAnimation: HTMLElement | undefined; + + const [liked, setLiked] = createSignal(props.note.post.noteActions.liked); + const [zapped, setZapped] = createSignal(props.note.post.noteActions.zapped); + const [replied, setReplied] = createSignal(props.note.post.noteActions.replied); + const [reposted, setReposted] = createSignal(props.note.post.noteActions.reposted); + + const [likes, setLikes] = createSignal(props.note.post.likes); + const [reposts, setReposts] = createSignal(props.note.post.reposts); + const [replies, setReplies] = createSignal(props.note.post.replies); + const [zaps, setZaps] = createSignal(props.note.post.satszapped); + + let footerDiv: HTMLDivElement | undefined; + + const doRepost = async (e: MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + + if (!account) { + return; + } + + if (Object.keys(account.relaySettings).length === 0) { + toast?.sendWarning( + intl.formatMessage(t.noRelays), + ); + return; + } + + if (account.relays.length === 0) { + toast?.sendWarning( + intl.formatMessage(t.noRelaysConnected), + ); + return; + } + + const success = await sendRepost(props.note, account.relays); + + if (success) { + setReposts(reposts() + 1); + setReposted(true); + toast?.sendSuccess( + intl.formatMessage(t.repostSuccess), + ); + } + else { + toast?.sendWarning( + intl.formatMessage(t.repostFailed), + ); + } + }; + + const doReply = () => {}; + + const doLike = async (e: MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + + if (!account) { + return; + } + + if (Object.keys(account.relaySettings).length === 0) { + toast?.sendWarning( + intl.formatMessage(noRelaysMessage), + ); + return; + } + + if (account.relays.length === 0) { + toast?.sendWarning( + intl.formatMessage(noRelayConnectedMessage), + ); + return; + } + + const success = await account.actions.addLike(props.note); + + if (success) { + setLikes(likes() + 1); + setLiked(true); + } + }; + + let quickZapDelay = 0; + const [isCustomZap, setIsCustomZap] = createSignal(false); + const [isZapping, setIsZapping] = createSignal(false); + + const startZap = (e: MouseEvent | TouchEvent) => { + e.preventDefault(); + e.stopPropagation(); + + if (!account?.hasPublicKey()) { + toast?.sendWarning( + intl.formatMessage(t.zapAsGuest), + ); + setIsZapping(false); + return; + } + + if (Object.keys(account.relaySettings).length === 0) { + toast?.sendWarning( + intl.formatMessage(noRelaysMessage), + ); + return; + } + + if (account.relays.length === 0) { + toast?.sendWarning( + intl.formatMessage(noRelayConnectedMessage), + ); + return; + } + + if (!canUserReceiveZaps(props.note.user)) { + toast?.sendWarning( + intl.formatMessage(t.zapUnavailable), + ); + setIsZapping(false); + return; + } + + quickZapDelay = setTimeout(() => { + setIsCustomZap(true); + setIsZapping(true); + }, 500); + }; + + const commitZap = (e: MouseEvent | TouchEvent) => { + e.preventDefault(); + e.stopPropagation(); + + clearTimeout(quickZapDelay); + + if (!account?.hasPublicKey() || account.relays.length === 0 || !canUserReceiveZaps(props.note.user)) { + return; + } + + if (!isCustomZap()) { + doQuickZap(); + } + }; + + const [zappedNow, setZappedNow] = createSignal(false); + const [zappedAmount, setZappedAmount] = createSignal(0); + + const animateSmallZap = () => { + setTimeout(() => { + setHideZapIcon(true); + + if (!smallZapAnimation) { + return; + } + + const newLeft = 116; + const newTop = -8; + + smallZapAnimation.style.left = `${newLeft}px`; + smallZapAnimation.style.top = `${newTop}px`; + + const onAnimDone = () => { + // setIsZapping(true); + setShowSmallZapAnim(false); + setHideZapIcon(false); + smallZapAnimation?.removeEventListener('complete', onAnimDone); + } + + smallZapAnimation.addEventListener('complete', onAnimDone); + + try { + // @ts-ignore + smallZapAnimation.seek(0); + // @ts-ignore + smallZapAnimation.play(); + } catch (e) { + console.warn('Failed to animte zap:', e); + onAnimDone(); + } + }, 10); + }; + + const animateMedZap = () => { + setTimeout(() => { + setHideZapIcon(true); + + if (!medZapAnimation) { + return; + } + + const newLeft = 20; + const newTop = -35; + + medZapAnimation.style.left = `${newLeft}px`; + medZapAnimation.style.top = `${newTop}px`; + + const onAnimDone = () => { + // setIsZapping(true); + setShowMedZapAnim(false); + setHideZapIcon(false); + medZapAnimation?.removeEventListener('complete', onAnimDone); + } + + medZapAnimation.addEventListener('complete', onAnimDone); + + try { + // @ts-ignore + medZapAnimation.seek(0); + // @ts-ignore + medZapAnimation.play(); + } catch (e) { + console.warn('Failed to animte zap:', e); + onAnimDone(); + } + }, 10); + }; + + + const animateZap = () => { + if (zappedAmount() > medZapLimit) { + setShowMedZapAnim(true); + animateMedZap(); + } + else { + setShowSmallZapAnim(true); + animateSmallZap(); + } + + } + + const doQuickZap = async () => { + + if (account?.hasPublicKey()) { + setZappedAmount(() => settings?.defaultZapAmount || 0); + setZappedNow(true); + animateZap(); + const success = await zapNote(props.note, account.publicKey, settings?.defaultZapAmount || 10, '', account.relays); + setIsZapping(false); + + if (success) { + return; + } + + setZappedAmount(() => -(settings?.defaultZapAmount || 0)); + setZappedNow(true); + setZapped(props.note.post.noteActions.zapped); + } + } + + const buttonTypeClasses: Record = { + zap: styles.zapType, + like: styles.likeType, + reply: styles.replyType, + repost: styles.repostType, + }; + + const actionButton = (opts: { + type: 'zap' | 'like' | 'reply' | 'repost', + disabled?: boolean, + highlighted?: boolean, + onClick?: (e: MouseEvent) => void, + onMouseDown?: (e: MouseEvent) => void, + onMouseUp?: (e: MouseEvent) => void, + onTouchStart?: (e: TouchEvent) => void, + onTouchEnd?: (e: TouchEvent) => void, + label: string | number, + hidden?: boolean, + title?: string, + }) => { + + return ( + + ); + }; + + createEffect(() => { + + if (zappedNow()) { + setZaps((z) => z + zappedAmount()); + setZapped(true); + setZappedNow(false); + } + + }) + + const [showSmallZapAnim, setShowSmallZapAnim] = createSignal(false); + const [showMedZapAnim, setShowMedZapAnim] = createSignal(false); + const [hideZapIcon, setHideZapIcon] = createSignal(false); + + return ( +
+ + + + + + + + + {actionButton({ + onClick: doReply, + type: 'reply', + highlighted: replied(), + label: replies() === 0 ? '' : truncateNumber(replies(), 2), + title: replies().toLocaleString(), + })} + + {actionButton({ + onClick: (e: MouseEvent) => e.preventDefault(), + onMouseDown: startZap, + onMouseUp: commitZap, + onTouchStart: startZap, + onTouchEnd: commitZap, + type: 'zap', + highlighted: zapped() || isZapping(), + label: zaps() === 0 ? '' : truncateNumber(zaps(), 2), + hidden: hideZapIcon(), + title: zaps().toLocaleString(), + })} + + {actionButton({ + onClick: doLike, + type: 'like', + highlighted: liked(), + label: likes() === 0 ? '' : truncateNumber(likes(), 2), + title: likes().toLocaleString(), + })} + + {actionButton({ + onClick: doRepost, + type: 'repost', + highlighted: reposted(), + label: reposts() === 0 ? '' : truncateNumber(reposts(), 2), + title: reposts().toLocaleString(), + })} + + { + setIsCustomZap(false); + setZappedAmount(() => amount || 0); + setZappedNow(true); + setZapped(true); + animateZap(); + }} + onSuccess={(amount) => { + setIsCustomZap(false); + setIsZapping(false); + // setZappedAmount(() => amount || 0); + setZappedNow(false); + // animateZap(); + setShowMedZapAnim(false); + setShowSmallZapAnim(false); + setHideZapIcon(false); + setZapped(true); + }} + onFail={(amount) => { + setZappedAmount(() => -(amount || 0)); + setZappedNow(true); + setIsCustomZap(false); + setIsZapping(false); + setShowMedZapAnim(false); + setShowSmallZapAnim(false); + setHideZapIcon(false); + setZapped(props.note.post.noteActions.zapped); + }} + /> + +
+ ) +} + +export default NoteFooter; diff --git a/src/components/Note/NoteHeader/NoteHeader.module.scss b/src/components/Note/NoteHeader/NoteHeader.module.scss new file mode 100644 index 0000000..150e059 --- /dev/null +++ b/src/components/Note/NoteHeader/NoteHeader.module.scss @@ -0,0 +1,157 @@ +.header { + grid-area: header; + align-items: center; + color: var(--text-tertiary-2); + display: flex; + justify-content: space-between; + width: 100%; + height: 48px; + + .headerInfo { + display: flex; + flex-direction: row; + justify-content: flex-start; + } + + .avatar { + margin-right: 12px; + + >a { + text-decoration: none; + } + + .avatarImg { + width: 52px; + height: 52px; + border-radius: 50%; + } + } + .postInfo { + display: flex; + flex-direction: column; + font-size: 14px; + line-height: 16px; + font-weight: 400; + height: 48px; + justify-content: space-around; + + .verification { + max-width: 470px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + + } + .userInfo { + display: flex; + justify-content: flex-start; + overflow: hidden; + display: flex; + align-items: center; + justify-content: flex-start; + .userName { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + max-width: 360px; + color: var(--text-primary); + } + .time{ + margin: 0px 2px; + min-width: 80px; + &::before { + content: "|"; + padding: 0px 2px; + } + } + } + + } + + + .contextMenu { + position: relative; + width: 16px; + height: 16px; + display: flex; + align-items: center; + text-align: center; + font-weight: bold; + + .contextButton { + height: 16px; + padding: 0; + margin: 0; + background: none; + border: none; + outline: none; + + &:focus { + outline: none; + box-shadow: none; + } + } + } + +} + +.contextIcon { + width: 16px; + height: 16px; + background-color: var(--text-secondary-2); + -webkit-mask: url(../../../assets/icons/context.svg) no-repeat 0 / 100%; + mask: url(../../../assets/icons/context.svg) no-repeat 0 / 100%; + + &:hover { + background-color: var(--text-primary); + } +} + +.contextMenuOptions { + position: absolute; + top: 16px; + right: 0px; + min-width: 160px; + background-color: var(--background-site); + border: solid 1px var(--text-tertiary-2); + border-radius: 4px; + z-index: 20; +} + +.contextOption { + background-color: var(--background-site); + border: none; + font-weight: 400; + font-size: 14px; + line-height: 16px; + color: var(--text-secondary-2); + padding: 10px; + margin: 0px; + + &:hover, &:focus { + background-color: var(--background-input); + } +} + +@media only screen and (max-width: 720px) { + .header { + width: calc(100vw - 160px); + .postInfo { + width: calc(100vw - 110px); + .userInfo { + max-width: calc(100vw - 100px); + overflow: hidden; + .userName { + max-width: calc(100vw - 180px); + } + } + .verification { + max-width: 220px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + + } + } + } +} diff --git a/src/components/Note/NoteHeader/NoteHeader.tsx b/src/components/Note/NoteHeader/NoteHeader.tsx new file mode 100644 index 0000000..26e2a3c --- /dev/null +++ b/src/components/Note/NoteHeader/NoteHeader.tsx @@ -0,0 +1,145 @@ +import { Component, createEffect, createSignal, Show } from 'solid-js'; +import { PrimalNote } from '../../../types/primal'; + +import styles from './NoteHeader.module.scss'; +import { date } from '../../../lib/dates'; +import { nip05Verification, truncateNpub } from '../../../stores/profile'; +import { useIntl } from '@cookbook/solid-intl'; +import { useToastContext } from '../../Toaster/Toaster'; +import VerificationCheck from '../../VerificationCheck/VerificationCheck'; +import Avatar from '../../Avatar/Avatar'; +import { A } from '@solidjs/router'; +import { toast as tToast, actions as tActions } from '../../../translations'; + +const NoteHeader: Component<{ note: PrimalNote}> = (props) => { + + const intl = useIntl(); + const toaster = useToastContext(); + + const [showContext, setContext] = createSignal(false); + + const authorName = () => { + return props.note.user?.displayName || + props.note.user?.name || + truncateNpub(props.note.user.npub); + }; + + const openContextMenu = (e: MouseEvent) => { + e.preventDefault(); + setContext(true); + }; + + const copyNostrLink = (e: MouseEvent) => { + e.preventDefault(); + navigator.clipboard.writeText(`nostr:${props.note.post.noteId}`); + setContext(false); + toaster?.sendSuccess(intl.formatMessage(tToast.noteNostrLinkCoppied)); + }; + + const copyPrimalLink = (e: MouseEvent) => { + e.preventDefault(); + navigator.clipboard.writeText(`${window.location.origin}/thread/${props.note.post.noteId}`); + setContext(false); + toaster?.sendSuccess(intl.formatMessage(tToast.notePrimalLinkCoppied)); + }; + + const onClickOutside = (e: MouseEvent) => { + if ( + !document?.getElementById(`note_context_${props.note.post.id}`)?.contains(e.target as Node) + ) { + setContext(false); + } + } + + createEffect(() => { + if (showContext()) { + document.addEventListener('click', onClickOutside); + } + else { + document.removeEventListener('click', onClickOutside); + } + }); + + const isVerifiedByPrimal = () => { + return !!props.note.user.nip05 && + props.note.user.nip05.endsWith('primal.net'); + } + + return ( +
+
+
+ + + +
+
+
+ + + {authorName()} + + + + + + {date(props.note.post?.created_at).label} + +
+ + + + {nip05Verification(props.note.user)} + + +
+
+
+ + +
+ + +
+
+
+
+ ) +} + +export default NoteHeader; diff --git a/src/components/Note/NotePrimary/NotePrimary.module.scss b/src/components/Note/NotePrimary/NotePrimary.module.scss new file mode 100644 index 0000000..d94512f --- /dev/null +++ b/src/components/Note/NotePrimary/NotePrimary.module.scss @@ -0,0 +1,110 @@ +.border { + background: var(--brand-gradient-vertical); + border-radius: 4px 0px 0px 4px; + width: 4px; + position: absolute; + top: 0; + left: 0; + height: 100%; +} + +.post { + position: relative; + background-color: var(--background-card); + margin-top: 0px; + display: flex; + flex-direction: column; + padding: 16px 20px; + // grid-template-columns: 122px 1fr; + // grid-template-rows: 1fr; + // grid-template-areas: "avatar content"; + // padding: 16px 16px 16px 20px; + border-radius: 0px 4px 4px 0px; + + // .avatar { + // grid-area: avatar; + // display: grid; + // grid-template-columns: 1fr; + // grid-template-rows: 80px 1fr; + // grid-row-gap: 6px; + // justify-items: center; + + // >a { + // text-decoration: none; + // } + + // .avatarName { + // width: 100%; + // padding: 0px 6px; + // text-align: center; + // display: inline-block; + // font-size: 16px; + // line-height: 12px; + // font-weight: 400; + // color: var(--text-primary); + // align-self: flex-start; + // text-overflow: ellipsis; + // white-space: nowrap; + // overflow: hidden; + // } + // } + + .content { + // grid-area: content; + // display: grid; + // grid-template-columns: 1fr; + // grid-template-rows: 48px 1fr 28px; + // grid-row-gap: 16px; + // grid-template-areas: "header" "message" "footer"; + grid-area: content; + display: flex; + flex-direction: column; + margin-top: 21px; + margin-left: 60px; + + + .message { + position: relative; + grid-area: message; + color: var(--text-primary); + word-break: break-word; + font-size: 16px; + line-height: 24px; + width: 100%; + // max-height: 650px; + // overflow: hidden; + margin-bottom: 17px; + + a:hover { + text-decoration: underline; + } + + .messageFade { + position: absolute; + z-index: 1; + top: 610px; + left: 0; + pointer-events: none; + background-image: var(--fade-note-vertical); + width: 100%; + height: 40px; + } + + } + } +} + + +@media only screen and (max-width: 720px) { + .post { + width: 100vw; + // grid-template-columns: 62px 1fr; + margin-left: 0px; + margin-right: 0px; + padding-right: 12px; + .content { + margin-left: 0px; + } + } + +} diff --git a/src/components/Note/NotePrimary/NotePrimary.tsx b/src/components/Note/NotePrimary/NotePrimary.tsx new file mode 100644 index 0000000..49577d5 --- /dev/null +++ b/src/components/Note/NotePrimary/NotePrimary.tsx @@ -0,0 +1,33 @@ +import { Component } from 'solid-js'; +import { truncateNpub } from '../../../stores/profile'; +import { PrimalNote } from '../../../types/primal'; +import ParsedNote from '../../ParsedNote/ParsedNote'; +import NoteFooter from '../NoteFooter/NoteFooter'; +import NoteHeader from '../NoteHeader/NoteHeader'; + +import styles from './NotePrimary.module.scss'; + + +const NotePrimary: Component<{ note: PrimalNote }> = (props) => { + + return ( +
+
+ +
+ +
+ +
+ + +
+
+ ) +} + +export default NotePrimary; diff --git a/src/components/Note/NotificationNote/NotificationNote.module.scss b/src/components/Note/NotificationNote/NotificationNote.module.scss new file mode 100644 index 0000000..e5c5c8c --- /dev/null +++ b/src/components/Note/NotificationNote/NotificationNote.module.scss @@ -0,0 +1,101 @@ +.post { + background-color: var(--background-site); + display: grid; + grid-template-columns: 1fr; + grid-template-rows: 1fr; + grid-template-areas: "content"; + padding: 0px 16px 16px 0px; + border-radius: 4px; + // width: 640px; + // pointer-events: none; + + .content { + grid-area: content; + display: flex; + flex-direction: column; + + + .message { + grid-area: message; + color: var(--text-primary); + word-break: break-word; + font-size: 16px; + line-height: 24px; + width: 100%; + + a:hover { + text-decoration: underline; + } + } + + .footer { + margin-top: 12px; + } + } +} + + +.postLink { + text-decoration: none; + color: unset; + margin: 0px; + padding: 0px; + // background: var(--brand-gradient-vertical); + background-color: var(--background-card); + border-radius: 6px; + display: block; + transition: 0.2s padding; + margin-top: 6px; + >div { + border-radius: 4px; + transition: 0.2s border-radius ease-out; + } + + // &:hover { + // padding-left: 4px; + // transition: 0.2s padding; + // border-radius: 4px; + // >div { + // border-radius: 0px 4px 4px 0px; + // transition: 0.2s border-radius ease-out; + // } + // } +} + +.repostedBy { + margin-left: 22px; + padding-top: 16px; + display: flex; + >span { + >a { + margin-inline: 5px; + } + color: var(--text-tertiary); + font-size: 16px; + line-height: 16px; + font-weight: 400; + >span { + text-transform: lowercase; + } + } +} + + +@media only screen and (max-width: 720px) { + .post { + width: calc(100vw - (100vw - 100%)); + grid-template-columns: 62px 1fr; + margin-left: 0px; + margin-right: 0px; + padding-right: 0px; + .content { + .message { + width: 80% !important; + } + } + } + + .postLink { + width: 100% !important; + } +} diff --git a/src/components/Note/NotificationNote/NotificationNote.tsx b/src/components/Note/NotificationNote/NotificationNote.tsx new file mode 100644 index 0000000..9c4c85d --- /dev/null +++ b/src/components/Note/NotificationNote/NotificationNote.tsx @@ -0,0 +1,41 @@ +import { A } from '@solidjs/router'; +import { Component } from 'solid-js'; +import { PrimalNote } from '../../../types/primal'; +import ParsedNote from '../../ParsedNote/ParsedNote'; +import NoteFooter from '../NoteFooter/NoteFooter'; + +import styles from './NotificationNote.module.scss'; +import { useThreadContext } from '../../../contexts/ThreadContext'; + +const Note: Component<{ note: PrimalNote }> = (props) => { + + const threadContext = useThreadContext(); + + const navToThread = (note: PrimalNote) => { + threadContext?.actions.setPrimaryNote(note); + }; + + return ( + navToThread(props.note)} + data-event={props.note.post.id} + data-event-bech32={props.note.post.noteId} + > +
+
+
+ +
+ +
+ +
+
+
+
+ ) +} + +export default Note; diff --git a/src/components/NotificationAvatar/NotificationAvatar.module.scss b/src/components/NotificationAvatar/NotificationAvatar.module.scss new file mode 100644 index 0000000..e8a9913 --- /dev/null +++ b/src/components/NotificationAvatar/NotificationAvatar.module.scss @@ -0,0 +1,165 @@ +@mixin avatar { + position: relative; + + background-color: var(--subtile-devider); + border-radius: 50%; + border: 2px solid var(--text-primary); + color: var(--text-primary); + font-weight: 500; + font-size: 12px; + line-height: 18px; + display: flex; + align-items: center; + justify-content: center; +} + +.verifiedIcon { + position: absolute; + top: 0px; + right: 0px; + width: 15px; + height: 15px; + display: inline-block; + margin: 0px 0px; + background-color: var(--accent-2); + -webkit-mask: url(../../assets/icons/verified.svg) no-repeat 0px / 15px; + mask: url(../../assets/icons/verified.svg) no-repeat 0px / 15px; +} + +@mixin iconBackground { + position: absolute; + right: 0px; + bottom: 0px; + width: 15px; + height: 15px; + background-color: var(--background-site); + border-radius: 50%; +} + +.xxsAvatar { + @include avatar; + width: 24px; + height: 24px; +} + +.xsAvatar { + @include avatar; + width: 36px; + height: 36px; +} + +.vsAvatar { + @include avatar; + width: 42px; + height: 42px; +} + +.smallAvatar { + @include avatar; + width: 48px; + height: 48px; +} + +.midAvatar { + @include avatar; + width: 52px; + height: 52px; +} + +.largeAvatar { + @include avatar; + width: 72px; + height: 72px; +} + +.extraLargeAvatar { + @include avatar; + width: 80px; + height: 80px; +} + +.xxlAvatar { + @include avatar; + width: 142px; + height: 142px; +} + +@mixin missing { + display: grid; + place-items: center; + color: var(--missing-avatar-text); + background-color: var(--subtile-devider); + border-radius: 50%; +} + +.xxsMissing { + @include missing; + width: 24px; + height: 24px; + font-size: 10px; + -webkit-mask: url(../../assets/icons/default_nostrich.svg) no-repeat 0px / 24px; + mask: url(../../assets/icons/default_nostrich.svg) no-repeat 0px / 24px; +} + +.xsMissing { + @include missing; + width: 32px; + height: 32px; + font-size: 10px; + -webkit-mask: url(../../assets/icons/default_nostrich.svg) no-repeat 0px / 32px; + mask: url(../../assets/icons/default_nostrich.svg) no-repeat 0px / 32px; +} + +.vsMissing { + @include missing; + width: 42px; + height: 42px; + font-size: 10px; + -webkit-mask: url(../../assets/icons/default_nostrich.svg) no-repeat 0px / 42px; + mask: url(../../assets/icons/default_nostrich.svg) no-repeat 0px / 42px; +} + +.smallMissing { + @include missing; + width: 48px; + height: 48px; + font-size: 12px; + -webkit-mask: url(../../assets/icons/default_nostrich.svg) no-repeat 0px / 48px; + mask: url(../../assets/icons/default_nostrich.svg) no-repeat 0px / 48px; +} + +.midMissing { + @include missing; + width: 52px; + height: 52px; + font-size: 16px; + -webkit-mask: url(../../assets/icons/default_nostrich.svg) no-repeat 0px / 52px; + mask: url(../../assets/icons/default_nostrich.svg) no-repeat 0px / 52px; +} + +.largeMissing { + @include missing; + width: 72px; + height: 72px; + font-size: 18px; + -webkit-mask: url(../../assets/icons/default_nostrich.svg) no-repeat 0px / 72px; + mask: url(../../assets/icons/default_nostrich.svg) no-repeat 0px / 72px; +} + +.extraLargeMissing { + @include missing; + width: 80px; + height: 80px; + font-size: 20px; + -webkit-mask: url(../../assets/icons/default_nostrich.svg) no-repeat 0px / 80px; + mask: url(../../assets/icons/default_nostrich.svg) no-repeat 0px / 80px; +} + +.xxlMissing { + @include missing; + width: 142px; + height: 142px; + font-size: 20px; + -webkit-mask: url(../../assets/icons/default_nostrich.svg) no-repeat 0px / 142px; + mask: url(../../assets/icons/default_nostrich.svg) no-repeat 0px / 142px; +} diff --git a/src/components/NotificationAvatar/NotificationAvatar.tsx b/src/components/NotificationAvatar/NotificationAvatar.tsx new file mode 100644 index 0000000..e7323ac --- /dev/null +++ b/src/components/NotificationAvatar/NotificationAvatar.tsx @@ -0,0 +1,62 @@ +import { Component, Show } from 'solid-js'; +import defaultAvatar from '../../assets/icons/default_nostrich.svg'; + +import styles from './NotificationAvatar.module.scss'; + +const NotificationAvatar: Component<{ + number: number | undefined, + size?: "xxs" | "xs" | "vs" | "sm" | "md" | "lg" | "xl" | "xxl", + verified?: string +}> = (props) => { + + const selectedSize = props.size || 'sm'; + + const avatarClass = { + xxs: styles.xxsAvatar, + xs: styles.xsAvatar, + vs: styles.vsAvatar, + sm: styles.smallAvatar, + md: styles.midAvatar, + lg: styles.largeAvatar, + xl: styles.extraLargeAvatar, + xxl: styles.xxlAvatar, + }; + + const missingClass = { + xxs: styles.xxsMissing, + xs: styles.xsMissing, + vs: styles.vsMissing, + sm: styles.smallMissing, + md: styles.midMissing, + lg: styles.largeMissing, + xl: styles.extraLargeMissing, + xxl: styles.xxlMissing, + }; + + const imgError = (event: any) => { + const image = event.target; + image.onerror = ""; + image.src = defaultAvatar; + return true; + } + + return ( +
+
+ } + > + +{props.number} + + +
+
+
+
+ + ) +} + +export default NotificationAvatar; diff --git a/src/components/Notifications/NotificationItem.module.scss b/src/components/Notifications/NotificationItem.module.scss new file mode 100644 index 0000000..3481231 --- /dev/null +++ b/src/components/Notifications/NotificationItem.module.scss @@ -0,0 +1,93 @@ +.notifItem { + display: grid; + grid-template-columns: 44px 1fr; + + padding-top: 12px; + padding-bottom: 17px; + border-bottom: 1px solid var(--subtile-devider); + + .notifType { + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + padding-block: 6px; + } + + .iconInfo { + color: #FFA02F; + font-size: 14px; + line-height: 16px; + font-weight: 700; + margin-top: 6px; + } + + .notifContent { + display: flex; + flex-direction: column; + + .avatars { + display: flex; + padding-bottom: 8px; + .avatar { + border: solid 2px var(--text-primary); + border-radius: 50%; + width: 36px; + transition: margin-right 0.2s; + margin-right: -16px; + + &:hover { + transition: margin-right 0.2s; + margin-right: 5px; + } + } + } + + .description { + display: flex; + align-items: baseline; + padding-bottom: 8px; + .firstUser { + display: flex; + align-items: center; + font-weight: 800; + font-size: 16px; + line-height: 18px; + color: var(--text-secondary); + } + + .restUsers { + margin-left: 4px; + font-weight: 400; + font-size: 16px; + line-height: 18px; + color: var(--text-secondary); + } + } + + .reference { + font-weight: 400; + font-size: 16px; + line-height: 22px; + color: var(--text-tertiary); + } + } +} + +.firstUserName { + max-width: 200px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.verifiedIcon { + width: 14px; + height: 14px; + min-width: 14px; + display: inline-block; + margin-left: 2px; + background-color: var(--text-tertiary-2); + -webkit-mask: url(../../assets/icons/verified.svg) no-repeat 0 / 14px; + mask: url(../../../assets/icons/verified.svg) no-repeat 0 / 14px; +} diff --git a/src/components/Notifications/NotificationItem.tsx b/src/components/Notifications/NotificationItem.tsx new file mode 100644 index 0000000..2f61e20 --- /dev/null +++ b/src/components/Notifications/NotificationItem.tsx @@ -0,0 +1,195 @@ +import { useIntl } from '@cookbook/solid-intl'; +import { A } from '@solidjs/router'; +import { Component, createEffect, createMemo, createSignal, For, Show } from 'solid-js'; +import { NotificationType } from '../../constants'; +import { trimVerification } from '../../lib/profile'; +import { truncateNpub, userName } from '../../stores/profile'; +import { PrimalNote, PrimalNotifUser } from '../../types/primal'; +import Avatar from '../Avatar/Avatar'; + +import styles from './NotificationItem.module.scss'; + +import userFollow from '../../assets/icons/notifications/user_followed.svg'; +import userUnFollow from '../../assets/icons/notifications/user_unfollowed.svg'; + +import postZapped from '../../assets/icons/notifications/post_zapped.svg'; +import postLiked from '../../assets/icons/notifications/post_liked.svg'; +import postReposted from '../../assets/icons/notifications/post_reposted.svg'; +import postReplied from '../../assets/icons/notifications/post_replied.svg'; + +import mention from '../../assets/icons/notifications/mention.svg'; +import mentionedPost from '../../assets/icons/notifications/mentioned_post.svg'; + +import mentionZapped from '../../assets/icons/notifications/mention_zapped.svg'; +import mentionLiked from '../../assets/icons/notifications/mention_liked.svg'; +import mentionReposted from '../../assets/icons/notifications/mention_reposted.svg'; +import mentionReplied from '../../assets/icons/notifications/mention_replied.svg'; + +import mentionedPostZapped from '../../assets/icons/notifications/mentioned_post_zapped.svg'; +import mentionedPostLiked from '../../assets/icons/notifications/mentioned_post_liked.svg'; +import mentionedPostReposted from '../../assets/icons/notifications/mentioned_post_reposted.svg'; +import mentionedPostReplied from '../../assets/icons/notifications/mentioned_post_replied.svg'; +import NotificationNote from '../Note/NotificationNote/NotificationNote'; +import NotificationAvatar from '../NotificationAvatar/NotificationAvatar'; +import { notificationsNew as t } from '../../translations'; + +const typeIcons: Record = { + [NotificationType.NEW_USER_FOLLOWED_YOU]: userFollow, + [NotificationType.USER_UNFOLLOWED_YOU]: userUnFollow, + + [NotificationType.YOUR_POST_WAS_ZAPPED]: postZapped, + [NotificationType.YOUR_POST_WAS_LIKED]: postLiked, + [NotificationType.YOUR_POST_WAS_REPOSTED]: postReposted, + [NotificationType.YOUR_POST_WAS_REPLIED_TO]: postReplied, + + [NotificationType.YOU_WERE_MENTIONED_IN_POST]: mention, + [NotificationType.YOUR_POST_WAS_MENTIONED_IN_POST]: mentionedPost, + + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_ZAPPED]: mentionZapped, + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_LIKED]: mentionLiked, + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_REPOSTED]: mentionReposted, + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_REPLIED_TO]: mentionReplied, + + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_ZAPPED]: mentionedPostZapped, + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_LIKED]: mentionedPostLiked, + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPOSTED]:mentionedPostReposted, + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPLIED_TO]: mentionedPostReplied, + +} + +type NotificationItemProps = { + type: NotificationType, + users?: PrimalNotifUser[], + note?: PrimalNote, + iconInfo?: string, + iconTooltip?: string, +}; + +const uniqueifyUsers = (users: PrimalNotifUser[]) => { + return users.reduce((acc, u) => { + const found = acc.find(a => a.id === u.id); + return found ? acc : [...acc, u]; + }, []); +} + +const avatarDisplayLimit = 12; + +const NotificationItem: Component = (props) => { + + const intl = useIntl(); + + const [typeIcon, setTypeIcon] = createSignal(''); + + const sortedUsers = createMemo(() => { + if (!props.users || props.users.length === 0) { + return []; + } + + const users = uniqueifyUsers(props.users); + + return users.sort((a, b) => b.followers_count - a.followers_count); + }); + + const displayedUsers = createMemo(() => { + const limited = sortedUsers().slice(0, avatarDisplayLimit); + + return limited; + }); + + const numberOfUsers = createMemo(() => sortedUsers().length); + + const remainingUsers = createMemo(() => { + const remainder = numberOfUsers() - displayedUsers().length; + + return remainder > 99 ? 99 : remainder; + }); + + + const firstUserName = createMemo(() => { + const firstUser = sortedUsers()[0]; + + if (!firstUser) { + return ''; + } + + return firstUser.displayName || + firstUser.name || + truncateNpub(firstUser.npub); + }); + + const firstUserVerification = createMemo(() => { + const firstUser = sortedUsers()[0]; + + if (!firstUser || !firstUser.nip05) { + return null; + } + + return trimVerification(firstUser.nip05); + + }); + + const typeDescription = () => { + + return intl.formatMessage(t[props.type], { + number: numberOfUsers() - 1, + }); + + } + + createEffect(() => { + setTypeIcon(typeIcons[props.type]) + }); + + return ( +
+
+ notification icon +
+ {props.iconInfo} +
+
+
+
+ 0}> + + {(user) => ( + + + + )} + + + avatarDisplayLimit - 1}> + + +
+
+
+ {firstUserName()} + + + +
+
{typeDescription()}
+
+ +
+ + + +
+
+
+
+ ); +} + +export default NotificationItem; diff --git a/src/components/Notifications/NotificationItem2.tsx b/src/components/Notifications/NotificationItem2.tsx new file mode 100644 index 0000000..16752e4 --- /dev/null +++ b/src/components/Notifications/NotificationItem2.tsx @@ -0,0 +1,161 @@ +import { useIntl } from '@cookbook/solid-intl'; +import { A } from '@solidjs/router'; +import { Component, createEffect, createSignal, Show } from 'solid-js'; +import { NotificationType, notificationTypeNoteProps, notificationTypeUserProps } from '../../constants'; +import { trimVerification } from '../../lib/profile'; +import { userName } from '../../stores/profile'; +import { PrimalNote, PrimalNotification, PrimalUser } from '../../types/primal'; +import Avatar from '../Avatar/Avatar'; + +import styles from './NotificationItem.module.scss'; + +import userFollow from '../../assets/icons/notifications/user_followed.svg'; +import userUnFollow from '../../assets/icons/notifications/user_unfollowed.svg'; + +import postZapped from '../../assets/icons/notifications/post_zapped.svg'; +import postLiked from '../../assets/icons/notifications/post_liked.svg'; +import postReposted from '../../assets/icons/notifications/post_reposted.svg'; +import postReplied from '../../assets/icons/notifications/post_replied.svg'; + +import mention from '../../assets/icons/notifications/mention.svg'; +import mentionedPost from '../../assets/icons/notifications/mentioned_post.svg'; + +import mentionZapped from '../../assets/icons/notifications/mention_zapped.svg'; +import mentionLiked from '../../assets/icons/notifications/mention_liked.svg'; +import mentionReposted from '../../assets/icons/notifications/mention_reposted.svg'; +import mentionReplied from '../../assets/icons/notifications/mention_replied.svg'; + +import mentionedPostZapped from '../../assets/icons/notifications/mentioned_post_zapped.svg'; +import mentionedPostLiked from '../../assets/icons/notifications/mentioned_post_liked.svg'; +import mentionedPostReposted from '../../assets/icons/notifications/mentioned_post_reposted.svg'; +import mentionedPostReplied from '../../assets/icons/notifications/mentioned_post_replied.svg'; +import NotificationNote from '../Note/NotificationNote/NotificationNote'; +import { truncateNumber } from '../../lib/notifications'; +import { notificationsOld as t } from '../../translations'; + +const typeIcons: Record = { + [NotificationType.NEW_USER_FOLLOWED_YOU]: userFollow, + [NotificationType.USER_UNFOLLOWED_YOU]: userUnFollow, + + [NotificationType.YOUR_POST_WAS_ZAPPED]: postZapped, + [NotificationType.YOUR_POST_WAS_LIKED]: postLiked, + [NotificationType.YOUR_POST_WAS_REPOSTED]: postReposted, + [NotificationType.YOUR_POST_WAS_REPLIED_TO]: postReplied, + + [NotificationType.YOU_WERE_MENTIONED_IN_POST]: mention, + [NotificationType.YOUR_POST_WAS_MENTIONED_IN_POST]: mentionedPost, + + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_ZAPPED]: mentionZapped, + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_LIKED]: mentionLiked, + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_REPOSTED]: mentionReposted, + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_REPLIED_TO]: mentionReplied, + + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_ZAPPED]: mentionedPostZapped, + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_LIKED]: mentionedPostLiked, + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPOSTED]:mentionedPostReposted, + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPLIED_TO]: mentionedPostReplied, + +} + +type NotificationItemProps = { + notes: PrimalNote[], + users: Record, + userStats: Record, + notification: PrimalNotification, +}; + +const NotificationItem2: Component = (props) => { + + const intl = useIntl(); + + const [typeIcon, setTypeIcon] = createSignal(''); + + const type = () => props.notification.type + + const note = () => { + const prop = notificationTypeNoteProps[type()]; + // @ts-ignore + const id = props.notification[prop]; + return props.notes.find(n => n.post.id === id) + }; + + const user = () => { + const prop = notificationTypeUserProps[type()]; + // @ts-ignore + const id = props.notification[prop]; + return props.users[`${id}`]; + }; + + const typeDescription = () => { + return intl.formatMessage(t[type()]); + + } + + createEffect(() => { + setTypeIcon(typeIcons[type()]) + }); + + + const isReply = () => { + return [ + NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPLIED_TO, + NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_REPLIED_TO, + NotificationType.YOUR_POST_WAS_REPLIED_TO, + ].includes(type()) + }; + + const isZapType = () => { + return [ + NotificationType.YOUR_POST_WAS_ZAPPED, + NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_ZAPPED, + NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_ZAPPED, + ].includes(type()) + }; + + + return ( +
+
+ notification icon + +
+ {truncateNumber(props.notification.satszapped || 0)} +
+
+
+
+
+ + + +
+
+
+ {userName(user())} + + + +
+
{typeDescription()}
+
+ +
+ + + +
+
+
+
+ ); +} + +export default NotificationItem2; diff --git a/src/components/NotificatiosSidebar/NotificationsSidebar.module.scss b/src/components/NotificatiosSidebar/NotificationsSidebar.module.scss new file mode 100644 index 0000000..25cdcd0 --- /dev/null +++ b/src/components/NotificatiosSidebar/NotificationsSidebar.module.scss @@ -0,0 +1,90 @@ +.sidebarHeading { + font-size: 18px; + font-weight: 800; + line-height: 22px; + color: var(--text-secondary-2); + text-transform: uppercase; + margin-bottom: 24px; +} + +.sidebarTitle { + font-weight: 800; + font-size: 18px; + line-height: 22px; + color: var(--text-secondary); +} + +.sidebarEmpty { + color: var(--text-secondary); + font-weight: 400; + font-size: 18px; + line-height: 20px; + text-transform: lowercase; +} + +.sidebarItems { + margin-bottom: 20px; + + .sidebarItem { + font-weight: 400; + font-size: 16px; + line-height: 22px; + color: var(--text-secondary); + + .itemAmount { + display: inline-block; + font-weight: 600; + font-size: 16px; + line-height: 22px; + color: var(--text-primary); + margin-right: 4px; + } + } +} + +.category { + display: flex; +} + +.categoryIcon { + display: flex; + padding-top: 3px; + width: 26px; + justify-content: center; +} + +@mixin statIcon { + width: 16px; + height: 16px; + background-color: var(--text-secondary); +} + +.followIcon { + @include statIcon; + -webkit-mask: url(../../assets/icons/notifications/follows.svg) no-repeat 0px / 16px; + mask: url(../../assets/icons/notifications/follows.svg) no-repeat 0px / 16px; +} + +.mentionIcon { + @include statIcon; + -webkit-mask: url(../../assets/icons/notifications/at.svg) no-repeat 0px / 16px; + mask: url(../../assets/icons/notifications/at.svg) no-repeat 0px / 16px; +} + +.zapIcon { + @include statIcon; + -webkit-mask: url(../../assets/icons/zaps_filled.svg) no-repeat 0px / 16px; + mask: url(../../assets/icons/zaps_filled.svg) no-repeat 0px / 16px; +} + +.activityIcon { + @include statIcon; + -webkit-mask: url(../../assets/icons/notifications/post_replied.svg) no-repeat 0px / 18px; + mask: url(../../assets/icons/notifications/post_replied.svg) no-repeat 0px / 18px; +} + +.contextIcon { + @include statIcon; + -webkit-mask: url(../../assets/icons/context.svg) no-repeat center; + mask: url(../../assets/icons/context.svg) no-repeat center; +} diff --git a/src/components/NotificatiosSidebar/NotificationsSidebar.tsx b/src/components/NotificatiosSidebar/NotificationsSidebar.tsx new file mode 100644 index 0000000..59cc8e1 --- /dev/null +++ b/src/components/NotificatiosSidebar/NotificationsSidebar.tsx @@ -0,0 +1,375 @@ +import { useIntl } from '@cookbook/solid-intl'; +import { Component, For, Show } from 'solid-js'; +import { NotificationType } from '../../constants'; +import { truncateNumber } from '../../lib/notifications'; +import { PrimalNotification, PrimalNotifUser, SortedNotifications } from '../../types/primal'; +import { notificationsSidebar as t } from '../../translations'; + +import styles from './NotificationsSidebar.module.scss'; + +const uniqueifyUsers = (users: PrimalNotifUser[]) => { + return users.reduce((acc, u) => { + const found = acc.find(a => a.id === u.id); + return found ? acc : [...acc, u]; + }, []); +} + +const NotificationsSidebar: Component<{ + notifications: SortedNotifications, + getUsers: (notifs: PrimalNotification[], type: NotificationType) => PrimalNotifUser[], +}> = (props) => { + + const intl = useIntl(); + + const follows = () => { + const followNotifs = props.notifications[NotificationType.NEW_USER_FOLLOWED_YOU] || []; + const unffolowNotifs = props.notifications[NotificationType.USER_UNFOLLOWED_YOU] || []; + + const followers = props.getUsers(followNotifs, NotificationType.USER_UNFOLLOWED_YOU); + const lost = props.getUsers(unffolowNotifs, NotificationType.USER_UNFOLLOWED_YOU); + + return [uniqueifyUsers(followers).length, uniqueifyUsers(lost).length]; + + + }; + + const mentions = () => { + const myMentionNotifs = props.notifications[NotificationType.YOU_WERE_MENTIONED_IN_POST] || []; + const myPostMentionNotifs = props.notifications[NotificationType.YOUR_POST_WAS_MENTIONED_IN_POST] || []; + + return [myMentionNotifs.length, myPostMentionNotifs.length]; + }; + + const zaps = () => { + const zapNotifs = props.notifications[NotificationType.YOUR_POST_WAS_ZAPPED] || []; + + const sats = zapNotifs.reduce((acc, n) => { + return n.satszapped ? acc + n.satszapped : acc; + }, 0); + + return [zapNotifs.length, sats]; + }; + + const activity = () => { + const replyNotifs = props.notifications[NotificationType.YOUR_POST_WAS_REPLIED_TO] || []; + const repostNotifs = props.notifications[NotificationType.YOUR_POST_WAS_REPOSTED] || []; + const likeNotifs = props.notifications[NotificationType.YOUR_POST_WAS_LIKED] || []; + + return [replyNotifs.length, repostNotifs.length, likeNotifs.length]; + }; + + const otherNotifications = () => { + const zapedMentionPostNotifs = props.notifications[NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_ZAPPED] || []; + const replyMentionPostNotifs = props.notifications[NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_LIKED] || []; + const repostMentionPostNotifs = props.notifications[NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_REPOSTED] || []; + const likeMentionPostNotifs = props.notifications[NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_REPLIED_TO] || []; + + const zapedPostMentionPostNotifs = props.notifications[NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_ZAPPED] || []; + const replyPostMentionPostNotifs = props.notifications[NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_LIKED] || []; + const repostPostMentionPostNotifs = props.notifications[NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPOSTED] || []; + const likePostMentionPostNotifs = props.notifications[NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPLIED_TO] || []; + + return [ + zapedMentionPostNotifs.length, + replyMentionPostNotifs.length, + repostMentionPostNotifs.length, + likeMentionPostNotifs.length, + + zapedPostMentionPostNotifs.length, + replyPostMentionPostNotifs.length, + repostPostMentionPostNotifs.length, + likePostMentionPostNotifs.length, + ]; + }; + + const otherNotifLabels = [ + { + id: 'notifications.sidebar.mentionsPostZap', + defaultMessage: `{number, plural, + =0 {} + one {mention was zapped} + other {mentions were zapped}}`, + description: 'Sidebar "posts you were mentioned in were zapped" stats description on the notification page', + }, + { + id: 'notifications.sidebar.mentionsPostLike', + defaultMessage: `{number, plural, + =0 {} + one {mention was liked} + other {mentions were liked}}`, + description: 'Sidebar "posts you were mentioned in were liked" stats description on the notification page', + }, + { + id: 'notifications.sidebar.mentionsPostReposted', + defaultMessage: `{number, plural, + =0 {} + one {mention was reposted} + other {mentions were reposted}}`, + description: 'Sidebar "posts you were mentioned in were reposted" stats description on the notification page', + }, + { + id: 'notifications.sidebar.mentionsPostReplied', + defaultMessage: `{number, plural, + =0 {} + one {mention was replied to} + other {mentions were replied to}}`, + description: 'Sidebar "posts you were mentioned in were replied to" stats description on the notification page', + }, + + { + id: 'notifications.sidebar.postMentionsPostZaped', + defaultMessage: `{number, plural, + =0 {} + one {post mention was zapped} + other {post mentions were zapped}}`, + description: 'Sidebar "posts your posts were mentioned in were zapped" stats description on the notification page', + }, + { + id: 'notifications.sidebar.postMentionsPostLike', + defaultMessage: `{number, plural, + =0 {} + one {post mention was liked} + other {post mentions were liked}}`, + description: 'Sidebar "posts your posts were mentioned in were liked" stats description on the notification page', + }, + { + id: 'notifications.sidebar.postMentionsPostReposted', + defaultMessage: `{number, plural, + =0 {} + one {post mention was reposted} + other {post mentions were reposted}}`, + description: 'Sidebar "posts your posts were mentioned in were reposted" stats description on the notification page', + }, + { + id: 'notifications.sidebar.postMentionsPostReposted', + defaultMessage: `{number, plural, + =0 {} + one {post mention was replied to} + other {post mentions were replied to}}`, + description: 'Sidebar "posts your posts were mentioned in were replied to" stats description on the notification page', + }, + ]; + + const nothingNew = () => { + return mentions()[0] + mentions()[1] + + follows()[0] + follows()[1] + + zaps()[0] + + activity()[0] + activity()[1] + activity()[2] === 0; + } + + return ( + <> +
+ {intl.formatMessage(t.heading)} +
+ + +
+ {intl.formatMessage(t.empty)} +
+
+ + 0}> +
+
+
+
+
+
+ {intl.formatMessage(t.followers)} +
+
+
+ 0}> +
{truncateNumber(follows()[0])}
+ {intl.formatMessage( + t.gainedFollowers, + { + number: follows()[0], + }, + )} +
+
+
+ 0}> +
{truncateNumber(follows()[1])}
+ {intl.formatMessage( + t.lostFollowers, + { + number: follows()[1], + }, + )} +
+
+
+
+
+
+ + 0}> +
+
+
+
+
+
+ {intl.formatMessage(t.zaps)} +
+
+
+ 0}> +
{truncateNumber(zaps()[0])}
+ {intl.formatMessage( + t.zapNumber, + { + number: zaps()[0], + }, + )} +
+
+
+ 0}> +
{truncateNumber(zaps()[1])}
+ {intl.formatMessage( + t.statsNumber, + { + number: zaps()[1], + }, + )} +
+
+
+
+
+
+ + 0}> +
+
+
+
+
+
+ {intl.formatMessage(t.activities)} +
+
+
+ 0}> +
{truncateNumber(activity()[0])}
+ {intl.formatMessage( + t.replies, + { + number: activity()[0], + } + )} +
+
+
+ 0}> +
{truncateNumber(activity()[1])}
+ {intl.formatMessage( + t.reposts, + { + number: activity()[1], + }, + )} +
+
+
+ 0}> +
{truncateNumber(activity()[2])}
+ {intl.formatMessage( + t.likes, + { + number: activity()[2], + } + )} +
+
+
+
+
+
+ + 0}> +
+
+
+
+
+
+ {intl.formatMessage(t.mentions)} +
+
+
+ 0}> +
{truncateNumber(mentions()[0])}
+ {intl.formatMessage( + t.mentionsYou, + { + number: mentions()[0], + } + )} +
+
+
+ 0}> +
{truncateNumber(mentions()[1])}
+ {intl.formatMessage( + t.mentionsYourPost, + { + number: mentions()[1], + } + )} +
+
+
+
+
+
+ + 0} + > +
+
+
+
+
+
+ {intl.formatMessage(t.other)} +
+
+ + {(stat, index) => ( + 0}> +
+
+ {truncateNumber(stat)} +
+ {intl.formatMessage( + otherNotifLabels[index()], + { + number: stat, + } + )} +
+
+ )} +
+
+
+
+
+ + ) +} + +export default NotificationsSidebar; diff --git a/src/components/PageNav/PageNav.module.scss b/src/components/PageNav/PageNav.module.scss new file mode 100644 index 0000000..d22cb70 --- /dev/null +++ b/src/components/PageNav/PageNav.module.scss @@ -0,0 +1,34 @@ +@mixin navButton { + display: inline-block; + border: none; + box-shadow: none; + background-color: unset; + margin: 0px; + padding: 0px; + width: 12px; + height: 20px; +} + +.backIcon { + @include navButton; + margin-right: 28px; + + background-color: var(--text-primary); + -webkit-mask: url(../../assets/icons/back.svg) no-repeat center; + mask: url(../../assets/icons/back.svg) no-repeat center; +} + +.forwardIcon { + @include navButton; + + background-color: var(--text-primary); + -webkit-mask: url(../../assets/icons/forward.svg) no-repeat center; + mask: url(../../assets/icons/forward.svg) no-repeat center; +} + + +@media only screen and (max-width: 1300px) { + .backIcon { + margin-right: 8px; + } +} diff --git a/src/components/PageNav/PageNav.tsx b/src/components/PageNav/PageNav.tsx new file mode 100644 index 0000000..89a87c2 --- /dev/null +++ b/src/components/PageNav/PageNav.tsx @@ -0,0 +1,25 @@ +import type { Component } from 'solid-js'; + +import styles from './PageNav.module.scss'; + +const PageNav: Component = () => { + + const onBack = () => { + window.history.back(); + } + + const onNext = () => { + window.history.forward(); + } + + return ( + <> + + + + ) +} + +export default PageNav; diff --git a/src/components/PageTitle/PageTitle.tsx b/src/components/PageTitle/PageTitle.tsx new file mode 100644 index 0000000..9d4d518 --- /dev/null +++ b/src/components/PageTitle/PageTitle.tsx @@ -0,0 +1,28 @@ +import { Component, createEffect, onCleanup } from 'solid-js'; + +const titleTag = document.querySelector('title'); +let origTitle = titleTag?.innerText || ''; + +const PageTitle: Component<{ title: string }> = (props) => { + + createEffect(() => { + + if (titleTag) { + titleTag.innerText = props.title; + } + }); + + onCleanup(() => { + if (titleTag) { + titleTag.innerText = origTitle; + } + + }); + + return ( + <> + + ) +} + +export default PageTitle; diff --git a/src/components/Paginator/Paginator.module.scss b/src/components/Paginator/Paginator.module.scss new file mode 100644 index 0000000..092e2a1 --- /dev/null +++ b/src/components/Paginator/Paginator.module.scss @@ -0,0 +1,17 @@ +.paginator { + color: var(--text-tertiary-2); + position: absolute; + bottom: 0px; + width: 100%; + height: 1280px; + pointer-events: none; +} + +.smallPaginator { + color: var(--text-tertiary-2); + position: relative; + top: 0px; + width: 100%; + height: 280px; + pointer-events: none; +} diff --git a/src/components/Paginator/Paginator.tsx b/src/components/Paginator/Paginator.tsx new file mode 100644 index 0000000..52998e0 --- /dev/null +++ b/src/components/Paginator/Paginator.tsx @@ -0,0 +1,34 @@ +import { onCleanup, onMount } from "solid-js"; +import styles from "./Paginator.module.scss"; + +export default function Paginator(props: { + loadNextPage: (() => void) | undefined, + isSmall?: boolean, +}) { + let observer: IntersectionObserver | undefined; + + onMount(() => { + observer = new IntersectionObserver(entries => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + props.loadNextPage && props.loadNextPage(); + } + }); + }); + + const pag = document.getElementById('pagination_trigger'); + + pag && observer?.observe(pag); + }); + + onCleanup(() => { + const pag = document.getElementById('pagination_trigger'); + + pag && observer?.unobserve(pag); + }); + + return ( +
+
+ ) +} diff --git a/src/components/ParsedNote/ParsedNote.module.scss b/src/components/ParsedNote/ParsedNote.module.scss new file mode 100644 index 0000000..e86e200 --- /dev/null +++ b/src/components/ParsedNote/ParsedNote.module.scss @@ -0,0 +1,90 @@ +.mentionedUser { + color: var(--accent-1); + text-decoration: none; +} + +.mentionedNote { + border: solid 1px var(--subtile-devider); + border-radius: 4px; + margin-block: 6px; + padding: 18px; + display: grid; + grid-template-columns: 1fr; + grid-template-rows: 32px 1fr; + grid-row-gap: 8px; + text-decoration: none; + color: unset; + line-height: 20px; + + &:hover { + text-decoration: none !important; + } + + .mentionedNoteHeader { + display: flex; + justify-content: flex-start; + align-items: center; + color: var(--text-tertiary-2); + + .postInfo { + display: flex; + justify-content: flex-start; + margin-left: 11px; + + .userInfo { + font-size: 14px; + line-height: 16px; + font-weight: 400; + display: flex; + align-items: center; + width: auto; + .userName { + max-width: 150px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + } + + .time{ + margin: 0px 2px; + min-width: 40px; + font-size: 14px; + line-height: 16px; + font-weight: 400; + &::before { + content: "|"; + padding: 0px 2px; + } + } + + .contextMenu { + min-width: 5px; + display: inline-block; + text-align: center; + font-weight: bold; + } + } + } +} + +.verifiedIcon { + width: 13px; + height: 12px; + display: inline-block; + margin: 0px 2px; + background-color: var(--text-tertiary-2); + -webkit-mask: url(../../assets/icons/verified.svg) no-repeat center; + mask: url(../../assets/icons/verified.svg) no-repeat center; +} + +.bordered { + border:solid 1px var(--subtile-devider); + border-radius: 8px; + margin-block: 8px; + overflow: hidden; +} + +.error { + color: var(--brand-1); +} diff --git a/src/components/ParsedNote/ParsedNote.tsx b/src/components/ParsedNote/ParsedNote.tsx new file mode 100644 index 0000000..e9a3f43 --- /dev/null +++ b/src/components/ParsedNote/ParsedNote.tsx @@ -0,0 +1,231 @@ +import { A } from '@solidjs/router'; +import { hexToNpub } from '../../lib/keys'; +import { linkPreviews, parseNote1 } from '../../lib/notes'; +import { truncateNpub, userName } from '../../stores/profile'; +import EmbeddedNote from '../EmbeddedNote/EmbeddedNote'; +import { + Component, createEffect, createSignal, +} from 'solid-js'; +import { + PrimalNote, +} from '../../types/primal'; + +import styles from './ParsedNote.module.scss'; +import { nip19 } from 'nostr-tools'; +import LinkPreview from '../LinkPreview/LinkPreview'; +import MentionedUserLink from '../Note/MentionedUserLink/MentionedUserLink'; + + +export const parseNoteLinks = (text: string, note: PrimalNote, highlightOnly = false) => { + + const regex = /\bnostr:((note|nevent)1\w+)\b|#\[(\d+)\]/g; + + return text.replace(regex, (url) => { + const [_, id] = url.split(':'); + + if (!id) { + return url; + } + + try { + const eventId = nip19.decode(id).data as string | nip19.EventPointer; + const hex = typeof eventId === 'string' ? eventId : eventId.id; + const noteId = nip19.noteEncode(hex); + + const path = `/thread/${noteId}`; + + const ment = note.mentionedNotes && note.mentionedNotes[hex]; + + const link = highlightOnly ? + {url} : + ment ? +
+ +
: + {url}; + + // @ts-ignore + return link.outerHTML || url; + } catch (e) { + return `${url}`; + } + + }); + +}; + +export const parseNpubLinks = (text: string, note: PrimalNote, highlightOnly = false) => { + + const regex = /\bnostr:((npub|nprofile)1\w+)\b|#\[(\d+)\]/g; + + return text.replace(regex, (url) => { + const [_, id] = url.split(':'); + + if (!id) { + return url; + } + + try { + const profileId = nip19.decode(id).data as string | nip19.ProfilePointer; + + const hex = typeof profileId === 'string' ? profileId : profileId.pubkey; + const npub = hexToNpub(hex); + + const path = `/profile/${npub}`; + + const user = note.mentionedUsers && note.mentionedUsers[hex]; + + let link = highlightOnly ? + @{truncateNpub(npub)} : + @{truncateNpub(npub)}; + + if (user) { + link = highlightOnly ? + @{userName(user)} : + MentionedUserLink({ user }); + } + + // @ts-ignore + return link.outerHTML || url; + } catch (e) { + return `${url}`; + } + }); + +}; + +const ParsedNote: Component<{ note: PrimalNote, ignoreMentionedNotes?: boolean}> = (props) => { + + const parsedContent = (text: string) => { + const regex = /\#\[([0-9]*)\]/g; + let parsed = text; + + let refs = []; + let match; + + while((match = regex.exec(text)) !== null) { + refs.push(match[1]); + } + + if (refs.length > 0) { + for(let i =0; i < refs.length; i++) { + let r = parseInt(refs[i]); + + const tag = props.note.post.tags[r]; + + if (tag === undefined || tag.length === 0) continue; + + if ( + tag[0] === 'e' && + props.note.mentionedNotes && + props.note.mentionedNotes[tag[1]] + ) { + const embeded = ( +
+ +
+ ); + + + // @ts-ignore + parsed = parsed.replace(`#[${r}]`, embeded.outerHTML); + } + + if (tag[0] === 'p' && props.note.mentionedUsers && props.note.mentionedUsers[tag[1]]) { + const user = props.note.mentionedUsers[tag[1]]; + + const link = MentionedUserLink({ user }); + + // @ts-ignore + parsed = parsed.replace(`#[${r}]`, link.outerHTML); + } + } + } + + return parsed; + + }; + + const highlightHashtags = (text: string) => { + const regex = /(?:\s|^)#[^\s!@#$%^&*(),.?":{}|<>]+/ig; + + return text.replace(regex, (token) => { + const [space, term] = token.split('#'); + const embeded = ( + + {space} + #{term} + + ); + + // @ts-ignore + return embeded.outerHTML; + }); + } + + const replaceLinkPreviews = (text: string, previews: Record) => { + let parsed = text; + + const regex = /__LINK__.*?__LINK__/ig; + + parsed = parsed.replace(regex, (link) => { + const url = link.split('__LINK__')[1]; + + const preview = previews[url]; + + // No preview? That can only mean that we are still waiting. + if (!preview) { + return link; + } + + if (preview.noPreview) { + return `${url}`; + } + + const linkElement = (
); + + // @ts-ignore + return linkElement.outerHTML; + }); + + return parsed; + } + + const content = () => { + return parseNoteLinks( + parseNpubLinks( + parsedContent( + highlightHashtags( + parseNote1(props.note.post.content) + ), + ), + props.note, + ), + props.note, + ); + }; + + const [displayedContent, setDisplayedContent] = createSignal(content()); + + createEffect(() => { + const newContent = replaceLinkPreviews(displayedContent(), { ...linkPreviews }); + + setDisplayedContent(() => newContent); + }); + + + return ( +
+
+ ); +}; + +export default ParsedNote; diff --git a/src/components/PeopleList/PeopleList.module.scss b/src/components/PeopleList/PeopleList.module.scss new file mode 100644 index 0000000..fb90885 --- /dev/null +++ b/src/components/PeopleList/PeopleList.module.scss @@ -0,0 +1,179 @@ +@mixin heading { + position: -webkit-sticky; + position: sticky; + top: 0px; + width: 100%; + height: 44px; + // background-color: var(--background-site); + background: var(--fade-gradient-vertical); + z-index: 5; + padding-bottom: 22px; + display:flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + font-size: 18px; + font-weight: 800; + line-height: 20px; + color: var(--text-secondary-2); + text-transform: uppercase; + >div{ + height: 22px; + >span { + color: var(--text-tertiary-2); + text-transform: lowercase; + margin-left: 6px; + } + } +} + +.trendingSection { + // position: -webkit-sticky; + // position: sticky; + // top: 0px; + padding-top: 44px; + margin-bottom: 228px +} + +.stickyWrapper { + height: 100%; + position: fixed; + height: 100%; + overflow-y: scroll; + + &::-webkit-scrollbar{ + display: none; + } +} + +.heading { + @include heading(); +} + +.peopleList { + margin-bottom: 33px; + display: grid; + grid-template-columns: 52px 156px 64px; + grid-template-rows: 1fr; + grid-template-areas: "avatar content follow"; + grid-column-gap: 14px; + text-decoration: none; + + .avatar { + grid-area: avatar; + display: grid; + justify-items: center; + height: 52px; + + .avatarImg { + width: 52px; + height: 52px; + border-radius: 50%; + } + } + + .content { + grid-area: content; + display: flex; + flex-direction: column; + justify-content: flex-start; + + .name { + color: var(--text-primary); + font-weight: 400; + font-size: 12px; + line-height: 12px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + + .verification { + font-size: 12px; + line-height: 16px; + font-weight: 400; + color: var(--text-tertiary-2); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + + .verifiedName { + font-size: 12px; + line-height: 16px; + font-weight: 700; + color: var(--text-tertiary-2); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + + .npub { + font-size: 12px; + line-height: 16px; + font-weight: 300; + color: var(--text-tertiary-2); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + + &:hover { + .message, .name, .time { + color: var(--text-primary); + text-decoration: underline; + } + + cursor: pointer; + } + } + + @mixin followButton { + grid-area: follow; + align-items: center; + display: flex; + align-items: center; + button { + width: 64px; + height: 40px; + background: var(--brand-gradient); + border-radius: 6px; + padding: 0px; + font-size: 12px; + line-height: 16px; + margin: 0px; + } + + } + + .follow { + @include followButton; + } + + .unfollow { + @include followButton; + button { + background-color: var(--background-card); + background: linear-gradient(var(--background-card), var(--background-card)) padding-box, + var(--brand-gradient) border-box; + border: 1px solid transparent; + } + } + + &:hover { + .name { + text-decoration: underline; + color: var(--text-primary); + } + } +} + +.verifiedIcon { + width:13px; + height: 12px; + display: inline-block; + margin: 0px 2px; + background-color: var(--text-tertiary-2); + -webkit-mask: url(../../assets/icons/verified.svg) no-repeat center; + mask: url(../../assets/icons/verified.svg) no-repeat center; +} diff --git a/src/components/PeopleList/PeopleList.tsx b/src/components/PeopleList/PeopleList.tsx new file mode 100644 index 0000000..cfcbba6 --- /dev/null +++ b/src/components/PeopleList/PeopleList.tsx @@ -0,0 +1,56 @@ +import { A } from '@solidjs/router'; +import { Component, For, Show } from 'solid-js'; +import { authorName, nip05Verification, truncateNpub } from '../../stores/profile'; +import { PrimalUser } from '../../types/primal'; +import Avatar from '../Avatar/Avatar'; +import FollowButton from '../FollowButton/FollowButton'; + +import styles from './PeopleList.module.scss'; + + +const PeopleList: Component<{ people: PrimalUser[], label: string}> = (props) => { + const people = () => props.people; + + return ( + + ); +} + +export default PeopleList; diff --git a/src/components/PostButton/PostButton.module.scss b/src/components/PostButton/PostButton.module.scss new file mode 100644 index 0000000..09d3d42 --- /dev/null +++ b/src/components/PostButton/PostButton.module.scss @@ -0,0 +1,19 @@ +.postButton { + width: 36px; + height: 36px; + padding: 0px; + border-radius: 0px 6px 6px 0px; + margin: 0px; + background: var(--brand-gradient); +} + +.postIcon { + display: inline-block; + width: 24px; + height: 24px; + vertical-align: middle; + + background-color: white; + -webkit-mask: url(../../assets/icons/post.svg) no-repeat center; + mask: url(../../assets/icons/post.svg) no-repeat center; +} diff --git a/src/components/PostButton/PostButton.tsx b/src/components/PostButton/PostButton.tsx new file mode 100644 index 0000000..5d8716f --- /dev/null +++ b/src/components/PostButton/PostButton.tsx @@ -0,0 +1,15 @@ +import styles from "./PostButton.module.scss"; + +export default function PostButton() { + + const showPostForm = () => {}; + + return ( + + ) +} diff --git a/src/components/ProfileSidebar/ProfileSidebar.module.scss b/src/components/ProfileSidebar/ProfileSidebar.module.scss new file mode 100644 index 0000000..498bfdb --- /dev/null +++ b/src/components/ProfileSidebar/ProfileSidebar.module.scss @@ -0,0 +1,38 @@ +@mixin heading { + position: -webkit-sticky; + position: sticky; + top: 0px; + width: 100%; + height: 44px; + // background-color: var(--background-site); + background: var(--fade-gradient-vertical); + z-index: 5; + padding-bottom: 22px; + display:flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + font-size: 18px; + font-weight: 800; + line-height: 22px; + color: var(--text-secondary-2); + text-transform: uppercase; + >div{ + display: flex; + height: 22px; + >span { + color: var(--text-tertiary-2); + text-transform: lowercase; + margin-left: 6px; + } + } +} + +.headingTrending { + @include heading(); +} + +.noNotes { + color: var(--text-tertiary-2); + text-transform: lowercase; +} diff --git a/src/components/ProfileSidebar/ProfileSidebar.tsx b/src/components/ProfileSidebar/ProfileSidebar.tsx new file mode 100644 index 0000000..94fecbb --- /dev/null +++ b/src/components/ProfileSidebar/ProfileSidebar.tsx @@ -0,0 +1,47 @@ +import { Component, For, Show } from 'solid-js'; +import { + PrimalNote, + PrimalUser +} from '../../types/primal'; + +import styles from './ProfileSidebar.module.scss'; +import SmallNote from '../SmallNote/SmallNote'; +import { useIntl } from '@cookbook/solid-intl'; +import { userName } from '../../stores/profile'; +import { profile as t } from '../../translations'; + + +const ProfileSidebar: Component<{ notes: PrimalNote[] | undefined, profile: PrimalUser | undefined }> = (props) => { + + const intl = useIntl(); + + return ( + +
+
+ {intl.formatMessage(t.sidebarCaption)} +
+
+ + 0} + fallback={ +
+ {intl.formatMessage( + t.sidebarNoNotes, + { + name: userName(props.profile), + }, + )} +
+ } + > + + {(note) => } + +
+
+ ); +} + +export default ProfileSidebar; diff --git a/src/components/ProfileWidget/ProfileWidget.module.scss b/src/components/ProfileWidget/ProfileWidget.module.scss new file mode 100644 index 0000000..309e615 --- /dev/null +++ b/src/components/ProfileWidget/ProfileWidget.module.scss @@ -0,0 +1,113 @@ +.userProfile { + display: grid; + width: 146px; + height: 46px; + grid-template-columns: 42px 1fr; + grid-column-gap: 5px; + position: relative; + align-items: center; + text-decoration: none; + + .background { + position: absolute; + top: 0; + left: 0; + width: 146px; + height: 46px; + background-color: var(--background-input); + background: linear-gradient(var(--background-input), var(--background-input)) padding-box, + var(--brand-gradient) border-box; + border-radius: 21px; + border: 1px solid transparent; + opacity: 0.5; + transition: opacity 0.4s; + + } + + &:hover { + .background { + opacity: 1; + transition: opacity 0.4s; + } + } + +} +.avatar { + z-index: 1; + padding: 2px; +} + +.userInfo { + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: center; + z-index: 1; + padding: 2px; +} + +.userName { + font-size: 12px; + line-height: 16px; + font-weight: 700; + color: var(--text-primary); + width: 90px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.userVerification { + font-size: 12px; + line-height: 16px; + font-weight: 400; + color: var(--text-tertiary); + width: 92px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.contextMenu { + display: flex; + align-items: center; +} + +.contextIcon { + display: inline-block; + width: 10px; + height: 2px; + vertical-align: middle; + + background-color: var(--text-secondary); + -webkit-mask: url(../../assets/icons/context.svg) no-repeat center; + mask: url(../../assets/icons/context.svg) no-repeat center; +} + +@media only screen and (max-width: 1300px) { + .userProfile { + display: grid; + width: 48px; + grid-template-columns: 48px; + grid-column-gap: 0px; + + .background { + width: 46px; + height: 46px; + } + } + + .userInfo { + display: none; + } + + .contextMenu { + display: none; + } +} + +@media only screen and (max-width: 720px) { + .userProfile { + display: none; + } +} diff --git a/src/components/ProfileWidget/ProfileWidget.tsx b/src/components/ProfileWidget/ProfileWidget.tsx new file mode 100644 index 0000000..2e2ebda --- /dev/null +++ b/src/components/ProfileWidget/ProfileWidget.tsx @@ -0,0 +1,40 @@ +import { Component, Show } from 'solid-js'; +import { A } from '@solidjs/router'; +import Avatar from '../Avatar/Avatar'; +import { useAccountContext } from '../../contexts/AccountContext'; +import { trimVerification } from '../../lib/profile'; +import { hexToNpub } from '../../lib/keys'; + +import styles from './ProfileWidget.module.scss'; + +const ProfileWidget: Component = () => { + + const account = useAccountContext() + + const activeUser = () => account?.activeUser; + + return ( + + ); +} + +export default ProfileWidget; diff --git a/src/components/ReplyToNote/ReplyToNote.module.scss b/src/components/ReplyToNote/ReplyToNote.module.scss new file mode 100644 index 0000000..714a3c6 --- /dev/null +++ b/src/components/ReplyToNote/ReplyToNote.module.scss @@ -0,0 +1,175 @@ +.newNoteBorder { + width: 100%; + min-height: 120px; + padding: 1px; + background: var(--brand-gradient); + border-radius: 6px; + display: block; + position: relative; + margin-block: 5px; +} + +.newNote { + width: 100%; + height: 100%; + min-height: 120px; + font-size: 18px; + line-height: 20px; + margin: 0px; + border-radius: 6px; + border: none; + color: var(--text-tertiary); + background-color: var(--background-site); + display: grid; + grid-template-columns: 92px 1fr; + + .leftSide { + padding: 16px 21px; + } +} + +.controls { + display: flex; + justify-content: flex-end; + align-items: center; + margin: 0px 12px 12px 0px; + >button { + width: 80px; + height: 28px; + margin: 0px 0px 0px 8px; + } +} + +.primaryButton { + border: none; + border-radius: 6px; + margin: 0px 8px; + padding: 0px; + font-size: 14px; + line-height: 20px; + font-weight: 700; + background: var(--brand-gradient-vertical); + color: var(--text-primary); + >span { + opacity: 0.75; + } +} + + +.secondaryButton { + border: none; + border-radius: 6px; + margin: 0px 15px 0px 0px; + padding: 1px; + font-size: 14px; + line-height: 20px; + font-weight: 700; + background: var(--brand-gradient-vertical); + color: var(--text-tertiary-2); + >div { + width: 100%; + height: 100%; + vertical-align: middle; + border-radius: 6px; + background-color: var(--background-card); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + } +} + +.border { + height: 36px; + padding: 1px; + background: var(--brand-gradient); + border-radius: 6px; + + .input { + height: 34px; + width: 100%; + font-size: 18px; + line-height: 20px; + margin: 0px; + border-radius: 6px; + border: none; + color: var(--text-tertiary); + background-color: var(--background-site); + display: flex; + align-items: center; + padding-inline: 12px; + + .userName { + max-width: 408px; + text-overflow: ellipsis; + white-space: nowrap; + word-wrap: break-word; + overflow: hidden; + margin-left: 6px; + } + } +} + +.replyBox { + margin: 4px 0px; + // padding: 30px 22px; + background-color: var(--background-card); + border: none; + outline: none; + display: grid; + grid-template-columns: 72px 1fr; +} + +.leftSideClosed { + // margin-top: -13px; + // margin-left: -1px; + padding-top: 3px; + padding-left: 2px; +} + +.rightSideClosed { + padding-top: 10px; +} + +@media only screen and (max-width: 720px) { + .border { + height: 36px; + padding: 1px; + background: var(--brand-gradient); + border-radius: 6px; + margin-left: 10px; + + .input { + height: 34px; + font-size: 18px; + line-height: 20px; + margin: 0px; + border-radius: 6px; + border: none; + color: var(--text-tertiary); + background-color: var(--background-site); + display: flex; + align-items: center; + padding-left: 12px; + } + } + + .replyBox { + margin-top: 4px; + padding: 30px 12px; + width: calc(100vw - (100vw - 100%)); + background-color: var(--background-card); + } +} + + +.searchSuggestions { + width: 300px; + background-color: var(--background-site); + border: 1px solid var(--text-tertiary-2); + // box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.8); + border-radius: 4px; + + position: absolute; + z-index: 50; +} diff --git a/src/components/ReplyToNote/ReplyToNote.tsx b/src/components/ReplyToNote/ReplyToNote.tsx new file mode 100644 index 0000000..9d794d3 --- /dev/null +++ b/src/components/ReplyToNote/ReplyToNote.tsx @@ -0,0 +1,136 @@ +import { useIntl } from "@cookbook/solid-intl"; +import { Component, createEffect, createSignal, Show } from "solid-js"; +import { useAccountContext } from "../../contexts/AccountContext"; +import { userName } from "../../stores/profile"; +import { actions as t } from "../../translations"; +import { PrimalNote } from "../../types/primal"; +import Avatar from "../Avatar/Avatar"; +import EditBox from "../NewNote/EditBox/EditBox"; +import styles from "./ReplyToNote.module.scss"; + +type AutoSizedTextArea = HTMLTextAreaElement & { _baseScrollHeight: number }; + +const getScrollHeight = (elm: AutoSizedTextArea) => { + var savedValue = elm.value + elm.value = '' + elm._baseScrollHeight = elm.scrollHeight + elm.value = savedValue +} + +const onExpandableTextareaInput: (event: InputEvent) => void = (event) => { + + const maxHeight = document.documentElement.clientHeight || window.innerHeight || 0; + + const elm = event.target as AutoSizedTextArea ; + + if(elm.nodeName !== 'TEXTAREA' || elm.id !== 'reply_to_note_text_area') { + return; + } + + const minRows = parseInt(elm.getAttribute('data-min-rows') || '0'); + + !elm._baseScrollHeight && getScrollHeight(elm); + + if (elm.scrollHeight >= (maxHeight - 70)) { + return; + } + + elm.rows = minRows + const rows = Math.ceil((elm.scrollHeight - elm._baseScrollHeight) / 20) + elm.rows = minRows + rows +} + +const ReplyToNote: Component<{ note: PrimalNote }> = (props) => { + + const intl = useIntl(); + + const [open, setOpen] = createSignal(false); + + const account = useAccountContext(); + + const activeUser = () => account?.activeUser; + + const openReplyBox = () => { + setOpen(true); + }; + + const closeReplyToNote = () => { + setOpen(false); + }; + + createEffect(() => { + if (open()) { + setTimeout(() => { + const newNoteTextArea = document.getElementById('reply_new_note_text_area') as HTMLTextAreaElement | undefined; + + if (!newNoteTextArea) { + return; + } + newNoteTextArea?.focus(); + }, 100); + } + else { + const newNoteTextArea = document.getElementById('reply_new_note_text_area') as HTMLTextAreaElement | undefined; + + if (!newNoteTextArea) { + return; + } + + newNoteTextArea.value = ''; + } + }); + + return ( + +
+ +
+
+
+
+ + {intl.formatMessage( + t.noteReply, + { + name: userName(props.note.user), + }, + )} + +
+
+
+ + } + > +
+
+
+ +
+
+ +
+
+
+
+ ) +} + +export default ReplyToNote; diff --git a/src/components/Search/Search.module.scss b/src/components/Search/Search.module.scss new file mode 100644 index 0000000..ee19a60 --- /dev/null +++ b/src/components/Search/Search.module.scss @@ -0,0 +1,89 @@ +.search { + display: grid; + grid-template-columns: 16px 1fr; + grid-column-gap: 15px; + border-radius: 22px; + background-color: var(--background-input); + width: 300px; + padding-right: 22px; + + &:hover { + input { + color: var(--text-primary); + } + + .searchIcon { + background-color: var(--text-primary); + } + } + + input { + height: 36px; + font-weight: 700; + font-size: 16px; + line-height: 20px; + padding: 0px 12px; + margin-bottom: 0px; + border: none; + background-color: var(--background-input); + color: var(--text-tertiary); + + &:focus { + border: none; + box-shadow: none; + } + + + &::placeholder { + color: var(--text-tertiary); + } + } + + .searchIcon { + display: inline-block; + width: 16px; + height: 16px; + margin-left: 16px; + margin-top: 10px; + + background-color: var(--text-tertiary); + -webkit-mask: url(../../assets/icons/search.svg) 0 0/16px 16px; + mask: url(../../assets/icons/search.svg) 0 0/16px 16px; + } +} + +.searchHolder { + position: relative; + width: 300px; + padding-top: 26px; +} + +.searchSuggestions { + width: 300px; + background-color: var(--background-site); + border: 1px solid var(--text-tertiary-2); + // box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.8); + border-radius: 4px; + + position: absolute; + top: 76px; +} + +.loadingOverlay { + position: absolute; + width: 100%; + height: 100%; + z-index: 10; + background-color: var(--background-site); + opacity: 0.8; +} + +.searchIcon { + display: inline-block; + width: 18px; + height: 18px; + + background-color: var(--text-primary); + -webkit-mask: url(../../assets/icons/search.svg) 0 0/18px 18px; + mask: url(../../assets/icons/search.svg) 0 0/18px 18px; +} diff --git a/src/components/Search/Search.tsx b/src/components/Search/Search.tsx new file mode 100644 index 0000000..96e30bf --- /dev/null +++ b/src/components/Search/Search.tsx @@ -0,0 +1,191 @@ +import { useIntl } from '@cookbook/solid-intl'; +import { useNavigate } from '@solidjs/router'; +import { Component, createEffect, createSignal, For, Show } from 'solid-js'; +import { useSearchContext } from '../../contexts/SearchContext'; +import { nip05Verification, userName } from '../../stores/profile'; +import { PrimalUser } from '../../types/primal'; +import { debounce } from '../../utils'; +import Avatar from '../Avatar/Avatar'; +import Loader from '../Loader/Loader'; +import { useToastContext } from '../Toaster/Toaster'; +import { placeholders, search as t } from '../../translations'; + +import styles from './Search.module.scss'; +import SearchOption from './SearchOption'; + + +const Search: Component<{ + onInputConfirm?: (query: string) => void, + onUserSelect?: (selected: PrimalUser | string) => void, + noLinks?: boolean, + hideDefault?: boolean, + placeholder?: string, +}> = (props) => { + + const toaster = useToastContext(); + const search = useSearchContext(); + const navigate = useNavigate(); + const intl = useIntl(); + + const [query, setQuery] = createSignal(''); + const [isFocused, setIsFocused] = createSignal(false); + + const queryUrl = () => query().replaceAll('#', '%23'); + + let input: HTMLInputElement | undefined; + + const onSearch = (e: SubmitEvent) => { + e.preventDefault(); + + const form = e.target as HTMLFormElement; + + const data = new FormData(form); + + const q = data.get('searchQuery') as string || ''; + + if (q.length > 0) { + if (props.onInputConfirm) { + props.onInputConfirm(q); + } + else { + navigate(`/search/${q.replaceAll('#', '%23')}`); + } + onBlur(); + resetQuery(); + } + else { + toaster?.sendInfo(intl.formatMessage(t.invalid)) + } + return false; + } + + const onInput = (e: InputEvent) => { + setIsFocused(true); + debounce(() => { + // @ts-ignore + const value = e.target?.value; + + if (value.startsWith('npub') || value.startsWith('nprofile')) { + search?.actions.findUserByNupub(value); + return; + } + + setQuery(value || ''); + }, 500); + }; + + const onFocus = (e: FocusEvent) => { + setIsFocused(true); + } + + const onBlur = (e?: FocusEvent) => { + setTimeout(() => { + setIsFocused(false); + }, 200); + } + + const resetQuery = () => { + setQuery(''); + + if (input) { + input.value = ''; + } + }; + + const selectUser = (user: PrimalUser) => { + if (props.onUserSelect) { + props.onUserSelect(user); + } + resetQuery(); + } + + createEffect(() => { + if (!isFocused()) { + return; + } + + if (query().length === 0) { + search?.actions.getRecomendedUsers(); + return; + } + + search?.actions.findUsers(query()); + }); + + return ( +
+
+
+ +
+ + +
+ +
+ +
+
+ + 0} + fallback={ +
} + underline={true} + /> + } + > +
} + underline={true} + onClick={resetQuery} + /> + + + + + {(user) => ( + } + statNumber={search?.scores[user.pubkey]} + statLabel={intl.formatMessage(t.followers)} + onClick={() => selectUser(user)} + /> + )} + + + + + + ) +} + +export default Search; diff --git a/src/components/Search/SearchOption.module.scss b/src/components/Search/SearchOption.module.scss new file mode 100644 index 0000000..b927dd6 --- /dev/null +++ b/src/components/Search/SearchOption.module.scss @@ -0,0 +1,75 @@ + +.userResult { + display: grid; + grid-template-columns: 36px 1fr 60px; + padding: 8px; + margin: 4px; + text-decoration: none; + border-radius: 4px; + cursor: pointer; + + &:hover, &:focus, &.highlight { + background-color: var(--background-input); + } + + .userAvatar { + display: flex; + align-items: center; + justify-content: center; + + .searchIcon { + display: inline-block; + width: 18px; + height: 18px; + + background-color: var(--text-primary); + -webkit-mask: url(../../assets/icons/search.svg) 0 0/18px 18px; + mask: url(../../assets/icons/search.svg) 0 0/18px 18px; + } + } + + .userInfo { + margin-left: 6px; + display: flex; + flex-direction: column; + justify-content: center; + max-width: 172px; + } + + .userName { + font-weight: 700; + font-size: 14px; + line-height: 16px; + color: var(--text-primary); + } + + .verification { + font-weight: 400; + font-size: 14px; + line-height: 16px; + color: var(--text-secondary-2); + } + + .userStats { + display: flex; + flex-direction: column; + align-items: flex-end; + .followerNumber { + font-weight: 700; + font-size: 12px; + line-height: 16px; + color: var(--text-primary) + } + + .followerLabel { + font-weight: 400; + font-size: 12px; + line-height: 14px; + color: var(--text-secondary-2); + } + } +} + +.underline { + border-bottom: 1px solid var(--subtile-devider); +} diff --git a/src/components/Search/SearchOption.tsx b/src/components/Search/SearchOption.tsx new file mode 100644 index 0000000..ef29139 --- /dev/null +++ b/src/components/Search/SearchOption.tsx @@ -0,0 +1,80 @@ +import { A } from '@solidjs/router'; +import { Component, JSXElement, Show } from 'solid-js'; +import { truncateNumber } from '../../lib/notifications'; +import { truncateName, } from '../../stores/profile'; + + +import styles from './SearchOption.module.scss'; + + +const SearchOption: Component<{ + href?: string, + title: string, + description?: string, + icon: JSXElement, + statNumber?: number, + statLabel?: string, + underline?: boolean, + onClick?: (e?: MouseEvent) => void, + highlighted?: boolean, +}> = (props) => { + + const Content: Component<{ children: JSXElement }> = (prp) => { + const klass = () => `${styles.userResult} + ${props.underline ? styles.underline : ''} + ${props.highlighted ? styles.highlight : ''}`; + + return ( + + {prp.children} + + } + > + + {prp.children} + + + ); + }; + + return ( + +
+ {props.icon} +
+
+
+ {props.title} +
+ 0}> +
+ {truncateName(props.description || '')} +
+
+
+ +
+
+ {truncateNumber(props.statNumber || 0)} +
+
+ {props.statLabel} +
+
+
+
+ ); +} + +export default SearchOption; diff --git a/src/components/SearchSidebar/SearchSidebar.tsx b/src/components/SearchSidebar/SearchSidebar.tsx new file mode 100644 index 0000000..4b7caeb --- /dev/null +++ b/src/components/SearchSidebar/SearchSidebar.tsx @@ -0,0 +1,21 @@ +import { Component } from 'solid-js'; +import { PrimalUser } from '../../types/primal'; +import { useIntl } from '@cookbook/solid-intl'; +import { search as t } from '../../translations'; +import PeopleList from '../PeopleList/PeopleList'; + + +const SearchSidebar: Component<{ users: PrimalUser[] }> = (props) => { + + const intl = useIntl(); + + return ( + <> + + + ); +} + +export default SearchSidebar; diff --git a/src/components/SelectBox/SelectBox.scss b/src/components/SelectBox/SelectBox.scss new file mode 100644 index 0000000..f1fdea3 --- /dev/null +++ b/src/components/SelectBox/SelectBox.scss @@ -0,0 +1,240 @@ +.feed_select { + height: 20px; + font-size: 14px; + line-height: 16px; + padding: 0px; + margin: 0px; + width: auto; + border: none; + text-align: right; + background-position: center right !important; + color: var(--text-tertiary-2); + padding-right: 6px; + + .solid-select-container { + position: relative; + } + + .solid-select-control { + margin: 0px 0px 0px 8px; + padding: 0; + cursor: pointer; + pointer-events:painted; + width: calc(100% - 8px); + display: flex; + align-items: center; + + &:after { + content: ''; + display: inline-block; + margin-left: 8px; + width: 18px; + height: 18px; + padding-right: 6px; + + background-color: var(--text-tertiary-2); + -webkit-mask: url(../../assets/icons/feed_picker.svg) no-repeat 0 0/ 14px 14px; + mask: url(../../assets/icons/feed_picker.svg) no-repeat 0 0/ 14px 14px; + } + + &:hover { + color: var(--text-primary); + &:after { + background-color: var(--text-primary); + } + } + } + + .highlighted { + color: var(--text-primary); + &:after { + background-color: var(--text-primary); + } + } + + .solid-select-option { + cursor: pointer; + padding-right: 34px; + } + + .solid-select-option:hover { + background-color: var(--background-card); + } + .solid-select-option[data-focused=true] { + background-color: unset; + + &:hover { + background-color: var(--background-card); + } + } + .solid-select-option[data-disabled=true] { + padding-right: 10px; + color: var(--text-primary); + + &:after { + content: ''; + display: inline-block; + margin-left: 14px; + width: 10px; + height: 10px; + + background-color: var(--text-primary); + -webkit-mask: url(../../assets/icons/check.svg) no-repeat center; + mask: url(../../assets/icons/check.svg) no-repeat center; + } + } + + .solid-select-list { + margin-top: 0; + padding: 8px; + border: solid 1px var(--text-tertiary-2); + border-radius: 4px; + background-color: var(--background-site); + right: 0; + } + + .solid-select-input { + max-height: 0px; + height: 0px; + box-shadow: none; + margin: 0; + padding: 0; + font-size: 16px; + cursor: pointer; + } + + .solid-select-single-value { + caret-color: transparent; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + width: 100%; + } + +} +.selector { + height: 20px; + font-size: 14px; + line-height: 16px; + padding: 0px; + margin: 0px; + width: 179px; + border: none; + text-align: right; + background-position: center right !important; + color: var(--text-secondary); +} + +.phone_feed_select { + position: relative; + height: 20px; + font-size: 18px; + line-height: 18px; + font-weight: 700; + padding: 0px; + margin: 0px; + border: none; + text-align: right; + background-position: center right !important; + color: var(--text-primary); + padding-right: 6px; + width: 100%; + + .solid-select-control { + margin: 0px 0px 0px 8px; + padding: 0; + cursor: pointer; + pointer-events:painted; + width: 100%; + display: flex; + align-items: center; + + &:after { + content: ''; + display: inline-block; + margin-left: 16px; + width: 18px; + height: 18px; + + background-color: var(--text-primary); + -webkit-mask: url(../../assets/icons/feed_picker.svg) no-repeat 0 0/ 14px 14px; + mask: url(../../assets/icons/feed_picker.svg) no-repeat 0 0/ 14px 14px; + } + + &:hover { + color: var(--text-primary); + &:after { + background-color: var(--text-primary); + } + } + } + + .highlighted { + color: var(--text-primary); + &:after { + background-color: var(--text-primary); + } + } + + .solid-select-option { + cursor: pointer; + padding-right: 34px; + color: var(--text-tertiary-2); + padding-block: 24px; + } + + .solid-select-option:hover { + background-color: var(--background-card); + } + .solid-select-option[data-focused=true] { + background-color: unset; + + &:hover { + background-color: var(--background-card); + } + } + .solid-select-option[data-disabled=true] { + padding-right: 10px; + color: var(--text-primary); + + &:after { + content: ''; + display: inline-block; + margin-left: 14px; + width: 10px; + height: 10px; + + background-color: var(--text-primary); + -webkit-mask: url(../../assets/icons/check.svg) no-repeat center; + mask: url(../../assets/icons/check.svg) no-repeat center; + } + } + + .solid-select-list { + margin-top: 0; + padding: 8px; + border: solid 1px var(--text-tertiary-2); + border-radius: 4px; + background-color: var(--background-site); + right: 0; + } + + .solid-select-input { + max-height: 0px; + height: 0px; + box-shadow: none; + margin: 0; + padding: 0; + font-size: 16px; + cursor: pointer; + } + + .solid-select-single-value { + caret-color: transparent; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + display: flex; + max-width: 100%; + } +} diff --git a/src/components/SelectBox/SelectBox.tsx b/src/components/SelectBox/SelectBox.tsx new file mode 100644 index 0000000..f309538 --- /dev/null +++ b/src/components/SelectBox/SelectBox.tsx @@ -0,0 +1,45 @@ +import { useIntl } from "@cookbook/solid-intl"; +import { Select, createOptions } from "@thisbeyond/solid-select"; + +// Import default styles. (All examples use this via a global import) +import "@thisbeyond/solid-select/style.css"; +import { Component } from "solid-js"; +import { placeholders } from "../../translations"; +import { FeedOption } from "../../types/primal"; + +// Apply custom styling. See stylesheet below. +import "./SelectBox.scss"; + +const SelectBox: Component<{ options: () => FeedOption[], onChange: (value: any) => void, initialValue: any, isSelected: (value: any) => boolean, isPhone?: boolean }> = (props) => { + + const intl = useIntl(); + + const opts = createOptions(props.options, { key: 'label', disable: props.isSelected }) + + const onFocus = () => { + const control = document.querySelector('.solid-select-control'); + control?.classList.add('highlighted'); + } + + const onBlur = () => { + const control = document.querySelector('.solid-select-control'); + control?.classList.remove('highlighted'); + } + + return ( + + +
+
+ Set custom zap amount presets: +
+
+ + {(value, index) => + changeZapOptions(e, index())} + /> + } + +
+
+ + ); +} + +export default SettingsZap; diff --git a/src/components/SmallCallToAction/SmallCallToAction.module.scss b/src/components/SmallCallToAction/SmallCallToAction.module.scss new file mode 100644 index 0000000..5825fa7 --- /dev/null +++ b/src/components/SmallCallToAction/SmallCallToAction.module.scss @@ -0,0 +1,42 @@ +.callToAction { + display: grid; + // height: 32px; + min-width: 50%; + grid-template-columns: 32px 1fr; + grid-column-gap: 10px; + align-items: center; + background-color: unset; + margin: 0px; + padding: 0px; + border: none; + outline: none; + + p { + font-size: 34px; + line-height: 34px; + padding: 0px; + margin: 0px; + } + + .border { + height: 28px; + padding: 1px; + background: var(--brand-gradient); + border-radius: 6px; + } + + .input { + height: 26px; + font-size: 14px; + line-height: 20px; + font-weight: 400; + margin: 0px; + border-radius: 6px; + border: none; + color: var(--text-tertiary); + background-color: var(--background-site); + display: flex; + align-items: center; + padding-left: 12px; + } +} diff --git a/src/components/SmallCallToAction/SmallCallToAction.tsx b/src/components/SmallCallToAction/SmallCallToAction.tsx new file mode 100644 index 0000000..faa7675 --- /dev/null +++ b/src/components/SmallCallToAction/SmallCallToAction.tsx @@ -0,0 +1,35 @@ +import { Component } from 'solid-js'; +import Avatar from '../Avatar/Avatar'; + +import styles from './SmallCallToAction.module.scss'; +import { useAccountContext } from '../../contexts/AccountContext'; +import { PrimalUser } from '../../types/primal'; +import { placeholders } from '../../translations'; +import { useIntl } from '@cookbook/solid-intl'; + +const SmallCallToAction: Component<{ activeUser: PrimalUser | undefined }> = (params) => { + + const account = useAccountContext(); + const intl = useIntl(); + + const showNewNoteForm = () => { + account?.actions?.showNewNoteForm(); + }; + + return ( + + ); +} + +export default SmallCallToAction; diff --git a/src/components/SmallNote/SmallNote.module.scss b/src/components/SmallNote/SmallNote.module.scss new file mode 100644 index 0000000..3d7ed28 --- /dev/null +++ b/src/components/SmallNote/SmallNote.module.scss @@ -0,0 +1,85 @@ +.smallNote { + margin-bottom: 18px; + display: grid; + grid-template-columns: 24px 1fr; + grid-template-rows: 1fr; + grid-template-areas: "avatar content"; + grid-column-gap: 12px; + width: 300px; + + .avatar { + grid-area: avatar; + display: grid; + justify-items: center; + + .avatarImg { + width: 24px; + height: 24px; + border-radius: 50%; + } + } + + .content { + grid-area: content; + display: grid; + grid-template-columns: 1fr; + grid-template-rows: 16px 1fr; + grid-row-gap: 2px; + grid-template-areas: "header" "message"; + + .header { + grid-area: header; + font-size: 14px; + line-height: 18px; + display: flex; + align-items: center; + + .name { + color: var(--text-secondary-2); + font-weight: 800; + max-width: 120px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + } + + .time{ + margin: 0px 2px; + color: var(--text-tertiary); + font-weight: 400; + &::before { + content: "|"; + padding: 0px 2px; + } + } + } + + .message { + grid-area: message; + word-break: break-word; + font-size: 14px; + line-height: 18px; + font-weight: 400; + color: var(--text-tertiary); + width: 264px; + + overflow: hidden; + display: -webkit-box; + line-clamp: 2; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -ms-box-orient: vertical; + text-overflow: ellipsis; + } + + &:hover { + .message, .name, .time { + color: var(--text-primary); + text-decoration: underline; + } + + cursor: pointer; + } + } +} diff --git a/src/components/SmallNote/SmallNote.tsx b/src/components/SmallNote/SmallNote.tsx new file mode 100644 index 0000000..0e3e970 --- /dev/null +++ b/src/components/SmallNote/SmallNote.tsx @@ -0,0 +1,107 @@ +import { Component, JSXElement, Show } from 'solid-js'; +import Avatar from '../Avatar/Avatar'; + +import styles from './SmallNote.module.scss'; +import { A } from '@solidjs/router'; +import { PrimalNote } from '../../types/primal'; +import { useThreadContext } from '../../contexts/ThreadContext'; +import { date } from '../../lib/dates'; +import { authorName } from '../../stores/profile'; +import { note as t } from '../../translations'; +import { useIntl } from '@cookbook/solid-intl'; + + +const SmallNote: Component<{ note: PrimalNote, children?: JSXElement }> = (props) => { + + const threadContext = useThreadContext(); + const intl = useIntl(); + + const navToThread = (note: PrimalNote) => { + threadContext?.actions.setPrimaryNote(note); + }; + + const nameOfAuthor = () => { + return authorName(props.note.user || { pubkey: props.note.post.pubkey }); + }; + + const parsedContent = (text: string) => { + const regex = /\#\[([0-9]*)\]/g; + let parsed = text; + + let refs = []; + let match; + + while((match = regex.exec(text)) !== null) { + refs.push(match[1]); + } + + if (refs.length > 0) { + for(let i =0; i < refs.length; i++) { + let r = parseInt(refs[i]); + + const tag = props.note.post.tags[r]; + + if (tag[0] === 'e' && props.note.mentionedNotes && props.note.mentionedNotes[tag[1]]) { + const embeded = ( + {intl.formatMessage( + t.mentionIndication, + { + name: authorName(props.note.user), + }, + )} + ); + + // @ts-ignore + parsed = parsed.replace(`#[${r}]`, embeded.outerHTML); + } + + if (tag[0] === 'p' && props.note.mentionedUsers && props.note.mentionedUsers[tag[1]]) { + const user = props.note.mentionedUsers[tag[1]]; + + const link = (@{authorName(user)}); + + // @ts-ignore + parsed = parsed.replace(`#[${r}]`, link.outerHTML); + } + } + } + + return parsed; + + }; + + return ( + + ); +} + +export default SmallNote; diff --git a/src/components/StickySidebar/StickySidebar.module.scss b/src/components/StickySidebar/StickySidebar.module.scss new file mode 100644 index 0000000..adae438 --- /dev/null +++ b/src/components/StickySidebar/StickySidebar.module.scss @@ -0,0 +1,15 @@ +.trendingSection { + width: 300px; + margin-bottom: 228px; +} + +.stickyWrapper { + position: fixed; + height: 100%; + overflow: hidden; + overflow-y: scroll; + + &::-webkit-scrollbar{ + display: none; + } +} diff --git a/src/components/StickySidebar/StickySidebar.tsx b/src/components/StickySidebar/StickySidebar.tsx new file mode 100644 index 0000000..a742522 --- /dev/null +++ b/src/components/StickySidebar/StickySidebar.tsx @@ -0,0 +1,21 @@ +import { Component, JSXElement } from 'solid-js'; +import Wormhole from '../Wormhole/Wormhole'; + +import styles from './StickySidebar.module.scss'; + +const StickySidebar: Component<{ children: JSXElement }> = (props) => { + + return ( + + + + ); +} + +export default StickySidebar; diff --git a/src/components/ThemeChooser/ThemeChooser.module.scss b/src/components/ThemeChooser/ThemeChooser.module.scss new file mode 100644 index 0000000..53afaf8 --- /dev/null +++ b/src/components/ThemeChooser/ThemeChooser.module.scss @@ -0,0 +1,6 @@ + +.themeChooser { + display: grid; + width: 100%; + grid-template-columns: 1fr 1fr 1fr 1fr; +} diff --git a/src/components/ThemeChooser/ThemeChooser.tsx b/src/components/ThemeChooser/ThemeChooser.tsx new file mode 100644 index 0000000..c025fc8 --- /dev/null +++ b/src/components/ThemeChooser/ThemeChooser.tsx @@ -0,0 +1,31 @@ +import { Component, For } from 'solid-js'; + +import styles from './ThemeChooser.module.scss'; +import ThemeOption from './ThemeOption/ThemeOption'; +import { useSettingsContext } from '../../contexts/SettingsContext'; +import { PrimalTheme } from '../../types/primal'; + +const ThemeChooser: Component = () => { + + const settings = useSettingsContext(); + + const onSelect = (theme: PrimalTheme) => { + settings?.actions?.setTheme(theme); + }; + + return ( +
+ + {(theme) => ( + onSelect(theme)} + /> + )} + +
+ ); +} + +export default ThemeChooser; diff --git a/src/components/ThemeChooser/ThemeOption/ThemeOption.module.scss b/src/components/ThemeChooser/ThemeOption/ThemeOption.module.scss new file mode 100644 index 0000000..3a1ae2d --- /dev/null +++ b/src/components/ThemeChooser/ThemeOption/ThemeOption.module.scss @@ -0,0 +1,98 @@ + +.themeOption { + width: 128px; + >p { + font-size: 14px; + line-height: 16px; + font-weight: 500; + color: var(--text-primary); + margin-top: 8px; + text-align: center; + } +} + + +@mixin themeOptionButton { + position: relative; + width: 100%; + height: 100px; + background-color: unset; + border: none; + margin: 0px; + padding: 0px; + display: grid; + place-content: center; + border-radius: 6px; + + >img { + width: 58px; + height: 58px; + } +} + +.selected { + border: solid 1px var(--brand-1) !important; +} + +.sunset { + @include themeOptionButton(); + background-color: var(--dark-back); +} + +.midnight { + @include themeOptionButton(); + background-color: var(--dark-back); +} + +.sunrise { + @include themeOptionButton(); + background-color: var(--light-back); +} + +.ice { + @include themeOptionButton(); + background-color: var(--light-back); +} + +.themeChecked { + position: absolute; + bottom: 4px; + right: 4px; + width: 20px; + height: 20px; + display: flex; + margin: 0px; + padding: 0px; + align-items: center; + justify-content: center; + background: var(--brand-gradient); + border-radius: 50%; + >img { + width: 10px; + height: 10px; + } +} + +@mixin themeUnchecked { + position: absolute; + bottom: 4px; + right: 4px; + width: 20px; + height: 20px; + display: block; + margin: 0px; + padding: 0px; + align-items: center; + justify-content: center; + border-radius: 50%; +} + +.themeUncheckedDark { + @include themeUnchecked(); + background: var(--dark-input); +} + +.themeUncheckedLight { + @include themeUnchecked(); + background: var(--light-input); +} diff --git a/src/components/ThemeChooser/ThemeOption/ThemeOption.tsx b/src/components/ThemeChooser/ThemeOption/ThemeOption.tsx new file mode 100644 index 0000000..2f13136 --- /dev/null +++ b/src/components/ThemeChooser/ThemeOption/ThemeOption.tsx @@ -0,0 +1,40 @@ +import { Component, Show } from 'solid-js'; +import styles from './ThemeOption.module.scss'; + +import check from '../../../assets/icons/check.svg'; +import { PrimalTheme } from '../../../types/primal'; + +const ThemeOption: Component<{ + theme: PrimalTheme, + isSelected: boolean, + onSelect: (value: PrimalTheme) => void, +}> = (props) => { + + const selectedClass = () => { + return props.isSelected ? styles.selected : ''; + }; + + const uncheckedTheme = () => { + return props.theme.dark ? styles.themeUncheckedDark : styles.themeUncheckedLight; + } + + return ( +
+
} + > +
+ + +

{props.theme.label}

+ + ); +} + +export default ThemeOption; diff --git a/src/components/Toaster/Toaster.module.scss b/src/components/Toaster/Toaster.module.scss new file mode 100644 index 0000000..c695aa0 --- /dev/null +++ b/src/components/Toaster/Toaster.module.scss @@ -0,0 +1,50 @@ +.toastHolder { + position: fixed; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + z-index: 100; +} + +@keyframes fadein { + from { margin-top: -70px;} + to { margin-top: 12px;} +} + +@mixin toastMessage { + min-width: 100px; + min-height: 44px; + margin: 12px; + animation: fadein 0.6s; + color: white; + font-weight: 400; + font-size: 18px; + line-height: 20px; + border-radius: 6px; + display: flex; + justify-content: center; + align-items: center; + padding-inline: 16px; +} + +.toastSuccess { + @include toastMessage(); + background: linear-gradient(0deg, rgba(41, 91, 2, 0.5), rgba(41, 91, 2, 0.5)), #000000; + border-color: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.4); +} + +.toastWarning { + @include toastMessage(); + background: linear-gradient(0deg, rgba(144, 3, 3, 0.5), rgba(144, 3, 3, 0.5)), #000000;; + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.4); +} + +.toastInfo { + @include toastMessage(); + background-color: #222222; + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.4); +} diff --git a/src/components/Toaster/Toaster.tsx b/src/components/Toaster/Toaster.tsx new file mode 100644 index 0000000..7d3ff33 --- /dev/null +++ b/src/components/Toaster/Toaster.tsx @@ -0,0 +1,68 @@ +import styles from "./Toaster.module.scss"; + +import { Component, createContext, JSX, useContext } from "solid-js"; + +type ContextProps = { children: number | boolean | Node | JSX.ArrayElement | JSX.FunctionElement | (string & {}) | null | undefined; }; + +type ToastContextStore = { + sendWarning: (message: string) => void, + sendSuccess: (message: string) => void, + sendInfo: (message: string) => void, + notImplemented: () => void, +} + +const ToastContext = createContext(); + +const Toaster: Component = (props) => { + let toastHolder: HTMLDivElement | undefined = undefined; + + const toastMesage = (message: string, klass: string, duration = 4000) => { + const toaster = document.createElement('div'); + toaster.innerHTML = message; + toaster.classList.add(klass); + setTimeout(() => { + toastHolder?.append(toaster) + }, 0); + + setTimeout(() => { + toastHolder?.removeChild(toaster); + }, duration); + + }; + + const toastData = { + sendWarning: (message: string) => { + toastMesage(message, styles.toastWarning); + }, + sendSuccess: (message: string) => { + toastMesage(message, styles.toastSuccess, 2000); + }, + sendInfo: (message: string) => { + toastMesage(message, styles.toastInfo); + }, + notImplemented: () => { + toastMesage( + 'Feature not available in this preview release. Rest assured, we are working on it. Come back soon!', + styles.toastInfo, + 2000, + ); + }, + }; + + return ( + <> +
+
+ + {props.children} + + + ) +} + +export default Toaster; + +export function useToastContext() { return useContext(ToastContext); } diff --git a/src/components/VerificationCheck/VerificationCheck.module.scss b/src/components/VerificationCheck/VerificationCheck.module.scss new file mode 100644 index 0000000..94a090c --- /dev/null +++ b/src/components/VerificationCheck/VerificationCheck.module.scss @@ -0,0 +1,37 @@ + +.verifiedIcon { + width: 100%; + height: 100%; + display: inline-block; + margin-inline: 2px; + background-color: var(--text-tertiary-2); + -webkit-mask: url(../../assets/icons/verified.svg) no-repeat 0 / 100%; + mask: url(../../assets/icons/verified.svg) no-repeat 0 / 100%; +} + +.verificationIcon { + width: 15px; + height: 15px; + display: inline-block; + position: relative; +} + +.verifiedIconPrimal { + width: 100%; + height: 100%; + display: inline-block; + margin-inline: 2px; + background: var(--brand-gradient); + -webkit-mask: url(../../assets/icons/verified.svg) no-repeat 0 / 100%; + mask: url(../../assets/icons/verified.svg) no-repeat 0 / 100%; +} + +.whiteCheck { + width: 11px; + height: 11px; + position: absolute; + top: 2px; + left: 4px; + border-radius: 50%; + background-color: white; +} diff --git a/src/components/VerificationCheck/VerificationCheck.tsx b/src/components/VerificationCheck/VerificationCheck.tsx new file mode 100644 index 0000000..ab5203a --- /dev/null +++ b/src/components/VerificationCheck/VerificationCheck.tsx @@ -0,0 +1,39 @@ +import styles from "./VerificationCheck.module.scss"; + +import { Component, Match, Switch } from "solid-js"; +import { PrimalUser } from "../../types/primal"; + + +const VerificationCheck: Component<{ user: PrimalUser | undefined }> = (props) => { + + + const isVerifiedByPrimal = () => { + return !!props.user?.nip05 && + props.user?.nip05.endsWith('primal.net'); + } + + const isVerified = () => { + return !!props.user?.nip05 && + !props.user?.nip05.endsWith('primal.net'); + } + + return ( + <> + + +
+ +
+
+ +
+ + +
+
+
+ + ) +} + +export default VerificationCheck; diff --git a/src/components/Wormhole/Wormhole.tsx b/src/components/Wormhole/Wormhole.tsx new file mode 100644 index 0000000..268fea2 --- /dev/null +++ b/src/components/Wormhole/Wormhole.tsx @@ -0,0 +1,24 @@ +import { Component, createSignal, JSXElement, onMount, Show } from 'solid-js'; +import { Portal } from 'solid-js/web'; + +const Wormhole: Component<{children: JSXElement, to: string }> = (props) => { + + const [mounted, setMounted] = createSignal(false); + + onMount(() => { + setTimeout(() => { + // Temporary fix for Portal rendering on initial load. + setMounted(true); + }); + }); + + return ( + + + {props.children} + + + ); +} + +export default Wormhole; diff --git a/src/constants.ts b/src/constants.ts new file mode 100644 index 0000000..b5c860b --- /dev/null +++ b/src/constants.ts @@ -0,0 +1,251 @@ +import { FeedPage, } from "./types/primal"; +import logoFire from './assets/icons/logo_fire.svg'; +import logoIce from './assets/icons/logo_ice.svg'; +import { MessageDescriptor } from "@cookbook/solid-intl"; + +export const second = 1000; +export const minute = 60 * second; +export const hour = 60 * minute; +export const day = 24 * hour; +export const week = 7 * day; + +export const emptyPage: FeedPage = { + users: {}, + messages: [], + postStats: {}, + noteActions: {}, +} + +export const trendingFeed = { + name: 'Trending, my network', + hex: 'network;trending', + npub: 'trending;network', +}; + +export const themes = [ + { + name: 'sunset', + label: 'sunset wave', + logo: logoFire, + dark: true, + }, + { + name: 'sunrise', + label: 'sunrise wave', + logo: logoFire, + }, + { + name: 'midnight', + label: 'midnight wave', + logo: logoIce, + dark: true, + }, + { + name: 'ice', + label: 'ice wave', + logo: logoIce, + }, +]; + +export const minKnownProfiles: {"names": Record} = { + "names": { + "miljan": "d61f3bc5b3eb4400efdae6169a5c17cabf3246b514361de939ce4a1a0da6ef4a", + "marko": "123afae7d187ba36d6ddcd97dbf4acc59aeffe243f782592ff8f25ed579df306", + "essguess": "0b13870379cf18ae6b6d516d9f0833e0273c7a6758652a698e11f04c9c1a0d29", + "pr": "dd9b989dfe5e0840a92538f3e9f84f674e5f17ab05932efbacb4d8e6c905f302", + "marija": "b8a518a60fab9f3969b62238860f4643003b6437b75d60860dd8de34fb21c931", + "moysie": "2a55ed52ed31f85f8bdef3bdd165aa74265d82c952193d7b76fb4c76cccc4231", + "nikola": "97b988fbf4f8880493f925711e1bd806617b508fd3d28312288507e42f8a3368", + "princfilip": "29c07b40860f06df7c1ada6af2cc6b4c541b76a720542d7ee645c20c9452ffd2", + "highlights": "9a500dccc084a138330a1d1b2be0d5e86394624325d25084d3eca164e7ea698a", + "primal": "532d830dffe09c13e75e8b145c825718fc12b0003f61d61e9077721c7fff93cb", + "andi": "5fd8c6a375c431729a3b78e2080ffff0a1dc63f52e2a868a801151190a31f955", + "rockstar": "91c9a5e1a9744114c6fe2d61ae4de82629eaaa0fb52f48288093c7e7e036f832", + "qa": "88cc134b1a65f54ef48acc1df3665063d3ea45f04eab8af4646e561c5ae99079", + "jack": "82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2", + } +}; + +export const defaultFeeds = [ +]; + +export const timeframeLabels: Record = { + latest: 'latest', + trending: 'trending', + popular: 'popular', + mostzapped: 'most zapped', +}; + +export const scopeLabels: Record = { + follows: 'my follows', + tribe: 'my tribe', + network: 'my network', + global: 'global' +}; + +export const noKey = 'no-key'; + +export enum Kind { + Metadata = 0, + Text = 1, + RecommendRelay = 2, + Contacts = 3, + EncryptedDirectMessage = 4, + EventDeletion = 5, + Repost = 6, + Reaction = 7, + ChannelCreation = 40, + ChannelMetadata = 41, + ChannelMessage = 42, + ChannelHideMessage = 43, + ChannelMuteUser = 44, + + Settings = 30_078, + + ACK = 10_000_098, + NoteStats = 10_000_100, + NetStats = 10_000_101, + LegendStats = 10_000_102, + UserStats = 10_000_105, + OldestEvent = 10_000_106, + Mentions = 10_000_107, + UserScore = 10_000_108, + Notification = 10_000_110, + Timestamp = 10_000_111, + NotificationStats = 10_000_112, + FeedRange = 10_000_113, + NoteActions = 10_000_115, + MessageStats = 10_000_117, + MesagePerSenderStats = 10_000_118, + MediaInfo = 10_000_119, + Upload = 10_000_120, + Uploaded = 10_000_121, +} + +export const relayConnectingTimeout = 5000; + +export enum NotificationType { + NEW_USER_FOLLOWED_YOU = 1,// + USER_UNFOLLOWED_YOU = 2,// + + YOUR_POST_WAS_ZAPPED = 3,// + YOUR_POST_WAS_LIKED = 4,// + YOUR_POST_WAS_REPOSTED = 5,// + YOUR_POST_WAS_REPLIED_TO = 6,// + YOU_WERE_MENTIONED_IN_POST = 7,// + YOUR_POST_WAS_MENTIONED_IN_POST = 8,// + + POST_YOU_WERE_MENTIONED_IN_WAS_ZAPPED = 101,// + POST_YOU_WERE_MENTIONED_IN_WAS_LIKED = 102,// + POST_YOU_WERE_MENTIONED_IN_WAS_REPOSTED = 103, + POST_YOU_WERE_MENTIONED_IN_WAS_REPLIED_TO = 104, + + POST_YOUR_POST_WAS_MENTIONED_IN_WAS_ZAPPED = 201, + POST_YOUR_POST_WAS_MENTIONED_IN_WAS_LIKED = 202,// + POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPOSTED = 203, + POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPLIED_TO = 204, +}; + +export const typeIcons: Record = { + [NotificationType.NEW_USER_FOLLOWED_YOU]: 'user_followed.svg', + [NotificationType.USER_UNFOLLOWED_YOU]: 'user_unfollowed.svg', + + [NotificationType.YOUR_POST_WAS_ZAPPED]: 'post_zapped.svg', + [NotificationType.YOUR_POST_WAS_LIKED]: 'post_liked.svg', + [NotificationType.YOUR_POST_WAS_REPOSTED]: 'post_reposted.svg', + [NotificationType.YOUR_POST_WAS_REPLIED_TO]: 'post_replied.svg', + + [NotificationType.YOU_WERE_MENTIONED_IN_POST]: 'mention.svg', + [NotificationType.YOUR_POST_WAS_MENTIONED_IN_POST]: 'mentioned_post.svg', + + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_ZAPPED]: 'mention_zapped.svg', + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_LIKED]: 'mention_liked.svg', + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_REPOSTED]: 'mention_reposted.svg', + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_REPLIED_TO]: 'mention_replied.svg', + + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_ZAPPED]: 'mentioned_post_zapped.svg', + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_LIKED]: 'mentioned_post_liked.svg', + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPOSTED]: 'mentioned_post_reposted.svg', + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPLIED_TO]: 'mentioned_post_replied.svg', + +} + +export const notificationTypeUserProps: Record = { + [NotificationType.NEW_USER_FOLLOWED_YOU]: 'follower', + [NotificationType.USER_UNFOLLOWED_YOU]: 'follower', + + [NotificationType.YOUR_POST_WAS_ZAPPED]: 'who_zapped_it', + [NotificationType.YOUR_POST_WAS_LIKED]: 'who_liked_it', + [NotificationType.YOUR_POST_WAS_REPOSTED]: 'who_reposted_it', + [NotificationType.YOUR_POST_WAS_REPLIED_TO]: 'who_replied_to_it', + + [NotificationType.YOU_WERE_MENTIONED_IN_POST]: 'you_were_mentioned_in', + [NotificationType.YOUR_POST_WAS_MENTIONED_IN_POST]: 'your_post_were_mentioned_in', + + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_ZAPPED]: 'who_zapped_it', + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_LIKED]: 'who_liked_it', + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_REPOSTED]: 'who_reposted_it', + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_REPLIED_TO]: 'who_replied_to_it', + + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_ZAPPED]: 'who_zapped_it', + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_LIKED]: 'who_liked_it', + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPOSTED]: 'who_reposted_it', + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPLIED_TO]: 'who_replied_to_it', + +} + +export const notificationTypeNoteProps: Record = { + // [NotificationType.NEW_USER_FOLLOWED_YOU]: 'follower', + // [NotificationType.USER_UNFOLLOWED_YOU]: 'follower', + + [NotificationType.YOUR_POST_WAS_ZAPPED]: 'your_post', + [NotificationType.YOUR_POST_WAS_LIKED]: 'your_post', + [NotificationType.YOUR_POST_WAS_REPOSTED]: 'your_post', + [NotificationType.YOUR_POST_WAS_REPLIED_TO]: 'reply', + + [NotificationType.YOU_WERE_MENTIONED_IN_POST]: 'you_were_mentioned_in', + [NotificationType.YOUR_POST_WAS_MENTIONED_IN_POST]: 'your_post_were_mentioned_in', + + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_ZAPPED]: 'post_you_were_mentioned_in', + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_LIKED]: 'post_you_were_mentioned_in', + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_REPOSTED]: 'post_you_were_mentioned_in', + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_REPLIED_TO]: 'reply', + + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_ZAPPED]: 'your_post_were_mentioned_in', + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_LIKED]: 'your_post_were_mentioned_in', + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPOSTED]: 'your_post_were_mentioned_in', + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPLIED_TO]: 'reply', + +} + +export const noteRegex = /nostr:((note|nevent)1\w+)\b|#\[(\d+)\]/g; +export const profileRegex = /nostr:((npub|nprofile)1\w+)\b|#\[(\d+)\]/g; +export const editMentionRegex = /(?:\s|^)@\`(.*?)\`/ig; + +export const medZapLimit = 1000; + + +export const defaultNotificationSettings: Record = { + NEW_USER_FOLLOWED_YOU: true, + USER_UNFOLLOWED_YOU: true, + + YOUR_POST_WAS_ZAPPED: true, + YOUR_POST_WAS_LIKED: true, + YOUR_POST_WAS_REPOSTED: true, + YOUR_POST_WAS_REPLIED_TO: true, + + YOU_WERE_MENTIONED_IN_POST: true, + YOUR_POST_WAS_MENTIONED_IN_POST: true, + + POST_YOU_WERE_MENTIONED_IN_WAS_ZAPPED: true, + POST_YOU_WERE_MENTIONED_IN_WAS_LIKED: true, + POST_YOU_WERE_MENTIONED_IN_WAS_REPOSTED: true, + POST_YOU_WERE_MENTIONED_IN_WAS_REPLIED_TO: true, + + POST_YOUR_POST_WAS_MENTIONED_IN_WAS_ZAPPED: true, + POST_YOUR_POST_WAS_MENTIONED_IN_WAS_LIKED: true, + POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPOSTED: true, + POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPLIED_TO: true, +}; + +export const emojiSearchLimit = 1; diff --git a/src/contexts/AccountContext.tsx b/src/contexts/AccountContext.tsx new file mode 100644 index 0000000..eda8048 --- /dev/null +++ b/src/contexts/AccountContext.tsx @@ -0,0 +1,396 @@ +import { createStore } from "solid-js/store"; +import { + createContext, + createEffect, + JSX, + onCleanup, + onMount, + useContext +} from "solid-js"; +import { + NostrContactsContent, + NostrEOSE, + NostrEvent, + NostrRelays, + NostrWindow, + PrimalNote, + PrimalUser, +} from '../types/primal'; +import { Kind, noKey } from "../constants"; +import { isConnected, refreshSocketListeners, removeSocketListeners, socket, subscribeTo } from "../sockets"; +import { sendContacts, sendLike } from "../lib/notes"; +import { Relay } from "nostr-tools"; +import { APP_ID } from "../App"; +import { getLikes, getProfileContactList, getUserProfiles } from "../lib/profile"; +import { getStorage, saveFollowing, saveLikes, saveRelaySettings } from "../lib/localStore"; +import { closeRelays, connectRelays } from "../lib/relays"; + +export type AccountContextStore = { + likes: string[], + relays: Relay[], + relaySettings: NostrRelays, + publicKey: string | undefined, + activeUser: PrimalUser | undefined, + showNewNoteForm: boolean, + following: string[], + followingSince: number, + hasPublicKey: () => boolean, + isKeyLookupDone: boolean, + actions: { + showNewNoteForm: () => void, + hideNewNoteForm: () => void, + setActiveUser: (user: PrimalUser) => void, + addLike: (note: PrimalNote) => Promise, + setPublicKey: (pubkey: string | undefined) => void, + addFollow: (pubkey: string) => void, + removeFollow: (pubkey: string) => void, + }, +} + +const initialData = { + likes: [], + relays: [], + relaySettings: {}, + publicKey: undefined, + activeUser: undefined, + showNewNoteForm: false, + following: [], + followingSince: 0, + isKeyLookupDone: false, +}; + +export const AccountContext = createContext(); + +export function AccountProvider(props: { children: number | boolean | Node | JSX.ArrayElement | JSX.FunctionElement | (string & {}) | null | undefined; }) { + + const setPublicKey = (pubkey: string | undefined) => { + updateStore('publicKey', () => pubkey); + updateStore('isKeyLookupDone', true); + }; + + const hasPublicKey: () => boolean = () => { + return !!store.publicKey && store.publicKey !== noKey; + }; + + const setRelaySettings = (settings: NostrRelays) => { + updateStore('relaySettings', () => ({ ...settings })); + saveRelaySettings(store.publicKey, settings) + } + + let connecting = false; + + const connectToRelays = (relaySettings: NostrRelays) => { + + if (connecting) { + return; + } + + connecting = true; + + closeRelays(store.relays, + () => { + connectRelays(relaySettings, (connected) => { + updateStore('relays', () => [ ...connected ]); + console.log('Connected relays: ', connected); + connecting = false; + }); + + }, + () => { + console.log('Failed to close all relays'); + connecting = false; + }, + ); + + }; + + let extensionAttempt = 0; + + const fetchNostrKey = async () => { + const win = window as NostrWindow; + const nostr = win.nostr; + + if (nostr === undefined) { + console.log('No WebLn extension'); + // Try again after one second if extensionAttempts are not exceeded + if (extensionAttempt < 1) { + extensionAttempt += 1; + setTimeout(fetchNostrKey, 1000); + return; + } + + updateStore('isKeyLookupDone', true); + return; + } + + try { + const key = await nostr.getPublicKey(); + + if (key === undefined) { + setTimeout(fetchNostrKey, 1000); + } + else { + setPublicKey(key); + localStorage.setItem('pubkey', key); + // getRelays(); + getUserProfiles([key], `user_profile_${APP_ID}`); + } + } catch (e: any) { + setPublicKey(noKey); + localStorage.setItem('pubkey', noKey); + console.log('error fetching public key: ', e); + } + } + + const setActiveUser = (user: PrimalUser) => { + updateStore('activeUser', () => ({...user})); + }; + + const showNewNoteForm = () => { + updateStore('showNewNoteForm', () => true); + }; + + const hideNewNoteForm = () => { + updateStore('showNewNoteForm', () => false); + }; + + const addLike = async (note: PrimalNote) => { + if (store.likes.includes(note.post.id)) { + return false; + } + + const success = await sendLike(note, store.relays); + + if (success) { + updateStore('likes', (likes) => [ ...likes, note.post.id]); + saveLikes(store.publicKey, store.likes); + } + + return success; + }; + + const updateContacts = (content: NostrContactsContent) => { + + const followingSince = content.created_at; + const tags = content.tags; + + const contacts = tags.reduce((acc, t) => { + return t[0] === 'p' ? [ ...acc, t[1] ] : acc; + }, []); + + setRelaySettings(JSON.parse(content.content || '{}')); + updateStore('following', () => contacts); + updateStore('followingSince', () => followingSince || 0); + saveFollowing(store.publicKey, contacts, followingSince || 0); + }; + + const addFollow = (pubkey: string) => { + if (!store.publicKey || store.following.includes(pubkey)) { + return; + } + + const unsub = subscribeTo(`before_follow_${APP_ID}`, async (type, subId, content) => { + if (type === 'EOSE') { + + if (!store.following.includes(pubkey)) { + const relayInfo = JSON.stringify(store.relaySettings); + const date = Math.floor((new Date()).getTime() / 1000); + const following = [...store.following, pubkey]; + + const success = await sendContacts(following, date, relayInfo, store.relays); + + if (success) { + updateStore('following', () => following); + updateStore('followingSince', () => date); + saveFollowing(store.publicKey, following, date); + } + } + + unsub(); + return; + } + + if (content && + content.kind === Kind.Contacts && + content.created_at && + content.created_at > store.followingSince + ) { + updateContacts(content); + } + }); + + getProfileContactList(store.publicKey, `before_follow_${APP_ID}`); + + } + + const removeFollow = (pubkey: string) => { + if (!store.publicKey || !store.following.includes(pubkey)) { + return; + } + + const unsub = subscribeTo(`before_unfollow_${APP_ID}`, async (type, subId, content) => { + if (type === 'EOSE') { + if (store.following.includes(pubkey)) { + const relayInfo = JSON.stringify(store.relaySettings); + const date = Math.floor((new Date()).getTime() / 1000); + const following = store.following.filter(f => f !== pubkey); + + const success = await sendContacts(following, date, relayInfo, store.relays); + + if (success) { + updateStore('following', () => following); + updateStore('followingSince', () => date); + saveFollowing(store.publicKey, following, date); + } + } + + unsub(); + return; + } + + if (content && + content.kind === Kind.Contacts && + content.created_at && + content.created_at > store.followingSince + ) { + updateContacts(content); + } + }); + + getProfileContactList(store.publicKey, `before_unfollow_${APP_ID}`); + + } + + +// EFFECTS -------------------------------------- + + onMount(() => { + setTimeout(() => { + updateStore('isKeyLookupDone', false); + fetchNostrKey(); + }, 1000); + }); + + createEffect(() => { + if (store.publicKey && store.publicKey !== noKey) { + + const storage = getStorage(store.publicKey); + + if (store.followingSince < storage.followingSince) { + updateStore('following', () => ({ ...storage.following })); + updateStore('followingSince', () => storage.followingSince); + } + + getProfileContactList(store.publicKey, `user_contacts_${APP_ID}`); + } + }); + + createEffect(() => { + if (store.publicKey && store.relays.length > 0) { + getLikes(store.publicKey, store.relays, (likes: string[]) => { + + updateStore('likes', () => [...likes]); + saveLikes(store.publicKey, likes); + }); + } + }); + + // If user has relays but none is connected, retry connecting after a delay + createEffect(() => { + if ( + Object.keys(store.relaySettings).length > 0 && + store.relays.length === 0 + ) { + setTimeout(() => { + connectToRelays(store.relaySettings); + }, 2000); + } + }) + + createEffect(() => { + if (isConnected()) { + refreshSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + } + }); + + createEffect(() => { + if (Object.keys(store.relaySettings).length > 0) { + connectToRelays(store.relaySettings); + } + }); + + onCleanup(() => { + removeSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + store.relays.forEach(relay => relay.close()) + }); + +// SOCKET HANDLERS ------------------------------ + + const onSocketClose = (closeEvent: CloseEvent) => { + const webSocket = closeEvent.target as WebSocket; + + webSocket.removeEventListener('message', onMessage); + webSocket.removeEventListener('close', onSocketClose); + }; + + const onMessage = (event: MessageEvent) => { + const message: NostrEvent | NostrEOSE = JSON.parse(event.data); + + const [type, subId, content] = message; + + if (subId === `user_profile_${APP_ID}`) { + if (content?.content) { + const user = JSON.parse(content.content); + + updateStore('activeUser', () => ({...user})); + } + return; + } + + if (subId === `user_contacts_${APP_ID}`) { + if (content && content.kind === Kind.Contacts) { + if (Object.keys(store.relaySettings).length === 0) { + setRelaySettings(JSON.parse(content.content || '{}')); + } + + if (!content.created_at || content.created_at <= store.followingSince) { + return; + } + + updateContacts(content); + } + return; + } + + }; + +// STORES --------------------------------------- + +const [store, updateStore] = createStore({ + ...initialData, + hasPublicKey, + actions: { + showNewNoteForm, + hideNewNoteForm, + setActiveUser, + addLike, + setPublicKey, + addFollow, + removeFollow, + }, +}); + + return ( + + {props.children} + + ); +} + +export function useAccountContext() { return useContext(AccountContext); } diff --git a/src/contexts/ExploreContext.tsx b/src/contexts/ExploreContext.tsx new file mode 100644 index 0000000..ce29c12 --- /dev/null +++ b/src/contexts/ExploreContext.tsx @@ -0,0 +1,371 @@ +import { nip19 } from "nostr-tools"; +import { createStore } from "solid-js/store"; +import { getEvents, getExploreFeed } from "../lib/feed"; +import { useAccountContext } from "./AccountContext"; +import { sortingPlan, convertToNotes, parseEmptyReposts, paginationPlan } from "../stores/note"; +import { Kind } from "../constants"; +import { + createContext, + createEffect, + onCleanup, + useContext +} from "solid-js"; +import { + getLegendStats, + startListeningForNostrStats, + stopListeningForNostrStats +} from "../lib/stats"; +import { + isConnected, + refreshSocketListeners, + removeSocketListeners, + socket +} from "../sockets"; +import { + ContextChildren, + FeedPage, + NostrEOSE, + NostrEvent, + NostrEventContent, + NostrMentionContent, + NostrNoteActionsContent, + NostrNoteContent, + NostrStatsContent, + NostrUserContent, + NoteActions, + PrimalNote, +} from "../types/primal"; +import { APP_ID } from "../App"; + +export type ExploreContextStore = { + notes: PrimalNote[], + scope: string, + timeframe: string, + isFetching: boolean, + page: FeedPage, + lastNote: PrimalNote | undefined, + reposts: Record | undefined, + isNetStatsStreamOpen: boolean, + stats: { + users: number, + pubkeys: number, + pubnotes: number, + reactions: number, + reposts: number, + any: number, + zaps: number, + satszapped: number, + }, + legend: { + your_follows: number, + your_inner_network: number, + your_outer_network: number, + }, + actions: { + saveNotes: (newNotes: PrimalNote[]) => void, + clearNotes: () => void, + fetchNotes: (topic: string, until?: number, limit?: number) => void, + fetchNextPage: () => void, + updatePage: (content: NostrEventContent) => void, + savePage: (page: FeedPage) => void, + openNetStatsStream: () => void, + closeNetStatsStream: () => void, + fetchLegendStats: (pubkey?: string) => void, + } +} + +export const initialExploreData = { + notes: [], + isFetching: false, + scope: 'global', + timeframe: 'latest', + page: { + messages: [], + users: {}, + postStats: {}, + mentions: {}, + noteActions: {}, + }, + reposts: {}, + lastNote: undefined, + isNetStatsStreamOpen: false, + stats: { + users: 0, + pubkeys: 0, + pubnotes: 0, + reactions: 0, + reposts: 0, + any: 0, + zaps: 0, + satszapped: 0, + }, + legend: { + your_follows: 0, + your_inner_network: 0, + your_outer_network: 0, + }, +}; + + +export const ExploreContext = createContext(); + +export const ExploreProvider = (props: { children: ContextChildren }) => { + + const account = useAccountContext(); + +// ACTIONS -------------------------------------- + + const saveNotes = (newNotes: PrimalNote[]) => { + + updateStore('notes', (notes) => [ ...notes, ...newNotes ]); + updateStore('isFetching', () => false); + }; + + const fetchNotes = (topic: string, until = 0, limit = 20) => { + const [scope, timeframe] = topic.split(';'); + + + if (scope && timeframe) { + updateStore('isFetching', true); + updateStore('page', () => ({ messages: [], users: {}, postStats: {} })); + + updateStore('scope', () => scope); + updateStore('timeframe', () => timeframe); + + getExploreFeed( + account?.publicKey || '', + `explore_${APP_ID}`, + scope, + timeframe, + until, + limit, + ); + return; + } + } + + const clearNotes = () => { + updateStore('page', () => ({ messages: [], users: {}, postStats: {}, noteActions: {} })); + updateStore('notes', () => []); + updateStore('reposts', () => undefined); + updateStore('lastNote', () => undefined); + }; + + const fetchNextPage = () => { + const lastNote = store.notes[store.notes.length - 1]; + + if (!lastNote) { + return; + } + + updateStore('lastNote', () => ({ ...lastNote })); + + const criteria = paginationPlan(store.timeframe); + + const noteData: Record = lastNote.repost ? + lastNote.repost.note : + lastNote.post; + + const until = noteData[criteria]; + + if (until > 0) { + fetchNotes( + `${store.scope};${store.timeframe}`, + until, + ); + } + }; + + const updatePage = (content: NostrEventContent) => { + if (content.kind === Kind.Metadata) { + const user = content as NostrUserContent; + + updateStore('page', 'users', + (usrs) => ({ ...usrs, [user.pubkey]: { ...user } }) + ); + return; + } + + if ([Kind.Text, Kind.Repost].includes(content.kind)) { + const message = content as NostrNoteContent; + + if (store.lastNote?.post?.noteId !== nip19.noteEncode(message.id)) { + updateStore('page', 'messages', + (msgs) => [ ...msgs, { ...message }] + ); + } + + return; + } + + if (content.kind === Kind.NoteStats) { + const statistic = content as NostrStatsContent; + const stat = JSON.parse(statistic.content); + + updateStore('page', 'postStats', + (stats) => ({ ...stats, [stat.event_id]: { ...stat } }) + ); + return; + } + + if (content.kind === Kind.Mentions) { + const mentionContent = content as NostrMentionContent; + const mention = JSON.parse(mentionContent.content); + + updateStore('page', 'mentions', + (mentions) => ({ ...mentions, [mention.id]: { ...mention } }) + ); + return; + } + + if (content.kind === Kind.NoteActions) { + const noteActionContent = content as NostrNoteActionsContent; + const noteActions = JSON.parse(noteActionContent.content) as NoteActions; + + updateStore('page', 'noteActions', + (actions) => ({ ...actions, [noteActions.event_id]: { ...noteActions } }) + ); + return; + } + }; + + const savePage = (page: FeedPage) => { + const sort = sortingPlan(store.timeframe); + + const newPosts = sort(convertToNotes(page)); + + saveNotes(newPosts); + }; + + const openNetStatsStream = () => { + startListeningForNostrStats(APP_ID); + }; + + const closeNetStatsStream = () => { + stopListeningForNostrStats(APP_ID); + }; + + const fetchLegendStats = (pubkey?: string) => { + if (!pubkey) { + return; + } + + getLegendStats(pubkey, APP_ID); + }; + +// SOCKET HANDLERS ------------------------------ + + const onMessage = (event: MessageEvent) => { + const message: NostrEvent | NostrEOSE = JSON.parse(event.data); + + const [type, subId, content] = message; + + if (subId === `explore_${APP_ID}`) { + if (type === 'EOSE') { + const reposts = parseEmptyReposts(store.page); + const ids = Object.keys(reposts); + + if (ids.length === 0) { + savePage(store.page); + return; + } + + updateStore('reposts', () => reposts); + + getEvents(account?.publicKey, ids, `explore_reposts_${APP_ID}`); + + return; + } + + if (type === 'EVENT') { + updatePage(content); + return; + } + } + + if ([`netstats_${APP_ID}`, `legendstats_${APP_ID}`].includes(subId) && content?.content) { + const stats = JSON.parse(content.content); + + if (content.kind === Kind.NetStats) { + updateStore('stats', () => ({ ...stats })); + } + + if (content.kind === Kind.LegendStats) { + updateStore('legend', () => ({ ...stats })); + } + } + + if (subId === `explore_reposts_${APP_ID}`) { + if (type === 'EOSE') { + savePage(store.page); + return; + } + + if (type === 'EVENT') { + const repostId = (content as NostrNoteContent).id; + const reposts = store.reposts || {}; + const parent = store.page.messages.find(m => m.id === reposts[repostId]); + + if (parent) { + updateStore('page', 'messages', (msg) => msg.id === parent.id, 'content', () => JSON.stringify(content)); + } + + return; + } + } + }; + + const onSocketClose = (closeEvent: CloseEvent) => { + const webSocket = closeEvent.target as WebSocket; + + removeSocketListeners( + webSocket, + { message: onMessage, close: onSocketClose }, + ); + }; + +// EFFECTS -------------------------------------- + + createEffect(() => { + if (isConnected()) { + refreshSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + } + }); + + onCleanup(() => { + removeSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + }); + +// STORES --------------------------------------- + + const [store, updateStore] = createStore({ + ...initialExploreData, + actions: { + saveNotes, + fetchNotes, + clearNotes, + fetchNextPage, + updatePage, + savePage, + openNetStatsStream, + closeNetStatsStream, + fetchLegendStats, + }, + }); + +// RENDER --------------------------------------- + + return ( + + {props.children} + + ); +} + +export const useExploreContext = () => useContext(ExploreContext); diff --git a/src/contexts/HomeContext.tsx b/src/contexts/HomeContext.tsx new file mode 100644 index 0000000..59c3bd6 --- /dev/null +++ b/src/contexts/HomeContext.tsx @@ -0,0 +1,522 @@ +import { nip19 } from "nostr-tools"; +import { createContext, createEffect, onCleanup, useContext } from "solid-js"; +import { createStore } from "solid-js/store"; +import { APP_ID } from "../App"; +import { Kind } from "../constants"; +import { getEvents, getExploreFeed, getFeed, getFutureExploreFeed, getFutureFeed } from "../lib/feed"; +import { searchContent } from "../lib/search"; +import { isConnected, refreshSocketListeners, removeSocketListeners, socket } from "../sockets"; +import { sortingPlan, convertToNotes, parseEmptyReposts, paginationPlan } from "../stores/note"; +import { + ContextChildren, + FeedPage, + NostrEOSE, + NostrEvent, + NostrEventContent, + NostrMentionContent, + NostrNoteActionsContent, + NostrNoteContent, + NostrStatsContent, + NostrUserContent, + NoteActions, + PrimalFeed, + PrimalNote, +} from "../types/primal"; +import { useAccountContext } from "./AccountContext"; +import { useSettingsContext } from "./SettingsContext"; + +type HomeContextStore = { + notes: PrimalNote[], + isFetching: boolean, + scrollTop: number, + selectedFeed: PrimalFeed | undefined, + page: FeedPage, + lastNote: PrimalNote | undefined, + reposts: Record | undefined, + mentionedNotes: Record, + future: { + notes: PrimalNote[], + page: FeedPage, + reposts: Record | undefined, + }, + actions: { + saveNotes: (newNotes: PrimalNote[]) => void, + clearNotes: () => void, + fetchNotes: (topic: string, subId: string, until?: number) => void, + fetchNextPage: () => void, + selectFeed: (feed: PrimalFeed | undefined) => void, + updateScrollTop: (top: number) => void, + updatePage: (content: NostrEventContent) => void, + savePage: (page: FeedPage) => void, + checkForNewNotes: (topic: string | undefined) => void, + loadFutureContent: () => void, + } +} + +const initialHomeData = { + notes: [], + isFetching: false, + scrollTop: 0, + selectedFeed: undefined, + page: { + messages: [], + users: {}, + postStats: {}, + mentions: {}, + noteActions: {}, + }, + reposts: {}, + lastNote: undefined, + mentionedNotes: {}, + future: { + notes: [], + reposts: {}, + page: { + messages: [], + users: {}, + postStats: {}, + mentions: {}, + noteActions: {}, + }, + }, +}; + +export const HomeContext = createContext(); + +export const HomeProvider = (props: { children: ContextChildren }) => { + + const settings = useSettingsContext(); + const account = useAccountContext(); + +// ACTIONS -------------------------------------- + + const clearFuture = () => { + updateStore('future', () => ({ + notes: [], + reposts: {}, + page: { + messages: [], + users: {}, + postStats: {}, + mentions: {}, + noteActions: {}, + }, + })) + } + + const saveNotes = (newNotes: PrimalNote[], scope?: 'future') => { + if (scope) { + updateStore(scope, 'notes', (notes) => [ ...notes, ...newNotes ]); + return; + } + updateStore('notes', (notes) => [ ...notes, ...newNotes ]); + updateStore('isFetching', () => false); + }; + + const checkForNewNotes = (topic: string | undefined) => { + + if (!topic) { + return; + } + + if (store.future.notes.length > 100) { + return; + } + + const [scope, timeframe] = topic.split(';'); + + let since = 0; + + if (store.notes[0]) { + since = store.notes[0].repost ? + store.notes[0].repost.note.created_at : + store.notes[0].post.created_at; + } + + // if (store.future.notes[0]) { + // since = store.future.notes[0].post.created_at; + // } + + clearFuture(); + + + if (scope && timeframe) { + + // if (scope === 'search') { + // searchFutureContent(`home_future_${APP_ID}`, decodeURI(timeframe), since); + // return; + // } + + getFutureExploreFeed( + account?.publicKey, + `home_future_${APP_ID}`, + scope, + timeframe, + since, + ); + return; + } + + getFutureFeed(account?.publicKey, topic, `home_future_${APP_ID}`, since); + } + + const loadFutureContent = () => { + if (store.future.notes.length === 0) { + return; + } + + updateStore('notes', (notes) => [...store.future.notes, ...notes]); + clearFuture(); + }; + + const fetchNotes = (topic: string, subId: string, until = 0) => { + const [scope, timeframe] = topic.split(';'); + + updateStore('isFetching', true); + updateStore('page', () => ({ messages: [], users: {}, postStats: {} })); + + if (scope && timeframe) { + + if (scope === 'search') { + searchContent(`home_feed_${subId}`, decodeURI(timeframe)); + return; + } + + getExploreFeed( + account?.publicKey, + `home_feed_${subId}`, + scope, + timeframe, + until, + ); + return; + } + + getFeed(account?.publicKey, topic, `home_feed_${subId}`, until); + }; + + const clearNotes = () => { + updateStore('scrollTop', () => 0); + updateStore('page', () => ({ messages: [], users: {}, postStats: {}, noteActions: {} })); + updateStore('notes', () => []); + updateStore('reposts', () => undefined); + updateStore('lastNote', () => undefined); + + clearFuture(); + }; + + const fetchNextPage = () => { + const lastNote = store.notes[store.notes.length - 1]; + + if (!lastNote) { + return; + } + + updateStore('lastNote', () => ({ ...lastNote })); + + const topic = store.selectedFeed?.hex; + + if (!topic) { + return; + } + + const [scope, timeframe] = topic.split(';'); + + if (scope === 'search') { + return; + } + + const pagCriteria = timeframe || 'latest'; + + const criteria = paginationPlan(pagCriteria); + + const noteData: Record = lastNote.repost ? + lastNote.repost.note : + lastNote.post; + + const until = noteData[criteria]; + + if (until > 0) { + fetchNotes(topic, `${APP_ID}`, until); + } + }; + + const updateScrollTop = (top: number) => { + updateStore('scrollTop', () => top); + }; + + const selectFeed = (feed: PrimalFeed | undefined) => { + if (feed !== undefined && feed.hex !== undefined) { + updateStore('selectedFeed', () => ({ ...feed })); + clearNotes(); + fetchNotes(feed.hex , `${APP_ID}`); + } + }; + + const updatePage = (content: NostrEventContent, scope?: 'future') => { + if (content.kind === Kind.Metadata) { + const user = content as NostrUserContent; + + if (scope) { + updateStore(scope, 'page', 'users', + (usrs) => ({ ...usrs, [user.pubkey]: { ...user } }) + ); + return; + } + + updateStore('page', 'users', + (usrs) => ({ ...usrs, [user.pubkey]: { ...user } }) + ); + return; + } + + if ([Kind.Text, Kind.Repost].includes(content.kind)) { + const message = content as NostrNoteContent; + const messageId = nip19.noteEncode(message.id); + + if (scope) { + const isFirstNote = message.kind === Kind.Text ? + store.notes[0]?.post?.noteId === messageId : + store.notes[0]?.repost?.note.noteId === messageId; + + // const isAlreadyFetched = message.kind === Kind.Text ? + // store.future.notes[0]?.post?.noteId === messageId : + // store.future.notes[0]?.repost?.note.noteId === messageId; + + if (!isFirstNote) { + updateStore(scope, 'page', 'messages', + (msgs) => [ ...msgs, { ...message }] + ); + } + return; + } + + const isLastNote = message.kind === Kind.Text ? + store.lastNote?.post?.noteId === messageId : + store.lastNote?.repost?.note.noteId === messageId; + + if (!isLastNote) { + updateStore('page', 'messages', + (msgs) => [ ...msgs, { ...message }] + ); + } + + return; + } + + if (content.kind === Kind.NoteStats) { + const statistic = content as NostrStatsContent; + const stat = JSON.parse(statistic.content); + + if (scope) { + updateStore(scope, 'page', 'postStats', + (stats) => ({ ...stats, [stat.event_id]: { ...stat } }) + ); + return; + } + updateStore('page', 'postStats', + (stats) => ({ ...stats, [stat.event_id]: { ...stat } }) + ); + return; + } + + if (content.kind === Kind.Mentions) { + const mentionContent = content as NostrMentionContent; + const mention = JSON.parse(mentionContent.content); + + if (scope) { + updateStore(scope, 'page', 'mentions', + (mentions) => ({ ...mentions, [mention.id]: { ...mention } }) + ); + return; + } + + updateStore('page', 'mentions', + (mentions) => ({ ...mentions, [mention.id]: { ...mention } }) + ); + return; + } + + if (content.kind === Kind.NoteActions) { + const noteActionContent = content as NostrNoteActionsContent; + const noteActions = JSON.parse(noteActionContent.content) as NoteActions; + + if (scope) { + updateStore(scope, 'page', 'noteActions', + (actions) => ({ ...actions, [noteActions.event_id]: { ...noteActions } }) + ); + return; + } + + updateStore('page', 'noteActions', + (actions) => ({ ...actions, [noteActions.event_id]: { ...noteActions } }) + ); + return; + } + }; + + const savePage = (page: FeedPage, scope?: 'future') => { + const topic = (store.selectedFeed?.hex || '').split(';'); + const sortingFunction = sortingPlan(topic[1]); + + const newPosts = sortingFunction(convertToNotes(page)); + + saveNotes(newPosts, scope); + }; + +// SOCKET HANDLERS ------------------------------ + + const onMessage = (event: MessageEvent) => { + const message: NostrEvent | NostrEOSE = JSON.parse(event.data); + + const [type, subId, content] = message; + + if (subId === `home_feed_${APP_ID}`) { + if (type === 'EOSE') { + const reposts = parseEmptyReposts(store.page); + const ids = Object.keys(reposts); + + if (ids.length === 0) { + savePage(store.page); + return; + } + + updateStore('reposts', () => reposts); + + getEvents(account?.publicKey, ids, `home_reposts_${APP_ID}`); + + return; + } + + if (type === 'EVENT') { + updatePage(content); + return; + } + } + + if (subId === `home_reposts_${APP_ID}`) { + if (type === 'EOSE') { + savePage(store.page); + return; + } + + if (type === 'EVENT') { + const repostId = (content as NostrNoteContent).id; + const reposts = store.reposts || {}; + const parent = store.page.messages.find(m => m.id === reposts[repostId]); + + if (parent) { + updateStore('page', 'messages', (msg) => msg.id === parent.id, 'content', () => JSON.stringify(content)); + } + + return; + } + } + + if (subId === `home_future_${APP_ID}`) { + if (type === 'EOSE') { + const reposts = parseEmptyReposts(store.future.page); + const ids = Object.keys(reposts); + + if (ids.length === 0) { + savePage(store.future.page, 'future'); + return; + } + + updateStore('future', 'reposts', () => reposts); + + getEvents(account?.publicKey, ids, `home_future_reposts_${APP_ID}`); + + return; + } + + if (type === 'EVENT') { + updatePage(content, 'future'); + return; + } + } + + if (subId === `home_future_reposts_${APP_ID}`) { + if (type === 'EOSE') { + savePage(store.future.page, 'future'); + return; + } + + if (type === 'EVENT') { + const repostId = (content as NostrNoteContent).id; + const reposts = store.future.reposts || {}; + const parent = store.future.page.messages.find(m => m.id === reposts[repostId]); + + if (parent) { + updateStore('future', 'page', 'messages', (msg) => msg.id === parent.id, 'content', () => JSON.stringify(content)); + } + + return; + } + } + + + }; + + const onSocketClose = (closeEvent: CloseEvent) => { + const webSocket = closeEvent.target as WebSocket; + + removeSocketListeners( + webSocket, + { message: onMessage, close: onSocketClose }, + ); + }; + +// EFFECTS -------------------------------------- + + createEffect(() => { + if (isConnected()) { + refreshSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + } + }); + + createEffect(() => { + if (account?.isKeyLookupDone) { + selectFeed(settings?.defaultFeed); + } + }); + + onCleanup(() => { + removeSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + }); + + +// STORES --------------------------------------- + + const [store, updateStore] = createStore({ + ...initialHomeData, + actions: { + saveNotes, + clearNotes, + fetchNotes, + fetchNextPage, + selectFeed, + updateScrollTop, + updatePage, + savePage, + checkForNewNotes, + loadFutureContent, + }, + }); + +// RENDER ------------------------------------- + + return ( + + {props.children} + + ); +} + +export const useHomeContext = () => useContext(HomeContext); diff --git a/src/contexts/MediaContext.tsx b/src/contexts/MediaContext.tsx new file mode 100644 index 0000000..1cbe014 --- /dev/null +++ b/src/contexts/MediaContext.tsx @@ -0,0 +1,116 @@ +import { createStore } from "solid-js/store"; +import { + createContext, + createEffect, + JSXElement, + onCleanup, + useContext +} from "solid-js"; +import { MediaEvent, MediaSize, MediaVariant, NostrEOSE, NostrEvent } from "../types/primal"; +import { removeSocketListeners, isConnected, refreshSocketListeners, socket } from "../sockets"; +import { Kind } from "../constants"; + +export type MediaContextStore = { + media: Record, + actions: { + getMedia: (url: string , size?: MediaSize, animated?: boolean) => MediaVariant | undefined, + getMediaUrl: (url: string | undefined, size?: MediaSize, animated?: boolean) => string | undefined, + }, +} + +const initialData = { + media: {}, +}; + +export const MediaContext = createContext(); + +export const MediaProvider = (props: { children: JSXElement }) => { + + const getMedia = (url: string, size?: MediaSize , animated?: boolean) => { + const variants: MediaVariant[] = store.media[url] || []; + + const isOfSize = (s: MediaSize) => size ? size === s : true; + const isAnimated = (a: 0 | 1) => animated !== undefined ? animated === !!a : true; + + return variants.find(v => isOfSize(v.s) && isAnimated(v.a)); + }; + + const getMediaUrl = (url: string | undefined, size?: MediaSize, animated?: boolean) => { + if (!url) { + return; + } + + const media = getMedia(url, size, animated); + + return media?.media_url; + } + +// SOCKET HANDLERS ------------------------------ + + const onMessage = (event: MessageEvent) => { + const message: NostrEvent | NostrEOSE = JSON.parse(event.data); + + const [type, _, content] = message; + + if (type === 'EVENT') { + if (content.kind === Kind.MediaInfo) { + const mediaInfo: MediaEvent = JSON.parse(content.content); + + let media: Record = {}; + + for (let i = 0;i ({ ...media })); + } + } + }; + + const onSocketClose = (closeEvent: CloseEvent) => { + const webSocket = closeEvent.target as WebSocket; + + removeSocketListeners( + webSocket, + { message: onMessage, close: onSocketClose }, + ); + }; + +// EFFECTS -------------------------------------- + + createEffect(() => { + if (isConnected()) { + refreshSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + } + }); + + onCleanup(() => { + removeSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + }); + + +// STORES --------------------------------------- + + const [store, updateStore] = createStore({ + ...initialData, + actions: { + getMedia, + getMediaUrl, + }, + }); + + return ( + + {props.children} + + ); +} + +export const useMediaContext = () => useContext(MediaContext); diff --git a/src/contexts/MessagesContext.tsx b/src/contexts/MessagesContext.tsx new file mode 100644 index 0000000..2e96743 --- /dev/null +++ b/src/contexts/MessagesContext.tsx @@ -0,0 +1,816 @@ +import { createStore } from "solid-js/store"; +import { Kind } from "../constants"; +import { + createContext, + createEffect, + onCleanup, + useContext +} from "solid-js"; +import { + isConnected, + refreshSocketListeners, + removeSocketListeners, + socket, + subscribeTo +} from "../sockets"; +import { + ContextChildren, + FeedPage, + NostrEOSE, + NostrEvent, + NostrMentionContent, + NostrMessageEncryptedContent, + NostrNoteActionsContent, + NostrNoteContent, + NostrStatsContent, + NostrUserContent, + NostrWindow, + NoteActions, + PrimalNote, + PrimalUser, + UserRelation, +} from "../types/primal"; +import { APP_ID } from "../App"; +import { getMessageCounts, getNewMessages, getOldMessages, markAllAsRead, resetMessageCount, subscribeToMessagesStats } from "../lib/messages"; +import { useAccountContext } from "./AccountContext"; +import { convertToUser } from "../stores/profile"; +import { getUserProfiles } from "../lib/profile"; +import { getEvents } from "../lib/feed"; +import { nip19 } from "nostr-tools"; +import { convertToNotes } from "../stores/note"; +import { sanitize, sendEvent } from "../lib/notes"; + + +type DirectMessage = { + id: string, + sender: string, + content: string, + created_at: number, +}; + +type DirectMessageThread = { + author: string, + messages: DirectMessage[], +}; + +type SenderMessageCount = { + cnt: number, + latest_at: number, + latest_event_id: string, +} + +export type MessagesContextStore = { + messageCount: number, + messageCountPerSender: Record, + senders: Record; + selectedSender: PrimalUser | null, + encryptedMessages: NostrMessageEncryptedContent[], + messages: DirectMessage[], + conversation: DirectMessageThread[], + isConversationLoaded: boolean, + referecedUsers: Record, + referecedNotes: Record, + referencePage: FeedPage, + now: number, + senderRelation: UserRelation, + addSender: PrimalUser | undefined, + actions: { + getMessagesPerSender: () => void, + changeSenderRelation: (relation: UserRelation) => void, + selectSender: (senderId: string | undefined) => void, + resetConversationLoaded: () => void, + addToConversation: (messages: DirectMessage[]) => void, + sendMessage: (receiver: PrimalUser, message: DirectMessage) => Promise, + resetAllMessages: () => Promise, + addSender: (user: PrimalUser) => void, + getNextConversationPage: () => void, + addUserReference: (user: PrimalUser) => void, + } +} + +export const initialData = { + messageCount: 0, + messageCountPerSender: {}, + senders: {}, + selectedSender: null, + encryptedMessages: [], + messages: [], + conversation: [], + isConversationLoaded: false, + referecedUsers: {}, + referecedNotes: {}, + now: Math.floor(new Date().getTime() / 1000), + senderRelation: 'follows' as UserRelation, + addSender: undefined, + referencePage: { + messages: [], + users: {}, + postStats: {}, + mentions: {}, + noteActions: {}, + }, +}; + + +export const MessagesContext = createContext(); + +export const MessagesProvider = (props: { children: ContextChildren }) => { + + const account = useAccountContext(); + + const subidMsgCount = `msg_stats_${APP_ID}`; + const subidMsgCountPerSender = `msg_count_p_s_ ${APP_ID}`; + const subidResetMsgCount = `msg_reset_ ${APP_ID}`; + const subidResetMsgCounts = `msg_mark_as_read_${APP_ID}`; + const subidCoversation = `msg_conv_ ${APP_ID}`; + const subidCoversationNextPage = `msg_conv_np_ ${APP_ID}`; + const subidNewMsg = `msg_new_ ${APP_ID}`; + const subidNoteRef = `msg_note_ ${APP_ID}`; + const subidUserRef = `msg_user_ ${APP_ID}`; + + + const getNostr = () => { + const win = window as NostrWindow; + return win.nostr; + } + +// ACTIONS -------------------------------------- + + const changeSenderRelation = (relation: UserRelation) => { + updateStore('senderRelation', () => relation); + // @ts-ignore + updateStore('senders', () => undefined ); + updateStore('senders', () => ({})); + getMessagesPerSender(true); + }; + + const subToMessagesStats = () => { + if (!account?.hasPublicKey()) { + return; + } + + // @ts-ignore + subscribeToMessagesStats(account?.publicKey, subidMsgCount); + } + + const getMessagesPerSender = (changeSender?: boolean) => { + if (account?.isKeyLookupDone && account.hasPublicKey()) { + changeSender && updateStore('selectedSender', () => null); + // @ts-ignore + getMessageCounts(account.publicKey, store.senderRelation, subidMsgCountPerSender); + } + }; + + const selectSender = async (senderId: string | undefined) => { + if (!senderId) { + return; + } + + let pubkey = senderId; + + if (senderId.startsWith('npub') || senderId.startsWith('nevent')) { + const decoded = nip19.decode(senderId); + + if (decoded.type === 'npub') { + pubkey = decoded.data; + } + + if (decoded.type === 'nevent') { + pubkey = decoded.data.id; + } + } + + if (!store.senders) { + return; + } + + const sender = store.senders[pubkey]; + + if (!sender) { + findMissingUser(pubkey); + return; + } + + await resetMessageCount(sender.pubkey, subidResetMsgCount); + + updateStore('selectedSender', () => null); + updateStore('selectedSender', () => ({ ...sender })); + }; + + const findMissingUser = (pubkey: string) => { + const subid = `msg_unk_${APP_ID}`; + let user: PrimalUser | undefined; + + const unsub = subscribeTo(subid, (type, subId, content) => { + + if (type === 'EVENT') { + if (content?.kind === Kind.Metadata) { + user = convertToUser(content); + } + } + + if (type === 'EOSE') { + user && addSender(user); + unsub(); + } + }); + + getUserProfiles([pubkey], subid); + }; + + const resetAllMessages = async () => { + markAllAsRead(subidResetMsgCounts); + }; + + const getConversationWithSender = (sender: PrimalUser | null, until = 0) => { + if (!account?.isKeyLookupDone || !account.hasPublicKey() || !sender) { + return; + } + resetConversationLoaded(); + // @ts-ignore + getOldMessages(account.publicKey, sender.pubkey, subidCoversation, until); + }; + + const getNextConversationPage = () => { + if ( + !account?.isKeyLookupDone || + !account.hasPublicKey() || + !store.selectedSender + ) { + return; + + } + const lastMessage = store.messages[store.messages.length - 1] || { created_at: 0}; + + updateStore('encryptedMessages', () => []); + + // @ts-ignore + lastMessage.created_at > 0 && getOldMessages(account.publicKey, store.selectedSender.pubkey, subidCoversationNextPage, lastMessage.created_at); + }; + + const decryptMessages = async (then: (messages: DirectMessage[]) => void) => { + const nostr = getNostr(); + + if (nostr === undefined || store.selectedSender === null) { + return; + } + + let newMessages: DirectMessage[] = []; + + for (let i = 0; i < store.encryptedMessages.length; i++) { + const eMsg = store.encryptedMessages[i]; + + if (!store.messages.find(m => eMsg.id === m.id) && store.selectedSender) { + try { + const content = await nostr.nip04.decrypt(store.selectedSender.pubkey, eMsg.content); + + const msg: DirectMessage = { + sender: eMsg.pubkey, + content: sanitize(content), + created_at: eMsg.created_at, + id: eMsg.id, + }; + + newMessages.push(msg); + } catch (e) { + console.warn('Falied to decrypt message: ', e); + } + } + } + + updateStore('messages', (conv) => [ ...conv, ...newMessages ]); + resetMessageCount(store.selectedSender.pubkey, subidResetMsgCount); + updateStore('messageCountPerSender', store.selectedSender.pubkey, 'cnt', 0) + + parseForMentions(newMessages); + then(newMessages); + // areNewMessages ? addToConversation(newMessages, true) : generateConversation(newMessages); + }; + + const parseForMentions = (messages: DirectMessage[]) => { + const noteRegex = /\bnostr:((note|nevent)1\w+)\b|#\[(\d+)\]/g; + const userRegex = /\bnostr:((npub|nprofile)1\w+)\b|#\[(\d+)\]/g; + + let noteRefs = []; + let userRefs = []; + let match; + + for (let i=0; i { + const decoded = nip19.decode(x); + + if (decoded.type === 'npub') { + return decoded.data; + } + + if (decoded.type === 'nprofile') { + return decoded.data.pubkey; + } + + return ''; + + }); + const noteIds = noteRefs.map(x => { + const decoded = nip19.decode(x); + + if (decoded.type === 'note') { + return decoded.data; + } + + if (decoded.type === 'nevent') { + return decoded.data.id; + } + + return ''; + + }); + + updateStore('referencePage', () => ({ + messages: [], + users: {}, + postStats: {}, + mentions: {}, + noteActions: {}, + })); + + getUserProfiles(pubkeys, subidUserRef); + getEvents(account?.publicKey, noteIds, subidNoteRef, true); + + + }; + + const prependToConversation = (messages: DirectMessage[]) => { + let firstThread = store.conversation[store.conversation.length - 1]; + + for (let i=0;i [...msgs, message] + ); + } + else { + firstThread = { + author: message.sender, + messages: [message], + } + + updateStore('conversation', (conv) => [...conv, { ...firstThread }]); + } + + // updateStore('isConversationLoaded', () => true); + updateMessageTimings(); + + }; + + }; + + const addToConversation = (messages: DirectMessage[], ignoreMy?: boolean) => { + let lastThread = store.conversation[0]; + + for (let i=0;i [message, ...msgs] + ); + } + else { + lastThread = { + author: message.sender, + messages: [message], + } + + updateStore('conversation', (conv) => [{ ...lastThread }, ...conv]); + } + + updateStore('isConversationLoaded', () => true); + updateMessageTimings(); + + }; + }; + + const generateConversation = (messages: DirectMessage[]) => { + + let author: string | undefined; + let thread: DirectMessageThread = { author: '', messages: [] }; + let conversation: any[] = []; + + for (let i=0;i 0 && Math.abs(thread.messages[thread.messages.length - 1].created_at - message.created_at) > 900 + )) { + author = message.sender; + thread.messages.length > 0 && conversation.push(thread); + thread = { author, messages: []}; + } + + thread.messages.push(message); + + }; + + thread.messages.length > 0 && conversation.push(thread); + + updateStore('conversation', (conv) => [...conv, ...conversation]); + updateStore('isConversationLoaded', () => true); + }; + + const resetConversationLoaded = () => { + updateStore('isConversationLoaded', () => false); + } + + const updateRefUsers = () => { + const refs = store.referencePage.users; + + const users = Object.keys(refs).reduce((acc, id) => { + const user = convertToUser(refs[id]); + return {...acc, [user.pubkey]: { ...user }}; + }, {}); + + updateStore('referecedUsers', (usrs) => ({ ...usrs, ...users })); + }; + + const updateRefNotes = () => { + const refs = convertToNotes(store.referencePage) || []; + + const notes = refs.reduce((acc, note) => { + return { ...acc, [note.post.noteId]: note }; + }, {}); + + updateStore('referecedNotes', (nts) => ({ ...nts, ...notes })); + }; + + const sendMessage = async (receiver: PrimalUser, message: DirectMessage) => { + const nostr = getNostr(); + if (!account || !nostr) { + return false; + } + + const content = await nostr.nip04.encrypt(receiver.pubkey, message.content); + + const event = { + content, + kind: Kind.EncryptedDirectMessage, + tags: [['p', receiver.pubkey]], + created_at: Math.floor((new Date).getTime() / 1000), + }; + + const success = await sendEvent(event, account?.relays); + + if (success) { + const msg = { ...message, content: sanitize(message.content) }; + addToConversation([msg]); + updateStore('messageCountPerSender', receiver.pubkey, 'latest_at', message.created_at); + } + + return success; + } + + const addNewSender = (user: PrimalUser) => { + if (!store.senders[user.pubkey]) { + updateStore('senders', () => ({ [user.pubkey]: {...user }})); + updateStore('messageCountPerSender', user.pubkey, () => ({ cnt: 0 })); + } + + selectSender(user.npub); + }; + + const addSender = (user: PrimalUser) => { + const isFollowing = account?.following.includes(user.pubkey); + + if (isFollowing && store.senderRelation === 'follows' || + !isFollowing && store.senderRelation === 'other' + ) { + addNewSender(user); + return; + } + + updateStore('addSender', () => ({ ...user })); + + changeSenderRelation(isFollowing ? 'follows' : 'other'); + } + + const addUserReference = (user: PrimalUser) => { + updateStore('referecedUsers', () => ({ [user.pubkey]: {...user} })); + }; + + +// SOCKET HANDLERS ------------------------------ + + const onMessage = (event: MessageEvent) => { + const message: NostrEvent | NostrEOSE = JSON.parse(event.data); + + const [type, subId, content] = message; + + if (subId === subidMsgCount) { + if (content?.kind === Kind.MessageStats) { + const count = parseInt(content.cnt); + + if (count !== store.messageCount) { + updateStore('messageCount', () => count); + } + + } + } + + if (subId === subidMsgCountPerSender) { + if (type === 'EVENT') { + if (content?.kind === Kind.MesagePerSenderStats) { + const senderCount = JSON.parse(content.content); + + updateStore('messageCountPerSender', () => ({ ...senderCount })); + updateMessageTimings(); + } + + if (content?.kind === Kind.Metadata) { + if (store.senders[content.pubkey]) { + return; + } + + const isFollowing = account?.following.includes(content.pubkey); + + if (isFollowing && store.senderRelation !== 'follows' || + !isFollowing && store.senderRelation !== 'other' + ) { + return; + } + + const user = convertToUser(content); + + updateStore('senders', () => ({ [user.pubkey]: { ...user } })); + } + } + + if (type === 'EOSE') { + if (store.addSender !== undefined) { + const key = store.addSender.pubkey; + const user = { ...store.addSender } + + updateStore('senders', () => ({ [key]: user })); + updateStore('messageCountPerSender', user.pubkey, () => ({ cnt: 0 })); + selectSender(store.addSender.pubkey); + updateStore('addSender', () => undefined); + return; + } + + const senderIds = Object.keys(store.senders); + if (!store.selectedSender) { + selectSender(senderIds[0]); + } + // !store.selectedSender && updateStore('selectedSender', () => ({ ...store.senders[senderIds[0]] })); + } + } + + if (subId === subidCoversation || subId === subidCoversationNextPage) { + if (type === 'EVENT') { + if (content?.kind === Kind.EncryptedDirectMessage) { + updateStore('encryptedMessages', (conv) => [ ...conv, {...content}]); + } + } + + if (type === 'EOSE') { + if (subId === subidCoversation) { + decryptMessages(generateConversation); + return; + } + + if (subId === subidCoversationNextPage) { + decryptMessages(prependToConversation); + return; + } + } + } + + if (subId === subidNewMsg) { + if (type === 'EVENT') { + if (content?.kind === Kind.EncryptedDirectMessage) { + updateStore('encryptedMessages', (conv) => [ ...conv, {...content}]); + } + } + + if (type === 'EOSE') { + decryptMessages((msgs) => addToConversation(msgs, true)); + } + } + + if (subId === subidUserRef) { + if (type === 'EVENT') { + if (content?.kind === Kind.Metadata) { + const user = content as NostrUserContent; + + updateStore('referencePage', 'users', + (usrs) => ({ ...usrs, [user.pubkey]: { ...user } }) + ); + } + } + + if (type === 'EOSE') { + updateRefUsers(); + } + } + + if (subId === subidNoteRef) { + if (type === 'EVENT') { + if (content?.kind === Kind.Metadata) { + const user = content as NostrUserContent; + + updateStore('referencePage', 'users', + (usrs) => ({ ...usrs, [user.pubkey]: { ...user } }) + ); + } + + if ([Kind.Text, Kind.Repost].includes(content.kind)) { + const message = content as NostrNoteContent; + + updateStore('referencePage', 'messages', + (msgs) => [ ...msgs, { ...message }] + ); + + return; + } + + if (content.kind === Kind.NoteStats) { + const statistic = content as NostrStatsContent; + const stat = JSON.parse(statistic.content); + + updateStore('referencePage', 'postStats', + (stats) => ({ ...stats, [stat.event_id]: { ...stat } }) + ); + return; + } + + if (content.kind === Kind.Mentions) { + const mentionContent = content as NostrMentionContent; + const mention = JSON.parse(mentionContent.content); + + updateStore('referencePage', 'mentions', + (mentions) => ({ ...mentions, [mention.id]: { ...mention } }) + ); + return; + } + + if (content.kind === Kind.NoteActions) { + const noteActionContent = content as NostrNoteActionsContent; + const noteActions = JSON.parse(noteActionContent.content) as NoteActions; + + updateStore('referencePage', 'noteActions', + (actions) => ({ ...actions, [noteActions.event_id]: { ...noteActions } }) + ); + return; + } + } + + if (type === 'EOSE') { + updateRefNotes(); + updateRefUsers(); + } + } + }; + + const onSocketClose = (closeEvent: CloseEvent) => { + const webSocket = closeEvent.target as WebSocket; + + removeSocketListeners( + webSocket, + { message: onMessage, close: onSocketClose }, + ); + }; + +// EFFECTS -------------------------------------- + + createEffect(() => { + if (isConnected() && account?.isKeyLookupDone && account?.hasPublicKey()) { + subToMessagesStats(); + } + }); + + createEffect(() => { + if (isConnected()) { + refreshSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + } + }); + + onCleanup(() => { + removeSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + }); + + let conversationRefreshInterval = 0; + + const updateMessageTimings = () => { + updateStore('now', () => Math.floor((new Date()).getTime() / 1000)); + }; + + // When a sender is selected, get the first page of the conversation + createEffect(() => { + if (store.selectedSender) { + clearInterval(conversationRefreshInterval); + + updateStore('encryptedMessages', () => []); + updateStore('conversation', () => []); + updateStore('messages', () => []); + getConversationWithSender(store.selectedSender); + + conversationRefreshInterval = setInterval(() => { + updateMessageTimings(); + }, 60_000); + } + }); + + // when the total number of messages increases, check for new messages + createEffect(() => { + if ( + account?.hasPublicKey() && + store.selectedSender && + store.messageCountPerSender[store.selectedSender?.pubkey] && + store.messageCountPerSender[store.selectedSender.pubkey].cnt > 0 + ) { + + updateStore('encryptedMessages', () => []); + + let time = Math.floor((new Date()).getTime() / 1000); + + const lastThread = store.conversation[store.conversation.length - 1]; + + if (lastThread) { + const lastMessage = lastThread.messages[lastThread.messages.length - 1]; + + if (lastMessage) { + time = lastMessage.created_at + } + } + + getNewMessages( + // @ts-ignore + account?.publicKey, + store.selectedSender.pubkey, + subidNewMsg, + time, + ); + } + }); + + +// STORES --------------------------------------- + + + const [store, updateStore] = createStore({ + ...initialData, + actions: { + getMessagesPerSender, + selectSender, + addToConversation, + resetConversationLoaded, + sendMessage, + changeSenderRelation, + resetAllMessages, + addSender, + getNextConversationPage, + addUserReference, + }, + }); + +// RENDER --------------------------------------- + + return ( + + {props.children} + + ); +} + +export const useMessagesContext = () => useContext(MessagesContext); diff --git a/src/contexts/NotificationsContext.tsx b/src/contexts/NotificationsContext.tsx new file mode 100644 index 0000000..9d3a9fc --- /dev/null +++ b/src/contexts/NotificationsContext.tsx @@ -0,0 +1,131 @@ +import { createStore } from "solid-js/store"; +import { Kind } from "../constants"; +import { + createContext, + createEffect, + onCleanup, + useContext +} from "solid-js"; +import { + isConnected, + refreshSocketListeners, + removeSocketListeners, + socket +} from "../sockets"; +import { + ContextChildren, + NostrEOSE, + NostrEvent, +} from "../types/primal"; +import { APP_ID } from "../App"; +import { subscribeToNotificationStats } from "../lib/notifications"; +import { useAccountContext } from "./AccountContext"; + +export type NotificationsContextStore = { + notificationCount: number, + actions: { + } +} + +export const initialData = { + notificationCount: 0, +}; + + +export const NotificationsContext = createContext(); + +export const NotificationsProvider = (props: { children: ContextChildren }) => { + + const account = useAccountContext(); + + const subid = `notif_stats_${APP_ID}`; + +// ACTIONS -------------------------------------- + + const subToNotificationStats = () => { + if (!account?.hasPublicKey()) { + return; + } + + // @ts-ignore + subscribeToNotificationStats(account?.publicKey, subid); + } + +// SOCKET HANDLERS ------------------------------ + + const onMessage = (event: MessageEvent) => { + const message: NostrEvent | NostrEOSE = JSON.parse(event.data); + + const [type, subId, content] = message; + + if (subId === subid) { + if (content?.kind === Kind.NotificationStats) { + const sum = Object.keys(content).reduce((acc, key) => { + if (key === 'pubkey' || key == 'kind') { + return acc; + } + + // @ts-ignore + return acc + content[key]; + }, 0); + + if (sum !== store.notificationCount) { + updateStore('notificationCount', () => sum) + } + + } + } + }; + + const onSocketClose = (closeEvent: CloseEvent) => { + const webSocket = closeEvent.target as WebSocket; + + removeSocketListeners( + webSocket, + { message: onMessage, close: onSocketClose }, + ); + }; + +// EFFECTS -------------------------------------- + + createEffect(() => { + if (isConnected() && account?.hasPublicKey()) { + subToNotificationStats(); + } + }); + + createEffect(() => { + if (isConnected()) { + refreshSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + } + }); + + onCleanup(() => { + removeSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + }); + +// STORES --------------------------------------- + + + const [store, updateStore] = createStore({ + ...initialData, + actions: { + }, + }); + +// RENDER --------------------------------------- + + return ( + + {props.children} + + ); +} + +export const useNotificationsContext = () => useContext(NotificationsContext); diff --git a/src/contexts/ProfileContext.tsx b/src/contexts/ProfileContext.tsx new file mode 100644 index 0000000..89915f6 --- /dev/null +++ b/src/contexts/ProfileContext.tsx @@ -0,0 +1,441 @@ +import { nip19 } from "nostr-tools"; +import { createStore } from "solid-js/store"; +import { getEvents, getUserFeed } from "../lib/feed"; +import { convertToNotes, paginationPlan, parseEmptyReposts, sortByRecency, sortByScore } from "../stores/note"; +import { Kind } from "../constants"; +import { + createContext, + createEffect, + onCleanup, + useContext +} from "solid-js"; +import { + isConnected, + refreshSocketListeners, + removeSocketListeners, + socket +} from "../sockets"; +import { + ContextChildren, + FeedPage, + NostrEOSE, + NostrEvent, + NostrEventContent, + NostrMentionContent, + NostrNoteActionsContent, + NostrNoteContent, + NostrStatsContent, + NostrUserContent, + NoteActions, + PrimalNote, + PrimalUser, + VanityProfiles, +} from "../types/primal"; +import { APP_ID } from "../App"; +import { hexToNpub } from "../lib/keys"; +import { + getProfileContactList, + getProfileScoredNotes, + getUserProfileInfo, +} from "../lib/profile"; +import { useAccountContext } from "./AccountContext"; + +export type ProfileContextStore = { + profileKey: string | undefined, + userProfile: PrimalUser | undefined, + userStats: { + follows_count: number, + followers_count: number, + note_count: number, + time_joined: number, + }, + knownProfiles: VanityProfiles, + notes: PrimalNote[], + isFetching: boolean, + page: FeedPage, + reposts: Record | undefined, + lastNote: PrimalNote | undefined, + following: string[], + sidebar: FeedPage & { notes: PrimalNote[] }, + actions: { + saveNotes: (newNotes: PrimalNote[]) => void, + clearNotes: () => void, + fetchNotes: (noteId: string | undefined, until?: number) => void, + fetchNextPage: () => void, + updatePage: (content: NostrEventContent) => void, + savePage: (page: FeedPage) => void, + setProfileKey: (profileKey?: string) => void, + } +} + +export const emptyStats = { + follows_count: 0, + followers_count: 0, + note_count: 0, + time_joined: 0, +}; + +export const initialData = { + profileKey: undefined, + userProfile: undefined, + userStats: { ...emptyStats }, + knownProfiles: { names: {} }, + notes: [], + isFetching: false, + page: { messages: [], users: {}, postStats: {}, mentions: {}, noteActions: {} }, + reposts: {}, + lastNote: undefined, + following: [], + sidebar: { + messages: [], + users: {}, + postStats: {}, + notes: [], + noteActions: {}, + }, +}; + + +export const ProfileContext = createContext(); + +export const ProfileProvider = (props: { children: ContextChildren }) => { + + const account = useAccountContext(); + +// ACTIONS -------------------------------------- + + const saveNotes = (newNotes: PrimalNote[]) => { + updateStore('notes', (notes) => [ ...notes, ...newNotes ]); + updateStore('isFetching', () => false); + }; + + const fetchNotes = (pubkey: string | undefined, until = 0, limit = 20) => { + if (!pubkey) { + return; + } + + updateStore('isFetching', () => true); + updateStore('page', () => ({ messages: [], users: {}, postStats: {} })); + getUserFeed(account?.publicKey, pubkey, `profile_feed_${APP_ID}`, until, limit); + } + + const clearNotes = () => { + updateStore('page', () => ({ messages: [], users: {}, postStats: {}, noteActions: {} })); + updateStore('notes', () => []); + updateStore('reposts', () => undefined); + updateStore('lastNote', () => undefined); + updateStore('sidebar', () => ({ + messages: [], + users: {}, + postStats: {}, + notes: [], + noteActions: {}, + })); + }; + + const fetchNextPage = () => { + const lastNote = store.notes[store.notes.length - 1]; + + if (!lastNote) { + return; + } + + updateStore('lastNote', () => ({ ...lastNote })); + + const criteria = paginationPlan('latest'); + + const noteData: Record = lastNote.repost ? + lastNote.repost.note : + lastNote.post; + + const until = noteData[criteria]; + + if (until > 0 && store.profileKey) { + fetchNotes(store.profileKey, until); + } + }; + + const updatePage = (content: NostrEventContent) => { + if (content.kind === Kind.Metadata) { + const user = content as NostrUserContent; + + updateStore('page', 'users', () => ({ [user.pubkey]: user})); + return; + } + + if ([Kind.Text, Kind.Repost].includes(content.kind)) { + const message = content as NostrNoteContent; + const messageId = nip19.noteEncode(message.id); + + const isLastNote = message.kind === Kind.Text ? + store.lastNote?.post?.noteId === messageId : + store.lastNote?.repost?.note.noteId === messageId; + + if (!isLastNote) { + updateStore('page', 'messages', messages => [ ...messages, message]); + } + + return; + } + + if (content.kind === Kind.NoteStats) { + const statistic = content as NostrStatsContent; + const stat = JSON.parse(statistic.content); + + updateStore('page', 'postStats', () => ({ [stat.event_id]: stat })); + return; + } + + if (content.kind === Kind.Mentions) { + const mentionContent = content as NostrMentionContent; + const mention = JSON.parse(mentionContent.content); + + updateStore('page', 'mentions', () => ({ [mention.id]: mention })); + return; + } + + if (content.kind === Kind.NoteActions) { + const noteActionContent = content as NostrNoteActionsContent; + const noteActions = JSON.parse(noteActionContent.content) as NoteActions; + + updateStore('page', 'noteActions', () => ({ [noteActions.event_id]: noteActions })); + return; + } + }; + + const savePage = (page: FeedPage) => { + const newPosts = sortByRecency(convertToNotes(page)); + + saveNotes(newPosts); + }; + + + const updateSidebar = (content: NostrEventContent) => { + if (content.kind === Kind.Metadata) { + const user = content as NostrUserContent; + + updateStore('sidebar', 'users', () => ({ [user.pubkey]: user }) + ); + return; + } + + if ([Kind.Text, Kind.Repost].includes(content.kind)) { + const message = content as NostrNoteContent; + + if (store.lastNote?.post?.noteId !== nip19.noteEncode(message.id)) { + updateStore('sidebar', 'messages', (msgs) => [ ...msgs, message ]); + } + + return; + } + + if (content.kind === Kind.NoteStats) { + const statistic = content as NostrStatsContent; + const stat = JSON.parse(statistic.content); + + updateStore('sidebar', 'postStats', () => ({ [stat.event_id]: stat })); + return; + } + + if (content.kind === Kind.Mentions) { + const mentionContent = content as NostrMentionContent; + const mention = JSON.parse(mentionContent.content); + + updateStore('page', 'mentions', () => ({ [mention.id]: mention })); + return; + } + + if (content.kind === Kind.NoteActions) { + const noteActionContent = content as NostrNoteActionsContent; + const noteActions = JSON.parse(noteActionContent.content) as NoteActions; + + updateStore('page', 'noteActions', () => ({ [noteActions.event_id]: noteActions })); + return; + } + }; + + const saveSidebar = (page: FeedPage) => { + const newPosts = sortByScore(convertToNotes(page)); + + updateStore('sidebar', 'notes', () => [ ...newPosts ]); + }; + + const setProfileKey = (profileKey?: string) => { + updateStore('profileKey', () => profileKey); + + if (profileKey) { + updateStore('userProfile', () => undefined); + updateStore('userStats', () => ({ ...emptyStats })); + getUserProfileInfo(profileKey, `profile_info_${APP_ID}`); + getProfileContactList(profileKey, `profile_contacts_${APP_ID}`); + getProfileScoredNotes(profileKey, `profile_scored_${APP_ID}`, 10); + } + } + +// SOCKET HANDLERS ------------------------------ + + const onMessage = (event: MessageEvent) => { + const message: NostrEvent | NostrEOSE = JSON.parse(event.data); + + const [type, subId, content] = message; + + if (subId === `profile_feed_${APP_ID}`) { + if (type === 'EOSE') { + const reposts = parseEmptyReposts(store.page); + const ids = Object.keys(reposts); + + if (ids.length === 0) { + savePage(store.page); + return; + } + + updateStore('reposts', () => reposts); + + getEvents(account?.publicKey, ids, `profile_reposts_${APP_ID}`); + return; + } + + if (type === 'EVENT') { + updatePage(content); + return; + } + } + + if (subId === `profile_info_${APP_ID}`) { + + if (content?.kind === Kind.Metadata) { + let user = JSON.parse(content.content); + + if (!user.displayName || typeof user.displayName === 'string' && user.displayName.trim().length === 0) { + user.displayName = user.display_name; + } + user.pubkey = content.pubkey; + user.npub = hexToNpub(content.pubkey); + user.created_at = content.created_at; + + updateStore('userProfile', () => user); + return; + } + + if (content?.kind === Kind.UserStats) { + const stats = JSON.parse(content.content); + + updateStore('userStats', () => ({ ...stats })); + return; + } + } + + if (subId === `profile_reposts_${APP_ID}`) { + if (type === 'EOSE') { + savePage(store.page); + return; + } + + if (type === 'EVENT') { + const repostId = (content as NostrNoteContent).id; + const reposts = store.reposts || {}; + const parent = store.page.messages.find(m => m.id === reposts[repostId]); + + if (parent) { + updateStore('page', 'messages', (msg) => msg.id === parent.id, 'content', () => JSON.stringify(content)); + } + + return; + } + } + + // if (subId === `profile_oldest_${APP_ID}`) { + // if (content?.kind === Kind.OldestEvent) { + // const timestamp = Number.parseInt(content.content); + // if (isNaN(timestamp)) { + // updateStore('oldestNoteDate', () => undefined); + // return; + // } + // updateStore('oldestNoteDate', () => timestamp); + // } + // return; + // } + + if (subId === `profile_contacts_${APP_ID}`) { + if (content && content.kind === Kind.Contacts) { + const tags = content.tags; + let contacts: string[] = []; + + for (let i = 0;i contacts); + } + return; + } + + if (subId === `profile_scored_${APP_ID}`) { + if (type === 'EOSE') { + saveSidebar(store.sidebar); + return; + } + + if (type === 'EVENT') { + updateSidebar(content); + return; + } + } + }; + + const onSocketClose = (closeEvent: CloseEvent) => { + const webSocket = closeEvent.target as WebSocket; + + removeSocketListeners( + webSocket, + { message: onMessage, close: onSocketClose }, + ); + }; + +// EFFECTS -------------------------------------- + + createEffect(() => { + if (isConnected()) { + refreshSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + } + }); + + onCleanup(() => { + removeSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + }); + +// STORES --------------------------------------- + + + const [store, updateStore] = createStore({ + ...initialData, + actions: { + saveNotes, + clearNotes, + fetchNotes, + fetchNextPage, + updatePage, + savePage, + setProfileKey, + }, + }); + +// RENDER --------------------------------------- + + return ( + + {props.children} + + ); +} + +export const useProfileContext = () => useContext(ProfileContext); diff --git a/src/contexts/SearchContext.tsx b/src/contexts/SearchContext.tsx new file mode 100644 index 0000000..c30a04e --- /dev/null +++ b/src/contexts/SearchContext.tsx @@ -0,0 +1,413 @@ +import { createStore } from "solid-js/store"; +import { + createContext, + JSX, + useContext +} from "solid-js"; +import { + FeedPage, + NostrEventContent, + NostrMentionContent, + NostrNoteActionsContent, + NostrNoteContent, + NostrStatsContent, + NostrUserContent, + NoteActions, + PrimalNote, + PrimalUser, +} from '../types/primal'; +import { Kind } from "../constants"; +import { APP_ID } from "../App"; +import { getUserProfiles } from "../lib/profile"; +import { searchContent, searchUsers } from "../lib/search"; +import { convertToUser } from "../stores/profile"; +import { sortByRecency, convertToNotes } from "../stores/note"; +import { subscribeTo } from "../sockets"; +import { nip19 } from "nostr-tools"; + +const recomendedUsers = [ + '82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2', // jack + 'bf2376e17ba4ec269d10fcc996a4746b451152be9031fa48e74553dde5526bce', // carla + 'c48e29f04b482cc01ca1f9ef8c86ef8318c059e0e9353235162f080f26e14c11', // walker + '85080d3bad70ccdcd7f74c29a44f55bb85cbcd3dd0cbb957da1d215bdb931204', // preston + 'eab0e756d32b80bcd464f3d844b8040303075a13eabc3599a762c9ac7ab91f4f', // lyn + '04c915daefee38317fa734444acee390a8269fe5810b2241e5e6dd343dfbecc9', // odell + '472f440f29ef996e92a186b8d320ff180c855903882e59d50de1b8bd5669301e', // marty + 'e88a691e98d9987c964521dff60025f60700378a4879180dcbbb4a5027850411', // nvk + '91c9a5e1a9744114c6fe2d61ae4de82629eaaa0fb52f48288093c7e7e036f832', // rockstar + 'fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52', // pablo +]; + +export type SearchContextStore = { + contentQuery: string, + users: PrimalUser[], + scores: Record, + contentUsers: PrimalUser[], + contentScores: Record, + notes: PrimalNote[], + isFetchingUsers: boolean, + isFetchingContent: boolean, + page: FeedPage, + reposts: Record | undefined, + mentionedNotes: Record, + actions: { + findUsers: (query: string, pubkey?: string) => void, + findUserByNupub: (npub: string) => void, + findContentUsers: (query: string, pubkey?: string) => void, + findContent: (query: string) => void, + setContentQuery: (query: string) => void, + getRecomendedUsers: () => void, + }, +} + +const initialData = { + contentQuery: '', + users: [], + scores: {}, + contentUsers: [], + contentScores: {}, + notes: [], + isFetchingUsers: false, + isFetchingContent: false, + page: { messages: [], users: {}, postStats: {}, mentions: {}, noteActions: {} }, + reposts: {}, + mentionedNotes: {}, +}; + +export const SearchContext = createContext(); + +export function SearchProvider(props: { children: number | boolean | Node | JSX.ArrayElement | JSX.FunctionElement | (string & {}) | null | undefined; }) { + +// ACTIONS -------------------------------------- + + const findUserByNupub = (npub: string) => { + const subId = `find_npub_${APP_ID}`; + + let decoded: nip19.DecodeResult | undefined; + + try { + decoded = nip19.decode(npub); + } catch (e) { + findUsers(npub); + return; + } + + if (!decoded) { + findUsers(npub); + return; + } + + const hex = typeof decoded.data === 'string' ? + decoded.data : + (decoded.data as nip19.ProfilePointer).pubkey; + + let users: PrimalUser[] = []; + + const unsub = subscribeTo(subId, (type, _, content) => { + if (type === 'EVENT') { + if (!content) { + return; + } + + if (content.kind === Kind.Metadata) { + const user = content as NostrUserContent; + + users.push(convertToUser(user)); + return; + } + + if (content.kind === Kind.UserScore) { + const scores = JSON.parse(content.content); + + updateStore('scores', () => ({ ...scores })); + return; + } + } + + if (type === 'EOSE') { + + if (users.length > 0) { + updateStore('users', () => [users[0]]); + } + + updateStore('isFetchingUsers', () => false); + + unsub(); + return; + } + }); + + getUserProfiles([hex], subId); + }; + + const getRecomendedUsers = () => { + const subid = `recomended_users_${APP_ID}`; + + let users: PrimalUser[] = []; + + const unsub = subscribeTo(subid, (type, _, content) => { + if (type === 'EVENT') { + if (!content) { + return; + } + + if (content.kind === Kind.Metadata) { + const user = content as NostrUserContent; + + users.push(convertToUser(user)); + return; + } + + if (content.kind === Kind.UserScore) { + const scores = JSON.parse(content.content); + + updateStore('scores', () => ({ ...scores })); + return; + } + } + + if (type === 'EOSE') { + + let sorted: PrimalUser[] = []; + + users.forEach((user) => { + const index = recomendedUsers.indexOf(user.pubkey); + sorted[index] = { ...user }; + }); + + updateStore('users', () => sorted); + updateStore('isFetchingUsers', () => false); + + unsub(); + return; + } + }); + + + updateStore('isFetchingUsers', () => true); + getUserProfiles(recomendedUsers, subid); + + }; + + const findUsers = (query: string, publicKey?: string) => { + const subid = `search_users_${APP_ID}`; + + let users: PrimalUser[] = []; + + const unsub = subscribeTo(subid, (type, _, content) => { + if (type === 'EVENT') { + if (!content) { + return; + } + + if (content.kind === Kind.Metadata) { + const user = content as NostrUserContent; + + users.push(convertToUser(user)); + return; + } + + if (content.kind === Kind.UserScore) { + const scores = JSON.parse(content.content); + + updateStore('scores', () => ({ ...scores })); + return; + } + } + + if (type === 'EOSE') { + const sorted = users.sort((a, b) => { + const aScore = store.scores[a.pubkey]; + const bScore = store.scores[b.pubkey]; + + return bScore - aScore; + }); + + updateStore('users', () => sorted.slice(0, 10)); + updateStore('isFetchingUsers', () => false); + + unsub(); + return; + } + + }); + + const pubkey = query.length > 0 ? undefined : publicKey; + + updateStore('isFetchingUsers', () => true); + searchUsers(pubkey, subid, query); + } + + const findContentUsers = (query: string, publicKey?: string) => { + const subid = `search_users_c_${APP_ID}`; + + let users: PrimalUser[] = []; + + const unsub = subscribeTo(subid, (type, _, content) => { + if (type === 'EVENT') { + if (!content) { + return; + } + + if (content.kind === Kind.Metadata) { + const user = content as NostrUserContent; + + users.push(convertToUser(user)); + return; + } + + if (content.kind === Kind.UserScore) { + const scores = JSON.parse(content.content); + + updateStore('contentScores', () => ({ ...scores })); + return; + } + } + + if (type === 'EOSE') { + const sorted = users.sort((a, b) => { + const aScore = store.scores[a.pubkey]; + const bScore = store.scores[b.pubkey]; + + return bScore - aScore; + }); + + updateStore('contentUsers', () => sorted.slice(0, 10)); + + unsub(); + return; + } + + }); + + const pubkey = query.length > 0 ? undefined : publicKey; + + updateStore('isFetchingUsers', () => true); + searchUsers(pubkey, subid, query); + } + + const saveNotes = (newNotes: PrimalNote[]) => { + updateStore('notes', () => [ ...newNotes ]); + updateStore('isFetchingContent', () => false); + }; + + + const updatePage = (content: NostrEventContent) => { + if (content.kind === Kind.Metadata) { + const user = content as NostrUserContent; + + updateStore('page', 'users', + (usrs) => ({ ...usrs, [user.pubkey]: { ...user } }) + ); + return; + } + + if ([Kind.Text, Kind.Repost].includes(content.kind)) { + const message = content as NostrNoteContent; + + updateStore('page', 'messages', + (msgs) => [ ...msgs, { ...message }] + ); + + return; + } + + if (content.kind === Kind.NoteStats) { + const statistic = content as NostrStatsContent; + const stat = JSON.parse(statistic.content); + + updateStore('page', 'postStats', + (stats) => ({ ...stats, [stat.event_id]: { ...stat } }) + ); + return; + } + + if (content.kind === Kind.Mentions) { + const mentionContent = content as NostrMentionContent; + const mention = JSON.parse(mentionContent.content); + + updateStore('page', 'mentions', + (mentions) => ({ ...mentions, [mention.id]: { ...mention } }) + ); + return; + } + + if (content.kind === Kind.NoteActions) { + const noteActionContent = content as NostrNoteActionsContent; + const noteActions = JSON.parse(noteActionContent.content) as NoteActions; + + updateStore('page', 'noteActions', + (actions) => ({ ...actions, [noteActions.event_id]: { ...noteActions } }) + ); + return; + } + }; + + const savePage = (page: FeedPage) => { + const newPosts = sortByRecency(convertToNotes(page)); + + saveNotes(newPosts); + }; + + const findContent = (query: string) => { + const subid = `search_content_${APP_ID}`; + + const unsub = subscribeTo(subid, (type, _, content) => { + + if (type === 'EOSE') { + savePage(store.page); + unsub(); + return; + } + + if (!content) { + return; + } + + + if (type === 'EVENT') { + updatePage(content); + return; + } + + }); + + updateStore('isFetchingContent', () => true); + updateStore('notes', () => []); + updateStore('page', { messages: [], users: {}, postStats: {}, mentions: {}, noteActions: {} }) + searchContent(subid, query); + } + + const setContentQuery = (query: string) => { + updateStore('contentQuery', () => query); + }; + + + +// EFFECTS -------------------------------------- + +// SOCKET HANDLERS ------------------------------ + + +// STORES --------------------------------------- + +const [store, updateStore] = createStore({ + ...initialData, + actions: { + findUsers, + findUserByNupub, + findContent, + findContentUsers, + setContentQuery, + getRecomendedUsers, + }, +}); + + return ( + + {props.children} + + ); +} + +export function useSearchContext() { return useContext(SearchContext); } diff --git a/src/contexts/SettingsContext.tsx b/src/contexts/SettingsContext.tsx new file mode 100644 index 0000000..3ac3c3d --- /dev/null +++ b/src/contexts/SettingsContext.tsx @@ -0,0 +1,444 @@ +import { createStore } from "solid-js/store"; +import { useToastContext } from "../components/Toaster/Toaster"; +import { defaultFeeds, noKey, defaultNotificationSettings, themes, trendingFeed } from "../constants"; +import { + createContext, + createEffect, + onCleanup, + onMount, + useContext +} from "solid-js"; +import { + isConnected, + refreshSocketListeners, + removeSocketListeners, + socket, + subscribeTo +} from "../sockets"; +import { + ContextChildren, + PrimalFeed, + PrimalTheme, +} from "../types/primal"; +import { + initAvailableFeeds, + removeFromAvailableFeeds, + replaceAvailableFeeds, + updateAvailableFeeds, + updateAvailableFeedsTop +} from "../lib/availableFeeds"; +import { useAccountContext } from "./AccountContext"; +import { saveTheme } from "../lib/localStore"; +import { getDefaultSettings, getSettings, sendSettings } from "../lib/settings"; +import { APP_ID } from "../App"; +import { useIntl } from "@cookbook/solid-intl"; +import { hexToNpub } from "../lib/keys"; + +export type SettingsContextStore = { + locale: string, + theme: string, + themes: PrimalTheme[], + availableFeeds: PrimalFeed[], + defaultFeed: PrimalFeed, + defaultZapAmount: number, + availableZapOptions: number[], + notificationSettings: Record, + actions: { + setTheme: (theme: PrimalTheme | null) => void, + addAvailableFeed: (feed: PrimalFeed, addToTop?: boolean) => void, + removeAvailableFeed: (feed: PrimalFeed) => void, + setAvailableFeeds: (feedList: PrimalFeed[]) => void, + moveAvailableFeed: (fromIndex: number, toIndex: number) => void, + renameAvailableFeed: (feed: PrimalFeed, newName: string) => void, + saveSettings: () => void, + loadSettings: (pubkey: string) => void, + setDefaultZapAmount: (amount: number) => void, + setZapOptions: (amount:number, index: number) => void, + updateNotificationSettings: (key: string, value: boolean, temp?: boolean) => void, + } +} + +export const initialData = { + locale: 'en-us', + theme: 'sunset', + themes, + availableFeeds: [], + defaultFeed: defaultFeeds[0], + defaultZapAmount: 10, + availableZapOptions: [ + 21, + 420, + 10_000, + 69_420, + 100_000, + 1_000_000, + ], + notificationSettings: { ...defaultNotificationSettings }, +}; + + +export const SettingsContext = createContext(); + +export const SettingsProvider = (props: { children: ContextChildren }) => { + + const toaster = useToastContext(); + const account = useAccountContext(); + const intl = useIntl(); + +// ACTIONS -------------------------------------- + + const setDefaultZapAmount = (amount: number, temp?: boolean) => { + updateStore('defaultZapAmount', () => amount); + !temp && saveSettings(); + }; + + const setZapOptions = (amount: number, index: number, temp?: boolean) => { + updateStore('availableZapOptions', index, () => amount); + !temp && saveSettings(); + }; + + const setTheme = (theme: PrimalTheme | null, temp?: boolean) => { + if (!theme) { + return; + } + + saveTheme(account?.publicKey, theme.name); + updateStore('theme', () => theme.name); + !temp && saveSettings(); + } + + const setThemeByName = (name: string | null, temp?: boolean) => { + if (!name) { + return; + } + + const availableTheme = store.themes.find(t => t.name === name); + availableTheme && setTheme(availableTheme, temp); + } + + const addAvailableFeed = (feed: PrimalFeed, addToTop = false, temp?: boolean) => { + if (!feed) { + return; + } + if (account?.hasPublicKey()) { + const add = addToTop ? updateAvailableFeedsTop : updateAvailableFeeds; + + updateStore('availableFeeds', (feeds) => add(account?.publicKey, feed, feeds)); + !temp && saveSettings(); + } + }; + + const removeAvailableFeed = (feed: PrimalFeed, temp?: boolean) => { + if (!feed) { + return; + } + + if (account?.hasPublicKey()) { + updateStore('availableFeeds', + (feeds) => removeFromAvailableFeeds(account?.publicKey, feed, feeds), + ); + + !temp && saveSettings(); + toaster?.sendSuccess(`"${feed.name}" has been removed from your home page`); + } + }; + + const setAvailableFeeds = (feedList: PrimalFeed[], temp?: boolean) => { + if (account?.hasPublicKey()) { + updateStore('availableFeeds', + () => replaceAvailableFeeds(account?.publicKey, feedList), + ); + !temp && saveSettings(); + } + }; + + const moveAvailableFeed = (fromIndex: number, toIndex: number) => { + + let list = [...store.availableFeeds]; + + list.splice(toIndex, 0, list.splice(fromIndex, 1)[0]); + + setAvailableFeeds(list); + + }; + + const renameAvailableFeed = (feed: PrimalFeed, newName: string) => { + const list = store.availableFeeds.map(af => { + return af.hex === feed.hex ? { ...af, name: newName } : { ...af }; + }); + setAvailableFeeds(list); + }; + + const updateNotificationSettings = (key: string, value: boolean, temp?: boolean) => { + updateStore('notificationSettings', () => ({ [key]: value })); + + !temp && saveSettings(); + }; + + const saveSettings = () => { + const settings = { + theme: store.theme, + feeds: store.availableFeeds, + defaultZapAmount: store.defaultZapAmount, + zapOptions: store.availableZapOptions, + notifications: store.notificationSettings, + }; + + const subid = `save_settings_${APP_ID}`; + + const unsub = subscribeTo(subid, async (type, subId, content) => { + if (type === 'NOTICE') { + toaster?.sendWarning(intl.formatMessage({ + id: 'settings.saveFail', + defaultMessage: 'Failed to save settings', + description: 'Toast message after settings have failed to be saved on the server', + })); + } + + unsub(); + return; + }); + + sendSettings(settings, subid); + } + + const loadDefaults = () => { + + const subid = `load_defaults_${APP_ID}`; + + const unsub = subscribeTo(subid, async (type, subId, content) => { + + if (type === 'EVENT' && content?.content) { + try { + const settings = JSON.parse(content?.content); + + const feeds = settings.feeds as PrimalFeed[]; + const notificationSettings = settings.notifications as Record; + + // const availableTopics = store.availableFeeds.map(f => f.hex); + + // const updatedFeeds = feeds.reduce((acc, feed) => { + // return availableTopics.includes(feed.hex) ? + // acc : + // [ ...acc, feed ]; + // }, store.availableFeeds) + + updateStore('availableFeeds', + () => replaceAvailableFeeds(account?.publicKey, feeds), + ); + + updateStore('defaultFeed', () => store.availableFeeds[0]); + + updateStore('notificationSettings', () => ({ ...notificationSettings } || { ...defaultNotificationSettings })); + + const defaultZaps = settings.defaultZapAmount || 10; + + const zapOptions = settings.zapOptions || [ + 21, + 420, + 10_000, + 69_420, + 100_000, + 1_000_000, + ]; + + updateStore('defaultZapAmount', () => defaultZaps); + updateStore('availableZapOptions', () => zapOptions); + } + catch (e) { + console.log('Error parsing settings response: ', e); + } + } + + if (type === 'NOTICE') { + toaster?.sendWarning(intl.formatMessage({ + id: 'settings.loadFail', + defaultMessage: 'Failed to load settings. Will be using local settings.', + description: 'Toast message after settings have failed to be loaded from the server', + })); + } + + unsub(); + return; + }); + + getDefaultSettings(subid) + }; + + const loadSettings = (pubkey: string | undefined) => { + if (!pubkey || pubkey === noKey) { + return; + } + + const subid = `load_settings_${APP_ID}`; + + const unsub = subscribeTo(subid, async (type, subId, content) => { + + if (type === 'EVENT' && content?.content) { + try { + const { theme, feeds, defaultZapAmount, zapOptions, notifications } = JSON.parse(content?.content); + + theme && setThemeByName(theme, true); + feeds && setAvailableFeeds(feeds, true); + defaultZapAmount && setDefaultZapAmount(defaultZapAmount, true); + zapOptions && updateStore('availableZapOptions', () => zapOptions); + + if (notifications) { + updateStore('notificationSettings', () => ({ ...notifications })); + } + else { + updateStore('notificationSettings', () => ({ ...defaultNotificationSettings})); + } + } + catch (e) { + console.log('Error parsing settings response: ', e); + } + } + + if (type === 'NOTICE') { + toaster?.sendWarning(intl.formatMessage({ + id: 'settings.loadFail', + defaultMessage: 'Failed to load settings. Will be using local settings.', + description: 'Toast message after settings have failed to be loaded from the server', + })); + } + + updateStore('defaultFeed', () => store.availableFeeds[0]); + + unsub(); + return; + }); + + pubkey && getSettings(pubkey, subid); + } + +// SOCKET HANDLERS ------------------------------ + + const onMessage = (event: MessageEvent) => { + // const message: NostrEvent | NostrEOSE = JSON.parse(event.data); + + // const [type, subId, content] = message; + }; + + const onSocketClose = (closeEvent: CloseEvent) => { + const webSocket = closeEvent.target as WebSocket; + + removeSocketListeners( + webSocket, + { message: onMessage, close: onSocketClose }, + ); + }; + + +// EFFECTS -------------------------------------- + + onMount(() => { + // Set global theme, this is done to avoid changing the theme + // when waiting for pubkey (like when reloading a page). + const storedTheme = localStorage.getItem('theme'); + setThemeByName(storedTheme, true); + }); + + + // This is here as to not trigger the effect + // TODO Solve this. + const feedLabel = intl.formatMessage({ + id: 'feeds.latestFollowing', + defaultMessage: 'Latest, following', + description: 'Label for the `latest;following` (active user\'s) feed', + }); + + + // Initial setup for a user with a public key + createEffect(() => { + if (!account?.hasPublicKey() && account?.isKeyLookupDone) { + loadDefaults(); + return; + } + + const pubkey = account?.publicKey; + + const initFeeds = initAvailableFeeds(pubkey); + + if (initFeeds && initFeeds.length > 0) { + updateStore('defaultFeed', () => initFeeds[0]); + updateStore('availableFeeds', () => replaceAvailableFeeds(pubkey, initFeeds)); + } + + + const feed = { + name: feedLabel, + hex: pubkey, + npub: hexToNpub(pubkey), + }; + + // Add trendingFeed if it's missing + // @ts-ignore + if (initFeeds && !initFeeds.find((f) => f.hex === trendingFeed.hex)) { + addAvailableFeed(trendingFeed, true, true); + } + + // Add active user's feed if it's missing + // @ts-ignore + if (initFeeds && !initFeeds.find(f => f.hex === feed.hex)) { + addAvailableFeed(feed, true, true); + } + + + setTimeout(() => { + loadSettings(pubkey); + }, 100); + }); + + createEffect(() => { + const html: HTMLElement | null = document.querySelector('html'); + localStorage.setItem('theme', store.theme); + html?.setAttribute('data-theme', store.theme); + }); + + createEffect(() => { + if (isConnected()) { + refreshSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + } + }); + + onCleanup(() => { + removeSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + }); + +// STORES --------------------------------------- + + + const [store, updateStore] = createStore({ + ...initialData, + actions: { + setTheme, + addAvailableFeed, + removeAvailableFeed, + setAvailableFeeds, + moveAvailableFeed, + renameAvailableFeed, + saveSettings, + loadSettings, + setDefaultZapAmount, + setZapOptions, + updateNotificationSettings, + }, + }); + +// RENDER --------------------------------------- + + return ( + + {props.children} + + ); +} + +export const useSettingsContext = () => useContext(SettingsContext); diff --git a/src/contexts/ThreadContext.tsx b/src/contexts/ThreadContext.tsx new file mode 100644 index 0000000..3ef8069 --- /dev/null +++ b/src/contexts/ThreadContext.tsx @@ -0,0 +1,317 @@ +import { nip19 } from "nostr-tools"; +import { createStore } from "solid-js/store"; +import { getEvents, getThread } from "../lib/feed"; +import { + convertToNotes, + parseEmptyReposts, + sortByRecency, +} from "../stores/note"; +import { convertToUser } from "../stores/profile"; +import { Kind } from "../constants"; +import { + createContext, + createEffect, + onCleanup, + useContext +} from "solid-js"; +import { + isConnected, + refreshSocketListeners, + removeSocketListeners, + socket +} from "../sockets"; +import { + ContextChildren, + FeedPage, + NostrEOSE, + NostrEvent, + NostrEventContent, + NostrMentionContent, + NostrNoteActionsContent, + NostrNoteContent, + NostrStatsContent, + NostrUserContent, + NoteActions, + PrimalNote, + PrimalUser, +} from "../types/primal"; +import { APP_ID } from "../App"; +import { useAccountContext } from "./AccountContext"; + +export type ThreadContextStore = { + primaryNote: PrimalNote | undefined, + noteId: string; + notes: PrimalNote[], + users: PrimalUser[], + isFetching: boolean, + page: FeedPage, + reposts: Record | undefined, + lastNote: PrimalNote | undefined, + actions: { + saveNotes: (newNotes: PrimalNote[]) => void, + clearNotes: () => void, + fetchNotes: (noteId: string, until?: number) => void, + fetchNextPage: () => void, + updatePage: (content: NostrEventContent) => void, + savePage: (page: FeedPage) => void, + setPrimaryNote: (context: PrimalNote | undefined) => void, + } +} + +export const initialData = { + primaryNote: undefined, + noteId: '', + parentNotes: [], + notes: [], + users: [], + replyNotes: [], + isFetching: false, + page: { + messages: [], + users: {}, + postStats: {}, + mentions: {}, + noteActions: {}, + }, + reposts: {}, + lastNote: undefined, +}; + + +export const ThreadContext = createContext(); + +export const ThreadProvider = (props: { children: ContextChildren }) => { + + const account = useAccountContext(); + +// ACTIONS -------------------------------------- + + const saveNotes = (newNotes: PrimalNote[]) => { + updateStore('notes', (notes) => [ ...notes, ...newNotes ]); + updateStore('isFetching', () => false); + }; + + const fetchNotes = (noteId: string, until = 0, limit = 100) => { + clearNotes(); + updateStore('noteId', noteId) + getThread(account?.publicKey, noteId, `thread_${APP_ID}`); + updateStore('isFetching', () => true); + } + + const clearNotes = () => { + updateStore('page', () => ({ messages: [], users: {}, postStats: {}, noteActions: {} })); + updateStore('notes', () => []); + updateStore('reposts', () => undefined); + updateStore('lastNote', () => undefined); + }; + + const fetchNextPage = () => { + const lastNote = store.notes[store.notes.length - 1]; + + if (!lastNote) { + return; + } + + updateStore('lastNote', () => ({ ...lastNote })); + + // Disable pagination for thread feeds + const until = 0; //lastNote.post?.created_at || 0; + + if (until > 0) { + fetchNotes(store.noteId); + } + }; + + const updatePage = (content: NostrEventContent) => { + if (content.kind === Kind.Metadata) { + const user = content as NostrUserContent; + + updateStore('page', 'users', + (usrs) => ({ ...usrs, [user.pubkey]: { ...user } }) + ); + return; + } + + if ([Kind.Text, Kind.Repost].includes(content.kind)) { + const message = content as NostrNoteContent; + + if (store.lastNote?.post?.noteId !== nip19.noteEncode(message.id)) { + updateStore('page', 'messages', + (msgs) => [ ...msgs, { ...message }] + ); + } + + return; + } + + if (content.kind === Kind.NoteStats) { + const statistic = content as NostrStatsContent; + const stat = JSON.parse(statistic.content); + + updateStore('page', 'postStats', + (stats) => ({ ...stats, [stat.event_id]: { ...stat } }) + ); + return; + } + + if (content.kind === Kind.Mentions) { + const mentionContent = content as NostrMentionContent; + const mention = JSON.parse(mentionContent.content); + + updateStore('page', 'mentions', + (mentions) => ({ ...mentions, [mention.id]: { ...mention } }) + ); + return; + } + + if (content.kind === Kind.NoteActions) { + const noteActionContent = content as NostrNoteActionsContent; + const noteActions = JSON.parse(noteActionContent.content) as NoteActions; + + updateStore('page', 'noteActions', + (actions) => ({ ...actions, [noteActions.event_id]: { ...noteActions } }) + ); + return; + } + }; + + const savePage = (page: FeedPage) => { + const newPosts = sortByRecency(convertToNotes(page)); + const users = Object.values(page.users).map(convertToUser); + + updateStore('users', () => [ ...users ]); + saveNotes(newPosts); + }; + + const setPrimaryNote = (context: PrimalNote | undefined) => { + updateStore('primaryNote', () => ({ ...context })); + }; + +// SOCKET HANDLERS ------------------------------ + + const onMessage = (event: MessageEvent) => { + const message: NostrEvent | NostrEOSE = JSON.parse(event.data); + + const [type, subId, content] = message; + + if (subId === `thread_${APP_ID}`) { + if (type === 'EOSE') { + const reposts = parseEmptyReposts(store.page); + const ids = Object.keys(reposts); + + if (ids.length === 0) { + savePage(store.page); + return; + } + + updateStore('reposts', () => reposts); + + getEvents(account?.publicKey, ids, `thread_reposts_${APP_ID}`); + + return; + } + + if (type === 'EVENT') { + updatePage(content); + return; + } + } + + if (subId === `thread_reposts_${APP_ID}`) { + if (type === 'EOSE') { + savePage(store.page); + return; + } + + if (type === 'EVENT') { + const repostId = (content as NostrNoteContent).id; + const reposts = store.reposts || {}; + const parent = store.page.messages.find(m => m.id === reposts[repostId]); + + if (parent) { + updateStore('page', 'messages', (msg) => msg.id === parent.id, 'content', () => JSON.stringify(content)); + } + + return; + } + } + }; + + const onSocketClose = (closeEvent: CloseEvent) => { + const webSocket = closeEvent.target as WebSocket; + + removeSocketListeners( + webSocket, + { message: onMessage, close: onSocketClose }, + ); + }; + +// EFFECTS -------------------------------------- + + createEffect(() => { + if (isConnected()) { + refreshSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + } + }); + + onCleanup(() => { + removeSocketListeners( + socket(), + { message: onMessage, close: onSocketClose }, + ); + }); + +// STORES --------------------------------------- + + const primaryNote: () => PrimalNote | undefined = () => + store.notes.find(n => n.post.id === store.noteId); + + const parentNotes: () => PrimalNote[] = () => { + const note = primaryNote(); + + if (!note) { + return []; + } + + return store.notes.filter(n => + n.post.id !== note.post.id && n.post.created_at <= note.post.created_at, + ); + }; + const replyNotes: () => PrimalNote[] = () => { + const note = primaryNote(); + + if (!note) { + return []; + } + + return store.notes.filter(n => + n.post.id !== note.post.id && n.post.created_at >= note.post.created_at, + ); + }; + + const [store, updateStore] = createStore({ + ...initialData, + actions: { + saveNotes, + fetchNotes, + clearNotes, + fetchNextPage, + updatePage, + savePage, + setPrimaryNote, + }, + }); + +// RENDER --------------------------------------- + + return ( + + {props.children} + + ); +} + +export const useThreadContext = () => useContext(ThreadContext); diff --git a/src/contexts/TranslatorContext.tsx b/src/contexts/TranslatorContext.tsx new file mode 100644 index 0000000..ddafdab --- /dev/null +++ b/src/contexts/TranslatorContext.tsx @@ -0,0 +1,49 @@ +import { createStore } from "solid-js/store"; +import { + createContext, + JSXElement, + useContext +} from "solid-js"; +import { IntlProvider } from "@cookbook/solid-intl"; + + +export type TranslatorContextStore = { + locale: string, + messages: Record, + actions: { + setLocale: (locale: string) => void, + }, +} + +const initialData = { + locale: 'en', + messages: {}, +}; + +export const TranslatorContext = createContext(); + +export function TranslatorProvider(props: { children: JSXElement }) { + + const setLocale = (locale: string) => { + updateStore('locale', () => locale); + }; + +// STORES --------------------------------------- + +const [store, updateStore] = createStore({ + ...initialData, + actions: { + setLocale, + }, +}); + + return ( + + + {props.children} + + + ); +} + +export function useTranslatorContext() { return useContext(TranslatorContext); } diff --git a/src/formats.ts b/src/formats.ts new file mode 100644 index 0000000..57e4878 --- /dev/null +++ b/src/formats.ts @@ -0,0 +1,9 @@ +type NumberFormatOptions = { + style?: "unit" | "currency" | "decimal" | "percent", + unit?: string, + unitDisplay?: "narrow" | "long" | "short", +}; + +export const hourNarrow: NumberFormatOptions = { + style: 'unit', unit: 'hour', unitDisplay: 'narrow', +}; diff --git a/src/index.scss b/src/index.scss new file mode 100644 index 0000000..bb6d972 --- /dev/null +++ b/src/index.scss @@ -0,0 +1,462 @@ +@import "@picocss/pico/scss/pico"; + +@mixin sunset_wave { + --brand-1: #FA3C3C; + --brand-2: #5B09AD; + --brand-3: #FA9A43; + --brand-gradient: linear-gradient(135deg, var(--brand-1) 0%, var(--brand-2) 100%); + --brand-gradient-vertical: linear-gradient(180deg, var(--brand-1) 0%, var(--brand-2) 100%); + --highlight-gradient: linear-gradient(137.63deg, var(--brand-3) 0%, var(--brand-1) 32.3%, var(--brand-2) 100%); + --accent-1: #CA079F; + --accent-2: #AB268E; + + --brand-text: #D5D5D5; + --background-site: #000000; + --background-card: #121212; + --background-input: #222222; + --background-modal: #00000066; + --background-embedded_card: #1A1A1A; + --border-embedded-card: #282828; + --text-primary: #FFFFFF; + --text-secondary: #AAAAAA; + --text-secondary-2: #AAAAAA; + --text-tertiary: #757575; + --text-tertiary-2: #666666; + --subtile-devider: #444444; + --check-image: url('./assets/icons/check.svg'); + + --primary: var(--accent-1); + --primary-hover: var(--accent-2); + --primary-focus: var(--background-color); + --background-color: var(--background-site); + + --active-link: var(--text-primary); + --inactive-link: var(--text-secondary); + --fade-gradient-vertical: linear-gradient(180deg, #000000FF 80%, #00000000 100%); + --fade-note-vertical: linear-gradient(180deg, #12121200, #121212FF 90%); + + --logo: url('./assets/icons/logo_fire.svg'); + --icon-follows: url('./assets/icons/follows.svg'); + --icon-tribe: url('./assets/icons/tribe.svg'); + --icon-global: url('./assets/icons/global.svg'); + --icon-network: url('./assets/icons/network.svg'); + + --icon-follows-latest: url('./assets/icons/follows_latest.svg'); + --icon-follows-popular: url('./assets/icons/follows_popular.svg'); + --icon-follows-trending: url('./assets/icons/follows_trending.svg'); + + --icon-tribe-latest: url('./assets/icons/tribe_latest.svg'); + --icon-tribe-popular: url('./assets/icons/tribe_popular.svg'); + --icon-tribe-trending: url('./assets/icons/tribe_trending.svg'); + + --icon-global-latest: url('./assets/icons/global_latest.svg'); + --icon-global-popular: url('./assets/icons/global_popular.svg'); + --icon-global-trending: url('./assets/icons/global_trending.svg'); + + --icon-network-latest: url('./assets/icons/network_latest.svg'); + --icon-network-popular: url('./assets/icons/network_popular.svg'); + --icon-network-trending: url('./assets/icons/network_trending.svg'); + + + select { + background-color: var(--background-site); + } + +} + +@mixin sunrise_wave { + --brand-1: #FA3C3C; + --brand-2: #5B09AD; + --brand-3: #5B09AD; + --brand-gradient: linear-gradient(135deg, var(--brand-1) 0%, var(--brand-2) 100%); + --brand-gradient-vertical: linear-gradient(180deg, var(--brand-1) 0%, var(--brand-2) 100%); + --highlight-gradient: linear-gradient(137.63deg, var(--brand-3) 0%, var(--brand-1) 32.3%, var(--brand-2) 100%); + --accent-1: #CA079F; + --accent-2: #AB268E; + + --brand-text: #444444; + --background-site: #F5F5F5; + --background-card: #FFFFFF; + --background-input: #E5E5E5; + --background-modal: #F5F5F566; + --background-embedded_card: #F5F5F5; + --border-embedded-card: #E5E5E5; + --text-primary: #111111; + --text-secondary: #444444; + --text-secondary-2: #666666; + --text-tertiary: #808080; + --text-tertiary-2: #808080; + --subtile-devider: #C8C8C8; + --check-image: url('./assets/icons/check-black.svg'); + + --primary: var(--accent-1); + --primary-hover: var(--accent-2); + --primary-focus: var(--background-color); + --background-color: var(--background-site); + + --active-link: var(--text-primary); + --inactive-link: var(--text-secondary); + --fade-gradient-vertical: linear-gradient(180deg, #F5F5F5FF 80%, #F5F5F500 100%); + --fade-note-vertical: linear-gradient(180deg, #FFFFFF00, #FFFFFFFF 90%); + + --logo: url('./assets/icons/logo_fire.svg'); + --icon-follows: url('./assets/icons/follows_light.svg'); + --icon-tribe: url('./assets/icons/tribe_light.svg'); + --icon-global: url('./assets/icons/global_light.svg'); + --icon-network: url('./assets/icons/network_light.svg'); + + --icon-follows-latest: url('./assets/icons/follows_latest_light.svg'); + --icon-follows-popular: url('./assets/icons/follows_popular_light.svg'); + --icon-follows-trending: url('./assets/icons/follows_trending_light.svg'); + + --icon-tribe-latest: url('./assets/icons/tribe_latest_light.svg'); + --icon-tribe-popular: url('./assets/icons/tribe_popular_light.svg'); + --icon-tribe-trending: url('./assets/icons/tribe_trending_light.svg'); + + --icon-global-latest: url('./assets/icons/global_latest_light.svg'); + --icon-global-popular: url('./assets/icons/global_popular_light.svg'); + --icon-global-trending: url('./assets/icons/global_trending_light.svg'); + + --icon-network-latest: url('./assets/icons/network_latest_light.svg'); + --icon-network-popular: url('./assets/icons/network_popular_light.svg'); + --icon-network-trending: url('./assets/icons/network_trending_light.svg'); + + select { + background-color: var(--background-site); + } +} + +@mixin midnight_wave { + --brand-1: #0090F8; + --brand-2: #4C00C7; + --brand-3: #00E0FF; + --brand-gradient: linear-gradient(135deg, var(--brand-1) 0%, var(--brand-2) 100%); + --brand-gradient-vertical: linear-gradient(180deg, var(--brand-1) 0%, var(--brand-2) 100%); + --highlight-gradient: linear-gradient(137.63deg, var(--brand-3) 0%, var(--brand-1) 32.22%, var(--brand-2) 100%); + + --accent-1: #2394EF; + --accent-2: #0C7DD8; + + --brand-text: #D5D5D5; + --background-site: #000000; + --background-card: #121212; + --background-input: #222222; + --background-modal: #00000066; + --background-embedded_card: #1A1A1A; + --border-embedded-card: #282828; + --text-primary: #FFFFFF; + --text-secondary: #AAAAAA; + --text-secondary-2: #AAAAAA; + --text-tertiary: #757575; + --text-tertiary-2: #666666; + --subtile-devider: #444444; + --card-border: #282828; + --check-image: url('./assets/icons/check.svg'); + + --primary: var(--accent-1); + --primary-hover: var(--accent-2); + --primary-focus: var(--background-color); + --background-color: var(--background-site); + + --active-link: var(--text-primary); + --inactive-link: var(--text-secondary); + --fade-gradient-vertical: linear-gradient(180deg, #000000FF 80%, #00000000 100%); + --fade-note-vertical: linear-gradient(180deg, #12121200, #121212FF 90%); + + --logo: url('./assets/icons/logo_ice.svg'); + --icon-follows: url('./assets/icons/follows.svg'); + --icon-tribe: url('./assets/icons/tribe.svg'); + --icon-global: url('./assets/icons/global.svg'); + --icon-network: url('./assets/icons/network.svg'); + + --icon-follows-latest: url('./assets/icons/follows_latest.svg'); + --icon-follows-popular: url('./assets/icons/follows_popular.svg'); + --icon-follows-trending: url('./assets/icons/follows_trending.svg'); + + --icon-tribe-latest: url('./assets/icons/tribe_latest.svg'); + --icon-tribe-popular: url('./assets/icons/tribe_popular.svg'); + --icon-tribe-trending: url('./assets/icons/tribe_trending.svg'); + + --icon-global-latest: url('./assets/icons/global_latest.svg'); + --icon-global-popular: url('./assets/icons/global_popular.svg'); + --icon-global-trending: url('./assets/icons/global_trending.svg'); + + --icon-network-latest: url('./assets/icons/network_latest.svg'); + --icon-network-popular: url('./assets/icons/network_popular.svg'); + --icon-network-trending: url('./assets/icons/network_trending.svg'); + + + select { + background-color: var(--background-site); + } +} + + +@mixin ice_wave { + --brand-1: #0090F8; + --brand-2: #4C00C7; + --brand-3: #00E0FF; + --brand-gradient: linear-gradient(135deg, var(--brand-1) 0%, var(--brand-2) 100%); + --brand-gradient-vertical: linear-gradient(180deg, var(--brand-1) 0%, var(--brand-2) 100%); + --highlight-gradient: linear-gradient(137.63deg, var(--brand-3) 0%, var(--brand-1) 32.22%, var(--brand-2) 100%); + --accent-1: #2394EF; + --accent-2: #0C7DD8; + + --brand-text: #444444; + --background-site: #F5F5F5; + --background-card: #FFFFFF; + --background-input: #E5E5E5; + --background-modal: #F5F5F566; + --background-embedded_card: #F5F5F5; + --border-embedded-card: #E5E5E5; + --text-primary: #111111; + --text-secondary: #444444; + --text-secondary-2: #666666; + --text-tertiary: #808080; + --text-tertiary-2: #808080; + --subtile-devider: #C8C8C8; + --check-image: url('./assets/icons/check-black.svg'); + + --primary: var(--accent-1); + --primary-hover: var(--accent-2); + --primary-focus: var(--background-color); + --background-color: var(--background-site); + + --active-link: var(--text-primary); + --inactive-link: var(--text-secondary); + --fade-gradient-vertical: linear-gradient(180deg, #F5F5F5FF 80%, #F5F5F500 100%); + --fade-note-vertical: linear-gradient(180deg, #FFFFFF00, #FFFFFFFF 90%); + + --logo: url('./assets/icons/logo_ice.svg'); + --icon-follows: url('./assets/icons/follows_light.svg'); + --icon-tribe: url('./assets/icons/tribe_light.svg'); + --icon-global: url('./assets/icons/global_light.svg'); + --icon-network: url('./assets/icons/network_light.svg'); + + --icon-follows-latest: url('./assets/icons/follows_latest_light.svg'); + --icon-follows-popular: url('./assets/icons/follows_popular_light.svg'); + --icon-follows-trending: url('./assets/icons/follows_trending_light.svg'); + + --icon-tribe-latest: url('./assets/icons/tribe_latest_light.svg'); + --icon-tribe-popular: url('./assets/icons/tribe_popular_light.svg'); + --icon-tribe-trending: url('./assets/icons/tribe_trending_light.svg'); + + --icon-global-latest: url('./assets/icons/global_latest_light.svg'); + --icon-global-popular: url('./assets/icons/global_popular_light.svg'); + --icon-global-trending: url('./assets/icons/global_trending_light.svg'); + + --icon-network-latest: url('./assets/icons/network_latest_light.svg'); + --icon-network-popular: url('./assets/icons/network_popular_light.svg'); + --icon-network-trending: url('./assets/icons/network_trending_light.svg'); + select { + background-color: var(--background-site); + } +} + +/* Default theme */ +:root[data-theme="dark"], +:root[data-theme="sunset"], +:root:not([data-theme="dark"]), +:root:not([data-theme="sunset"]), +:root:not([data-theme="sunrise"]), +:root:not([data-theme="midinght"]), +:root:not([data-theme="ice"]) { + @include sunset_wave(); +} + +:root[data-theme="light"], +:root[data-theme="sunrise"] { + @include sunrise_wave(); +} + +:root[data-theme="midnight"] { + @include midnight_wave(); +} + +:root[data-theme="ice"] { + @include ice_wave(); +} + +/* Automatically enabled if user has Dark mode enabled */ +@media only screen and (prefers-color-scheme: dark) { + :root { + @include sunset_wave(); + } +} + +/* Common styles */ +:root { + --missing-avatar-text: #FFFFFF; + + --z-index-lifted: 10; + --z-index-header: 20; + --z-index-floater: 30; + + --sidebar-section-icon-gradient: linear-gradient(175.11deg, #FA9A43 6.94%, #FA4343 29.79%, #5B12A4 97.76%), linear-gradient(170.29deg, #CCCCCC 12.73%, #808080 94.98%), #D9D9D9; + + --light-input: #E5E5E5; + --light-back: #F5F5F5; + --dark-input: #222222; + --dark-back: #000000; + + .mentioned_user { + color: var(--accent-1); + } + .hash_tag { + color: var(--accent-1); + } + + .postImage { + display: block; + width: 100%; + border-radius: 12px; + } + + .w-max { + width: 100%; + height: 300px; + border-radius: 4px; + } + + * { + ::-moz-selection { + color: var(--background-site); + background: var(--text-primary); + } + + ::selection { + color: var(--background-site); + background: var(--text-primary); + } + } + +} + +body { + margin: 0; + font-family: 'Roboto Flex', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + overflow-y: scroll; + background-color: var(--background-site); +} + +.linkish { + color: var(--accent-1); +} + +.reply_icon { + -webkit-mask: url(./assets/icons/feed_reply.svg) no-repeat 0 / 100%; + mask: url(./assets/icons/feed_reply_fill.svg) no-repeat 0 / 100%; +} +.reply_icon { + -webkit-mask: url(./assets/icons/feed_reply_fill.svg) no-repeat 0 / 100%; + mask: url(./assets/icons/feed_reply_fill.svg) no-repeat 0 / 100%; +} +.repost_icon { + -webkit-mask: url(./assets/icons/feed_repost.svg) no-repeat 0 / 100%; + mask: url(./assets/icons/feed_repost_fill.svg) no-repeat 0 / 100%; +} +.repost_icon { + -webkit-mask: url(./assets/icons/feed_repost_fill.svg) no-repeat 0 / 100%; + mask: url(./assets/icons/feed_repost_fill.svg) no-repeat 0 / 100%; +} +.zap_icon { + -webkit-mask: url(./assets/icons/feed_zap.svg) no-repeat 0 / 100%; + mask: url(./assets/icons/feed_zap_fill.svg) no-repeat 0 / 100%; +} +.zap_icon { + -webkit-mask: url(./assets/icons/feed_zap_fill.svg) no-repeat 0 / 100%; + mask: url(./assets/icons/feed_zap_fill.svg) no-repeat 0 / 100%; +} +.like_icon { + -webkit-mask: url(./assets/icons/feed_like.svg) no-repeat 0 / 100%; + mask: url(./assets/icons/feed_like_fill.svg) no-repeat 0 / 100%; +} +.like_icon { + -webkit-mask: url(./assets/icons/feed_like_fill.svg) no-repeat 0 / 100%; + mask: url(./assets/icons/feed_like_fill.svg) no-repeat 0 / 100%; +} +.attach_icon { + -webkit-mask: url(./assets/icons/attach_media.svg) no-repeat 0 / 100%; + mask: url(./assets/icons/attach_media.svg) no-repeat 0 / 100%; +} + +// Scrollbars + +/* width */ +::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +/* Track */ +::-webkit-scrollbar-track { + background: none; +} + +/* Handle */ +::-webkit-scrollbar-thumb { + background: var(--subtile-devider); + border-radius: 3px; +} + +/* Handle on hover */ +::-webkit-scrollbar-thumb:hover { + background: var(--text-tertiary-2); +} + +// Checkboxes + +[type="checkbox"] { + background-color: var(--background-card); + border-color: var(--text-tertiary-2); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + width: 20px; + height: 20px; + margin: 0; + margin-inline-end: 16px; + border-width: 1px; + font-size: inherit; + vertical-align: middle; + cursor: pointer; + + &::-ms-check { + display: none; // unstyle IE checkboxes + } + + &:checked, + &:checked:active, + &:checked:focus { + background-color: var(--background-card); + border-color: var(--text-tertiary-2); + background-position: center; + background-size: 12px auto; + background-repeat: no-repeat; + background-image: var(--check-image); + } + + &:focus { + background-color: var(--background-card); + border-color: var(--text-tertiary-2); + } + + & ~ label { + display: inline-block; + margin-right: 0; + margin-bottom: 0; + cursor: pointer; + } + + &:indeterminate { + background-color: var(--background-site); + border-color: var(--text-tertiary-2); + background-image: var(--icon-minus); + background-position: center; + background-size: 12px auto; + background-repeat: no-repeat; + } + +} diff --git a/src/index.tsx b/src/index.tsx new file mode 100644 index 0000000..a1a9779 --- /dev/null +++ b/src/index.tsx @@ -0,0 +1,8 @@ +/* @refresh reload */ +import { render } from 'solid-js/web'; + +import './index.scss'; +import App from './App'; +import { Router } from '@solidjs/router'; + +render(() => , document.getElementById('root') as HTMLElement); diff --git a/src/lib/availableFeeds.ts b/src/lib/availableFeeds.ts new file mode 100644 index 0000000..bffcc09 --- /dev/null +++ b/src/lib/availableFeeds.ts @@ -0,0 +1,69 @@ +import { defaultFeeds, noKey } from "../constants"; +import { PrimalFeed } from "../types/primal"; +import { getStorage, saveFeeds } from "./localStore"; + + +export const initAvailableFeeds = (pubkey: string | undefined) => { + const storage = getStorage(pubkey); + + if (storage.feeds && storage.feeds.length === 0) { + saveFeeds(pubkey, defaultFeeds); + return defaultFeeds; + } + + return storage.feeds; +} + +export const updateAvailableFeedsTop = ( + pubkey: string | undefined, + feed: PrimalFeed, + feeds: PrimalFeed[], +) => { + if (feeds.find(f => feed.name === f.name)) { + return [...feeds]; + } + + const newFeeds = [ { ...feed }, ...feeds]; + + saveFeeds(pubkey, newFeeds); + + return newFeeds; +}; + +export const updateAvailableFeeds = ( + pubkey: string | undefined, + feed: PrimalFeed, + feeds: PrimalFeed[], +) => { + if (feeds.find(f => feed.name === f.name)) { + return [...feeds]; + } + + const newFeeds = [ ...feeds, { ...feed }]; + + saveFeeds(pubkey, newFeeds); + + return newFeeds; +}; + +export const removeFromAvailableFeeds = ( + pubkey: string | undefined, + feed: PrimalFeed, + feeds: PrimalFeed[], +) => { + const newFeeds = feeds.filter(f => f.hex !== feed.hex); + + saveFeeds(pubkey, newFeeds); + + return newFeeds; +}; + +export const replaceAvailableFeeds = ( + pubkey: string | undefined, + feeds: PrimalFeed[], +) => { + const newFeeds = [...feeds]; + saveFeeds(pubkey, newFeeds); + + return newFeeds; +} diff --git a/src/lib/dates.ts b/src/lib/dates.ts new file mode 100644 index 0000000..c5128dc --- /dev/null +++ b/src/lib/dates.ts @@ -0,0 +1,57 @@ +export const shortDate = (timestamp: number | undefined) => { + if (!timestamp || timestamp < 0) { + return ''; + } + const date = new Date(timestamp * 1000); + const dtf = new Intl.DateTimeFormat('en-US', { dateStyle: 'medium'}); + + return dtf.format(date); +}; + +export const date = (postTimestamp: number, style: Intl.RelativeTimeFormatStyle = 'short', since?: number) => { + const today = since ?? Math.floor((new Date()).getTime() / 1000); + const date = new Date(postTimestamp * 1000); + + const minute = 60; + const hour = minute * 60; + const day = hour * 24; + const week = day * 7; + const month = day * 30; + const year = month * 12; + + const rtf = new Intl.RelativeTimeFormat('en', { style }); + + const diff = today - postTimestamp; + + if ( diff > year) { + const years = Math.floor(diff / year); + return { date, label: rtf.format(-years, 'years') }; + } + + if (diff > month) { + const months = Math.floor(diff / month); + return { date, label: rtf.format(-months, 'months') }; + } + + if (diff > week) { + const weeks = Math.floor(diff / week); + return { date, label: rtf.format(-weeks, 'weeks') }; + } + + if (diff > day) { + const days = Math.floor(diff / day); + return { date, label: rtf.format(-days, 'days') }; + } + + if (diff > hour) { + const hours = Math.floor(diff / hour); + return { date, label: rtf.format(-hours, 'hours') }; + } + + if (diff > minute) { + const minutes = Math.floor(diff / minute); + return { date, label: rtf.format(-minutes, 'minutes') }; + } + + return { date, label: `${diff}s` }; +}; diff --git a/src/lib/feed.ts b/src/lib/feed.ts new file mode 100644 index 0000000..25166e9 --- /dev/null +++ b/src/lib/feed.ts @@ -0,0 +1,224 @@ +import { sendMessage } from "../sockets"; +import { ExploreFeedPayload } from "../types/primal"; +import { nip19 } from "nostr-tools"; +import { day, hour, noKey } from "../constants"; + +export const getFutureFeed = (user_pubkey: string | undefined, pubkey: string | undefined, subid: string, since: number) => { + if (!pubkey || pubkey === noKey) { + return; + } + + let payload: { since: number, pubkey: string, user_pubkey?: string, limit: number } = + { since, pubkey, limit: 1000 }; + + if (user_pubkey && user_pubkey !== noKey) { + payload.user_pubkey = user_pubkey; + } + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["feed", payload]}, + ])); +}; + +export const getFeed = (user_pubkey: string | undefined, pubkey: string | undefined, subid: string, until = 0, limit = 20) => { + if (!pubkey || pubkey === noKey) { + return; + } + const start = until === 0 ? 'since' : 'until'; + + let payload = { limit, [start]: until, pubkey }; + + if (user_pubkey && user_pubkey !== noKey) { + payload.user_pubkey = user_pubkey; + } + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["feed", payload]}, + ])); +} + +export const getEvents = (user_pubkey: string | undefined, eventIds: string[], subid: string, extendResponse?: boolean) => { + + let payload: {event_ids: string[], user_pubkey?: string, extended_response?: boolean } = + { event_ids: eventIds } ; + + if (user_pubkey && user_pubkey !== noKey) { + payload.user_pubkey = user_pubkey; + } + + if (extendResponse) { + payload.extended_response = extendResponse; + } + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["events", payload]}, + ])); + +}; + +export const getUserFeed = (user_pubkey: string | undefined, pubkey: string | undefined, subid: string, until = 0, limit = 20) => { + if (!pubkey || pubkey === noKey) { + return; + } + + const start = until === 0 ? 'since' : 'until'; + + let payload = { pubkey, limit, notes: 'authored', [start]: until } ; + + if (user_pubkey && user_pubkey !== noKey) { + payload.user_pubkey = user_pubkey; + } + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["feed", payload]}, + ])); +} + +export const getThread = (user_pubkey: string | undefined, postId: string, subid: string, until = 0, limit = 20) => { + + const decoded = nip19.decode(postId).data; + let event_id = ''; + + + if (typeof decoded === 'string') { + event_id = decoded; + } + + if (typeof decoded !== 'string' && 'id' in decoded) { + event_id = decoded.id; + } + + if (event_id.length === 0) { + return; + } + + let payload: { user_pubkey?: string, limit: number, event_id: string, until?: number } = + { event_id, limit: 100 } ; + + if (user_pubkey && user_pubkey !== noKey) { + payload.user_pubkey = user_pubkey; + } + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["thread_view", payload]}, + ])); +} + +export const getFutureExploreFeed = ( + user_pubkey: string | undefined, + subid: string, + scope: string, + timeframe: string, + since: number, + ) => { + + let payload: { timeframe: string, scope: string, since: number, user_pubkey?: string, created_after?: number, limit: number } = + { timeframe, scope, since, limit: 1000, }; + + if (user_pubkey && user_pubkey !== noKey) { + payload.user_pubkey = user_pubkey; + } + + if (since > 0) { + payload.since = since; + } + + if (timeframe === 'trending') { + const yesterday = Math.floor((new Date().getTime() - day) / 1000); + + payload.created_after = yesterday; + } + + if (timeframe === 'mostzapped4h') { + const fourHAgo = Math.floor((new Date().getTime() - (4 * hour)) / 1000); + + payload.timeframe = 'mostzapped'; + payload.created_after = fourHAgo; + } + + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: [ + "explore", + payload, + ]}, + ])); +}; + +export const getExploreFeed = ( + pubkey: string | undefined, + subid: string, + scope: string, + timeframe: string, + until = 0, + limit = 20, +) => { + + let payload: ExploreFeedPayload = { timeframe, scope, limit }; + + if (pubkey && pubkey !== noKey) { + payload.user_pubkey = pubkey; + } + + if (until > 0) { + payload.until = until; + } + + if (timeframe === 'trending') { + const yesterday = Math.floor((new Date().getTime() - day) / 1000); + + payload.created_after = yesterday; + } + + if (timeframe === 'mostzapped4h') { + const fourHAgo = Math.floor((new Date().getTime() - (4 * hour)) / 1000); + + payload.timeframe = 'mostzapped'; + payload.created_after = fourHAgo; + } + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: [ + "explore", + payload, + ]}, + ])); +}; + +export const getTrending24h = ( + subid: string, +) => { + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: [ + "explore_global_trending_24h", + ]}, + ])); +}; + +export const getMostZapped4h = ( + subid: string, +) => { + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: [ + "explore_global_mostzapped_4h", + ]}, + ])); +}; diff --git a/src/lib/keys.ts b/src/lib/keys.ts new file mode 100644 index 0000000..b0812bb --- /dev/null +++ b/src/lib/keys.ts @@ -0,0 +1,6 @@ +import { nip19 } from "nostr-tools" +import { noKey } from "../constants"; + +export const hexToNpub = (hex: string | undefined): string => { + return hex && hex !== noKey ? nip19.npubEncode(hex) : ''; +} diff --git a/src/lib/localStore.ts b/src/lib/localStore.ts new file mode 100644 index 0000000..d484703 --- /dev/null +++ b/src/lib/localStore.ts @@ -0,0 +1,111 @@ +import { noKey } from "../constants" +import { NostrRelays, PrimalFeed } from "../types/primal"; + +export type LocalStore = { + following: string[], + followingSince: number, + relaySettings: NostrRelays, + likes: string[], + feeds: PrimalFeed[]; + theme: string, +}; + +export const emptyStorage = { + following: [], + followingSince: 0, + relaySettings: {}, + likes: [], + feeds: [], + theme: 'sunset', +} + +export const storageName = (pubkey?: string) => { + if (!pubkey || pubkey === noKey) { + return 'anon'; + } + + return `store_${pubkey}`; +}; + +export const getStorage = (pubkey?: string) => { + if (!pubkey) { + return {} as LocalStore; + } + + const name = storageName(pubkey); + const storage = localStorage.getItem(name); + + return storage ? + JSON.parse(storage) as LocalStore : + { ...emptyStorage }; +}; + +export const setStorage = (pubkey: string | undefined, data: LocalStore) => { + if (!pubkey) { + return; + } + + const name = storageName(pubkey); + const value = JSON.stringify(data); + + localStorage.setItem(name, value); +} + +export const saveFollowing = (pubkey: string | undefined, following: string[], since: number) => { + if (!pubkey) { + return; + } + + const store = getStorage(pubkey); + + store.following = [...following]; + store.followingSince = since; + + setStorage(pubkey, store); +} + +export const saveRelaySettings = (pubkey: string | undefined, settings: NostrRelays) => { + if (!pubkey) { + return; + } + + const store = getStorage(pubkey); + + store.relaySettings = { ...settings }; + + setStorage(pubkey, store); +} + +export const saveLikes = (pubkey: string | undefined, likes: string[]) => { + if (!pubkey) { + return; + } + + const store = getStorage(pubkey); + + store.likes = [ ...likes ]; + + setStorage(pubkey, store); +}; + +export const saveFeeds = (pubkey: string | undefined, feeds: PrimalFeed[]) => { + if (!pubkey) { + return; + } + const store = getStorage(pubkey); + + store.feeds = [ ...feeds ]; + + setStorage(pubkey, store); +}; + +export const saveTheme = (pubkey: string | undefined, theme: string) => { + if (!pubkey) { + return; + } + const store = getStorage(pubkey); + + store.theme = theme; + + setStorage(pubkey, store); +}; diff --git a/src/lib/media.ts b/src/lib/media.ts new file mode 100644 index 0000000..6d70af1 --- /dev/null +++ b/src/lib/media.ts @@ -0,0 +1,50 @@ +import { Kind } from "../constants"; +import { sendMessage } from "../uploadSocket"; +import { NostrWindow } from "../types/primal"; + +export const getMediaUrl = (url: string | undefined, size = 'o', animated = 1) => { + if (!url) { + return; + } + const mediaServer = localStorage.getItem('mediaServer'); + + if (!mediaServer) { + return url; + } + + const encodedUrl = encodeURIComponent(url); + + return `${mediaServer}/media-cache?s=${size}&a=${animated}&u=${encodedUrl}`; +} + +export const uploadMedia = async ( + uploader: string | undefined, + subid: string, + content: string, +) => { + if (!uploader) { + return; + } + + const event = { + content, + kind: Kind.Upload, + tags: [['p', uploader]], + created_at: Math.floor((new Date()).getTime() / 1000), + }; + + const win = window as NostrWindow; + const nostr = win.nostr; + + if (nostr === undefined) { + return false; + } + + const signedNote = await nostr.signEvent(event); + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["upload", { event_from_user: signedNote }]}, + ])); +}; diff --git a/src/lib/messages.ts b/src/lib/messages.ts new file mode 100644 index 0000000..8790efc --- /dev/null +++ b/src/lib/messages.ts @@ -0,0 +1,96 @@ +import { Kind } from "../constants"; +import { sendMessage } from "../sockets"; +import { NostrWindow, UserRelation } from "../types/primal"; + + +export const subscribeToMessagesStats = (pubkey: string, subid: string) => { + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["directmsg_count", { pubkey }]}, + ])); +} + +export const resetMessageCount = async (sender: string, subid: string) => { + + const win = window as NostrWindow; + const nostr = win.nostr; + + if (nostr === undefined) { + return false; + } + + const event = { + content: `{ "description": "reset messages from '${sender}'"}`, + kind: Kind.Settings, + tags: [["d", "Primal-Web App"]], + created_at: Math.ceil((new Date()).getTime() / 1000), + }; + + const signedEvent = await nostr.signEvent(event); + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["reset_directmsg_count", { + event_from_user: signedEvent, + sender, + }]}, + ])); +} + +export const getMessageCounts = (user_pubkey: string, relation: UserRelation, subid: string) => { + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["get_directmsg_contacts", { user_pubkey, relation }]}, + ])); +} + +export const getOldMessages = (receiver: string, sender: string, subid: string, until = 0, limit = 20) => { + + const start = until === 0 ? 'since' : 'until'; + + const payload = { limit, [start]: until, receiver, sender }; + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["get_directmsgs", payload]}, + ])); +} + +export const getNewMessages = (receiver: string, sender: string, subid: string, since = 0, limit = 20) => { + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["get_directmsgs", { receiver, sender, since, limit }]}, + ])); +} + +export const markAllAsRead = async (subid: string) => { + + const win = window as NostrWindow; + const nostr = win.nostr; + + if (nostr === undefined) { + return false; + } + + const event = { + content: `{ "description": "mark all messages as read"}`, + kind: Kind.Settings, + tags: [["d", "Primal-Web App"]], + created_at: Math.ceil((new Date()).getTime() / 1000), + }; + + const signedEvent = await nostr.signEvent(event); + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["reset_directmsg_counts", { + event_from_user: signedEvent, + }]}, + ])); +} diff --git a/src/lib/notes.ts b/src/lib/notes.ts new file mode 100644 index 0000000..ba6c5b8 --- /dev/null +++ b/src/lib/notes.ts @@ -0,0 +1,317 @@ +import { getLinkPreview } from "link-preview-js"; +import { Relay } from "nostr-tools"; +import { createStore } from "solid-js/store"; +import { Kind } from "../constants"; +import { NostrWindow, PrimalNote } from "../types/primal"; +import { getMediaUrl } from "./media"; + +const getLikesStorageKey = () => { + const key = localStorage.getItem('pubkey') || 'anon'; + return `likes_${key}`; +}; + +export const getStoredLikes = () => { + return JSON.parse(localStorage.getItem(getLikesStorageKey()) || '[]'); +}; + +export const setStoredLikes = (likes: string[]) => { + return localStorage.setItem(getLikesStorageKey(), JSON.stringify(likes)); +}; + +export const sanitize = (html: string) => { + return html.replaceAll('<', '<').replaceAll('>', '>'); +}; + +export const [linkPreviews, setLinkPreviews] = createStore>({}); + +export const addLinkPreviews = async (url: string) => { + try { + const preview = await getLinkPreview(url); + + // const preview = await fetch(`link-preview?u=https://yahoo.com`); + // console.log('PREV: ', preview); + setLinkPreviews((p) => ({ ...p, [url]: { ...preview }})); + + } catch (e) { + console.log('Failed to get preview for: ', url); + setLinkPreviews((p) => ({ ...p, [url]: { noPreview: url }})); + } +}; + +export const spotifyRegex = /open\.spotify\.com\/(track|album|playlist|episode)\/([a-zA-Z0-9]+)/; +export const twitchRegex = /twitch.tv\/([a-z0-9_]+$)/i; +export const mixCloudRegex = /mixcloud\.com\/(?!live)([a-zA-Z0-9]+)\/([a-zA-Z0-9-]+)/; +// export const tidalRegex = /tidal\.com\/(?:browse\/)?(\w+)\/([a-z0-9-]+)/i; +export const soundCloudRegex = /soundcloud\.com\/(?!live)([a-zA-Z0-9]+)\/([a-zA-Z0-9-]+)/; +// export const tweetUrlRegex = /https?:\/\/twitter\.com\/(?:#!\/)?(\w+)\/status(?:es)?\/(\d+)/; +export const appleMusicRegex = /music\.apple\.com\/([a-z]{2}\/)?(?:album|playlist)\/[\w\d-]+\/([.a-zA-Z0-9-]+)(?:\?i=\d+)?/i; +export const nostrNestsRegex = /nostrnests\.com\/[a-zA-Z0-9]+/i; +// export const magnetRegex = /(magnet:[\S]+)/i; +export const wavlakeRegex = /(?:player\.)?wavlake\.com\/(track\/[.a-zA-Z0-9-]+|album\/[.a-zA-Z0-9-]+|[.a-zA-Z0-9-]+)/i; +// export const odyseeRegex = /odysee\.com\/([a-zA-Z0-9]+)/; +export const youtubeRegex = /(?:https?:\/\/)?(?:www|m\.)?(?:youtu\.be\/|youtube\.com\/(?:live\/|shorts\/|embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})/; + +export const urlify = (text: string, highlightOnly = false, skipEmbed = false, skipLinkPreview = false) => { + const urlRegex = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,8}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/g; + + return text.replace(urlRegex, (url) => { + if (!skipEmbed) { + + const isImage = url.includes('.jpg')|| url.includes('.jpeg')|| url.includes('.webp') || url.includes('.png') || url.includes('.gif') || url.includes('format=png'); + + if (isImage) { + return '' + } + + const isMp4Video = url.includes('.mp4') || url.includes('.mov'); + + if (isMp4Video) { + return ``; + } + + const isOggVideo = url.includes('.ogg'); + + if (isOggVideo) { + return ``; + } + + const isWebmVideo = url.includes('.webm'); + + if (isWebmVideo) { + return ``; + } + + if (youtubeRegex.test(url)) { + const youtubeId = youtubeRegex.test(url) && RegExp.$1; + + return ``; + } + + if (spotifyRegex.test(url)) { + const convertedUrl = url.replace(/\/(track|album|playlist|episode)\/([a-zA-Z0-9]+)/, "/embed/$1/$2"); + + return ``; + } + + if (twitchRegex.test(url)) { + const channel = url.split("/").slice(-1); + + const args = `?channel=${channel}&parent=${window.location.hostname}&muted=true`; + return ``; + } + + if (mixCloudRegex.test(url)) { + const feedPath = (mixCloudRegex.test(url) && RegExp.$1) + "%2F" + (mixCloudRegex.test(url) && RegExp.$2); + + // const lightTheme = useLogin().preferences.theme === "light"; + // const lightParams = lightTheme ? "light=1" : "light=0"; + return ` +
+ `; + } + + if (soundCloudRegex.test(url)) { + return ``; + } + + if (appleMusicRegex.test(url)) { + const convertedUrl = url.replace("music.apple.com", "embed.music.apple.com"); + const isSongLink = /\?i=\d+$/.test(convertedUrl); + + return ` + + `; + } + + if (nostrNestsRegex.test(url)) { + return ` + `; + } + + if (wavlakeRegex.test(url)) { + const convertedUrl = url.replace(/(?:player\.|www\.)?wavlake\.com/, "embed.wavlake.com"); + + return ` + `; + } + } + + if (highlightOnly) { + return `${url}`; + } + + if (skipLinkPreview) { + return `${url}`; + } + + addLinkPreviews(url); + + return `__LINK__${url}__LINK__`; + }) +} + +export const replaceLinkPreviews = (text: string) => { + let parsed = text; + + const regex = /__LINK__.*?__LINK__/ig; + + parsed = parsed.replace(regex, (link) => { + const url = link.split('__LINK__')[1]; + + return `${url}`; + + }); + + return parsed; +} + +export const addlineBreaks = (text: string) => { + const regex = /(\r\n|\r|\n)/g; + + return text.replaceAll(regex, '
'); +}; + +export const highlightHashtags = (text: string) => { + const regex = /(^|\s)(#[a-z\d-]+)/ig; + + return text.replace(regex, "$1$2"); +}; + +export const parseNote1 = (content: string) => urlify(addlineBreaks(content)); +export const parseNote2 = (content: string) => urlify(addlineBreaks(content), true); +export const parseNote3 = (content: string) => urlify(addlineBreaks(content), false, false, true); + +type ReplyTo = { e?: string, p?: string }; +type NostrEvent = { content: string, kind: number, tags: string[][], created_at: number }; + +export const sendLike = async (note: PrimalNote, relays: Relay[]) => { + const event = { + content: '+', + kind: Kind.Reaction, + tags: [ + ['e', note.post.id], + ['p', note.post.pubkey], + ], + created_at: Math.floor((new Date()).getTime() / 1000), + }; + + return await sendEvent(event, relays); + +} + +export const sendRepost = async (note: PrimalNote, relays: Relay[]) => { + const event = { + content: JSON.stringify(note.msg), + kind: Kind.Repost, + tags: [ + ['e', note.post.id], + ['p', note.user.pubkey], + ], + created_at: Math.floor((new Date()).getTime() / 1000), + }; + + return await sendEvent(event, relays); +} + + +export const sendNote = async (text: string, relays: Relay[], tags: string[][]) => { + const event = { + content: text, + kind: Kind.Text, + tags, + created_at: Math.floor((new Date()).getTime() / 1000), + }; + + return await sendEvent(event, relays); +} + +export const sendContacts = async (contacts: string[], date: number, content: string, relays: Relay[]) => { + const event = { + content, + kind: Kind.Contacts, + tags: contacts.map(c => ['p', c]), + created_at: date, + }; + + return await sendEvent(event, relays); +}; + +export const sendEvent = async (event: NostrEvent, relays: Relay[]) => { + const win = window as NostrWindow; + const nostr = win.nostr; + + if (nostr === undefined) { + return false; + } + + const signedNote = await nostr.signEvent(event); + + return new Promise((resolve) => { + const numberOfRelays = relays.length; + let failed = 0; + + relays.forEach(relay => { + try { + let pub = relay.publish(signedNote); + + pub.on('ok', () => { + console.log(`${relay.url} has accepted our event`); + resolve(true); + }); + + pub.on('failed', (reason: any) => { + console.log(`failed to publish to ${relay.url}: ${reason}`) + failed += 1; + if (failed >= numberOfRelays) { + resolve(false); + } + }); + } catch (e) { + console.log('Failed sending note: ', e); + failed += 1; + if (failed >= numberOfRelays) { + resolve(false); + } + } + }); + + }); +} diff --git a/src/lib/notifications.ts b/src/lib/notifications.ts new file mode 100644 index 0000000..70be2ba --- /dev/null +++ b/src/lib/notifications.ts @@ -0,0 +1,127 @@ +import { Kind } from "../constants"; +import { sendMessage } from "../sockets"; +import { NostrWindow } from "../types/primal"; + +export const getNotifications = ( + user_pubkey: string | undefined, + pubkey: string | undefined, + subid: string, + since = 0, + limit = 1000, +) => { + if (!pubkey) { + return; + } + + let payload: { pubkey: string, limit: number, since: number, user_pubkey?: string } = { pubkey, limit, since }; + + if (user_pubkey) { + payload.user_pubkey = user_pubkey; + } + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["get_notifications", payload]}, + ])); +}; + +export const getOldNotifications = ( + user_pubkey: string | undefined, + pubkey: string | undefined, + subid: string, + until = 0, + limit = 20, +) => { + if (!pubkey) { + return; + } + + let payload: { pubkey: string, limit: number, until: number, user_pubkey?: string } = { pubkey, limit, until }; + + if (user_pubkey) { + payload.user_pubkey = user_pubkey; + } + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["get_notifications", payload]}, + ])); +}; + +export const getLastSeen = (pubkey: string | undefined, subid: string) => { + if (!pubkey) { + return; + } + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["get_notifications_seen", { pubkey }]}, + ])); + +}; + +export const setLastSeen = async ( + subid: string, + timestamp: number, +) => { + const win = window as NostrWindow; + const nostr = win.nostr; + + if (nostr === undefined) { + return false; + } + + const event = { + content: '{ "description": "update notifications last seen timestamp"}', + kind: Kind.Settings, + tags: [], + created_at: timestamp, + }; + + const signedNote = await nostr.signEvent(event); + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["set_notifications_seen", { + event_from_user: signedNote, + }]}, + ])); + +}; + +export const subscribeToNotificationStats = (pubkey: string, subid: string) => { + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["notification_counts", { pubkey, subid, }]}, + ])); +} + +export const truncateNumber = (amount: number, from?: 1 | 2 | 3 | 4) => { + const t = 1_000; + const s = from || 1; + + const l = Math.pow(t, s); + + if (amount < l) { + return amount.toLocaleString(); + } + + if (amount < Math.pow(t, 2)) { + return `${Math.floor(amount / t).toLocaleString()}K`; + } + + if (amount < Math.pow(t, 3)) { + return `${Math.floor(amount / Math.pow(t, 2)).toLocaleString()}M` + } + + if (amount < Math.pow(t, 4)) { + return `${Math.floor(amount / Math.pow(t, 3)).toLocaleString()}B` + } + + return `1T+`; +}; diff --git a/src/lib/profile.ts b/src/lib/profile.ts new file mode 100644 index 0000000..3fac2a2 --- /dev/null +++ b/src/lib/profile.ts @@ -0,0 +1,123 @@ +import { Event, Relay } from "nostr-tools"; +import { Kind, minKnownProfiles, noKey } from "../constants"; +import { sendMessage } from "../sockets"; +import { NostrWindow, VanityProfiles } from "../types/primal"; +import { getStorage } from "./localStore"; + +export const getUserProfiles = (pubkeys: string[], subid: string) => { + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["user_infos", { pubkeys }]}, + ])); +} + +export const getUserProfileInfo = (pubkey: string, subid: string) => { + if (pubkey === noKey) { + return + } + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["user_profile", { pubkey }]}, + ])); +} + +export const getProfileContactList = (pubkey: string, subid: string) => { + if (pubkey === noKey) { + return + } + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["contact_list", { pubkey }]}, + ])); +} + +export const getProfileScoredNotes = (pubkey: string, subid: string, limit = 5) => { + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["user_profile_scored_content", { pubkey, limit }]}, + ])); +} + +export const getTrendingUsers = (subid: string) => { + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["scored_users_24h"]}, + ])); +} + + +export const trimVerification = (address: string | undefined) => { + if (address === undefined) { + return ''; + } + + return address.split('@'); +} + +export const getLikes = (pubkey: string, relays: Relay[], callback: (likes: string[]) => void) => { + if (pubkey === noKey) { + return; + } + + const win = window as NostrWindow; + const nostr = win.nostr; + const storage = getStorage(pubkey); + + let likes = new Set(storage.likes); + + if (!nostr) { + callback(storage.likes); + return; + } + + // Request Reactions from all relays + try { + // const signedNote = await nostr.signEvent(event); + + relays.forEach(relay => { + + const sub = relay.sub([ + { + kinds: [Kind.Reaction], + authors: [pubkey], + }, + ]); + + sub.on('event', (event: Event) => { + const e = event.tags.find(t => t[0] === 'e'); + + e && e[1] && likes.add(e[1]); + }) + + sub.on('eose', () => { + const likeArray = Array.from(likes); + + callback(likeArray); + + sub.unsub(); + }) + }); + + } catch (e) { + console.log('Failed sending note: ', e); + } +}; + +export const fetchKnownProfiles: (vanityName: string) => Promise = async (vanityName: string) => { + try { + const name = vanityName.toLowerCase(); + const content = await fetch(`${window.location.origin}/.well-known/nostr.json?name=${name}`); + + return await content.json(); + } catch (e) { + console.log('Failed to fetch known users: ', e); + + return { ...minKnownProfiles }; + } +}; diff --git a/src/lib/relays.ts b/src/lib/relays.ts new file mode 100644 index 0000000..6249bf8 --- /dev/null +++ b/src/lib/relays.ts @@ -0,0 +1,66 @@ +import { relayInit, Relay } from "nostr-tools"; +import { relayConnectingTimeout } from "../constants"; +import { NostrRelays } from "../types/primal"; + +const logError = (relay: Relay, e: any, timedOut?: boolean) => { + const message = timedOut ? + 'timed-out connecting to relay: ' : + 'error connecting to relay: '; + + console.log(message, relay.url, e); +}; + +export const closeRelays = async (relays: Relay[], success = () => {}, fail = () => {}) => { + try { + for (let i=0; i< relays.length; i++) { + await relays[i].close() + } + return success(); + } catch (e) { + return fail(); + } +}; + +const connectToRelay = (relay: Relay) => new Promise( + (resolve, reject) => { + const timeout = setTimeout(() => { + relay.close(); + logError(relay, null, true); + reject(); + }, relayConnectingTimeout); + + relay.connect() + .then(() => { + clearTimeout(timeout); + resolve(true); + }) + .catch((e) => { + logError(relay, e); + reject(); + }); + }, +); + +export const connectRelays = async ( + relaySettings: NostrRelays, + onConnect: (relays: Relay[]) => void, +) => { + + const urls = Object.keys(relaySettings); + const relays = urls.map(u => relayInit(u)); + const connected: Relay[] = []; + + for (let i=0; i < relays.length; i++) { + const relay = relays[i]; + + if (relay.status === WebSocket.CLOSED) { + try { + await connectToRelay(relay); + connected.push(relay); + } catch(e){ + logError(relay, e); + }; + } + } + onConnect(connected); +}; diff --git a/src/lib/scroll.ts b/src/lib/scroll.ts new file mode 100644 index 0000000..5bc67d3 --- /dev/null +++ b/src/lib/scroll.ts @@ -0,0 +1,11 @@ +export const scrollWindowTo = (top: number = 0, smooth = false) => { + const behavior = smooth ? 'smooth' : 'instant'; + setTimeout(() => { + window.scrollTo({ + top, + left: 0, + // @ts-expect-error https://github.com/microsoft/TypeScript-DOM-lib-generator/issues/5 + behavior, + }); + }, 0); +}; diff --git a/src/lib/search.ts b/src/lib/search.ts new file mode 100644 index 0000000..8d11771 --- /dev/null +++ b/src/lib/search.ts @@ -0,0 +1,47 @@ +import { sendMessage } from "../sockets"; +import { sanitize } from "./notes"; + +type SearchPayload = { query: string, limit: number, pubkey?: string, since?: number, until?: number }; + +export const cleanQuery = (query: string) => { + return sanitize(query); +} + + +export const searchUsers = (pubkey: string | undefined, subid: string, query: string, limit = 10) => { + + let payload: SearchPayload = { query: cleanQuery(query), limit }; + + if (pubkey) { + payload.pubkey = pubkey; + } + + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["user_search", payload]}, + ])); +} + +export const searchContent = (subid: string, query: string, limit = 100) => { + + let payload: SearchPayload = { query: cleanQuery(query), limit }; + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["search", payload]}, + ])); +} + +export const searchFutureContent = (subid: string, query: string, since:number, limit = 100) => { + + let payload: SearchPayload = { query: cleanQuery(query), limit, since }; + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["search", payload]}, + ])); +} diff --git a/src/lib/settings.ts b/src/lib/settings.ts new file mode 100644 index 0000000..a8a7ed0 --- /dev/null +++ b/src/lib/settings.ts @@ -0,0 +1,68 @@ +import { Kind } from "../constants"; +import { sendMessage } from "../sockets"; +import { NostrWindow, PrimalFeed } from "../types/primal"; + +type PrimalSettings = { + theme: string, + feeds: PrimalFeed[], + description?: string, +}; + +export const sendSettings = async (settings: PrimalSettings, subid: string) => { + const win = window as NostrWindow; + const nostr = win.nostr; + + if (nostr === undefined) { + return false; + } + + const content = { description: 'Sync app settings', ...settings }; + + const event = { + content: JSON.stringify(content), + kind: Kind.Settings, + tags: [["d", "Primal-Web App"]], + created_at: Math.floor((new Date()).getTime() / 1000), + }; + + const signedNote = await nostr.signEvent(event); + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["set_app_settings", { settings_event: signedNote }]}, + ])) +}; + +export const getSettings = async (pubkey: string | undefined, subid: string) => { + const win = window as NostrWindow; + const nostr = win.nostr; + + if (nostr === undefined || !pubkey) { + return false; + } + + const event = { + content: '{ "description": "Sync app settings" }', + kind: Kind.Settings, + tags: [["d", "Primal-Web App"]], + created_at: Math.floor((new Date()).getTime() / 1000), + }; + + const signedNote = await nostr.signEvent(event); + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["get_app_settings", { event_from_user: signedNote }]}, + ])) +}; + +export const getDefaultSettings = async (subid: string) => { + + sendMessage(JSON.stringify([ + "REQ", + subid, + {cache: ["get_default_app_settings", { client: "Primal-Web App" }]}, + ])) +}; diff --git a/src/lib/stats.ts b/src/lib/stats.ts new file mode 100644 index 0000000..41424d7 --- /dev/null +++ b/src/lib/stats.ts @@ -0,0 +1,47 @@ +import { sendMessage } from '../sockets'; + +export const startListeningForNostrStats = (subId: string) => { + sendMessage(JSON.stringify([ + "REQ", + `netstats_${subId}`, + {cache: ["net_stats"]}, + ])); +}; + +export const stopListeningForNostrStats = (subId: string) => { + sendMessage(JSON.stringify([ + "CLOSE", + `netstats_${subId}`, + ])); +}; + +export const getLegendStats = (pubkey: string | undefined, subId: string) => { + pubkey && sendMessage(JSON.stringify([ + "REQ", + `legendstats_${subId}`, + {"cache":["explore_legend_counts",{ pubkey }]}, + ])); +} + +export const humanizeNumber = (number: number, veryShort = false) => { + + const bottomLimit = veryShort ? 1000 : 10000; + + if (number < bottomLimit) { + return number.toLocaleString(); + } + + if (number < 100000) { + return `${parseFloat((number/1000).toFixed(1))} k`; + } + + if (number < 1000000) { + return `${Math.floor(number/1000)} k`; + } + + if (number < 100000000) { + return `${parseFloat((number/1000000).toFixed(1))} m`; + } + + return `${Math.floor(number/1000000)} m`; +}; diff --git a/src/lib/textArea.ts b/src/lib/textArea.ts new file mode 100644 index 0000000..a4cb454 --- /dev/null +++ b/src/lib/textArea.ts @@ -0,0 +1,136 @@ + // Taken and slightly adapted from https://github.com/component/textarea-caret-position + + // We'll copy the properties below into the mirror div. + // Note that some browsers, such as Firefox, do not concatenate properties + // into their shorthand (e.g. padding-top, padding-bottom etc. -> padding), + // so we have to list every single property explicitly. + const properties = [ + 'direction', // RTL support + 'boxSizing', + 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does + 'height', + 'overflowX', + 'overflowY', // copy the scrollbar for IE + + 'borderTopWidth', + 'borderRightWidth', + 'borderBottomWidth', + 'borderLeftWidth', + 'borderStyle', + + 'paddingTop', + 'paddingRight', + 'paddingBottom', + 'paddingLeft', + + // https://developer.mozilla.org/en-US/docs/Web/CSS/font + 'fontStyle', + 'fontVariant', + 'fontWeight', + 'fontStretch', + 'fontSize', + 'fontSizeAdjust', + 'lineHeight', + 'fontFamily', + + 'textAlign', + 'textTransform', + 'textIndent', + 'textDecoration', // might not make a difference, but better be safe + + 'letterSpacing', + 'wordSpacing', + + 'tabSize', + 'MozTabSize' + + ]; + + var isBrowser = (typeof window !== 'undefined'); + // @ts-ignore + var isFirefox = (isBrowser && window.mozInnerScreenX != null); + + export const getCaretCoordinates = (element: HTMLTextAreaElement | HTMLInputElement, position: number) => { + if (!isBrowser) { + throw new Error('textarea-caret-position#getCaretCoordinates should only be called in a browser'); + } + + // The mirror div will replicate the textarea's style + var div = document.createElement('div'); + div.id = 'input-textarea-caret-position-mirror-div'; + document.body.appendChild(div); + + var style = div.style; + // @ts-ignore + var computed = window.getComputedStyle ? window.getComputedStyle(element) : element.currentStyle; // currentStyle for IE < 9 + var isInput = element.nodeName === 'INPUT'; + + // Default textarea styles + style.whiteSpace = 'pre-wrap'; + if (!isInput) + style.wordWrap = 'break-word'; // only for textarea-s + + // Position off-screen + style.position = 'absolute'; // required to return coordinates properly + + // Transfer the element's properties to the div + properties.forEach(function (prop) { + if (isInput && prop === 'lineHeight') { + // Special case for s because text is rendered centered and line height may be != height + if (computed.boxSizing === "border-box") { + var height = parseInt(computed.height); + var outerHeight = + parseInt(computed.paddingTop) + + parseInt(computed.paddingBottom) + + parseInt(computed.borderTopWidth) + + parseInt(computed.borderBottomWidth); + var targetHeight = outerHeight + parseInt(computed.lineHeight); + if (height > targetHeight) { + style.lineHeight = height - outerHeight + "px"; + } else if (height === targetHeight) { + style.lineHeight = computed.lineHeight; + } else { + style.lineHeight = '0'; + } + } else { + style.lineHeight = computed.height; + } + } else { + // @ts-ignore + style[prop] = computed[prop]; + } + }); + + if (isFirefox) { + // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275 + if (element.scrollHeight > parseInt(computed.height)) + style.overflowY = 'scroll'; + } else { + style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll' + } + + div.textContent = element.value.substring(0, position); + // The second special handling for input type="text" vs textarea: + // spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037 + if (isInput) + div.textContent = div.textContent.replace(/\s/g, '\u00a0'); + + var span = document.createElement('span'); + // Wrapping must be replicated *exactly*, including when a long word gets + // onto the next line, with whitespace at the end of the line before (#7). + // The *only* reliable way to do that is to copy the *entire* rest of the + // textarea's content into the created at the caret position. + // For inputs, just '.' would be enough, but no need to bother. + span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all + div.appendChild(span); + + var coordinates = { + top: span.offsetTop + parseInt(computed['borderTopWidth']), + left: span.offsetLeft + parseInt(computed['borderLeftWidth']), + height: parseInt(computed['lineHeight']) + }; + + document.body.removeChild(div); + + return coordinates; + } diff --git a/src/lib/zap.ts b/src/lib/zap.ts new file mode 100644 index 0000000..abd5405 --- /dev/null +++ b/src/lib/zap.ts @@ -0,0 +1,86 @@ +import { bech32 } from "@scure/base"; +import { nip57, Relay, utils } from "nostr-tools"; +import { NostrWindow, PrimalNote, PrimalUser } from "../types/primal"; + +export const zapNote = async (note: PrimalNote, sender: string | undefined, amount: number, comment = '', relays: Relay[]) => { + if (!sender) { + return false; + } + + const callback = await getZapEndpoint(note.user); + + if (!callback) { + return false; + } + + const sats = Math.round(amount * 1000); + + const zapReq = nip57.makeZapRequest({ + profile: note.post.pubkey, + event: note.msg.id, + amount: sats, + comment, + relays: relays.map(r => r.url) + }); + + const win = window as NostrWindow; + const nostr = win.nostr; + const webln = win.webln + + if (!nostr || !webln) { + return false; + } + + try { + const signedEvent = await nostr.signEvent(zapReq); + + const event = encodeURI(JSON.stringify(signedEvent)); + + const r2 = await (await fetch(`${callback}?amount=${sats}&nostr=${event}`)).json(); + const pr = r2.pr; + + await webln.enable(); + await webln.sendPayment(pr); + + return true; + } catch (e) { + return false; + } +} + +export const getZapEndpoint = async (user: PrimalUser): Promise => { + try { + let lnurl: string = '' + let {lud06, lud16} = user; + + if (lud16) { + let [name, domain] = lud16.split('@') + lnurl = `https://${domain}/.well-known/lnurlp/${name}` + } + else if (lud06) { + let {words} = bech32.decode(lud06, 1023) + let data = bech32.fromWords(words) + lnurl = utils.utf8Decoder.decode(data) + } + else { + return null; + } + + let res = await fetch(lnurl) + let body = await res.json() + + if (body.allowsNostr && body.nostrPubkey) { + return body.callback; + } + } catch (err) { + console.log('E: ', err); + return null; + /*-*/ + } + + return null; +} + +export const canUserReceiveZaps = (user: PrimalUser | undefined) => { + return !!user && (!!user.lud16 || !!user.lud06); +} diff --git a/src/logo.svg b/src/logo.svg new file mode 100644 index 0000000..025aa30 --- /dev/null +++ b/src/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/pages/Downloads.module.scss b/src/pages/Downloads.module.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/Downloads.tsx b/src/pages/Downloads.tsx new file mode 100644 index 0000000..6a5b412 --- /dev/null +++ b/src/pages/Downloads.tsx @@ -0,0 +1,14 @@ +import { Component } from 'solid-js'; +import MissingPage from '../components/MissingPage/MissingPage'; + + +const Downloads: Component = () => { + + return ( + <> + + + ); +} + +export default Downloads; diff --git a/src/pages/Explore.module.scss b/src/pages/Explore.module.scss new file mode 100644 index 0000000..e937e94 --- /dev/null +++ b/src/pages/Explore.module.scss @@ -0,0 +1,175 @@ +.fullHeader { + display: grid; + height: 120px; + align-items: center; + justify-content: left; + position: relative; + margin-bottom: -3px; + position: relative; + + .exploreCaption { + font-weight: 300; + font-size: 32px; + line-height: 34px; + color: var(--brand-text); + } + + .addToFeed { + display: flex; + position: absolute; + bottom: 0px; + width: 100%; + height: 35px; + justify-content: flex-end; + align-items: flex-end; + + .noAdd { + display: flex; + align-items: center; + font-size: 16px; + line-height: 25px; + font-weight: 400; + color: var(--text-primary); + opacity: 0.6; + transition: opacity 0.4s; + } + + .addButton { + display: flex; + align-items: center; + margin: 0; + padding: 0; + border: none; + background-color: unset; + width: auto; + font-size: 16px; + line-height: 25px; + font-weight: 400; + color: var(--text-primary); + opacity: 0.6; + transition: opacity 0.4s; + + >span { + font-weight: 800; + margin-right: 5px; + } + + &:hover { + opacity: 1; + transition: opacity 0.4s; + } + + &:focus { + box-shadow: none; + } + } + } +} + +.exploreMenu { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr; + grid-column-gap: 26px; + grid-row-gap: 26px; +} + +.exploreBox { + box-sizing: border-box; + + width: 140px; + height: 140px; + + border: 1px solid var(--text-tertiary-2); + border-radius: 9px; + + display: flex; + align-items: flex-end; + justify-content: center; + + text-decoration: none; + + >div { + display: flex; + width: 100%; + height: 100%; + flex-direction: column; + align-items: center; + + .firstLine { + text-align: center; + font-size: 18px; + font-weight: 300; + line-height: 22px; + color: var(--text-tertiary); + } + + .secondLine { + text-align: center; + font-size: 18px; + line-height: 22px; + font-weight: 700; + color: var(--text-primary); + } + + .exploreBoxIcon { + align-self: center; + justify-self: center; + margin-top: 12px; + margin-bottom: 12px; + } + } +} + +@mixin tableCell { + display: table-cell; + padding: 0px 12px; + margin: 12px 0px; + border-bottom: solid 1px var(--subtile-devider); +} + +.statsLegend { + display: table; + width: 100%; + margin-top: 53px; + + + .legendDetails { + display: table-row; + + .legendIcon { + @include tableCell; + width: 32px; + padding: 0px; + >img { + width: 32px; + height: 32px; + margin: 12px 0px; + } + } + + .legendName { + @include tableCell; + color: var(--text-primary); + font-size: 18px; + line-height: 22px; + font-weight: 700; + } + + .legendNumber { + @include tableCell; + color: var(--text-primary); + font-size: 24px; + line-height: 36px; + font-weight: 300; + + } + + .legendDescription { + @include tableCell; + color: var(--text-secondary); + font-size: 16px; + line-height: 22px; + font-weight: 300; + } + } +} diff --git a/src/pages/Explore.tsx b/src/pages/Explore.tsx new file mode 100644 index 0000000..8e6d5c7 --- /dev/null +++ b/src/pages/Explore.tsx @@ -0,0 +1,131 @@ +import { Component, Show } from 'solid-js'; +import styles from './Explore.module.scss'; +import ExploreMenu from './ExploreMenu'; +import Feed from './Feed'; +import { useParams } from '@solidjs/router'; +import Branding from '../components/Branding/Branding'; +import PageNav from '../components/PageNav/PageNav'; +import { scopeLabels, timeframeLabels } from '../constants'; +import ExploreSidebar from '../components/ExploreSidebar/ExploreSidebar'; +import { useToastContext } from '../components/Toaster/Toaster'; +import { useSettingsContext } from '../contexts/SettingsContext'; +import StickySidebar from '../components/StickySidebar/StickySidebar'; +import Wormhole from '../components/Wormhole/Wormhole'; +import { toast as t, explore as tExplore, actions as tAction } from '../translations'; +import { useIntl } from '@cookbook/solid-intl'; +import Search from '../components/Search/Search'; + + +const scopes = ['follows', 'tribe', 'network', 'global']; +const timeframes = ['latest', 'trending', 'popular', 'mostzapped']; + +const titleCase = (text: string) => { + return text[0].toUpperCase() + text.slice(1).toLowerCase(); +} + +const Explore: Component = () => { + + const settings = useSettingsContext(); + const toaster = useToastContext(); + const intl = useIntl(); + + const params = useParams(); + + const hasParams = () => { + if (!params.scope || !params.timeframe) { + return false; + } + + return scopes.includes(params.scope) && + timeframes.includes(params.timeframe); + + }; + + const hasFeedAtHome = () => { + const hex = `${params.scope};${params.timeframe}`; + + return !!settings?.availableFeeds.find(f => f.hex === hex); + }; + + const addToHomeFeed = () => { + const hex = `${params.scope};${params.timeframe}`; + const name = titleCase(`${timeframeLabels[params.timeframe]}, ${scopeLabels[params.scope]}`); + const feed = { name, hex }; + + settings?.actions.addAvailableFeed(feed); + + toaster?.sendSuccess(intl.formatMessage( + t.addFeedToHomeSuccess, + { name }, + )); + }; + + return ( + <> + + } + > + + + + + + + + +
+ + {intl.formatMessage(tExplore.genericCaption)} +
} + > +
+ {intl.formatMessage( + tExplore.title, + { + timeframe: timeframeLabels[params.timeframe], + scope: scopeLabels[params.scope], + }, + )} +
+
+ + {intl.formatMessage(tAction.disabledAddFeedToHome)} +
+ } + > + + + + + + + + + + + } + > + + + + ) +} + +export default Explore; diff --git a/src/pages/ExploreMenu.module.scss b/src/pages/ExploreMenu.module.scss new file mode 100644 index 0000000..3d5b60f --- /dev/null +++ b/src/pages/ExploreMenu.module.scss @@ -0,0 +1,314 @@ +.fullHeader { + display: grid; + height: 120px; + align-items: center; + justify-content: left; + + >div { + font-weight: 300; + font-size: 32px; + line-height: 34px; + color: var(--brand-text); + } +} + +.statsHolder { + margin-bottom: 36px; +} + +.exploreMenu { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr; + grid-column-gap: 26px; + grid-row-gap: 26px; +} + +.exploreBox { + box-sizing: border-box; + + width: 140px; + height: 140px; + + border: 1px solid var(--text-tertiary-2); + border-radius: 9px; + + display: flex; + align-items: flex-end; + justify-content: center; + + text-decoration: none; + + >div { + display: flex; + width: 100%; + height: 100%; + flex-direction: column; + align-items: center; + + .firstLine { + text-align: center; + font-size: 18px; + font-weight: 300; + line-height: 22px; + color: var(--text-tertiary); + } + + .secondLine { + text-align: center; + font-size: 18px; + line-height: 22px; + font-weight: 700; + color: var(--text-primary); + } + + .exploreBoxIcon { + align-self: center; + justify-self: center; + margin-top: 12px; + margin-bottom: 12px; + } + } +} + +@mixin tableCell { + display: table-cell; + padding: 0px 12px; + border-bottom: solid 1px var(--text-tertiary-2); + vertical-align: middle; +} + +.statsLegend { + display: table; + width: 100%; + margin-top: 53px; + + + .legendDetails { + display: table-row; + + .legendIcon { + @include tableCell; + width: 32px; + padding: 0px; + >div { + width: 32px; + height: 32px; + margin: 12px 0px; + } + } + + .legendName { + @include tableCell; + color: var(--text-primary); + font-size: 18px; + line-height: 22px; + font-weight: 700; + } + + .legendNumber { + @include tableCell; + color: var(--text-primary); + font-size: 24px; + line-height: 36px; + font-weight: 300; + + } + + .legendDescription { + @include tableCell; + color: var(--text-secondary); + font-size: 16px; + line-height: 22px; + font-weight: 300; + } + } +} + +@mixin exploreCategoryIcon { + width: 56px; + height: 56px; + background-color: var(--background-site); +} + +.global_trending_icon { + @include exploreCategoryIcon; + background-image: var(--icon-global-trending); + background-size: contain; + background-repeat: no-repeat; +} + +.global_latest_icon { + @include exploreCategoryIcon; + background-image: var(--icon-network-latest); + background-size: contain; + background-repeat: no-repeat; +} + +.global_popular_icon { + @include exploreCategoryIcon; + background-image: var(--icon-network-popular); + background-size: contain; + background-repeat: no-repeat; +} + + +.network_trending_icon { + @include exploreCategoryIcon; + background-image: var(--icon-network-trending); + background-size: contain; + background-repeat: no-repeat; +} + +.network_latest_icon { + @include exploreCategoryIcon; + background-image: var(--icon-network-latest); + background-size: contain; + background-repeat: no-repeat; +} + +.network_popular_icon { + @include exploreCategoryIcon; + background-image: var(--icon-network-popular); + background-size: contain; + background-repeat: no-repeat; +} + + +.tribe_trending_icon { + @include exploreCategoryIcon; + background-image: var(--icon-tribe-trending); + background-size: contain; + background-repeat: no-repeat; +} + +.tribe_latest_icon { + @include exploreCategoryIcon; + background-image: var(--icon-tribe-latest); + background-size: contain; + background-repeat: no-repeat; +} + +.tribe_popular_icon { + @include exploreCategoryIcon; + background-image: var(--icon-tribe-popular); + background-size: contain; + background-repeat: no-repeat; +} + + +.follows_trending_icon { + @include exploreCategoryIcon; + background-image: var(--icon-follows-trending); + background-size: contain; + background-repeat: no-repeat; +} + +.follows_latest_icon { + @include exploreCategoryIcon; + background-image: var(--icon-follows-latest);; + background-size: contain; + background-repeat: no-repeat; +} + +.follows_popular_icon { + @include exploreCategoryIcon; + background-image: var(--icon-follows-popular);; + background-size: contain; + background-repeat: no-repeat; +} + + +.followsIcon { + @include exploreCategoryIcon; + background-image: var(--icon-follows); + background-size: contain; + background-repeat: no-repeat; +} + +.tribeIcon { + @include exploreCategoryIcon; + background-image: var(--icon-tribe); + background-size: contain; + background-repeat: no-repeat; +} + +.networkIcon { + @include exploreCategoryIcon; + background-image: var(--icon-network); + background-size: contain; + background-repeat: no-repeat; +} + +.globalIcon { + @include exploreCategoryIcon; + background-image: var(--icon-global); + background-size: contain; + background-repeat: no-repeat; +} + +@media only screen and (max-width: 720px) { + .exploreMenu { + width: 100%; + display: grid; + grid-template-columns: 1fr 1fr 1fr; + grid-template-rows: 1fr 1fr 1fr 1fr; + grid-column-gap: 6px; + grid-row-gap: 26px; + grid-template-areas: + "followsLatest followsTrending followsPopular" + "tribeLatest tribeTrending tribePopular" + "networkLatest networkTrending networkPopular" + "globalLatest globalTrending globalPopular"; + } + + .global_trending_box { + grid-area: globalTrending; + } + + .global_latest_box { + grid-area: globalLatest; + } + + .global_popular_box { + grid-area: globalPopular; + } + + + .network_trending_box { + grid-area: networkTrending; + } + + .network_latest_box { + grid-area: networkLatest; + } + + .network_popular_box { + grid-area: networkPopular; + } + + + .tribe_trending_box { + grid-area: tribeTrending; + } + + .tribe_latest_box { + grid-area: tribeLatest; + } + + .tribe_popular_box { + grid-area: tribePopular; + } + + + .follows_trending_box { + grid-area: followsTrending; + } + + .follows_latest_box { + grid-area: followsLatest; + } + + .follows_popular_box { + grid-area: followsPopular; + } +} diff --git a/src/pages/ExploreMenu.tsx b/src/pages/ExploreMenu.tsx new file mode 100644 index 0000000..5f7f4da --- /dev/null +++ b/src/pages/ExploreMenu.tsx @@ -0,0 +1,45 @@ +import { Component, createEffect, onCleanup } from 'solid-js'; +import { isConnected } from '../sockets'; +import styles from './ExploreMenu.module.scss'; + +import NostrStats from '../components/NostrStats/NostrStats'; +import ExploreMenuItem from '../components/ExploreMenuItem/ExploreMenuItem'; +import { initialExploreData, useExploreContext } from '../contexts/ExploreContext'; +import { useAccountContext } from '../contexts/AccountContext'; + + +const ExploreMenu: Component = () => { + + const explore = useExploreContext(); + const account = useAccountContext(); + + const legend = () => explore?.legend || { ...initialExploreData.legend }; + const stats = () => explore?.stats || { ...initialExploreData.stats }; + + createEffect(() => { + if (isConnected()) { + explore?.actions.fetchLegendStats(account?.publicKey); + explore?.actions.openNetStatsStream(); + } + }); + + onCleanup(() => { + explore?.actions.closeNetStatsStream(); + }); + + return ( + <> +
+ +
+ + + + + + + + ) +} + +export default ExploreMenu; diff --git a/src/pages/Feed.module.scss b/src/pages/Feed.module.scss new file mode 100644 index 0000000..485b84c --- /dev/null +++ b/src/pages/Feed.module.scss @@ -0,0 +1,3 @@ +.feedContent { + position: relative; +} diff --git a/src/pages/Feed.tsx b/src/pages/Feed.tsx new file mode 100644 index 0000000..d858eb7 --- /dev/null +++ b/src/pages/Feed.tsx @@ -0,0 +1,39 @@ +import { Component, createEffect, For, Show } from 'solid-js'; +import styles from './Feed.module.scss'; +import { useParams } from '@solidjs/router'; +import Note from '../components/Note/Note'; +import Loader from '../components/Loader/Loader'; +import { useExploreContext } from '../contexts/ExploreContext'; +import Paginator from '../components/Paginator/Paginator'; + +const Feed: Component<{ scope: string, timeframe: string}> = () => { + + const explore = useExploreContext(); + + const params = useParams(); + + createEffect(() => { + if (params.scope && params.timeframe) { + explore?.actions.clearNotes(); + explore?.actions.fetchNotes( + `${params.scope};${params.timeframe}`, + ); + } + }); + + return ( +
+ 0} + fallback={} + > + + {(note) => } + + + +
+ ) +} + +export default Feed; diff --git a/src/pages/Help.module.scss b/src/pages/Help.module.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/Help.tsx b/src/pages/Help.tsx new file mode 100644 index 0000000..f471b1d --- /dev/null +++ b/src/pages/Help.tsx @@ -0,0 +1,13 @@ +import { Component } from 'solid-js'; +import MissingPage from '../components/MissingPage/MissingPage'; + + +const Help: Component = () => { + return ( + <> + + + ); +} + +export default Help; diff --git a/src/pages/Home.module.scss b/src/pages/Home.module.scss new file mode 100644 index 0000000..9360baa --- /dev/null +++ b/src/pages/Home.module.scss @@ -0,0 +1,135 @@ +.homeContent { + position: relative; +} + +.paginate { + color: var(--text-tertiary-2); + position: absolute; + bottom: 1280px; + width: 640px; + height: 100px; +} + +.noContent, .endOfContent { + position: relative; + color: var(--text-secondary); + text-align: center; + margin-top: 80px; +} + +.normalCentralHeader { + display: block; +} + +.phoneCentralHeader { + display: none; +} + +.newContentItem { + width: 100%; + display: flex; + justify-content: center; + margin-top: 10px; + + >button { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 40px; + background: var(--background-card); + font-weight: 400; + font-size: 14px; + line-height: 18px; + border: none; + border-radius: 8px; + padding-block: 0; + padding-left: 2px; + margin: 0; + + .counter { + margin-left: 24px; + color: var(--text-secondary); + } + + &:hover { + background: var(--background-input); + .counter{ + color: var(--text-primary); + } + } + } +} + +.newContentNotification { + position: fixed; + top: 42px; + left: calc(calc(100vw - 1240px) / 2 + 176px + 32px); + width: 640px; + z-index: 20; + display: flex; + justify-content: center; + + >button { + display: flex; + align-items: center; + justify-content: center; + width: auto; + height: 40px; + background: var(--brand-gradient); + font-weight: 400; + font-size: 14px; + line-height: 18px; + border: none; + border-radius: 20px; + padding-block: 0; + padding-left: 4px; + margin: 0; + + .avatars { + display: flex; + align-items: center; + height: 40px; + .avatar { + border: solid 2px var(--text-primary); + border-radius: 50%; + width: 30px; + height: 30px; + transition: margin-right 0.2s; + margin-right: -9px; + } + } + + .counter { + margin-left: 24px; + } + } + +} +@media only screen and (max-width: 1300px) { + .newContentNotification { + left: calc(calc(100vw - 1032px) / 2 + 48px + 32px); + } +} + +@media only screen and (max-width: 1087px) { + .newContentNotification { + left: calc(calc(100vw - 720px) / 2 + 48px + 32px); + } +} + +@media only screen and (max-width: 720px) { + .newContentNotification { + left: 0; + width: 100%; + justify-content: center; + } + .normalCentralHeader { + display: none; + } + + .phoneCentralHeader { + display: block; + width: 100%; + } +} diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx new file mode 100644 index 0000000..c2fcdf2 --- /dev/null +++ b/src/pages/Home.tsx @@ -0,0 +1,230 @@ +import { + Component, + createEffect, + createSignal, + For, + Match, + onCleanup, + onMount, + Show, + Switch +} from 'solid-js'; +import Note from '../components/Note/Note'; +import styles from './Home.module.scss'; +import HomeHeader from '../components/HomeHeader/HomeHeader'; +import Loader from '../components/Loader/Loader'; +import Paginator from '../components/Paginator/Paginator'; +import HomeSidebar from '../components/HomeSidebar/HomeSidebar'; +import Branding from '../components/Branding/Branding'; +import HomeHeaderPhone from '../components/HomeHeaderPhone/HomeHeaderPhone'; +import Wormhole from '../components/Wormhole/Wormhole'; +import { scrollWindowTo } from '../lib/scroll'; +import StickySidebar from '../components/StickySidebar/StickySidebar'; +import { useHomeContext } from '../contexts/HomeContext'; +import { useIntl } from '@cookbook/solid-intl'; +import { createStore } from 'solid-js/store'; +import { PrimalUser } from '../types/primal'; +import Avatar from '../components/Avatar/Avatar'; +import { userName } from '../stores/profile'; +import { useAccountContext } from '../contexts/AccountContext'; +import { feedNewPosts, placeholders } from '../translations'; +import Search from '../components/Search/Search'; + + +const Home: Component = () => { + + const context = useHomeContext(); + const account = useAccountContext(); + const intl = useIntl(); + + const isPageLoading = () => context?.isFetching; + + let checkNewNotesTimer: number = 0; + + const [hasNewPosts, setHasNewPosts] = createSignal(false); + const [newNotesCount, setNewNotesCount] = createSignal(0); + const [newPostAuthors, setNewPostAuthors] = createStore([]); + + + const newPostCount = () => newNotesCount() < 100 ? newNotesCount() : 100; + + + onMount(() => { + scrollWindowTo(context?.scrollTop); + }); + + createEffect(() => { + const hex = context?.selectedFeed?.hex; + + if (checkNewNotesTimer) { + clearInterval(checkNewNotesTimer); + setHasNewPosts(false); + setNewNotesCount(0); + setNewPostAuthors(() => []); + } + + const timeout = 25_000 + Math.random() * 10_000; + + checkNewNotesTimer = setInterval(() => { + context?.actions.checkForNewNotes(hex); + }, timeout); + + }); + + createEffect(() => { + const count = context?.future.notes.length || 0; + if (count === 0) { + return + } + + if (!hasNewPosts()) { + setHasNewPosts(true); + } + + if (newPostAuthors.length < 3) { + const users = context?.future.notes.map(note => note.user) || []; + + const uniqueUsers = users.reduce((acc, user) => { + const isDuplicate = acc.find(u => u.pubkey === user.pubkey); + return isDuplicate ? acc : [ ...acc, user ]; + }, []).slice(0, 3); + + setNewPostAuthors(() => [...uniqueUsers]); + } + + setNewNotesCount(count); + + + }); + + onCleanup(()=> { + clearInterval(checkNewNotesTimer); + }); + + const loadNewContent = () => { + if (newNotesCount() > 100) { + location.reload(); + return; + } + context?.actions.loadFutureContent(); + scrollWindowTo(0, true); + setHasNewPosts(false); + setNewNotesCount(0); + setNewPostAuthors(() => []); + } + + return ( +
+ + + + + + + + +
+ +
+ +
+ +
+ + 40) && + !account?.showNewNoteForm + }> +
+ +
+
+ + + + + + +
+ +
+
+ + 0} + > + + {note => } + + + + + +
+ +
+
+ +
+ {intl.formatMessage(placeholders.endOfFeed)} +
+
+ +
+ +
+
+
+ +
+ ) +} + +export default Home; diff --git a/src/pages/Messages.module.scss b/src/pages/Messages.module.scss new file mode 100644 index 0000000..22600b5 --- /dev/null +++ b/src/pages/Messages.module.scss @@ -0,0 +1,427 @@ +@mixin messageContent { + padding-block: 8px; + padding-inline: 16px; + margin-bottom: 8px; + width: fit-content; + max-width: calc(640px + 12px - 40px); +} + +@mixin thread($align-end) { + display: flex; + flex-direction: column; + margin-top: -16px; + + @if $align-end { + align-items: flex-end; + } @else { + align-items: flex-start; + } + + .avatar { + margin-bottom: 8px; + } + .threadMessages { + display: flex; + flex-direction: column-reverse; + align-items: flex-start; + max-width: calc(100% - 48px); + + .message { + @include messageContent(); + + @if $align-end { + align-self: flex-end; + text-align: left; + border-radius: 8px 0px 8px 8px; + } @else { + align-items: flex-start; + text-align: left; + border-radius: 0px 8px 8px 8px; + } + + font-weight: 400; + font-size: 16px; + line-height: 24px; + color: var(--text-primary); + background-color: var(--subtile-devider); + } + } + .threadTime { + color: var(--text-tertiary-2); + font-weight: 400; + font-size: 12px; + line-height: 16px; + } +} + +.fullHeader { + display: grid; + height: 120px; + align-items: center; + justify-content: left; + padding-top: 6px; + + >div { + font-weight: 300; + font-size: 32px; + line-height: 34px; + color: var(--brand-text); + text-transform: lowercase; + } +} + +.messagesContent { + position: relative; + + .sendersHeader { + height: 40px; + width: 294px; + background-color: var(--background-input); + border-radius: 8px; + display: flex; + justify-content: space-between; + align-items: center; + padding-inline: 12px; + margin-bottom: 8px; + .senderCategorySelector { + display: flex; + .categorySelector { + border: none; + outline: none; + padding: 0; + margin: 0; + background: none; + color: var(--text-tertiary); + font-weight: 400; + font-size: 14px; + line-height: 16px; + text-transform: uppercase; + + &:focus { + background: none; + box-shadow: none; + outline: none; + } + + &.highlight, &:hover { + color: var(--text-primary); + } + + } + .separator { + border-left: 1px solid var(--subtile-devider); + margin-inline: 8px; + } + } + + .markAsRead { + border: none; + outline: none; + padding: 0; + margin: 0; + background: none; + color: var(--accent-1); + font-weight: 400; + font-size: 13px; + line-height: 16px; + width: auto; + + &:focus { + background: none; + box-shadow: none; + outline: none; + } + } + } + + .sendersList { + display: flex; + flex-direction: column; + overflow-y: scroll; + width: 308px; + height: calc(100vh - 176px); + padding-right: 8px; + + + .senderItem { + position: relative; + display: flex; + height: 65px; + background-color: var(--background-card); + padding-inline: 15px; + padding-block: 12px; + border-radius: 8px; + border: none; + margin-bottom: 8px; + align-items: center; + + &:hover, &.selected { + background-color: var(--background-input); + } + + .senderInfo { + margin-left: 12px; + display: flex; + flex-direction: column; + font-size: 16px; + line-height: 16px; + .firstLine { + display: flex; + justify-content: flex-start; + .senderName { + color: var(--text-primary); + font-weight: 700; + } + .lastMessageTime { + color: var(--text-tertiary-2); + font-weight: 400; + margin-left: 2px; + + &::before { + content: "|"; + padding: 0px 2px; + } + } + } + + .secondLine { + text-align: left; + color: var(--text-tertiary); + font-weight: 400; + font-size: 14px; + line-height: 16px; + margin-top: 4px; + padding: 0; + max-width: 200px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + } + } + } + + .conversation { + position: absolute; + top: 0; + left: 320px; + background-color: var(--background-card ); + border-radius: 8px; + width: calc(640px + 12px); + height: calc(100vh - 128px); + z-index: var(--z-index-lifted); + overflow: hidden; + padding: 12px; + display: flex; + flex-direction: column-reverse; + + .messages { + width: 100%; + height: calc(100% - 44px); + margin-bottom: 12px; + overflow-y: scroll; + display: flex; + flex-direction: column-reverse; + padding-right: 8px; + position: relative; + + .myThread { + @include thread(true); + .threadMessages { + .message { + background-color: var(--subtile-devider); + } + } + + .myThread { + margin-bottom: 20px; + } + } + + .theirThread { + @include thread(false); + .threadMessages { + .message { + background-color: var(--background-input); + } + } + + .theirThread { + margin-bottom: 20px; + } + } + } + + .newMessage { + height: 32px; + width: 100%; + position: relative; + vertical-align: bottom; + display: table-cell; + + .textAreaBorder { + padding: 1px; + background: var(--brand-gradient); + border-radius: 8px; + width: 510px; + height: 34px; + box-sizing: border-box; + + textarea { + // border: 1px solid var(--brand-gradient-vertical); + background: var(--background-site); + border-radius: 8px; + color: var(--text-primary); + font-weight: 400; + font-size: 14px; + line-height: 20px; + height: 32px; + margin: 0; + margin-right: 12px; + padding-inline: 8px; + padding-block: 8px; + width: 508px; + max-height: none; + + &:focus { + box-shadow: none; + } + } + } + + .secondaryButton { + position: absolute; + top: 0; + right: 14px; + width: 80px; + height: 32px; + border: none; + border-radius: 6px; + padding: 1px; + font-size: 14px; + line-height: 20px; + font-weight: 700; + background: var(--brand-gradient-vertical); + color: var(--text-tertiary-2); + >div { + width: 100%; + height: 100%; + vertical-align: middle; + border-radius: 6px; + background-color: var(--background-card); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + } + } + + .primaryButton { + position: absolute; + top: 0; + right: 14px; + width: 80px; + height: 32px; + border: none; + border-radius: 6px; + padding: 0px; + font-size: 14px; + line-height: 20px; + font-weight: 700; + background: var(--brand-gradient-vertical); + color: white; + >span { + opacity: 0.75; + } + } + } + } +} + +.senderBubble { + position: absolute; + text-align: center; + padding-top: 2px; + padding-inline: 4px; + top: 12px; + right: 12px; + min-width: 18px; + min-height: 18px; + border-radius: 8px; + font-weight: 500; + font-size: 12px; + line-height: 12px; + z-index: var(--z-index-lifted); + + background: var(--brand-gradient); + border: 1px solid var(--background-site); + + color: white; + text-shadow: 0.5px 0.5px 0px black; + + &.doubleSize { + right: -24px; + } + &.tripleSize { + right: -30px; + } +} + +.postLink { + text-decoration: none; + color: unset; + max-height: 650px; + overflow: hidden; +} + +.searchSuggestions { + width: 300px; + background-color: var(--background-site); + border: 1px solid var(--text-tertiary-2); + // box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.8); + border-radius: 4px; + + position: absolute; + bottom: 0px; + left: 0px; + z-index: var(--z-index-header); +} + + +.emojiSuggestions { + position: absolute; + display: grid; + grid-template-columns: 50px 50px 50px 50px 50px 50px; + width: 322px; + max-height: 200px; + overflow-y: scroll; + padding: 4px; + background-color: var(--background-site); + border: 1px solid var(--text-tertiary-2); + // box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.8); + border-radius: 8px; + + bottom: 32px; + left: 0px; + z-index: var(--z-index-floater); + + .emojiOption { + margin-bottom: 5px; + padding: 2px; + background: none; + font-size: 16px; + line-height: 20px; + font-weight: 400; + border: none; + display: flex; + justify-content: center; + align-items: center; + + &:hover, &.highlight { + background-color: var(--text-tertiary-2); + } + + &:focus { + outline: none; + border: none; + } + } +} diff --git a/src/pages/Messages.tsx b/src/pages/Messages.tsx new file mode 100644 index 0000000..9f47160 --- /dev/null +++ b/src/pages/Messages.tsx @@ -0,0 +1,1141 @@ +import { useIntl } from '@cookbook/solid-intl'; +import { nip19 } from 'nostr-tools'; +import { Component, createEffect, createSignal, For, onCleanup, onMount, Show } from 'solid-js'; +import Avatar from '../components/Avatar/Avatar'; +import { useAccountContext } from '../contexts/AccountContext'; +import { useMessagesContext } from '../contexts/MessagesContext'; +import { nip05Verification, truncateNpub, userName } from '../stores/profile'; +import { PrimalNote, PrimalUser } from '../types/primal'; +import { date } from '../lib/dates'; + +import styles from './Messages.module.scss'; +import EmbeddedNote from '../components/EmbeddedNote/EmbeddedNote'; +import { A, useNavigate, useParams } from '@solidjs/router'; +import { parseNote3 } from '../lib/notes'; +import { hexToNpub } from '../lib/keys'; +import Branding from '../components/Branding/Branding'; +import Wormhole from '../components/Wormhole/Wormhole'; +import Loader from '../components/Loader/Loader'; +import SearchOption from '../components/Search/SearchOption'; +import { debounce, isVisibleInContainer, uuidv4 } from '../utils'; +import { useSearchContext } from '../contexts/SearchContext'; +import { createStore } from 'solid-js/store'; +import { editMentionRegex } from '../constants'; +import Search from '../components/Search/Search'; +import { useProfileContext } from '../contexts/ProfileContext'; +import Paginator from '../components/Paginator/Paginator'; +import { getCaretCoordinates } from '../lib/textArea'; +import emojiSearch from '@jukben/emoji-search'; +import { + placeholders, + messages as tMessages, + actions as tActions, + search as tSearch, +} from '../translations'; + +type AutoSizedTextArea = HTMLTextAreaElement & { _baseScrollHeight: number }; + +let currentUrl = ''; + +type EmojiOption = { + keywords: string[], + char: string, + fitzpatrick_scale: boolean, + category: string, + name: string, +}; + +export const parseNoteLinks = (text: string, mentionedNotes: Record, mentionedUsers: Record, highlightOnly?: boolean) => { + + const regex = /\bnostr:((note|nevent)1\w+)\b|#\[(\d+)\]/g; + + return text.replace(regex, (url) => { + const [_, id] = url.split(':'); + + if (!id) { + return url; + } + + try { + const note = mentionedNotes[id]; + + const path = `/thread/${id}`; + + const link = highlightOnly ? + {url} : + note ? + + + : + {url}; + + // @ts-ignore + return link.outerHTML || url; + } catch (e) { + return `${url}`; + } + + }); + +}; + +export const parseNpubLinks = (text: string, mentionedUsers: Record, highlightOnly = false) => { + + const regex = /\bnostr:((npub|nprofile)1\w+)\b|#\[(\d+)\]/g; + + return text.replace(regex, (url) => { + const [_, id] = url.split(':'); + + if (!id) { + return url; + } + + try { + const profileId = nip19.decode(id).data as string | nip19.ProfilePointer; + + const hex = typeof profileId === 'string' ? profileId : profileId.pubkey; + const npub = hexToNpub(hex); + const path = `/profile/${npub}`; + + const user = mentionedUsers[hex]; + + let link = highlightOnly ? + @{truncateNpub(npub)} : + @{truncateNpub(npub)}; + + if (user) { + link = highlightOnly ? + @{userName(user)} : + @{userName(user)}; + } + + + // @ts-ignore + return link.outerHTML || url; + } catch (e) { + return `${url}`; + } + }); + +}; + +const emojiSearchLimit = 2; + +const Messages: Component = () => { + const instanceId = uuidv4(); + + const intl = useIntl(); + const messages = useMessagesContext(); + const account = useAccountContext(); + const profile = useProfileContext(); + + const navigate = useNavigate(); + + const params = useParams(); + + let conversationHolder: HTMLDivElement | undefined; + let newMessageInput: HTMLTextAreaElement | undefined; + let newMessageInputBorder: HTMLDivElement | undefined; + let newMessageWrapper: HTMLDivElement | undefined; + let sendersListElement: HTMLDivElement | undefined; + + let emojiOptions: HTMLDivElement | undefined; + + const [highlightedEmoji, setHighlightedEmoji] = createSignal(0); + const [isEmojiInput, setEmojiInput] = createSignal(false); + const [emojiQuery, setEmojiQuery] = createSignal(''); + const [emojiResults, setEmojiResults] = createStore([]); + let emojiCursorPosition = { top: 0, left: 0, height: 0 }; + + const senderNpub = () => { + if (!params.sender) { + return ''; + } + + if (params.sender.startsWith('npub')) { + return params.sender; + } + + return nip19.noteEncode(params.sender); + }; + + const orderedSenders = () => { + if (!messages || !messages.senders) { + return []; + } + const senders = messages.senders; + const counts = messages.messageCountPerSender; + + const ids = Object.keys(senders); + const latests = ids.map(id => ({ latest_at: counts[id]?.latest_at || null, id })); + + const ordered = latests.sort((a, b) => { + if (!a.latest_at) { + return -1; + } + + if (!b.latest_at) { + return 1; + } + + return b.latest_at - a.latest_at + }); + + return ordered.map(o => senders[o.id]); + }; + + const senderPubkey = () => { + if (!params.sender) { + return ''; + } + + let pubkey = params.sender; + + if (pubkey.startsWith('npub') || pubkey.startsWith('nevent')) { + const decoded = nip19.decode(pubkey); + + if (decoded.type === 'npub') { + pubkey = decoded.data; + } + + if (decoded.type === 'nevent') { + pubkey = decoded.data.id; + } + } + + return pubkey; + + } + + createEffect(() => { + if(params.sender && currentUrl !== params.sender) { + currentUrl = params.sender; + messages?.actions.selectSender(params.sender); + } + }); + + createEffect(() => { + if (messages?.selectedSender && + currentUrl !== messages?.selectedSender?.npub + ) { + navigate(`/messages/${messages?.selectedSender.npub}`); + return; + } + }); + + createEffect(() => { + if (params.sender || !messages?.senders) { + return; + } + + const senderIds = Object.keys(messages.senders); + senderIds.length > 0 && navigate(`/messages/${messages.senders[senderIds[0]].npub}`); + return; + + }); + + createEffect(() => { + const count = messages?.messageCount || 0; + + if (account?.isKeyLookupDone && account.hasPublicKey() && count === 0) { + messages?.actions.getMessagesPerSender(); + } + }); + + createEffect(() => { + const count = messages?.messageCount || 0; + + if (count > 0) { + messages?.actions.getMessagesPerSender(); + } + }) + + createEffect(() => { + if (messages?.isConversationLoaded) { + if (conversationHolder) { + conversationHolder.scrollTop = conversationHolder.scrollHeight; + } + + // messages.actions.resetConversationLoaded(); + } + }); + + const user = (pubkey: string) => { + return messages?.senders && messages.senders[pubkey]; + } + + const mgsFromSender = (sender: PrimalUser) => { + return messages?.messageCountPerSender[sender.pubkey]?.cnt || 0; + } + + const isSelectedSender = (senderId: string) => { + return senderNpub() === senderId || senderPubkey() === senderId; + }; + + const selectSender = (senderNpub: string) => { + messages?.actions.selectSender(senderNpub); + } + + const highlightHashtags = (text: string) => { + const regex = /(?:\s|^)#[^\s!@#$%^&*(),.?":{}|<>]+/ig; + + return text.replace(regex, (token) => { + const [space, term] = token.split('#'); + const embeded = ( + + {space} + #{term} + + ); + + // @ts-ignore + return embeded.outerHTML; + }); + } + + const parseMessage = (message: string) => { + if (!messages) { + return message; + } + return parseNoteLinks( + parseNpubLinks( + highlightHashtags( + parseNote3(message) + ), + messages?.referecedUsers, + ), + messages?.referecedNotes, + messages?.referecedUsers + ); + }; + + + const getScrollHeight = (elm: AutoSizedTextArea) => { + var savedValue = elm.value + elm.value = '' + elm._baseScrollHeight = elm.scrollHeight + elm.value = savedValue + } + + const [message, setMessage] = createSignal(''); + + const onExpandableTextareaInput = () => { + const maxHeight = 800; + + const elm = newMessageInput as AutoSizedTextArea; + + if(!elm || elm.nodeName !== 'TEXTAREA') { + return; + } + + const minRows = parseInt(elm.getAttribute('data-min-rows') || '0'); + + !elm._baseScrollHeight && getScrollHeight(elm); + + + if (elm.scrollHeight >= (maxHeight / 3)) { + return; + } + + elm.rows = minRows; + const rows = elm.value === '' ? 0 : Math.ceil((elm.scrollHeight - elm._baseScrollHeight) / 20); + + elm.rows = minRows + rows; + elm.style.height = `${32 + (20 * rows)}px`; + + if (newMessageWrapper) { + newMessageWrapper.style.height = `${32 + (20 * rows)}px`; + } + + if (newMessageInputBorder) { + newMessageInputBorder.style.height = `${34 + (20 * rows)}px`; + } + + // debounce(() => { + setMessage(elm.value) + // }, 300); + + } + + + const onKeyDown = (e: KeyboardEvent) => { + if (!newMessageInput || !newMessageWrapper) { + return false; + } + + const mentionSeparators = ['Enter', 'Space', 'Comma']; + + if (!isMentioning() && !isEmojiInput() && e.code === 'Enter' && !e.shiftKey) { + e.preventDefault(); + debounce(() => { + sendMessage(); + }, 300); + + return false; + } + + if (!isMentioning() && !isEmojiInput() && e.key === ':') { + emojiCursorPosition = getCaretCoordinates(newMessageInput, newMessageInput.selectionStart); + setEmojiInput(true); + return false; + } + + if (isEmojiInput()) { + + if (e.code === 'ArrowDown') { + e.preventDefault(); + setHighlightedEmoji(i => { + if (emojiResults.length === 0) { + return 0; + } + + return i < emojiResults.length - 7 ? i + 6 : 0; + }); + + const emojiHolder = document.getElementById(`${instanceId}-${highlightedEmoji()}`); + + if (emojiHolder && emojiOptions && !isVisibleInContainer(emojiHolder, emojiOptions)) { + emojiHolder.scrollIntoView({ block: 'end', behavior: 'smooth' }); + } + + return false; + } + + if (e.code === 'ArrowUp') { + e.preventDefault(); + setHighlightedEmoji(i => { + if (emojiResults.length === 0) { + return 0; + } + + return i >= 6 ? i - 6 : emojiResults.length - 1; + }); + + const emojiHolder = document.getElementById(`${instanceId}-${highlightedEmoji()}`); + + if (emojiHolder && emojiOptions && !isVisibleInContainer(emojiHolder, emojiOptions)) { + emojiHolder.scrollIntoView({ block: 'start', behavior: 'smooth' }); + } + + return false; + } + + if (e.code === 'ArrowRight') { + e.preventDefault(); + setHighlightedEmoji(i => { + if (emojiResults.length === 0) { + return 0; + } + + return i < emojiResults.length - 1 ? i + 1 : 0; + }); + + const emojiHolder = document.getElementById(`${instanceId}-${highlightedEmoji()}`); + + if (emojiHolder && emojiOptions && !isVisibleInContainer(emojiHolder, emojiOptions)) { + emojiHolder.scrollIntoView({ block: 'end', behavior: 'smooth' }); + } + + return false; + } + + if (e.code === 'ArrowLeft') { + e.preventDefault(); + setHighlightedEmoji(i => { + if (emojiResults.length === 0) { + return 0; + } + + return i > 0 ? i - 1 : emojiResults.length - 1; + }); + + const emojiHolder = document.getElementById(`${instanceId}-${highlightedEmoji()}`); + + if (emojiHolder && emojiOptions && !isVisibleInContainer(emojiHolder, emojiOptions)) { + emojiHolder.scrollIntoView({ block: 'start', behavior: 'smooth' }); + } + + return false; + } + + if (mentionSeparators.includes(e.code)) { + if (emojiQuery().trim().length === 0) { + setEmojiInput(false); + return false; + } + e.preventDefault(); + selectEmoji(emojiResults[highlightedEmoji()]); + setHighlightedEmoji(0); + return false; + } + + const cursor = newMessageInput.selectionStart; + const lastEmojiTrigger = newMessageInput.value.slice(0, cursor).lastIndexOf(':'); + + if (e.code === 'Backspace') { + setEmojiQuery(emojiQuery().slice(0, -1)); + + if (lastEmojiTrigger < 0 || cursor - lastEmojiTrigger <= 1) { + setEmojiInput(false); + return false; + } + } else { + setEmojiQuery(q => q + e.key); + return false; + } + + // if (emojiQuery().length === 0) { + // setEmojiInput(false); + // return false; + // } + + return false; + } + + if (!isMentioning() && e.key === '@') { + mentionCursorPosition = getCaretCoordinates(newMessageInput, newMessageInput.selectionStart); + setPreQuery(''); + setQuery(''); + setMentioning(true); + return false; + } + + if (!isMentioning() && e.code === 'Backspace' && newMessageInput) { + let cursor = newMessageInput.selectionStart; + const textSoFar = newMessageInput.value.slice(0, cursor); + const lastWord = textSoFar.split(/[\s,;\n\r]/).pop(); + + if (lastWord?.startsWith('@`')) { + const index = textSoFar.lastIndexOf(lastWord); + + const newText = textSoFar.slice(0, index) + newMessageInput.value.slice(cursor); + + setMessage(newText); + newMessageInput.value = newText; + + newMessageInput.selectionEnd = index; + } + } + + if (isMentioning()) { + + if (e.code === 'ArrowDown') { + e.preventDefault(); + setHighlightedUser(i => { + if (!search?.users || search.users.length === 0) { + return 0; + } + + return i < search.users.length - 1 ? i + 1 : 0; + }); + return false; + } + + if (e.code === 'ArrowUp') { + e.preventDefault(); + setHighlightedUser(i => { + if (!search?.users || search.users.length === 0) { + return 0; + } + + return i > 0 ? i - 1 : search.users.length - 1; + }); + return false; + } + + if (mentionSeparators.includes(e.code)) { + if (preQuery().trim().length === 0) { + setMentioning(false); + return false; + } + e.preventDefault(); + search?.users && selectUser(search.users[highlightedUser()]) + setMentioning(false); + return false; + } + + const cursor = newMessageInput.selectionStart; + const lastMentionTrigger = newMessageInput.value.slice(0, cursor).lastIndexOf('@'); + + if (e.code === 'Backspace') { + setPreQuery(preQuery().slice(0, -1)); + + if (lastMentionTrigger < 0 || cursor - lastMentionTrigger <= 1) { + setMentioning(false); + return false; + } + } else { + setPreQuery(q => q + e.key); + return false + } + + // if (preQuery().length === 0) { + // setMentioning(false); + // return false; + // } + + return false; + } + + return true; + }; + + // const onKeyDown = (e: KeyboardEvent) => { + // if (!newMessageInput) { + // return false; + // } + + // if (e.code === 'Enter' && !e.shiftKey) { + // e.preventDefault(); + // debounce(() => { + // sendMessage(); + // }, 300); + + // return false; + // } + + // if (!isMentioning() && !isEmojiInput() && e.key === ':') { + // emojiCursorPosition = getCaretCoordinates(newMessageInput, newMessageInput.selectionStart); + // setEmojiInput(true); + // return false; + // } + // }; + + onMount(() => { + newMessageWrapper?.addEventListener('input', () => onExpandableTextareaInput()); + newMessageInput && newMessageInput.addEventListener('keydown', onKeyDown); + }); + + onCleanup(() => { + newMessageWrapper?.removeEventListener('input', () => onExpandableTextareaInput()); + newMessageInput && newMessageInput.removeEventListener('keydown', onKeyDown); + }); + + const sendMessage = async () => { + if (!messages?.selectedSender || + !newMessageInput || + !newMessageInputBorder || + !newMessageWrapper) { + return; + } + + const text = message().trim(); + + if (text.length === 0) { + return; + } + setMessage(''); + + const content = prepareMessageForSending(text); + + const msg = { + id: `N_M_${messages.messages.length}`, + sender: account?.publicKey || '', + content, + created_at: Math.floor((new Date()).getTime() / 1000), + }; + + const success = await messages?.actions.sendMessage(messages.selectedSender, msg); + + if (success) { + newMessageInput.value = ''; + newMessageInput.style.height = '32px'; + newMessageInputBorder.style.height = '34px'; + newMessageWrapper.style.height = '32px'; + + setTimeout(() => { + const element = document.querySelector(`[data-user="${messages?.selectedSender?.pubkey}"]`); + + if (element && sendersListElement && !isVisibleInContainer(element, sendersListElement)) { + element.scrollIntoView(); + } + }, 100); + } + }; + + const [inputFocused, setInputFocused] = createSignal(false); + + const markAllAsRead = () => { + messages?.actions.resetAllMessages(); + }; + + const sendButtonClass = () => { + return inputFocused() && message().trim().length > 0 ? styles.primaryButton : styles.secondaryButton; + }; + + const addUserToSenders = (user: PrimalUser | string) => { + if (typeof user === 'string') { + return; + } + + messages?.actions.addSender(user); + } + +// MENTIONING + + const search = useSearchContext(); + + const [isMentioning, setMentioning] = createSignal(false); + const [preQuery, setPreQuery] = createSignal(''); + const [query, setQuery] = createSignal(''); + + const [highlightedUser, setHighlightedUser] = createSignal(0); + let mentionCursorPosition = { top: 0, left: 0, height: 0 }; + + let mentionOptions: HTMLDivElement | undefined; + + const prepareMessageForSending = (text: string) => { + + return text.replace(editMentionRegex, (url) => { + + const [_, name] = url.split('\`'); + const user = userRefs[name]; + + // @ts-ignore + return ` nostr:${user.npub}`; + }) + } + + createEffect(() => { + const preQ = preQuery(); + + debounce(() => { + setQuery(() => preQ) + }, 500); + }) + + createEffect(() => { + if (query().length === 0) { + search?.actions.getRecomendedUsers(); + return; + } + + search?.actions.findUsers(query()); + }); + + createEffect(() => { + if (isMentioning()) { + + mentionPositionOptions(); + + if (search?.users && search.users.length > 0) { + setHighlightedUser(0); + } + } + }); + + + const mentionPositionOptions = () => { + if (!newMessageInput || !mentionOptions || !newMessageWrapper) { + return; + } + + const taRect = newMessageInput.getBoundingClientRect(); + + let newBottom = taRect.height - mentionCursorPosition.top; + let newLeft = mentionCursorPosition.left; + + mentionOptions.style.bottom = `${newBottom}px`; + mentionOptions.style.left = `${newLeft}px`; + }; + + const selectEmoji = (emoji: EmojiOption) => { + if (!newMessageInput) { + return; + } + + const msg = message(); + + // Get cursor position to determine insertion point + let cursor = newMessageInput.selectionStart; + + // Get index of the token and insert emoji character + const index = msg.slice(0, cursor).lastIndexOf(':'); + const value = msg.slice(0, index) + emoji.char + msg.slice(cursor); + + // Reset query, update message and text area value + setMessage(value); + newMessageInput.value = message(); + + // Calculate new cursor position + newMessageInput.selectionEnd = index + 1; + newMessageInput.focus(); + + setEmojiInput(false); + setEmojiQuery(''); + setEmojiResults(() => []); + + // Dispatch input event to recalculate UI position + // const e = new Event('input', { bubbles: true, cancelable: true}); + // newMessageInput.dispatchEvent(e); + }; + + + const [userRefs, setUserRefs] = createStore>({}); + + + const selectUser = (user: PrimalUser | undefined) => { + if (!newMessageInput || !user) { + return; + } + + setMentioning(false); + + const name = userName(user); + + setUserRefs((refs) => ({ + ...refs, + [name]: user, + })); + + const msg = message(); + + // Get cursor position to determine insertion point + let cursor = newMessageInput.selectionStart; + + // Get index of the token and inster user's handle + const index = msg.slice(0, cursor).lastIndexOf('@'); + const value = msg.slice(0, index) + `@\`${name}\`` + msg.slice(cursor); + + // Reset query, update message and text area value + setQuery(''); + setMessage(value); + newMessageInput.value = message(); + + newMessageInput.focus(); + + // Calculate new cursor position + cursor = value.slice(0, cursor).lastIndexOf('@') + name.length + 3; + newMessageInput.selectionEnd = cursor; + + + // Dispatch input event to recalculate UI position + const e = new Event('input', { bubbles: true, cancelable: true}); + newMessageInput.dispatchEvent(e); + }; + // const selectUser = (user: PrimalUser) => { + + // if (!newMessageInput) { + // return; + // } + // const name = userName(user); + + // setUserRefs((refs) => ({ + // ...refs, + // [name]: user, + // })); + + // messages?.actions.addUserReference(user); + + // let value = message(); + + // value = value.slice(0, value.lastIndexOf('@')); + + // setQuery(''); + + // setMessage(`${value}@\`${name}\` `); + // newMessageInput.value = message(); + + // newMessageInput.focus(); + + + // // Dispatch input event to recalculate UI position + // const e = new Event('input', { bubbles: true, cancelable: true}); + // newMessageInput.dispatchEvent(e); + // }; + + createEffect(() => { + if (account?.hasPublicKey()) { + profile?.actions.setProfileKey(account.publicKey) + } + }); + + createEffect(() => { + if (messages?.selectedSender) { + + const element = document.querySelector(`[data-user="${messages.selectedSender.pubkey}"]`); + + if (element && sendersListElement && !isVisibleInContainer(element, sendersListElement)) { + element.scrollIntoView(); + } + + } + }); + + createEffect(() => { + if (emojiQuery().length > emojiSearchLimit) { + setEmojiResults(() => emojiSearch(emojiQuery())); + } + }); + + createEffect(() => { + if (isEmojiInput()) { + emojiPositionOptions(); + + if (emojiResults.length > 0) { + setHighlightedEmoji(0); + } + } + }); + + const emojiPositionOptions = () => { + if (!newMessageInput || !emojiOptions || !newMessageWrapper) { + return; + } + + const taRect = newMessageInput.getBoundingClientRect(); + + let newBottom = taRect.height - emojiCursorPosition.top; + let newLeft = emojiCursorPosition.left; + + emojiOptions.style.bottom = `${newBottom}px`; + emojiOptions.style.left = `${newLeft}px`; + }; + + + const onInput = () => { + newMessageInput && setMessage(newMessageInput.value) + } + + return ( +
+ + + + + + {}} + noLinks={true} + hideDefault={true} + onUserSelect={addUserToSenders} + /> + + +
+
+ {intl.formatMessage(tMessages.title)} +
+
+ +
+ +
+
+ +
+ +
+ +
+ +
+ + { + (sender) => ( + + ) + } + +
+ +
+
+
+ +
+ + + +
+ + {(user, index) => ( + } + statNumber={search?.scores[user.pubkey]} + statLabel={intl.formatMessage(tSearch.followers)} + onClick={() => selectUser(user)} + highlighted={highlightedUser() === index()} + /> + )} + +
+
+ + emojiSearchLimit}> +
+ + {(emoji, index) => ( + + )} + +
+
+
+
+ + + {messages?.isConversationLoaded ? + <> : + + } + } + > + {(thread) => ( + + + + +
+ + {(msg) => ( +
+ )} +
+
+ +
+ {date(thread.messages[0].created_at, 'long', messages?.now).label} +
+
+
+ } + > +
+ + + +
+ + {(msg) => ( +
+ )} +
+
+ +
+ {date(thread.messages[0].created_at, 'long', messages?.now).label} +
+
+
+ + )} + + + + +
+
+
+ + ); +} + +export default Messages; diff --git a/src/pages/NotFound.module.scss b/src/pages/NotFound.module.scss new file mode 100644 index 0000000..47a93f3 --- /dev/null +++ b/src/pages/NotFound.module.scss @@ -0,0 +1,3 @@ +.message { + color: var(--text-secondary) +} diff --git a/src/pages/NotFound.tsx b/src/pages/NotFound.tsx new file mode 100644 index 0000000..63503d7 --- /dev/null +++ b/src/pages/NotFound.tsx @@ -0,0 +1,21 @@ +import { useIntl } from '@cookbook/solid-intl'; +import { Component } from 'solid-js'; +import MissingPage from '../components/MissingPage/MissingPage'; +import { placeholders } from '../translations'; + +import styles from './NotFound.module.scss'; + +const NotFound: Component = () => { + + const intl = useIntl(); + + return ( + +

+ {intl.formatMessage(placeholders.pageNotFound)} +

+
+ ); +} + +export default NotFound; diff --git a/src/pages/Notifications.module.scss b/src/pages/Notifications.module.scss new file mode 100644 index 0000000..f7142ac --- /dev/null +++ b/src/pages/Notifications.module.scss @@ -0,0 +1,95 @@ +.fullHeader { + display: grid; + height: 120px; + align-items: center; + justify-content: left; + + >div { + font-weight: 300; + font-size: 32px; + line-height: 34px; + color: var(--brand-text); + text-transform: lowercase; + } +} + +.separator { + width: 100%; + height: 1px; + background-color: var(--text-primary); +} + +.oldNotifications { + position: relative; +} + +.loader { + margin-top: 120px; + position: relative; +} + +.newContentNotification { + position: fixed; + top: 42px; + left: calc(calc(100vw - 1240px) / 2 + 176px + 32px); + width: 640px; + z-index: 20; + display: flex; + justify-content: center; + + >button { + display: flex; + align-items: center; + justify-content: center; + width: auto; + height: 40px; + background: var(--brand-gradient); + font-weight: 400; + font-size: 14px; + line-height: 18px; + border: none; + border-radius: 20px; + padding-block: 0; + padding-left: 2px; + margin: 0; + + .avatars { + display: flex; + align-items: center; + height: 40px; + .avatar { + border: solid 2px var(--text-primary); + border-radius: 50%; + width: 36px; + height: 36px; + transition: margin-right 0.2s; + margin-right: -16px; + } + } + + .counter { + margin-left: 24px; + } + } + +} + +@media only screen and (max-width: 1300px) { + .newContentNotification { + left: calc(calc(100vw - 1032px) / 2 + 48px + 32px); + } +} + +@media only screen and (max-width: 1087px) { + .newContentNotification { + left: calc(calc(100vw - 720px) / 2 + 48px + 32px); + } +} + +@media only screen and (max-width: 720px) { + .newContentNotification { + left: 0; + width: 100%; + justify-content: center; + } +} diff --git a/src/pages/Notifications.tsx b/src/pages/Notifications.tsx new file mode 100644 index 0000000..f7c6922 --- /dev/null +++ b/src/pages/Notifications.tsx @@ -0,0 +1,1154 @@ +import { useIntl } from '@cookbook/solid-intl'; +import { useSearchParams } from '@solidjs/router'; +import { nip19 } from 'nostr-tools'; +import { Component, createEffect, createMemo, createSignal, For, onCleanup, Show } from 'solid-js'; +import { createStore } from 'solid-js/store'; +import { APP_ID } from '../App'; +import Branding from '../components/Branding/Branding'; +import Loader from '../components/Loader/Loader'; +import NotificationItem from '../components/Notifications/NotificationItem'; +import NotificationItem2 from '../components/Notifications/NotificationItem2'; +import NotificationsSidebar from '../components/NotificatiosSidebar/NotificationsSidebar'; +import Paginator from '../components/Paginator/Paginator'; +import Search from '../components/Search/Search'; +import StickySidebar from '../components/StickySidebar/StickySidebar'; +import Wormhole from '../components/Wormhole/Wormhole'; +import { Kind, minKnownProfiles, NotificationType, notificationTypeUserProps } from '../constants'; +import { useAccountContext } from '../contexts/AccountContext'; +import { useNotificationsContext } from '../contexts/NotificationsContext'; +import { getLastSeen, getNotifications, getOldNotifications, setLastSeen, truncateNumber } from '../lib/notifications'; +import { subscribeTo } from '../sockets'; +import { convertToNotes } from '../stores/note'; +import { convertToUser, emptyUser } from '../stores/profile'; +import { FeedPage, NostrMentionContent, NostrNoteActionsContent, NostrNoteContent, NostrStatsContent, NostrUserContent, NostrUserStatsContent, NoteActions, PrimalNote, PrimalNotification, PrimalNotifUser, PrimalUser, SortedNotifications } from '../types/primal'; +import { notifications as t } from '../translations'; + +import styles from './Notifications.module.scss'; + +const Notifications: Component = () => { + + const account = useAccountContext(); + const notifications = useNotificationsContext(); + const intl = useIntl(); + + const [queryParams, setQueryParams] = useSearchParams(); + + const [notifSince, setNotifSince] = createSignal(); + + const [sortedNotifications, setSortedNotifications] = createStore({}); + + const [users, setUsers] = createStore>({}); + + const [userStats, setUserStats] = createStore>({}); + + const [allSet, setAllSet] = createSignal(false); + const [fetchingOldNotifs, setfetchingOldNotifs] = createSignal(false); + + + const newNotifCount = () => { + if (!notifications?.notificationCount) { + return 0; + } + + if (notifications.notificationCount > 100) { + return 100; + } + + return notifications.notificationCount; + }; + + type NotificationStore = { + notes: PrimalNote[], + users: PrimalUser[], + page: FeedPage, + reposts: Record | undefined, + } + + type OldNotificationStore = { + notes: PrimalNote[], + users: Record, + userStats: Record, + page: FeedPage & { notifications: PrimalNotification[]}, + reposts: Record | undefined, + notifications: PrimalNotification[], + } + + const [relatedNotes, setRelatedNotes] = createStore({ + notes: [], + users: [], + page: { messages: [], users: {}, postStats: {}, mentions: {}, noteActions: {} }, + reposts: {}, + }) + + const [oldNotifications, setOldNotifications] = createStore({ + notes: [], + users: {}, + userStats: {}, + page: { messages: [], users: {}, postStats: {}, notifications: [], mentions: {}, noteActions: {} }, + reposts: {}, + notifications: [], + }) + + const hasNewNotifications = createMemo(() => { + return Object.keys(sortedNotifications).length > 0; + }); + + const publicKey = () => { + const user = queryParams.user; + if (user) { + if (minKnownProfiles.names[user]) { + return minKnownProfiles.names[user]; + } + + if (user.startsWith('npub')) { + return nip19.decode(user).data; + } + + return user; + } + + return account?.publicKey; + } + + createEffect(() => { + const pk = publicKey(); + if (pk) { + const subid = `notif_ls_${APP_ID}` + + const unsub = subscribeTo(subid, async (type, _, content) => { + if (type === 'EVENT' && content?.kind === Kind.Timestamp) { + + const timestamp = parseInt(content.content); + + if (!isNaN(timestamp)) { + setNotifSince(timestamp); + } + + unsub(); + return; + } + + if (type === 'EOSE') { + if (!notifSince()) { + setNotifSince(0); + } + } + + }); + + getLastSeen(pk as string, subid); + } + }); + + createEffect(() => { + if (account?.hasPublicKey() && publicKey() === account.publicKey) { + const subid = `notif_sls_${APP_ID}`; + + const unsub = subscribeTo(subid, async (type, _, content) => { + if (type === 'EOSE') { + unsub(); + return; + } + + if (type === 'NOTICE') { + console.log('Error setting notifications lats seen'); + unsub(); + return; + } + + }); + + setTimeout(() => { + setLastSeen(subid, Math.floor((new Date()).getTime() / 1000)); + }, 1000); + + } + }); + + let newNotifs: Record = {}; + + // Fetch new notifications + const fetchNewNotifications = (pk: string) => { + const subid = `notif_${APP_ID}` + + const unsub = subscribeTo(subid, async (type, _, content) => { + if (type === 'EVENT') { + if (!content?.content) { + return; + } + + if (content.kind === Kind.Notification) { + + const notif = JSON.parse(content.content) as PrimalNotification; + + if (newNotifs[notif.type]) { + newNotifs[notif.type].push(notif); + } + else { + newNotifs[notif.type] = [notif]; + } + + return; + } + + if (content.kind === Kind.Metadata) { + const user = content as NostrUserContent; + + setUsers((usrs) => ({ ...usrs, [user.pubkey]: { ...user } })); + + setRelatedNotes('page', 'users', + (usrs) => ({ ...usrs, [user.pubkey]: { ...user } }) + ); + return; + } + + if (content.kind === Kind.UserStats) { + const stat = content as NostrUserStatsContent; + const statContent = JSON.parse(content.content); + + setUserStats((stats) => ({ ...stats, [stat.pubkey]: { ...statContent } })); + return; + } + + if ([Kind.Text, Kind.Repost].includes(content.kind)) { + const message = content as NostrNoteContent; + + setRelatedNotes('page', 'messages', + (msgs) => [ ...msgs, { ...message }] + ); + + return; + } + + if (content.kind === Kind.NoteStats) { + const statistic = content as NostrStatsContent; + const stat = JSON.parse(statistic.content); + + setRelatedNotes('page', 'postStats', + (stats) => ({ ...stats, [stat.event_id]: { ...stat } }) + ); + return; + } + + if (content.kind === Kind.Mentions) { + const mentionContent = content as NostrMentionContent; + const mention = JSON.parse(mentionContent.content); + + setRelatedNotes('page', 'mentions', + (mentions) => ({ ...mentions, [mention.id]: { ...mention } }) + ); + return; + } + + if (content.kind === Kind.NoteActions) { + const noteActionContent = content as NostrNoteActionsContent; + const noteActions = JSON.parse(noteActionContent.content) as NoteActions; + + setRelatedNotes('page', 'noteActions', + (actions) => ({ ...actions, [noteActions.event_id]: { ...noteActions } }) + ); + return; + } + + } + + if (type === 'EOSE') { + setSortedNotifications(() => newNotifs); + setRelatedNotes('notes', () => [...convertToNotes(relatedNotes.page)]) + setAllSet(true); + unsub(); + return; + } + + }); + + const since = queryParams.ignoreLastSeen ? 0 : notifSince(); + + newNotifs = {}; + getNotifications(account?.publicKey, pk as string, subid, since); + + }; + + createEffect(() => { + const pk = publicKey(); + + if (!pk || notifSince() === undefined) { + return; + } + + fetchNewNotifications(pk as string); + }); + + onCleanup(() => { + setLastNotification(undefined); + setOldNotifications('notifications', []); + setOldNotifications('page', () => ({ messages: [], users: {}, postStats: {}, notifications: [] })); + setNotifSince(0); + setSortedNotifications({}) + }); + + const sortNotifByRecency = (notifs: PrimalNotification[]) => { + return notifs.sort((a: PrimalNotification, b: PrimalNotification) => { + return b.created_at - a.created_at; + }); + } + + const fetchOldNotifications = (until: number) => { + const subid = `notif_old_${APP_ID}` + + const unsub = subscribeTo(subid, async (type, _, content) => { + if (type === 'EVENT') { + if (!content?.content) { + return; + } + + if (content.kind === Kind.Notification) { + const notif = JSON.parse(content.content) as PrimalNotification; + + const isLastNotif = + lastNotification()?.created_at === notif.created_at && + lastNotification()?.type === notif.type; + + if (!isLastNotif) { + setOldNotifications('page', 'notifications', + (notifs) => notifs ? [ ...notifs, notif] : [notif], + ); + } + + return; + } + + if (content.kind === Kind.Metadata) { + const user = content as NostrUserContent; + + setOldNotifications('page', 'users', (usrs) => ({ ...usrs, [user.pubkey]: { ...user } })); + return; + } + + if (content.kind === Kind.UserStats) { + const stat = content as NostrUserStatsContent; + const statContent = JSON.parse(content.content); + + setOldNotifications('userStats', (stats) => ({ ...stats, [stat.pubkey]: { ...statContent } })); + return; + } + + if ([Kind.Text, Kind.Repost].includes(content.kind)) { + const message = content as NostrNoteContent; + + setOldNotifications('page', 'messages', + (msgs) => [ ...msgs, { ...message }] + ); + + return; + } + + if (content.kind === Kind.NoteStats) { + const statistic = content as NostrStatsContent; + const stat = JSON.parse(statistic.content); + + setOldNotifications('page', 'postStats', + (stats) => ({ ...stats, [stat.event_id]: { ...stat } }) + ); + return; + } + + if (content.kind === Kind.Mentions) { + const mentionContent = content as NostrMentionContent; + const mention = JSON.parse(mentionContent.content); + + setOldNotifications('page', 'mentions', + (mentions) => ({ ...mentions, [mention.id]: { ...mention } }) + ); + return; + } + + if (content.kind === Kind.NoteActions) { + const noteActionContent = content as NostrNoteActionsContent; + const noteActions = JSON.parse(noteActionContent.content) as NoteActions; + + setOldNotifications('page', 'noteActions', + (actions) => ({ ...actions, [noteActions.event_id]: { ...noteActions } }) + ); + return; + } + + } + + if (type === 'EOSE') { + + // Sort notifications + const notifs = [...oldNotifications.page.notifications]; + + const sorted = sortNotifByRecency(notifs); + + setOldNotifications('notifications', (notifs) => [ ...notifs, ...sorted]) + + // Convert related notes + setOldNotifications('notes', (notes) => [...notes, ...convertToNotes(oldNotifications.page)]) + + const pageUsers = oldNotifications.page.users; + + const newUsers = Object.keys(pageUsers).reduce((acc, key) => { + return { ...acc, [pageUsers[key].pubkey]: { ...convertToUser(pageUsers[key])}}; + }, {}); + + setOldNotifications('users', (users) => ({ ...users, ...newUsers })); + + setfetchingOldNotifs(false); + unsub(); + return; + } + + }); + + setOldNotifications('page', () => ({ messages: [], users: {}, postStats: {}, notifications: [] })); + + const pk = publicKey(); + + if (pk) { + setfetchingOldNotifs(true); + getOldNotifications(account?.publicKey, pk as string, subid, until); + } + + } + + // Fetch old notifications + createEffect(() => { + if (account?.hasPublicKey() && !queryParams.ignoreLastSeen && notifSince() !== undefined) { + fetchOldNotifications(notifSince() || 0); + } + }); + + const getUsers = ( + notifs: PrimalNotification[], + type: NotificationType, + ) => { + const knownUsers = Object.keys(users); + const userProp = notificationTypeUserProps[type]; + + const pks = notifs.reduce((acc, n) => { + // @ts-ignore + const pubkey = n[userProp]; + + if (!pubkey) { + return acc; + } + return acc.includes(pubkey) ? acc : [...acc, pubkey]; + }, []); + + return pks.map((pk) => { + const user = knownUsers.includes(pk) ? + convertToUser(users[pk]) : + emptyUser(pk); + + return { ...user, ...userStats[pk]} as PrimalNotifUser; + }); + } + + const groupBy = (notifs: PrimalNotification[], keyName: string) => { + return notifs.reduce>( + (group: Record, notif) => { + // @ts-ignore + const key: string = notif[keyName] || 'none'; + + group[key] = group[key] ?? []; + group[key].push(notif); + + return group; + }, + {}, + ); + }; + + const newUserFollowedYou = () => { + const type = NotificationType.NEW_USER_FOLLOWED_YOU; + const notifs = sortedNotifications[type]; + + if (!notifs) { + return; + } + + return + }; + + const userUnfollowedYou = () => { + const type = NotificationType.USER_UNFOLLOWED_YOU; + const notifs = sortedNotifications[type]; + + if (!notifs) { + return; + } + + return + }; + + const yourPostWasLiked = () => { + const type = NotificationType.YOUR_POST_WAS_LIKED; + const notifs = sortedNotifications[type] || []; + + const grouped = groupBy(notifs, 'your_post'); + + const keys = Object.keys(grouped); + + return + {key => { + return ( + n.post.id === key)} + /> + )}} + + }; + + // + const yourPostWasReposted = () => { + const type = NotificationType.YOUR_POST_WAS_REPOSTED; + const notifs = sortedNotifications[type] || []; + + const grouped = groupBy(notifs, 'your_post'); + + const keys = Object.keys(grouped); + + return + {key => { + return ( + n.post.id === key)} + /> + )} + } + + }; + + const yourPostWasRepliedTo = () => { + const type = NotificationType.YOUR_POST_WAS_REPLIED_TO; + const notifs = sortedNotifications[type] || []; + + const grouped = groupBy(notifs, 'reply'); + + const keys = Object.keys(grouped); + + + return + {key => { + return ( + n.post.id === key)} + /> + )} + } + + }; + + const yourPostWasZapped = () => { + const type = NotificationType.YOUR_POST_WAS_ZAPPED; + const notifs = sortedNotifications[type] || []; + + const grouped = groupBy(notifs, 'your_post'); + + const keys = Object.keys(grouped); + + return + {key => { + const sats = grouped[key].reduce((acc, n) => { + return n.satszapped ? acc + n.satszapped : acc; + },0); + + return ( + n.post.id === key)} + iconInfo={`${truncateNumber(sats)}`} + iconTooltip={`${sats} sats`} + /> + )} + } + + }; + + const youWereMentioned = () => { + const type = NotificationType.YOU_WERE_MENTIONED_IN_POST; + const notifs = sortedNotifications[type] || []; + + const grouped = groupBy(notifs, 'you_were_mentioned_in'); + + const keys = Object.keys(grouped); + + const notes = relatedNotes.notes.filter(n => keys.includes(n.post.id)); + + if (notes.length === 0) { + return; + } + + const knownUsers = Object.keys(users); + + const rUsers: Record = notes.reduce((acc, note) => { + const pk = note.user.pubkey; + + const rUser = knownUsers.includes(pk) ? + convertToUser(users[pk]) : + emptyUser(pk); + + const usrs = [{...rUser, ...userStats[pk]}]; + + return { ...acc, [note.post.id]: usrs}; + + }, {}); + + + return + {key => { + return ( + n.post.id === key)} + /> + )} + } + + }; + + const yourPostWasMentioned = () => { + const type = NotificationType.YOUR_POST_WAS_MENTIONED_IN_POST; + const notifs = sortedNotifications[type] || []; + + const grouped = groupBy(notifs, 'your_post_were_mentioned_in'); + + const keys = Object.keys(grouped); + + + const notes = relatedNotes.notes.filter(n => keys.includes(n.post.id)); + + if (notes.length === 0) { + return; + } + + const knownUsers = Object.keys(users); + + const rUsers: Record = notes.reduce((acc, note) => { + const pk = note.user.pubkey; + + const rUser = knownUsers.includes(pk) ? + convertToUser(users[pk]) : + emptyUser(pk); + + const usrs = [{...rUser, ...userStats[pk]}]; + + return { ...acc, [note.post.id]: usrs}; + + }, {}); + + + return + {key => { + return ( + n.post.id === key)} + /> + )} + } + + }; + + const postYouWereMentionedInWasLiked = () => { + const type = NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_LIKED; + const notifs = sortedNotifications[type] || []; + + const grouped = groupBy(notifs, 'post_you_were_mentioned_in'); + + const keys = Object.keys(grouped); + + + const notes = relatedNotes.notes.filter(n => keys.includes(n.post.id)); + + if (notes.length === 0) { + return; + } + + const knownUsers = Object.keys(users); + + const rUsers: Record = notes.reduce((acc, note) => { + const pk = note.user.pubkey; + + const rUser = knownUsers.includes(pk) ? + convertToUser(users[pk]) : + emptyUser(pk); + + const usrs = [{...rUser, ...userStats[pk]}]; + + return { ...acc, [note.post.id]: usrs}; + + }, {}); + + + return + {key => { + return ( + n.post.id === key)} + /> + )} + } + + }; + + const postYouWereMentionedInWasZapped = () => { + const type = NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_ZAPPED; + const notifs = sortedNotifications[type] || []; + + const grouped = groupBy(notifs, 'post_you_were_mentioned_in'); + + const keys = Object.keys(grouped); + + + const notes = relatedNotes.notes.filter(n => keys.includes(n.post.id)); + + if (notes.length === 0) { + return; + } + + const knownUsers = Object.keys(users); + + const rUsers: Record = notes.reduce((acc, note) => { + const pk = note.user.pubkey; + + const rUser = knownUsers.includes(pk) ? + convertToUser(users[pk]) : + emptyUser(pk); + + const usrs = [{...rUser, ...userStats[pk]}]; + + return { ...acc, [note.post.id]: usrs}; + + }, {}); + + + return + {key => { + const sats = grouped[key].reduce((acc, n) => { + return n.satszapped ? acc + n.satszapped : acc; + },0); + return ( + n.post.id === key)} + iconInfo={`${truncateNumber(sats)}`} + iconTooltip={`${sats} sats`} + /> + )} + } + + }; + + const postYouWereMentionedInWasReposted = () => { + const type = NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_REPOSTED; + const notifs = sortedNotifications[type] || []; + + const grouped = groupBy(notifs, 'post_you_were_mentioned_in'); + + const keys = Object.keys(grouped); + + const notes = relatedNotes.notes.filter(n => keys.includes(n.post.id)); + + if (notes.length === 0) { + return; + } + + const knownUsers = Object.keys(users); + + const rUsers: Record = notes.reduce((acc, note) => { + const pk = note.user.pubkey; + + const rUser = knownUsers.includes(pk) ? + convertToUser(users[pk]) : + emptyUser(pk); + + const usrs = [{...rUser, ...userStats[pk]}]; + + return { ...acc, [note.post.id]: usrs}; + + }, {}); + + + return + {key => { + return ( + n.post.id === key)} + /> + )} + } + + }; + + const postYouWereMentionedInWasRepliedTo = () => { + const type = NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_REPLIED_TO; + const notifs = sortedNotifications[type] || []; + + const grouped = groupBy(notifs, 'reply'); + + const keys = Object.keys(grouped); + + const notes = relatedNotes.notes.filter(n => keys.includes(n.post.id)); + + if (notes.length === 0) { + return; + } + + const knownUsers = Object.keys(users); + + const rUsers: Record = notes.reduce((acc, note) => { + const pk = note.user.pubkey; + + const rUser = knownUsers.includes(pk) ? + convertToUser(users[pk]) : + emptyUser(pk); + + const usrs = [{...rUser, ...userStats[pk]}]; + + return { ...acc, [note.post.id]: usrs}; + + }, {}); + + + return + {key => { + return ( + n.post.id === key)} + /> + )} + } + + }; + + + const postYourPostWasMentionedInWasLiked = () => { + const type = NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_LIKED; + const notifs = sortedNotifications[type] || []; + + const grouped = groupBy(notifs, 'post_your_post_was_mentioned_in'); + + const keys = Object.keys(grouped); + + const notes = relatedNotes.notes.filter(n => keys.includes(n.post.id)); + + if (notes.length === 0) { + return; + } + + const knownUsers = Object.keys(users); + + const rUsers: Record = notes.reduce((acc, note) => { + const pk = note.user.pubkey; + + const rUser = knownUsers.includes(pk) ? + convertToUser(users[pk]) : + emptyUser(pk); + + const usrs = [{...rUser, ...userStats[pk]}]; + + return { ...acc, [note.post.id]: usrs}; + + }, {}); + + + return + {key => { + return ( + n.post.id === key)} + /> + )} + } + + }; + + const postYourPostWasMentionedInWasZapped = () => { + const type = NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_ZAPPED; + const notifs = sortedNotifications[type] || []; + + const grouped = groupBy(notifs, 'post_your_post_was_mentioned_in'); + + const keys = Object.keys(grouped); + + const notes = relatedNotes.notes.filter(n => keys.includes(n.post.id)); + + if (notes.length === 0) { + return; + } + + const knownUsers = Object.keys(users); + + const rUsers: Record = notes.reduce((acc, note) => { + const pk = note.user.pubkey; + + const rUser = knownUsers.includes(pk) ? + convertToUser(users[pk]) : + emptyUser(pk); + + const usrs = [{...rUser, ...userStats[pk]}]; + + return { ...acc, [note.post.id]: usrs}; + + }, {}); + + + return + {key => { + const sats = grouped[key].reduce((acc, n) => { + return n.satszapped ? acc + n.satszapped : acc; + },0); + return ( + n.post.id === key)} + iconInfo={`${truncateNumber(sats)}`} + iconTooltip={`${sats} sats`} + /> + )} + } + + }; + + const postYourPostWasMentionedInWasReposted = () => { + const type = NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPOSTED; + const notifs = sortedNotifications[type] || []; + + const grouped = groupBy(notifs, 'post_your_post_was_mentioned_in'); + + const keys = Object.keys(grouped); + + const notes = relatedNotes.notes.filter(n => keys.includes(n.post.id)); + + if (notes.length === 0) { + return; + } + + const knownUsers = Object.keys(users); + + const rUsers: Record = notes.reduce((acc, note) => { + const pk = note.user.pubkey; + + const rUser = knownUsers.includes(pk) ? + convertToUser(users[pk]) : + emptyUser(pk); + + const usrs = [{...rUser, ...userStats[pk]}]; + + return { ...acc, [note.post.id]: usrs}; + + }, {}); + + + return + {key => { + return ( + n.post.id === key)} + /> + )} + } + + }; + + const postYourPostWasMentionedInWasRepliedTo = () => { + const type = NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPLIED_TO; + const notifs = sortedNotifications[type] || []; + + const grouped = groupBy(notifs, 'reply'); + + const keys = Object.keys(grouped); + + const notes = relatedNotes.notes.filter(n => keys.includes(n.post.id)); + + if (notes.length === 0) { + return; + } + + const knownUsers = Object.keys(users); + + const rUsers: Record = notes.reduce((acc, note) => { + const pk = note.user.pubkey; + + const rUser = knownUsers.includes(pk) ? + convertToUser(users[pk]) : + emptyUser(pk); + + const usrs = [{...rUser, ...userStats[pk]}]; + + return { ...acc, [note.post.id]: usrs}; + + }, {}); + + + return + {key => { + return ( + n.post.id === key)} + /> + )} + } + + }; + + const [lastNotification, setLastNotification] = createSignal(); + + const fetchMoreNotifications = () => { + const lastNotif = oldNotifications.notifications[oldNotifications.notifications.length - 1]; + + if (!lastNotif || lastNotif.created_at === lastNotification()?.created_at) { + return; + } + + setLastNotification(lastNotif); + + const until = lastNotif.created_at; + + if (until > 0) { + fetchOldNotifications(until); + } + } + + const loadNewContent = () => { + fetchNewNotifications(publicKey() as string); + setLastSeen(`notif_sls_${APP_ID}`, Math.floor((new Date()).getTime() / 1000)); + } + + return ( +
+ + + + + + + + +
+
+ {intl.formatMessage(t.title)} +
+
+ + + 0 && !account?.showNewNoteForm}> +
+ +
+
+ + + + +
+ } + > + + + + + {newUserFollowedYou()} + {userUnfollowedYou()} + + {yourPostWasZapped()} + + {yourPostWasRepliedTo()} + {yourPostWasReposted()} + {yourPostWasLiked()} + + {youWereMentioned()} + {yourPostWasMentioned()} + + {postYouWereMentionedInWasZapped()} + {postYouWereMentionedInWasRepliedTo()} + {postYouWereMentionedInWasReposted()} + {postYouWereMentionedInWasLiked()} + + {postYourPostWasMentionedInWasZapped()} + {postYourPostWasMentionedInWasRepliedTo()} + {postYourPostWasMentionedInWasReposted()} + {postYourPostWasMentionedInWasLiked()} + + +
+
+ + +
+ +
+
+ + 0}> +
+ + {notif => ( + + )} + + +
+
+ + + + ); +} + +export default Notifications; diff --git a/src/pages/Profile.module.scss b/src/pages/Profile.module.scss new file mode 100644 index 0000000..2b5c8ed --- /dev/null +++ b/src/pages/Profile.module.scss @@ -0,0 +1,418 @@ +.fullHeader { + position: relative; + background-color: var(--background-card); + padding-bottom: 20px; + border-radius: 0 0 8px 8px; +} + +.banner { + width: 100%; + height: 214px; + + >img { + width: 100%; + height: 214px; + object-fit: cover; + } +} + +.userImage { + position: absolute; + top: 148px; + left: 15px; + .avatar { + border: solid 4px var(--background-card); + border-radius: 50%; + background-color: var(--background-card); + } +} + +.verifiedIconL { + width: 22px; + height: 22px; + display: inline-block; + margin: 0px 12px 0px 6px; + background-color: var(--accent-2); + -webkit-mask: url(../assets/icons/verified.svg) no-repeat 0px / 22px; + mask: url(../assets/icons/verified.svg) no-repeat 0px / 22px; +} + +.verifiedIconS { + width: 12px; + height: 12px; + display: inline-block; + margin: 0px 2px; + background-color: var(--text-tertiary-2); + -webkit-mask: url(../assets/icons/verified.svg) no-repeat 0px / 12px; + mask: url(../assets/icons/verified.svg) no-repeat 0px / 12px; +} + +.keyIcon { + min-width: 16px; + height: 16px; + display: inline-block; + margin: 0px; + background-color: var(--text-tertiary-2); + -webkit-mask: url(../assets/icons/key.svg) no-repeat 0 0 / 16px 16px; + mask: url(../assets/icons/key.svg) no-repeat 0 0 / 16px 16px; +} + +.copyIcon { + width: 16px; + height: 16px; + display: inline-block; + margin: 0px 2px; + background-color: var(--text-tertiary-2); + -webkit-mask: url(../assets/icons/copy.svg) no-repeat 0 0 / 16px 16px; + mask: url(../assets/icons/copy.svg) no-repeat 0 0 / 16px 16px; +} + +.linkIcon { + width: 16px; + height: 16px; + display: inline-block; + margin: 0px 6px 0px 0px; + background-color: var(--text-tertiary-2); + -webkit-mask: url(../assets/icons/link.svg) no-repeat 0 0 / 16px 16px; + mask: url(../assets/icons/link.svg) no-repeat 0 0 / 16px 16px; +} + +.profileActions { + display: flex; + justify-content: right; + padding-top: 20px; + padding-right: 8px; + padding-bottom: 36px; +} + +@mixin smallButton { + display: flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + border: none; + border-radius: 6px; + margin: 0px 6px; + padding: 0px; +} + +.smallSecondaryButton { + @include smallButton(); + + background-color: var(--background-card); + background: linear-gradient(var(--background-card), var(--background-card)) padding-box, + var(--brand-gradient-vertical) border-box; + border: 1px solid transparent; +} + +.smallPrimaryButton { + @include smallButton(); + background: var(--brand-gradient-vertical); + + .addFeedIcon { + background-color: white; + } +} + +.zapIcon { + width: 18px; + height: 18px; + display: inline-block; + margin: 0px; + background-color: var(--text-secondary); + -webkit-mask: url(../assets/icons/zaps.svg) no-repeat 0px / 18px; + mask: url(../assets/icons/zaps.svg) no-repeat 0px / 18px; +} + +.messageIcon { + width: 18px; + height: 18px; + display: inline-block; + margin: 0px; + background-color: var(--text-secondary); + -webkit-mask: url(../assets/icons/messages.svg) no-repeat 0px / 18px; + mask: url(../assets/icons/messages.svg) no-repeat 0px / 18px; +} + +.addFeedIcon { + width: 18px; + height: 18px; + display: inline-block; + margin: 0px; + background-color: var(--text-secondary); + -webkit-mask: url(../assets/icons/feed_add.svg) no-repeat 0px / 18px; + mask: url(../assets/icons/feed_add.svg) no-repeat 0px / 18px; +} + +.removeFeedIcon { + width: 18px; + height: 18px; + display: inline-block; + margin: 0px; + background-color: var(--text-secondary); + -webkit-mask: url(../assets/icons/feed_remove.svg) no-repeat 0px / 18px; + mask: url(../assets/icons/feed_remove.svg) no-repeat 0px / 18px; +} + +.primaryButton { + width: 90px; + height: 40px; + border: none; + border-radius: 6px; + margin: 0px 8px; + padding: 0px; + font-size: 16px; + line-height: 20px; + font-weight: 700; + background: var(--brand-gradient-vertical); + color: white; +} + + +.profileVerification { + margin-top: 12px; + margin-inline: 20px; + .avatarName { + display: flex; + align-items: center; + color: var(--text-primary); + font-size: 20px; + line-height: 20px; + font-weight: 700; + height: 26px; + } + .verificationInfo { + display: flex; + align-items: center; + color: var(--text-tertiary-2); + font-weight: 400; + font-size: 12px; + line-height: 16px; + margin-top: 10px; + .verified { + display: flex; + align-items: center; + .nip05 { + margin-right: 36px; + } + } + } + .publicKey { + display: flex; + height: 16px; + align-items: center; + color: var(--text-tertiary-2); + font-weight: 400; + font-size: 12px; + line-height: 16px; + + .npub { + color: var(--text-tertiary-2); + text-align: left; + border: none; + margin: 0; + padding: 0; + background-color: unset; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + font-weight: 400; + font-size: 12px; + line-height: 16px; + display: flex; + + .copyIcon { + background-color: var(--accent-2); + } + + &:hover { + .copyIcon { + background-color: var(--text-primary); + } + } + } + } + +} + +.profileLinks { + display: flex; + align-items: center; + justify-content: space-between; + margin-inline: 20px; + margin-block: 12px; + + .website { + font-weight: 400; + font-size: 14px; + line-height: 20px; + display: flex; + align-items: center; + } + + .joined { + font-weight: 400; + font-size: 14px; + line-height: 20px; + text-align: right; + color: var(--text-tertiary-2); + } +} + +.profileAbout { + margin-top: 12px; + margin-inline: 20px; + font-weight: 400; + font-size: 14px; + line-height: 20px; + color: var(--text-primary); +} + +.userStats { + display: flex; + justify-content: left; + align-items: center; + margin-inline: 20px; + + .userStat { + display: flex; + justify-content: left; + align-items: baseline; + margin-right: 28px; + + .statNumber { + font-weight: 400; + font-size: 34px; + line-height: 34px; + color: var(--text-primary); + } + + .statName { + font-weight: 300; + font-size: 16px; + line-height: 19px; + color: var(--text-tertiary-2); + margin-left: 8px; + text-transform: lowercase; + } + + } +} + +.userFeed { + position: relative; +} + +.bannerPlaceholder { + width: 100%; + height: 214px; + background-color: var(--background-input); +} + +.followsBadge { + background-color: var(--background-input); + width: 80px; + height: 16px; + border-radius: 4px; + font-weight: 300; + font-size: 12px; + line-height: 16px; + color: var(--text-tertiary-2); + text-transform: lowercase; + display: flex; + align-items: center; + justify-content: center; +} + +.phoneAvatar { + display: none; +} +.desktopAvatar { + display: block; +} +.addToFeedButton { + display: block; +} + +@media only screen and (max-width: 720px) { + + .banner { + width: 100%; + height: 125px; + + >img { + width: 100%; + height: 125px; + object-fit: cover; + } + } + + .userImage { + position: absolute; + top: 96px; + left: 15px; + } + + .phoneAvatar { + display: block; + } + .desktopAvatar { + display: none; + } + .addToFeedButton { + display: none; + } + .joined { + display: none; + } + + .profileActions { + padding-top: 12px; + padding-bottom: 0px; + } + + .userStats { + justify-content: space-between; + .userStat { + margin-right: 15px; + flex-direction: column; + justify-content: center; + align-items: center; + + .statNumber { + font-size: 28px; + line-height: 34px; + } + + .statName { + font-size: 14px; + line-height: 16px; + } + + } + } + + .profileVerification { + .verificationInfo { + flex-direction: column; + justify-content: flex-start; + align-items: start; + >div { + margin-bottom: 12px; + font-weight: 400; + font-size: 14px; + line-height: 16px; + } + } + } + .profileAbout { + margin-top: 0px; + } +} + +.cacheFlag { + img { + border: 1px solid red; + } +} diff --git a/src/pages/Profile.tsx b/src/pages/Profile.tsx new file mode 100644 index 0000000..6128402 --- /dev/null +++ b/src/pages/Profile.tsx @@ -0,0 +1,404 @@ +import { RouteDataFuncArgs, useNavigate, useParams, useRouteData } from '@solidjs/router'; +import { nip19 } from 'nostr-tools'; +import { + Component, + createEffect, + createMemo, + createSignal, + For, + Resource, + Show +} from 'solid-js'; +import Avatar from '../components/Avatar/Avatar'; +import Branding from '../components/Branding/Branding'; +import Note from '../components/Note/Note'; +import { hexToNpub } from '../lib/keys'; +import { humanizeNumber } from '../lib/stats'; +import { nip05Verification, truncateNpub } from '../stores/profile'; +import Paginator from '../components/Paginator/Paginator'; +import { useToastContext } from '../components/Toaster/Toaster'; +import { useSettingsContext } from '../contexts/SettingsContext'; +import { useProfileContext } from '../contexts/ProfileContext'; +import { useAccountContext } from '../contexts/AccountContext'; +import Wormhole from '../components/Wormhole/Wormhole'; +import { useIntl } from '@cookbook/solid-intl'; +import { urlify, sanitize, replaceLinkPreviews } from '../lib/notes'; +import { shortDate } from '../lib/dates'; + +import styles from './Profile.module.scss'; +import StickySidebar from '../components/StickySidebar/StickySidebar'; +import ProfileSidebar from '../components/ProfileSidebar/ProfileSidebar'; +import { VanityProfiles } from '../types/primal'; +import PageTitle from '../components/PageTitle/PageTitle'; +import FollowButton from '../components/FollowButton/FollowButton'; +import Search from '../components/Search/Search'; +import { useMediaContext } from '../contexts/MediaContext'; +import { profile as t, actions as tActions } from '../translations'; + +const Profile: Component = () => { + + const settings = useSettingsContext(); + const toaster = useToastContext(); + const profile = useProfileContext(); + const account = useAccountContext(); + const media = useMediaContext(); + const intl = useIntl(); + const navigate = useNavigate(); + + const params = useParams(); + + const routeData = useRouteData<(opts: RouteDataFuncArgs) => Resource>(); + + const getHex = () => { + if (params.vanityName && routeData()) { + const name = params.vanityName.toLowerCase(); + const hex = routeData()?.names[name]; + + if (hex) { + return hex; + } + + navigate('/404'); + } + + if (params.vanityName) { + return ''; + } + + let hex = params.npub || account?.publicKey; + + if (params.npub?.startsWith('npub')) { + hex = nip19.decode(params.npub).data as string; + } + + return hex; + } + + const setProfile = (hex: string | undefined) => { + // if (hex === profile?.profileKey) { + // return; + // } + + profile?.actions.setProfileKey(hex); + profile?.actions.clearNotes(); + profile?.actions.fetchNotes(hex); + } + + // const react = createReaction(() => { + // setProfile(getHex()); + // }); + + // onMount(() => { + // // If connection doesn't exist at mount time, + // // create a one-time reaction, when connection is established + // // to fetch profile data. + // if (!isConnected()) { + // react(() => isConnected()); + // return; + // } + + // // Otherwise, fetch profile data. + // setProfile(getHex()); + // }); + + createEffect(() => { + if (account?.isKeyLookupDone) { + setProfile(getHex()); + } + }); + + const profileNpub = createMemo(() => { + return hexToNpub(profile?.profileKey); + }); + + const profileName = () => { + return profile?.userProfile?.displayName || + profile?.userProfile?.name || + truncateNpub(profileNpub()); + } + + const addToHome = () => { + const feed = { + name: `${profileName()}'s feed`, + hex: profile?.profileKey, + npub: profileNpub(), + }; + + settings?.actions.addAvailableFeed(feed); + toaster?.sendSuccess(`${profileName()}'s feed added to home page`); + }; + + const removeFromHome = () => { + const feed = { + name: `${profileName()}'s feed`, + hex: profile?.profileKey, + npub: profileNpub(), + }; + + settings?.actions.removeAvailableFeed(feed); + toaster?.sendSuccess(`${profileName()}'s feed removed from home page`); + }; + + const hasFeedAtHome = () => { + return !!settings?.availableFeeds.find(f => f.hex === profile?.profileKey); + }; + + const copyNpub = () => { + navigator.clipboard.writeText(profile?.userProfile?.npub || profileNpub()); + } + + const imgError = (event: any) => { + // Temprary solution until we decide what to to when banner is missing. + + // const image = event.target; + // image.onerror = ""; + // image.src = defaultAvatar; + + const banner = document.getElementById('profile_banner'); + + if (banner) { + banner.innerHTML = `
`; + } + + return true; + } + + const rectifyUrl = (url: string) => { + if (!url.startsWith('http://') && !url.startsWith('https://')) { + return `http://${url}`; + } + + return url; + } + + const onNotImplemented = () => { + toaster?.notImplemented(); + } + + const isFollowingYou = () => { + return account?.publicKey && profile?.following.includes(account.publicKey); + } + + const [isBannerCached, setisBannerCached] = createSignal(false); + + const banner = () => { + const src= profile?.userProfile?.banner; + const url = media?.actions.getMediaUrl(src, 'm', true); + + setisBannerCached(!!url); + + return url ?? src; + } + + const flagBannerForWarning = () => { + const dev = JSON.parse(localStorage.getItem('devMode') || 'false'); + + // @ts-ignore + if (isBannerCached() || !dev) { + return ''; + } + + return styles.cacheFlag; + } + + return ( + <> + + + + + + + + + + + + + + +
+
+
} + > + + +
+ + +
+
+
+ +
+ +
+ +
+
+
+
+ +
+ + + +
+ +
+ + } + > + +
+
+ + + +
+ + +
+
+ {profileName()} + +
+
+ +
+ {intl.formatMessage(t.followsYou)} +
+
+
+
+ +
+
+
{nip05Verification(profile?.userProfile)}
+
+
+
+
+ +
+
+
+
+ +
+
+ +
+ +
+ + {intl.formatMessage( + t.jointDate, + { + date: shortDate(profile?.userStats.time_joined), + }, + )} + +
+
+ +
+
+
+ {humanizeNumber(profile?.userStats?.follows_count || 0)} +
+
+ {intl.formatMessage(t.stats.follow)} +
+
+
+
+ {humanizeNumber(profile?.userStats?.followers_count || 0)} +
+
+ {intl.formatMessage(t.stats.followers)} +
+
+
+
+ {humanizeNumber(profile?.userStats?.note_count || 0)} +
+
+ {intl.formatMessage(t.stats.notes)} +
+
+ +
+ + + +
+ + {note => ( + + )} + + +
+ + ) +} + +export default Profile; diff --git a/src/pages/Search.module.scss b/src/pages/Search.module.scss new file mode 100644 index 0000000..99b312c --- /dev/null +++ b/src/pages/Search.module.scss @@ -0,0 +1,78 @@ +.fullHeader { + display: grid; + height: 120px; + align-items: center; + justify-content: left; + margin-bottom: -3px; + position: relative; + + .caption { + font-weight: 300; + font-size: 32px; + line-height: 34px; + color: var(--brand-text); + text-transform: lowercase; + } + + .addToFeed { + display: flex; + position: absolute; + bottom: 0px; + width: 100%; + height: 35px; + justify-content: flex-end; + align-items: flex-end; + + .noAdd { + display: flex; + align-items: center; + font-size: 16px; + line-height: 25px; + font-weight: 400; + color: var(--text-primary); + opacity: 0.6; + transition: opacity 0.4s; + } + + .addButton { + display: flex; + align-items: center; + margin: 0; + padding: 0; + border: none; + background-color: unset; + width: auto; + font-size: 16px; + line-height: 25px; + font-weight: 400; + color: var(--text-primary); + opacity: 0.6; + transition: opacity 0.4s; + + >span { + font-weight: 800; + margin-right: 5px; + } + + &:hover { + opacity: 1; + transition: opacity 0.4s; + } + + &:focus { + box-shadow: none; + } + } + } +} +.searchContent { + position: relative; +} + +.noResults { + font-weight: 300; + font-size: 22px; + line-height: 24px; + color: var(--text-tertiary); + text-transform: lowercase; +} diff --git a/src/pages/Search.tsx b/src/pages/Search.tsx new file mode 100644 index 0000000..6addbc3 --- /dev/null +++ b/src/pages/Search.tsx @@ -0,0 +1,136 @@ +import { + Component, + createEffect, + For, + Show, +} from 'solid-js'; +import Note from '../components/Note/Note'; +import Branding from '../components/Branding/Branding'; +import Wormhole from '../components/Wormhole/Wormhole'; +import StickySidebar from '../components/StickySidebar/StickySidebar'; +import { useAccountContext } from '../contexts/AccountContext'; +import { useIntl } from '@cookbook/solid-intl'; +import { isConnected } from '../sockets'; +import { useParams } from '@solidjs/router'; +import styles from './Search.module.scss'; +import { useSearchContext } from '../contexts/SearchContext'; +import SearchSidebar from '../components/SearchSidebar/SearchSidebar'; +import Loader from '../components/Loader/Loader'; +import { useToastContext } from '../components/Toaster/Toaster'; +import { useSettingsContext } from '../contexts/SettingsContext'; +import SearchComponent from '../components/Search/Search'; +import { toast as t, search as tSearch, actions as tActions } from '../translations'; + +const Search: Component = () => { + const params = useParams(); + const search = useSearchContext(); + const account = useAccountContext(); + const toaster = useToastContext(); + const settings = useSettingsContext(); + const intl = useIntl(); + + const query = () => decodeURI(params.query).replaceAll('%23', '#'); + + createEffect(() => { + if (isConnected() && query().length > 0 && search?.contentQuery !== query()) { + search?.actions.setContentQuery(query()); + search?.actions.findContent(query()); + search?.actions.findContentUsers(query(), account?.publicKey); + } + }); + + const hasFeedAtHome = () => { + const hex = `search;${decodeURI(params.query)}`; + + return !!settings?.availableFeeds.find(f => f.hex === hex); + }; + + const addToHomeFeed = () => { + const q = decodeURI(params.query).replaceAll('%23', '#') + const hex = `search;${q}`; + const name = intl.formatMessage( + tSearch.feedLabel, + { query: q || '' }, + ); + + const feed = { name, hex }; + + settings?.actions.addAvailableFeed(feed); + + toaster?.sendSuccess(intl.formatMessage( + t.addFeedToHomeSuccess, + { name }, + )); + }; + + return ( + <> + + + + + + + + + + + + +
+
+ {intl.formatMessage( + tSearch.title, + { query: query() || '' }, + )} +
+
+ + {intl.formatMessage(tActions.disabledAddFeedToHome)} +
+ } + > + + +
+ + +
+ } + > + 0} + fallback={ +
+ { + intl.formatMessage(tSearch.noResults) + } +
+ } + > + + {note => } + +
+
+
+ + ) +} + +export default Search; diff --git a/src/pages/Settings.module.scss b/src/pages/Settings.module.scss new file mode 100644 index 0000000..567efbc --- /dev/null +++ b/src/pages/Settings.module.scss @@ -0,0 +1,42 @@ +.settingsContainer { + background-color: var(--background-card); + padding-inline: 28px; + min-height: 100vh; + padding-bottom: 20px; +} + +.fullHeader { + display: grid; + height: 128px; + align-items: center; + justify-content: left; + + >div { + font-weight: 300; + font-size: 32px; + line-height: 34px; + color: var(--brand-text); + text-transform: lowercase; + } +} + +.comingSoon { + font-weight: 300; + font-size: 18px; + line-height: 34px; + color: var(--text-secondary); +} + +.settingsCaption { + font-size: 18px; + font-weight: 800; + line-height: 20px; + color: var(--text-secondary); + margin-bottom: 20px; +} + +.devider { + width: 100%; + border-bottom: solid 1px var(--subtile-devider); + margin-block: 32px; +} diff --git a/src/pages/Settings.tsx b/src/pages/Settings.tsx new file mode 100644 index 0000000..6db67bc --- /dev/null +++ b/src/pages/Settings.tsx @@ -0,0 +1,74 @@ +import { Component } from 'solid-js'; +import Branding from '../components/Branding/Branding'; +import styles from './Settings.module.scss'; + +import FeedSorter from '../components/FeedSorter/FeedSorter'; +import ThemeChooser from '../components/ThemeChooser/ThemeChooser'; +import Wormhole from '../components/Wormhole/Wormhole'; +import { useIntl } from '@cookbook/solid-intl'; +import SettingsZap from '../components/SettingsZap/SettingsZap'; +import Search from '../components/Search/Search'; +import SettingsNotifications from '../components/SettingsNotifications/SettingsNotifications'; +import { settings as t } from '../translations'; + +const Settings: Component = () => { + + const intl = useIntl(); + + return ( +
+ + + + + + + + +
+
+ {intl.formatMessage(t.title)} +
+
+
+ {intl.formatMessage(t.theme)} +
+ + + +
+ +
+ {intl.formatMessage(t.feeds)} +
+ +
+ +
+ +
+ +
+ {intl.formatMessage(t.feeds)} +
+ +
+ +
+ +
+ +
+ {intl.formatMessage(t.notifications.title)} +
+ +
+ +
+
+ ) +} + +export default Settings; diff --git a/src/pages/Thread.module.scss b/src/pages/Thread.module.scss new file mode 100644 index 0000000..90faedf --- /dev/null +++ b/src/pages/Thread.module.scss @@ -0,0 +1,61 @@ +.repliesHolder { + position: relative; + padding-bottom: 60px; +} +.noContent { + position: relative; + color: var(--text-secondary); + text-align: center; + margin-top: 80px; +} + +.border { + height: 36px; + padding: 1px; + background: var(--brand-gradient); + border-radius: 6px; + margin-left: 10px; + + input { + height: 34px; + font-size: 18px; + line-height: 20px; + margin: 0px; + border-radius: 6px; + border: none; + background-color: var(--background-site); + } +} + +.replyBox { + margin-top: 4px; + padding: 30px 22px; + background-color: var(--background-card); +} + +@media only screen and (max-width: 720px) { + .border { + height: 36px; + padding: 1px; + background: var(--brand-gradient); + border-radius: 6px; + margin-left: 10px; + + input { + height: 34px; + font-size: 18px; + line-height: 20px; + margin: 0px; + border-radius: 6px; + border: none; + background-color: var(--background-site); + } + } + + .replyBox { + margin-top: 4px; + padding: 30px 12px; + width: 100%; + background-color: var(--background-card); + } +} diff --git a/src/pages/Thread.tsx b/src/pages/Thread.tsx new file mode 100644 index 0000000..0990c0e --- /dev/null +++ b/src/pages/Thread.tsx @@ -0,0 +1,174 @@ +import { Component, createEffect, For, onCleanup, Show } from 'solid-js'; +import Note from '../components/Note/Note'; +import styles from './Thread.module.scss'; +import { useParams } from '@solidjs/router'; +import { PrimalNote } from '../types/primal'; +import NotePrimary from '../components/Note/NotePrimary/NotePrimary'; +import PeopleList from '../components/PeopleList/PeopleList'; +import PageNav from '../components/PageNav/PageNav'; +import ReplyToNote from '../components/ReplyToNote/ReplyToNote'; + +import Loader from '../components/Loader/Loader'; +import { nip19 } from 'nostr-tools'; +import { useThreadContext } from '../contexts/ThreadContext'; +import Wormhole from '../components/Wormhole/Wormhole'; +import { useAccountContext } from '../contexts/AccountContext'; +import { sortByRecency } from '../stores/note'; +import { scrollWindowTo } from '../lib/scroll'; +import { useIntl } from '@cookbook/solid-intl'; +import Search from '../components/Search/Search'; +import { thread as t } from '../translations'; + + +const Thread: Component = () => { + const account = useAccountContext(); + const params = useParams(); + const intl = useIntl(); + + const postId = () => { + if (params.postId.startsWith('note')) { + return params.postId; + } + + return nip19.noteEncode(params.postId); + }; + + const threadContext = useThreadContext(); + + const primaryNote = () => { + // const id = postId(); + // const savedNote = threadContext?.primaryNote; + + + // if (savedNote?.post.noteId === postId()) { + // return savedNote; + // } + + return threadContext?.notes.find(n => n.post.noteId === postId()); + }; + + const parentNotes = () => { + const note = primaryNote(); + + if (!note) { + return []; + } + + return sortByRecency( + threadContext?.notes.filter(n => + n.post.id !== note.post.id && n.post.created_at <= note.post.created_at, + ) || [], + true, + ); + }; + + const replyNotes = () => { + const note = primaryNote(); + + if (!note) { + return []; + } + + return threadContext?.notes.filter(n => + n.post.id !== note.post.id && n.post.created_at >= note.post.created_at, + ) || []; + }; + + const people = () => threadContext?.users || []; + const isFetching = () => threadContext?.isFetching; + + createEffect(() => { + threadContext?.actions.fetchNotes(postId()); + }); + + let observer: IntersectionObserver | undefined; + + createEffect(() => { + if (primaryNote() && !threadContext?.isFetching) { + const pn = document.getElementById('primary_note'); + + if (!pn) { + return; + } + + observer = new IntersectionObserver(entries => { + const rect = pn.getBoundingClientRect(); + entries.forEach((entry) => { + if (!entry.isIntersecting) { + scrollWindowTo(rect.top); + } + observer?.unobserve(pn); + }); + }); + + observer?.observe(pn); + } + }); + + onCleanup(() => { + const pn = document.getElementById('primary_note'); + + pn && observer?.unobserve(pn); + }); + + return ( +
+ + + + + + + + + + + + + + + {note => +
+ +
+ } +
+
+ + +
+ + + + +
+
+ +
+
} + > + + {note => +
+ +
+ } +
+ +
+ + ) +} + +export default Thread; diff --git a/src/services/StoreService.ts b/src/services/StoreService.ts new file mode 100644 index 0000000..8d218dc --- /dev/null +++ b/src/services/StoreService.ts @@ -0,0 +1,113 @@ +import { nip19 } from "nostr-tools"; +import { createStore } from "solid-js/store"; +import { APP_ID } from "../App"; +import { emptyPage, Kind } from "../constants"; +import { convertToNotes, sortingPlan } from "../stores/note"; +import { FeedPage, NostrEventContent, NostrMentionContent, NostrNoteActionsContent, NostrNoteContent, NostrStatsContent, NostrUserContent, NoteActions, PrimalNote } from "../types/primal"; + +type FeedStore = { + lastNote?: PrimalNote, + notes: PrimalNote[], + isFetching: boolean, +} + +type PrimalStore = { + page: Record, + feed: Record, +}; + + +export const [store, updateStore] = createStore({ + page: {}, + feed: {}, +}); + +export const getStoreKey = (subId: string) => { + return subId.replace(APP_ID, ''); +}; + +export const updatePage = (subId: string, content: NostrEventContent) => { + + const storeKey = getStoreKey(subId); + const feed = store.feed[storeKey]; + + if (content.kind === Kind.Metadata) { + const user = content as NostrUserContent; + + + updateStore('page', storeKey, 'users', + (usrs) => ({ ...usrs, [user.pubkey]: { ...user } }) + ); + return; + } + + if ([Kind.Text, Kind.Repost].includes(content.kind)) { + const message = content as NostrNoteContent; + const messageId = nip19.noteEncode(message.id); + + const isLastNote = message.kind === Kind.Text ? + feed.lastNote?.post?.noteId === messageId : + feed.lastNote?.repost?.note.noteId === messageId; + + if (!isLastNote) { + updateStore('page', storeKey, 'messages', + (msgs) => [ ...msgs, { ...message }] + ); + } + + return; + } + + if (content.kind === Kind.NoteStats) { + const statistic = content as NostrStatsContent; + const stat = JSON.parse(statistic.content); + + updateStore('page', storeKey, 'postStats', + (stats) => ({ ...stats, [stat.event_id]: { ...stat } }) + ); + return; + } + + if (content.kind === Kind.Mentions) { + const mentionContent = content as NostrMentionContent; + const mention = JSON.parse(mentionContent.content); + + updateStore('page', storeKey, 'mentions', + (mentions) => ({ ...mentions, [mention.id]: { ...mention } }) + ); + return; + } + + if (content.kind === Kind.NoteActions) { + const noteActionContent = content as NostrNoteActionsContent; + const noteActions = JSON.parse(noteActionContent.content) as NoteActions; + + updateStore('page', storeKey, 'noteActions', + (actions) => ({ ...actions, [noteActions.event_id]: { ...noteActions } }) + ); + return; + } +}; + +export const savePage = (subId: string, sortBy = 'latest') => { + const storeKey = getStoreKey(subId); + const sortingFunction = sortingPlan(sortBy); + + const newPosts = sortingFunction(convertToNotes(store.page[storeKey])); + + saveNotes(newPosts, storeKey); +}; + +export const saveNotes = (notes: PrimalNote[], subId: string) => { + const storeKey = getStoreKey(subId); + + updateStore('feed', storeKey, 'notes', (nts) => [ ...nts, ...notes ]); + updateStore('feed', storeKey, 'isFetching', () => false); +}; + + +export const clearPage = (subId: string) => { + const storeKey = getStoreKey(subId); + + updateStore('page', storeKey, () => ({ ...emptyPage })); +}; diff --git a/src/sockets.tsx b/src/sockets.tsx new file mode 100644 index 0000000..62446af --- /dev/null +++ b/src/sockets.tsx @@ -0,0 +1,102 @@ +import { createSignal } from "solid-js"; +import { NostrEvent, NostrEOSE, NostrEventType, NostrEventContent } from "./types/primal"; + +export const [socket, setSocket] = createSignal(); + +export const [isConnected, setConnected] = createSignal(false); + +export const isNotConnected = () => !isConnected(); + +const onOpen = () => { + setConnected(true); +} + +const onClose = () => { + setConnected(false); + + socket()?.removeEventListener('open', onOpen); + socket()?.removeEventListener('close', onClose); + socket()?.removeEventListener('error', onError); + + setTimeout(() => { + connect(); + }, 200); +} + +const onError = (error: Event) => { + console.log("ws error: ", error); +}; + +export const connect = () => { + if (isNotConnected()) { + const cacheServer = localStorage.getItem('cacheServer') ?? + 'wss://cache3.primal.net/cache17'; + + setSocket(new WebSocket(cacheServer)); + console.log('CACHE SOCKET: ', socket()); + + socket()?.addEventListener('open', onOpen); + socket()?.addEventListener('close', onClose); + socket()?.addEventListener('error', onError); + } +}; + +export const disconnect = () => { + socket()?.close(); +}; + +export const reset = () => { + disconnect(); + setTimeout(connect, 1000); +}; + +export const sendMessage = (message: string) => { + isConnected() && socket()?.send(message); +} + +export const refreshSocketListeners = ( + ws: WebSocket | undefined, + listeners: Record any>, + ) => { + + if (!ws) { + return; + } + + Object.keys(listeners).forEach((event: string) => { + ws.removeEventListener(event, listeners[event]); + ws.addEventListener(event, listeners[event]); + }); +}; + +export const removeSocketListeners = ( + ws: WebSocket | undefined, + listeners: Record any>, + ) => { + + if (!ws) { + return; + } + + Object.keys(listeners).forEach((event: string) => { + ws.removeEventListener(event, listeners[event]); + }); +}; + +export const subscribeTo = (subId: string, cb: (type: NostrEventType, subId: string, content?: NostrEventContent) => void ) => { + const listener = (event: MessageEvent) => { + const message: NostrEvent | NostrEOSE = JSON.parse(event.data); + const [type, subscriptionId, content] = message; + + if (subId === subscriptionId) { + cb(type, subscriptionId, content); + } + + }; + + socket()?.addEventListener('message', listener); + + return () => { + socket()?.removeEventListener('message', listener); + }; +}; diff --git a/src/stores/note.ts b/src/stores/note.ts new file mode 100644 index 0000000..0d800dd --- /dev/null +++ b/src/stores/note.ts @@ -0,0 +1,349 @@ +import { nip19 } from "nostr-tools"; +import { Kind } from "../constants"; +import { hexToNpub } from "../lib/keys"; +import { sanitize } from "../lib/notes"; +import { RepostInfo, NostrNoteContent, FeedPage, PrimalNote, PrimalRepost, NostrEventContent, NostrEOSE, NostrEvent, PrimalUser } from "../types/primal"; +import { convertToUser, emptyUser } from "./profile"; + + +export const getRepostInfo: RepostInfo = (page, message) => { + const user = page?.users[message.pubkey]; + const userMeta = JSON.parse(user?.content || '{}'); + const stat = page?.postStats[message.id]; + + + const noActions = { + event_id: message.id, + liked: false, + replied: false, + reposted: false, + zapped: false, + }; + + return { + user: { + id: user?.id || '', + pubkey: user?.pubkey || message.pubkey, + npub: hexToNpub(user?.pubkey || message.pubkey), + name: (userMeta.name || user?.pubkey) as string, + about: (userMeta.about || '') as string, + picture: (userMeta.picture || '') as string, + nip05: (userMeta.nip05 || '') as string, + banner: (userMeta.banner || '') as string, + displayName: (userMeta.display_name || '') as string, + location: (userMeta.location || '') as string, + lud06: (userMeta.lud06 || '') as string, + lud16: (userMeta.lud16 || '') as string, + website: (userMeta.website || '') as string, + tags: user?.tags || [], + }, + note: { + id: message.id, + pubkey: message.pubkey, + created_at: message.created_at || 0, + tags: message.tags, + content: sanitize(message.content), + sig: message.sig, + likes: stat?.likes || 0, + mentions: stat?.mentions || 0, + reposts: stat?.reposts || 0, + replies: stat?.replies || 0, + zaps: stat?.zaps || 0, + score: stat?.score || 0, + score24h: stat?.score24h || 0, + satszapped: stat?.satszapped || 0, + noteId: nip19.noteEncode(message.id), + noteActions: (page.noteActions && page.noteActions[message.id]) || noActions, + }, + } +}; + +export const parseEmptyReposts = (page: FeedPage) => { + let reposts: Record = {}; + + page.messages.forEach(message => { + if (message.kind === 6 && message.content.length === 0) { + const tag = message.tags.find(t => t[0] === 'e'); + if (tag) { + reposts[tag[1]] = message.id; + } + } + }); + + return reposts; +}; + +const parseKind6 = (message: NostrNoteContent) => { + try { + return JSON.parse(message.content); + } catch (e) { + return { + kind: 1, + content: '', + id: message.id, + created_at: message.created_at, + pubkey: message.pubkey, + sig: message.sig, + tags: message.tags, + } + } +}; + +// const getNoteReferences = (message: NostrNoteContent) => { +// const regex = /\#\[([0-9]*)\]/g; +// let refs = []; +// let match; + +// while((match = regex.exec(message.content)) !== null) { +// refs.push(match[1]); +// } + +// return refs.reduce((acc, ref) => { +// const tag = message.tags[parseInt(ref)] || []; + +// return tag[0] === 'e' ? [...acc, tag[1]] : acc; +// }, []); +// }; + +// const getUserReferences = (message: NostrNoteContent) => { +// const regex = /\#\[([0-9]*)\]/g; +// let refs = []; +// let match; + +// while((match = regex.exec(message.content)) !== null) { +// refs.push(match[1]); +// } + +// return refs.reduce((acc, ref) => { +// const tag: string[] = message.tags[parseInt(ref)] || []; + +// return tag[0] === 'p' ? [...acc, tag[1]] : acc; +// }, []); +// }; + +type ConvertToNotes = (page: FeedPage | undefined) => PrimalNote[]; + +export const convertToNotes: ConvertToNotes = (page) => { + + if (page === undefined) { + return []; + } + + const mentions = page.mentions || {}; + + return page.messages.map((message) => { + const msg: NostrNoteContent = message.kind === Kind.Repost ? parseKind6(message) : message; + + const user = page?.users[msg.pubkey]; + const stat = page?.postStats[msg.id]; + + const userMeta = JSON.parse(user?.content || '{}'); + + const mentionIds = Object.keys(mentions) //message.tags.reduce((acc, t) => t[0] === 'e' ? [...acc, t[1]] : acc, []); + const userMentionIds = message.tags.reduce((acc, t) => t[0] === 'p' ? [...acc, t[1]] : acc, []); + + let mentionedNotes: Record = {}; + let mentionedUsers: Record = {}; + + if (mentionIds.length > 0) { + for (let i = 0;i 0) { + for (let i = 0;i { + + const aData: Record = a.repost ? a.repost.note : a.post; + const bData: Record = b.repost ? b.repost.note : b.post; + + return bData[property] - aData[property]; +}; + +export const sortByRecency = (posts: PrimalNote[], reverse = false) => { + return posts.sort((a: PrimalNote, b: PrimalNote) => { + const order = sortBy(a, b, 'created_at'); + + return reverse ? -1 * order : order; + }); +}; + +export const sortByScore24h = (posts: PrimalNote[], reverse = false) => { + return posts.sort((a: PrimalNote, b: PrimalNote) => { + const order = sortBy(a, b, 'score24h'); + + return reverse ? -1 * order : order; + }); +}; + +export const sortByScore = (posts: PrimalNote[], reverse = false) => { + return posts.sort((a: PrimalNote, b: PrimalNote) => { + const order = sortBy(a, b, 'score'); + + return reverse ? -1 * order : order; + }); +}; + +export const sortByZapped = (posts: PrimalNote[], reverse = false) => { + return posts.sort((a: PrimalNote, b: PrimalNote) => { + const order = sortBy(a, b, 'satszapped'); + + return reverse ? -1 * order : order; + }); +}; + +export const sortingPlan = (topic: string = '') => { + const sortingFunctions: Record = { + trending: sortByScore24h, + popular: sortByScore, + latest: sortByRecency, + mostzapped: sortByZapped, + mostzapped4h: sortByZapped, + } + + const plan = topic || 'latest'; + + return sortingFunctions[plan] || sortingFunctions['latest']; +}; + + +export const paginationPlan = (criteria: string) => { + const pagCriteria: Record = { + trending: 'score24h', + popular: 'score', + latest: 'created_at', + mostzapped: 'satszapped', + mostzapped4h: 'satszapped', + } + + const plan = criteria || 'latest'; + + return pagCriteria[plan] || pagCriteria['latest']; +} + +type NoteStore = { + notes: PrimalNote[], + page: FeedPage, + lastNote: PrimalNote | undefined, + reposts: Record | undefined, +} + +export const referencesToTags = (value: string) => { + const regex = + /\bnostr:((note|npub|nevent|nprofile)1\w+)\b|#\[(\d+)\]/g; + + let refs: string[] = []; + let tags: string[][] = []; + let match; + + while((match = regex.exec(value)) !== null) { + refs.push(match[0]); + } + + refs.forEach((ref) => { + const decoded = nip19.decode(ref.split('nostr:')[1]); + + if (decoded.type === 'npub') { + tags.push(['p', decoded.data, '', 'mention']) + return; + } + + if (decoded.type === 'nprofile') { + const relay = decoded.data.relays ? decoded.data.relays[0] : ''; + tags.push(['p', decoded.data.pubkey, relay, 'mention']); + return; + } + + if (decoded.type === 'note') { + tags.push(['e', decoded.data, '', 'mention']); + return; + } + + if (decoded.type === 'nevent') { + const relay = decoded.data.relays ? decoded.data.relays[0] : ''; + tags.push(['e', decoded.data.id, relay, 'mention']); + return; + } + }); + + return tags; + +}; diff --git a/src/stores/profile.ts b/src/stores/profile.ts new file mode 100644 index 0000000..87253ac --- /dev/null +++ b/src/stores/profile.ts @@ -0,0 +1,96 @@ +import { hexToNpub } from "../lib/keys"; +import { NostrUserContent, PrimalUser } from "../types/primal"; + +export const truncateNpub = (npub: string) => { + if (npub.length < 24) { + return npub; + } + return `${npub.slice(0, 15)}..${npub.slice(-10)}`; +}; + +export const truncateName = (name: string, limit = 20) => { + if (name.length < limit) { + return name; + } + return `${name.slice(0, limit)}...`; +}; + +export const convertToUser: (user: NostrUserContent) => PrimalUser = (user: NostrUserContent) => { + const userMeta = JSON.parse(user.content || '{}'); + + return { + id: user.id, + pubkey: user.pubkey, + tags: user.tags, + npub: hexToNpub(user.pubkey), + name: (userMeta.name || '') as string, + about: (userMeta.about || '') as string, + picture: (userMeta.picture || '') as string, + nip05: (userMeta.nip05 || '') as string, + banner: (userMeta.banner || '') as string, + displayName: (userMeta.display_name || '') as string, + location: (userMeta.location || '') as string, + lud06: (userMeta.lud06 || '') as string, + lud16: (userMeta.lud16 || '') as string, + website: (userMeta.website || '') as string, + }; +} + +export const emptyUser = (pubkey: string) => { + return { + id: '', + pubkey, + tags: [], + npub: hexToNpub(pubkey), + name: '', + about: '', + picture: '', + nip05: '', + banner: '', + displayName: '', + location: '', + lud06: '', + lud16: '', + website: '', + } as PrimalUser; +}; + +export const userName = (user: PrimalUser | undefined) => { + if (!user) { + return ''; + } + const name = user.name || + user.display_name || + user.displayName || + user.npub; + + return name ? + truncateName(name) : + truncateNpub(hexToNpub(user.pubkey) || ''); +}; + +export const authorName = (user: PrimalUser | undefined) => { + if (!user) { + return ''; + } + const name = user.display_name || + user.displayName || + user.name || + user.npub; + + return name ? + truncateName(name) : + truncateNpub(hexToNpub(user.pubkey) || ''); +}; + +export const nip05Verification = (user: PrimalUser | undefined) => { + if (!user) { + return ''; + } + + if (user.nip05.startsWith('_@')) { + return user.nip05.slice(2); + } + + return user.nip05; +}; diff --git a/src/stores/trending.ts b/src/stores/trending.ts new file mode 100644 index 0000000..511c61e --- /dev/null +++ b/src/stores/trending.ts @@ -0,0 +1,65 @@ +import { createStore, SetStoreFunction } from "solid-js/store"; +import { sortByScore24h, convertToNotes } from "../stores/note"; +import { NostrNoteContent, NostrUserContent, NostrStatsContent, FeedPage, PrimalNote, NostrEventContent, Kind } from "../types/primal"; + +export type TrendingNotesData = FeedPage & { notes: PrimalNote[]}; + +export const emptyNotes: TrendingNotesData = { + messages: [], + users: {}, + notes: [], + postStats: {}, +}; + +export const [trendingNotes, setTrendingNotes] = + createStore(emptyNotes); + +const proccessNote = (post: NostrNoteContent) => { + setTrendingNotes('messages', (msgs) => [ ...msgs, post]); +}; + +const proccessUser = (user: NostrUserContent) => { + setTrendingNotes('users', (users) => ({ ...users, [user.pubkey]: user})) +}; + +const proccessStat = (stat: NostrStatsContent) => { + const content = JSON.parse(stat.content); + setTrendingNotes('postStats', (stats) => ({ ...stats, [content.event_id]: content })) +}; + +export const processTrendingNotes = (type: string, content: NostrEventContent | undefined) => { + if (type === 'EOSE') { + const newNotes = sortByScore24h(convertToNotes(trendingNotes)); + + setTrendingNotes('notes', () => [...newNotes]); + + return; + } + + if (type === 'EVENT') { + if (content && content.kind === Kind.Metadata) { + proccessUser(content); + } + if (content && content.kind === Kind.Text) { + proccessNote(content); + } + if (content && content.kind === Kind.Repost) { + proccessNote(content); + } + if (content && content.kind === Kind.NoteStats) { + proccessStat(content); + } + } +}; + +export type TrendingNotesStore = { + data: TrendingNotesData, + setTrendingNotes: SetStoreFunction, + processTrendingNotes: (type: string, content: NostrEventContent | undefined) => void, +} + +export default { + data: trendingNotes, + setTrendingNotes, + processTrendingNotes, +}; diff --git a/src/translations.ts b/src/translations.ts new file mode 100644 index 0000000..307affb --- /dev/null +++ b/src/translations.ts @@ -0,0 +1,773 @@ +import { MessageDescriptor } from "@cookbook/solid-intl"; +import { NotificationType } from "./constants"; +import { ScopeDescriptor } from "./types/primal"; + +export const account = { + follow: { + id: 'actions.follow', + defaultMessage: 'follow', + description: 'Follow button label', + }, + unfollow: { + id: 'actions.unfollow', + defaultMessage: 'unfollow', + description: 'Unfollow button label', + }, + needToLogin: { + id: 'account.needToLogin', + defaultMessage: 'You need to be signed in to perform this action', + description: 'Message to user that an action cannot be preformed without a public key', + }, +}; + +export const actions = { + cancel: { + id: 'actions.cancel', + defaultMessage: 'cancel', + description: 'Cancel action, button label', + }, + addFeedToHome: { + id: 'actions.addFeedToHome', + defaultMessage: 'add this feed to my home page', + description: 'Add feed to home, button label', + }, + addFeedToHomeNamed: { + id: 'actions.addFeedToHomeNamed', + defaultMessage: 'add {name} feed to home page', + description: 'Add named feed to home, button label', + }, + disabledAddFeedToHome: { + id: 'actions.disabledHomeFeedAdd', + defaultMessage: 'Available on your home page', + description: 'Add feed to home label, when feed is already added', + }, + removeFromHomeFeedNamed: { + id: 'actions.removeFromHomeFeedNamed', + defaultMessage: 'remove {name} feed from your home page', + description: 'Remove named feed from home, button label', + }, + noteCopyNostrLink: { + id: 'actions.noteCopyNostrLink', + defaultMessage: 'Copy Nostr link', + description: 'Label for the copy Nostr note link context menu item', + }, + noteCopyPrimalLink: { + id: 'actions.noteCopyPrimalLink', + defaultMessage: 'Copy Primal link', + description: 'Label for the copy Primal note link context menu item', + }, + notePostNew: { + id: 'actions.notePostNew', + defaultMessage: 'post', + description: 'Send new note, button label', + }, + noteReply: { + id: 'actions.noteReply', + defaultMessage: 'reply to {name}', + description: 'Reply to button label', + }, + sendDirectMessage: { + id: 'actions.sendDirectMessage', + defaultMessage: 'send', + description: 'Send direct message action, button label', + }, +}; + +export const branding = { + id: 'branding', + defaultMessage: 'Primal', + description: 'Brand name', +}; + +export const exploreSidebarCaption = { + id: 'explore.sidebar.caption', + defaultMessage: 'trending users', + description: 'Caption for the explore page sidebar showing a list of trending users', +}; + +export const explore = { + genericCaption: { + id: 'explore.genericCaption', + defaultMessage: 'explore nostr', + description: 'Generic caption for the explore page', + }, + title: { + id: 'explore.title', + defaultMessage: '{timeframe}: {scope}', + description: 'Title of the explore page', + }, + statDisplay: { + users: { + id: 'explore.stats.users', + defaultMessage:'Users', + description: 'Label for number of users stats', + }, + pubkeys: { + id: 'explore.stats.pubkeys', + defaultMessage: 'Public Keys', + description: 'Label for number of pubkeys stats', + }, + zaps: { + id: 'explore.stats.zaps', + defaultMessage: 'Zaps', + description: 'Label for number of zaps stats', + }, + btcZapped: { + id: 'explore.stats.btcZapped', + defaultMessage: 'BTC Zapped', + description: 'Label for number of zapped bitcoins stats', + }, + pubnotes: { + id: 'explore.stats.pubnotes', + defaultMessage: 'Public Notes', + description: 'Label for number of public notes stats', + }, + reposts: { + id: 'explore.stats.reposts', + defaultMessage: 'Reposts', + description: 'Label for number of repost stats', + }, + reactions: { + id: 'explore.stats.reactions', + defaultMessage: 'Reactions', + description: 'Label for number of reactions stats', + }, + any: { + id: 'explore.stats.any', + defaultMessage: 'All Events', + description: 'Label for number of all stats', + }, + } +}; + +export const feedNewPosts = { + id: 'feed.newPosts', + defaultMessage: `{number, plural, + =0 {} + one {# new post} + =100 {99+ new posts} + other {# new posts}}`, + description: 'Label for a button to load new posts', +}; + +export const feedback = { + dropzone: { + id: 'feedback.dropzone', + defaultMessage: 'drop file to upload', + description: 'Label accompanying the draging file' + }, + uploading: { + id: 'feedback.uploading', + defaultMessage: 'uploading...', + description: 'Label accompanying the uploading spinner' + }, +}; + +export const messages = { + title: { + id: 'messages.title', + defaultMessage: 'Messages', + description: 'Title of messages page', + }, + follows: { + id: 'messages.follows', + defaultMessage: 'follows', + description: 'DM relation selection label for follows', + }, + other: { + id: 'messages.other', + defaultMessage: 'other', + description: 'DM relation selection label for other', + }, + markAsRead: { + id: 'messages.markAsRead', + defaultMessage: 'Mark All Read', + description: 'DM mark as read label', + }, +}; + +export const navBar = { + home: { + id: 'navbar.home', + defaultMessage: 'Home', + description: 'Label for the nav bar item link to Home page', + }, + explore: { + id: 'navbar.explore', + defaultMessage: 'Explore', + description: 'Label for the nav bar item link to Explore page', + }, + messages: { + id: 'navbar.messages', + defaultMessage: 'Messages', + description: 'Label for the nav bar item link to Messages page', + }, + notifications: { + id: 'navbar.notifications', + defaultMessage: 'Notifications', + description: 'Label for the nav bar item link to Notifications page', + }, + downloads: { + id: 'navbar.downloads', + defaultMessage: 'Downloads', + description: 'Label for the nav bar item link to Downloads page', + }, + settings: { + id: 'navbar.settings', + defaultMessage: 'Settings', + description: 'Label for the nav bar item link to Settings page', + }, + help: { + id: 'navbar.help', + defaultMessage: 'Help', + description: 'Label for the nav bar item link to Help page', + }, +}; + +export const note = { + newPreview: { + id: 'note.newPreview', + defaultMessage: 'Note preview', + description: 'Caption for preview when creating a new note' + }, + mentionIndication: { + id: 'note.mentionIndication', + defaultMessage: '\[post by {name}\]', + description: 'Label indicating that a note has been metioned in the small note display' + }, + reposted: { + id: 'note.reposted', + defaultMessage: 'Reposted', + description: 'Label indicating that the note is a repost', + }, +}; + +export const notificationTypeTranslations: Record = { + [NotificationType.NEW_USER_FOLLOWED_YOU]: 'followed you', + [NotificationType.USER_UNFOLLOWED_YOU]: 'unfollowed you', + + [NotificationType.YOUR_POST_WAS_ZAPPED]: 'zapped your post', + [NotificationType.YOUR_POST_WAS_LIKED]: 'liked your post', + [NotificationType.YOUR_POST_WAS_REPOSTED]: 'reposted your post', + [NotificationType.YOUR_POST_WAS_REPLIED_TO]: 'replied to your post', + + [NotificationType.YOU_WERE_MENTIONED_IN_POST]: 'mentioned you in a post', + [NotificationType.YOUR_POST_WAS_MENTIONED_IN_POST]: 'mentioned your post', + + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_ZAPPED]: 'zapped a post you were mentioned in', + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_LIKED]: 'liked a post you were mentioned in', + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_REPOSTED]: 'reposted a post you were mentioned in', + [NotificationType.POST_YOU_WERE_MENTIONED_IN_WAS_REPLIED_TO]: 'replied to a post you were mentioned in', + + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_ZAPPED]: 'zapped a post your post was mentioned in', + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_LIKED]: 'liked a post your post was mentioned in', + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPOSTED]: 'reposted a post your post was mentioned in', + [NotificationType.POST_YOUR_POST_WAS_MENTIONED_IN_WAS_REPLIED_TO]: 'replied to a post your post was mentioned in', +} + +export const notificationsNew: Record = Object.values(NotificationType).reduce((acc, type) => ({ + ...acc, + [type]: { + id: `notifications.new.${type}`, + defaultMessage: `{number, plural, + =0 {} + one {and # other} + other {and # others}} + ${notificationTypeTranslations[type]}`, + description: `New Notifiaction label for notifications of type ${type}`, + }, +}), {}); + +export const notificationsOld: Record = Object.values(NotificationType).reduce((acc, type) => ({ + ...acc, + [type]: { + id: `notifications.old.${type}`, + defaultMessage: `${notificationTypeTranslations[type]}`, + description: `Old Notifiaction label for notifications of type ${type}`, + }, +}), {}); + +export const notificationsSidebar = { + activities: { + id: 'notifications.sidebar.activities', + defaultMessage: 'Reactions', + description: 'Sidebar activities stats caption on the notification page', + }, + heading: { + id: 'notificationsSidebar.heading', + defaultMessage: 'Summary', + description: 'Sidebar caption on the notification page', + }, + empty: { + id: 'notificationsSidebar.empty', + defaultMessage: 'No new notifications', + description: 'Sidebar caption indicating no new notifications', + }, + followers: { + id: 'notificationsSidebar.followers', + defaultMessage: 'Followers', + description: 'Sidebar follower stats caption on the notification page', + }, + gainedFollowers: { + id: 'notificationsSidebar.gainedFollowers', + defaultMessage: `new {number, plural, + =0 {} + one {follower} + other {followers}}`, + description: 'Sidebar new follower stats description on the notification page', + }, + lostFollowers: { + id: 'notificationsSidebar.lostFollowers', + defaultMessage: `lost {number, plural, + =0 {} + one {follower} + other {followers}}`, + description: 'Sidebar lost follwers stats description on the notification page', + }, + likes: { + id: 'notifications.sidebar.likes', + defaultMessage: `{number, plural, + =0 {} + one {like} + other {likes}}`, + description: 'Sidebar likes stats caption on the notification page', + }, + mentions: { + id: 'notifications.sidebar.mentions', + defaultMessage: 'Mentions', + description: 'Sidebar mentions stats caption on the notification page', + }, + mentionsYou: { + id: 'notifications.sidebar.mentionsYou', + defaultMessage: `{number, plural, + =0 {} + one {mention} + other {mentions}} of you`, + description: 'Sidebar mentions you stats description on the notification page', + }, + mentionsYourPost: { + id: 'notifications.sidebar.mentionsYourPost', + defaultMessage: `{number, plural, + =0 {} + one {mention of your post} + other {mentions of your posts}}`, + description: 'Sidebar mentions your post stats description on the notification page', + }, + replies: { + id: 'notifications.sidebar.replies', + defaultMessage: `{number, plural, + =0 {} + one {reply} + other {replies}}`, + description: 'Sidebar replies stats caption on the notification page', + }, + reposts: { + id: 'notifications.sidebar.reposts', + defaultMessage: `{number, plural, + =0 {} + one {repost} + other {reposts}}`, + description: 'Sidebar reposts stats caption on the notification page', + }, + other: { + id: 'notifications.sidebar.other', + defaultMessage: 'Other', + description: 'Sidebar other stats caption on the notification page', + }, + zaps: { + id: 'notificationsSidebar.zaps', + defaultMessage: 'Zaps', + description: 'Sidebar zaps stats caption on the notification page', + }, + zapNumber: { + id: 'notificationsSidebar.zapNumber', + defaultMessage: `{number, plural, + =0 {} + one {zap} + other {zaps}}`, + description: 'Sidebar zaps stats description on the notification page', + }, + statsNumber: { + id: 'notificationsSidebar.statsNumber', + defaultMessage: `{number, plural, + =0 {} + one {sat} + other {sats}}`, + description: 'Sidebar sats stats description on the notification page', + }, +}; + +export const notifications = { + title: { + id: 'pages.notifications.title', + defaultMessage: 'Notifications', + description: 'Title of the notifications page', + }, + newNotifs: { + id: 'notification.newNotifs', + defaultMessage: `{number, plural, + =0 {} + one {# new notification} + =100 {99+ new notifications} + other {# new notifications}}`, + description: 'Label for a button to load new notifications', + }, +}; + +export const placeholders = { + comingSoon: { + id: 'placeholders.comingSoon', + defaultMessage: 'Coming soon', + description: 'Placholder text for missing content', + }, + endOfFeed: { + id: 'placeholders.endOfFeed', + defaultMessage: 'Your reached the end. You are a quick reader', + description: 'Message displayed when user reaches the end of the feed', + }, + guestUserGreeting: { + id: 'placeholders.guestUserGreeting', + defaultMessage: 'Welcome to nostr!', + description: 'Header placeholder for guest user', + }, + noteCallToAction: { + id: 'placeholders.callToAction.note', + defaultMessage: 'say something on nostr...', + description: 'Placeholder for new note call-to-action', + }, + pageWIPTitle: { + id: 'pages.wip.title', + defaultMessage: '{title}', + description: 'Title of page under construction', + }, + welcomeMessage: { + id: 'placeholders.welcomeMessage', + defaultMessage: 'Welcome to nostr!', + description: 'Default welcome message', + }, + findUser: { + id: 'placeholders.findUser', + defaultMessage: 'find user', + description: 'Find user input placeholder', + }, + findUsers: { + id: 'placeholders.findUsers', + defaultMessage: 'find users', + description: 'Find users input placeholder', + }, + search: { + id: 'placeholders.search', + defaultMessage: 'search', + description: 'Search input placeholder', + }, + selectFeed: { + id: 'placeholders.selectFeed', + defaultMessage: 'Select feed', + description: 'Placeholder for feed selection', + }, + pageNotFound: { + id: 'placeholders.pageNotFound', + defaultMessage: 'Page not found', + description: 'Placholder text for missing page', + }, +}; + +export const profile = { + sidebarCaption: { + id: 'profile.sidebar.caption', + defaultMessage: 'Popular posts', + description: 'Caption for the profile page sidebar showing a list of trending notes by the profile', + }, + sidebarNoNotes: { + id: 'profile.sidebar.noNotes', + defaultMessage: 'No trending posts', + description: 'Placeholde for profile sidebar when the profile is missing trending notes', + }, + title: { + id: 'profile.title', + defaultMessage: '{name} - Nostr Profile', + description: 'Page title for Profile page' + }, + followsYou: { + id: 'profile.followsYou', + defaultMessage: 'Follows you', + description: 'Label indicating that a profile is following your profile', + }, + jointDate: { + id: 'profile.joinDate', + defaultMessage: 'Joined Nostr on {date}', + description: 'Label indicating when the profile joined Nostr (oldest event)', + }, + stats: { + follow: { + id: 'profile.followStats', + defaultMessage: 'Following', + description: 'Label for following profile stat', + }, + followers: { + id: 'profile.stats.followers', + defaultMessage: 'Followers', + description: 'Label for followers profile stat', + }, + notes: { + id: 'profile.stats.notes', + defaultMessage: 'Posts', + description: 'Label for notes profile stat', + }, + }, +}; + +export const search = { + followers: { + id: 'search.followers', + defaultMessage: 'followers', + description: 'Followers label for user search results', + }, + invalid: { + id: 'search.invalid', + defaultMessage: 'Please enter search term.', + description: 'Alert letting the user know that the search term is empty', + }, + emptyQueryResult: { + id: 'search.emptyQueryResult', + defaultMessage: 'type to', + description: 'Label shown is search resuls when no term is provided', + }, + searchNostr: { + id: 'search.searchNostr', + defaultMessage: 'search nostr', + description: 'Label explaining full search action', + }, + sidebarCaption: { + id: 'search.sidebarCaption', + defaultMessage: 'Users found', + description: 'Caption for the search page sidebar showing a list of users', + }, + feedLabel: { + id: 'search.feedLabel', + defaultMessage: 'Search: {query}', + description: 'Label for a search results feed', + }, + title: { + id: 'search.title', + defaultMessage: 'search for "{query}"', + description: 'Title of the Search page', + }, + noResults: { + id: 'search.noResults', + defaultMessage: 'No results found', + description: 'Message shown when no search results were found' + }, +}; + +export const settings = { + title: { + id: 'settings.title', + defaultMessage: 'Settings', + description: 'Title of the settings page', + }, + theme: { + id: 'settings.sections.theme', + defaultMessage: 'Theme', + description: 'Title of the theme section on the settings page', + }, + feeds: { + id: 'settings.sections.feeds', + defaultMessage: 'Home page feeds', + description: 'Title of the feeds section on the settings page', + }, + zaps: { + id: 'settings.sections.zaps', + defaultMessage: 'Zaps', + description: 'Title of the zaps section on the settings page', + }, + notifications: { + title: { + id: 'pages.settings.sections.notifications', + defaultMessage: 'Notifications', + description: 'Title of the notifications section on the settings page', + }, + core: { + id: 'settings.sections.notifications.core', + defaultMessage: 'Core notifications:', + description: 'Title of the notification settings sub-section for core notifications', + }, + yourMentions: { + id: 'settings.sections.notifications.yourMentions', + defaultMessage: 'A post you were mentioned in was:', + description: 'Title of the notification settings sub-section for posts you were mentioned in', + }, + yourPostMentions: { + id: 'settings.sections.notifications.yourPostMentions', + defaultMessage: 'A post your post was mentioned in was:', + description: 'Title of the notification settings sub-section for posts your post was mentioned in', + }, + } +}; + +export const scopeDescriptors: Record = { + follows: { + caption: { + id: 'explore.scopes.follows.caption', + defaultMessage: 'Follows', + description: 'Caption for the follows scope', + }, + label: { + id: 'explore.scopes.follows.label', + defaultMessage: 'my follows', + description: 'Label for the follows scope', + }, + description: { + id: 'explore.scopes.follows.description', + defaultMessage: 'accounts you follow', + description: 'Description of the follows scope description', + }, + }, + tribe: { + caption: { + id: 'explore.scopes.tribe.caption', + defaultMessage: 'Tribe', + description: 'Caption for the tribe scope', + }, + label: { + id: 'explore.scopes.tribe.label', + defaultMessage: 'my tribe', + description: 'Label for the tribe scope', + }, + description: { + id: 'explore.scopes.tribe.description', + defaultMessage: 'accounts you follow + your followers', + description: 'Description of the tribe scope description', + }, + }, + network: { + caption: { + id: 'explore.scopes.network.caption', + defaultMessage: 'Network', + description: 'Caption for the network scope', + }, + label: { + id: 'explore.scopes.network.label', + defaultMessage: 'my network', + description: 'Label for the network scope', + }, + description: { + id: 'explore.scopes.network.description', + defaultMessage: 'accounts you follow + everyone they follow', + description: 'Description of the network scope description', + }, + }, + global: { + caption: { + id: 'explore.scopes.global.caption', + defaultMessage: 'Global', + description: 'Caption for the global scope', + }, + label: { + id: 'explore.scopes.global.label', + defaultMessage: 'global', + description: 'Label for the global scope', + }, + description: { + id: 'explore.scopes.global.description', + defaultMessage: 'all accounts on nostr', + description: 'Description of the global scope description', + }, + }, +}; + +export const timeframeDescriptors: Record = { + latest: { + id: 'explore.timeframes.latest.caption', + defaultMessage: 'latest', + description: 'Caption for the latest timeframe', + }, + trending: { + id: 'explore.timeframes.trending.caption', + defaultMessage: 'trending', + description: 'Caption for the trending timeframe', + }, + popular: { + id: 'explore.timeframes.popular.caption', + defaultMessage: 'popular', + description: 'Caption for the popular timeframe', + }, + mostzapped: { + id: 'explore.timeframes.mostzapped.caption', + defaultMessage: 'zapped', + description: 'Caption for the mostzapped timeframe', + }, +}; + +export const toastZapFail = { + id: 'toast.zapFail', + defaultMessage: 'We were unable to send this Zap', + description: 'Toast message indicating failed zap', +}; + +export const thread = { + sidebar: { + id: 'thread.sidebar.title', + defaultMessage: 'People in this thread', + description: 'Title of the Thread page sidebar', + }, +}; + +export const toast = { + addFeedToHomeSuccess: { + id: 'toasts.addFeedToHome.success', + defaultMessage: '"{name}" has been added to your home page', + description: 'Toast message confirming successfull adding of the feed to home to the list of available feeds', + }, + fileTypeUpsupported: { + id: 'toast.unsupportedFileType', + defaultMessage: 'You can only upload images and videos. This file type is not supported.', + description: 'Feedback when user tries to upload an unsupported file type', + }, + noRelays: { + id: 'toast.noRelays', + defaultMessage: 'You need to declare at least one relay to perform this action', + description: 'Toast message indicating user has no relays configured', + }, + noRelaysConnected: { + id: 'toast.noRelaysConnected', + defaultMessage: '"We are trying to connect to your relays. Please try again in a few moments.', + description: 'Toast message indicating user is not connected to aany relay', + }, + noteNostrLinkCoppied: { + id: 'noteNostrLinkCoppied', + defaultMessage: 'Note\'s nostr link copied', + description: 'Confirmation message that the note\'s link has been copied', + }, + notePrimalLinkCoppied: { + id: 'notePrimalLinkCoppied', + defaultMessage: 'Note\'s Primal link copied', + description: 'Confirmation message that the note\'s link has been copied', + }, + repostSuccess: { + id: 'toast.repostSuccess', + defaultMessage: 'Reposted successfully', + description: 'Toast message indicating successfull repost', + }, + repostFailed: { + id: 'toast.repostFailed', + defaultMessage: 'Failed to repost', + description: 'Toast message indicating failed repost', + }, + zapAsGuest: { + id: 'toast.zapAsGuest', + defaultMessage: 'You must be logged-in to perform a zap', + description: 'Toast message indicating user must be logged-in to perform a zap', + }, + zapUnavailable: { + id: 'toast.zapUnavailable', + defaultMessage: 'Author of this post cannot be zapped', + description: 'Toast message indicating user cannot receieve a zap', + }, +}; + +export const zapCustomOption = { + id: 'zap.custom.option', + defaultMessage: `Zap {user} `, + description: 'Caption for custom zap amount modal', +}; diff --git a/src/types/primal.d.ts b/src/types/primal.d.ts new file mode 100644 index 0000000..ef30b17 --- /dev/null +++ b/src/types/primal.d.ts @@ -0,0 +1,516 @@ +import { MessageDescriptor } from "@cookbook/solid-intl"; +import { Relay } from "nostr-tools"; +import { JSX } from "solid-js"; +import { SetStoreFunction } from "solid-js/store"; +import { Kind } from "../constants"; + + +export type NostrNoteContent = { + kind: Kind.Text | Kind.Repost, + content: string, + id: string, + created_at?: number, + pubkey: string, + sig: string, + tags: string[][], +}; + +export type NostrUserContent = { + kind: Kind.Metadata, + content: string, + id: string, + created_at?: number, + pubkey: string, + sig: string, + tags: string[][], +}; + +export type NostrStatsContent = { + kind: Kind.NoteStats, + content: string, + pubkey?: string, + created_at?: number, +}; + +export type NostrNetStatsContent = { + kind: Kind.NetStats, + content: string, + pubkey?: string, + created_at?: number, +}; + +export type NostrLegendStatsContent = { + kind: Kind.LegendStats, + content: string, + pubkey?: string, + created_at?: number, +}; + +export type NostrUserStatsContent = { + kind: Kind.UserStats, + content: string, + pubkey: string, + created_at: number, +}; + +export type NostrMentionContent = { + kind: Kind.Mentions, + content: string, + pubkey?: string, + created_at?: number, +}; + +export type NostrOldestEventContent = { + kind: Kind.OldestEvent, + content: string, + pubkey?: string, + created_at?: number, +}; + +export type NostrContactsContent = { + kind: Kind.Contacts, + content: string, + pubkey?: string, + created_at?: number, + tags: string[][], +}; + +export type NostrScoredUsersContent = { + kind: Kind.UserScore, + content: string, + created_at?: number, + pubkey?: string, +}; + +export type NostrNotificationContent = { + kind: Kind.Notification, + content: string, + created_at?: number, + pubkey?: string, +}; + +export type NostrNotificationLastSeenContent = { + kind: Kind.Timestamp, + content: string, + created_at?: number, + pubkey?: string, +}; + +export type NostrNotificationStatsContent = { + kind: Kind.NotificationStats, + content: string, + created_at?: number, + pubkey?: string, +}; + +export type NostrNoteActionsContent = { + kind: Kind.NoteActions, + content: string, + created_at?: number, + pubkey?: string, +}; + +export type NostrMessageStatsContent = { + kind: Kind.MessageStats, + cnt: string, + content?: string, + created_at?: number, + pubkey?: string, +}; + +export type NostrMessagePerSenderStatsContent = { + kind: Kind.MesagePerSenderStats, + content: string, + created_at?: number, + pubkey?: string, +}; + +export type NostrMessageEncryptedContent = { + kind: Kind.EncryptedDirectMessage, + content: string, + created_at: number, + pubkey: string, + id: string, +}; + +export type NostrFeedRange = { + kind: Kind.FeedRange, + content: string, +}; + +export type NostrMediaInfo = { + kind: Kind.MediaInfo, + content: string, +}; + +export type NostrMediaUploaded = { + kind: Kind.Uploaded, + content: string, +}; + +export type NostrEventContent = + NostrNoteContent | + NostrUserContent | + NostrStatsContent | + NostrNetStatsContent | + NostrLegendStatsContent | + NostrUserStatsContent | + NostrMentionContent | + NostrOldestEventContent | + NostrContactsContent | + NostrScoredUsersContent | + NostrNotificationContent | + NostrNotificationLastSeenContent | + NostrNotificationStatsContent | + NostrNoteActionsContent | + NostrMessageStatsContent | + NostrMessagePerSenderStatsContent | + NostrMessageEncryptedContent | + NostrFeedRange | + NostrMediaInfo | + NostrMediaUploaded; + +export type NostrEvent = [ + type: "EVENT", + subkey: string, + content: NostrEventContent, +]; + +export type NostrEOSE = [ + type: "EOSE", + subkey: string, +]; + +export type NoteActions = { + event_id: string, + liked: boolean, + replied: boolean, + reposted: boolean, + zapped: boolean, +}; + +export type FeedStore = { + posts: PrimalNote[], + isFetching: boolean, + scrollTop: number, + activeUser: PrimalUser | undefined, + publicKey: string | undefined, + selectedFeed: PrimalFeed | undefined, + availableFeeds: PrimalFeed[], + showNewNoteForm: boolean, + theme: string, + trendingNotes: TrendingNotesStore, + zappedNotes: TrendingNotesStore, + exploredNotes: PrimalNote[] | [], + threadedNotes: PrimalNote[] | [], +}; + +export type NostrPostStats = { + [eventId: string]: { + likes: number, + mentions: number, + reposts: number, + replies: number, + zaps: number, + satszapped: number, + score: number, + score24h: number, + }, +}; + +export type FeedPage = { + users: { + [pubkey: string]: NostrUserContent, + }, + messages: NostrNoteContent[], + postStats: NostrPostStats, + mentions?: Record, + noteActions: Record, +}; + +export type TrendingNotesStore = { + users: { + [pubkey: string]: NostrUserContent, + }, + messages: NostrNoteContent[], + notes: PrimalNote[], + postStats: NostrPostStats, +}; + +export type PrimalContextStore = { + + data: FeedStore, + page: FeedPage, + relays: Relay[], + // likes: string[], + actions?: { + clearThreadedNotes: () => void, + setThreadedNotes: (newNotes: PrimalNote[]) => void, + setData: SetStoreFunction, + clearExploredNotes: () => void, + setExploredNotes: (newNotes: PrimalNote[]) => void, + clearTrendingNotes: () => void, + clearZappedNotes: () => void, + setTheme: (newTheme: string) => void, + showNewNoteForm: () => void, + hideNewNoteForm: () => void, + fetchHomeFeed: () => void, + selectFeed: (profile: PrimalFeed | undefined) => void, + clearData: () => void, + loadNextPage: () => void, + savePosts: (posts: PrimalNote[]) => void, + clearPage: () => void, + setActiveUser: (user: PrimalUser) => void, + updatedFeedScroll: (scrollTop: number) => void, + proccessEventContent: ( + content: NostrUserContent | NostrNoteContent | NostrStatsContent, + type: string + ) => void, + }, +}; + +export type NostrRelay = { read: boolean, write: boolean }; + +export type NostrRelays = Record; + +export type NostrRelayEvent = { + kind: number, + content: string, + created_at: number, + tags: string[][], +}; +export type NostrRelaySignedEvent = NostrRelayEvent & { + id: string, + pubkey: string, + sig: string, +}; + +interface SendPaymentResponse { + preimage: string; +} + +export type NostrWindow = Window & typeof globalThis & { + nostr?: { + getPublicKey: () => Promise, + getRelays: () => Promise, + signEvent: (event: NostrRelayEvent) => Promise, + nip04: { + encrypt: (pubkey: string, message: string) => Promise, + decrypt: (pubkey: string, message: string) => Promise, + }, + }, + webln?: { + enable: () => Promise, + sendPayment: (req: string) => Promise; + }, +}; + +export type PrimalWindow = Window & typeof globalThis & { + loadPrimalStores: () => void, + primal?: any, +}; + +export type NostrEventType = "EVENT" | "EOSE" | "NOTICE"; + +export type NostrMessage = [ + type: NostrEventType, + subkey: string, + info: { + kind: number, + content: string, + }, +]; + +export type PrimalUser = { + id: string, + pubkey: string, + npub: string, + name: string, + about: string, + picture: string, + nip05: string, + banner: string, + display_name?: string, + displayName: string, + location: string, + lud06: string, + lud16: string, + website: string, + tags: string[][], +}; + +export type PrimalNoteData = { + id: string, + pubkey: string, + created_at: number, + tags: string[][], + content: string, + sig: string, + likes: number, + mentions: number, + reposts: number, + replies: number, + zaps: number, + score: number, + score24h: number, + satszapped: number, + noteId: string, + noteActions: NoteActions, +} + +export type PrimalNote = { + user: PrimalUser, + post: PrimalNoteData, + repost?: PrimalRepost, + msg: NostrNoteContent, + mentionedNotes?: Record, + mentionedUsers?: Record, +}; + +export type PrimalFeed = { + name: string, + npub?: string, + hex?: string, +}; + +export type PrimalScopeFeed = { + name: string, + scope?: string, + timeframe?: string, +}; + +// export type PrimalFeed = PrimalUserFeed & PrimalScopeFeed; + +export type PrimalNetStats = { + users: number, + pubkeys: number, + pubnotes: number, + reactions: number, + reposts: number, + any: number, + zaps: number, + satszapped: number, +}; + +export type PrimalResponse = { + op: string, + netstats?: PrimalNetStats; +}; + +export type PrimalLegend = { + your_follows: number, + your_inner_network: number, + your_outer_network: number, +}; + +export type FeedOption = { + label: string, + value: string | undefined, +}; + +export type PrimalRepost = { + user: PrimalUser, + note: PrimalNoteData, +} + +export type RepostInfo = (page: FeedPage, message: NostrNoteContent) => PrimalRepost; + +export type ExploreFeedPayload = { + timeframe: string, + scope: string, + limit: number, + user_pubkey?: string, + since? : number, + until?: number, + created_after?: number, +} + +export type UserReference = { + id: string, + pubkey: string, + kind: number, + tags: string[][], + npub?: string, + name?: string, + about?: string, + picture?: string, + nip05?: string, + banner?: string, + display_name?: string, + displayName?: string, + location?: string, + lud06?: string, + lud16?: string, + website?: string, + content?: string, + created_at?: number, + sig?: string, +}; + +export type ContextChildren = + number | + boolean | + Node | + JSX.ArrayElement | + JSX.FunctionElement | + (string & {}) | null | undefined; + + +export type PrimalTheme = { name: string, label: string, logo: string, dark?: boolean}; + +export type ChildrenProp = { children: number | boolean | Node | JSX.ArrayElement | JSX.FunctionElement | (string & {}) | null | undefined; }; + +export type VanityProfiles = { names: Record }; + +export type PrimalNotifUser = PrimalUser & { followers_count: number }; + +export type PrimalNotification = { + pubkey: string, + created_at: number, + type: number, + your_post?: string, + follower?: string, + you_were_mentioned_in?: string, + your_post_were_mentioned_in?: string, + post_you_were_mentioned_in?: string, + post_your_post_was_mentioned_in?: string, + who_liked_it?: string, + who_zapped_it?: string, + who_reposted_it?: string, + who_replied_to_it?: string, + satszapped?: number, +}; + +export type SortedNotifications = Record; + +export type UserRelation = 'follows' | 'other' | 'any'; + +export type EmojiOption = { + keywords: string[], + char: string, + fitzpatrick_scale: boolean, + category: string, + name: string, +}; + +export type MediaSize = 'o' | 's' | 'm' | 'l'; + +export type MediaVariant = { + s: MediaSize, + a: 0 | 1, + w: number, + h: number, + mt: string, + media_url: string, +} + +export type MediaEvent = { + event_id: string, + resources: { url: string, variants: MediaVariant[] }[], +} + +export type ScopeDescriptor = { + caption: MessageDescriptor, + label: MessageDescriptor, + description: MessageDescriptor, +} diff --git a/src/uploadSocket.tsx b/src/uploadSocket.tsx new file mode 100644 index 0000000..bb16f54 --- /dev/null +++ b/src/uploadSocket.tsx @@ -0,0 +1,102 @@ +import { createSignal } from "solid-js"; +import { NostrEvent, NostrEOSE, NostrEventType, NostrEventContent } from "./types/primal"; + +export const [socket, setSocket] = createSignal(); + +export const [isConnected, setConnected] = createSignal(false); + +export const isNotConnected = () => !isConnected(); + +const onOpen = () => { + setConnected(true); +} + +const onClose = () => { + setConnected(false); + + socket()?.removeEventListener('open', onOpen); + socket()?.removeEventListener('close', onClose); + socket()?.removeEventListener('error', onError); + + setTimeout(() => { + connect(); + }, 200); +} + +const onError = (error: Event) => { + console.log("ws error: ", error); +}; + +export const connect = () => { + if (isNotConnected()) { + const cacheServer = localStorage.getItem('uploadServer') ?? + 'wss://uploads.primal.net/v1'; + + setSocket(new WebSocket(cacheServer)); + console.log('UPLOAD SOCKET: ', socket()); + + socket()?.addEventListener('open', onOpen); + socket()?.addEventListener('close', onClose); + socket()?.addEventListener('error', onError); + } +}; + +export const disconnect = () => { + socket()?.close(); +}; + +export const reset = () => { + disconnect(); + setTimeout(connect, 1000); +}; + +export const sendMessage = (message: string) => { + isConnected() && socket()?.send(message); +} + +export const refreshSocketListeners = ( + ws: WebSocket | undefined, + listeners: Record any>, + ) => { + + if (!ws) { + return; + } + + Object.keys(listeners).forEach((event: string) => { + ws.removeEventListener(event, listeners[event]); + ws.addEventListener(event, listeners[event]); + }); +}; + +export const removeSocketListeners = ( + ws: WebSocket | undefined, + listeners: Record any>, + ) => { + + if (!ws) { + return; + } + + Object.keys(listeners).forEach((event: string) => { + ws.removeEventListener(event, listeners[event]); + }); +}; + +export const subscribeTo = (subId: string, cb: (type: NostrEventType, subId: string, content?: NostrEventContent) => void ) => { + const listener = (event: MessageEvent) => { + const message: NostrEvent | NostrEOSE = JSON.parse(event.data); + const [type, subscriptionId, content] = message; + + if (subId === subscriptionId) { + cb(type, subscriptionId, content); + } + + }; + + socket()?.addEventListener('message', listener); + + return () => { + socket()?.removeEventListener('message', listener); + }; +}; diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..803366b --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,23 @@ +let debounceTimer: number = 0; + +export const debounce = (callback: TimerHandler, time: number) => { + if (debounceTimer) { + window.clearTimeout(debounceTimer); + } + + debounceTimer = window.setTimeout(callback, time); +} + +export const isVisibleInContainer = (element: Element, container: Element) => { + const { bottom, height, top } = element.getBoundingClientRect(); + const containerRect = container.getBoundingClientRect(); + + return top <= containerRect.top ? containerRect.top - top <= height : bottom - containerRect.bottom <= height; +}; + +export const uuidv4 = () => { + // @ts-ignore + return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c => + (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) + ); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..30ac248 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "strict": true, + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "jsx": "preserve", + "jsxImportSource": "solid-js", + "types": ["vite/client"], + "noEmit": true, + "isolatedModules": true, + "resolveJsonModule": true + } +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..476f5ba --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'vite'; +import solidPlugin from 'vite-plugin-solid'; + +export default defineConfig({ + plugins: [solidPlugin()], + server: { + port: 3000, + }, + build: { + target: 'esnext', + sourcemap: true, + }, +});