mirror of
https://github.com/MyLuxy/overdrive.git
synced 2026-10-17 12:01:07 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2211b28c7c | ||
|
|
a337cd7493 | ||
|
|
3bac8bf76f | ||
|
|
ece84f340d | ||
|
|
a86383499d | ||
|
|
1deb8f95d9 | ||
|
|
2e6285e3c6 | ||
|
|
1a373b7f23 | ||
|
|
6ba1131b09 | ||
|
|
ce257ec2f2 | ||
|
|
214b992769 | ||
|
|
c3b284f1d5 | ||
|
|
9189fccfd1 | ||
|
|
9c6a598ca8 | ||
|
|
9ca7ad56b7 | ||
|
|
1f21d10db9 | ||
|
|
7dc1f1defe | ||
|
|
4ad7ccb277 | ||
|
|
87cc62099c | ||
|
|
db6f723fc1 | ||
|
|
041ae791b2 | ||
|
|
511865a47b | ||
|
|
d6ebf939a5 | ||
|
|
c4f0579cb7 | ||
|
|
fae429219d | ||
|
|
13fb1dbdb1 | ||
|
|
b58946c506 | ||
|
|
b9cc056b42 | ||
|
|
2e9a415675 | ||
|
|
61298687f7 | ||
|
|
a211044154 | ||
|
|
4a4026b05c | ||
|
|
c9ef821164 | ||
|
|
264f78e6b9 | ||
|
|
d775ec8302 | ||
|
|
b20572b660 | ||
|
|
034e8d6af1 | ||
|
|
42176292ae | ||
|
|
b963ad59b6 |
No files matched your search
@@ -0,0 +1 @@
|
||||
github: MyLuxy
|
||||
@@ -90,7 +90,7 @@ body:
|
||||
id: logs
|
||||
attributes:
|
||||
label: Log
|
||||
description: If the app won't install or start, the relevant lines from `/data/shadowmount/debug.log` help a lot.
|
||||
description: For downloads and anything inside the app, copy `/data/ps5-react/PPSA99058/app.log` over FTP right after it happens. If a game won't install or start, the relevant lines from `/data/shadowmount/debug.log` help a lot.
|
||||
render: text
|
||||
|
||||
- type: checkboxes
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 369" width="1280" height="369" role="img" aria-label="Скачай Overdrive.exfat, скопируй его в папку homebrew, подключи накопитель, запусти">
|
||||
<rect x="4" y="4" width="295.5" height="361" rx="24.2" fill="#0c0c0e" stroke="#2a2a2f" stroke-width="2"/>
|
||||
<circle cx="52.4" cy="52.4" r="27.5" fill="#1d1d21" stroke="#2a2a2f" stroke-width="2"/>
|
||||
<path d="M55.79 41.57L55.79 63.18L53.11 63.18L53.11 44.15L52.99 44.15L47.74 47.97L47.74 45.07L52.56 41.57L55.79 41.57Z" fill="#f2f2f3" stroke="#f2f2f3" stroke-width="0.88" stroke-linejoin="round"/>
|
||||
<g transform="translate(123.15 54.6) scale(2.38)" fill="none" stroke="#f2f2f3" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><path d="m7 10 5 5 5-5"/><path d="M12 15V3"/></g>
|
||||
<path d="M107.76 169.34Q104.65 169.34 102.22 167.83Q99.8 166.33 98.42 163.55Q97.04 160.78 97.04 157.01Q97.04 153.23 98.42 150.45Q99.8 147.68 102.22 146.17Q104.65 144.65 107.76 144.65Q109.6 144.65 111.22 145.19Q112.85 145.73 114.14 146.76Q115.43 147.79 116.29 149.26Q117.15 150.73 117.49 152.58L114.45 152.58Q114.17 151.34 113.55 150.39Q112.93 149.44 112.04 148.79Q111.14 148.13 110.06 147.8Q108.97 147.47 107.76 147.47Q105.54 147.47 103.78 148.59Q102.02 149.71 101.02 151.84Q100.01 153.97 100.01 157.01Q100.01 160.04 101.02 162.17Q102.04 164.29 103.8 165.41Q105.55 166.52 107.76 166.52Q108.97 166.52 110.06 166.19Q111.14 165.86 112.04 165.21Q112.93 164.55 113.55 163.6Q114.17 162.65 114.45 161.41L117.49 161.41Q117.17 163.25 116.31 164.71Q115.45 166.16 114.16 167.2Q112.87 168.24 111.24 168.79Q109.61 169.34 107.76 169.34ZM121.02 169L121.02 151.15L123.89 151.15L123.89 158.88L125.69 158.88L132.12 151.15L135.78 151.15L128.58 159.78L135.88 169L132.24 169L126.39 161.54L123.89 161.54L123.89 169L121.02 169ZM143.1 169.39Q141.39 169.39 140 168.76Q138.62 168.13 137.8 166.91Q136.99 165.68 136.99 163.91Q136.99 162.38 137.59 161.42Q138.2 160.46 139.21 159.91Q140.23 159.36 141.47 159.09Q142.71 158.82 143.97 158.66Q145.58 158.45 146.58 158.33Q147.58 158.22 148.05 157.95Q148.53 157.67 148.53 157.01L148.53 156.92Q148.53 155.82 148.11 155.05Q147.69 154.27 146.85 153.85Q146.01 153.43 144.76 153.43Q143.48 153.43 142.57 153.84Q141.66 154.24 141.09 154.85Q140.52 155.46 140.28 156.14L137.49 155.37Q138.07 153.74 139.2 152.77Q140.33 151.79 141.77 151.35Q143.21 150.9 144.69 150.9Q145.69 150.9 146.85 151.15Q148.01 151.4 149.04 152.06Q150.07 152.73 150.73 153.95Q151.4 155.17 151.4 157.16L151.4 169L148.58 169L148.58 166.55L148.4 166.55Q148.09 167.18 147.43 167.84Q146.77 168.5 145.7 168.94Q144.63 169.39 143.1 169.39ZM143.58 166.84Q145.21 166.84 146.3 166.22Q147.4 165.6 147.96 164.6Q148.53 163.6 148.53 162.51L148.53 160.07Q148.35 160.27 147.79 160.43Q147.22 160.59 146.48 160.72Q145.74 160.85 145.02 160.94Q144.31 161.02 143.84 161.09Q142.79 161.22 141.89 161.53Q140.99 161.85 140.44 162.44Q139.89 163.04 139.89 164.07Q139.89 164.97 140.37 165.59Q140.84 166.21 141.67 166.53Q142.5 166.84 143.58 166.84ZM162.48 163.44Q159.37 163.44 157.52 161.79Q155.67 160.14 155.67 156.83L155.67 151.15L158.53 151.15L158.53 156.83Q158.53 158.86 159.66 159.82Q160.79 160.78 162.48 160.78Q164.22 160.78 165.64 160.46Q167.06 160.14 168.48 159.64L168.48 162.3Q167.54 162.64 166.61 162.89Q165.69 163.15 164.68 163.3Q163.67 163.44 162.48 163.44ZM166.74 169L166.74 151.15L169.6 151.15L169.6 169L166.74 169ZM178.93 169.39Q177.23 169.39 175.84 168.76Q174.45 168.13 173.64 166.91Q172.83 165.68 172.83 163.91Q172.83 162.38 173.43 161.42Q174.04 160.46 175.05 159.91Q176.07 159.36 177.31 159.09Q178.55 158.82 179.8 158.66Q181.42 158.45 182.41 158.33Q183.41 158.22 183.89 157.95Q184.36 157.67 184.36 157.01L184.36 156.92Q184.36 155.82 183.95 155.05Q183.53 154.27 182.69 153.85Q181.85 153.43 180.59 153.43Q179.32 153.43 178.41 153.84Q177.5 154.24 176.93 154.85Q176.36 155.46 176.11 156.14L173.33 155.37Q173.91 153.74 175.03 152.77Q176.16 151.79 177.6 151.35Q179.05 150.9 180.53 150.9Q181.53 150.9 182.69 151.15Q183.85 151.4 184.88 152.06Q185.91 152.73 186.57 153.95Q187.23 155.17 187.23 157.16L187.23 169L184.41 169L184.41 166.55L184.24 166.55Q183.93 167.18 183.27 167.84Q182.61 168.5 181.54 168.94Q180.46 169.39 178.93 169.39ZM179.42 166.84Q181.04 166.84 182.14 166.22Q183.24 165.6 183.8 164.6Q184.36 163.6 184.36 162.51L184.36 160.07Q184.19 160.27 183.62 160.43Q183.06 160.59 182.32 160.72Q181.58 160.85 180.86 160.94Q180.14 161.02 179.68 161.09Q178.63 161.22 177.73 161.53Q176.82 161.85 176.28 162.44Q175.73 163.04 175.73 164.07Q175.73 164.97 176.2 165.59Q176.68 166.21 177.51 166.53Q178.34 166.84 179.42 166.84ZM205.89 169L203.01 169L203.01 156.06L202.81 156.06L194.24 169L191.5 169L191.5 151.15L194.37 151.15L194.37 164.13L194.55 164.13L203.15 151.15L205.89 151.15L205.89 169ZM198.69 148.63Q197.38 148.63 196.33 148.03Q195.27 147.42 194.65 146.39Q194.03 145.35 194.03 144.07L196.14 144.07Q196.14 145.18 196.86 145.89Q197.58 146.59 198.69 146.59Q199.8 146.59 200.52 145.89Q201.24 145.18 201.24 144.07L203.35 144.07Q203.35 145.35 202.73 146.38Q202.11 147.41 201.06 148.02Q200.01 148.63 198.69 148.63Z" fill="#f2f2f3" stroke="#f2f2f3" stroke-width="0.99" stroke-linejoin="round"/>
|
||||
<path d="M132.96 219.84Q131.42 219.84 130.25 219.12Q129.08 218.39 128.43 217.07Q127.78 215.75 127.78 214.01Q127.78 212.25 128.43 210.93Q129.08 209.6 130.25 208.87Q131.42 208.14 132.96 208.14L134.79 208.14Q136.33 208.14 137.5 208.87Q138.67 209.6 139.33 210.93Q139.98 212.25 139.98 214.01Q139.98 215.75 139.33 217.07Q138.67 218.39 137.5 219.12Q136.33 219.84 134.79 219.84L132.96 219.84ZM132.96 218.3L134.79 218.3Q135.91 218.3 136.66 217.71Q137.41 217.11 137.79 216.13Q138.18 215.15 138.18 214.01Q138.18 212.85 137.79 211.85Q137.41 210.85 136.66 210.23Q135.91 209.61 134.79 209.61L132.96 209.61Q131.84 209.61 131.09 210.23Q130.34 210.85 129.96 211.85Q129.58 212.85 129.58 214.01Q129.58 215.15 129.96 216.13Q130.34 217.11 131.09 217.71Q131.84 218.3 132.96 218.3ZM132.96 223.87L132.96 204.39L134.79 204.39L134.79 223.87L132.96 223.87ZM145.75 219.84Q144.67 219.84 143.79 219.45Q142.91 219.05 142.4 218.27Q141.88 217.5 141.88 216.38Q141.88 215.41 142.26 214.8Q142.65 214.19 143.29 213.84Q143.93 213.5 144.72 213.32Q145.5 213.15 146.3 213.05Q147.32 212.92 147.95 212.84Q148.59 212.77 148.89 212.6Q149.19 212.43 149.19 212.01L149.19 211.95Q149.19 211.25 148.92 210.76Q148.66 210.27 148.13 210.01Q147.6 209.74 146.8 209.74Q145.99 209.74 145.42 210Q144.84 210.25 144.48 210.64Q144.12 211.03 143.96 211.46L142.2 210.97Q142.57 209.94 143.28 209.32Q143.99 208.7 144.91 208.42Q145.82 208.14 146.76 208.14Q147.39 208.14 148.13 208.3Q148.86 208.46 149.52 208.87Q150.17 209.29 150.59 210.07Q151.01 210.84 151.01 212.1L151.01 219.6L149.22 219.6L149.22 218.05L149.11 218.05Q148.91 218.45 148.49 218.87Q148.08 219.28 147.4 219.56Q146.72 219.84 145.75 219.84ZM146.06 218.23Q147.09 218.23 147.78 217.84Q148.47 217.45 148.83 216.81Q149.19 216.18 149.19 215.49L149.19 213.95Q149.08 214.07 148.72 214.17Q148.36 214.27 147.89 214.35Q147.42 214.44 146.97 214.49Q146.51 214.55 146.22 214.59Q145.56 214.67 144.98 214.87Q144.41 215.07 144.07 215.45Q143.72 215.82 143.72 216.48Q143.72 217.05 144.02 217.44Q144.32 217.83 144.85 218.03Q145.37 218.23 146.06 218.23ZM163.24 219.6L161.41 219.6L161.41 211.41L161.29 211.41L155.86 219.6L154.13 219.6L154.13 208.29L155.94 208.29L155.94 216.52L156.06 216.52L161.51 208.29L163.24 208.29L163.24 219.6ZM158.68 206.7Q157.85 206.7 157.18 206.32Q156.52 205.94 156.12 205.28Q155.73 204.62 155.73 203.81L157.07 203.81Q157.07 204.52 157.52 204.96Q157.98 205.4 158.68 205.4Q159.38 205.4 159.84 204.96Q160.29 204.52 160.29 203.81L161.63 203.81Q161.63 204.62 161.24 205.27Q160.84 205.93 160.18 206.31Q159.52 206.7 158.68 206.7ZM164.99 219.6L164.99 217.92L165.39 217.92Q165.89 217.92 166.24 217.73Q166.58 217.54 166.79 217.05Q167 216.56 167.11 215.66Q167.23 214.75 167.29 213.32L167.5 208.29L175.18 208.29L175.18 219.6L173.35 219.6L173.35 209.98L169.23 209.98L169.06 213.96Q168.98 215.84 168.64 217.1Q168.31 218.35 167.59 218.98Q166.87 219.6 165.61 219.6L164.99 219.6Z" fill="#a3a3ab"/>
|
||||
<rect x="60.85" y="230.6" width="181.79" height="35.2" rx="9.9" fill="#1d1d21" stroke="#2a2a2f" stroke-width="1.5"/>
|
||||
<path d="M84.22 255.01Q82.26 255.01 80.73 254.06Q79.2 253.1 78.32 251.35Q77.45 249.6 77.45 247.21Q77.45 244.81 78.32 243.05Q79.2 241.3 80.73 240.34Q82.26 239.38 84.22 239.38Q86.18 239.38 87.71 240.34Q89.24 241.3 90.12 243.05Q90.99 244.81 90.99 247.21Q90.99 249.6 90.12 251.35Q89.24 253.1 87.71 254.06Q86.18 255.01 84.22 255.01ZM84.22 253.23Q85.58 253.23 86.69 252.53Q87.79 251.84 88.45 250.5Q89.11 249.16 89.11 247.21Q89.11 245.25 88.45 243.9Q87.79 242.55 86.69 241.86Q85.58 241.17 84.22 241.17Q82.86 241.17 81.74 241.86Q80.63 242.55 79.98 243.9Q79.32 245.25 79.32 247.21Q79.32 249.16 79.98 250.5Q80.63 251.84 81.74 252.53Q82.86 253.23 84.22 253.23ZM97.02 254.8L92.69 243.49L94.68 243.49L97.09 250.17Q97.47 251.18 97.73 252.18Q98 253.18 98.3 254.12L97.66 254.12Q97.95 253.18 98.22 252.18Q98.49 251.18 98.86 250.17L101.26 243.49L103.25 243.49L98.92 254.8L97.02 254.8ZM110.05 255.04Q108.41 255.04 107.23 254.31Q106.04 253.58 105.4 252.27Q104.77 250.96 104.77 249.23Q104.77 247.49 105.39 246.17Q106.02 244.84 107.17 244.09Q108.32 243.34 109.85 243.34Q110.8 243.34 111.68 243.66Q112.57 243.97 113.28 244.66Q113.98 245.34 114.39 246.42Q114.81 247.5 114.81 249.03L114.81 249.75L105.95 249.75L105.95 248.21L113.83 248.21L112.98 248.77Q112.98 247.66 112.62 246.79Q112.27 245.93 111.57 245.44Q110.87 244.95 109.85 244.95Q108.84 244.95 108.1 245.45Q107.37 245.94 106.98 246.75Q106.59 247.56 106.59 248.52L106.59 249.5Q106.59 250.75 107.02 251.63Q107.45 252.5 108.24 252.96Q109.02 253.42 110.06 253.42Q110.75 253.42 111.3 253.22Q111.86 253.01 112.26 252.62Q112.65 252.22 112.86 251.65L114.62 252.05Q114.37 252.93 113.74 253.61Q113.1 254.29 112.16 254.67Q111.23 255.04 110.05 255.04ZM117.34 254.8L117.34 243.49L119.09 243.49L119.09 245.24L119.2 245.24Q119.51 244.38 120.29 243.86Q121.07 243.33 122.09 243.33Q122.31 243.33 122.57 243.34Q122.84 243.36 122.99 243.37L122.99 245.2Q122.91 245.18 122.59 245.14Q122.27 245.09 121.9 245.09Q121.11 245.09 120.49 245.43Q119.87 245.76 119.51 246.35Q119.15 246.94 119.15 247.74L119.15 254.8L117.34 254.8ZM129.26 255.03Q127.84 255.03 126.76 254.32Q125.68 253.6 125.07 252.28Q124.46 250.96 124.46 249.18Q124.46 247.39 125.07 246.08Q125.68 244.77 126.76 244.05Q127.85 243.34 129.27 243.34Q130.31 243.34 130.96 243.68Q131.62 244.02 131.99 244.48Q132.37 244.93 132.58 245.29L132.71 245.29L132.71 239.59L134.52 239.59L134.52 254.8L132.77 254.8L132.77 253.05L132.6 253.05Q132.37 253.42 131.98 253.89Q131.59 254.35 130.94 254.69Q130.29 255.03 129.26 255.03ZM129.53 253.41Q130.56 253.41 131.28 252.87Q132 252.33 132.38 251.37Q132.75 250.41 132.75 249.16Q132.75 247.9 132.38 246.96Q132.01 246.02 131.29 245.5Q130.57 244.97 129.53 244.97Q128.47 244.97 127.75 245.52Q127.03 246.06 126.67 247.01Q126.31 247.95 126.31 249.16Q126.31 250.37 126.68 251.34Q127.04 252.3 127.77 252.86Q128.49 253.41 129.53 253.41ZM137.65 254.8L137.65 243.49L139.4 243.49L139.4 245.24L139.5 245.24Q139.82 244.38 140.6 243.86Q141.38 243.33 142.4 243.33Q142.62 243.33 142.88 243.34Q143.15 243.36 143.3 243.37L143.3 245.2Q143.22 245.18 142.9 245.14Q142.58 245.09 142.21 245.09Q141.42 245.09 140.8 245.43Q140.18 245.76 139.82 246.35Q139.46 246.94 139.46 247.74L139.46 254.8L137.65 254.8ZM145.32 254.8L145.32 243.49L147.14 243.49L147.14 254.8L145.32 254.8ZM146.23 241.59Q145.72 241.59 145.35 241.24Q144.97 240.88 144.97 240.38Q144.97 239.87 145.35 239.52Q145.72 239.18 146.23 239.18Q146.75 239.18 147.12 239.52Q147.49 239.87 147.49 240.38Q147.49 240.88 147.12 241.24Q146.75 241.59 146.23 241.59ZM153.54 254.8L149.21 243.49L151.2 243.49L153.61 250.17Q153.98 251.18 154.25 252.18Q154.52 253.18 154.81 254.12L154.18 254.12Q154.46 253.18 154.73 252.18Q155.01 251.18 155.37 250.17L157.77 243.49L159.76 243.49L155.43 254.8L153.54 254.8ZM166.57 255.04Q164.92 255.04 163.74 254.31Q162.56 253.58 161.92 252.27Q161.28 250.96 161.28 249.23Q161.28 247.49 161.91 246.17Q162.54 244.84 163.68 244.09Q164.83 243.34 166.36 243.34Q167.31 243.34 168.2 243.66Q169.09 243.97 169.79 244.66Q170.5 245.34 170.91 246.42Q171.32 247.5 171.32 249.03L171.32 249.75L162.47 249.75L162.47 248.21L170.34 248.21L169.5 248.77Q169.5 247.66 169.14 246.79Q168.78 245.93 168.08 245.44Q167.38 244.95 166.36 244.95Q165.35 244.95 164.62 245.45Q163.88 245.94 163.5 246.75Q163.11 247.56 163.11 248.52L163.11 249.5Q163.11 250.75 163.54 251.63Q163.97 252.5 164.75 252.96Q165.54 253.42 166.58 253.42Q167.26 253.42 167.82 253.22Q168.37 253.01 168.77 252.62Q169.17 252.22 169.37 251.65L171.14 252.05Q170.88 252.93 170.25 253.61Q169.62 254.29 168.68 254.67Q167.74 255.04 166.57 255.04ZM175.18 254.94Q174.62 254.94 174.22 254.54Q173.82 254.15 173.82 253.58Q173.82 253.01 174.22 252.62Q174.62 252.22 175.18 252.22Q175.75 252.22 176.15 252.62Q176.55 253.01 176.55 253.58Q176.55 254.15 176.15 254.54Q175.75 254.94 175.18 254.94ZM184.38 255.04Q182.73 255.04 181.55 254.31Q180.37 253.58 179.73 252.27Q179.09 250.96 179.09 249.23Q179.09 247.49 179.72 246.17Q180.34 244.84 181.49 244.09Q182.64 243.34 184.17 243.34Q185.12 243.34 186.01 243.66Q186.9 243.97 187.6 244.66Q188.Line truncated
|
||||
<path d="M60.22 298.8L58.39 298.8L58.39 290.61L58.27 290.61L52.84 298.8L51.11 298.8L51.11 287.49L52.92 287.49L52.92 295.72L53.04 295.72L58.49 287.49L60.22 287.49L60.22 298.8ZM66.87 298.94Q65.72 298.94 64.78 298.57Q63.83 298.19 63.28 297.51Q62.72 296.83 62.69 295.94L64.55 295.94Q64.59 296.57 65.26 296.98Q65.94 297.39 66.86 297.39Q67.91 297.39 68.55 296.88Q69.2 296.36 69.2 295.58Q69.2 294.74 68.51 294.22Q67.81 293.71 66.63 293.71L65.86 293.71L65.86 292.34L66.63 292.34Q67.6 292.34 68.24 291.85Q68.88 291.36 68.88 290.56Q68.88 289.8 68.34 289.32Q67.8 288.84 66.92 288.84Q66.04 288.84 65.38 289.27Q64.72 289.71 64.7 290.43L62.95 290.43Q62.97 289.51 63.51 288.82Q64.05 288.13 64.95 287.74Q65.84 287.36 66.94 287.36Q68.07 287.36 68.91 287.78Q69.74 288.21 70.2 288.91Q70.66 289.62 70.66 290.47Q70.66 291.47 70.04 292.11Q69.43 292.75 68.5 292.93L68.5 293Q69.77 293.2 70.44 293.92Q71.1 294.64 71.1 295.69Q71.1 296.63 70.56 297.36Q70.02 298.1 69.06 298.52Q68.1 298.94 66.87 298.94ZM79.32 303.07L79.32 287.49L81.08 287.49L81.08 289.29L81.25 289.29Q81.48 288.93 81.86 288.48Q82.23 288.02 82.89 287.68Q83.54 287.34 84.58 287.34Q86.01 287.34 87.09 288.05Q88.16 288.77 88.77 290.08Q89.39 291.39 89.39 293.18Q89.39 294.96 88.78 296.28Q88.17 297.6 87.09 298.32Q86.01 299.03 84.59 299.03Q83.57 299.03 82.91 298.69Q82.25 298.35 81.87 297.89Q81.49 297.42 81.26 297.05L81.14 297.05L81.14 303.07L79.32 303.07ZM84.31 297.41Q85.37 297.41 86.09 296.86Q86.8 296.3 87.17 295.34Q87.54 294.37 87.54 293.16Q87.54 291.95 87.17 291.01Q86.8 290.06 86.09 289.52Q85.38 288.97 84.31 288.97Q83.27 288.97 82.55 289.5Q81.84 290.02 81.47 290.96Q81.1 291.9 81.1 293.16Q81.1 294.41 81.47 295.37Q81.85 296.33 82.56 296.87Q83.28 297.41 84.31 297.41ZM95.16 299.04Q94.08 299.04 93.2 298.65Q92.33 298.25 91.81 297.47Q91.3 296.7 91.3 295.58Q91.3 294.61 91.68 294Q92.06 293.39 92.7 293.04Q93.35 292.7 94.13 292.52Q94.92 292.35 95.71 292.25Q96.73 292.12 97.37 292.04Q98 291.97 98.3 291.8Q98.6 291.63 98.6 291.21L98.6 291.15Q98.6 290.45 98.34 289.96Q98.07 289.47 97.54 289.21Q97.01 288.94 96.21 288.94Q95.41 288.94 94.83 289.2Q94.25 289.45 93.89 289.84Q93.53 290.23 93.38 290.66L91.61 290.17Q91.98 289.14 92.69 288.52Q93.41 287.9 94.32 287.62Q95.23 287.34 96.17 287.34Q96.81 287.34 97.54 287.5Q98.28 287.66 98.93 288.07Q99.58 288.49 100 289.27Q100.42 290.04 100.42 291.3L100.42 298.8L98.63 298.8L98.63 297.25L98.52 297.25Q98.33 297.65 97.91 298.07Q97.49 298.48 96.81 298.76Q96.13 299.04 95.16 299.04ZM95.47 297.43Q96.5 297.43 97.19 297.04Q97.89 296.65 98.24 296.01Q98.6 295.38 98.6 294.69L98.6 293.15Q98.49 293.27 98.13 293.37Q97.78 293.47 97.31 293.55Q96.84 293.64 96.38 293.69Q95.93 293.75 95.63 293.79Q94.97 293.87 94.4 294.07Q93.83 294.27 93.48 294.65Q93.13 295.02 93.13 295.68Q93.13 296.25 93.43 296.64Q93.73 297.03 94.26 297.23Q94.79 297.43 95.47 297.43ZM107.08 298.94Q105.93 298.94 104.99 298.57Q104.04 298.19 103.49 297.51Q102.93 296.83 102.9 295.94L104.76 295.94Q104.8 296.57 105.47 296.98Q106.14 297.39 107.07 297.39Q108.11 297.39 108.76 296.88Q109.41 296.36 109.41 295.58Q109.41 294.74 108.72 294.22Q108.02 293.71 106.84 293.71L106.07 293.71L106.07 292.34L106.84 292.34Q107.81 292.34 108.45 291.85Q109.09 291.36 109.09 290.56Q109.09 289.8 108.55 289.32Q108.01 288.84 107.12 288.84Q106.25 288.84 105.59 289.27Q104.93 289.71 104.91 290.43L103.15 290.43Q103.17 289.51 103.71 288.82Q104.26 288.13 105.15 287.74Q106.05 287.36 107.14 287.36Q108.28 287.36 109.11 287.78Q109.95 288.21 110.41 288.91Q110.87 289.62 110.87 290.47Q110.87 291.47 110.25 292.11Q109.63 292.75 108.7 292.93L108.7 293Q109.98 293.2 110.64 293.92Q111.31 294.64 111.31 295.69Q111.31 296.63 110.77 297.36Q110.23 298.1 109.27 298.52Q108.31 298.94 107.08 298.94ZM112.58 302.08L112.58 297.12L113.52 297.12Q113.87 296.76 114.12 296.34Q114.38 295.92 114.56 295.34Q114.75 294.75 114.88 293.92Q115.01 293.09 115.11 291.92L115.5 287.49L122.84 287.49L122.84 297.12L124.57 297.12L124.57 302.08L122.76 302.08L122.76 298.8L114.4 298.8L114.4 302.08L112.58 302.08ZM115.59 297.12L121.02 297.12L121.02 289.18L117.14 289.18L116.9 291.92Q116.74 293.72 116.46 295.02Q116.18 296.33 115.59 297.12ZM131.25 299.04Q129.6 299.04 128.42 298.31Q127.24 297.58 126.6 296.27Q125.96 294.96 125.96 293.23Q125.96 291.49 126.59 290.17Q127.22 288.84 128.37 288.09Q129.51 287.34 131.04 287.34Q131.99 287.34 132.88 287.66Q133.77 287.97 134.47 288.66Q135.18 289.34 135.59 290.42Q136 291.5 136 293.03L136 293.75L127.15 293.75L127.15 292.21L135.02 292.21L134.18 292.77Q134.18 291.66 133.82 290.79Q133.46 289.93 132.76 289.44Q132.06 288.95 131.04 288.95Q130.03 288.95 129.3 289.45Q128.56 289.94 128.18 290.75Q127.79 291.56 127.79 292.52L127.79 293.5Q127.79 294.75 128.22 295.63Q128.65 296.5 129.43 296.96Q130.22 297.42 131.26 297.42Q131.94 297.42 132.5 297.22Q133.05 297.01 133.45 296.62Q133.85 296.22 134.05 295.65L135.82 296.05Q135.56 296.93 134.93 297.61Q134.3 298.29 133.36 298.67Q132.42 299.04 131.25 299.04ZM137.17 298.8L137.17 297.12L137.58 297.12Q138.08 297.12 138.42 296.93Q138.76 296.74 138.97 296.25Q139Line truncated
|
||||
<g transform="translate(303.5 173.5) scale(0.92)" fill="none" stroke="#8a8a94" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="m9 18 6-6-6-6"/></g>
|
||||
<rect x="329.5" y="4" width="295.5" height="361" rx="24.2" fill="#0c0c0e" stroke="#2a2a2f" stroke-width="2"/>
|
||||
<circle cx="377.9" cy="52.4" r="27.5" fill="#1d1d21" stroke="#2a2a2f" stroke-width="2"/>
|
||||
<path d="M371.03 63.18L371.03 61.16L378.29 53.51Q379.52 52.2 380.34 51.22Q381.15 50.24 381.55 49.35Q381.96 48.45 381.96 47.43Q381.96 46.27 381.42 45.42Q380.89 44.56 379.96 44.1Q379.03 43.65 377.84 43.65Q376.57 43.65 375.64 44.17Q374.71 44.69 374.2 45.63Q373.69 46.58 373.69 47.85L371.1 47.85Q371.1 45.89 371.98 44.41Q372.87 42.92 374.4 42.09Q375.93 41.27 377.9 41.27Q379.84 41.27 381.34 42.08Q382.83 42.89 383.69 44.28Q384.54 45.66 384.54 47.39Q384.54 48.61 384.11 49.73Q383.67 50.85 382.62 52.23Q381.57 53.61 379.7 55.55L374.78 60.63L374.78 60.77L384.86 60.77L384.86 63.18L371.03 63.18Z" fill="#f2f2f3" stroke="#f2f2f3" stroke-width="0.88" stroke-linejoin="round"/>
|
||||
<g transform="translate(448.65 54.6) scale(2.38)" fill="none" stroke="#f2f2f3" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"/></g>
|
||||
<path d="M413.52 169.34Q410.41 169.34 407.98 167.83Q405.56 166.33 404.18 163.55Q402.8 160.78 402.8 157.01Q402.8 153.23 404.18 150.45Q405.56 147.68 407.98 146.17Q410.41 144.65 413.52 144.65Q415.36 144.65 416.98 145.19Q418.61 145.73 419.9 146.76Q421.19 147.79 422.05 149.26Q422.91 150.73 423.25 152.58L420.21 152.58Q419.93 151.34 419.31 150.39Q418.69 149.44 417.8 148.79Q416.9 148.13 415.82 147.8Q414.73 147.47 413.52 147.47Q411.3 147.47 409.54 148.59Q407.78 149.71 406.78 151.84Q405.77 153.97 405.77 157.01Q405.77 160.04 406.78 162.17Q407.8 164.29 409.56 165.41Q411.31 166.52 413.52 166.52Q414.73 166.52 415.82 166.19Q416.9 165.86 417.8 165.21Q418.69 164.55 419.31 163.6Q419.93 162.65 420.21 161.41L423.25 161.41Q422.93 163.25 422.07 164.71Q421.21 166.16 419.92 167.2Q418.63 168.24 417 168.79Q415.37 169.34 413.52 169.34ZM426.78 169L426.78 151.15L429.65 151.15L429.65 158.88L431.45 158.88L437.88 151.15L441.54 151.15L434.34 159.78L441.64 169L438 169L432.15 161.54L429.65 161.54L429.65 169L426.78 169ZM451.06 169.39Q448.63 169.39 446.8 168.23Q444.97 167.08 443.95 165Q442.93 162.93 442.93 160.17Q442.93 157.4 443.95 155.3Q444.97 153.21 446.8 152.06Q448.63 150.9 451.06 150.9Q453.51 150.9 455.36 152.06Q457.2 153.21 458.23 155.3Q459.25 157.4 459.25 160.17Q459.25 162.93 458.23 165Q457.2 167.08 455.36 168.23Q453.51 169.39 451.06 169.39ZM451.06 166.81Q452.85 166.81 454.03 165.9Q455.21 164.99 455.78 163.48Q456.35 161.97 456.35 160.17Q456.35 158.37 455.78 156.84Q455.21 155.32 454.03 154.4Q452.85 153.48 451.06 153.48Q449.31 153.48 448.15 154.4Q446.99 155.32 446.42 156.83Q445.84 158.35 445.84 160.17Q445.84 161.97 446.42 163.48Q446.99 164.99 448.14 165.9Q449.29 166.81 451.06 166.81ZM476.93 151.15L476.93 169L474.06 169L474.06 153.81L465.54 153.81L465.54 169L462.65 169L462.65 151.15L476.93 151.15ZM495.59 169L492.7 169L492.7 156.06L492.51 156.06L483.94 169L481.2 169L481.2 151.15L484.07 151.15L484.07 164.13L484.24 164.13L492.85 151.15L495.59 151.15L495.59 169ZM499.84 175.74L499.84 151.15L502.61 151.15L502.61 153.98L502.89 153.98Q503.24 153.42 503.84 152.7Q504.43 151.98 505.47 151.44Q506.5 150.9 508.14 150.9Q510.4 150.9 512.1 152.03Q513.8 153.16 514.76 155.23Q515.73 157.3 515.73 160.12Q515.73 162.94 514.77 165.02Q513.81 167.1 512.1 168.23Q510.4 169.37 508.16 169.37Q506.54 169.37 505.51 168.83Q504.47 168.29 503.86 167.56Q503.26 166.82 502.9 166.24L502.71 166.24L502.71 175.74L499.84 175.74ZM507.72 166.81Q509.38 166.81 510.52 165.93Q511.65 165.05 512.23 163.53Q512.81 162.01 512.81 160.09Q512.81 158.19 512.23 156.7Q511.65 155.21 510.52 154.34Q509.4 153.48 507.72 153.48Q506.08 153.48 504.94 154.31Q503.81 155.14 503.23 156.62Q502.65 158.11 502.65 160.09Q502.65 162.07 503.23 163.59Q503.82 165.1 504.96 165.95Q506.09 166.81 507.72 166.81ZM518.9 175.56L519.52 173.06L520.06 173.12Q520.89 173.32 521.56 173.2Q522.22 173.08 522.76 172.49Q523.3 171.9 523.72 170.71L524.3 169.05L517.47 151.15L520.61 151.15L524.42 161.68Q525.01 163.28 525.43 164.86Q525.85 166.44 526.3 167.92L525.3 167.92Q525.75 166.44 526.18 164.86Q526.61 163.28 527.19 161.68L531.01 151.15L534.13 151.15L526.22 171.77Q525.69 173.16 524.94 174.06Q524.19 174.96 523.19 175.41Q522.19 175.85 520.95 175.85Q520.24 175.85 519.7 175.75Q519.16 175.65 518.9 175.56ZM551.13 169L548.25 169L548.25 156.06L548.05 156.06L539.48 169L536.74 169L536.74 151.15L539.61 151.15L539.61 164.13L539.79 164.13L548.39 151.15L551.13 151.15L551.13 169ZM543.93 148.63Q542.62 148.63 541.57 148.03Q540.51 147.42 539.89 146.39Q539.27 145.35 539.27 144.07L541.38 144.07Q541.38 145.18 542.1 145.89Q542.82 146.59 543.93 146.59Q545.04 146.59 545.76 145.89Q546.47 145.18 546.47 144.07L548.59 144.07Q548.59 145.35 547.97 146.38Q547.35 147.41 546.3 148.02Q545.25 148.63 543.93 148.63Z" fill="#f2f2f3" stroke="#f2f2f3" stroke-width="0.99" stroke-linejoin="round"/>
|
||||
<path d="M425.89 219.84Q424.24 219.84 423.06 219.11Q421.88 218.38 421.24 217.07Q420.6 215.76 420.6 214.03Q420.6 212.29 421.23 210.97Q421.86 209.64 423 208.89Q424.15 208.14 425.68 208.14Q426.63 208.14 427.52 208.46Q428.41 208.77 429.11 209.46Q429.82 210.14 430.23 211.22Q430.64 212.3 430.64 213.83L430.64 214.55L421.79 214.55L421.79 213.01L429.66 213.01L428.82 213.57Q428.82 212.46 428.46 211.59Q428.1 210.73 427.4 210.24Q426.7 209.75 425.68 209.75Q424.67 209.75 423.94 210.25Q423.2 210.74 422.82 211.55Q422.43 212.36 422.43 213.32L422.43 214.3Q422.43 215.55 422.86 216.43Q423.29 217.3 424.07 217.76Q424.86 218.22 425.9 218.22Q426.58 218.22 427.14 218.02Q427.69 217.81 428.09 217.42Q428.49 217.02 428.69 216.45L430.46 216.85Q430.2 217.73 429.57 218.41Q428.94 219.09 428 219.47Q427.06 219.84 425.89 219.84ZM440.25 208.29L440.25 209.98L434.99 209.98L434.99 219.6L433.17 219.6L433.17 208.29L440.25 208.29ZM446.84 219.84Q445.3 219.84 444.14 219.12Q442.98 218.39 442.33 217.07Q441.69 215.75 441.69 214.01Q441.69 212.25 442.33 210.93Q442.98 209.6 444.14 208.87Q445.3 208.14 446.84 208.14Q448.39 208.14 449.56 208.87Q450.73 209.6 451.38 210.93Q452.02 212.25 452.02 214.01Q452.02 215.75 451.38 217.07Q450.73 218.39 449.56 219.12Q448.39 219.84 446.84 219.84ZM446.84 218.21Q447.97 218.21 448.72 217.64Q449.46 217.06 449.82 216.1Q450.19 215.15 450.19 214.01Q450.19 212.86 449.82 211.9Q449.46 210.94 448.72 210.35Q447.97 209.77 446.84 209.77Q445.73 209.77 444.99 210.35Q444.26 210.94 443.89 211.9Q443.53 212.85 443.53 214.01Q443.53 215.15 443.89 216.1Q444.26 217.06 444.99 217.64Q445.72 218.21 446.84 218.21ZM460.36 219.6L460.36 208.29L464.99 208.29Q466.84 208.29 467.94 209.11Q469.03 209.94 469.03 211.31Q469.03 212.3 468.44 212.88Q467.85 213.46 466.86 213.66Q467.51 213.75 468.11 214.1Q468.7 214.46 469.09 215.06Q469.47 215.66 469.47 216.54Q469.47 217.43 469.02 218.12Q468.57 218.81 467.72 219.21Q466.88 219.6 465.72 219.6L460.36 219.6ZM462.09 217.94L465.72 217.94Q466.6 217.94 467.1 217.52Q467.6 217.11 467.6 216.4Q467.6 215.53 467.1 215.05Q466.6 214.57 465.72 214.57L462.09 214.57L462.09 217.94ZM462.09 213.04L465.01 213.04Q466.04 213.04 466.62 212.61Q467.2 212.19 467.2 211.46Q467.2 210.75 466.62 210.35Q466.03 209.96 464.99 209.96L462.09 209.96L462.09 213.04ZM486.83 208.29L486.83 219.6L485.02 219.6L485.02 209.98L479.62 209.98L479.62 219.6L477.79 219.6L477.79 208.29L486.83 208.29ZM493.16 219.84Q492.08 219.84 491.2 219.45Q490.32 219.05 489.81 218.27Q489.29 217.5 489.29 216.38Q489.29 215.41 489.67 214.8Q490.06 214.19 490.7 213.84Q491.34 213.5 492.13 213.32Q492.91 213.15 493.71 213.05Q494.73 212.92 495.36 212.84Q496 212.77 496.3 212.6Q496.6 212.43 496.6 212.01L496.6 211.95Q496.6 211.25 496.33 210.76Q496.07 210.27 495.54 210.01Q495.01 209.74 494.21 209.74Q493.4 209.74 492.83 210Q492.25 210.25 491.89 210.64Q491.53 211.03 491.37 211.46L489.61 210.97Q489.98 209.94 490.69 209.32Q491.4 208.7 492.32 208.42Q493.23 208.14 494.17 208.14Q494.8 208.14 495.54 208.3Q496.27 208.46 496.93 208.87Q497.58 209.29 498 210.07Q498.42 210.84 498.42 212.1L498.42 219.6L496.63 219.6L496.63 218.05L496.52 218.05Q496.32 218.45 495.9 218.87Q495.49 219.28 494.81 219.56Q494.13 219.84 493.16 219.84ZM493.47 218.23Q494.5 218.23 495.19 217.84Q495.88 217.45 496.24 216.81Q496.6 216.18 496.6 215.49L496.6 213.95Q496.49 214.07 496.13 214.17Q495.77 214.27 495.3 214.35Q494.83 214.44 494.38 214.49Q493.93 214.55 493.63 214.59Q492.97 214.67 492.39 214.87Q491.82 215.07 491.48 215.45Q491.13 215.82 491.13 216.48Q491.13 217.05 491.43 217.44Q491.73 217.83 492.26 218.03Q492.78 218.23 493.47 218.23ZM510.58 208.29L510.58 219.6L508.76 219.6L508.76 209.98L503.36 209.98L503.36 219.6L501.54 219.6L501.54 208.29L510.58 208.29ZM513.7 219.6L513.7 208.29L515.52 208.29L515.52 213.19L516.66 213.19L520.73 208.29L523.05 208.29L518.49 213.76L523.11 219.6L520.81 219.6L517.1 214.88L515.52 214.88L515.52 219.6L513.7 219.6ZM524.75 223.75L525.14 222.17L525.49 222.21Q526.01 222.33 526.43 222.26Q526.86 222.18 527.2 221.81Q527.54 221.44 527.81 220.68L528.17 219.63L523.85 208.29L525.84 208.29L528.24 214.97Q528.62 215.98 528.89 216.98Q529.15 217.98 529.44 218.92L528.81 218.92Q529.09 217.98 529.36 216.98Q529.63 215.98 530 214.97L532.42 208.29L534.4 208.29L529.39 221.36Q529.05 222.23 528.58 222.8Q528.1 223.38 527.47 223.66Q526.84 223.94 526.05 223.94Q525.6 223.94 525.26 223.88Q524.92 223.81 524.75 223.75Z" fill="#a3a3ab"/>
|
||||
<rect x="409.87" y="230.6" width="134.76" height="35.2" rx="9.9" fill="#1d1d21" stroke="#2a2a2f" stroke-width="1.5"/>
|
||||
<path d="M428.65 248.05L428.65 254.8L426.83 254.8L426.83 239.59L428.65 239.59L428.65 246.24L428.29 246.24Q428.82 244.68 429.78 244.01Q430.74 243.34 432.04 243.34Q433.18 243.34 434.05 243.81Q434.92 244.29 435.42 245.24Q435.91 246.2 435.91 247.65L435.91 254.8L434.09 254.8L434.09 247.8Q434.09 246.46 433.4 245.72Q432.72 244.98 431.52 244.98Q430.71 244.98 430.06 245.33Q429.4 245.69 429.03 246.37Q428.65 247.05 428.65 248.05ZM443.64 255.04Q442.1 255.04 440.94 254.32Q439.78 253.59 439.13 252.27Q438.49 250.95 438.49 249.21Q438.49 247.45 439.13 246.13Q439.78 244.8 440.94 244.07Q442.1 243.34 443.64 243.34Q445.19 243.34 446.36 244.07Q447.53 244.8 448.18 246.13Q448.82 247.45 448.82 249.21Q448.82 250.95 448.18 252.27Q447.53 253.59 446.36 254.32Q445.19 255.04 443.64 255.04ZM443.64 253.41Q444.77 253.41 445.52 252.84Q446.26 252.26 446.62 251.3Q446.99 250.35 446.99 249.21Q446.99 248.06 446.62 247.1Q446.26 246.14 445.52 245.55Q444.77 244.97 443.64 244.97Q442.53 244.97 441.79 245.55Q441.06 246.14 440.7 247.1Q440.33 248.05 440.33 249.21Q440.33 250.35 440.7 251.3Q441.06 252.26 441.79 252.84Q442.52 253.41 443.64 253.41ZM451.4 254.8L451.4 243.49L453.16 243.49L453.17 245.99L453.02 245.99Q453.26 245.08 453.77 244.49Q454.27 243.89 454.95 243.59Q455.63 243.29 456.37 243.29Q457.61 243.29 458.4 244.05Q459.19 244.81 459.42 246L459.15 246Q459.36 245.19 459.89 244.57Q460.43 243.96 461.19 243.63Q461.96 243.29 462.87 243.29Q463.86 243.29 464.67 243.72Q465.49 244.15 465.97 245.01Q466.46 245.88 466.46 247.21L466.46 254.8L464.63 254.8L464.63 247.26Q464.63 246.01 463.94 245.48Q463.24 244.95 462.33 244.95Q461.56 244.95 461 245.27Q460.44 245.6 460.14 246.16Q459.84 246.72 459.84 247.45L459.84 254.8L458.01 254.8L458.01 247.07Q458.01 246.12 457.38 245.53Q456.74 244.95 455.77 244.95Q455.11 244.95 454.52 245.26Q453.93 245.57 453.57 246.19Q453.21 246.81 453.21 247.72L453.21 254.8L451.4 254.8ZM474.31 255.04Q472.66 255.04 471.48 254.31Q470.3 253.58 469.66 252.27Q469.02 250.96 469.02 249.23Q469.02 247.49 469.65 246.17Q470.27 244.84 471.42 244.09Q472.57 243.34 474.1 243.34Q475.05 243.34 475.94 243.66Q476.83 243.97 477.53 244.66Q478.23 245.34 478.65 246.42Q479.06 247.5 479.06 249.03L479.06 249.75L470.2 249.75L470.2 248.21L478.08 248.21L477.23 248.77Q477.23 247.66 476.88 246.79Q476.52 245.93 475.82 245.44Q475.12 244.95 474.1 244.95Q473.09 244.95 472.36 245.45Q471.62 245.94 471.23 246.75Q470.85 247.56 470.85 248.52L470.85 249.5Q470.85 250.75 471.27 251.63Q471.7 252.5 472.49 252.96Q473.28 253.42 474.32 253.42Q475 253.42 475.56 253.22Q476.11 253.01 476.51 252.62Q476.91 252.22 477.11 251.65L478.88 252.05Q478.62 252.93 477.99 253.61Q477.36 254.29 476.42 254.67Q475.48 255.04 474.31 255.04ZM486.86 255.03Q485.84 255.03 485.18 254.69Q484.52 254.35 484.13 253.89Q483.75 253.42 483.52 253.05L483.35 253.05L483.35 254.8L481.59 254.8L481.59 239.59L483.41 239.59L483.41 245.29L483.53 245.29Q483.75 244.93 484.12 244.48Q484.5 244.02 485.15 243.68Q485.81 243.34 486.85 243.34Q488.28 243.34 489.35 244.05Q490.43 244.77 491.04 246.08Q491.65 247.39 491.65 249.18Q491.65 250.96 491.05 252.28Q490.44 253.6 489.36 254.32Q488.28 255.03 486.86 255.03ZM486.58 253.41Q487.63 253.41 488.35 252.86Q489.07 252.3 489.44 251.34Q489.81 250.37 489.81 249.16Q489.81 247.95 489.44 247.01Q489.07 246.06 488.36 245.52Q487.64 244.97 486.58 244.97Q485.54 244.97 484.82 245.5Q484.1 246.02 483.74 246.96Q483.37 247.9 483.37 249.16Q483.37 250.41 483.74 251.37Q484.11 252.33 484.83 252.87Q485.55 253.41 486.58 253.41ZM494.23 254.8L494.23 243.49L495.98 243.49L495.98 245.24L496.08 245.24Q496.4 244.38 497.18 243.86Q497.96 243.33 498.98 243.33Q499.2 243.33 499.46 243.34Q499.73 243.36 499.88 243.37L499.88 245.2Q499.8 245.18 499.48 245.14Q499.16 245.09 498.79 245.09Q498 245.09 497.38 245.43Q496.76 245.76 496.4 246.35Q496.04 246.94 496.04 247.74L496.04 254.8L494.23 254.8ZM506.64 255.04Q504.99 255.04 503.81 254.31Q502.62 253.58 501.99 252.27Q501.35 250.96 501.35 249.23Q501.35 247.49 501.98 246.17Q502.6 244.84 503.75 244.09Q504.9 243.34 506.43 243.34Q507.38 243.34 508.27 243.66Q509.16 243.97 509.86 244.66Q510.56 245.34 510.98 246.42Q511.39 247.5 511.39 249.03L511.39 249.75L502.53 249.75L502.53 248.21L510.41 248.21L509.56 248.77Q509.56 247.66 509.21 246.79Q508.85 245.93 508.15 245.44Q507.45 244.95 506.43 244.95Q505.42 244.95 504.69 245.45Q503.95 245.94 503.56 246.75Q503.18 247.56 503.18 248.52L503.18 249.5Q503.18 250.75 503.6 251.63Q504.03 252.5 504.82 252.96Q505.6 253.42 506.65 253.42Q507.33 253.42 507.89 253.22Q508.44 253.01 508.84 252.62Q509.24 252.22 509.44 251.65L511.21 252.05Q510.95 252.93 510.32 253.61Q509.69 254.29 508.75 254.67Q507.81 255.04 506.64 255.04ZM516.44 254.8L513 243.49L514.93 243.49L516.32 248.43Q516.61 249.47 516.93 250.74Q517.25 252 517.57 253.54L517.26 253.54Q517.57 252.07 517.88 250.79Q518.19 249.52 518.48 248.43L519.85 243.49L521.77 243.49L523.12 248.43Q523.41 249.49 523.72 250.76Q524.02 252.02 524.33 253.54L524.01 253.54Q524.33 252.04 524.65 250.78Q524.97 249.51 525.27 248.43L526.66 243.49L528.59 243Line truncated
|
||||
<path d="M406.78 292.16L406.78 293.84L400.51 293.84L400.51 292.16L406.78 292.16ZM400.95 287.49L400.95 298.8L399.14 298.8L399.14 287.49L400.95 287.49ZM408.19 287.49L408.19 298.8L406.36 298.8L406.36 287.49L408.19 287.49ZM414.5 299.04Q413.42 299.04 412.54 298.65Q411.67 298.25 411.15 297.47Q410.64 296.7 410.64 295.58Q410.64 294.61 411.02 294Q411.4 293.39 412.04 293.04Q412.69 292.7 413.47 292.52Q414.26 292.35 415.06 292.25Q416.08 292.12 416.71 292.04Q417.34 291.97 417.64 291.8Q417.94 291.63 417.94 291.21L417.94 291.15Q417.94 290.45 417.68 289.96Q417.41 289.47 416.88 289.21Q416.35 288.94 415.56 288.94Q414.75 288.94 414.17 289.2Q413.6 289.45 413.23 289.84Q412.87 290.23 412.72 290.66L410.95 290.17Q411.32 289.14 412.03 288.52Q412.75 287.9 413.66 287.62Q414.58 287.34 415.51 287.34Q416.15 287.34 416.88 287.5Q417.62 287.66 418.27 288.07Q418.92 288.49 419.34 289.27Q419.76 290.04 419.76 291.3L419.76 298.8L417.97 298.8L417.97 297.25L417.86 297.25Q417.67 297.65 417.25 298.07Q416.83 298.48 416.15 298.76Q415.47 299.04 414.5 299.04ZM414.81 297.43Q415.84 297.43 416.53 297.04Q417.23 296.65 417.59 296.01Q417.94 295.38 417.94 294.69L417.94 293.15Q417.83 293.27 417.47 293.37Q417.12 293.47 416.65 293.55Q416.18 293.64 415.72 293.69Q415.27 293.75 414.97 293.79Q414.31 293.87 413.74 294.07Q413.17 294.27 412.82 294.65Q412.47 295.02 412.47 295.68Q412.47 296.25 412.77 296.64Q413.08 297.03 413.6 297.23Q414.13 297.43 414.81 297.43ZM434.8 299.04Q433.01 299.04 431.66 298.34Q430.32 297.64 429.59 296.41Q428.85 295.19 428.85 293.63L428.85 283.59L430.78 283.59L430.78 293.47Q430.78 294.58 431.27 295.43Q431.75 296.28 432.65 296.77Q433.55 297.26 434.8 297.26Q436.05 297.26 436.95 296.77Q437.84 296.28 438.32 295.43Q438.8 294.58 438.8 293.47L438.8 283.59L440.73 283.59L440.73 293.63Q440.73 295.19 440 296.41Q439.26 297.64 437.93 298.34Q436.6 299.04 434.8 299.04ZM449.17 299.07Q447.51 299.07 446.29 298.51Q445.07 297.96 444.38 296.98Q443.69 295.99 443.62 294.67L445.59 294.67Q445.65 295.56 446.14 296.16Q446.64 296.75 447.44 297.04Q448.23 297.34 449.17 297.34Q450.21 297.34 451.03 297Q451.85 296.67 452.33 296.05Q452.81 295.44 452.81 294.64Q452.81 293.92 452.42 293.46Q452.03 293 451.35 292.7Q450.67 292.39 449.8 292.16L447.99 291.66Q446.07 291.13 445.05 290.16Q444.03 289.19 444.03 287.67Q444.03 286.38 444.71 285.42Q445.39 284.45 446.58 283.92Q447.76 283.38 449.25 283.38Q450.76 283.38 451.92 283.92Q453.08 284.46 453.74 285.4Q454.41 286.34 454.45 287.54L452.57 287.54Q452.44 286.38 451.51 285.74Q450.58 285.09 449.19 285.09Q448.21 285.09 447.47 285.42Q446.72 285.74 446.31 286.3Q445.89 286.86 445.89 287.57Q445.89 288.34 446.36 288.82Q446.82 289.3 447.5 289.58Q448.18 289.86 448.82 290.03L450.37 290.45Q451.08 290.64 451.83 290.94Q452.58 291.24 453.23 291.72Q453.89 292.2 454.29 292.92Q454.69 293.64 454.69 294.65Q454.69 295.91 454.04 296.91Q453.39 297.91 452.15 298.49Q450.91 299.07 449.17 299.07ZM457.6 298.8L457.6 283.59L463 283.59Q464.58 283.59 465.63 284.13Q466.67 284.67 467.19 285.58Q467.71 286.49 467.71 287.63Q467.71 288.58 467.38 289.22Q467.04 289.86 466.47 290.25Q465.91 290.64 465.22 290.84L465.22 290.96Q465.97 291.01 466.68 291.46Q467.39 291.91 467.85 292.72Q468.32 293.53 468.32 294.71Q468.32 295.88 467.77 296.8Q467.23 297.73 466.1 298.26Q464.96 298.8 463.16 298.8L457.6 298.8ZM459.52 297.1L463.12 297.1Q464.89 297.1 465.67 296.42Q466.45 295.75 466.45 294.71Q466.45 293.93 466.06 293.29Q465.66 292.66 464.94 292.28Q464.22 291.9 463.22 291.9L459.52 291.9L459.52 297.1ZM459.52 290.27L462.93 290.27Q463.76 290.27 464.43 289.95Q465.1 289.64 465.48 289.05Q465.87 288.46 465.87 287.68Q465.87 286.66 465.16 285.98Q464.45 285.3 462.98 285.3L459.52 285.3L459.52 290.27ZM477.51 291.51L477.51 293.2L470.85 293.2L470.85 291.51L477.51 291.51ZM485.12 299.04Q483.58 299.04 482.41 298.32Q481.25 297.59 480.59 296.27Q479.94 294.95 479.94 293.21Q479.94 291.45 480.59 290.13Q481.25 288.8 482.41 288.07Q483.58 287.34 485.12 287.34L486.95 287.34Q488.49 287.34 489.66 288.07Q490.83 288.8 491.49 290.13Q492.14 291.45 492.14 293.21Q492.14 294.95 491.49 296.27Q490.83 297.59 489.66 298.32Q488.49 299.04 486.95 299.04L485.12 299.04ZM485.12 297.5L486.95 297.5Q488.07 297.5 488.82 296.91Q489.57 296.31 489.96 295.33Q490.34 294.35 490.34 293.21Q490.34 292.05 489.96 291.05Q489.57 290.05 488.82 289.43Q488.07 288.81 486.95 288.81L485.12 288.81Q484 288.81 483.25 289.43Q482.5 290.05 482.12 291.05Q481.75 292.05 481.75 293.21Q481.75 294.35 482.12 295.33Q482.5 296.31 483.25 296.91Q484 297.5 485.12 297.5ZM485.12 303.07L485.12 283.59L486.95 283.59L486.95 303.07L485.12 303.07ZM493.34 298.8L493.34 297.12L493.75 297.12Q494.25 297.12 494.59 296.93Q494.93 296.74 495.14 296.25Q495.35 295.76 495.47 294.86Q495.58 293.95 495.64 292.52L495.85 287.49L503.53 287.49L503.53 298.8L501.71 298.8L501.71 289.18L497.58 289.18L497.41 293.16Q497.33 295.04 497 296.3Q496.67 297.55 495.95 298.18Q495.23 298.8 493.96 298.8L493.34 298.8ZM511.38 299.04Q509.74 299.04 508.55 298.31Q507.37 297.58 506.73 296.27Q506.09 294.96 506.09 293.23Q506.09 291.49 Line truncated
|
||||
<g transform="translate(629 173.5) scale(0.92)" fill="none" stroke="#8a8a94" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="m9 18 6-6-6-6"/></g>
|
||||
<rect x="655" y="4" width="295.5" height="361" rx="24.2" fill="#0c0c0e" stroke="#2a2a2f" stroke-width="2"/>
|
||||
<circle cx="703.4" cy="52.4" r="27.5" fill="#1d1d21" stroke="#2a2a2f" stroke-width="2"/>
|
||||
<path d="M703.44 63.48Q701.31 63.48 699.66 62.72Q698.01 61.96 697.04 60.62Q696.08 59.28 696.02 57.51L698.77 57.51Q698.85 58.61 699.46 59.42Q700.08 60.22 701.1 60.65Q702.12 61.08 703.4 61.08Q704.79 61.08 705.85 60.6Q706.91 60.12 707.53 59.25Q708.14 58.38 708.14 57.25Q708.14 56.07 707.54 55.19Q706.94 54.3 705.81 53.8Q704.68 53.29 703.07 53.29L701.31 53.29L701.31 50.91L703.07 50.91Q704.36 50.91 705.34 50.46Q706.31 50.01 706.86 49.19Q707.4 48.37 707.4 47.26Q707.4 46.17 706.92 45.36Q706.43 44.54 705.54 44.1Q704.65 43.65 703.44 43.65Q702.3 43.65 701.33 44.07Q700.35 44.49 699.75 45.26Q699.15 46.04 699.12 47.16L696.48 47.16Q696.53 45.42 697.48 44.09Q698.43 42.76 700 42.01Q701.57 41.27 703.5 41.27Q705.5 41.27 706.98 42.08Q708.46 42.89 709.27 44.22Q710.07 45.55 710.07 47.11Q710.07 48.91 709.09 50.19Q708.11 51.46 706.45 51.97L706.45 52.12Q707.82 52.33 708.81 53.04Q709.8 53.75 710.32 54.83Q710.84 55.91 710.84 57.26Q710.84 59.06 709.88 60.46Q708.91 61.86 707.24 62.67Q705.58 63.48 703.44 63.48Z" fill="#f2f2f3" stroke="#f2f2f3" stroke-width="0.88" stroke-linejoin="round"/>
|
||||
<g transform="translate(774.15 54.6) scale(2.38)" fill="none" stroke="#f2f2f3" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M22 12H2"/><path d="M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z"/><path d="M6 16h.01"/><path d="M10 16h.01"/></g>
|
||||
<path d="M743.49 144.99L743.49 169L740.46 169L740.46 147.68L727.83 147.68L727.83 169L724.8 169L724.8 144.99L743.49 144.99ZM755.38 169.39Q752.95 169.39 751.12 168.23Q749.29 167.08 748.27 165Q747.25 162.93 747.25 160.17Q747.25 157.4 748.27 155.3Q749.29 153.21 751.12 152.06Q752.95 150.9 755.38 150.9Q757.83 150.9 759.68 152.06Q761.52 153.21 762.55 155.3Q763.57 157.4 763.57 160.17Q763.57 162.93 762.55 165Q761.52 167.08 759.68 168.23Q757.83 169.39 755.38 169.39ZM755.38 166.81Q757.17 166.81 758.35 165.9Q759.52 164.99 760.1 163.48Q760.67 161.97 760.67 160.17Q760.67 158.37 760.1 156.84Q759.52 155.32 758.35 154.4Q757.17 153.48 755.38 153.48Q753.63 153.48 752.47 154.4Q751.31 155.32 750.73 156.83Q750.16 158.35 750.16 160.17Q750.16 161.97 750.73 163.48Q751.31 164.99 752.46 165.9Q753.61 166.81 755.38 166.81ZM765.1 174.17L765.1 166.34L766.58 166.34Q767.13 165.78 767.53 165.12Q767.94 164.46 768.23 163.53Q768.52 162.6 768.73 161.29Q768.94 159.98 769.1 158.14L769.71 151.15L781.29 151.15L781.29 166.34L784.03 166.34L784.03 174.17L781.17 174.17L781.17 169L767.97 169L767.97 174.17L765.1 174.17ZM769.85 166.34L778.43 166.34L778.43 153.81L772.3 153.81L771.92 158.14Q771.66 160.98 771.22 163.04Q770.77 165.1 769.85 166.34ZM786.43 169L786.43 151.15L789.3 151.15L789.3 158.88L791.11 158.88L797.54 151.15L801.19 151.15L793.99 159.78L801.29 169L797.65 169L791.8 161.54L789.3 161.54L789.3 169L786.43 169ZM801.29 169L801.29 166.34L801.94 166.34Q802.73 166.34 803.27 166.04Q803.81 165.75 804.14 164.97Q804.47 164.2 804.65 162.77Q804.84 161.35 804.93 159.09L805.26 151.15L817.39 151.15L817.39 169L814.5 169L814.5 153.81L808 153.81L807.72 160.09Q807.59 163.07 807.07 165.05Q806.55 167.03 805.41 168.02Q804.27 169 802.27 169L801.29 169ZM821.64 169L821.64 151.15L824.38 151.15L824.38 169L821.64 169ZM823.74 161.38L823.74 158.8L830.23 158.8L830.23 161.38L823.74 161.38ZM836.9 169.39Q834.47 169.39 832.63 168.23Q830.8 167.08 829.77 165Q828.75 162.93 828.75 160.17Q828.75 157.4 829.77 155.3Q830.8 153.21 832.63 152.06Q834.47 150.9 836.9 150.9Q839.35 150.9 841.19 152.06Q843.03 153.21 844.05 155.3Q845.07 157.4 845.07 160.17Q845.07 162.93 844.05 165Q843.03 167.08 841.19 168.23Q839.35 169.39 836.9 169.39ZM836.9 166.81Q838.69 166.81 839.86 165.9Q841.03 164.99 841.6 163.48Q842.17 161.97 842.17 160.17Q842.17 158.37 841.6 156.84Q841.03 155.32 839.86 154.4Q838.69 153.48 836.9 153.48Q835.15 153.48 833.98 154.4Q832.81 155.32 832.24 156.83Q831.67 158.35 831.67 160.17Q831.67 161.97 832.24 163.48Q832.81 164.99 833.98 165.9Q835.15 166.81 836.9 166.81ZM855.29 163.44Q852.18 163.44 850.33 161.79Q848.47 160.14 848.47 156.83L848.47 151.15L851.34 151.15L851.34 156.83Q851.34 158.86 852.47 159.82Q853.6 160.78 855.29 160.78Q857.03 160.78 858.45 160.46Q859.87 160.14 861.28 159.64L861.28 162.3Q860.35 162.64 859.42 162.89Q858.5 163.15 857.49 163.3Q856.48 163.44 855.29 163.44ZM859.54 169L859.54 151.15L862.41 151.15L862.41 169L859.54 169ZM881.07 169L878.19 169L878.19 156.06L877.99 156.06L869.42 169L866.68 169L866.68 151.15L869.55 151.15L869.55 164.13L869.73 164.13L878.33 151.15L881.07 151.15L881.07 169Z" fill="#f2f2f3" stroke="#f2f2f3" stroke-width="0.99" stroke-linejoin="round"/>
|
||||
<path d="M731.96 219.87Q730.3 219.87 729.08 219.31Q727.86 218.76 727.17 217.78Q726.48 216.79 726.41 215.47L728.38 215.47Q728.44 216.36 728.94 216.96Q729.43 217.55 730.23 217.84Q731.02 218.14 731.96 218.14Q733 218.14 733.82 217.8Q734.65 217.47 735.13 216.85Q735.61 216.24 735.61 215.44Q735.61 214.72 735.21 214.26Q734.82 213.8 734.14 213.5Q733.46 213.19 732.6 212.96L730.78 212.46Q728.86 211.93 727.84 210.96Q726.82 209.99 726.82 208.47Q726.82 207.18 727.5 206.22Q728.19 205.25 729.37 204.72Q730.55 204.18 732.04 204.18Q733.55 204.18 734.71 204.72Q735.87 205.26 736.53 206.2Q737.2 207.14 737.24 208.34L735.36 208.34Q735.23 207.18 734.3 206.54Q733.37 205.89 731.98 205.89Q731 205.89 730.26 206.22Q729.51 206.54 729.1 207.1Q728.69 207.66 728.69 208.37Q728.69 209.14 729.15 209.62Q729.62 210.1 730.29 210.38Q730.97 210.66 731.62 210.83L733.17 211.25Q733.87 211.44 734.62 211.74Q735.37 212.04 736.02 212.52Q736.68 213 737.08 213.72Q737.48 214.44 737.48 215.45Q737.48 216.71 736.83 217.71Q736.18 218.71 734.94 219.29Q733.7 219.87 731.96 219.87ZM741.98 212.85L741.98 219.6L740.17 219.6L740.17 204.39L741.98 204.39L741.98 211.04L741.63 211.04Q742.16 209.48 743.12 208.81Q744.08 208.14 745.37 208.14Q746.51 208.14 747.39 208.61Q748.26 209.09 748.75 210.04Q749.25 211 749.25 212.45L749.25 219.6L747.42 219.6L747.42 212.6Q747.42 211.26 746.74 210.52Q746.06 209.78 744.85 209.78Q744.05 209.78 743.39 210.13Q742.74 210.49 742.36 211.17Q741.98 211.85 741.98 212.85ZM755.58 219.84Q754.5 219.84 753.62 219.45Q752.74 219.05 752.22 218.27Q751.71 217.5 751.71 216.38Q751.71 215.41 752.09 214.8Q752.47 214.19 753.12 213.84Q753.76 213.5 754.55 213.32Q755.33 213.15 756.13 213.05Q757.15 212.92 757.78 212.84Q758.41 212.77 758.72 212.6Q759.02 212.43 759.02 212.01L759.02 211.95Q759.02 211.25 758.75 210.76Q758.49 210.27 757.95 210.01Q757.42 209.74 756.63 209.74Q755.82 209.74 755.25 210Q754.67 210.25 754.31 210.64Q753.94 211.03 753.79 211.46L752.03 210.97Q752.39 209.94 753.11 209.32Q753.82 208.7 754.74 208.42Q755.65 208.14 756.59 208.14Q757.22 208.14 757.95 208.3Q758.69 208.46 759.34 208.87Q760 209.29 760.41 210.07Q760.83 210.84 760.83 212.1L760.83 219.6L759.05 219.6L759.05 218.05L758.93 218.05Q758.74 218.45 758.32 218.87Q757.9 219.28 757.23 219.56Q756.55 219.84 755.58 219.84ZM755.88 218.23Q756.91 218.23 757.61 217.84Q758.3 217.45 758.66 216.81Q759.02 216.18 759.02 215.49L759.02 213.95Q758.9 214.07 758.55 214.17Q758.19 214.27 757.72 214.35Q757.25 214.44 756.8 214.49Q756.34 214.55 756.05 214.59Q755.38 214.67 754.81 214.87Q754.24 215.07 753.89 215.45Q753.55 215.82 753.55 216.48Q753.55 217.05 753.85 217.44Q754.15 217.83 754.67 218.03Q755.2 218.23 755.88 218.23ZM768.2 219.83Q766.78 219.83 765.7 219.12Q764.62 218.4 764.01 217.08Q763.4 215.76 763.4 213.98Q763.4 212.19 764.01 210.88Q764.62 209.57 765.71 208.85Q766.79 208.14 768.21 208.14Q769.25 208.14 769.9 208.48Q770.56 208.82 770.94 209.28Q771.31 209.73 771.53 210.09L771.65 210.09L771.65 204.39L773.47 204.39L773.47 219.6L771.71 219.6L771.71 217.85L771.54 217.85Q771.31 218.22 770.93 218.69Q770.54 219.15 769.88 219.49Q769.23 219.83 768.2 219.83ZM768.48 218.21Q769.51 218.21 770.23 217.67Q770.95 217.13 771.32 216.17Q771.69 215.21 771.69 213.96Q771.69 212.7 771.32 211.76Q770.96 210.82 770.24 210.3Q769.52 209.77 768.48 209.77Q767.41 209.77 766.7 210.32Q765.98 210.86 765.61 211.81Q765.25 212.75 765.25 213.96Q765.25 215.17 765.62 216.14Q765.99 217.1 766.71 217.66Q767.44 218.21 768.48 218.21ZM781.19 219.84Q779.65 219.84 778.49 219.12Q777.33 218.39 776.69 217.07Q776.04 215.75 776.04 214.01Q776.04 212.25 776.69 210.93Q777.33 209.6 778.49 208.87Q779.65 208.14 781.19 208.14Q782.74 208.14 783.91 208.87Q785.08 209.6 785.73 210.93Q786.38 212.25 786.38 214.01Q786.38 215.75 785.73 217.07Q785.08 218.39 783.91 219.12Q782.74 219.84 781.19 219.84ZM781.19 218.21Q782.32 218.21 783.07 217.64Q783.81 217.06 784.18 216.1Q784.54 215.15 784.54 214.01Q784.54 212.86 784.18 211.9Q783.81 210.94 783.07 210.35Q782.32 209.77 781.19 209.77Q780.08 209.77 779.34 210.35Q778.61 210.94 778.25 211.9Q777.89 212.85 777.89 214.01Q777.89 215.15 778.25 216.1Q778.61 217.06 779.34 217.64Q780.07 218.21 781.19 218.21ZM791.47 219.6L788.03 208.29L789.96 208.29L791.35 213.23Q791.63 214.27 791.95 215.54Q792.27 216.8 792.59 218.34L792.28 218.34Q792.59 216.87 792.9 215.59Q793.21 214.32 793.51 213.23L794.88 208.29L796.8 208.29L798.14 213.23Q798.44 214.29 798.74 215.56Q799.05 216.82 799.36 218.34L799.04 218.34Q799.36 216.84 799.68 215.58Q800 214.31 800.3 213.23L801.68 208.29L803.61 208.29L800.17 219.6L798.35 219.6L796.88 214.48Q796.65 213.7 796.44 212.9Q796.23 212.09 796.03 211.25Q795.83 210.41 795.61 209.55L796.03 209.55Q795.83 210.41 795.62 211.25Q795.41 212.09 795.2 212.91Q794.99 213.72 794.76 214.48L793.29 219.6L791.47 219.6ZM806.04 219.6L806.04 204.39L808.75 204.39L812.51 214.03Q812.64 214.36 812.82 214.86Q812.99 215.36 813.18 215.94Q813.37 216.52 813.54 217.08Q813.72 217.65 813.84 218.12L813.42 218.12Q813.55 217.68 813.73 217.12Q813.9 216.56 814.09 215.98Q814.28 215.4 8Line truncated
|
||||
<path d="M736.36 255.04Q734.81 255.04 733.66 254.32Q732.5 253.59 731.85 252.27Q731.2 250.95 731.2 249.21Q731.2 247.45 731.85 246.13Q732.5 244.8 733.66 244.07Q734.81 243.34 736.36 243.34Q737.2 243.34 737.94 243.56Q738.68 243.79 739.29 244.21Q739.9 244.63 740.33 245.23Q740.75 245.83 740.97 246.6L739.2 247Q739.09 246.56 738.84 246.19Q738.59 245.82 738.23 245.54Q737.87 245.27 737.4 245.12Q736.93 244.97 736.36 244.97Q735.24 244.97 734.51 245.55Q733.77 246.14 733.41 247.1Q733.05 248.05 733.05 249.21Q733.05 250.35 733.41 251.3Q733.77 252.26 734.5 252.84Q735.23 253.41 736.36 253.41Q736.94 253.41 737.41 253.26Q737.89 253.11 738.25 252.83Q738.62 252.54 738.87 252.15Q739.12 251.76 739.24 251.3L741 251.72Q740.79 252.48 740.36 253.1Q739.93 253.71 739.32 254.15Q738.71 254.59 737.96 254.82Q737.21 255.04 736.36 255.04ZM746.72 255.04Q745.64 255.04 744.76 254.65Q743.89 254.25 743.37 253.47Q742.86 252.7 742.86 251.58Q742.86 250.61 743.24 250Q743.62 249.39 744.26 249.04Q744.91 248.7 745.69 248.52Q746.48 248.35 747.28 248.25Q748.3 248.12 748.93 248.04Q749.56 247.97 749.86 247.8Q750.16 247.63 750.16 247.21L750.16 247.15Q750.16 246.45 749.9 245.96Q749.63 245.47 749.1 245.21Q748.57 244.94 747.78 244.94Q746.97 244.94 746.39 245.2Q745.82 245.45 745.45 245.84Q745.09 246.23 744.94 246.66L743.17 246.17Q743.54 245.14 744.25 244.52Q744.97 243.9 745.88 243.62Q746.8 243.34 747.73 243.34Q748.37 243.34 749.1 243.5Q749.84 243.66 750.49 244.07Q751.14 244.49 751.56 245.27Q751.98 246.04 751.98 247.3L751.98 254.8L750.19 254.8L750.19 253.25L750.08 253.25Q749.89 253.65 749.47 254.07Q749.05 254.48 748.37 254.76Q747.69 255.04 746.72 255.04ZM747.03 253.43Q748.06 253.43 748.75 253.04Q749.45 252.65 749.81 252.01Q750.16 251.38 750.16 250.69L750.16 249.15Q750.05 249.27 749.69 249.37Q749.34 249.47 748.87 249.55Q748.4 249.64 747.94 249.69Q747.49 249.75 747.19 249.79Q746.53 249.87 745.96 250.07Q745.39 250.27 745.04 250.65Q744.69 251.02 744.69 251.68Q744.69 252.25 744.99 252.64Q745.3 253.03 745.82 253.23Q746.35 253.43 747.03 253.43ZM755.1 254.8L755.1 243.49L757.83 243.49L760.46 249.81Q760.69 250.37 760.87 250.87Q761.05 251.36 761.19 251.8Q761.33 252.25 761.44 252.68Q761.56 253.12 761.68 253.55L761.36 253.55Q761.47 253.14 761.59 252.71Q761.71 252.28 761.84 251.83Q761.97 251.37 762.15 250.88Q762.33 250.38 762.56 249.81L765.16 243.49L767.93 243.49L767.93 254.8L766.1 254.8L766.1 248.92Q766.1 248.32 766.11 247.74Q766.11 247.17 766.12 246.6Q766.13 246.02 766.14 245.45Q766.15 244.87 766.16 244.27L766.39 244.27Q766.14 245.14 765.92 245.86Q765.7 246.57 765.42 247.3Q765.15 248.02 764.78 248.92L762.3 254.8L760.71 254.8L758.19 248.92Q757.82 248.03 757.55 247.31Q757.28 246.58 757.05 245.86Q756.82 245.14 756.57 244.27L756.85 244.27Q756.86 244.79 756.87 245.35Q756.88 245.91 756.89 246.5Q756.9 247.1 756.9 247.7Q756.91 248.3 756.91 248.92L756.91 254.8L755.1 254.8ZM784.46 248.16L784.46 249.84L778.2 249.84L778.2 248.16L784.46 248.16ZM778.64 243.49L778.64 254.8L776.82 254.8L776.82 243.49L778.64 243.49ZM785.87 243.49L785.87 254.8L784.04 254.8L784.04 243.49L785.87 243.49ZM792.19 255.04Q791.11 255.04 790.23 254.65Q789.35 254.25 788.84 253.47Q788.32 252.7 788.32 251.58Q788.32 250.61 788.7 250Q789.09 249.39 789.73 249.04Q790.37 248.7 791.16 248.52Q791.94 248.35 792.74 248.25Q793.76 248.12 794.39 248.04Q795.02 247.97 795.33 247.8Q795.63 247.63 795.63 247.21L795.63 247.15Q795.63 246.45 795.36 245.96Q795.1 245.47 794.57 245.21Q794.03 244.94 793.24 244.94Q792.43 244.94 791.86 245.2Q791.28 245.45 790.92 245.84Q790.55 246.23 790.4 246.66L788.64 246.17Q789 245.14 789.72 244.52Q790.43 243.9 791.35 243.62Q792.26 243.34 793.2 243.34Q793.83 243.34 794.57 243.5Q795.3 243.66 795.95 244.07Q796.61 244.49 797.02 245.27Q797.44 246.04 797.44 247.3L797.44 254.8L795.66 254.8L795.66 253.25L795.55 253.25Q795.35 253.65 794.93 254.07Q794.51 254.48 793.84 254.76Q793.16 255.04 792.19 255.04ZM792.49 253.43Q793.52 253.43 794.22 253.04Q794.91 252.65 795.27 252.01Q795.63 251.38 795.63 250.69L795.63 249.15Q795.51 249.27 795.16 249.37Q794.8 249.47 794.33 249.55Q793.86 249.64 793.41 249.69Q792.95 249.75 792.66 249.79Q791.99 249.87 791.42 250.07Q790.85 250.27 790.5 250.65Q790.16 251.02 790.16 251.68Q790.16 252.25 790.46 252.64Q790.76 253.03 791.28 253.23Q791.81 253.43 792.49 253.43ZM799.61 254.8L804.11 248.31L804.1 249.7L799.84 243.49L801.96 243.49L803.39 245.7Q803.92 246.51 804.33 247.24Q804.74 247.96 805.17 248.66L804.22 248.66Q804.66 247.96 805.03 247.24Q805.4 246.51 805.94 245.7L807.4 243.49L809.49 243.49L805.21 249.77L805.21 248.41L809.67 254.8L807.56 254.8L805.87 252.26Q805.35 251.46 804.96 250.76Q804.57 250.05 804.15 249.4L805.1 249.4Q804.68 250.05 804.31 250.76Q803.94 251.46 803.41 252.26L801.71 254.8L799.61 254.8ZM816.45 255.04Q814.9 255.04 813.75 254.32Q812.59 253.59 811.94 252.27Q811.29 250.95 811.29 249.21Q811.29 247.45 811.94 246.13Q812.59 244.8 813.75 244.07Q814.9 243.34 816.45 243.34Q818 243.34 819.16 244.07Q820.33 244.8 820.98 246.13Q821.63 247.45 821.63 249.21Q821.63 250.95 820.98 252.27Q820.33 253.Line truncated
|
||||
<path d="M709.98 294.15L710.36 292.57L710.71 292.61Q711.23 292.73 711.65 292.66Q712.08 292.58 712.42 292.21Q712.76 291.84 713.03 291.08L713.39 290.03L709.07 278.69L711.06 278.69L713.47 285.37Q713.84 286.38 714.11 287.38Q714.37 288.38 714.66 289.32L714.03 289.32Q714.31 288.38 714.58 287.38Q714.85 286.38 715.22 285.37L717.64 278.69L719.62 278.69L714.61 291.76Q714.27 292.63 713.8 293.2Q713.32 293.78 712.69 294.06Q712.06 294.34 711.27 294.34Q710.82 294.34 710.48 294.28Q710.14 294.21 709.98 294.15ZM726.29 290.24Q724.75 290.24 723.59 289.52Q722.44 288.79 721.79 287.47Q721.14 286.15 721.14 284.41Q721.14 282.65 721.79 281.33Q722.44 280 723.59 279.27Q724.75 278.54 726.29 278.54Q727.14 278.54 727.88 278.76Q728.62 278.99 729.23 279.41Q729.83 279.83 730.26 280.43Q730.69 281.03 730.91 281.8L729.14 282.2Q729.03 281.76 728.78 281.39Q728.53 281.02 728.17 280.74Q727.8 280.47 727.33 280.32Q726.87 280.17 726.29 280.17Q725.18 280.17 724.45 280.75Q723.71 281.34 723.35 282.3Q722.99 283.25 722.99 284.41Q722.99 285.55 723.35 286.5Q723.71 287.46 724.44 288.04Q725.17 288.61 726.29 288.61Q726.88 288.61 727.35 288.46Q727.82 288.31 728.19 288.03Q728.56 287.74 728.81 287.35Q729.06 286.96 729.18 286.5L730.94 286.92Q730.73 287.68 730.3 288.3Q729.87 288.91 729.26 289.35Q728.65 289.79 727.9 290.02Q727.15 290.24 726.29 290.24ZM735.85 290L735.85 280.33L732.09 280.33L732.09 278.69L741.41 278.69L741.41 280.33L737.67 280.33L737.67 290L735.85 290ZM746.37 290.24Q745.29 290.24 744.41 289.85Q743.53 289.45 743.01 288.67Q742.5 287.9 742.5 286.78Q742.5 285.81 742.88 285.2Q743.26 284.59 743.91 284.24Q744.55 283.9 745.34 283.72Q746.12 283.55 746.92 283.45Q747.94 283.32 748.57 283.24Q749.2 283.17 749.51 283Q749.81 282.83 749.81 282.41L749.81 282.35Q749.81 281.65 749.54 281.16Q749.28 280.67 748.74 280.41Q748.21 280.14 747.42 280.14Q746.61 280.14 746.04 280.4Q745.46 280.65 745.1 281.04Q744.73 281.43 744.58 281.86L742.82 281.37Q743.18 280.34 743.9 279.72Q744.61 279.1 745.53 278.82Q746.44 278.54 747.38 278.54Q748.01 278.54 748.74 278.7Q749.48 278.86 750.13 279.27Q750.79 279.69 751.2 280.47Q751.62 281.24 751.62 282.5L751.62 290L749.84 290L749.84 288.45L749.72 288.45Q749.53 288.85 749.11 289.27Q748.69 289.68 748.02 289.96Q747.34 290.24 746.37 290.24ZM746.67 288.63Q747.7 288.63 748.4 288.24Q749.09 287.85 749.45 287.21Q749.81 286.58 749.81 285.89L749.81 284.35Q749.69 284.47 749.34 284.57Q748.98 284.67 748.51 284.75Q748.04 284.84 747.59 284.89Q747.13 284.95 746.84 284.99Q746.17 285.07 745.6 285.27Q745.03 285.47 744.68 285.85Q744.34 286.22 744.34 286.88Q744.34 287.45 744.64 287.84Q744.94 288.23 745.46 288.43Q745.99 288.63 746.67 288.63ZM762.39 283.36L762.39 285.04L756.12 285.04L756.12 283.36L762.39 283.36ZM756.56 278.69L756.56 290L754.75 290L754.75 278.69L756.56 278.69ZM763.8 278.69L763.8 290L761.97 290L761.97 278.69L763.8 278.69ZM770.11 290.24Q769.03 290.24 768.15 289.85Q767.28 289.45 766.76 288.67Q766.25 287.9 766.25 286.78Q766.25 285.81 766.63 285.2Q767.01 284.59 767.65 284.24Q768.3 283.9 769.08 283.72Q769.87 283.55 770.67 283.45Q771.69 283.32 772.32 283.24Q772.95 283.17 773.25 283Q773.55 282.83 773.55 282.41L773.55 282.35Q773.55 281.65 773.29 281.16Q773.02 280.67 772.49 280.41Q771.96 280.14 771.17 280.14Q770.36 280.14 769.78 280.4Q769.21 280.65 768.84 281.04Q768.48 281.43 768.33 281.86L766.56 281.37Q766.93 280.34 767.64 279.72Q768.36 279.1 769.27 278.82Q770.19 278.54 771.12 278.54Q771.76 278.54 772.49 278.7Q773.23 278.86 773.88 279.27Q774.53 279.69 774.95 280.47Q775.37 281.24 775.37 282.5L775.37 290L773.58 290L773.58 288.45L773.47 288.45Q773.28 288.85 772.86 289.27Q772.44 289.68 771.76 289.96Q771.08 290.24 770.11 290.24ZM770.42 288.63Q771.45 288.63 772.14 288.24Q772.84 287.85 773.2 287.21Q773.55 286.58 773.55 285.89L773.55 284.35Q773.44 284.47 773.08 284.57Q772.73 284.67 772.26 284.75Q771.79 284.84 771.33 284.89Q770.88 284.95 770.58 284.99Q769.92 285.07 769.35 285.27Q768.78 285.47 768.43 285.85Q768.08 286.22 768.08 286.88Q768.08 287.45 768.38 287.84Q768.69 288.23 769.21 288.43Q769.74 288.63 770.42 288.63ZM778.49 290L778.49 278.69L783.13 278.69Q784.97 278.69 786.07 279.51Q787.17 280.34 787.17 281.71Q787.17 282.7 786.57 283.28Q785.98 283.86 784.99 284.06Q785.65 284.15 786.24 284.5Q786.83 284.86 787.22 285.46Q787.61 286.06 787.61 286.94Q787.61 287.83 787.15 288.52Q786.7 289.21 785.86 289.61Q785.01 290 783.85 290L778.49 290ZM780.22 288.34L783.85 288.34Q784.73 288.34 785.23 287.92Q785.73 287.51 785.73 286.8Q785.73 285.93 785.23 285.45Q784.73 284.97 783.85 284.97L780.22 284.97L780.22 288.34ZM780.22 283.44L783.15 283.44Q784.18 283.44 784.75 283.01Q785.33 282.59 785.33 281.86Q785.33 281.15 784.75 280.75Q784.17 280.36 783.13 280.36L780.22 280.36L780.22 283.44ZM788.79 290L788.79 288.32L789.2 288.32Q789.7 288.32 790.04 288.13Q790.38 287.94 790.59 287.45Q790.8 286.96 790.92 286.06Q791.03 285.15 791.1 283.72L791.3 278.69L798.98 278.69L798.98 290L797.16 290L797.16 280.38L793.03 280.38L792.86 284.36Q792.78 286.24 792.45 287.5Q792.12 288.75 791.4 289.38Q790.68 290 789.41 290LLine truncated
|
||||
<g transform="translate(954.5 173.5) scale(0.92)" fill="none" stroke="#8a8a94" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="m9 18 6-6-6-6"/></g>
|
||||
<rect x="980.5" y="4" width="295.5" height="361" rx="24.2" fill="#0c0c0e" stroke="#2a2a2f" stroke-width="2"/>
|
||||
<circle cx="1028.9" cy="52.4" r="27.5" fill="#1d1d21" stroke="#2a2a2f" stroke-width="2"/>
|
||||
<path d="M1020.96 58.64L1020.96 56.42L1030.56 41.57L1032.21 41.57L1032.21 44.94L1031.13 44.94L1023.9 56.09L1023.9 56.25L1036.87 56.25L1036.87 58.64L1020.96 58.64ZM1031.27 63.18L1031.27 57.99L1031.27 56.93L1031.27 41.57L1033.88 41.57L1033.88 63.18L1031.27 63.18Z" fill="#f2f2f3" stroke="#f2f2f3" stroke-width="0.88" stroke-linejoin="round"/>
|
||||
<g transform="translate(1099.65 54.6) scale(2.38)" fill="none" stroke="#f2f2f3" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M6 3 20 12 6 21Z"/></g>
|
||||
<path d="M1075.79 169.34Q1073.42 169.34 1071.59 168.49Q1069.75 167.65 1068.68 166.16Q1067.61 164.67 1067.54 162.7L1070.6 162.7Q1070.68 163.92 1071.37 164.82Q1072.05 165.71 1073.19 166.19Q1074.32 166.66 1075.74 166.66Q1077.29 166.66 1078.47 166.13Q1079.64 165.6 1080.33 164.63Q1081.01 163.67 1081.01 162.41Q1081.01 161.1 1080.34 160.12Q1079.67 159.14 1078.42 158.57Q1077.16 158.01 1075.37 158.01L1073.42 158.01L1073.42 155.37L1075.37 155.37Q1076.81 155.37 1077.89 154.87Q1078.98 154.37 1079.59 153.46Q1080.19 152.55 1080.19 151.31Q1080.19 150.1 1079.65 149.2Q1079.11 148.29 1078.12 147.79Q1077.13 147.3 1075.79 147.3Q1074.52 147.3 1073.44 147.76Q1072.36 148.23 1071.69 149.09Q1071.02 149.95 1070.99 151.19L1068.06 151.19Q1068.11 149.26 1069.16 147.79Q1070.22 146.31 1071.96 145.48Q1073.71 144.65 1075.86 144.65Q1078.08 144.65 1079.72 145.56Q1081.37 146.46 1082.26 147.93Q1083.16 149.41 1083.16 151.15Q1083.16 153.14 1082.07 154.56Q1080.98 155.98 1079.13 156.54L1079.13 156.71Q1080.66 156.95 1081.75 157.74Q1082.85 158.53 1083.43 159.73Q1084.01 160.93 1084.01 162.43Q1084.01 164.42 1082.94 165.98Q1081.87 167.53 1080.01 168.44Q1078.16 169.34 1075.79 169.34ZM1092.74 169.39Q1091.04 169.39 1089.65 168.76Q1088.26 168.13 1087.45 166.91Q1086.64 165.68 1086.64 163.91Q1086.64 162.38 1087.24 161.42Q1087.84 160.46 1088.86 159.91Q1089.87 159.36 1091.12 159.09Q1092.36 158.82 1093.61 158.66Q1095.22 158.45 1096.22 158.33Q1097.22 158.22 1097.7 157.95Q1098.17 157.67 1098.17 157.01L1098.17 156.92Q1098.17 155.82 1097.75 155.05Q1097.34 154.27 1096.5 153.85Q1095.66 153.43 1094.4 153.43Q1093.13 153.43 1092.22 153.84Q1091.31 154.24 1090.74 154.85Q1090.16 155.46 1089.92 156.14L1087.14 155.37Q1087.72 153.74 1088.84 152.77Q1089.97 151.79 1091.41 151.35Q1092.86 150.9 1094.34 150.9Q1095.34 150.9 1096.5 151.15Q1097.66 151.4 1098.69 152.06Q1099.72 152.73 1100.38 153.95Q1101.04 155.17 1101.04 157.16L1101.04 169L1098.22 169L1098.22 166.55L1098.04 166.55Q1097.74 167.18 1097.08 167.84Q1096.42 168.5 1095.35 168.94Q1094.27 169.39 1092.74 169.39ZM1093.23 166.84Q1094.85 166.84 1095.95 166.22Q1097.05 165.6 1097.61 164.6Q1098.17 163.6 1098.17 162.51L1098.17 160.07Q1098 160.27 1097.43 160.43Q1096.87 160.59 1096.13 160.72Q1095.39 160.85 1094.67 160.94Q1093.95 161.02 1093.48 161.09Q1092.44 161.22 1091.53 161.53Q1090.63 161.85 1090.08 162.44Q1089.54 163.04 1089.54 164.07Q1089.54 164.97 1090.01 165.59Q1090.49 166.21 1091.32 166.53Q1092.15 166.84 1093.23 166.84ZM1119.59 151.15L1119.59 169L1116.72 169L1116.72 153.81L1108.2 153.81L1108.2 169L1105.31 169L1105.31 151.15L1119.59 151.15ZM1123.63 175.56L1124.25 173.06L1124.79 173.12Q1125.62 173.32 1126.28 173.2Q1126.95 173.08 1127.49 172.49Q1128.03 171.9 1128.45 170.71L1129.03 169.05L1122.2 151.15L1125.34 151.15L1129.14 161.68Q1129.74 163.28 1130.16 164.86Q1130.58 166.44 1131.03 167.92L1130.03 167.92Q1130.48 166.44 1130.91 164.86Q1131.34 163.28 1131.92 161.68L1135.73 151.15L1138.86 151.15L1130.95 171.77Q1130.42 173.16 1129.67 174.06Q1128.92 174.96 1127.92 175.41Q1126.92 175.85 1125.68 175.85Q1124.97 175.85 1124.43 175.75Q1123.89 175.65 1123.63 175.56ZM1148.74 169.39Q1146.31 169.39 1144.48 168.23Q1142.65 167.08 1141.62 165Q1140.6 162.93 1140.6 160.17Q1140.6 157.4 1141.62 155.3Q1142.65 153.21 1144.48 152.06Q1146.31 150.9 1148.74 150.9Q1150.08 150.9 1151.24 151.26Q1152.41 151.61 1153.37 152.27Q1154.33 152.94 1155.01 153.89Q1155.68 154.84 1156.02 156.04L1153.23 156.69Q1153.06 156 1152.66 155.41Q1152.27 154.82 1151.7 154.39Q1151.12 153.95 1150.38 153.72Q1149.64 153.48 1148.74 153.48Q1146.98 153.48 1145.82 154.4Q1144.66 155.32 1144.09 156.83Q1143.52 158.35 1143.52 160.17Q1143.52 161.97 1144.09 163.48Q1144.66 164.99 1145.81 165.9Q1146.97 166.81 1148.74 166.81Q1149.66 166.81 1150.41 166.57Q1151.16 166.33 1151.74 165.88Q1152.32 165.44 1152.71 164.82Q1153.11 164.2 1153.3 163.47L1156.07 164.13Q1155.75 165.34 1155.06 166.31Q1154.38 167.28 1153.42 167.97Q1152.46 168.66 1151.28 169.02Q1150.09 169.39 1148.74 169.39ZM1163.16 169L1163.16 153.72L1157.23 153.72L1157.23 151.15L1171.94 151.15L1171.94 153.72L1166.04 153.72L1166.04 169L1163.16 169ZM1188.44 169L1185.56 169L1185.56 156.06L1185.37 156.06L1176.79 169L1174.05 169L1174.05 151.15L1176.92 151.15L1176.92 164.13L1177.1 164.13L1185.7 151.15L1188.44 151.15L1188.44 169Z" fill="#f2f2f3" stroke="#f2f2f3" stroke-width="0.99" stroke-linejoin="round"/>
|
||||
<path d="M1038.9 219.81Q1036.95 219.81 1035.41 218.86Q1033.88 217.9 1033.01 216.15Q1032.13 214.4 1032.13 212.01Q1032.13 209.61 1033.01 207.85Q1033.88 206.1 1035.41 205.14Q1036.95 204.18 1038.9 204.18Q1040.86 204.18 1042.39 205.14Q1043.93 206.1 1044.8 207.85Q1045.67 209.61 1045.67 212.01Q1045.67 214.4 1044.8 216.15Q1043.93 217.9 1042.39 218.86Q1040.86 219.81 1038.9 219.81ZM1038.9 218.03Q1040.26 218.03 1041.37 217.33Q1042.48 216.64 1043.13 215.3Q1043.79 213.96 1043.79 212.01Q1043.79 210.05 1043.13 208.7Q1042.48 207.35 1041.37 206.66Q1040.26 205.97 1038.9 205.97Q1037.54 205.97 1036.42 206.66Q1035.31 207.35 1034.66 208.7Q1034.01 210.05 1034.01 212.01Q1034.01 213.96 1034.66 215.3Q1035.31 216.64 1036.42 217.33Q1037.54 218.03 1038.9 218.03ZM1051.7 219.6L1047.37 208.29L1049.36 208.29L1051.77 214.97Q1052.15 215.98 1052.42 216.98Q1052.68 217.98 1052.98 218.92L1052.34 218.92Q1052.63 217.98 1052.9 216.98Q1053.17 215.98 1053.54 214.97L1055.94 208.29L1057.93 208.29L1053.6 219.6L1051.7 219.6ZM1064.73 219.84Q1063.09 219.84 1061.91 219.11Q1060.72 218.38 1060.09 217.07Q1059.45 215.76 1059.45 214.03Q1059.45 212.29 1060.07 210.97Q1060.7 209.64 1061.85 208.89Q1063 208.14 1064.53 208.14Q1065.48 208.14 1066.37 208.46Q1067.25 208.77 1067.96 209.46Q1068.66 210.14 1069.08 211.22Q1069.49 212.3 1069.49 213.83L1069.49 214.55L1060.63 214.55L1060.63 213.01L1068.51 213.01L1067.66 213.57Q1067.66 212.46 1067.31 211.59Q1066.95 210.73 1066.25 210.24Q1065.55 209.75 1064.53 209.75Q1063.52 209.75 1062.78 210.25Q1062.05 210.74 1061.66 211.55Q1061.27 212.36 1061.27 213.32L1061.27 214.3Q1061.27 215.55 1061.7 216.43Q1062.13 217.3 1062.92 217.76Q1063.7 218.22 1064.74 218.22Q1065.43 218.22 1065.98 218.02Q1066.54 217.81 1066.94 217.42Q1067.34 217.02 1067.54 216.45L1069.31 216.85Q1069.05 217.73 1068.42 218.41Q1067.78 219.09 1066.85 219.47Q1065.91 219.84 1064.73 219.84ZM1072.02 219.6L1072.02 208.29L1073.78 208.29L1073.78 210.04L1073.88 210.04Q1074.19 209.18 1074.97 208.66Q1075.76 208.13 1076.78 208.13Q1076.99 208.13 1077.26 208.14Q1077.52 208.16 1077.67 208.17L1077.67 210Q1077.59 209.98 1077.27 209.94Q1076.95 209.89 1076.58 209.89Q1075.8 209.89 1075.17 210.23Q1074.55 210.56 1074.19 211.15Q1073.84 211.74 1073.84 212.54L1073.84 219.6L1072.02 219.6ZM1083.94 219.83Q1082.52 219.83 1081.44 219.12Q1080.36 218.4 1079.75 217.08Q1079.14 215.76 1079.14 213.98Q1079.14 212.19 1079.75 210.88Q1080.36 209.57 1081.44 208.85Q1082.53 208.14 1083.95 208.14Q1084.99 208.14 1085.64 208.48Q1086.3 208.82 1086.67 209.28Q1087.05 209.73 1087.27 210.09L1087.39 210.09L1087.39 204.39L1089.21 204.39L1089.21 219.6L1087.45 219.6L1087.45 217.85L1087.28 217.85Q1087.05 218.22 1086.66 218.69Q1086.28 219.15 1085.62 219.49Q1084.97 219.83 1083.94 219.83ZM1084.22 218.21Q1085.25 218.21 1085.97 217.67Q1086.68 217.13 1087.06 216.17Q1087.43 215.21 1087.43 213.96Q1087.43 212.7 1087.06 211.76Q1086.69 210.82 1085.98 210.3Q1085.26 209.77 1084.22 209.77Q1083.15 209.77 1082.43 210.32Q1081.71 210.86 1081.35 211.81Q1080.99 212.75 1080.99 213.96Q1080.99 215.17 1081.36 216.14Q1081.73 217.1 1082.45 217.66Q1083.17 218.21 1084.22 218.21ZM1092.33 219.6L1092.33 208.29L1094.08 208.29L1094.08 210.04L1094.19 210.04Q1094.5 209.18 1095.28 208.66Q1096.06 208.13 1097.08 208.13Q1097.3 208.13 1097.56 208.14Q1097.83 208.16 1097.98 208.17L1097.98 210Q1097.9 209.98 1097.58 209.94Q1097.26 209.89 1096.89 209.89Q1096.1 209.89 1095.48 210.23Q1094.86 210.56 1094.5 211.15Q1094.14 211.74 1094.14 212.54L1094.14 219.6L1092.33 219.6ZM1100 219.6L1100 208.29L1101.82 208.29L1101.82 219.6L1100 219.6ZM1100.91 206.39Q1100.4 206.39 1100.03 206.04Q1099.66 205.68 1099.66 205.18Q1099.66 204.67 1100.03 204.32Q1100.4 203.98 1100.91 203.98Q1101.43 203.98 1101.8 204.32Q1102.18 204.67 1102.18 205.18Q1102.18 205.68 1101.8 206.04Q1101.43 206.39 1100.91 206.39ZM1108.22 219.6L1103.89 208.29L1105.88 208.29L1108.29 214.97Q1108.67 215.98 1108.93 216.98Q1109.2 217.98 1109.49 218.92L1108.86 218.92Q1109.15 217.98 1109.42 216.98Q1109.69 215.98 1110.05 214.97L1112.45 208.29L1114.44 208.29L1110.12 219.6L1108.22 219.6ZM1121.25 219.84Q1119.61 219.84 1118.42 219.11Q1117.24 218.38 1116.6 217.07Q1115.96 215.76 1115.96 214.03Q1115.96 212.29 1116.59 210.97Q1117.22 209.64 1118.37 208.89Q1119.51 208.14 1121.05 208.14Q1121.99 208.14 1122.88 208.46Q1123.77 208.77 1124.47 209.46Q1125.18 210.14 1125.59 211.22Q1126 212.3 1126 213.83L1126 214.55L1117.15 214.55L1117.15 213.01L1125.03 213.01L1124.18 213.57Q1124.18 212.46 1123.82 211.59Q1123.46 210.73 1122.76 210.24Q1122.07 209.75 1121.05 209.75Q1120.03 209.75 1119.3 210.25Q1118.57 210.74 1118.18 211.55Q1117.79 212.36 1117.79 213.32L1117.79 214.3Q1117.79 215.55 1118.22 216.43Q1118.65 217.3 1119.43 217.76Q1120.22 218.22 1121.26 218.22Q1121.94 218.22 1122.5 218.02Q1123.06 217.81 1123.45 217.42Q1123.85 217.02 1124.06 216.45L1125.82 216.85Q1125.57 217.73 1124.93 218.41Q1124.3 219.09 1123.36 219.47Q1122.42 219.84 1121.25 219.84ZM1143.34 208.29L1143.34 219.6L1141.53 219.6L1141.53 209.98L1136.13 209.98L1136.13 219.6L1134.3 219.6L1134.3 Line truncated
|
||||
<path d="M1038.88 248.16L1038.88 249.84L1032.61 249.84L1032.61 248.16L1038.88 248.16ZM1033.05 243.49L1033.05 254.8L1031.24 254.8L1031.24 243.49L1033.05 243.49ZM1040.29 243.49L1040.29 254.8L1038.46 254.8L1038.46 243.49L1040.29 243.49ZM1046.6 255.04Q1045.52 255.04 1044.64 254.65Q1043.77 254.25 1043.25 253.47Q1042.74 252.7 1042.74 251.58Q1042.74 250.61 1043.12 250Q1043.5 249.39 1044.14 249.04Q1044.79 248.7 1045.57 248.52Q1046.36 248.35 1047.16 248.25Q1048.18 248.12 1048.81 248.04Q1049.44 247.97 1049.74 247.8Q1050.04 247.63 1050.04 247.21L1050.04 247.15Q1050.04 246.45 1049.78 245.96Q1049.51 245.47 1048.98 245.21Q1048.45 244.94 1047.66 244.94Q1046.85 244.94 1046.27 245.2Q1045.7 245.45 1045.33 245.84Q1044.97 246.23 1044.82 246.66L1043.05 246.17Q1043.42 245.14 1044.13 244.52Q1044.85 243.9 1045.76 243.62Q1046.68 243.34 1047.61 243.34Q1048.25 243.34 1048.98 243.5Q1049.72 243.66 1050.37 244.07Q1051.02 244.49 1051.44 245.27Q1051.86 246.04 1051.86 247.3L1051.86 254.8L1050.07 254.8L1050.07 253.25L1049.96 253.25Q1049.77 253.65 1049.35 254.07Q1048.93 254.48 1048.25 254.76Q1047.57 255.04 1046.6 255.04ZM1046.91 253.43Q1047.94 253.43 1048.64 253.04Q1049.33 252.65 1049.69 252.01Q1050.04 251.38 1050.04 250.69L1050.04 249.15Q1049.93 249.27 1049.57 249.37Q1049.22 249.47 1048.75 249.55Q1048.28 249.64 1047.82 249.69Q1047.37 249.75 1047.07 249.79Q1046.41 249.87 1045.84 250.07Q1045.27 250.27 1044.92 250.65Q1044.57 251.02 1044.57 251.68Q1044.57 252.25 1044.87 252.64Q1045.18 253.03 1045.7 253.23Q1046.23 253.43 1046.91 253.43ZM1067.82 243.49L1067.82 245.18L1062.57 245.18L1062.57 254.8L1060.75 254.8L1060.75 243.49L1067.82 243.49ZM1068.44 254.8L1068.44 253.12L1068.85 253.12Q1069.35 253.12 1069.69 252.93Q1070.04 252.74 1070.24 252.25Q1070.45 251.76 1070.57 250.86Q1070.69 249.95 1070.75 248.52L1070.95 243.49L1078.64 243.49L1078.64 254.8L1076.81 254.8L1076.81 245.18L1072.69 245.18L1072.51 249.16Q1072.43 251.04 1072.1 252.3Q1071.77 253.55 1071.05 254.18Q1070.33 254.8 1069.07 254.8L1068.44 254.8ZM1084.95 255.04Q1083.87 255.04 1083 254.65Q1082.12 254.25 1081.6 253.47Q1081.09 252.7 1081.09 251.58Q1081.09 250.61 1081.47 250Q1081.85 249.39 1082.5 249.04Q1083.14 248.7 1083.92 248.52Q1084.71 248.35 1085.51 248.25Q1086.53 248.12 1087.16 248.04Q1087.79 247.97 1088.09 247.8Q1088.39 247.63 1088.39 247.21L1088.39 247.15Q1088.39 246.45 1088.13 245.96Q1087.86 245.47 1087.33 245.21Q1086.8 244.94 1086.01 244.94Q1085.2 244.94 1084.62 245.2Q1084.05 245.45 1083.68 245.84Q1083.32 246.23 1083.17 246.66L1081.4 246.17Q1081.77 245.14 1082.49 244.52Q1083.2 243.9 1084.11 243.62Q1085.03 243.34 1085.97 243.34Q1086.6 243.34 1087.33 243.5Q1088.07 243.66 1088.72 244.07Q1089.37 244.49 1089.79 245.27Q1090.21 246.04 1090.21 247.3L1090.21 254.8L1088.42 254.8L1088.42 253.25L1088.31 253.25Q1088.12 253.65 1087.7 254.07Q1087.28 254.48 1086.6 254.76Q1085.92 255.04 1084.95 255.04ZM1085.26 253.43Q1086.29 253.43 1086.99 253.04Q1087.68 252.65 1088.04 252.01Q1088.39 251.38 1088.39 250.69L1088.39 249.15Q1088.28 249.27 1087.92 249.37Q1087.57 249.47 1087.1 249.55Q1086.63 249.64 1086.17 249.69Q1085.72 249.75 1085.42 249.79Q1084.76 249.87 1084.19 250.07Q1083.62 250.27 1083.27 250.65Q1082.92 251.02 1082.92 251.68Q1082.92 252.25 1083.23 252.64Q1083.53 253.03 1084.05 253.23Q1084.58 253.43 1085.26 253.43ZM1093.33 254.8L1093.33 243.49L1097.97 243.49Q1099.81 243.49 1100.91 244.31Q1102.01 245.14 1102.01 246.51Q1102.01 247.5 1101.42 248.08Q1100.82 248.66 1099.83 248.86Q1100.49 248.95 1101.08 249.3Q1101.67 249.66 1102.06 250.26Q1102.45 250.86 1102.45 251.74Q1102.45 252.63 1101.99 253.32Q1101.54 254.01 1100.7 254.41Q1099.85 254.8 1098.69 254.8L1093.33 254.8ZM1095.06 253.14L1098.69 253.14Q1099.57 253.14 1100.07 252.72Q1100.57 252.31 1100.57 251.6Q1100.57 250.73 1100.07 250.25Q1099.57 249.77 1098.69 249.77L1095.06 249.77L1095.06 253.14ZM1095.06 248.24L1097.99 248.24Q1099.02 248.24 1099.59 247.81Q1100.17 247.39 1100.17 246.66Q1100.17 245.95 1099.59 245.55Q1099.01 245.16 1097.97 245.16L1095.06 245.16L1095.06 248.24ZM1112.64 248.16L1112.64 249.84L1106.38 249.84L1106.38 248.16L1112.64 248.16ZM1106.81 243.49L1106.81 254.8L1105 254.8L1105 243.49L1106.81 243.49ZM1114.05 243.49L1114.05 254.8L1112.22 254.8L1112.22 243.49L1114.05 243.49ZM1121.76 255.04Q1120.22 255.04 1119.07 254.32Q1117.91 253.59 1117.26 252.27Q1116.61 250.95 1116.61 249.21Q1116.61 247.45 1117.26 246.13Q1117.91 244.8 1119.07 244.07Q1120.22 243.34 1121.76 243.34Q1123.32 243.34 1124.48 244.07Q1125.65 244.8 1126.3 246.13Q1126.95 247.45 1126.95 249.21Q1126.95 250.95 1126.3 252.27Q1125.65 253.59 1124.48 254.32Q1123.32 255.04 1121.76 255.04ZM1121.76 253.41Q1122.9 253.41 1123.64 252.84Q1124.39 252.26 1124.75 251.3Q1125.11 250.35 1125.11 249.21Q1125.11 248.06 1124.75 247.1Q1124.39 246.14 1123.64 245.55Q1122.9 244.97 1121.76 244.97Q1120.65 244.97 1119.92 245.55Q1119.18 246.14 1118.82 247.1Q1118.46 248.05 1118.46 249.21Q1118.46 250.35 1118.82 251.3Q1119.18 252.26 1119.91 252.84Q1120.64 253.41 1121.76 253.41ZM1129.52 254.8L1129.52 243.49L1132.25 243.49L11Line truncated
|
||||
<path d="M1079.7 290L1079.7 274.79L1085.1 274.79Q1086.68 274.79 1087.73 275.33Q1088.77 275.87 1089.29 276.78Q1089.81 277.69 1089.81 278.83Q1089.81 279.78 1089.48 280.42Q1089.14 281.06 1088.57 281.45Q1088.01 281.84 1087.32 282.04L1087.32 282.16Q1088.07 282.21 1088.78 282.66Q1089.49 283.11 1089.95 283.92Q1090.41 284.73 1090.41 285.91Q1090.41 287.08 1089.87 288Q1089.33 288.93 1088.2 289.46Q1087.06 290 1085.26 290L1079.7 290ZM1081.62 288.3L1085.22 288.3Q1086.99 288.3 1087.77 287.62Q1088.55 286.95 1088.55 285.91Q1088.55 285.13 1088.15 284.49Q1087.76 283.86 1087.04 283.48Q1086.32 283.1 1085.32 283.1L1081.62 283.1L1081.62 288.3ZM1081.62 281.47L1085.03 281.47Q1085.86 281.47 1086.53 281.15Q1087.2 280.84 1087.58 280.25Q1087.97 279.66 1087.97 278.88Q1087.97 277.86 1087.26 277.18Q1086.55 276.5 1085.08 276.5L1081.62 276.5L1081.62 281.47ZM1097.69 290.24Q1096.15 290.24 1094.99 289.52Q1093.83 288.79 1093.19 287.47Q1092.54 286.15 1092.54 284.41Q1092.54 282.65 1093.19 281.33Q1093.83 280 1094.99 279.27Q1096.15 278.54 1097.69 278.54Q1099.24 278.54 1100.41 279.27Q1101.58 280 1102.23 281.33Q1102.88 282.65 1102.88 284.41Q1102.88 286.15 1102.23 287.47Q1101.58 288.79 1100.41 289.52Q1099.24 290.24 1097.69 290.24ZM1097.69 288.61Q1098.82 288.61 1099.57 288.04Q1100.31 287.46 1100.68 286.5Q1101.04 285.55 1101.04 284.41Q1101.04 283.26 1100.68 282.3Q1100.31 281.34 1099.57 280.75Q1098.82 280.17 1097.69 280.17Q1096.58 280.17 1095.84 280.75Q1095.11 281.34 1094.75 282.3Q1094.38 283.25 1094.38 284.41Q1094.38 285.55 1094.75 286.5Q1095.11 287.46 1095.84 288.04Q1096.57 288.61 1097.69 288.61ZM1107.83 290L1107.83 280.33L1104.08 280.33L1104.08 278.69L1113.4 278.69L1113.4 280.33L1109.66 280.33L1109.66 290L1107.83 290ZM1130.03 290L1128.2 290L1128.2 281.81L1128.08 281.81L1122.65 290L1120.92 290L1120.92 278.69L1122.73 278.69L1122.73 286.92L1122.85 286.92L1128.3 278.69L1130.03 278.69L1130.03 290ZM1138.91 290L1138.91 278.69L1143.54 278.69Q1145.39 278.69 1146.49 279.51Q1147.58 280.34 1147.58 281.71Q1147.58 282.7 1146.99 283.28Q1146.4 283.86 1145.41 284.06Q1146.06 284.15 1146.65 284.5Q1147.25 284.86 1147.63 285.46Q1148.02 286.06 1148.02 286.94Q1148.02 287.83 1147.57 288.52Q1147.11 289.21 1146.27 289.61Q1145.43 290 1144.27 290L1138.91 290ZM1140.63 288.34L1144.27 288.34Q1145.14 288.34 1145.64 287.92Q1146.14 287.51 1146.14 286.8Q1146.14 285.93 1145.64 285.45Q1145.14 284.97 1144.27 284.97L1140.63 284.97L1140.63 288.34ZM1140.63 283.44L1143.56 283.44Q1144.59 283.44 1145.17 283.01Q1145.75 282.59 1145.75 281.86Q1145.75 281.15 1145.16 280.75Q1144.58 280.36 1143.54 280.36L1140.63 280.36L1140.63 283.44ZM1155.18 290.24Q1153.64 290.24 1152.48 289.52Q1151.32 288.79 1150.67 287.47Q1150.02 286.15 1150.02 284.41Q1150.02 282.65 1150.67 281.33Q1151.32 280 1152.48 279.27Q1153.64 278.54 1155.18 278.54Q1156.02 278.54 1156.76 278.76Q1157.5 278.99 1158.11 279.41Q1158.72 279.83 1159.15 280.43Q1159.57 281.03 1159.79 281.8L1158.02 282.2Q1157.91 281.76 1157.66 281.39Q1157.41 281.02 1157.05 280.74Q1156.69 280.47 1156.22 280.32Q1155.75 280.17 1155.18 280.17Q1154.06 280.17 1153.33 280.75Q1152.59 281.34 1152.23 282.3Q1151.87 283.25 1151.87 284.41Q1151.87 285.55 1152.23 286.5Q1152.59 287.46 1153.32 288.04Q1154.05 288.61 1155.18 288.61Q1155.76 288.61 1156.23 288.46Q1156.71 288.31 1157.07 288.03Q1157.44 287.74 1157.69 287.35Q1157.94 286.96 1158.06 286.5L1159.82 286.92Q1159.62 287.68 1159.18 288.3Q1158.75 288.91 1158.14 289.35Q1157.53 289.79 1156.78 290.02Q1156.03 290.24 1155.18 290.24ZM1167.08 290.24Q1165.43 290.24 1164.25 289.51Q1163.06 288.78 1162.43 287.47Q1161.79 286.16 1161.79 284.43Q1161.79 282.69 1162.42 281.37Q1163.04 280.04 1164.19 279.29Q1165.34 278.54 1166.87 278.54Q1167.82 278.54 1168.71 278.86Q1169.6 279.17 1170.3 279.86Q1171 280.54 1171.42 281.62Q1171.83 282.7 1171.83 284.23L1171.83 284.95L1162.97 284.95L1162.97 283.41L1170.85 283.41L1170 283.97Q1170 282.86 1169.65 281.99Q1169.29 281.13 1168.59 280.64Q1167.89 280.15 1166.87 280.15Q1165.86 280.15 1165.13 280.65Q1164.39 281.14 1164 281.95Q1163.62 282.76 1163.62 283.72L1163.62 284.7Q1163.62 285.95 1164.04 286.83Q1164.47 287.7 1165.26 288.16Q1166.04 288.62 1167.09 288.62Q1167.77 288.62 1168.33 288.42Q1168.88 288.21 1169.28 287.82Q1169.68 287.42 1169.88 286.85L1171.65 287.25Q1171.39 288.13 1170.76 288.81Q1170.13 289.49 1169.19 289.87Q1168.25 290.24 1167.08 290.24ZM1168.99 276.79Q1168.49 276.79 1168.14 276.44Q1167.79 276.08 1167.79 275.58Q1167.79 275.08 1168.14 274.73Q1168.49 274.38 1168.99 274.38Q1169.49 274.38 1169.85 274.73Q1170.2 275.08 1170.2 275.58Q1170.2 276.08 1169.85 276.44Q1169.49 276.79 1168.99 276.79ZM1164.71 276.79Q1164.21 276.79 1163.85 276.44Q1163.49 276.08 1163.49 275.58Q1163.49 275.08 1163.85 274.73Q1164.21 274.38 1164.71 274.38Q1165.2 274.38 1165.55 274.73Q1165.9 275.08 1165.9 275.58Q1165.9 276.08 1165.55 276.44Q1165.21 276.79 1164.71 276.79ZM1175.69 290.14Q1175.13 290.14 1174.73 289.74Q1174.33 289.35 1174.33 288.78Q1174.33 288.21 1174.73 287.82Q1175.13 287.42 1175.69 287.42Q1176.26 287.42 1176.66 287.82Q1177.06 28Line truncated
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 105 KiB |
@@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 414 96" width="414" height="96" role="img" aria-label="Поддержать Overdrive через GitHub Sponsors">
|
||||
<rect x="1" y="1" width="412" height="94" rx="22" fill="#0c0c0e" stroke="#2a2a2f" stroke-width="2"/>
|
||||
<circle cx="54.0" cy="48.0" r="26.0" fill="#2a1420" stroke="#5a2343" stroke-width="1.5"/>
|
||||
<g transform="translate(41 34.5) scale(1.08)"><path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z" fill="#db61a2" stroke="#db61a2" stroke-width="2" stroke-linejoin="round"/></g>
|
||||
<path d="M116.95 27.08L116.95 46L114.56 46L114.56 29.2L104.61 29.2L104.61 46L102.22 46L102.22 27.08L116.95 27.08ZM126.58 46.3Q124.66 46.3 123.22 45.4Q121.78 44.49 120.97 42.85Q120.17 41.21 120.17 39.04Q120.17 36.86 120.97 35.21Q121.78 33.56 123.22 32.65Q124.66 31.74 126.58 31.74Q128.51 31.74 129.96 32.65Q131.41 33.56 132.22 35.21Q133.03 36.86 133.03 39.04Q133.03 41.21 132.22 42.85Q131.41 44.49 129.96 45.4Q128.51 46.3 126.58 46.3ZM126.58 44.27Q127.99 44.27 128.91 43.56Q129.84 42.84 130.29 41.65Q130.74 40.46 130.74 39.04Q130.74 37.62 130.29 36.42Q129.84 35.22 128.91 34.5Q127.99 33.77 126.58 33.77Q125.19 33.77 124.28 34.5Q123.37 35.22 122.92 36.42Q122.46 37.61 122.46 39.04Q122.46 40.46 122.92 41.65Q123.37 42.84 124.27 43.56Q125.18 44.27 126.58 44.27ZM134.49 50.08L134.49 43.91L135.66 43.91Q136.09 43.46 136.41 42.94Q136.73 42.42 136.96 41.69Q137.19 40.96 137.35 39.93Q137.52 38.89 137.64 37.44L138.12 31.93L147.25 31.93L147.25 43.91L149.41 43.91L149.41 50.08L147.15 50.08L147.15 46L136.75 46L136.75 50.08L134.49 50.08ZM138.24 43.91L144.99 43.91L144.99 34.03L140.17 34.03L139.86 37.44Q139.66 39.68 139.31 41.3Q138.96 42.93 138.24 43.91ZM150.09 50.08L150.09 43.91L151.26 43.91Q151.69 43.46 152.01 42.94Q152.32 42.42 152.55 41.69Q152.78 40.96 152.95 39.93Q153.11 38.89 153.24 37.44L153.72 31.93L162.85 31.93L162.85 43.91L165.01 43.91L165.01 50.08L162.75 50.08L162.75 46L152.35 46L152.35 50.08L150.09 50.08ZM153.84 43.91L160.59 43.91L160.59 34.03L155.76 34.03L155.46 37.44Q155.26 39.68 154.91 41.3Q154.56 42.93 153.84 43.91ZM173.05 46.3Q171.01 46.3 169.53 45.39Q168.06 44.48 167.27 42.85Q166.47 41.23 166.47 39.07Q166.47 36.91 167.25 35.26Q168.04 33.61 169.46 32.68Q170.89 31.74 172.8 31.74Q173.98 31.74 175.08 32.14Q176.19 32.53 177.06 33.38Q177.94 34.23 178.45 35.58Q178.97 36.92 178.97 38.83L178.97 39.72L167.95 39.72L167.95 37.8L177.75 37.8L176.69 38.5Q176.69 37.11 176.25 36.04Q175.8 34.97 174.94 34.36Q174.07 33.75 172.8 33.75Q171.54 33.75 170.63 34.36Q169.71 34.98 169.23 35.99Q168.75 37 168.75 38.19L168.75 39.41Q168.75 40.96 169.28 42.05Q169.81 43.14 170.79 43.71Q171.77 44.29 173.06 44.29Q173.91 44.29 174.61 44.03Q175.3 43.78 175.79 43.28Q176.29 42.79 176.54 42.08L178.74 42.58Q178.42 43.68 177.63 44.52Q176.85 45.37 175.68 45.83Q174.51 46.3 173.05 46.3ZM181.85 51.31L181.85 31.93L184.04 31.93L184.04 34.17L184.25 34.17Q184.53 33.72 185 33.16Q185.47 32.59 186.28 32.17Q187.1 31.74 188.39 31.74Q190.17 31.74 191.51 32.63Q192.85 33.52 193.61 35.15Q194.37 36.78 194.37 39Q194.37 41.23 193.62 42.86Q192.86 44.5 191.52 45.4Q190.17 46.29 188.41 46.29Q187.14 46.29 186.32 45.87Q185.5 45.44 185.02 44.86Q184.55 44.29 184.27 43.83L184.11 43.83L184.11 51.31L181.85 51.31ZM188.06 44.27Q189.37 44.27 190.26 43.58Q191.16 42.89 191.62 41.69Q192.07 40.49 192.07 38.98Q192.07 37.48 191.62 36.31Q191.16 35.13 190.27 34.45Q189.38 33.77 188.06 33.77Q186.77 33.77 185.87 34.43Q184.98 35.08 184.52 36.25Q184.06 37.42 184.06 38.98Q184.06 40.54 184.53 41.73Q184.99 42.93 185.89 43.6Q186.78 44.27 188.06 44.27ZM196.12 46L201.83 38.85L196.19 31.93L198.87 31.93L203.56 37.91L204.7 37.91L204.7 31.93L206.96 31.93L206.96 37.91L208.08 37.91L212.74 31.93L215.44 31.93L209.82 38.85L215.5 46L212.77 46L208.05 40.01L206.96 40.01L206.96 46L204.7 46L204.7 40.01L203.61 40.01L198.86 46L196.12 46ZM221.92 46.3Q220.58 46.3 219.48 45.81Q218.39 45.31 217.75 44.35Q217.11 43.38 217.11 41.99Q217.11 40.78 217.59 40.03Q218.06 39.27 218.86 38.84Q219.66 38.41 220.64 38.19Q221.62 37.98 222.61 37.85Q223.88 37.68 224.66 37.6Q225.45 37.51 225.83 37.29Q226.2 37.08 226.2 36.55L226.2 36.48Q226.2 35.62 225.87 35.01Q225.54 34.4 224.88 34.07Q224.22 33.74 223.23 33.74Q222.23 33.74 221.51 34.05Q220.79 34.37 220.34 34.85Q219.89 35.34 219.7 35.87L217.5 35.26Q217.96 33.98 218.85 33.21Q219.74 32.44 220.87 32.09Q222.01 31.74 223.18 31.74Q223.97 31.74 224.88 31.94Q225.79 32.14 226.61 32.66Q227.42 33.18 227.94 34.14Q228.46 35.11 228.46 36.67L228.46 46L226.24 46L226.24 44.07L226.1 44.07Q225.86 44.57 225.34 45.09Q224.82 45.61 223.97 45.96Q223.13 46.3 221.92 46.3ZM222.3 44.3Q223.58 44.3 224.45 43.81Q225.31 43.32 225.76 42.53Q226.2 41.75 226.2 40.88L226.2 38.97Q226.06 39.12 225.62 39.25Q225.17 39.37 224.59 39.47Q224 39.58 223.44 39.65Q222.87 39.72 222.51 39.77Q221.68 39.87 220.97 40.12Q220.26 40.36 219.83 40.83Q219.39 41.3 219.39 42.12Q219.39 42.83 219.77 43.31Q220.14 43.8 220.8 44.05Q221.45 44.3 222.3 44.3ZM235.05 46L235.05 33.96L230.38 33.96L230.38 31.93L241.97 31.93L241.97 33.96L237.33 33.96L237.33 46L235.05 46ZM245.81 36.95L249.9 36.95Q251.55 36.95 252.71 37.53Q253.86 38.1 254.47 39.11Q255.07 40.12 255.07 41.43Q255.07 42.71 254.46 43.75Q253.85 44.78 252.7 45.39Q251.55 46 249.9 46L243.9 46L243.9 31.93L246.16 31.93L246.16 43.91L249.89 43.91Q251.16 43.91 251.97 43.24Q252.78 42.57 252.78 41.51Q252.78 40.41 251.97 39.73Q251.16 39.04 249.89 39.04L245.81 39.04L245.81 36.95ZM272.89 46.27Q270.46 46.27 268.55 45.07Q266.65 43.88 265.56 41.7Q264.46 39.53 264.46 36.55Q264.46 33.57 265.56 31.39Q266.65 29.2 268.55 28.01Q270.46 26.82Line truncated
|
||||
<path d="M105.06 68.97Q103.37 68.97 102.36 68.07Q101.34 67.17 101.34 65.36L101.34 62.26L102.91 62.26L102.91 65.36Q102.91 66.47 103.52 66.99Q104.14 67.52 105.06 67.52Q106.01 67.52 106.79 67.34Q107.56 67.17 108.33 66.89L108.33 68.34Q107.82 68.53 107.32 68.67Q106.81 68.81 106.26 68.89Q105.71 68.97 105.06 68.97ZM107.38 72L107.38 62.26L108.95 62.26L108.95 72L107.38 72ZM115.71 72.21Q114.3 72.21 113.28 71.58Q112.26 70.95 111.71 69.82Q111.16 68.7 111.16 67.2Q111.16 65.71 111.7 64.56Q112.24 63.42 113.23 62.78Q114.22 62.13 115.54 62.13Q116.36 62.13 117.12 62.4Q117.89 62.67 118.49 63.26Q119.1 63.85 119.45 64.78Q119.81 65.72 119.81 67.03L119.81 67.65L112.18 67.65L112.18 66.32L118.97 66.32L118.24 66.81Q118.24 65.85 117.93 65.1Q117.62 64.36 117.02 63.94Q116.42 63.52 115.54 63.52Q114.67 63.52 114.04 63.94Q113.4 64.37 113.07 65.07Q112.74 65.77 112.74 66.59L112.74 67.44Q112.74 68.51 113.1 69.27Q113.47 70.02 114.15 70.42Q114.83 70.81 115.72 70.81Q116.31 70.81 116.79 70.64Q117.27 70.46 117.61 70.12Q117.96 69.78 118.13 69.28L119.65 69.64Q119.43 70.39 118.89 70.98Q118.34 71.56 117.53 71.89Q116.73 72.21 115.71 72.21ZM121.99 75.67L121.99 62.26L123.5 62.26L123.5 63.81L123.65 63.81Q123.84 63.5 124.17 63.11Q124.5 62.72 125.06 62.42Q125.62 62.13 126.52 62.13Q127.75 62.13 128.67 62.75Q129.6 63.36 130.13 64.49Q130.66 65.62 130.66 67.16Q130.66 68.7 130.13 69.83Q129.61 70.96 128.68 71.58Q127.75 72.2 126.53 72.2Q125.65 72.2 125.08 71.91Q124.51 71.61 124.18 71.21Q123.85 70.81 123.66 70.5L123.55 70.5L123.55 75.67L121.99 75.67ZM126.29 70.8Q127.19 70.8 127.81 70.33Q128.43 69.85 128.75 69.02Q129.07 68.19 129.07 67.14Q129.07 66.1 128.75 65.29Q128.43 64.48 127.82 64.01Q127.2 63.54 126.29 63.54Q125.39 63.54 124.77 63.99Q124.15 64.44 123.84 65.25Q123.52 66.06 123.52 67.14Q123.52 68.22 123.84 69.05Q124.16 69.87 124.78 70.34Q125.4 70.8 126.29 70.8ZM136.95 72.21Q135.53 72.21 134.51 71.58Q133.5 70.95 132.95 69.82Q132.4 68.7 132.4 67.2Q132.4 65.71 132.94 64.56Q133.48 63.42 134.47 62.78Q135.46 62.13 136.77 62.13Q137.59 62.13 138.36 62.4Q139.12 62.67 139.73 63.26Q140.33 63.85 140.69 64.78Q141.04 65.72 141.04 67.03L141.04 67.65L133.42 67.65L133.42 66.32L140.2 66.32L139.47 66.81Q139.47 65.85 139.16 65.1Q138.86 64.36 138.25 63.94Q137.65 63.52 136.77 63.52Q135.9 63.52 135.27 63.94Q134.64 64.37 134.3 65.07Q133.97 65.77 133.97 66.59L133.97 67.44Q133.97 68.51 134.34 69.27Q134.71 70.02 135.38 70.42Q136.06 70.81 136.96 70.81Q137.55 70.81 138.03 70.64Q138.5 70.46 138.85 70.12Q139.19 69.78 139.37 69.28L140.89 69.64Q140.67 70.39 140.12 70.98Q139.58 71.56 138.77 71.89Q137.96 72.21 136.95 72.21ZM146.27 72.12Q145.28 72.12 144.47 71.8Q143.66 71.47 143.18 70.89Q142.7 70.3 142.67 69.54L144.27 69.54Q144.31 70.08 144.89 70.43Q145.47 70.79 146.27 70.79Q147.16 70.79 147.72 70.34Q148.28 69.9 148.28 69.22Q148.28 68.5 147.68 68.06Q147.08 67.61 146.06 67.61L145.4 67.61L145.4 66.44L146.06 66.44Q146.9 66.44 147.45 66.01Q148.01 65.59 148.01 64.91Q148.01 64.25 147.54 63.83Q147.07 63.42 146.31 63.42Q145.55 63.42 144.99 63.8Q144.42 64.17 144.4 64.79L142.89 64.79Q142.91 64 143.37 63.4Q143.84 62.81 144.61 62.48Q145.39 62.15 146.33 62.15Q147.3 62.15 148.02 62.51Q148.74 62.88 149.14 63.48Q149.54 64.09 149.54 64.83Q149.54 65.69 149 66.24Q148.47 66.79 147.67 66.95L147.67 67.01Q148.77 67.17 149.34 67.79Q149.91 68.41 149.91 69.32Q149.91 70.13 149.45 70.76Q148.98 71.39 148.16 71.76Q147.33 72.12 146.27 72.12ZM162.56 72.18Q160.81 72.18 159.49 71.36Q158.17 70.53 157.42 69.02Q156.68 67.51 156.68 65.46Q156.68 63.4 157.42 61.88Q158.17 60.37 159.48 59.55Q160.79 58.72 162.47 58.72Q163.51 58.72 164.42 59.03Q165.32 59.34 166.03 59.92Q166.74 60.5 167.22 61.29Q167.69 62.08 167.86 63.04L166.16 63.04Q165.97 62.39 165.63 61.88Q165.29 61.37 164.82 61.01Q164.35 60.64 163.76 60.45Q163.18 60.26 162.48 60.26Q161.3 60.26 160.35 60.86Q159.41 61.47 158.85 62.63Q158.3 63.79 158.3 65.46Q158.3 67.11 158.86 68.27Q159.41 69.42 160.38 70.04Q161.34 70.65 162.56 70.65Q163.67 70.65 164.52 70.17Q165.37 69.7 165.85 68.83Q166.33 67.97 166.33 66.79L166.84 66.88L162.94 66.88L162.94 65.43L167.96 65.43L167.96 66.85Q167.96 68.46 167.25 69.66Q166.55 70.86 165.34 71.52Q164.12 72.18 162.56 72.18ZM170.38 72L170.38 62.26L171.95 62.26L171.95 72L170.38 72ZM171.17 60.63Q170.73 60.63 170.4 60.32Q170.08 60.01 170.08 59.58Q170.08 59.14 170.4 58.84Q170.73 58.54 171.17 58.54Q171.61 58.54 171.93 58.84Q172.25 59.14 172.25 59.58Q172.25 60.01 171.93 60.32Q171.61 60.63 171.17 60.63ZM178.53 62.26L178.53 63.61L173.46 63.61L173.46 62.26L178.53 62.26ZM174.97 59.9L176.54 59.9L176.54 69.5Q176.54 70.14 176.79 70.43Q177.05 70.72 177.67 70.72Q177.83 70.72 178.06 70.69Q178.29 70.66 178.49 70.63L178.76 71.96Q178.51 72.03 178.21 72.07Q177.91 72.11 177.61 72.11Q176.35 72.11 175.66 71.46Q174.97 70.8 174.97 69.63L174.97 59.9ZM180.67 72L180.67 58.9L182.32 58.9L182.32 64.57L189.21 64.57L189.21 58.9L190.86 58.9L190.86 72L189.21 72L189.21 66.03L182.32 66.03L182.32 72L180.67 72ZM197.08 72.13Q196.1 72.13 195.34 71.72Q194.59 71.31 194.17 70.49Q193.74 69.66 193.74 68.42L19Line truncated
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 21 KiB |
@@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 358 96" width="358" height="96" role="img" aria-label="Sponsor Overdrive on GitHub Sponsors">
|
||||
<rect x="1" y="1" width="356" height="94" rx="22" fill="#0c0c0e" stroke="#2a2a2f" stroke-width="2"/>
|
||||
<circle cx="54.0" cy="48.0" r="26.0" fill="#2a1420" stroke="#5a2343" stroke-width="1.5"/>
|
||||
<g transform="translate(41 34.5) scale(1.08)"><path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z" fill="#db61a2" stroke="#db61a2" stroke-width="2" stroke-linejoin="round"/></g>
|
||||
<path d="M108.3 46.33Q106.23 46.33 104.72 45.64Q103.2 44.96 102.34 43.73Q101.49 42.51 101.4 40.86L103.85 40.86Q103.92 41.98 104.54 42.71Q105.15 43.45 106.14 43.82Q107.13 44.18 108.3 44.18Q109.6 44.18 110.62 43.77Q111.64 43.35 112.24 42.58Q112.83 41.82 112.83 40.82Q112.83 39.93 112.35 39.36Q111.86 38.79 111.01 38.41Q110.17 38.03 109.09 37.74L106.83 37.11Q104.44 36.45 103.17 35.25Q101.9 34.04 101.9 32.15Q101.9 30.55 102.75 29.35Q103.61 28.15 105.08 27.48Q106.55 26.82 108.4 26.82Q110.28 26.82 111.72 27.49Q113.17 28.16 113.99 29.33Q114.82 30.5 114.87 32L112.53 32Q112.37 30.55 111.21 29.75Q110.05 28.95 108.33 28.95Q107.11 28.95 106.18 29.35Q105.26 29.75 104.74 30.45Q104.23 31.15 104.23 32.04Q104.23 32.99 104.81 33.58Q105.38 34.18 106.23 34.53Q107.07 34.88 107.87 35.09L109.8 35.62Q110.68 35.84 111.61 36.22Q112.54 36.59 113.36 37.19Q114.17 37.79 114.67 38.68Q115.17 39.58 115.17 40.83Q115.17 42.41 114.36 43.65Q113.55 44.9 112 45.61Q110.46 46.33 108.3 46.33ZM118.25 51.31L118.25 31.93L120.43 31.93L120.43 34.17L120.65 34.17Q120.93 33.72 121.4 33.16Q121.87 32.59 122.68 32.17Q123.49 31.74 124.79 31.74Q126.57 31.74 127.9 32.63Q129.24 33.52 130.01 35.15Q130.77 36.78 130.77 39Q130.77 41.23 130.01 42.86Q129.26 44.5 127.91 45.4Q126.57 46.29 124.8 46.29Q123.53 46.29 122.71 45.87Q121.89 45.44 121.42 44.86Q120.94 44.29 120.66 43.83L120.51 43.83L120.51 51.31L118.25 51.31ZM124.46 44.27Q125.77 44.27 126.66 43.58Q127.56 42.89 128.01 41.69Q128.47 40.49 128.47 38.98Q128.47 37.48 128.01 36.31Q127.56 35.13 126.67 34.45Q125.78 33.77 124.46 33.77Q123.16 33.77 122.27 34.43Q121.37 35.08 120.92 36.25Q120.46 37.42 120.46 38.98Q120.46 40.54 120.92 41.73Q121.39 42.93 122.28 43.6Q123.18 44.27 124.46 44.27ZM139.43 46.3Q137.52 46.3 136.07 45.4Q134.63 44.49 133.83 42.85Q133.02 41.21 133.02 39.04Q133.02 36.86 133.83 35.21Q134.63 33.56 136.07 32.65Q137.52 31.74 139.43 31.74Q141.36 31.74 142.82 32.65Q144.27 33.56 145.08 35.21Q145.88 36.86 145.88 39.04Q145.88 41.21 145.08 42.85Q144.27 44.49 142.82 45.4Q141.36 46.3 139.43 46.3ZM139.43 44.27Q140.84 44.27 141.77 43.56Q142.69 42.84 143.15 41.65Q143.6 40.46 143.6 39.04Q143.6 37.62 143.15 36.42Q142.69 35.22 141.77 34.5Q140.84 33.77 139.43 33.77Q138.05 33.77 137.13 34.5Q136.22 35.22 135.77 36.42Q135.32 37.61 135.32 39.04Q135.32 40.46 135.77 41.65Q136.22 42.84 137.13 43.56Q138.04 44.27 139.43 44.27ZM151.08 37.61L151.08 46L148.82 46L148.82 31.93L150.99 31.93L151 35.35L150.64 35.35Q151.3 33.41 152.49 32.57Q153.68 31.74 155.3 31.74Q156.72 31.74 157.8 32.33Q158.89 32.92 159.5 34.11Q160.11 35.3 160.11 37.1L160.11 46L157.85 46L157.85 37.29Q157.85 35.63 157 34.71Q156.15 33.79 154.65 33.79Q153.64 33.79 152.83 34.23Q152.02 34.66 151.55 35.51Q151.08 36.36 151.08 37.61ZM168.53 46.3Q167.07 46.3 165.93 45.87Q164.79 45.44 164.05 44.58Q163.31 43.73 163.1 42.46L165.25 42.03Q165.53 43.21 166.37 43.77Q167.2 44.32 168.49 44.32Q169.96 44.32 170.83 43.7Q171.7 43.07 171.7 42.19Q171.7 41.46 171.18 40.97Q170.66 40.49 169.63 40.25L167.31 39.7Q165.38 39.25 164.44 38.29Q163.5 37.33 163.5 35.84Q163.5 34.64 164.18 33.71Q164.85 32.78 166.02 32.26Q167.2 31.74 168.7 31.74Q170.14 31.74 171.18 32.19Q172.21 32.64 172.86 33.44Q173.51 34.24 173.77 35.31L171.69 35.75Q171.45 34.94 170.76 34.31Q170.07 33.67 168.71 33.67Q167.44 33.67 166.61 34.26Q165.79 34.84 165.79 35.73Q165.79 36.5 166.36 36.98Q166.93 37.46 168.12 37.74L170.27 38.24Q172.2 38.7 173.12 39.65Q174.04 40.6 174.04 42.06Q174.04 43.31 173.34 44.26Q172.64 45.21 171.4 45.76Q170.16 46.3 168.53 46.3ZM182.69 46.3Q180.78 46.3 179.33 45.4Q177.89 44.49 177.09 42.85Q176.28 41.21 176.28 39.04Q176.28 36.86 177.09 35.21Q177.89 33.56 179.33 32.65Q180.78 31.74 182.69 31.74Q184.62 31.74 186.08 32.65Q187.53 33.56 188.34 35.21Q189.14 36.86 189.14 39.04Q189.14 41.21 188.34 42.85Q187.53 44.49 186.08 45.4Q184.62 46.3 182.69 46.3ZM182.69 44.27Q184.1 44.27 185.03 43.56Q185.95 42.84 186.41 41.65Q186.86 40.46 186.86 39.04Q186.86 37.62 186.41 36.42Q185.95 35.22 185.03 34.5Q184.1 33.77 182.69 33.77Q181.31 33.77 180.39 34.5Q179.48 35.22 179.03 36.42Q178.58 37.61 178.58 39.04Q178.58 40.46 179.03 41.65Q179.48 42.84 180.39 43.56Q181.3 44.27 182.69 44.27ZM192.08 46L192.08 31.93L194.26 31.93L194.26 34.1L194.39 34.1Q194.78 33.04 195.76 32.38Q196.73 31.73 198 31.73Q198.26 31.73 198.59 31.75Q198.92 31.77 199.11 31.78L199.11 34.05Q199.01 34.03 198.61 33.98Q198.21 33.93 197.76 33.93Q196.78 33.93 196 34.34Q195.23 34.75 194.78 35.49Q194.34 36.22 194.34 37.21L194.34 46L192.08 46ZM216.25 46.27Q213.82 46.27 211.91 45.07Q210.01 43.88 208.92 41.7Q207.82 39.53 207.82 36.55Q207.82 33.57 208.92 31.39Q210.01 29.2 211.91 28.01Q213.82 26.82 216.25 26.82Q218.69 26.82 220.59 28.01Q222.5 29.2 223.58 31.39Q224.67 33.57 224.67 36.55Q224.67 39.53 223.58 41.7Q222.5 43.88 220.59 45.07Q218.69 46.27 216.25 46.27ZM216.25 44.04Q217.94 44.04 219.32 43.18Q220.7 42.32 221.52 40.65Q222.33 38.98 222.33 36.55Q222.33 34.12 221.52 32.44Q220.7 30.77 219.32 29.9Q217.94 29.04 216.25 29.04Q214.55 29.04 213.17 29.9Q211.78 30.77 210.97 32.44Q210.16 34.12 210.16 Line truncated
|
||||
<path d="M105.31 72.21Q103.98 72.21 102.98 71.58Q101.99 70.95 101.43 69.82Q100.87 68.69 100.87 67.18Q100.87 65.67 101.43 64.53Q101.99 63.39 102.98 62.76Q103.98 62.13 105.31 62.13Q106.64 62.13 107.65 62.76Q108.66 63.39 109.22 64.53Q109.77 65.67 109.77 67.18Q109.77 68.69 109.22 69.82Q108.66 70.95 107.65 71.58Q106.64 72.21 105.31 72.21ZM105.31 70.8Q106.28 70.8 106.93 70.31Q107.57 69.81 107.88 68.99Q108.19 68.17 108.19 67.18Q108.19 66.2 107.88 65.37Q107.57 64.54 106.93 64.04Q106.28 63.54 105.31 63.54Q104.35 63.54 103.72 64.04Q103.08 64.54 102.77 65.36Q102.46 66.19 102.46 67.18Q102.46 68.17 102.77 68.99Q103.08 69.81 103.71 70.31Q104.34 70.8 105.31 70.8ZM113.55 66.19L113.55 72L111.99 72L111.99 62.26L113.49 62.26L113.5 64.63L113.25 64.63Q113.7 63.28 114.53 62.71Q115.35 62.13 116.47 62.13Q117.46 62.13 118.21 62.54Q118.96 62.95 119.38 63.77Q119.8 64.59 119.8 65.84L119.8 72L118.24 72L118.24 65.97Q118.24 64.82 117.65 64.18Q117.06 63.54 116.02 63.54Q115.33 63.54 114.77 63.85Q114.2 64.15 113.88 64.74Q113.55 65.33 113.55 66.19ZM133.02 72.18Q131.27 72.18 129.95 71.36Q128.63 70.53 127.88 69.02Q127.14 67.51 127.14 65.46Q127.14 63.4 127.88 61.88Q128.63 60.37 129.94 59.55Q131.25 58.72 132.93 58.72Q133.97 58.72 134.88 59.03Q135.78 59.34 136.49 59.92Q137.2 60.5 137.68 61.29Q138.15 62.08 138.32 63.04L136.62 63.04Q136.43 62.39 136.09 61.88Q135.75 61.37 135.28 61.01Q134.81 60.64 134.22 60.45Q133.64 60.26 132.94 60.26Q131.76 60.26 130.81 60.86Q129.87 61.47 129.31 62.63Q128.76 63.79 128.76 65.46Q128.76 67.11 129.32 68.27Q129.87 69.42 130.84 70.04Q131.8 70.65 133.02 70.65Q134.13 70.65 134.98 70.17Q135.83 69.7 136.31 68.83Q136.79 67.97 136.79 66.79L137.3 66.88L133.4 66.88L133.4 65.43L138.42 65.43L138.42 66.85Q138.42 68.46 137.71 69.66Q137.01 70.86 135.8 71.52Q134.58 72.18 133.02 72.18ZM140.84 72L140.84 62.26L142.41 62.26L142.41 72L140.84 72ZM141.62 60.63Q141.19 60.63 140.86 60.32Q140.54 60.01 140.54 59.58Q140.54 59.14 140.86 58.84Q141.19 58.54 141.62 58.54Q142.07 58.54 142.39 58.84Q142.71 59.14 142.71 59.58Q142.71 60.01 142.39 60.32Q142.07 60.63 141.62 60.63ZM148.99 62.26L148.99 63.61L143.92 63.61L143.92 62.26L148.99 62.26ZM145.43 59.9L147 59.9L147 69.5Q147 70.14 147.25 70.43Q147.51 70.72 148.13 70.72Q148.29 70.72 148.52 70.69Q148.75 70.66 148.95 70.63L149.22 71.96Q148.97 72.03 148.67 72.07Q148.37 72.11 148.07 72.11Q146.81 72.11 146.12 71.46Q145.43 70.8 145.43 69.63L145.43 59.9ZM151.13 72L151.13 58.9L152.78 58.9L152.78 64.57L159.67 64.57L159.67 58.9L161.32 58.9L161.32 72L159.67 72L159.67 66.03L152.78 66.03L152.78 72L151.13 72ZM167.54 72.13Q166.56 72.13 165.8 71.72Q165.05 71.31 164.63 70.49Q164.2 69.66 164.2 68.42L164.2 62.26L165.77 62.26L165.77 68.3Q165.77 69.44 166.36 70.08Q166.96 70.72 167.98 70.72Q168.69 70.72 169.24 70.41Q169.8 70.11 170.13 69.52Q170.45 68.93 170.45 68.08L170.45 62.26L172.03 62.26L172.03 72L170.51 72L170.51 69.64L170.75 69.64Q170.29 71 169.46 71.56Q168.62 72.13 167.54 72.13ZM179.25 72.2Q178.37 72.2 177.81 71.91Q177.24 71.61 176.9 71.21Q176.57 70.81 176.38 70.5L176.23 70.5L176.23 72L174.72 72L174.72 58.9L176.28 58.9L176.28 63.81L176.39 63.81Q176.57 63.5 176.9 63.11Q177.22 62.72 177.78 62.42Q178.35 62.13 179.24 62.13Q180.47 62.13 181.4 62.75Q182.33 63.36 182.85 64.49Q183.38 65.62 183.38 67.16Q183.38 68.7 182.86 69.83Q182.34 70.96 181.4 71.58Q180.47 72.2 179.25 72.2ZM179.01 70.8Q179.92 70.8 180.54 70.33Q181.16 69.85 181.47 69.02Q181.79 68.19 181.79 67.14Q181.79 66.1 181.47 65.29Q181.16 64.48 180.54 64.01Q179.93 63.54 179.01 63.54Q178.12 63.54 177.5 63.99Q176.88 64.44 176.56 65.25Q176.25 66.06 176.25 67.14Q176.25 68.22 176.57 69.05Q176.89 69.87 177.51 70.34Q178.13 70.8 179.01 70.8ZM194.97 72.23Q193.53 72.23 192.48 71.75Q191.43 71.28 190.84 70.43Q190.25 69.58 190.18 68.44L191.88 68.44Q191.93 69.21 192.36 69.72Q192.79 70.23 193.47 70.49Q194.16 70.74 194.97 70.74Q195.86 70.74 196.57 70.45Q197.28 70.16 197.69 69.64Q198.1 69.11 198.1 68.41Q198.1 67.8 197.77 67.4Q197.43 67.01 196.84 66.74Q196.26 66.48 195.51 66.28L193.95 65.85Q192.29 65.39 191.42 64.56Q190.54 63.72 190.54 62.41Q190.54 61.3 191.12 60.47Q191.71 59.64 192.73 59.18Q193.75 58.72 195.04 58.72Q196.34 58.72 197.33 59.19Q198.33 59.65 198.9 60.46Q199.47 61.27 199.51 62.31L197.89 62.31Q197.78 61.3 196.98 60.75Q196.18 60.2 194.98 60.2Q194.14 60.2 193.5 60.47Q192.86 60.75 192.5 61.23Q192.14 61.72 192.14 62.33Q192.14 62.99 192.54 63.4Q192.94 63.82 193.53 64.06Q194.11 64.3 194.67 64.45L196 64.81Q196.61 64.97 197.26 65.23Q197.9 65.49 198.46 65.9Q199.03 66.31 199.37 66.93Q199.72 67.55 199.72 68.42Q199.72 69.51 199.16 70.37Q198.6 71.24 197.53 71.73Q196.46 72.23 194.97 72.23ZM202.03 75.67L202.03 62.26L203.54 62.26L203.54 63.81L203.69 63.81Q203.89 63.5 204.21 63.11Q204.54 62.72 205.1 62.42Q205.66 62.13 206.56 62.13Q207.79 62.13 208.72 62.75Q209.64 63.36 210.17 64.49Q210.7 65.62 210.7 67.16Q210.7 68.7 210.18 69.83Q209.65 70.96 208.72 71.58Q207.79 72.2 206.57 72.2Q205.69 72.2 205.12 71.91Q204.55 71.61 204.23 71.21Q203.9 70.81 203.7 70.5L203.6 70.5L203.6 75.67L202.03 75.67ZM206.Line truncated
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 18 KiB |
@@ -1,16 +1,9 @@
|
||||
name: build
|
||||
|
||||
# A push to main checks that the app still builds. A release starts from Run workflow, which
|
||||
# puts the build in a draft release; publishing that draft creates its tag, and no build runs on
|
||||
# tags, so players get the very files that were tested.
|
||||
# Builds run only from Run workflow: a push builds nothing. Each run puts its build in a draft
|
||||
# release; publishing that draft creates its tag, and no build runs on tags, so players get the
|
||||
# very files that were tested.
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
# A push that only touches the README, its images or the issue forms has nothing to build.
|
||||
paths-ignore:
|
||||
- "README.md"
|
||||
- ".github/readme/**"
|
||||
- ".github/ISSUE_TEMPLATE/**"
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
|
||||
@@ -5,6 +5,11 @@
|
||||
</picture>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<b>English</b> ·
|
||||
<a href="README.ru.md">Русский</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<b>Your PS5 game store.</b><br>
|
||||
Back from the dead, rebuilt from its own binary, with every line of source in the open.
|
||||
@@ -13,7 +18,7 @@
|
||||
<p align="center">
|
||||
<a href="https://github.com/MyLuxy/overdrive/releases/latest"><img src="https://img.shields.io/github/v/release/MyLuxy/overdrive?style=for-the-badge&label=release&labelColor=0b0b0d&color=2a2a2f" alt="Latest release" width="197"></a>
|
||||
<a href="https://github.com/MyLuxy/overdrive/releases"><img src="https://img.shields.io/github/downloads/MyLuxy/overdrive/total?style=for-the-badge&label=downloads&labelColor=0b0b0d&color=2a2a2f" alt="Downloads" width="183"></a>
|
||||
<img src="https://img.shields.io/badge/platform-PS5-2a2a2f?style=for-the-badge&labelColor=0b0b0d" alt="Platform: PS5" width="184">
|
||||
<a href="https://github.com/sponsors/MyLuxy"><img src="https://img.shields.io/badge/sponsor-%E2%9D%A4-db61a2?style=for-the-badge&logo=githubsponsors&logoColor=white&labelColor=0b0b0d" alt="Sponsor MyLuxy on GitHub" width="180"></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
@@ -128,6 +133,14 @@ itself a few seconds after it opens:
|
||||
The update needs about **600 MB free** on the drive that holds Overdrive. `update.zip` in each
|
||||
release is the package the app downloads for this; you never need it yourself.
|
||||
|
||||
## Support the project
|
||||
|
||||
Overdrive is free and open source. If you enjoy it, sponsoring helps me keep it updated.
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/sponsors/MyLuxy"><img src=".github/readme/sponsor.svg" alt="Sponsor Overdrive on GitHub Sponsors" width="358"></a>
|
||||
</p>
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
<details>
|
||||
@@ -216,9 +229,9 @@ What a bundler throws away could not come back: most comments, the JSX syntax (i
|
||||
<summary><b>Building</b></summary>
|
||||
<br>
|
||||
|
||||
Every push builds on `ubuntu-24.04` with clang 18 and uploads `Overdrive.exfat` as a workflow
|
||||
artifact. **Run workflow** builds the same and puts `Overdrive.exfat` and `update.zip` in a
|
||||
draft release named after `app/version.js`, which only maintainers can see.
|
||||
Builds run on `ubuntu-24.04` with clang 18, only from **Run workflow**: a push builds nothing.
|
||||
Each run puts `Overdrive.exfat` and `update.zip` in a draft release named after
|
||||
`app/version.js`, which only maintainers can see.
|
||||
|
||||
The same build locally, on any Linux with the packages the workflow installs (`clang-18`,
|
||||
`llvm-18`, `cmake`, `ninja-build`, `nodejs`, `npm`, `zlib1g-dev`, `build-essential`,
|
||||
|
||||
+293
@@ -0,0 +1,293 @@
|
||||
<p align="center">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset=".github/readme/logo-dark.svg">
|
||||
<img src=".github/readme/logo-light.svg" alt="Overdrive" width="440">
|
||||
</picture>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="README.md">English</a> ·
|
||||
<b>Русский</b>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<b>Ваш игровой магазин для PS5.</b><br>
|
||||
Восставший из мёртвых, собранный заново из собственного бинарника, с полностью открытым исходным кодом.
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/MyLuxy/overdrive/releases/latest"><img src="https://img.shields.io/github/v/release/MyLuxy/overdrive?style=for-the-badge&label=release&labelColor=0b0b0d&color=2a2a2f" alt="Последний релиз" width="197"></a>
|
||||
<a href="https://github.com/MyLuxy/overdrive/releases"><img src="https://img.shields.io/github/downloads/MyLuxy/overdrive/total?style=for-the-badge&label=downloads&labelColor=0b0b0d&color=2a2a2f" alt="Скачивания" width="183"></a>
|
||||
<a href="https://github.com/sponsors/MyLuxy"><img src="https://img.shields.io/badge/sponsor-%E2%9D%A4-db61a2?style=for-the-badge&logo=githubsponsors&logoColor=white&labelColor=0b0b0d" alt="Поддержать MyLuxy на GitHub" width="180"></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="#установка-в-четыре-шага">Установка</a> ·
|
||||
<a href="#возможности">Возможности</a> ·
|
||||
<a href="#обновления">Обновления</a> ·
|
||||
<a href="#решение-проблем">Решение проблем</a> ·
|
||||
<a href="#сборка-своими-руками">Сборка своими руками</a>
|
||||
</p>
|
||||
|
||||
> [!NOTE]
|
||||
> Оригинальный проект Overdrive был закрыт, поэтому я декомпилировал последнюю выпущенную сборку,
|
||||
> восстановил полный исходный код и собрал его заново.
|
||||
|
||||
<p align="center">
|
||||
<img src=".github/readme/discover.jpg" alt="Страница «Обзор» в Overdrive с рекомендованной игрой и подборкой «Популярное сейчас»" width="100%">
|
||||
</p>
|
||||
<p align="center">
|
||||
<img src=".github/readme/browse.jpg" alt="Библиотека: 1845 игр с фильтрами, сортировкой, оценками и размерами" width="49.5%">
|
||||
<img src=".github/readme/downloads.jpg" alt="Страница загрузок с активностью и местом на внутреннем накопителе и USB-накопителе" width="49.5%">
|
||||
</p>
|
||||
|
||||
## Возможности
|
||||
|
||||
- **Более 1800 игр** для поиска, с подборками **«Лучшие по оценкам»**, **«Новые релизы»** и отдельной рекомендованной игрой
|
||||
- **Просмотр всей библиотеки** с фильтрами, сортировкой, оценками и размерами загрузок — всё видно сразу
|
||||
- **Загрузка прямо на консоль** — во внутренний накопитель или на любой USB-накопитель, со скоростью и занятым местом в реальном времени
|
||||
- **Избранное**, **поиск** с экранной клавиатурой и страница **«Файлы»**, где видно, что лежит на накопителях, и можно это почистить
|
||||
- **13 языков**: английский, немецкий, испанский, французский, португальский (Бразилия), русский, индонезийский, японский, китайский (упрощённый), арабский, урду, хинди, бенгальский
|
||||
- **Обновляется сам**: новая версия устанавливается прямо с консоли, без компьютера
|
||||
- Сделано под геймпад: <kbd>L1</kbd> <kbd>R1</kbd> — переключение разделов, <kbd>✕</kbd> — выбрать, <kbd>○</kbd> — назад
|
||||
|
||||
## Установка в четыре шага
|
||||
|
||||
<p align="center">
|
||||
<img src=".github/readme/install-steps.ru.svg" alt="1 Скачайте Overdrive.exfat · 2 Скопируйте его в папку homebrew на USB-накопителе · 3 Вставьте накопитель: ShadowMount+ установит его · 4 Играйте" width="100%">
|
||||
</p>
|
||||
|
||||
### Перед началом
|
||||
|
||||
Вам нужна **взломанная PS5** с запущенным **[ShadowMount+](https://github.com/drakmor/ShadowMountPlus)** —
|
||||
это payload, который сам устанавливает образы `.exfat`. Если при включении консоли ShadowMount+
|
||||
показывает уведомление, значит всё готово. Также понадобятся **USB-накопитель** и **компьютер**.
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/MyLuxy/overdrive/releases/latest/download/Overdrive.exfat"><img src="https://img.shields.io/badge/Download-Overdrive.exfat-f2f2f3?style=for-the-badge&labelColor=0b0b0d" alt="Скачать Overdrive.exfat" width="347"></a>
|
||||
</p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td width="64" align="center" valign="top"><img src=".github/readme/step-1.svg" alt="1" width="40"></td>
|
||||
<td>
|
||||
|
||||
**Скачайте `Overdrive.exfat`** по кнопке выше или из
|
||||
[последнего релиза](https://github.com/MyLuxy/overdrive/releases/latest). Это единственный нужный
|
||||
файл. Оставьте его как есть: не распаковывайте и не меняйте `.exfat` в конце имени.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top"><img src=".github/readme/step-2.svg" alt="2" width="40"></td>
|
||||
<td>
|
||||
|
||||
**Скопируйте его на USB-накопитель в папку `homebrew`.** Подключите накопитель к компьютеру,
|
||||
создайте в корне накопителя папку с именем ровно `homebrew` (все буквы строчные) и скопируйте
|
||||
в неё `Overdrive.exfat`:
|
||||
|
||||
```text
|
||||
USB-накопитель
|
||||
└── homebrew
|
||||
└── Overdrive.exfat
|
||||
```
|
||||
|
||||
Накопитель должен быть отформатирован в **exFAT** — так отформатировано большинство накопителей
|
||||
из коробки, и именно этот формат читает PS5.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top"><img src=".github/readme/step-3.svg" alt="3" width="40"></td>
|
||||
<td>
|
||||
|
||||
**Вставьте накопитель в PS5.** ShadowMount+ проверяет наличие новых файлов каждые несколько секунд:
|
||||
он находит Overdrive, монтирует и устанавливает его, а по завершении показывает уведомление.
|
||||
Ничего нажимать не нужно.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top"><img src=".github/readme/step-4.svg" alt="4" width="40"></td>
|
||||
<td>
|
||||
|
||||
<img src="app/sce_sys/icon0.png" alt="Иконка Overdrive" width="64" align="right">
|
||||
|
||||
**Откройте Overdrive с главного экрана.** Ищите эту иконку. Приятной игры!
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Кроме того, файл можно перенести во внутренний накопитель консоли с помощью **любого FTP-клиента** —
|
||||
тоже в папку `homebrew`: `/data/homebrew/Overdrive.exfat`.
|
||||
|
||||
## Обновления
|
||||
|
||||
Overdrive нужно установить вручную только один раз. Когда выходит новая версия, приложение само
|
||||
сообщает об этом через несколько секунд после запуска:
|
||||
|
||||
1. Появляется окно с номером новой версии и списком изменений. Нажмите **«Установить»**.
|
||||
2. Overdrive скачивает обновление, проверяет его и ставит на место старого.
|
||||
3. Когда всё готово, приложение **закрывается само**. Откройте его снова — вы уже на новой версии.
|
||||
|
||||
Для обновления нужно около **600 МБ свободного места** на накопителе, где лежит Overdrive.
|
||||
Файл `update.zip` в каждом релизе — это тот самый пакет, который скачивает приложение; вам он
|
||||
самому не нужен.
|
||||
|
||||
## Поддержать проект
|
||||
|
||||
Overdrive бесплатный и с открытым исходным кодом. Если он вам нравится, спонсорство помогает мне его обновлять.
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/sponsors/MyLuxy"><img src=".github/readme/sponsor.ru.svg" alt="Поддержать Overdrive через GitHub Sponsors" width="414"></a>
|
||||
</p>
|
||||
|
||||
## Решение проблем
|
||||
|
||||
<details>
|
||||
<summary><b>Overdrive не появляется на главном экране</b></summary>
|
||||
<br>
|
||||
|
||||
- Убедитесь, что **ShadowMount+ запущен**: при старте он показывает уведомление.
|
||||
- Проверьте папку: она должна называться ровно `homebrew` и лежать в **корне** накопителя, а не
|
||||
внутри другой папки.
|
||||
- Проверьте, что файл всё ещё заканчивается на **`.exfat`**. Некоторые системы скрывают расширения:
|
||||
файл, переименованный в `Overdrive.exfat.zip` или распакованный в папку, найден не будет.
|
||||
- Подождите минуту: ShadowMount+ ждёт, пока файл полностью скопируется, и только потом
|
||||
устанавливает его.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>После обновления приложение всё ещё показывает старую версию</b></summary>
|
||||
<br>
|
||||
|
||||
Новая версия установлена, но консоль всё ещё держит в памяти старую. **Перезагрузите консоль** и
|
||||
откройте Overdrive снова; приложение само об этом сообщит, если такое случится дважды подряд.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Обновление сообщает, что недостаточно места</b></summary>
|
||||
<br>
|
||||
|
||||
Обновление скачивается рядом с установленным приложением, поэтому на накопителе с Overdrive нужно
|
||||
около 600 МБ свободного места. Освободите место на этом накопителе и нажмите **«Повторить»**.
|
||||
На этот момент ничего ещё не изменено.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Обновление сообщает, что не удалось заменить приложение</b></summary>
|
||||
<br>
|
||||
|
||||
Установите вручную: скачайте `Overdrive.exfat` из
|
||||
[последнего релиза](https://github.com/MyLuxy/overdrive/releases/latest), закройте Overdrive и
|
||||
скопируйте новый файл поверх старого в папку `homebrew`.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Как удалить Overdrive?</b></summary>
|
||||
<br>
|
||||
|
||||
Сначала удалите `Overdrive.exfat` из папки `homebrew`, а затем удалите его иконку с главного экрана.
|
||||
В обратном порядке ShadowMount+ снова найдёт файл и вернёт иконку на место.
|
||||
|
||||
</details>
|
||||
|
||||
## Сборка своими руками
|
||||
|
||||
<details>
|
||||
<summary><b>Что находится в этом репозитории</b></summary>
|
||||
<br>
|
||||
|
||||
| Путь | Что это |
|
||||
| --- | --- |
|
||||
| `app/` | Само приложение: исходники на JSX, состояние, ресурсы, данные каталога и `app.json` (title id `PPSA99058`, версия, возможности) |
|
||||
| `ps5-react/` | Фреймворк, на котором оно работает, взятый из [half144/ps5-react](https://github.com/half144/ps5-react) |
|
||||
| `packaging/make-exfat.sh` | Собирает образ exFAT, который устанавливает ShadowMount+ |
|
||||
| `.github/workflows/build.yml` | Процесс сборки |
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Как был восстановлен исходный код</b></summary>
|
||||
<br>
|
||||
|
||||
Overdrive — это приложение на React, работающее на [ps5-react](https://github.com/half144/ps5-react),
|
||||
и весь его JavaScript-бандл лежит открытым текстом внутри `eboot.bin`. Сборщик объединяет все модули
|
||||
в одну область видимости, поэтому импорты между модулями превращаются в простые имена; поскольку
|
||||
каждое имя верхнего уровня остаётся уникальным, можно снова определить, какой модуль объявляет это
|
||||
имя. Так бандл удалось разбить обратно на его 137 исходных модулей с настоящими строками
|
||||
`import`/`export`, сверяя результат с оригинальным бандлом, пока не совпала каждая связь импорта.
|
||||
|
||||
То, что сборщик отбрасывает, вернуть не удалось: большинство комментариев, синтаксис JSX (теперь это
|
||||
вызовы вида `jsx(View, {…})`) и `const`/`let` (теперь `var`). На поведение приложения это никак не
|
||||
влияет.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Сборка</b></summary>
|
||||
<br>
|
||||
|
||||
Каждый push запускает сборку на `ubuntu-24.04` с clang 18 и загружает `Overdrive.exfat` как артефакт
|
||||
workflow; тег `v*` дополнительно публикует релиз с `Overdrive.exfat` и `update.zip`.
|
||||
|
||||
Та же сборка локально, на любом Linux с пакетами, которые устанавливает workflow (`clang-18`,
|
||||
`llvm-18`, `cmake`, `ninja-build`, `nodejs`, `npm`, `zlib1g-dev`, `build-essential`,
|
||||
`pkg-config`, `unzip`, `curl`, `exfatprogs`, а также Pillow из `ps5-react/requirements.txt`):
|
||||
|
||||
```sh
|
||||
cd ps5-react
|
||||
python3 tools/build_ps5.py --app-dir ../app --llvm /usr/bin
|
||||
sudo ../packaging/make-exfat.sh dist/PPSA99058 ../Overdrive.exfat
|
||||
```
|
||||
|
||||
При сборке закреплённые зависимости скачиваются в `ps5-react/.deps`, а папка приложения, `.zip` и
|
||||
`.receipt.json` записываются в `ps5-react/dist`. Результат проверяется автоматически
|
||||
(`tools/verify.py`), поэтому успешная сборка означает, что структура payload и подписи в порядке.
|
||||
`--llvm /usr/bin` указывает на системный clang; по умолчанию в апстриме используется путь к LLVM
|
||||
из Homebrew, поскольку поддерживаемая среда разработки — macOS.
|
||||
|
||||
Образ — это обычный том exFAT, корнем которого является папка приложения, с кластерами 64 КиБ и
|
||||
меткой `OVERDRIVE`. Чтобы выпустить новую версию, поднимите версию в `app/version.js` и
|
||||
`app/app.json` и отправьте тег `v*`: установленные приложения предложат обновление при следующем
|
||||
запуске.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Исправления относительно оригинального ps5-react</b></summary>
|
||||
<br>
|
||||
|
||||
Два исправления во встроенном фреймворке, оба в инструментах сборки и оба обнаружены при сборке на
|
||||
Linux:
|
||||
|
||||
- `ps5-react/tools/common.py` читал строку `git apply --summary` с фиксированным числом пробелов,
|
||||
из-за чего режим файла приклеивался к пути (`100644 <путь>`) и любая чистая выгрузка зависимости
|
||||
падала на первом же патче, создающем файл. Теперь строка разбивается по пробельным символам.
|
||||
- `ps5-react/tools/build_ps5.py` открывал `data.tar.zst` из закреплённого пакета LLVM через
|
||||
`tarfile`, а тот читает zstd только начиная с Python 3.14, тогда как документированный минимум —
|
||||
3.12. Теперь есть откат на команду `zstd`.
|
||||
|
||||
Больше во фреймворке ничего не изменено.
|
||||
|
||||
</details>
|
||||
|
||||
## Благодарности
|
||||
|
||||
- **[MyLuxy](https://github.com/MyLuxy)** — декомпилировал Overdrive, восстановил его исходный код и собрал заново.
|
||||
- **[ps5-react](https://github.com/half144/ps5-react)** — фреймворк, на котором всё работает.
|
||||
- **[ShadowMount+](https://github.com/drakmor/ShadowMountPlus)** от drakmor — устанавливает приложение.
|
||||
|
||||
`ps5-react/` распространяется под GPL-3.0-or-later и содержит собственные `LICENSE`,
|
||||
`LICENSE-ATTRIBUTION` и `NOTICE`. Все уведомления о зависимостях копируются в `notices/` внутри
|
||||
собранного приложения, а `ps5-react/docs/DEPENDENCIES.md` перечисляет их с указанием источников.
|
||||
|
||||
<sub>Overdrive — неофициальный homebrew-проект, не связанный с Sony Interactive Entertainment и не
|
||||
одобренный ею. PlayStation и PS5 — товарные знаки Sony Interactive Entertainment.</sub>
|
||||
|
||||
<sub>Русский перевод сделан в [форке Stintik-123](https://github.com/Stintik-123/Overdrive).</sub>
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
"titleId": "PPSA99058",
|
||||
"contentId": "UP9000-PPSA99058_00-OVERDRIVE0000000",
|
||||
"name": "Overdrive",
|
||||
"version": "01.002.000",
|
||||
"version": "01.003.000",
|
||||
"render": { "width": 1920, "height": 1080 },
|
||||
"surface": { "width": 1920, "height": 1080 },
|
||||
"refreshRate": 60,
|
||||
|
||||
+1
-1
@@ -110,7 +110,7 @@
|
||||
{ "id": "PPSA02484", "title": "Nioh Remastered The Complete Edition", "platform": "ps5", "providers": ["buzzheavier", "datanodes", "datavaults", "filekeeper", "mediafire", "vikingfile"], "direct": true, "developer": "KOEI TECMO GAMES CO., LTD.", "publisher": "KOEI TECMO GAMES CO., LTD.", "releaseDate": "2017-11-07", "year": 2017, "genres": ["Action", "Role Playing Games"], "features": ["Single-player", "Online multiplayer", "Co-op", "Cloud saves"], "metacritic": 84, "recommendations": 29676, "sizeGb": 74.356, "art": { "cover": "https://image.api.playstation.com/vulcan/ap/rnd/202011/0514/EGffra35ulXCwGK6VjlsmEMP.png?w=384&thumb=false", "coverFallbacks": ["https://cdn.cloudflare.steamstatic.com/steam/apps/485510/library_600x900.jpg"], "tint": "#66523c", "hero": "https://cdn.cloudflare.steamstatic.com/steam/apps/485510/library_hero.jpg", "logo": "https://cdn.cloudflare.steamstatic.com/steam/apps/485510/logo.png", "logoAspect": 1.373 }, "work": 40 },
|
||||
{ "id": "PPSA14404", "title": "METAL GEAR SOLID 3: Snake Eater \u2013 Master Collection", "platform": "ps5", "providers": ["1fichier", "buzzheavier", "datanodes", "datavaults", "filekeeper", "gofile", "mediafire", "vikingfile"], "direct": true, "developer": "KONAMI", "publisher": "KONAMI", "releaseDate": "2023-10-24", "year": 2023, "genres": ["Action"], "features": ["Single-player"], "recommendations": 5476, "sizeGb": 15.348, "art": { "cover": "https://image.api.playstation.com/vulcan/ap/rnd/202310/1313/f1d35dfa393b81cde32ec36b4c26fc2f27d005c975f32578.png?w=384&thumb=false", "coverFallbacks": ["https://cdn.cloudflare.steamstatic.com/steam/apps/2131650/library_600x900.jpg"], "tint": "#8f9777", "hero": "https://cdn.cloudflare.steamstatic.com/steam/apps/2131650/library_hero.jpg", "logo": "https://cdn.cloudflare.steamstatic.com/steam/apps/2131650/logo.png", "logoAspect": 1.778, "logoDark": true } },
|
||||
{ "id": "PPSA10249", "title": "VIEWFINDER", "platform": "ps5", "providers": ["1fichier", "buzzheavier", "datanodes", "datavaults", "filekeeper", "mediafire", "vikingfile"], "direct": true, "developer": "Sad Owl Studios", "publisher": "Thunderful Publishing", "releaseDate": "2023-07-18", "year": 2023, "genres": ["Adventure"], "features": ["Single-player"], "metacritic": 84, "recommendations": 12126, "sizeGb": 14.991, "art": { "cover": "https://image.api.playstation.com/vulcan/ap/rnd/202507/1711/19e6a1c5304b7a4fa3c03eaa726cad6c336b124359cf590a.png?w=384&thumb=false", "coverFallbacks": ["https://cdn.cloudflare.steamstatic.com/steam/apps/1382070/library_600x900.jpg", "https://archive.org/download/ps4-fpkg-collection-english-icons/CUSA36827.png"], "tint": "#5f7984", "hero": "https://cdn.cloudflare.steamstatic.com/steam/apps/1382070/library_hero.jpg", "logo": "https://cdn.cloudflare.steamstatic.com/steam/apps/1382070/logo.png", "logoAspect": 1.778 }, "work": 41 },
|
||||
{ "id": "PPSA20800", "title": "Metaphor ReFantazio", "platform": "ps5", "providers": ["1fichier", "buzzheavier", "datanodes", "datavaults", "filekeeper", "mediafire", "vikingfile"], "direct": true, "developer": "ATLUS", "publisher": "SEGA", "releaseDate": "2024-10-10", "year": 2024, "genres": ["Role Playing Games"], "features": ["Single-player", "DualSense features", "Cloud saves"], "metacritic": 92, "recommendations": 25425, "sizeGb": 71.483, "art": { "cover": "https://image.api.playstation.com/vulcan/ap/rnd/202404/2608/d08c4e27d5bef8721c62ece6cc74be5037b6423c727e454b.png?w=384&thumb=false", "coverFallbacks": ["https://image.api.playstation.com/vulcan/ap/rnd/202512/1100/a36cb300b6e41b5b1b816c6043a15caf3aed2e375f5e6966.png?w=384&thumb=false", "https://image.api.playstation.com/vulcan/ap/rnd/202405/2406/672cc5f97e84c564649093d4f6a3726f328e0de1814ab2e0.png?w=384&thumb=false", "https://cdn.cloudflare.steamstatic.com/steam/apps/2679460/library_600x900.jpg"], "tint": "#51585e", "hero": "https://cdn.cloudflare.steamstatic.com/steam/apps/2679460/library_hero.jpg", "logo": "https://cdn.cloudflare.steamstatic.com/steam/apps/2679460/logo.png", "logoAspect": 1.778, "logoDark": true } },
|
||||
{ "id": "PPSA20800", "title": "Metaphor ReFantazio", "platform": "ps5", "providers": ["1fichier", "buzzheavier", "datanodes", "datavaults", "filekeeper", "vikingfile"], "direct": true, "developer": "ATLUS", "publisher": "SEGA", "releaseDate": "2024-10-10", "year": 2024, "genres": ["Role Playing Games"], "features": ["Single-player", "DualSense features", "Cloud saves"], "metacritic": 92, "recommendations": 25425, "sizeGb": 71.483, "art": { "cover": "https://image.api.playstation.com/vulcan/ap/rnd/202404/2608/d08c4e27d5bef8721c62ece6cc74be5037b6423c727e454b.png?w=384&thumb=false", "coverFallbacks": ["https://image.api.playstation.com/vulcan/ap/rnd/202512/1100/a36cb300b6e41b5b1b816c6043a15caf3aed2e375f5e6966.png?w=384&thumb=false", "https://image.api.playstation.com/vulcan/ap/rnd/202405/2406/672cc5f97e84c564649093d4f6a3726f328e0de1814ab2e0.png?w=384&thumb=false", "https://cdn.cloudflare.steamstatic.com/steam/apps/2679460/library_600x900.jpg"], "tint": "#51585e", "hero": "https://cdn.cloudflare.steamstatic.com/steam/apps/2679460/library_hero.jpg", "logo": "https://cdn.cloudflare.steamstatic.com/steam/apps/2679460/logo.png", "logoAspect": 1.778, "logoDark": true } },
|
||||
{ "id": "PPSA14396", "title": "METAL GEAR SOLID 2: Sons of Liberty \u2013 Master Collection", "platform": "ps5", "providers": ["1fichier", "buzzheavier", "datanodes", "datavaults", "filekeeper", "gofile", "mediafire", "vikingfile"], "direct": true, "developer": "KONAMI", "publisher": "KONAMI", "releaseDate": "2023-10-24", "year": 2023, "genres": ["Action"], "features": ["Single-player"], "recommendations": 3601, "sizeGb": 11.468, "art": { "cover": "https://image.api.playstation.com/vulcan/ap/rnd/202310/1013/60a3367159f2b8c636677da1b7c07f7c9159b1e4edac4517.png?w=384&thumb=false", "coverFallbacks": ["https://cdn.cloudflare.steamstatic.com/steam/apps/2131640/library_600x900.jpg"], "tint": "#c3c6c2", "hero": "https://cdn.cloudflare.steamstatic.com/steam/apps/2131640/library_hero.jpg", "logo": "https://cdn.cloudflare.steamstatic.com/steam/apps/2131640/logo.png", "logoAspect": 1.778, "logoDark": true } },
|
||||
{ "id": "PPSA13427", "title": "Horizon Zero Dawn Remastered", "platform": "ps5", "providers": ["1fichier", "datanodes", "datavaults", "filekeeper", "urlvanish", "vikingfile"], "direct": true, "developer": "Guerrilla Games", "publisher": "PlayStation Publishing LLC", "releaseDate": "2024-10-31", "year": 2024, "genres": ["Role Playing Games", "Action"], "features": ["Single-player", "DualSense features", "Cloud saves"], "recommendations": 6944, "sizeGb": 135.024, "art": { "cover": "https://cdn.cloudflare.steamstatic.com/steam/apps/2561580/library_600x900.jpg", "coverFallbacks": ["https://image.api.playstation.com/vulcan/ap/rnd/202409/2716/16b33fa9a5c7285ba86a035b4a1c5f8eb430b407eae35ffd.png?w=384&thumb=false", "https://image.api.playstation.com/vulcan/ap/rnd/202010/0221/vC7trMorHJgbImp8PCQvpI0p.png?w=384&thumb=false", "https://cover.spectrumlibrary.online/COVER/PPSA13427.png"], "tint": "#8b90b0", "hero": "https://cdn.cloudflare.steamstatic.com/steam/apps/2561580/library_hero.jpg", "logo": "https://cdn.cloudflare.steamstatic.com/steam/apps/2561580/logo.png", "logoAspect": 1.778 }, "work": 42, "region": "EUR" },
|
||||
{ "id": "PPSA07382", "title": "Flintlock The Siege of Dawn", "platform": "ps5", "providers": ["1fichier", "buzzheavier", "datanodes", "datavaults", "filekeeper", "gofile", "mediafire", "vikingfile"], "direct": true, "developer": "A44 Games", "publisher": "Kepler Interactive", "releaseDate": "2024-07-17", "year": 2024, "genres": ["Action", "Role Playing Games", "Adventure"], "features": ["Single-player", "DualSense features", "Cloud saves"], "recommendations": 1370, "sizeGb": 24.584, "art": { "cover": "https://image.api.playstation.com/vulcan/ap/rnd/202406/2009/6832b0713642518db72cf6f6187756d2854a1b537c380e80.png?w=384&thumb=false", "coverFallbacks": ["https://image.api.playstation.com/vulcan/ap/rnd/202405/1513/71e3d103bc17be588cbff6cf08cbd3914ff4f4ffcd490d3f.png?w=384&thumb=false", "https://cdn.cloudflare.steamstatic.com/steam/apps/1832040/library_600x900.jpg"], "tint": "#736f72", "hero": "https://cdn.cloudflare.steamstatic.com/steam/apps/1832040/library_hero.jpg", "logo": "https://cdn.cloudflare.steamstatic.com/steam/apps/1832040/logo.png", "logoAspect": 1.767 } },
|
||||
|
||||
@@ -1 +1 @@
|
||||
[{"id":"r806d5463d107","format":"ffpfsc","filename":"PPSA20800 Metaphor ReFantazio.ffpfsc","url":"https://archive.org/download/PPSA20800-Metaphor-ReFantazio/PPSA20800%20Metaphor%20ReFantazio.ffpfsc","requiresBrowser":false,"sizeBytes":47972220928,"version":"","category":"game","provider":"Archive.org","source":"orbit","flow":"direct","label":"","record":"orbit-19","health":"ok","unavailableReason":"Source unavailable: HTTP 401. Choose another source."},{"id":"rf0ec322e32c6","format":"binary","filename":"PPSA20800-game-unknown-rf0ec322e32c6.binary","url":"https://buzzheavier.com/m9ynp7ok2p5f","browserUrl":"https://buzzheavier.com/m9ynp7ok2p5f","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"Buzzheavier","source":"pegasus-0","flow":"buzzheavier","label":"USA 8.xx Base - Buzzheavier part 1","volume":"part 1","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"rf3a4632bbd82","format":"binary","filename":"PPSA20800-game-unknown-rf3a4632bbd82.binary","url":"https://buzzheavier.com/5lhocbnj0siv","browserUrl":"https://buzzheavier.com/5lhocbnj0siv","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"Buzzheavier","source":"pegasus-0","flow":"buzzheavier","label":"USA 8.xx Base - Buzzheavier part 2","volume":"part 2","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"r133adf740782","format":"binary","filename":"PPSA20800-game-unknown-r133adf740782.binary","url":"https://buzzheavier.com/ds3lh8cmfx3b","browserUrl":"https://buzzheavier.com/ds3lh8cmfx3b","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"Buzzheavier","source":"pegasus-0","flow":"buzzheavier","label":"USA 8.xx Base - Buzzheavier part 3","volume":"part 3","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"r1a55e1970e76","format":"binary","filename":"PPSA20800-game-unknown-r1a55e1970e76.binary","url":"https://buzzheavier.com/kxx4bwavhi3u","browserUrl":"https://buzzheavier.com/kxx4bwavhi3u","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"Buzzheavier","source":"pegasus-0","flow":"buzzheavier","label":"USA 8.xx Base - Buzzheavier part 4","volume":"part 4","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"rc1ee2f65c843","format":"binary","filename":"PPSA20800-game-unknown-rc1ee2f65c843.binary","url":"https://buzzheavier.com/5eg41ipiejkt","browserUrl":"https://buzzheavier.com/5eg41ipiejkt","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"Buzzheavier","source":"pegasus-0","flow":"buzzheavier","label":"USA 8.xx Base - Buzzheavier part 5","volume":"part 5","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"r86f956049e6c","format":"binary","filename":"PPSA20800-game-unknown-r86f956049e6c.binary","url":"https://buzzheavier.com/i168unn1ohq5","browserUrl":"https://buzzheavier.com/i168unn1ohq5","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"Buzzheavier","source":"pegasus-0","flow":"buzzheavier","label":"USA 8.xx Base - Buzzheavier part 6","volume":"part 6","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"r628e341fc7c7","format":"binary","filename":"PPSA20800-game-unknown-r628e341fc7c7.binary","url":"https://buzzheavier.com/ubuavfaczy4j","browserUrl":"https://buzzheavier.com/ubuavfaczy4j","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"Buzzheavier","source":"pegasus-0","flow":"buzzheavier","label":"USA 8.xx Base - Buzzheavier part 7","volume":"part 7","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"r08e5f02357d5","format":"binary","filename":"PPSA20800-game-unknown-r08e5f02357d5.binary","url":"https://buzzheavier.com/iuxi6cde6u06","browserUrl":"https://buzzheavier.com/iuxi6cde6u06","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"Buzzheavier","source":"pegasus-0","flow":"buzzheavier","label":"USA 8.xx Base - Buzzheavier part 8","volume":"part 8","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"r69f40d1b050f","format":"binary","filename":"PPSA20800-game-unknown-r69f40d1b050f.binary","url":"https://www.mediafire.com/file/xfqrpzrcari2pk2/[DLPSGAME.COM]-PPSA20800.part1.rar/file","browserUrl":"https://www.mediafire.com/file/xfqrpzrcari2pk2/[DLPSGAME.COM]-PPSA20800.part1.rar/file","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"MediaFire","source":"pegasus-0","flow":"mediafire","label":"USA 8.xx Base - Mediafire part 1","volume":"part 1","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"rea147be013e1","format":"binary","filename":"PPSA20800-game-unknown-rea147be013e1.binary","url":"https://www.mediafire.com/file/a95ijaqnfg5p3g9/[DLPSGAME.COM]-PPSA20800.part2.rar/file","browserUrl":"https://www.mediafire.com/file/a95ijaqnfg5p3g9/[DLPSGAME.COM]-PPSA20800.part2.rar/file","requiresBrowser":true,"sizeBytes":null,"version":"","category":"gamLine truncated
|
||||
[{"id":"r806d5463d107","format":"ffpfsc","filename":"PPSA20800 Metaphor ReFantazio.ffpfsc","url":"https://archive.org/download/PPSA20800-Metaphor-ReFantazio/PPSA20800%20Metaphor%20ReFantazio.ffpfsc","requiresBrowser":false,"sizeBytes":47972220928,"version":"","category":"game","provider":"Archive.org","source":"orbit","flow":"direct","label":"","record":"orbit-19","health":"ok","unavailableReason":"Source unavailable: HTTP 401. Choose another source."},{"id":"rf0ec322e32c6","format":"binary","filename":"PPSA20800-game-unknown-rf0ec322e32c6.binary","url":"https://buzzheavier.com/m9ynp7ok2p5f","browserUrl":"https://buzzheavier.com/m9ynp7ok2p5f","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"Buzzheavier","source":"pegasus-0","flow":"buzzheavier","label":"USA 8.xx Base - Buzzheavier part 1","volume":"part 1","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"rf3a4632bbd82","format":"binary","filename":"PPSA20800-game-unknown-rf3a4632bbd82.binary","url":"https://buzzheavier.com/5lhocbnj0siv","browserUrl":"https://buzzheavier.com/5lhocbnj0siv","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"Buzzheavier","source":"pegasus-0","flow":"buzzheavier","label":"USA 8.xx Base - Buzzheavier part 2","volume":"part 2","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"r133adf740782","format":"binary","filename":"PPSA20800-game-unknown-r133adf740782.binary","url":"https://buzzheavier.com/ds3lh8cmfx3b","browserUrl":"https://buzzheavier.com/ds3lh8cmfx3b","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"Buzzheavier","source":"pegasus-0","flow":"buzzheavier","label":"USA 8.xx Base - Buzzheavier part 3","volume":"part 3","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"r1a55e1970e76","format":"binary","filename":"PPSA20800-game-unknown-r1a55e1970e76.binary","url":"https://buzzheavier.com/kxx4bwavhi3u","browserUrl":"https://buzzheavier.com/kxx4bwavhi3u","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"Buzzheavier","source":"pegasus-0","flow":"buzzheavier","label":"USA 8.xx Base - Buzzheavier part 4","volume":"part 4","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"rc1ee2f65c843","format":"binary","filename":"PPSA20800-game-unknown-rc1ee2f65c843.binary","url":"https://buzzheavier.com/5eg41ipiejkt","browserUrl":"https://buzzheavier.com/5eg41ipiejkt","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"Buzzheavier","source":"pegasus-0","flow":"buzzheavier","label":"USA 8.xx Base - Buzzheavier part 5","volume":"part 5","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"r86f956049e6c","format":"binary","filename":"PPSA20800-game-unknown-r86f956049e6c.binary","url":"https://buzzheavier.com/i168unn1ohq5","browserUrl":"https://buzzheavier.com/i168unn1ohq5","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"Buzzheavier","source":"pegasus-0","flow":"buzzheavier","label":"USA 8.xx Base - Buzzheavier part 6","volume":"part 6","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"r628e341fc7c7","format":"binary","filename":"PPSA20800-game-unknown-r628e341fc7c7.binary","url":"https://buzzheavier.com/ubuavfaczy4j","browserUrl":"https://buzzheavier.com/ubuavfaczy4j","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"Buzzheavier","source":"pegasus-0","flow":"buzzheavier","label":"USA 8.xx Base - Buzzheavier part 7","volume":"part 7","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"r08e5f02357d5","format":"binary","filename":"PPSA20800-game-unknown-r08e5f02357d5.binary","url":"https://buzzheavier.com/iuxi6cde6u06","browserUrl":"https://buzzheavier.com/iuxi6cde6u06","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"Buzzheavier","source":"pegasus-0","flow":"buzzheavier","label":"USA 8.xx Base - Buzzheavier part 8","volume":"part 8","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"r60bd63dc4751","format":"binary","filename":"PPSA20800-game-unknown-r60bd63dc4751.binary","url":"https://buzzheavier.com/p6swerx5etln","browserUrl":"https://buzzheavier.com/p6swerx5etln","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"Buzzheavier","source":"pegasus-0","flow":"buzzheavier","label":"USA 8.xx Base - Buzzheavier part 9","volume":"part 9","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"r1f226708a6dc","format":"binary","filename":"PPSA20800-game-unknown-r1f226708a6dc.binary","url":"https://vikingfile.com/f/qFEE5wXXzU","browserUrl":"https://vikingfile.com/f/qFEE5wXXzU","requiresBrowser":true,"sizeBytes":null,"version":"","category":"game","provider":"VikingFile","source":"pegasus-0","flow":"vikingfile","label":"USA 8.xx DLC (@Pkykzhack) - Vikingfile","archivePassword":"DLPSGAME.COM","record":"pegasus-0-394"},{"id":"r2885d3b2d28bLine truncated
|
||||
@@ -9,6 +9,7 @@ import { formatNumber2 } from '../i18n/core.js';
|
||||
import { useT } from '../i18n/index.js';
|
||||
import { downloadQueue, driveName, storageRoots } from '../state/downloads.js';
|
||||
import { formatBytes } from '../state/size.js';
|
||||
import { useSpeedLimit } from '../state/speed-limit.js';
|
||||
import { ProgressBar } from '../ui/ProgressBar.jsx';
|
||||
import { FileSystem, ScrollView, Text, View } from '@ps5-react/core';
|
||||
|
||||
@@ -38,6 +39,7 @@ import { FileSystem, ScrollView, Text, View } from '@ps5-react/core';
|
||||
function Activity({ onFocus }) {
|
||||
const t2 = useT();
|
||||
const { active: active2, speed, left, connections, peak, low, mean } = useActivity();
|
||||
const limit = useSpeedLimit();
|
||||
return /* @__PURE__ */ (0, jsx)(Block, { title: t2("downloads.panel.activity"), children: /* @__PURE__ */ (0, jsxs)(View, { focusable: true, focusKey: PANEL_KEY, onFocus, style: (_state) => [{ gap: 18, borderRadius: 12, padding: 12 }, _state.focused ? { backgroundColor: "#212125" } : null], children: [
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 45, fontWeight: 600, color: "#f2f2f3", lineHeight: 54, letterSpacing: -1.13 }, children: active2 ? formatSpeed(speed) : t2("downloads.panel.idle") }),
|
||||
/* @__PURE__ */ (0, jsxs)(View, { style: { gap: 9 }, children: [
|
||||
@@ -52,7 +54,9 @@ import { FileSystem, ScrollView, Text, View } from '@ps5-react/core';
|
||||
/* @__PURE__ */ (0, jsx)(Figure, { label: t2("downloads.panel.peak"), value: peak ? formatSpeed(peak) : "\u2014" }),
|
||||
/* @__PURE__ */ (0, jsx)(Figure, { label: t2("downloads.panel.low"), value: low ? formatSpeed(low) : "\u2014" }),
|
||||
/* @__PURE__ */ (0, jsx)(Figure, { label: t2("downloads.panel.average"), value: mean ? formatSpeed(mean) : "\u2014" }),
|
||||
/* @__PURE__ */ (0, jsx)(Figure, { label: t2("downloads.panel.connections"), value: connections ? formatNumber2(connections) : "\u2014" })
|
||||
/* @__PURE__ */ (0, jsx)(Figure, { label: t2("downloads.panel.connections"), value: connections ? formatNumber2(connections) : "\u2014" }),
|
||||
// Why a download goes no faster: the cap chosen in Settings (issue #15).
|
||||
/* @__PURE__ */ (0, jsx)(Figure, { label: t2("settings.speedLimit"), value: limit ? t2("units.speed", { n: String(limit) }) : t2("settings.speedUnlimited") })
|
||||
] }),
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: [{ fontFamily: "Inter-Regular", fontSize: 21, color: "#8a8a94", lineHeight: 30 }, INNER], children: awake() ? t2("downloads.panel.awake") : " " })
|
||||
] }) });
|
||||
|
||||
@@ -18,6 +18,8 @@ import { t } from '../i18n/core.js';
|
||||
// The engine's heap had no room for the extraction; a fresh launch frees it.
|
||||
[/not enough memory to extract/i, "noMemory", "reopenApp"],
|
||||
[/archive password/i, "archivePassword", "otherSource"],
|
||||
[/not a game file/i, "notGameFile", "otherSource"],
|
||||
[/fake PKGs install only/i, "pkgFirmware", "otherSource"],
|
||||
// A set's last volume ends where the archive goes on, or its first is not where it starts: the source lists
|
||||
// too few volumes, and downloading them again fails the same way. A lone archive the worker cannot open
|
||||
// fails with the same words; that one is downloaded again.
|
||||
|
||||
@@ -67,9 +67,13 @@ import { DownloadFormats, Text, View, motion } from '@ps5-react/core';
|
||||
const lacking = download.status === "idle" && need && free[storage] !== null && free[storage] < need + MARGIN2;
|
||||
const stale = ["paused", "failed"].includes(download.status) && STALE_PARTIAL.test(cause(error2));
|
||||
const status = lacking ? "no-space" : stale ? "stale" : download.status;
|
||||
// A new download first shows what the chosen source is and how to use it (DownloadTipsDialog);
|
||||
// resuming, installing or pausing one already queued goes straight on.
|
||||
const begin = () => {
|
||||
if (stale) restart();
|
||||
else if (!lacking) download.advance();
|
||||
else if (lacking) return;
|
||||
else if (status === "idle" && release) onRequestDialog({ kind: "tips", game, release, submit: () => download.advance(), changeSource: () => chooseSource() });
|
||||
else download.advance();
|
||||
};
|
||||
const { openEdition, focusLater, push } = useNavActions();
|
||||
const editions = editionsOf(game);
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
// Shown before a new download starts: what the chosen source is, what to watch for with it, and
|
||||
// tips for choosing one behind a dropdown, so the provider's browser page opens only once the player
|
||||
// has read it and pressed Continue.
|
||||
|
||||
import '../assets/Inter-Regular.ttf';
|
||||
import { Fragment, jsx, jsxs } from 'react/jsx-runtime';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { describeSource, isDlc, requiredFirmware } from './sources.js';
|
||||
import { useT } from '../i18n/index.js';
|
||||
import { sourceKind } from '../state/download-sources.js';
|
||||
import { isPs5Package } from '../state/firmware.js';
|
||||
import { useNavActions } from '../state/nav.jsx';
|
||||
import { isPatchOnly } from '../state/release-sets.js';
|
||||
import { Button2 } from '../ui/Button.jsx';
|
||||
import { Cover } from '../ui/Cover.jsx';
|
||||
import { FocusRing } from '../ui/FocusRing.jsx';
|
||||
import { Icon } from '../ui/Icon.jsx';
|
||||
import { colors } from '../ui/colors.js';
|
||||
import { FocusScope, Text, View, useIsFocused } from '@ps5-react/core';
|
||||
|
||||
var LABEL = { fontFamily: "Inter-Regular", fontSize: 19, fontWeight: 600, color: colors.muted, letterSpacing: 1.5 };
|
||||
var BODY = { fontFamily: "Inter-Regular", fontSize: 22, color: colors.muted, lineHeight: 31 };
|
||||
var TINT = { warn: [colors.warn, "#fde68a1f"], info: [colors.info, "#a5f3fc1a"] };
|
||||
var TIPS = ["firmware", "fullGame", "top", "retry"];
|
||||
// Text wraps only at a set width here, never at flex: the dialog's 1200 px inside, less a note's
|
||||
// 44 px badge and its gap, or half of it (less the 44 px column gap) for a tip.
|
||||
var NOTE_TEXT = 1200 - 44 - 18;
|
||||
var TIP_WIDTH = (1200 - 44) / 2;
|
||||
var TIP_TEXT = TIP_WIDTH - 9 - 16;
|
||||
// The notes that apply to this source, most important first. The firmware comes from its label,
|
||||
// never from the console, which can be told a raised version.
|
||||
function notesFor(release) {
|
||||
const notes = [];
|
||||
if (isDlc(release)) notes.push({ tone: "warn", icon: "package", key: "dlc" });
|
||||
if (isPatchOnly(release)) notes.push({ tone: "warn", icon: "fileMinus", key: "patch" });
|
||||
if (isPs5Package(release)) notes.push({ tone: "warn", icon: "alert", key: "package" });
|
||||
let kind = "direct";
|
||||
try {
|
||||
kind = sourceKind(release.parts?.[0]?.sources[0] ?? release);
|
||||
} catch {
|
||||
}
|
||||
if (kind === "vikingfile") notes.push({ tone: "info", icon: "globe", key: "browserViking" });
|
||||
else if (kind === "browser" || kind === "datanodes") notes.push({ tone: "info", icon: "globe", key: "browserOther" });
|
||||
const need = requiredFirmware(release);
|
||||
if (need !== null && !isDlc(release)) notes.push({ tone: "info", icon: "cpu", key: "firmware", values: { need: `${need}.xx` } });
|
||||
return notes;
|
||||
}
|
||||
function Note({ tone, icon, text }) {
|
||||
const [ink, wash] = TINT[tone];
|
||||
return /* @__PURE__ */ (0, jsxs)(View, { style: { flexDirection: "row", alignItems: "flex-start", gap: 18 }, children: [
|
||||
/* @__PURE__ */ (0, jsx)(View, { style: { width: 44, height: 44, borderRadius: 12, alignItems: "center", justifyContent: "center", backgroundColor: wash }, children: /* @__PURE__ */ (0, jsx)(Icon, { name: icon, size: 24, color: ink }) }),
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: [BODY, { width: NOTE_TEXT, paddingTop: 6 }], children: text })
|
||||
] });
|
||||
}
|
||||
function Tip({ title, body }) {
|
||||
// The title on its own line and the line under it: short, and wrapping cleanly in any language.
|
||||
return /* @__PURE__ */ (0, jsxs)(View, { style: { width: TIP_WIDTH, flexDirection: "row", alignItems: "flex-start", gap: 16 }, children: [
|
||||
/* @__PURE__ */ (0, jsx)(View, { style: { width: 9, height: 9, borderRadius: 5, marginTop: 12, backgroundColor: colors.muted } }),
|
||||
/* @__PURE__ */ (0, jsxs)(View, { style: { gap: 2 }, children: [
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: [BODY, { width: TIP_TEXT, fontWeight: 600, color: colors.fg }], children: title }),
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: [BODY, { width: TIP_TEXT }], children: body })
|
||||
] })
|
||||
] });
|
||||
}
|
||||
function ToggleFace({ open }) {
|
||||
const t2 = useT();
|
||||
const focused = useIsFocused();
|
||||
return /* @__PURE__ */ (0, jsxs)(Fragment, { children: [
|
||||
/* @__PURE__ */ (0, jsx)(FocusRing, {}),
|
||||
/* @__PURE__ */ (0, jsx)(View, { style: { width: 44, height: 44, borderRadius: 12, alignItems: "center", justifyContent: "center", backgroundColor: colors.surface2 }, children: /* @__PURE__ */ (0, jsx)(Icon, { name: "lightbulb", size: 24, color: colors.fg }) }),
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: { flex: 1, fontFamily: "Inter-Regular", fontSize: 23, fontWeight: 600, color: colors.fg }, children: t2("tips.toggle") }),
|
||||
/* @__PURE__ */ (0, jsx)(Icon, { name: open ? "chevronUp" : "chevronDown", size: 26, color: focused ? colors.fg : colors.muted })
|
||||
] });
|
||||
}
|
||||
function DownloadTipsDialog({ game, release, submit, changeSource, onClose }) {
|
||||
const t2 = useT();
|
||||
const [open, setOpen] = (0, useState)(false);
|
||||
const { focusLater } = useNavActions();
|
||||
// The page moves focus with focusLater, retried until it lands: one still pending (back to the
|
||||
// Download button, from a sheet that just closed) took focus off this dialog on the console.
|
||||
// A newer request replaces it, so asking here is what makes the tips row win.
|
||||
(0, useEffect)(() => {
|
||||
focusLater("tips:toggle");
|
||||
}, []);
|
||||
const { name, detail: detail2, size } = describeSource(release);
|
||||
const notes = notesFor(release);
|
||||
const proceed = () => {
|
||||
onClose();
|
||||
submit();
|
||||
};
|
||||
// The source list replaces this dialog in place, as the options sheet's "next" items do: closing
|
||||
// first would send focus back to the Download button underneath.
|
||||
const pick = () => {
|
||||
changeSource();
|
||||
};
|
||||
const cancel = () => {
|
||||
onClose();
|
||||
return true;
|
||||
};
|
||||
return (
|
||||
// A modal like the update dialog: the page underneath takes no input until it closes.
|
||||
/* @__PURE__ */ (0, jsx)(FocusScope, { trap: true, autoFocus: true, onBack: cancel, onAction: () => true, children: /* @__PURE__ */ (0, jsx)(View, { style: { position: "absolute", top: 0, right: 0, bottom: 0, left: 0, zIndex: 50, alignItems: "center", justifyContent: "center", backgroundColor: "#000000d9" }, children: /* @__PURE__ */ (0, jsxs)(View, { style: { width: 1320, gap: 26, borderRadius: 24, borderWidth: 2, borderColor: colors.line, backgroundColor: colors.surface, paddingHorizontal: 60, paddingTop: 44, paddingBottom: 40 }, children: [
|
||||
/* @__PURE__ */ (0, jsxs)(View, { style: { gap: 6 }, children: [
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 19, fontWeight: 600, color: colors.subtle, letterSpacing: 3 }, children: t2("tips.eyebrow").toLocaleUpperCase() }),
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 44, fontWeight: 600, color: colors.fg, letterSpacing: -1.1, lineHeight: 52 }, children: t2("tips.title") })
|
||||
] }),
|
||||
/* @__PURE__ */ (0, jsxs)(View, { style: { gap: 14 }, children: [
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: LABEL, children: t2("tips.downloading").toLocaleUpperCase() }),
|
||||
/* @__PURE__ */ (0, jsxs)(View, { style: { flexDirection: "row", alignItems: "center", gap: 24, borderRadius: 16, backgroundColor: colors.surface2, paddingHorizontal: 22, paddingVertical: 18 }, children: [
|
||||
/* @__PURE__ */ (0, jsx)(Cover, { game, label: false, style: { width: 78, height: 78, borderRadius: 10, overflow: "hidden" } }),
|
||||
/* @__PURE__ */ (0, jsxs)(View, { style: { flex: 1, gap: 4 }, children: [
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 26, fontWeight: 600, color: colors.fg, numberOfLines: 1, ellipsizeMode: "tail" }, children: game.title }),
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 21, color: colors.muted, numberOfLines: 1, ellipsizeMode: "tail" }, children: [detail2, name].filter(Boolean).join(" \xB7 ") })
|
||||
] }),
|
||||
size ? /* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 22, color: colors.fg }, children: size }) : null
|
||||
] })
|
||||
] }),
|
||||
notes.length ? /* @__PURE__ */ (0, jsxs)(View, { style: { gap: 14 }, children: [
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: LABEL, children: t2("tips.about").toLocaleUpperCase() }),
|
||||
/* @__PURE__ */ (0, jsx)(View, { style: { gap: 12 }, children: notes.map((note) => /* @__PURE__ */ (0, jsx)(Note, { tone: note.tone, icon: note.icon, text: t2(`tips.note.${note.key}`, note.values) }, note.key)) })
|
||||
] }) : null,
|
||||
/* @__PURE__ */ (0, jsxs)(View, { style: { gap: 14 }, children: [
|
||||
// Closed at first, so the dialog stays short; anyone can open it again any time.
|
||||
/* @__PURE__ */ (0, jsx)(View, { focusKey: "tips:toggle", nextFocusDown: "tips:continue", onPress: () => setOpen(!open), style: (_state) => [{ position: "relative", flexDirection: "row", alignItems: "center", gap: 18, borderRadius: 14, marginHorizontal: -16, paddingHorizontal: 16, paddingVertical: 12 }, _state.focused ? { backgroundColor: colors.surface2 } : null], children: /* @__PURE__ */ (0, jsx)(ToggleFace, { open }) }),
|
||||
open ? /* @__PURE__ */ (0, jsx)(View, { style: { flexDirection: "row", flexWrap: "wrap", rowGap: 16, columnGap: 44 }, children: TIPS.map((key) => /* @__PURE__ */ (0, jsx)(Tip, { title: t2(`tips.tip.${key}.title`), body: t2(`tips.tip.${key}.body`) }, key)) }) : null
|
||||
] }),
|
||||
/* @__PURE__ */ (0, jsxs)(View, { style: { flexDirection: "row", alignItems: "center", gap: 18, borderTopWidth: 2, borderColor: colors.line, paddingTop: 26 }, children: [
|
||||
/* @__PURE__ */ (0, jsx)(Button2, { variant: "primary", size: "lg", icon: "download", label: t2("tips.continue"), halo: false, focusKey: "tips:continue", onPress: proceed }),
|
||||
/* @__PURE__ */ (0, jsx)(Button2, { variant: "secondary", size: "lg", icon: "layers", label: t2("tips.changeSource"), focusKey: "tips:source", onPress: pick })
|
||||
] })
|
||||
] }) }) })
|
||||
);
|
||||
}
|
||||
|
||||
export { DownloadTipsDialog };
|
||||
+18
-7
@@ -1,27 +1,38 @@
|
||||
// ../pub-game-store/native/game/GameFacts.jsx
|
||||
// reconstructed from the esbuild bundle in eboot.bin
|
||||
// MODIFIED: the fact labels stay in English; Title ID and the minimum firmware are added.
|
||||
|
||||
import '../assets/Inter-Regular.ttf';
|
||||
import { jsx, jsxs } from 'react/jsx-runtime';
|
||||
import { preferredRelease } from './sources.js';
|
||||
import { preferredRelease, requiredFirmware } from './sources.js';
|
||||
import { useT } from '../i18n/index.js';
|
||||
import en from '../i18n/locales/en.json';
|
||||
import { formatDate3 } from '../state/catalog.js';
|
||||
import { formatBytes, formatSize } from '../state/size.js';
|
||||
import { PlatformBadge } from '../ui/PlatformBadge.jsx';
|
||||
import { Text, View } from '@ps5-react/core';
|
||||
|
||||
// A label gets 144 px beside its 264 px value, and every translation but English runs longer
|
||||
// (“Dimensione del download” is 253 px), pushing the value out of the panel. The labels stay
|
||||
// in English, the shortest; the title and the values (dates, sizes) follow the language.
|
||||
var label = (key) => en[key];
|
||||
function GameFacts({ game }) {
|
||||
const t2 = useT();
|
||||
const releases = game.releases || [];
|
||||
const bytes = releases[preferredRelease(releases)]?.sizeBytes;
|
||||
const size = bytes ? [t2("game.facts.downloadSize"), formatBytes(bytes)] : [t2("game.facts.installSize"), game.sizeGb ? formatSize(game.sizeGb) : "\u2014"];
|
||||
const preferred = releases[preferredRelease(releases)];
|
||||
const bytes = preferred?.sizeBytes;
|
||||
// The firmware the recommended source needs (issue #13); shown only where its label names one.
|
||||
const firmware = preferred ? requiredFirmware(preferred) : null;
|
||||
const size = bytes ? [label("game.facts.downloadSize"), formatBytes(bytes)] : [label("game.facts.installSize"), game.sizeGb ? formatSize(game.sizeGb) : "\u2014"];
|
||||
const platform = /* @__PURE__ */ (0, jsx)(PlatformBadge, { platforms: game.platforms });
|
||||
const rows = [
|
||||
[t2("game.facts.platform"), platform],
|
||||
[t2("game.facts.publisher"), game.publisher || "\u2014"],
|
||||
[t2("game.facts.releaseDate"), formatDate3(game.releaseDate)],
|
||||
[label("game.facts.platform"), platform],
|
||||
[label("game.facts.titleId"), game.id],
|
||||
[label("game.facts.publisher"), game.publisher || "\u2014"],
|
||||
[label("game.facts.releaseDate"), formatDate3(game.releaseDate)],
|
||||
firmware === null ? null : [label("game.facts.firmware"), `${firmware}.xx`],
|
||||
size
|
||||
];
|
||||
].filter(Boolean);
|
||||
return /* @__PURE__ */ (0, jsxs)(View, { style: { width: 432 }, children: [
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 30, fontWeight: 600, color: "#f2f2f3", lineHeight: 42, letterSpacing: -0.75 }, children: t2("game.details") }),
|
||||
/* @__PURE__ */ (0, jsx)(View, { style: { marginTop: 24, borderBottomWidth: 2, borderColor: "#2a2a2f" }, children: rows.map(
|
||||
|
||||
@@ -20,7 +20,17 @@ import { Text, View, useIsFocused } from '@ps5-react/core';
|
||||
browser: { title: "sources.section.browser", icon: "external" },
|
||||
dlc: { title: "sources.section.dlc", icon: "download", note: "sources.section.dlcNote" }
|
||||
};
|
||||
function RowFace({ icon, name, detail: detail2, size, recommended, current, cdn }) {
|
||||
// Whether the source suits this console: a tinted icon and words, readable without the colour.
|
||||
function StatusLine({ status }) {
|
||||
// A DLC is neither: a neutral note, not a pass or a warning.
|
||||
const tint = status.tone === "ok" ? colors.ok : status.tone === "info" ? colors.muted : colors.warn;
|
||||
const icon = status.tone === "ok" ? "circleCheck" : status.tone === "info" ? "package" : "alert";
|
||||
return /* @__PURE__ */ (0, jsxs)(View, { style: { flexDirection: "row", alignItems: "center", gap: 9 }, children: [
|
||||
/* @__PURE__ */ (0, jsx)(Icon, { name: icon, size: 18, color: tint }),
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: { width: 423, fontFamily: "Inter-Regular", fontSize: 20, color: tint, numberOfLines: 1, ellipsizeMode: "tail", lineHeight: 28 }, children: status.text })
|
||||
] });
|
||||
}
|
||||
function RowFace({ icon, name, detail: detail2, size, recommended, current, cdn, status }) {
|
||||
const t2 = useT();
|
||||
const focused = useIsFocused();
|
||||
const ink2 = focused ? colors.fg : colors.muted;
|
||||
@@ -33,7 +43,8 @@ import { Text, View, useIsFocused } from '@ps5-react/core';
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 23, fontWeight: 600, color: "#f2f2f3" }, children: name }),
|
||||
recommended ? /* @__PURE__ */ (0, jsx)(View, { style: { borderRadius: 3, backgroundColor: "#f2f2f3", paddingHorizontal: 9, paddingVertical: 2 }, children: /* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 18, fontWeight: 600, color: "#000000", lineHeight: 24 }, children: t2("sources.recommended") }) }) : null
|
||||
] }),
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: [{ width: 450, fontFamily: "Inter-Regular", fontSize: 21, numberOfLines: 2, ellipsizeMode: "tail", lineHeight: 30 }, { color: ink2 }], children: detail2 || t2("sources.noDetails") })
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: [{ width: 450, fontFamily: "Inter-Regular", fontSize: 21, numberOfLines: 2, ellipsizeMode: "tail", lineHeight: 30 }, { color: ink2 }], children: detail2 || t2("sources.noDetails") }),
|
||||
status ? /* @__PURE__ */ (0, jsx)(StatusLine, { status }) : null
|
||||
] }),
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: [{ width: 108, fontFamily: "Inter-Regular", fontSize: 21, textAlign: "end", lineHeight: 30 }, { color: ink2 }], children: size ?? "" }),
|
||||
/* @__PURE__ */ (0, jsx)(View, { style: { width: 27, alignItems: "flex-end" }, children: current ? /* @__PURE__ */ (0, jsx)(Icon, { name: "check", size: 18, color: colors.fg }) : null })
|
||||
@@ -48,7 +59,7 @@ import { Text, View, useIsFocused } from '@ps5-react/core';
|
||||
note ? /* @__PURE__ */ (0, jsx)(Text, { style: { width: 660, fontFamily: "Inter-Regular", fontSize: 21, color: "#8a8a94", numberOfLines: 2, ellipsizeMode: "tail", lineHeight: 30 }, children: t2(note) }) : null
|
||||
] }),
|
||||
items.map(({ release, index }, row) => {
|
||||
const { name, detail: detail2, size } = describeSource(release);
|
||||
const { name, detail: detail2, size, status } = describeSource(release);
|
||||
return /* @__PURE__ */ (0, jsx)(View, { autoFocus: index === selected || revealed && row === 0, onPress: () => onPick(index), style: (_state) => [{ position: "relative", minHeight: 84, flexDirection: "row", alignItems: "center", gap: 18, borderRadius: 12, paddingHorizontal: 18, paddingVertical: 12 }, _state.focused ? { backgroundColor: "#212125" } : null], children: /* @__PURE__ */ (0, jsx)(
|
||||
RowFace,
|
||||
{
|
||||
@@ -56,6 +67,7 @@ import { Text, View, useIsFocused } from '@ps5-react/core';
|
||||
name,
|
||||
detail: detail2,
|
||||
size,
|
||||
status,
|
||||
cdn: isOverdriveCdn(release.provider),
|
||||
recommended: index === recommended && group !== "browser",
|
||||
current: index === selected
|
||||
|
||||
+2
-1
@@ -6,6 +6,7 @@ import { jsx, jsxs } from 'react/jsx-runtime';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { BrowserCaptureDialog } from '../downloads/BrowserCaptureDialog.jsx';
|
||||
import { URLDialog } from '../downloads/URLDialog.jsx';
|
||||
import { DownloadTipsDialog } from './DownloadTipsDialog.jsx';
|
||||
import { About } from './About.jsx';
|
||||
import { GameFacts } from './GameFacts.jsx';
|
||||
import { GameHero } from './GameHero.jsx';
|
||||
@@ -50,7 +51,7 @@ import { AnimatePresence, FocusScope, ScrollView, Text, View } from '@ps5-react/
|
||||
const [toast, setToast] = (0, useState)(null);
|
||||
const [viewing, setViewing] = (0, useState)(null);
|
||||
const { focusLater } = useNavActions();
|
||||
const Dialog = { source: SourcePicker, options: OptionsSheet, version: VersionSheet }[dialog?.kind] ?? URLDialog;
|
||||
const Dialog = { source: SourcePicker, options: OptionsSheet, version: VersionSheet, tips: DownloadTipsDialog }[dialog?.kind] ?? URLDialog;
|
||||
const related = relatedGames(game);
|
||||
const about = game.about.filter((text) => text.trim());
|
||||
(0, useEffect)(() => {
|
||||
|
||||
+28
-5
@@ -3,6 +3,8 @@
|
||||
|
||||
import { t } from '../i18n/core.js';
|
||||
import { sourceKind } from '../state/download-sources.js';
|
||||
import { isPs5Package } from '../state/firmware.js';
|
||||
import { isPatchOnly } from '../state/release-sets.js';
|
||||
import { formatBytes } from '../state/size.js';
|
||||
|
||||
var KIND = {
|
||||
@@ -33,6 +35,24 @@ import { formatBytes } from '../state/size.js';
|
||||
if (kind === "direct" || kind === "manifest") return "direct";
|
||||
return kind === "browser" || kind === "datanodes" || kind === "unavailable" || GATED.has(kind) ? "browser" : "page";
|
||||
}
|
||||
// The firmware a source needs, from its label ("USA 10.xx Base", "10.xx BackPort 4.xx"): a backport
|
||||
// runs from the lowest firmware it names, anything else needs the highest. Null when it names none.
|
||||
function requiredFirmware(release) {
|
||||
const named = [...(release.label || "").matchAll(/\b(\d{1,2})\.xx\b/gi)].map((match) => Number(match[1]));
|
||||
if (!named.length) return null;
|
||||
return isBackport(release) ? Math.min(...named) : Math.max(...named);
|
||||
}
|
||||
// A line under the source for what it is beyond a game image (issue #13). Nothing reads the
|
||||
// console's firmware here: the jailbreak can raise what the title is told (13.59 on a 13.20
|
||||
// console), so a "works on your firmware" verdict could be wrong either way. The firmware a source
|
||||
// needs is shown where the player checks it themselves (game details, the download tips).
|
||||
function compatibility(release) {
|
||||
if (isPatchOnly(release)) return { tone: "warn", text: t("sources.status.patch") };
|
||||
// A PS5 PKG's firmware limit outweighs its being a DLC: the source list has room for one line.
|
||||
if (isPs5Package(release)) return { tone: "warn", text: t("sources.status.package") };
|
||||
if (isDlc(release)) return { tone: "info", text: t("sources.status.dlc") };
|
||||
return null;
|
||||
}
|
||||
var SPEED = { "archive.org": "sources.speed.archive", mediafire: "sources.speed.mediafire", "overdrive cdn": "sources.cdnFastest" };
|
||||
var isOverdriveCdn = (provider) => /^overdrive\s*cdn$/i.test(provider ?? "");
|
||||
function describeSource(release) {
|
||||
@@ -40,7 +60,7 @@ import { formatBytes } from '../state/size.js';
|
||||
const detail2 = [
|
||||
edition(release),
|
||||
release.version ? `v${release.version.replace(/^v/i, "")}` : null,
|
||||
KIND[release.format] && t(KIND[release.format]),
|
||||
isPatchOnly(release) ? t("sources.kind.patch") : KIND[release.format] && t(KIND[release.format]),
|
||||
parts ? t("sources.parts", { count: parts }) : null
|
||||
].filter(Boolean).join(" \xB7 ");
|
||||
const reach = access(release);
|
||||
@@ -50,7 +70,8 @@ import { formatBytes } from '../state/size.js';
|
||||
detail: speed ? [detail2, t(speed)].filter(Boolean).join(" \xB7 ") : detail2,
|
||||
size: release.sizeBytes ? formatBytes(release.sizeBytes) : null,
|
||||
group: release.unavailableReason ? "unavailable" : reach,
|
||||
reason: release.unavailableReason ?? null
|
||||
reason: release.unavailableReason ?? null,
|
||||
status: release.unavailableReason ? null : compatibility(release)
|
||||
};
|
||||
}
|
||||
var version = (value) => {
|
||||
@@ -63,7 +84,7 @@ import { formatBytes } from '../state/size.js';
|
||||
var recordOf = (release) => (release.parts?.[0].sources[0] ?? release).record;
|
||||
var sameFormat = (a, b) => a.format === b.format || a.format === "binary" || b.format === "binary";
|
||||
function equivalent(a, b) {
|
||||
if (Boolean(a.parts) !== Boolean(b.parts) || a.parts?.length !== b.parts?.length || isDlc(a) !== isDlc(b)) return false;
|
||||
if (Boolean(a.parts) !== Boolean(b.parts) || a.parts?.length !== b.parts?.length || isDlc(a) !== isDlc(b) || isPatchOnly(a) !== isPatchOnly(b)) return false;
|
||||
if (a.sha256 && b.sha256) return a.sha256 === b.sha256;
|
||||
const [ea, eb] = [edition(a).toLowerCase(), edition(b).toLowerCase()];
|
||||
if (ea && eb && ea !== eb) return false;
|
||||
@@ -80,6 +101,8 @@ import { formatBytes } from '../state/size.js';
|
||||
var ranked = (release, index) => ({ release, index, rank: [
|
||||
isDlc(release) ? 1 : 0,
|
||||
release.unavailableReason ? 1 : 0,
|
||||
isPatchOnly(release) ? 1 : 0,
|
||||
isPs5Package(release) ? 1 : 0,
|
||||
hostRank(release),
|
||||
GROUP_RANK[describeSource(release).group],
|
||||
HEALTH_RANK[release.health] ?? 1,
|
||||
@@ -92,7 +115,7 @@ import { formatBytes } from '../state/size.js';
|
||||
return releases.map(ranked).sort(compare)[0]?.index ?? 0;
|
||||
}
|
||||
function fallbacks(releases, selected) {
|
||||
return releases.map(ranked).filter(({ release, index, rank }) => index !== selected && rank[3] <= GROUP_RANK.page && equivalent(releases[selected], release)).sort(compare).map(({ release }) => release);
|
||||
return releases.map(ranked).filter(({ release, index }) => index !== selected && GROUP_RANK[describeSource(release).group] <= GROUP_RANK.page && equivalent(releases[selected], release)).sort(compare).map(({ release }) => release);
|
||||
}
|
||||
function sourceSections(releases) {
|
||||
const sections = ["direct", "page", "browser", "dlc", "unavailable"].map((group) => ({ group, items: [] }));
|
||||
@@ -106,4 +129,4 @@ import { formatBytes } from '../state/size.js';
|
||||
return sections.filter((section) => section.items.length);
|
||||
}
|
||||
|
||||
export { describeSource, fallbacks, isOverdriveCdn, preferredRelease, sourceSections };
|
||||
export { describeSource, fallbacks, isDlc, isOverdriveCdn, preferredRelease, requiredFirmware, sourceSections };
|
||||
+12
-1
@@ -150,7 +150,18 @@
|
||||
percent: "{n}%",
|
||||
date: "{y}\u5E74{M}\u6708{d}\u65E5",
|
||||
list: ["\u3001", "\u3001", "\u3001"]
|
||||
}
|
||||
},
|
||||
{
|
||||
code: "fa",
|
||||
name: "فارسی",
|
||||
rtl: true,
|
||||
group: ",",
|
||||
decimal: ".",
|
||||
percent: "{n}%",
|
||||
date: "{y}/{M}/{d}",
|
||||
months: ["ژانویه", "فوریه", "مارس", "آوریل", "مه", "ژوئن", "ژوئیه", "اوت", "سپتامبر", "اکتبر", "نوامبر", "دسامبر"],
|
||||
list: ["، ", " و ", " و "]
|
||||
},
|
||||
];
|
||||
var byCode = new Map(LOCALES.map((locale2) => [locale2.code, locale2]));
|
||||
var localeData = (code) => byCode.get(code) ?? byCode.get(SOURCE_LOCALE);
|
||||
|
||||
@@ -172,6 +172,8 @@
|
||||
"errors.fileChanged": "تغير الملف على الخادم",
|
||||
"errors.interrupted": "توقف عند إغلاق التطبيق",
|
||||
"errors.linkGone": "رابط التحميل لم يعد يعمل",
|
||||
"errors.notGameFile": "أرسل المضيف صفحة ويب بدلاً من اللعبة",
|
||||
"errors.pkgFirmware": "لا تُثبَّت حزم PKG المزيفة لـ PS5 إلا حتى البرنامج الثابت 11.60",
|
||||
"errors.missingParts": "هذا المصدر تنقصه أجزاء",
|
||||
"errors.needsBrowser": "هذا المصدر يحتاج متصفح ويب",
|
||||
"errors.noConnection": "لا يوجد اتصال بالخادم",
|
||||
@@ -317,6 +319,7 @@
|
||||
"language.name.de": "الألمانية",
|
||||
"language.name.en": "الإنجليزية",
|
||||
"language.name.es": "الإسبانية",
|
||||
"language.name.fa": "الفارسية",
|
||||
"language.name.fr": "الفرنسية",
|
||||
"language.name.hi": "الهندية",
|
||||
"language.name.id": "الإندونيسية",
|
||||
@@ -343,6 +346,10 @@
|
||||
"search.resultsFor": "النتائج لـ \"{query}\"",
|
||||
"search.tryGenre": "تحقق من الإملاء، أو جرب فئة:",
|
||||
"settings.controller": "وحدة التحكم",
|
||||
"settings.downloads": "التنزيلات",
|
||||
"settings.speedLimit": "حد السرعة",
|
||||
"settings.speedLimitDetail": "يترك سعة للأجهزة الأخرى. لا تُقيَّد تحديثات التطبيق أبدًا.",
|
||||
"settings.speedUnlimited": "غير محدود",
|
||||
"settings.title": "الإعدادات",
|
||||
"settings.vibration": "الاهتزاز أثناء التصفح",
|
||||
"settings.vibrationDetail": "نبضة خفيفة عند التنقل والاختيار والرجوع",
|
||||
@@ -359,6 +366,10 @@
|
||||
"sources.kind.archive": "أرشيف",
|
||||
"sources.kind.image": "صورة اللعبة",
|
||||
"sources.kind.package": "حزمة",
|
||||
"sources.kind.patch": "ملفات الباك بورت فقط، وليست اللعبة كاملة",
|
||||
"sources.status.dlc": "محتوى إضافي: يحتاج اللعبة الأساسية",
|
||||
"sources.status.package": "لا تُثبَّت حزم PKG المزيفة لـ PS5 إلا حتى البرنامج الثابت 11.60",
|
||||
"sources.status.patch": "تحتاج اللعبة الأساسية، ولا تُثبَّت وحدها",
|
||||
"sources.noDetails": "لا توجد تفاصيل",
|
||||
"sources.parts": "{count, plural, zero {لا أجزاء} one {# جزء} two {# جزءان} few {# أجزاء} many {# جزء} other {# جزء}}",
|
||||
"sources.recommended": "موصى به",
|
||||
@@ -378,6 +389,27 @@
|
||||
"time.seconds": "{n} ثانية",
|
||||
"toast.openDownloads": "افتح التحميلات",
|
||||
"toast.viewGame": "عرض اللعبة",
|
||||
"tips.eyebrow": "التنزيل",
|
||||
"tips.title": "قبل التنزيل",
|
||||
"tips.downloading": "أنت تنزّل",
|
||||
"tips.about": "حول هذا المصدر",
|
||||
"tips.toggle": "نصائح لاختيار المصدر",
|
||||
"tips.continue": "متابعة",
|
||||
"tips.changeSource": "تغيير المصدر",
|
||||
"tips.note.dlc": "هذا محتوى إضافي وليس اللعبة. ثبّت اللعبة الأساسية أولًا.",
|
||||
"tips.note.patch": "هذه ملفات باك بورت فقط وليست اللعبة كاملة. لا تُثبَّت وحدها.",
|
||||
"tips.note.package": "هذه حزمة PKG مزيفة لـ PS5. لا تُثبَّت إلا على البرنامج الثابت 11.60 أو أقدم.",
|
||||
"tips.note.browserViking": "يُفتح هذا المصدر في متصفح PS5. أكمل التحقق ثم انتظر. لا تضغط Download ولا أي إعلان.",
|
||||
"tips.note.browserOther": "يُفتح هذا المصدر في متصفح PS5 ثم يطلب رابط الملف. إن أمكن، اختر مصدرًا أعلى في القائمة.",
|
||||
"tips.note.firmware": "يتطلب هذا الإصدار البرنامج الثابت {need} أو أحدث. تحقق من إصدارك في الإعدادات > النظام > برنامج النظام.",
|
||||
"tips.tip.firmware.title": "تحقق من البرنامج الثابت",
|
||||
"tips.tip.firmware.body": "Base 8.xx يتطلب 8.xx أو أحدث. BackPort للأجهزة الأقدم.",
|
||||
"tips.tip.fullGame.title": "اختر اللعبة الكاملة",
|
||||
"tips.tip.fullGame.body": "Base أو BackPort، لا محتوى إضافيًا ولا ملفات باك بورت.",
|
||||
"tips.tip.top.title": "ابدأ من الأعلى",
|
||||
"tips.tip.top.body": "المصادر الأولى هي الأفضل.",
|
||||
"tips.tip.retry.title": "فشل؟ جرّب مصدرًا آخر",
|
||||
"tips.tip.retry.body": "لمعظم الألعاب عدة مصادر.",
|
||||
"units.gigabytes": "{n} GB",
|
||||
"units.megabytes": "{n} MB",
|
||||
"units.millions": "{n}M",
|
||||
|
||||
@@ -172,6 +172,8 @@
|
||||
"errors.fileChanged": "ফাইল সার্ভারে পরিবর্তিত হয়েছে",
|
||||
"errors.interrupted": "অ্যাপ বন্ধ হওয়ার সময় থেমেছিল",
|
||||
"errors.linkGone": "ডাউনলোড লিঙ্ক আর কাজ করে না",
|
||||
"errors.notGameFile": "হোস্ট গেমের বদলে একটি ওয়েব পেজ পাঠিয়েছে",
|
||||
"errors.pkgFirmware": "PS5-এর ফেক PKG শুধু ফার্মওয়্যার 11.60 পর্যন্ত ইনস্টল হয়",
|
||||
"errors.missingParts": "এই উৎসে কিছু অংশ নেই",
|
||||
"errors.needsBrowser": "এই উৎসের একটি ওয়েব ব্রাউজার প্রয়োজন",
|
||||
"errors.noConnection": "সার্ভারের সাথে কোনো সংযোগ নেই",
|
||||
@@ -317,6 +319,7 @@
|
||||
"language.name.de": "জার্মান",
|
||||
"language.name.en": "ইংরেজি",
|
||||
"language.name.es": "স্প্যানিশ",
|
||||
"language.name.fa": "ফারসি",
|
||||
"language.name.fr": "ফ্রেঞ্চ",
|
||||
"language.name.hi": "হিন্দি",
|
||||
"language.name.id": "ইন্দোনেশিয়ান",
|
||||
@@ -343,6 +346,10 @@
|
||||
"search.resultsFor": "'{query}' এর জন্য ফলাফল",
|
||||
"search.tryGenre": "বানান পরীক্ষা করুন, বা একটি ঘরানা চেষ্টা করুন:",
|
||||
"settings.controller": "কন্ট্রোলার",
|
||||
"settings.downloads": "ডাউনলোড",
|
||||
"settings.speedLimit": "গতির সীমা",
|
||||
"settings.speedLimitDetail": "অন্য ডিভাইসের জন্য ব্যান্ডউইথ রাখে। অ্যাপ আপডেট কখনো সীমিত হয় না।",
|
||||
"settings.speedUnlimited": "সীমাহীন",
|
||||
"settings.title": "সেটিংস",
|
||||
"settings.vibration": "ব্রাউজ করার সময় কম্পন",
|
||||
"settings.vibrationDetail": "সরানো, বেছে নেওয়া ও ফিরে যাওয়ার সময় হালকা কম্পন",
|
||||
@@ -359,6 +366,10 @@
|
||||
"sources.kind.archive": "সংরক্ষণাগার",
|
||||
"sources.kind.image": "গেম ইমেজ",
|
||||
"sources.kind.package": "প্যাকেজ",
|
||||
"sources.kind.patch": "শুধু ব্যাকপোর্ট ফাইল, পুরো গেম নয়",
|
||||
"sources.status.dlc": "DLC: বেস গেম লাগবে",
|
||||
"sources.status.package": "PS5-এর ফেক PKG শুধু ফার্মওয়্যার 11.60 পর্যন্ত ইনস্টল হয়",
|
||||
"sources.status.patch": "বেস গেম লাগবে, একা ইনস্টল হবে না",
|
||||
"sources.noDetails": "কোনো বিবরণ নেই",
|
||||
"sources.parts": "{count, plural, one {# অংশ} other {# অংশ}}",
|
||||
"sources.recommended": "সুপারিশকৃত",
|
||||
@@ -378,6 +389,27 @@
|
||||
"time.seconds": "{n} সেকেন্ড",
|
||||
"toast.openDownloads": "ডাউনলোড খুলুন",
|
||||
"toast.viewGame": "গেম দেখুন",
|
||||
"tips.eyebrow": "ডাউনলোড",
|
||||
"tips.title": "ডাউনলোডের আগে",
|
||||
"tips.downloading": "আপনি ডাউনলোড করছেন",
|
||||
"tips.about": "এই সোর্স সম্পর্কে",
|
||||
"tips.toggle": "সোর্স বাছাইয়ের টিপস",
|
||||
"tips.continue": "চালিয়ে যান",
|
||||
"tips.changeSource": "সোর্স বদলান",
|
||||
"tips.note.dlc": "এটি DLC, গেম নয়। আগে বেস গেম ইনস্টল করুন।",
|
||||
"tips.note.patch": "এগুলো শুধু ব্যাকপোর্ট ফাইল, পুরো গেম নয়। একা ইনস্টল হয় না।",
|
||||
"tips.note.package": "এটি PS5-এর ফেক PKG। শুধু ফার্মওয়্যার 11.60 বা তার আগের সংস্করণে ইনস্টল হয়।",
|
||||
"tips.note.browserViking": "এই সোর্স PS5 ব্রাউজারে খোলে। যাচাই শেষ করে অপেক্ষা করুন। Download বা কোনো বিজ্ঞাপনে চাপবেন না।",
|
||||
"tips.note.browserOther": "এই সোর্স PS5 ব্রাউজারে খোলে, তারপর ফাইলের লিংক চায়। পারলে তালিকার ওপরের সোর্স বেছে নিন।",
|
||||
"tips.note.firmware": "এই সংস্করণে ফার্মওয়্যার {need} বা নতুন লাগবে। আপনারটি সেটিংস > সিস্টেম > সিস্টেম সফটওয়্যারে দেখুন।",
|
||||
"tips.tip.firmware.title": "ফার্মওয়্যার দেখুন",
|
||||
"tips.tip.firmware.body": "Base 8.xx-এ 8.xx বা নতুন লাগে। BackPort পুরোনো কনসোলের জন্য।",
|
||||
"tips.tip.fullGame.title": "পুরো গেম নিন",
|
||||
"tips.tip.fullGame.body": "Base বা BackPort, DLC বা ব্যাকপোর্ট ফাইল নয়।",
|
||||
"tips.tip.top.title": "ওপর থেকে শুরু করুন",
|
||||
"tips.tip.top.body": "ওপরের সোর্সগুলো সবচেয়ে ভালো।",
|
||||
"tips.tip.retry.title": "ব্যর্থ? অন্য সোর্স",
|
||||
"tips.tip.retry.body": "বেশিরভাগ গেমের একাধিক সোর্স আছে।",
|
||||
"units.gigabytes": "{n} GB",
|
||||
"units.megabytes": "{n} MB",
|
||||
"units.millions": "{n}M",
|
||||
|
||||
@@ -172,6 +172,8 @@
|
||||
"errors.fileChanged": "Datei hat sich auf dem Server geändert",
|
||||
"errors.interrupted": "Gestoppt, als die App geschlossen wurde",
|
||||
"errors.linkGone": "Download-Link funktioniert nicht mehr",
|
||||
"errors.notGameFile": "Host hat Webseite statt Spiel gesendet",
|
||||
"errors.pkgFirmware": "PS5-Fake-PKGs nur bis Firmware 11.60",
|
||||
"errors.missingParts": "Dieser Quelle fehlen Teile",
|
||||
"errors.needsBrowser": "Diese Quelle benötigt einen Webbrowser",
|
||||
"errors.noConnection": "Keine Verbindung zum Server",
|
||||
@@ -317,6 +319,7 @@
|
||||
"language.name.de": "Deutsch",
|
||||
"language.name.en": "Englisch",
|
||||
"language.name.es": "Spanisch",
|
||||
"language.name.fa": "Persisch",
|
||||
"language.name.fr": "Französisch",
|
||||
"language.name.hi": "Hindi",
|
||||
"language.name.id": "Indonesisch",
|
||||
@@ -330,12 +333,12 @@
|
||||
"language.system": "Systemsprache",
|
||||
"language.title": "Sprache",
|
||||
"nav.allGames": "Alle Spiele",
|
||||
"nav.browse": "Durchsuchen",
|
||||
"nav.browse": "Stöbern",
|
||||
"nav.discover": "Entdecken",
|
||||
"nav.files": "Dateien",
|
||||
"nav.new": "Neue Veröffentlichungen",
|
||||
"nav.new": "Neuheiten",
|
||||
"nav.search": "Suche",
|
||||
"nav.top": "Top bewertet",
|
||||
"nav.top": "Bestenliste",
|
||||
"search.noMatch": "Keine Spiele für « {query} »",
|
||||
"search.placeholder": "Bibliothek durchsuchen",
|
||||
"search.popular": "Beliebt",
|
||||
@@ -343,14 +346,18 @@
|
||||
"search.resultsFor": "Ergebnisse für « {query} »",
|
||||
"search.tryGenre": "Überprüfen Sie die Schreibweise oder versuchen Sie ein Genre:",
|
||||
"settings.controller": "Controller",
|
||||
"settings.downloads": "Downloads",
|
||||
"settings.speedLimit": "Tempolimit",
|
||||
"settings.speedLimitDetail": "Lässt Bandbreite für andere Geräte. Updates sind nie begrenzt.",
|
||||
"settings.speedUnlimited": "Unbegrenzt",
|
||||
"settings.title": "Einstellungen",
|
||||
"settings.vibration": "Vibration beim Navigieren",
|
||||
"settings.vibrationDetail": "Ein leichter Impuls beim Bewegen, Auswählen und Zurückgehen",
|
||||
"settings.vibrationDetail": "Leichter Impuls beim Bewegen, Wählen und Zurück",
|
||||
"shadowMount.offAction": "Das Spiel erscheint, sobald du es lädst. Füge es zum Autoload deines Jailbreaks hinzu, damit es immer läuft.",
|
||||
"shadowMount.offTitle": "ShadowMount läuft nicht",
|
||||
"sort.label": "Sortieren",
|
||||
"sort.newest": "Neue Veröffentlichungen",
|
||||
"sort.rating": "Top bewertet",
|
||||
"sort.newest": "Neuheiten",
|
||||
"sort.rating": "Bestenliste",
|
||||
"sort.relevance": "Beliebteste",
|
||||
"sort.size": "Größte",
|
||||
"sort.title": "A–Z",
|
||||
@@ -359,6 +366,10 @@
|
||||
"sources.kind.archive": "Archiv",
|
||||
"sources.kind.image": "Spielimage",
|
||||
"sources.kind.package": "Paket",
|
||||
"sources.kind.patch": "Nur Backport-Dateien, kein Vollspiel",
|
||||
"sources.status.dlc": "DLC: braucht das Hauptspiel",
|
||||
"sources.status.package": "PS5-Fake-PKGs nur bis Firmware 11.60",
|
||||
"sources.status.patch": "Nur mit Hauptspiel installierbar",
|
||||
"sources.noDetails": "Keine Details",
|
||||
"sources.parts": "{count, plural, one {# Teil} other {# Teile}}",
|
||||
"sources.recommended": "Empfohlen",
|
||||
@@ -378,6 +389,27 @@
|
||||
"time.seconds": "{n} s",
|
||||
"toast.openDownloads": "Downloads öffnen",
|
||||
"toast.viewGame": "Spiel ansehen",
|
||||
"tips.eyebrow": "Download",
|
||||
"tips.title": "Vor dem Download",
|
||||
"tips.downloading": "Du lädst herunter",
|
||||
"tips.about": "Zu dieser Quelle",
|
||||
"tips.toggle": "Tipps zur Wahl der Quelle",
|
||||
"tips.continue": "Weiter",
|
||||
"tips.changeSource": "Quelle ändern",
|
||||
"tips.note.dlc": "Das ist ein DLC, kein Spiel. Installiere zuerst das Hauptspiel.",
|
||||
"tips.note.patch": "Nur Backport-Dateien, kein Vollspiel. Allein nicht installierbar.",
|
||||
"tips.note.package": "Das ist ein PS5-Fake-PKG. Nur bis Firmware 11.60 installierbar.",
|
||||
"tips.note.browserViking": "Öffnet sich im PS5-Browser. Verifizierung abschließen und warten. Weder Download noch Werbung drücken.",
|
||||
"tips.note.browserOther": "Öffnet sich im PS5-Browser und fragt dann nach dem Dateilink. Wähle besser eine Quelle weiter oben.",
|
||||
"tips.note.firmware": "Braucht Firmware {need} oder neuer. Prüfe deine unter Einstellungen > System > Systemsoftware.",
|
||||
"tips.tip.firmware.title": "Firmware prüfen",
|
||||
"tips.tip.firmware.body": "Base 8.xx braucht 8.xx+. BackPort ist für ältere Konsolen.",
|
||||
"tips.tip.fullGame.title": "Vollspiel nehmen",
|
||||
"tips.tip.fullGame.body": "Base oder BackPort, kein DLC, keine Backport-Dateien.",
|
||||
"tips.tip.top.title": "Oben anfangen",
|
||||
"tips.tip.top.body": "Die ersten Quellen sind am besten.",
|
||||
"tips.tip.retry.title": "Fehler? Andere Quelle",
|
||||
"tips.tip.retry.body": "Meist gibt es mehrere.",
|
||||
"units.gigabytes": "{n} GB",
|
||||
"units.megabytes": "{n} MB",
|
||||
"units.millions": "{n}M",
|
||||
|
||||
@@ -173,6 +173,8 @@
|
||||
"errors.fileChanged": "The file changed on the server",
|
||||
"errors.interrupted": "Stopped when the app closed",
|
||||
"errors.linkGone": "Download link no longer works",
|
||||
"errors.notGameFile": "The host sent a web page instead of the game",
|
||||
"errors.pkgFirmware": "PS5 fake PKGs only install on firmware 11.60 or older",
|
||||
"errors.missingParts": "This source is missing parts",
|
||||
"errors.needsBrowser": "This source needs a web browser",
|
||||
"errors.noConnection": "No connection to the server",
|
||||
@@ -249,10 +251,12 @@
|
||||
"game.back.search": "Search",
|
||||
"game.details": "Details",
|
||||
"game.facts.downloadSize": "Download size",
|
||||
"game.facts.firmware": "Min. firmware",
|
||||
"game.facts.installSize": "Install size",
|
||||
"game.facts.platform": "Platform",
|
||||
"game.facts.publisher": "Publisher",
|
||||
"game.facts.releaseDate": "Release date",
|
||||
"game.facts.titleId": "Title ID",
|
||||
"game.favorite": "Favorite",
|
||||
"game.features": "Features",
|
||||
"game.metacritic": "Metacritic",
|
||||
@@ -318,6 +322,7 @@
|
||||
"language.name.de": "German",
|
||||
"language.name.en": "English",
|
||||
"language.name.es": "Spanish",
|
||||
"language.name.fa": "Persian",
|
||||
"language.name.fr": "French",
|
||||
"language.name.hi": "Hindi",
|
||||
"language.name.id": "Indonesian",
|
||||
@@ -344,6 +349,10 @@
|
||||
"search.resultsFor": "Results for \u201C{query}\u201D",
|
||||
"search.tryGenre": "Check the spelling, or try a genre:",
|
||||
"settings.controller": "Controller",
|
||||
"settings.downloads": "Downloads",
|
||||
"settings.speedLimit": "Speed limit",
|
||||
"settings.speedLimitDetail": "Leaves bandwidth for other devices. App updates are never limited.",
|
||||
"settings.speedUnlimited": "Unlimited",
|
||||
"settings.title": "Settings",
|
||||
"settings.vibration": "Vibration while browsing",
|
||||
"settings.vibrationDetail": "A light pulse as you move, select and go back",
|
||||
@@ -360,6 +369,10 @@
|
||||
"sources.kind.archive": "Archive",
|
||||
"sources.kind.image": "Game image",
|
||||
"sources.kind.package": "Package",
|
||||
"sources.kind.patch": "Backport files only, not the full game",
|
||||
"sources.status.dlc": "DLC: needs the base game",
|
||||
"sources.status.package": "PS5 fake PKGs only install on firmware 11.60 or older",
|
||||
"sources.status.patch": "Needs the base game, won't install alone",
|
||||
"sources.noDetails": "No details",
|
||||
"sources.parts": "{count, plural, one {# part} other {# parts}}",
|
||||
"sources.recommended": "Recommended",
|
||||
@@ -379,6 +392,27 @@
|
||||
"time.seconds": "{n} s",
|
||||
"toast.openDownloads": "Open Downloads",
|
||||
"toast.viewGame": "View game",
|
||||
"tips.eyebrow": "Download",
|
||||
"tips.title": "Before you download",
|
||||
"tips.downloading": "You're downloading",
|
||||
"tips.about": "About this source",
|
||||
"tips.toggle": "Tips for choosing a source",
|
||||
"tips.continue": "Continue",
|
||||
"tips.changeSource": "Change source",
|
||||
"tips.note.dlc": "This is a DLC, not the game. Install the base game first.",
|
||||
"tips.note.patch": "These are backport files only, not the full game. They won't install on their own.",
|
||||
"tips.note.package": "This is a PS5 fake PKG. It only installs on firmware 11.60 or older.",
|
||||
"tips.note.browserViking": "This source opens in the PS5 browser. Complete the verification, then wait. Don't press Download or any ad.",
|
||||
"tips.note.browserOther": "This source opens in the PS5 browser and then asks for the file's link. If you can, pick a source higher in the list.",
|
||||
"tips.note.firmware": "This version needs firmware {need} or newer. Check yours in Settings > System > System Software.",
|
||||
"tips.tip.firmware.title": "Check the firmware",
|
||||
"tips.tip.firmware.body": "Base 8.xx needs 8.xx or newer. BackPort is for older consoles.",
|
||||
"tips.tip.fullGame.title": "Get the full game",
|
||||
"tips.tip.fullGame.body": "Base or BackPort, not DLC or backport files.",
|
||||
"tips.tip.top.title": "Start from the top",
|
||||
"tips.tip.top.body": "The first sources work best.",
|
||||
"tips.tip.retry.title": "Failed? Try another",
|
||||
"tips.tip.retry.body": "Most games have several sources.",
|
||||
"units.gigabytes": "{n} GB",
|
||||
"units.megabytes": "{n} MB",
|
||||
"units.millions": "{n}M",
|
||||
@@ -414,7 +448,7 @@
|
||||
"versions.title": "Choose version",
|
||||
"capture.title": "Vikingfile verification",
|
||||
"capture.preparing": "Preparing the file verification\u2026",
|
||||
"capture.capturing": "Complete verification and select Download",
|
||||
"capture.capturing": "Complete the verification, then wait",
|
||||
"capture.validating": "Checking the captured file\u2026",
|
||||
"capture.detail": "Return here after selecting Download. Your download starts automatically when the file is verified. Capture lasts up to 3 minutes."
|
||||
"capture.detail": "Don't press Download or any ad: the link is captured by itself. Then return here and the download starts automatically. Capture lasts up to 3 minutes."
|
||||
}
|
||||
@@ -172,6 +172,8 @@
|
||||
"errors.fileChanged": "El archivo cambió en el servidor",
|
||||
"errors.interrupted": "Detenido cuando la app se cerró",
|
||||
"errors.linkGone": "El enlace de descarga ya no funciona",
|
||||
"errors.notGameFile": "El servidor envió una página web en lugar del juego",
|
||||
"errors.pkgFirmware": "Los PKG falsos de PS5 solo se instalan hasta el firmware 11.60",
|
||||
"errors.missingParts": "A esta fuente le faltan partes",
|
||||
"errors.needsBrowser": "Esta fuente necesita un navegador web",
|
||||
"errors.noConnection": "Sin conexión al servidor",
|
||||
@@ -317,6 +319,7 @@
|
||||
"language.name.de": "Alemán",
|
||||
"language.name.en": "English",
|
||||
"language.name.es": "Español",
|
||||
"language.name.fa": "Persa",
|
||||
"language.name.fr": "Francés",
|
||||
"language.name.hi": "Hindi",
|
||||
"language.name.id": "Indonesio",
|
||||
@@ -343,6 +346,10 @@
|
||||
"search.resultsFor": "Resultados para “{query}”",
|
||||
"search.tryGenre": "Comprueba la ortografía o prueba un género:",
|
||||
"settings.controller": "Mando",
|
||||
"settings.downloads": "Descargas",
|
||||
"settings.speedLimit": "Límite de velocidad",
|
||||
"settings.speedLimitDetail": "Deja ancho de banda a otros dispositivos. Las actualizaciones de la app nunca se limitan.",
|
||||
"settings.speedUnlimited": "Sin límite",
|
||||
"settings.title": "Ajustes",
|
||||
"settings.vibration": "Vibración al navegar",
|
||||
"settings.vibrationDetail": "Un leve pulso al moverte, seleccionar y volver",
|
||||
@@ -359,6 +366,10 @@
|
||||
"sources.kind.archive": "Archivo",
|
||||
"sources.kind.image": "Imagen de juego",
|
||||
"sources.kind.package": "Paquete",
|
||||
"sources.kind.patch": "Solo archivos de backport, no el juego completo",
|
||||
"sources.status.dlc": "DLC: necesita el juego base",
|
||||
"sources.status.package": "Los PKG falsos de PS5 solo se instalan hasta el firmware 11.60",
|
||||
"sources.status.patch": "Necesita el juego base, no se instala sola",
|
||||
"sources.noDetails": "Sin detalles",
|
||||
"sources.parts": "{count, plural, one {# parte} many {# millones de partes} other {# partes}}",
|
||||
"sources.recommended": "Recomendado",
|
||||
@@ -378,6 +389,27 @@
|
||||
"time.seconds": "{n} s",
|
||||
"toast.openDownloads": "Abrir Descargas",
|
||||
"toast.viewGame": "Ver juego",
|
||||
"tips.eyebrow": "Descarga",
|
||||
"tips.title": "Antes de descargar",
|
||||
"tips.downloading": "Vas a descargar",
|
||||
"tips.about": "Sobre esta fuente",
|
||||
"tips.toggle": "Consejos para elegir la fuente",
|
||||
"tips.continue": "Continuar",
|
||||
"tips.changeSource": "Cambiar fuente",
|
||||
"tips.note.dlc": "Esto es un DLC, no el juego. Instala primero el juego base.",
|
||||
"tips.note.patch": "Son solo archivos de backport, no el juego completo. Solos no se instalan.",
|
||||
"tips.note.package": "Esto es un PKG falso de PS5. Solo se instala con firmware 11.60 o anterior.",
|
||||
"tips.note.browserViking": "Esta fuente se abre en el navegador de la PS5. Completa la verificación y espera. No pulses Descargar ni ningún anuncio.",
|
||||
"tips.note.browserOther": "Esta fuente se abre en el navegador de la PS5 y luego pide el enlace del archivo. Si puedes, elige una fuente más arriba.",
|
||||
"tips.note.firmware": "Esta versión requiere firmware {need} o posterior. Comprueba el tuyo en Ajustes > Sistema > Software del sistema.",
|
||||
"tips.tip.firmware.title": "Mira el firmware",
|
||||
"tips.tip.firmware.body": "Base 8.xx requiere 8.xx o más. BackPort es para consolas antiguas.",
|
||||
"tips.tip.fullGame.title": "Elige el juego completo",
|
||||
"tips.tip.fullGame.body": "Base o BackPort, no DLC ni archivos de backport.",
|
||||
"tips.tip.top.title": "Empieza por arriba",
|
||||
"tips.tip.top.body": "Las primeras fuentes funcionan mejor.",
|
||||
"tips.tip.retry.title": "¿Falla? Prueba otra",
|
||||
"tips.tip.retry.body": "Casi todos los juegos tienen varias.",
|
||||
"units.gigabytes": "{n} GB",
|
||||
"units.megabytes": "{n} MB",
|
||||
"units.millions": "{n}M",
|
||||
|
||||
@@ -0,0 +1,452 @@
|
||||
{
|
||||
"browse.addToFavorites": "افزودن به علاقهمندیها",
|
||||
"browse.continueDownloading": "ادامهٔ دانلود",
|
||||
"browse.continueFailed": "ناموفق · برای تلاش دوباره باز کنید",
|
||||
"browse.favorited": "علاقهمندی",
|
||||
"browse.folderInstall": "نصبهای پوشهای بهزودی دیگر بهروزرسانی نمیشوند. نسخهٔ تکفایلی را دستی نصب کنید",
|
||||
"browse.footer": "کتابخانهٔ Spectrum",
|
||||
"browse.popularGenres": "ژانرهای محبوب",
|
||||
"browse.popularNow": "محبوب الان",
|
||||
"browse.recentlyViewed": "اخیراً دیدهشده",
|
||||
"browse.reviews": "{count} نقد",
|
||||
"browse.viewGame": "مشاهدهٔ بازی",
|
||||
"catalog.empty.browseAll": "مرور کل کتابخانه",
|
||||
"catalog.empty.filtersHint": "یکی از فیلترهای بالا را بردارید یا بخش «فیلترها» را باز کنید و تغییر دهید.",
|
||||
"catalog.empty.filtersTitle": "هیچ بازی با این فیلترها پیدا نشد",
|
||||
"catalog.empty.queryHint": "املا را چک کنید، فیلتری را بردارید یا عنوان دیگری امتحان کنید.",
|
||||
"catalog.empty.queryTitle": "چیزی برای «{query}» پیدا نشد",
|
||||
"catalog.empty.wishlistHint": "یک بازی را باز کنید و «افزودن به علاقهمندیها» را بزنید تا اینجا بماند.",
|
||||
"catalog.empty.wishlistTitle": "هنوز علاقهمندی ندارید",
|
||||
"catalog.favorites": "علاقهمندیهای شما",
|
||||
"catalog.gameCount": "{count, plural, one {# بازی} other {# بازی}}",
|
||||
"catalog.library": "مرور کتابخانه",
|
||||
"catalog.resultsFor": "نتایج برای «{query}»",
|
||||
"common.seeAll": "مشاهدهٔ همه",
|
||||
"download.browser.action": "صفحه را باز کنید، تأیید را بگذرانید، سپس لینک فایل را پایین وارد کنید.",
|
||||
"download.browser.partTitle": "بخش {part} از {parts} به صفحهٔ میزبان نیاز دارد",
|
||||
"download.browser.title": "این میزبان اول به صفحهٔ وبش نیاز دارد",
|
||||
"download.button.awaiting-browser": "باز کردن صفحهٔ میزبان",
|
||||
"download.button.downloaded": "اسکن با ShadowMount",
|
||||
"download.button.extracted": "فایلها استخراج شدند",
|
||||
"download.button.extracting": "در حال استخراج",
|
||||
"download.button.extraction-required": "آرشیو دانلود شد",
|
||||
"download.button.failed": "تلاش دوباره",
|
||||
"download.button.file-downloaded": "فایل دانلود شد",
|
||||
"download.button.finishing": "در حال اتمام",
|
||||
"download.button.idle": "دانلود",
|
||||
"download.button.installed": "نصب شد",
|
||||
"download.button.installer-required": "نصب PKG",
|
||||
"download.button.installing": "در حال نصب",
|
||||
"download.button.no-space": "فضای کافی نیست",
|
||||
"download.button.pause": "توقف موقت",
|
||||
"download.button.paused": "ادامه",
|
||||
"download.button.pausing": "در حال توقف",
|
||||
"download.button.queued": "توقف دانلود در صف",
|
||||
"download.button.removing": "در حال حذف فایلها",
|
||||
"download.button.stale": "شروع دوبارهٔ دانلود",
|
||||
"download.button.unavailable": "منبع دانلودی نیست",
|
||||
"download.button.verifying": "در حال تأیید",
|
||||
"download.enterLink": "لینک فایل را وارد کنید",
|
||||
"download.enterPartLink": "لینک فایل بخش {part} از {parts} را وارد کنید",
|
||||
"download.fileLink": "لینک فایل",
|
||||
"download.fileLinkDetail": "لینک خودِ فایل را بنویسید؛ همانی که بعد از تأیید میزبان دانلود را شروع میکند، نه آدرس صفحه.",
|
||||
"download.free": "{size} آزاد",
|
||||
"download.moreOptions": "گزینههای بیشتر",
|
||||
"download.noFit": "روی این درایو جا نمیشود",
|
||||
"download.openQueue": "باز کردن دانلودها",
|
||||
"download.optionsTitle": "گزینههای دانلود",
|
||||
"download.otherSource.detail": "میزبان یا نسخهٔ دیگری انتخاب کنید.",
|
||||
"download.otherSource.label": "انتخاب منبع دیگر",
|
||||
"download.partFileLink": "بخش {part} از {parts}: لینک فایل",
|
||||
"download.remove.detail": "متوقفش میکند و هر فایل دانلودشده را روی درایو میگذارد.",
|
||||
"download.remove.label": "حذف از صف",
|
||||
"download.restart.detail": "دانلود را از اول شروع میکند.",
|
||||
"download.restart.detailSaved": "{size} دانلودشده را پاک میکند و از صفر شروع میکند.",
|
||||
"download.restart.label": "شروع از صفر",
|
||||
"download.saveTo": "ذخیره روی {drive}",
|
||||
"download.soFar": "{size} تا الان",
|
||||
"download.source": "منبع: {source}",
|
||||
"download.space.free": "{size} روی {drive} آزاد کنید و دوباره امتحان کنید.",
|
||||
"download.space.otherDrive": "{drive} دارای {size} فضای آزاد است: در «ذخیره روی» انتخابش کنید.",
|
||||
"download.status.awaitingLink": "در انتظار لینک فایل",
|
||||
"download.status.needs": "نیاز به {size}",
|
||||
"download.status.noSpace": "روی این درایو جا نمیشود",
|
||||
"download.status.progress": "{done} از {total}",
|
||||
"download.status.ready": "آمادهٔ دانلود",
|
||||
"download.status.unavailable": "این ورودی کاتالوگ آدرس فایلی ندارد",
|
||||
"downloadState.awaiting-browser": "در انتظار تأیید مرورگر",
|
||||
"downloadState.connecting": "در حال اتصال…",
|
||||
"downloadState.downloaded": "آمادهٔ نصب",
|
||||
"downloadState.downloading": "در حال دانلود",
|
||||
"downloadState.extracted": "فایلها استخراج شدند",
|
||||
"downloadState.extracting": "در حال استخراج فایلهای دانلودشده…",
|
||||
"downloadState.extraction-required": "دانلود شد؛ آرشیو را استخراج کنید",
|
||||
"downloadState.failed": "ناموفق",
|
||||
"downloadState.file-downloaded": "فایل دانلود شد؛ فرمتش را بررسی کنید",
|
||||
"downloadState.finishing": "در حال اتمام…",
|
||||
"downloadState.installed": "نصب شد",
|
||||
"downloadState.installer-required": "PKG را نصب کنید",
|
||||
"downloadState.installing": "در حال نصب…",
|
||||
"downloadState.paused": "متوقفشده",
|
||||
"downloadState.pausing": "در حال توقف…",
|
||||
"downloadState.queued": "در صف",
|
||||
"downloadState.removing": "در حال حذف…",
|
||||
"downloadState.resolving": "در حال یافتن لینک…",
|
||||
"downloadState.verifying": "در حال تأیید…",
|
||||
"downloads.action.continueOnPage": "ادامه در صفحهٔ بازی",
|
||||
"downloads.action.gamePage": "صفحهٔ بازی",
|
||||
"downloads.action.install": "نصب",
|
||||
"downloads.action.pause": "توقف موقت",
|
||||
"downloads.action.pausing": "در حال توقف",
|
||||
"downloads.action.restart": "شروع دوباره",
|
||||
"downloads.action.resume": "ادامه",
|
||||
"downloads.action.retry": "تلاش دوباره",
|
||||
"downloads.afterVerification": "بعد از تأیید به اینجا برگردید و آدرس نهایی فایل را وارد کنید.",
|
||||
"downloads.archiveNotDeleted": "آرشیو دانلودشده حذف نشد: {error}",
|
||||
"downloads.browseGames": "مرور بازیها",
|
||||
"downloads.empty": "دانلودی نیست",
|
||||
"downloads.emptyDetail": "بازیهایی که دانلود میکنید با پیشرفتشان اینجا ظاهر میشوند.",
|
||||
"downloads.extractedReady": "{parts, select, all {همهٔ بخشها} other {آرشیو}} تأیید و استخراج شد. آمادهٔ نصب است.",
|
||||
"downloads.extractedTo": "استخراج شد به {path}",
|
||||
"downloads.installFailed": "کنسول بسته را نپذیرفت. برای تلاش دوباره، گزینهٔ «نصب» را انتخاب کنید.",
|
||||
"downloads.installHint": "Overdrive را ببندید تا تمام شود: ShadowMount وقتی هیچ بازی باز نباشد نصب میکند.",
|
||||
"downloads.installRequested": "نصب درخواست شد. Overdrive را ببندید تا تمام شود: ShadowMount وقتی هیچ بازی باز نباشد نصب میکند.",
|
||||
"downloads.installed": "نصب شد. روی صفحهٔ اصلی است.",
|
||||
"downloads.notice.captured": "لینک گرفته شد، به Overdrive برگردید",
|
||||
"downloads.notice.complete": "دانلود کامل شد",
|
||||
"downloads.notice.failed": "دانلود ناموفق بود",
|
||||
"downloads.notice.installed": "بازی نصب شد",
|
||||
"downloads.packagesExtracted": "پکیجها به {path} استخراج شدند. نصبکنندهٔ PKG لازم است.",
|
||||
"downloads.panel.activity": "فعالیت",
|
||||
"downloads.panel.average": "میانگین",
|
||||
"downloads.panel.awake": "کنسول تا پایان دانلودها بیدار میماند.",
|
||||
"downloads.panel.connections": "اتصالات",
|
||||
"downloads.panel.downloading": "در حال دانلود",
|
||||
"downloads.panel.idle": "بیکار",
|
||||
"downloads.panel.installNote": "بازیهای تمامشده از طریق ShadowMount نصب میشوند که منتظر میماند تا هیچ بازی باز نباشد. Overdrive را ببندید تا تمام شود.",
|
||||
"downloads.panel.installing": "در حال نصب",
|
||||
"downloads.panel.low": "کم",
|
||||
"downloads.panel.none": "هیچ",
|
||||
"downloads.panel.peak": "اوج",
|
||||
"downloads.panel.storage": "فضای ذخیرهسازی",
|
||||
"downloads.panel.timeLeft": "زمان باقیمانده",
|
||||
"downloads.panel.unavailable": "در دسترس نیست",
|
||||
"downloads.panel.used": "{used} از {total} استفادهشده",
|
||||
"downloads.part": "بخش {part} از {parts}",
|
||||
"downloads.problem": "{title}. {action}",
|
||||
"downloads.section.active": "فعال",
|
||||
"downloads.section.completed": "تمامشده",
|
||||
"downloads.section.stopped": "متوقفشده",
|
||||
"downloads.stats.download": "دانلود",
|
||||
"downloads.stats.write": "نوشتن",
|
||||
"downloads.summary.completed": "{count} تمامشده",
|
||||
"downloads.summary.failed": "{count} ناموفق",
|
||||
"downloads.summary.inProgress": "{count} در حال انجام",
|
||||
"downloads.summary.paused": "{count} متوقفشده",
|
||||
"downloads.switchedSource": "{failed} کار نکرد، پس Overdrive به {next} سوییچ کرد.",
|
||||
"downloads.timeLeft": "{time} باقیمانده",
|
||||
"downloads.title": "دانلودها",
|
||||
"downloads.unavailable": "دانلودها در دسترس نیست",
|
||||
"downloads.writingToDisk": "در حال نوشتن روی دیسک…",
|
||||
"drives.extended": "ذخیرهسازی توسعهیافته {number}",
|
||||
"drives.internal": "حافظهٔ داخلی",
|
||||
"drives.thisDevice": "این دستگاه",
|
||||
"drives.usb": "درایو USB {number}",
|
||||
"errors.action.checkConnection": "اتصال اینترنت کنسول را چک کنید، سپس Retry را بزنید.",
|
||||
"errors.action.freeOrOtherDrive": "فضا آزاد کنید یا در «ذخیره روی» درایو دیگری انتخاب کنید.",
|
||||
"errors.action.freeThenResume": "روی درایو فضا آزاد کنید، سپس Resume را بزنید.",
|
||||
"errors.action.freeThenRetry": "روی درایو فضا آزاد کنید، سپس Retry را بزنید یا لغو کنید و جای دیگری ذخیره کنید.",
|
||||
"errors.action.openSource": "منبع را باز کنید، سپس آدرس نهایی فایل را وارد کنید.",
|
||||
"errors.action.otherSource": "لغوش کنید و منبع دیگری انتخاب کنید.",
|
||||
"errors.action.reconnect": "درایو اصلی را دوباره وصل کنید، سپس Resume را بزنید.",
|
||||
"errors.action.reopenApp": "Overdrive را ببندید و دوباره باز کنید، سپس Retry را بزنید.",
|
||||
"errors.action.restart": "برای دانلود دوباره از اول شروع کنید.",
|
||||
"errors.action.restartFromZero": "از صفر شروع کنید.",
|
||||
"errors.action.resume": "برای ادامه، گزینهٔ «ادامه» را انتخاب کنید.",
|
||||
"errors.action.retryLater": "چند دقیقه دیگر دوباره امتحان کنید.",
|
||||
"errors.action.retryOrOtherSource": "دوباره امتحان کنید یا منبع دیگری انتخاب کنید.",
|
||||
"errors.action.retryPart": "برای دانلود دوبارهٔ این بخش، گزینهٔ «تلاش دوباره» را انتخاب کنید.",
|
||||
"errors.archivePassword": "رمز آرشیو کار نمیکند",
|
||||
"errors.archiveTooLarge": "این آرشیو روی کنسول قابل استخراج نیست",
|
||||
"errors.damaged": "فایل آسیبدیده رسید",
|
||||
"errors.driveDisconnected": "درایو قطع شد",
|
||||
"errors.fileChanged": "فایل روی سرور تغییر کرده",
|
||||
"errors.interrupted": "با بسته شدن برنامه متوقف شد",
|
||||
"errors.linkGone": "لینک دانلود دیگر کار نمیکند",
|
||||
"errors.notGameFile": "میزبان به جای بازی یک صفحهٔ وب فرستاد",
|
||||
"errors.pkgFirmware": "PKGهای جعلی PS5 فقط تا فریمور 11.60 نصب میشوند",
|
||||
"errors.missingParts": "این منبع بخشهایی کم دارد",
|
||||
"errors.needsBrowser": "این منبع به مرورگر وب نیاز دارد",
|
||||
"errors.noConnection": "اتصال به سرور برقرار نیست",
|
||||
"errors.noMemory": "حافظهٔ کافی برای استخراج نیست",
|
||||
"errors.noSpace": "فضای آزاد کافی نیست",
|
||||
"errors.noSpaceOn": "فضای کافی روی {root} نیست: نیاز به {need}، {free} آزاد{queued, select, yes { بعد از دانلودهای در صف} other {}}",
|
||||
"errors.partIncomplete": "بخش {part} ناقص به نظر میرسد",
|
||||
"errors.partialDeleted": "فایلهای دانلودشدهاش حذف شدند",
|
||||
"errors.serverBusy": "سرور شلوغ است",
|
||||
"errors.staleProgress": "پیشرفت ذخیرهشده قابل ادامه نیست",
|
||||
"feature.cloudSaves": "ذخیرهسازی ابری",
|
||||
"feature.coOp": "همکاری",
|
||||
"feature.crossPlay": "بازی متقابل",
|
||||
"feature.dualsenseFeatures": "قابلیتهای DualSense",
|
||||
"feature.onlineMultiplayer": "چندنفره آنلاین",
|
||||
"feature.singlePlayer": "تکنفره",
|
||||
"files.byShadowMount": "ShadowMount نصبش میکند",
|
||||
"files.confirmDelete": "دوباره بزنید تا حذف شود · {size}",
|
||||
"files.deleteFailed": "این فایل حذف نشد. دوباره امتحان کنید.",
|
||||
"files.deleted": "{name} حذف شد",
|
||||
"files.drives": "درایوها",
|
||||
"files.empty": "این درایو خالی است",
|
||||
"files.emptyDetail": "فایلهای دانلودشده اینجا نشان داده میشوند.",
|
||||
"files.free": "فضای آزاد: {free} از {total}",
|
||||
"files.installDone": "نصب شد. روی صفحهٔ اصلی است.",
|
||||
"files.installFailed": "کنسول این پکیج را نپذیرفت. مطمئن شوید kstuff بارگذاری شده و دوباره امتحان کنید.",
|
||||
"files.installed": "نصبشده",
|
||||
"files.installing": "در حال نصب · {percent}",
|
||||
"files.kind.all": "همهٔ فایلها",
|
||||
"files.kind.archives": "آرشیوها",
|
||||
"files.kind.extracted": "استخراجشده",
|
||||
"files.kind.images": "ایمیجهای بازی",
|
||||
"files.kind.other": "سایر فایلها",
|
||||
"files.kind.packages": "پکیجها",
|
||||
"files.kinds": "نمایش",
|
||||
"files.notInstalled": "نصب نشده",
|
||||
"files.otherData": "بازیها و سیستم",
|
||||
"files.shadowMountOff": "ShadowMount در حال اجرا نیست",
|
||||
"files.shadowMountOn": "ShadowMount در حال اجراست",
|
||||
"files.summary": "{count, plural, one {# فایل} other {# فایل}} · {size}",
|
||||
"files.title": "فایلها",
|
||||
"files.type.archive": "آرشیو",
|
||||
"files.type.file": "فایل",
|
||||
"files.type.folder": "پوشه",
|
||||
"files.type.image": "ایمیج بازی",
|
||||
"files.type.package": "PKG",
|
||||
"files.waitingShadowMount": "منتظر ShadowMount",
|
||||
"filters.access.direct": "دانلود مستقیم",
|
||||
"filters.clearAll": "پاک کردن همه",
|
||||
"filters.clearFacet": "پاک کردن",
|
||||
"filters.facet.access": "دانلود",
|
||||
"filters.facet.feature": "قابلیتها",
|
||||
"filters.facet.genre": "ژانر",
|
||||
"filters.facet.platform": "پلتفرم",
|
||||
"filters.facet.provider": "میزبان دانلود",
|
||||
"filters.facet.release": "انتشار",
|
||||
"filters.facet.size": "حجم",
|
||||
"filters.favorites": "علاقهمندیها",
|
||||
"filters.more": "+{count} بیشتر",
|
||||
"filters.queryChip": "«{query}»",
|
||||
"filters.release.current": "۲۰۲۰–۲۰۲۳",
|
||||
"filters.release.older": "قبل از ۲۰۲۰",
|
||||
"filters.release.recent": "از ۲۰۲۴ به بعد",
|
||||
"filters.selected": "{count} انتخابشده",
|
||||
"filters.show": "نمایش {count, plural, one {# بازی} other {# بازی}}",
|
||||
"filters.size.large": "بیش از ۵۰ گیگابایت",
|
||||
"filters.size.medium": "۱۰–۵۰ گیگابایت",
|
||||
"filters.size.small": "کمتر از ۱۰ گیگابایت",
|
||||
"filters.title": "فیلترها",
|
||||
"game.about": "دربارهٔ این بازی",
|
||||
"game.addToFavorites": "افزودن به علاقهمندیها",
|
||||
"game.back.browse": "کتابخانه",
|
||||
"game.back.downloads": "دانلودها",
|
||||
"game.back.search": "جستجو",
|
||||
"game.details": "جزئیات",
|
||||
"game.facts.downloadSize": "حجم دانلود",
|
||||
"game.facts.installSize": "حجم نصب",
|
||||
"game.facts.platform": "پلتفرم",
|
||||
"game.facts.publisher": "ناشر",
|
||||
"game.facts.releaseDate": "تاریخ انتشار",
|
||||
"game.favorite": "علاقهمندی",
|
||||
"game.features": "قابلیتها",
|
||||
"game.metacritic": "Metacritic",
|
||||
"game.moreLikeThis": "مشابه این",
|
||||
"game.released": "منتشرشده در {year}",
|
||||
"game.shotPosition": "{index} / {total}",
|
||||
"game.showLess": "نمایش کمتر",
|
||||
"game.showMore": "نمایش بیشتر",
|
||||
"genre.action": "اکشن",
|
||||
"genre.adventure": "ماجراجویی",
|
||||
"genre.arcade": "آرکید",
|
||||
"genre.boardGame": "بازی رومیزی",
|
||||
"genre.brainTraining": "تمرین ذهن",
|
||||
"genre.casual": "کژوال",
|
||||
"genre.educational": "آموزشی",
|
||||
"genre.family": "خانوادگی",
|
||||
"genre.fighting": "مبارزه",
|
||||
"genre.horror": "ترسناک",
|
||||
"genre.indie": "مستقل",
|
||||
"genre.musicRhythm": "موسیقی/ریتم",
|
||||
"genre.party": "مهمانی",
|
||||
"genre.puzzle": "پازل",
|
||||
"genre.quiz": "کوییز",
|
||||
"genre.racing": "مسابقهای",
|
||||
"genre.rpg": "نقشآفرینی",
|
||||
"genre.shooter": "تیراندازی",
|
||||
"genre.simulation": "شبیهسازی",
|
||||
"genre.sport": "ورزشی",
|
||||
"genre.sports": "ورزشی",
|
||||
"genre.strategy": "استراتژی",
|
||||
"hints.back": "بازگشت",
|
||||
"hints.clear": "پاک کردن",
|
||||
"hints.close": "بستن",
|
||||
"hints.confirm": "تأیید",
|
||||
"hints.confirmDelete": "حذف قطعی",
|
||||
"hints.delete": "حذف",
|
||||
"hints.favorite": "علاقهمندی",
|
||||
"hints.filters": "فیلترها",
|
||||
"hints.gamePage": "صفحهٔ بازی",
|
||||
"hints.install": "نصب",
|
||||
"hints.pauseResume": "توقف / ادامه",
|
||||
"hints.previousNext": "قبلی / بعدی",
|
||||
"hints.remove": "حذف",
|
||||
"hints.search": "جستجو",
|
||||
"hints.sections": "بخشها",
|
||||
"hints.select": "انتخاب",
|
||||
"hints.space": "فاصله",
|
||||
"hints.toggle": "تغییر وضعیت",
|
||||
"hints.top": "بالا",
|
||||
"hints.type": "تایپ",
|
||||
"hints.view": "مشاهده",
|
||||
"install.added": "به دانلودها اضافه شد",
|
||||
"install.complete": "دانلود کامل شد",
|
||||
"install.manage": "در دانلودها مدیریت کنید",
|
||||
"keyboard.clear": "پاک کردن",
|
||||
"keyboard.delete": "حذف",
|
||||
"keyboard.done": "تمام",
|
||||
"keyboard.lowercase": "حروف کوچک",
|
||||
"keyboard.space": "فاصله",
|
||||
"keyboard.uppercase": "حروف بزرگ",
|
||||
"language.name.ar": "عربی",
|
||||
"language.name.bn": "بنگالی",
|
||||
"language.name.de": "آلمانی",
|
||||
"language.name.en": "انگلیسی",
|
||||
"language.name.es": "اسپانیایی",
|
||||
"language.name.fa": "فارسی",
|
||||
"language.name.fr": "فرانسوی",
|
||||
"language.name.hi": "هندی",
|
||||
"language.name.id": "اندونزیایی",
|
||||
"language.name.it": "ایتالیایی",
|
||||
"language.name.ja": "ژاپنی",
|
||||
"language.name.pt-BR": "پرتغالی (برزیل)",
|
||||
"language.name.ru": "روسی",
|
||||
"language.name.ur": "اردو",
|
||||
"language.name.zh-Hans": "چینی (سادهشده)",
|
||||
"language.subtitle": "عنوان و توضیحات بازیها همانطور که فروشگاه فهرست کرده میمانند.",
|
||||
"language.system": "زبان سیستم",
|
||||
"language.title": "زبان",
|
||||
"nav.allGames": "همهٔ بازیها",
|
||||
"nav.browse": "مرور",
|
||||
"nav.discover": "کشف",
|
||||
"nav.files": "فایلها",
|
||||
"nav.new": "تازهها",
|
||||
"nav.search": "جستجو",
|
||||
"nav.top": "برترینها",
|
||||
"search.noMatch": "هیچ بازیای با «{query}» مطابقت ندارد",
|
||||
"search.placeholder": "جستجو در کتابخانه",
|
||||
"search.popular": "محبوب",
|
||||
"search.recent": "جستجوهای اخیر",
|
||||
"search.resultsFor": "نتایج برای «{query}»",
|
||||
"search.tryGenre": "املا را چک کنید یا یک ژانر امتحان کنید:",
|
||||
"settings.controller": "دسته",
|
||||
"settings.downloads": "دانلودها",
|
||||
"settings.speedLimit": "محدودیت سرعت",
|
||||
"settings.speedLimitDetail": "پهنای باند را برای دستگاههای دیگر نگه میدارد. بهروزرسانیهای برنامه هرگز محدود نمیشوند.",
|
||||
"settings.speedUnlimited": "نامحدود",
|
||||
"settings.title": "تنظیمات",
|
||||
"settings.vibration": "لرزش هنگام مرور",
|
||||
"settings.vibrationDetail": "ضربهٔ ملایم هنگام حرکت، انتخاب و بازگشت",
|
||||
"shadowMount.offAction": "بازی وقتی بارگذاری شود ظاهر میشود. آن را به autoload جیلبریک اضافه کنید تا روشن بماند.",
|
||||
"shadowMount.offTitle": "ShadowMount در حال اجرا نیست",
|
||||
"sort.label": "مرتبسازی",
|
||||
"sort.newest": "تازهها",
|
||||
"sort.rating": "برترینها",
|
||||
"sort.relevance": "محبوبترین",
|
||||
"sort.size": "بزرگترین نصبها",
|
||||
"sort.title": "الف تا ی",
|
||||
"sources.browserNote": "هر بخش صفحهٔ یک میزبان را باز میکند، سپس لینک فایل را با دسته وارد میکنید.",
|
||||
"sources.cdnFastest": "سریعترین",
|
||||
"sources.kind.archive": "آرشیو",
|
||||
"sources.kind.image": "ایمیج بازی",
|
||||
"sources.kind.package": "پکیج",
|
||||
"sources.kind.patch": "فقط فایلهای بکپورت، نه کل بازی",
|
||||
"sources.status.dlc": "DLC: بازی اصلی لازم است",
|
||||
"sources.status.package": "PKGهای جعلی PS5 فقط تا فریمور 11.60 نصب میشوند",
|
||||
"sources.status.patch": "بازی اصلی لازم است، بهتنهایی نصب نمیشود",
|
||||
"sources.noDetails": "بدون جزئیات",
|
||||
"sources.parts": "{count, plural, one {# بخش} other {# بخش}}",
|
||||
"sources.recommended": "پیشنهادی",
|
||||
"sources.section.browser": "باز کردن در مرورگر وب",
|
||||
"sources.section.direct": "دانلود در Overdrive",
|
||||
"sources.section.dlc": "افزونهها (DLC)",
|
||||
"sources.section.dlcNote": "محتوای اضافه برای بازی، نه خود بازی.",
|
||||
"sources.section.page": "از صفحات میزبان",
|
||||
"sources.section.pageNote": "Overdrive لینک فایل را از صفحه میخواند. اگر میزبان تأیید بخواهد، شما را آنجا میفرستد.",
|
||||
"sources.section.versions": "نسخه",
|
||||
"sources.showBrowser": "{count, plural, one {نمایش # منبع مرورگر وب} other {نمایش # منبع مرورگر وب}}",
|
||||
"sources.speed.archive": "چند اتصال همزمان",
|
||||
"sources.speed.mediafire": "محدود به حدود ۳ مگابایت بر ثانیه",
|
||||
"sources.title": "منبع دانلود",
|
||||
"time.hoursMinutes": "{hours} س {minutes} د",
|
||||
"time.minutes": "{n} دقیقه",
|
||||
"time.seconds": "{n} ثانیه",
|
||||
"toast.openDownloads": "باز کردن دانلودها",
|
||||
"toast.viewGame": "مشاهدهٔ بازی",
|
||||
"tips.eyebrow": "دانلود",
|
||||
"tips.title": "پیش از دانلود",
|
||||
"tips.downloading": "در حال دانلود",
|
||||
"tips.about": "دربارهٔ این منبع",
|
||||
"tips.toggle": "نکتههایی برای انتخاب منبع",
|
||||
"tips.continue": "ادامه",
|
||||
"tips.changeSource": "تغییر منبع",
|
||||
"tips.note.dlc": "این یک DLC است، نه خود بازی. اول بازی اصلی را نصب کنید.",
|
||||
"tips.note.patch": "اینها فقط فایلهای بکپورت هستند، نه کل بازی. بهتنهایی نصب نمیشوند.",
|
||||
"tips.note.package": "این یک PKG جعلی PS5 است. فقط روی فریمور 11.60 یا قدیمیتر نصب میشود.",
|
||||
"tips.note.browserViking": "این منبع در مرورگر PS5 باز میشود. تأیید را کامل کنید و صبر کنید. روی Download یا هیچ تبلیغی نزنید.",
|
||||
"tips.note.browserOther": "این منبع در مرورگر PS5 باز میشود و بعد لینک فایل را میخواهد. اگر میتوانید، منبعی بالاتر در فهرست انتخاب کنید.",
|
||||
"tips.note.firmware": "این نسخه به فریمور {need} یا جدیدتر نیاز دارد. نسخهٔ خود را در تنظیمات > سیستم > نرمافزار سیستم ببینید.",
|
||||
"tips.tip.firmware.title": "فریمور را ببینید",
|
||||
"tips.tip.firmware.body": "Base 8.xx به 8.xx یا جدیدتر نیاز دارد. BackPort برای کنسولهای قدیمی است.",
|
||||
"tips.tip.fullGame.title": "بازی کامل را بگیرید",
|
||||
"tips.tip.fullGame.body": "Base یا BackPort، نه DLC یا فایلهای بکپورت.",
|
||||
"tips.tip.top.title": "از بالا شروع کنید",
|
||||
"tips.tip.top.body": "منابع اول بهتریناند.",
|
||||
"tips.tip.retry.title": "نشد؟ منبع دیگر",
|
||||
"tips.tip.retry.body": "بیشتر بازیها چند منبع دارند.",
|
||||
"units.gigabytes": "{n} گیگابایت",
|
||||
"units.megabytes": "{n} مگابایت",
|
||||
"units.millions": "{n} میلیون",
|
||||
"units.speed": "{n} مگابایت/ث",
|
||||
"units.thousands": "{n} هزار",
|
||||
"update.available": "بهروزرسانی موجود است",
|
||||
"update.close": "بستن",
|
||||
"update.detail": "نسخهٔ جدیدی از Overdrive آماده است. درجا نصب میشود و خودش دوباره باز میشود.",
|
||||
"update.done": "بهروزرسانی شد",
|
||||
"update.failed": "بهروزرسانی ناموفق",
|
||||
"update.install": "الان بهروزرسانی کن",
|
||||
"update.installing": "در حال نصب…",
|
||||
"update.later": "بعداً",
|
||||
"update.quit": "بستن Overdrive",
|
||||
"update.reopen": "در حال بسته شدن. Overdrive را دوباره از صفحهٔ اصلی باز کنید",
|
||||
"update.reopenInstalled": "Overdrive به نسخهٔ {version} بهروز شد. آن را ببندید و دوباره از صفحهٔ اصلی باز کنید.",
|
||||
"update.replaceByHand": "فایل update.zip را از github.com/MyLuxy/overdrive دانلود کنید، Overdrive را ببندید و فایل .exfat را جایگزین فایل قبلی کنید.",
|
||||
"update.replaceFailed": "نمیتوان ایمیج نصبشده را وقتی Overdrive باز است جایگزین کرد.",
|
||||
"update.restartConsole": "اگر همچنان نسخهٔ قدیمی باز میشود، کنسول را ریاستارت کنید.",
|
||||
"update.restarting": "در حال راهاندازی دوبارهٔ Overdrive…",
|
||||
"update.retry": "تلاش دوباره",
|
||||
"update.updating": "در حال بهروزرسانی",
|
||||
"urlDialog.cancel": "لغو",
|
||||
"urlDialog.confirm": "تأیید آدرس",
|
||||
"urlDialog.controls": "مربع: حذف · R2: تأیید · دایره: لغو",
|
||||
"urlDialog.empty": "(خالی)",
|
||||
"versions.name": "نسخهٔ {platform}",
|
||||
"versions.note.ps4": "روی PS5 از طریق سازگاری عقبرو اجرا میشود",
|
||||
"versions.note.ps5": "بهصورت بومی روی PS5 اجرا میشود",
|
||||
"versions.recommended": "پیشنهادی · بهصورت بومی روی PS5 اجرا میشود",
|
||||
"versions.sources": "{count, plural, one {# منبع} other {# منبع}}",
|
||||
"versions.thisPage": "این صفحه",
|
||||
"versions.title": "انتخاب نسخه",
|
||||
"capture.title": "تأیید Vikingfile",
|
||||
"capture.preparing": "آمادهسازی تأیید فایل…",
|
||||
"capture.capturing": "تأیید را کامل کنید، سپس صبر کنید",
|
||||
"capture.validating": "در حال بررسی فایل ضبطشده…",
|
||||
"capture.detail": "روی Download یا هیچ تبلیغی نزنید: لینک خودش گرفته میشود. سپس به اینجا برگردید تا دانلود خودکار شروع شود. گرفتن لینک تا ۳ دقیقه طول میکشد."
|
||||
}
|
||||
@@ -172,6 +172,8 @@
|
||||
"errors.fileChanged": "Le fichier a changé sur le serveur",
|
||||
"errors.interrupted": "Arrêté quand l'app s'est fermée",
|
||||
"errors.linkGone": "Le lien de téléchargement ne fonctionne plus",
|
||||
"errors.notGameFile": "L'hébergeur a envoyé une page web au lieu du jeu",
|
||||
"errors.pkgFirmware": "Les faux PKG PS5 ne s'installent que jusqu'au firmware 11.60",
|
||||
"errors.missingParts": "Il manque des parties à cette source",
|
||||
"errors.needsBrowser": "Cette source nécessite un navigateur web",
|
||||
"errors.noConnection": "Pas de connexion au serveur",
|
||||
@@ -317,6 +319,7 @@
|
||||
"language.name.de": "Allemand",
|
||||
"language.name.en": "Anglais",
|
||||
"language.name.es": "Espagnol",
|
||||
"language.name.fa": "Persan",
|
||||
"language.name.fr": "Français",
|
||||
"language.name.hi": "Hindi",
|
||||
"language.name.id": "Indonésien",
|
||||
@@ -343,6 +346,10 @@
|
||||
"search.resultsFor": "Résultats pour « {query} »",
|
||||
"search.tryGenre": "Vérifiez l'orthographe, ou essayez un genre :",
|
||||
"settings.controller": "Manette",
|
||||
"settings.downloads": "Téléchargements",
|
||||
"settings.speedLimit": "Limite de vitesse",
|
||||
"settings.speedLimitDetail": "Laisse de la bande passante aux autres appareils. Les mises à jour de l'app ne sont jamais limitées.",
|
||||
"settings.speedUnlimited": "Illimitée",
|
||||
"settings.title": "Réglages",
|
||||
"settings.vibration": "Vibration pendant la navigation",
|
||||
"settings.vibrationDetail": "Une légère impulsion quand vous vous déplacez, sélectionnez ou revenez",
|
||||
@@ -359,6 +366,10 @@
|
||||
"sources.kind.archive": "Archive",
|
||||
"sources.kind.image": "Image",
|
||||
"sources.kind.package": "Paquet",
|
||||
"sources.kind.patch": "Fichiers de backport seuls, pas le jeu complet",
|
||||
"sources.status.dlc": "DLC : nécessite le jeu de base",
|
||||
"sources.status.package": "Les faux PKG PS5 ne s'installent que jusqu'au firmware 11.60",
|
||||
"sources.status.patch": "Nécessite le jeu de base, ne s'installe pas seul",
|
||||
"sources.noDetails": "Aucun détail",
|
||||
"sources.parts": "{count, plural, one {# partie} many {# millions de parties} other {# parties}}",
|
||||
"sources.recommended": "Recommandé",
|
||||
@@ -378,6 +389,27 @@
|
||||
"time.seconds": "{n} s",
|
||||
"toast.openDownloads": "Ouvrir Téléchargements",
|
||||
"toast.viewGame": "Voir le jeu",
|
||||
"tips.eyebrow": "Téléchargement",
|
||||
"tips.title": "Avant de télécharger",
|
||||
"tips.downloading": "Tu télécharges",
|
||||
"tips.about": "À propos de cette source",
|
||||
"tips.toggle": "Conseils pour choisir la source",
|
||||
"tips.continue": "Continuer",
|
||||
"tips.changeSource": "Changer de source",
|
||||
"tips.note.dlc": "C'est un DLC, pas le jeu. Installe d'abord le jeu de base.",
|
||||
"tips.note.patch": "Ce sont seulement des fichiers de backport, pas le jeu complet. Seuls, ils ne s'installent pas.",
|
||||
"tips.note.package": "C'est un faux PKG PS5. Il ne s'installe qu'en firmware 11.60 ou antérieur.",
|
||||
"tips.note.browserViking": "Cette source s'ouvre dans le navigateur de la PS5. Termine la vérification, puis patiente. N'appuie ni sur Télécharger ni sur une pub.",
|
||||
"tips.note.browserOther": "Cette source s'ouvre dans le navigateur de la PS5, puis demande le lien du fichier. Si possible, choisis une source plus haut.",
|
||||
"tips.note.firmware": "Cette version nécessite le firmware {need} ou plus récent. Vérifie le tien dans Paramètres > Système > Logiciel système.",
|
||||
"tips.tip.firmware.title": "Vérifie le firmware",
|
||||
"tips.tip.firmware.body": "Base 8.xx nécessite 8.xx ou plus. BackPort est pour les anciennes consoles.",
|
||||
"tips.tip.fullGame.title": "Prends le jeu complet",
|
||||
"tips.tip.fullGame.body": "Base ou BackPort, pas de DLC ni de fichiers backport.",
|
||||
"tips.tip.top.title": "Commence en haut",
|
||||
"tips.tip.top.body": "Les premières sources marchent le mieux.",
|
||||
"tips.tip.retry.title": "Échec ? Essaie une autre",
|
||||
"tips.tip.retry.body": "La plupart des jeux en ont plusieurs.",
|
||||
"units.gigabytes": "{n} Go",
|
||||
"units.megabytes": "{n} Mo",
|
||||
"units.millions": "{n}M",
|
||||
|
||||
@@ -172,6 +172,8 @@
|
||||
"errors.fileChanged": "फ़ाइल सर्वर पर बदल गई",
|
||||
"errors.interrupted": "जब ऐप बंद हुआ तो रुका",
|
||||
"errors.linkGone": "डाउनलोड लिंक अब काम नहीं करता",
|
||||
"errors.notGameFile": "होस्ट ने गेम की जगह एक वेब पेज भेजा",
|
||||
"errors.pkgFirmware": "PS5 के फ़ेक PKG केवल फ़र्मवेयर 11.60 तक इंस्टॉल होते हैं",
|
||||
"errors.missingParts": "इस स्रोत में भाग कम हैं",
|
||||
"errors.needsBrowser": "यह स्रोत एक वेब ब्राउज़र की आवश्यकता है",
|
||||
"errors.noConnection": "सर्वर से कोई कनेक्शन नहीं",
|
||||
@@ -317,6 +319,7 @@
|
||||
"language.name.de": "जर्मन",
|
||||
"language.name.en": "अंग्रेजी",
|
||||
"language.name.es": "स्पेनिश",
|
||||
"language.name.fa": "फ़ारसी",
|
||||
"language.name.fr": "फ्रांसीसी",
|
||||
"language.name.hi": "हिंदी",
|
||||
"language.name.id": "इंडोनेशियन",
|
||||
@@ -343,6 +346,10 @@
|
||||
"search.resultsFor": "'{query}' के लिए परिणाम",
|
||||
"search.tryGenre": "वर्तनी जाँचें, या एक शैली आजमाएँ:",
|
||||
"settings.controller": "कंट्रोलर",
|
||||
"settings.downloads": "डाउनलोड",
|
||||
"settings.speedLimit": "स्पीड सीमा",
|
||||
"settings.speedLimitDetail": "दूसरे डिवाइसों के लिए बैंडविड्थ छोड़ता है। ऐप अपडेट कभी सीमित नहीं होते।",
|
||||
"settings.speedUnlimited": "असीमित",
|
||||
"settings.title": "सेटिंग्स",
|
||||
"settings.vibration": "ब्राउज़ करते समय वाइब्रेशन",
|
||||
"settings.vibrationDetail": "आगे बढ़ने, चुनने और वापस जाने पर हल्का कंपन",
|
||||
@@ -359,6 +366,10 @@
|
||||
"sources.kind.archive": "संग्रह",
|
||||
"sources.kind.image": "गेम इमेज",
|
||||
"sources.kind.package": "पैकेज",
|
||||
"sources.kind.patch": "सिर्फ़ बैकपोर्ट फ़ाइलें, पूरा गेम नहीं",
|
||||
"sources.status.dlc": "DLC: बेस गेम चाहिए",
|
||||
"sources.status.package": "PS5 के फ़ेक PKG केवल फ़र्मवेयर 11.60 तक इंस्टॉल होते हैं",
|
||||
"sources.status.patch": "बेस गेम चाहिए, अकेले इंस्टॉल नहीं होगा",
|
||||
"sources.noDetails": "कोई विवरण नहीं",
|
||||
"sources.parts": "{count, plural, one {# भाग} other {# भाग}}",
|
||||
"sources.recommended": "सुझाया गया",
|
||||
@@ -378,6 +389,27 @@
|
||||
"time.seconds": "{n} सेकंड",
|
||||
"toast.openDownloads": "डाउनलोड खोलें",
|
||||
"toast.viewGame": "गेम देखें",
|
||||
"tips.eyebrow": "डाउनलोड",
|
||||
"tips.title": "डाउनलोड से पहले",
|
||||
"tips.downloading": "आप डाउनलोड कर रहे हैं",
|
||||
"tips.about": "इस सोर्स के बारे में",
|
||||
"tips.toggle": "सोर्स चुनने के सुझाव",
|
||||
"tips.continue": "जारी रखें",
|
||||
"tips.changeSource": "सोर्स बदलें",
|
||||
"tips.note.dlc": "यह DLC है, गेम नहीं। पहले बेस गेम इंस्टॉल करें।",
|
||||
"tips.note.patch": "ये सिर्फ़ बैकपोर्ट फ़ाइलें हैं, पूरा गेम नहीं। अकेले इंस्टॉल नहीं होतीं।",
|
||||
"tips.note.package": "यह PS5 का फ़ेक PKG है। यह केवल फ़र्मवेयर 11.60 या पुराने पर इंस्टॉल होता है।",
|
||||
"tips.note.browserViking": "यह सोर्स PS5 ब्राउज़र में खुलता है। वेरिफ़िकेशन पूरा करें, फिर रुकें। Download या किसी विज्ञापन को न दबाएँ।",
|
||||
"tips.note.browserOther": "यह सोर्स PS5 ब्राउज़र में खुलता है और फिर फ़ाइल का लिंक माँगता है। हो सके तो सूची में ऊपर वाला सोर्स चुनें।",
|
||||
"tips.note.firmware": "इस वर्ज़न को फ़र्मवेयर {need} या नया चाहिए। अपना सेटिंग्स > सिस्टम > सिस्टम सॉफ़्टवेयर में देखें।",
|
||||
"tips.tip.firmware.title": "फ़र्मवेयर देखें",
|
||||
"tips.tip.firmware.body": "Base 8.xx को 8.xx या नया चाहिए। BackPort पुराने कंसोल के लिए है।",
|
||||
"tips.tip.fullGame.title": "पूरा गेम लें",
|
||||
"tips.tip.fullGame.body": "Base या BackPort, DLC या बैकपोर्ट फ़ाइलें नहीं।",
|
||||
"tips.tip.top.title": "ऊपर से शुरू करें",
|
||||
"tips.tip.top.body": "ऊपर के सोर्स सबसे अच्छे हैं।",
|
||||
"tips.tip.retry.title": "न चले? दूसरा सोर्स",
|
||||
"tips.tip.retry.body": "ज़्यादातर गेम के कई सोर्स हैं।",
|
||||
"units.gigabytes": "{n} GB",
|
||||
"units.megabytes": "{n} MB",
|
||||
"units.millions": "{n}M",
|
||||
|
||||
@@ -172,6 +172,8 @@
|
||||
"errors.fileChanged": "File berubah di server",
|
||||
"errors.interrupted": "Dihentikan saat aplikasi ditutup",
|
||||
"errors.linkGone": "Tautan unduhan tidak lagi berfungsi",
|
||||
"errors.notGameFile": "Host mengirim halaman web, bukan gamenya",
|
||||
"errors.pkgFirmware": "PKG palsu PS5 hanya bisa dipasang hingga firmware 11.60",
|
||||
"errors.missingParts": "Sumber ini kekurangan bagian",
|
||||
"errors.needsBrowser": "Sumber ini memerlukan browser web",
|
||||
"errors.noConnection": "Tidak ada koneksi ke server",
|
||||
@@ -317,6 +319,7 @@
|
||||
"language.name.de": "Jerman",
|
||||
"language.name.en": "English",
|
||||
"language.name.es": "Spanyol",
|
||||
"language.name.fa": "Bahasa Persia",
|
||||
"language.name.fr": "Perancis",
|
||||
"language.name.hi": "Hindi",
|
||||
"language.name.id": "Indonesia",
|
||||
@@ -343,6 +346,10 @@
|
||||
"search.resultsFor": "Hasil untuk \"{query}\"",
|
||||
"search.tryGenre": "Periksa ejaan, atau coba genre:",
|
||||
"settings.controller": "Kontroler",
|
||||
"settings.downloads": "Unduhan",
|
||||
"settings.speedLimit": "Batas kecepatan",
|
||||
"settings.speedLimitDetail": "Menyisakan bandwidth untuk perangkat lain. Pembaruan aplikasi tidak pernah dibatasi.",
|
||||
"settings.speedUnlimited": "Tanpa batas",
|
||||
"settings.title": "Pengaturan",
|
||||
"settings.vibration": "Getaran saat menjelajah",
|
||||
"settings.vibrationDetail": "Getaran ringan saat berpindah, memilih, dan kembali",
|
||||
@@ -359,6 +366,10 @@
|
||||
"sources.kind.archive": "Arsip",
|
||||
"sources.kind.image": "Citra game",
|
||||
"sources.kind.package": "Paket",
|
||||
"sources.kind.patch": "Hanya file backport, bukan game lengkap",
|
||||
"sources.status.dlc": "DLC: butuh game dasar",
|
||||
"sources.status.package": "PKG palsu PS5 hanya bisa dipasang hingga firmware 11.60",
|
||||
"sources.status.patch": "Butuh game dasar, tidak bisa dipasang sendiri",
|
||||
"sources.noDetails": "Tidak ada detail",
|
||||
"sources.parts": "{count, plural, other {# bagian}}",
|
||||
"sources.recommended": "Direkomendasikan",
|
||||
@@ -378,6 +389,27 @@
|
||||
"time.seconds": "{n} det",
|
||||
"toast.openDownloads": "Buka Unduhan",
|
||||
"toast.viewGame": "Lihat game",
|
||||
"tips.eyebrow": "Unduh",
|
||||
"tips.title": "Sebelum mengunduh",
|
||||
"tips.downloading": "Kamu mengunduh",
|
||||
"tips.about": "Tentang sumber ini",
|
||||
"tips.toggle": "Tips memilih sumber",
|
||||
"tips.continue": "Lanjut",
|
||||
"tips.changeSource": "Ganti sumber",
|
||||
"tips.note.dlc": "Ini DLC, bukan game-nya. Pasang game dasar dulu.",
|
||||
"tips.note.patch": "Ini hanya file backport, bukan game lengkap. Tidak bisa dipasang sendiri.",
|
||||
"tips.note.package": "Ini PKG palsu PS5. Hanya bisa dipasang di firmware 11.60 atau lebih lama.",
|
||||
"tips.note.browserViking": "Sumber ini terbuka di browser PS5. Selesaikan verifikasi, lalu tunggu. Jangan tekan Download atau iklan.",
|
||||
"tips.note.browserOther": "Sumber ini terbuka di browser PS5 lalu meminta tautan file. Kalau bisa, pilih sumber yang lebih atas.",
|
||||
"tips.note.firmware": "Versi ini butuh firmware {need} atau lebih baru. Cek milikmu di Pengaturan > Sistem > Perangkat Lunak Sistem.",
|
||||
"tips.tip.firmware.title": "Cek firmware",
|
||||
"tips.tip.firmware.body": "Base 8.xx butuh 8.xx ke atas. BackPort untuk konsol lama.",
|
||||
"tips.tip.fullGame.title": "Ambil game lengkap",
|
||||
"tips.tip.fullGame.body": "Base atau BackPort, bukan DLC atau file backport.",
|
||||
"tips.tip.top.title": "Mulai dari atas",
|
||||
"tips.tip.top.body": "Sumber teratas paling bagus.",
|
||||
"tips.tip.retry.title": "Gagal? Coba yang lain",
|
||||
"tips.tip.retry.body": "Kebanyakan game punya beberapa.",
|
||||
"units.gigabytes": "{n} GB",
|
||||
"units.megabytes": "{n} MB",
|
||||
"units.millions": "{n}J",
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
"browse.recentlyViewed": "Visti di recente",
|
||||
"browse.reviews": "{count} recensioni",
|
||||
"browse.viewGame": "Vedi gioco",
|
||||
"capture.capturing": "Completa la verifica e seleziona Download",
|
||||
"capture.detail": "Torna qui dopo aver selezionato Download. Il download parte da solo quando il file è verificato. L'acquisizione dura al massimo 3 minuti.",
|
||||
"capture.capturing": "Completa la verifica, poi aspetta",
|
||||
"capture.detail": "Non premere Download né le pubblicità: il link viene catturato da solo. Poi torna qui e il download parte in automatico. La cattura dura fino a 3 minuti.",
|
||||
"capture.preparing": "Preparazione della verifica del file…",
|
||||
"capture.title": "Verifica Vikingfile",
|
||||
"capture.validating": "Controllo del file acquisito…",
|
||||
@@ -178,6 +178,8 @@
|
||||
"errors.fileChanged": "Il file è cambiato sul server",
|
||||
"errors.interrupted": "Interrotto alla chiusura dell'app",
|
||||
"errors.linkGone": "Il link di download non funziona più",
|
||||
"errors.notGameFile": "L'host ha inviato una pagina web invece del gioco",
|
||||
"errors.pkgFirmware": "I fake PKG per PS5 si installano solo fino al firmware 11.60",
|
||||
"errors.missingParts": "In questa fonte mancano delle parti",
|
||||
"errors.needsBrowser": "Questa fonte richiede un browser web",
|
||||
"errors.noConnection": "Nessuna connessione al server",
|
||||
@@ -323,6 +325,7 @@
|
||||
"language.name.de": "Tedesco",
|
||||
"language.name.en": "Inglese",
|
||||
"language.name.es": "Spagnolo",
|
||||
"language.name.fa": "Persiano",
|
||||
"language.name.fr": "Francese",
|
||||
"language.name.hi": "Hindi",
|
||||
"language.name.id": "Indonesiano",
|
||||
@@ -349,6 +352,10 @@
|
||||
"search.resultsFor": "Risultati per “{query}”",
|
||||
"search.tryGenre": "Controlla l'ortografia, oppure prova un genere:",
|
||||
"settings.controller": "Controller",
|
||||
"settings.downloads": "Download",
|
||||
"settings.speedLimit": "Limite di velocità",
|
||||
"settings.speedLimitDetail": "Lascia banda agli altri dispositivi. Gli aggiornamenti dell'app non sono mai limitati.",
|
||||
"settings.speedUnlimited": "Illimitata",
|
||||
"settings.title": "Impostazioni",
|
||||
"settings.vibration": "Vibrazione durante la navigazione",
|
||||
"settings.vibrationDetail": "Un leggero impulso quando ti sposti, selezioni e torni indietro",
|
||||
@@ -365,6 +372,10 @@
|
||||
"sources.kind.archive": "Archivio",
|
||||
"sources.kind.image": "Immagine di gioco",
|
||||
"sources.kind.package": "Pacchetto",
|
||||
"sources.kind.patch": "Solo file di backport, non il gioco completo",
|
||||
"sources.status.dlc": "DLC: serve il gioco base",
|
||||
"sources.status.package": "I fake PKG per PS5 si installano solo fino al firmware 11.60",
|
||||
"sources.status.patch": "Serve il gioco base, da sola non si installa",
|
||||
"sources.noDetails": "Nessun dettaglio",
|
||||
"sources.parts": "{count, plural, one {# parte} other {# parti}}",
|
||||
"sources.recommended": "Consigliata",
|
||||
@@ -384,6 +395,27 @@
|
||||
"time.seconds": "{n} s",
|
||||
"toast.openDownloads": "Apri Download",
|
||||
"toast.viewGame": "Vedi gioco",
|
||||
"tips.eyebrow": "Download",
|
||||
"tips.title": "Prima di scaricare",
|
||||
"tips.downloading": "Stai scaricando",
|
||||
"tips.about": "Su questa fonte",
|
||||
"tips.toggle": "Consigli per scegliere la fonte",
|
||||
"tips.continue": "Continua",
|
||||
"tips.changeSource": "Cambia fonte",
|
||||
"tips.note.dlc": "Questo è un DLC, non il gioco. Installa prima il gioco base.",
|
||||
"tips.note.patch": "Questi sono solo file di backport, non il gioco completo. Da soli non si installano.",
|
||||
"tips.note.package": "Questo è un fake PKG per PS5. Si installa solo con firmware 11.60 o precedente.",
|
||||
"tips.note.browserViking": "Questa fonte si apre nel browser della PS5. Completa la verifica e aspetta. Non premere Download né le pubblicità.",
|
||||
"tips.note.browserOther": "Questa fonte si apre nel browser della PS5 e poi chiede il link del file. Se puoi, scegli una fonte più in alto nella lista.",
|
||||
"tips.note.firmware": "Questa versione richiede firmware {need} o successivo. Controlla il tuo in Impostazioni > Sistema > Software di sistema.",
|
||||
"tips.tip.firmware.title": "Guarda il firmware",
|
||||
"tips.tip.firmware.body": "Base 8.xx richiede 8.xx o più. BackPort è per console più vecchie.",
|
||||
"tips.tip.fullGame.title": "Prendi il gioco completo",
|
||||
"tips.tip.fullGame.body": "Base o BackPort, non DLC o file di backport.",
|
||||
"tips.tip.top.title": "Parti dall'alto",
|
||||
"tips.tip.top.body": "Le prime fonti funzionano meglio.",
|
||||
"tips.tip.retry.title": "Non va? Cambia fonte",
|
||||
"tips.tip.retry.body": "Quasi tutti i giochi ne hanno più di una.",
|
||||
"units.gigabytes": "{n} GB",
|
||||
"units.megabytes": "{n} MB",
|
||||
"units.millions": "{n} Mln",
|
||||
|
||||
@@ -172,6 +172,8 @@
|
||||
"errors.fileChanged": "サーバー上のファイルが変更されました",
|
||||
"errors.interrupted": "アプリの終了時に停止しました",
|
||||
"errors.linkGone": "ダウンロードリンクが無効です",
|
||||
"errors.notGameFile": "ホストがゲームではなくウェブページを送信しました",
|
||||
"errors.pkgFirmware": "PS5の偽PKGはファームウェア11.60までしかインストールできません",
|
||||
"errors.missingParts": "この入手元にはパートが足りません",
|
||||
"errors.needsBrowser": "この入手元にはWebブラウザが必要です",
|
||||
"errors.noConnection": "サーバーに接続できません",
|
||||
@@ -317,6 +319,7 @@
|
||||
"language.name.de": "ドイツ語",
|
||||
"language.name.en": "英語",
|
||||
"language.name.es": "スペイン語",
|
||||
"language.name.fa": "ペルシア語",
|
||||
"language.name.fr": "フランス語",
|
||||
"language.name.hi": "ヒンディー語",
|
||||
"language.name.id": "インドネシア語",
|
||||
@@ -343,6 +346,10 @@
|
||||
"search.resultsFor": "「{query}」の検索結果",
|
||||
"search.tryGenre": "スペルを確認するか、ジャンルから探してみてください:",
|
||||
"settings.controller": "コントローラー",
|
||||
"settings.downloads": "ダウンロード",
|
||||
"settings.speedLimit": "速度制限",
|
||||
"settings.speedLimitDetail": "ほかの機器に帯域を残します。アプリのアップデートは制限されません。",
|
||||
"settings.speedUnlimited": "無制限",
|
||||
"settings.title": "設定",
|
||||
"settings.vibration": "操作時の振動",
|
||||
"settings.vibrationDetail": "移動、選択、戻る操作のときに軽く振動します",
|
||||
@@ -359,6 +366,10 @@
|
||||
"sources.kind.archive": "アーカイブ",
|
||||
"sources.kind.image": "ゲームイメージ",
|
||||
"sources.kind.package": "パッケージ",
|
||||
"sources.kind.patch": "バックポート用ファイルのみ(ゲーム本体ではありません)",
|
||||
"sources.status.dlc": "DLC:本編が必要です",
|
||||
"sources.status.package": "PS5の偽PKGはファームウェア11.60までしかインストールできません",
|
||||
"sources.status.patch": "本編が必要です。単体ではインストールできません",
|
||||
"sources.noDetails": "詳細なし",
|
||||
"sources.parts": "{count, plural, other {#パート}}",
|
||||
"sources.recommended": "おすすめ",
|
||||
@@ -378,6 +389,27 @@
|
||||
"time.seconds": "{n}秒",
|
||||
"toast.openDownloads": "ダウンロードを開く",
|
||||
"toast.viewGame": "ゲームを見る",
|
||||
"tips.eyebrow": "ダウンロード",
|
||||
"tips.title": "ダウンロードの前に",
|
||||
"tips.downloading": "ダウンロードするもの",
|
||||
"tips.about": "このソースについて",
|
||||
"tips.toggle": "ソース選びのヒント",
|
||||
"tips.continue": "続ける",
|
||||
"tips.changeSource": "ソースを変更",
|
||||
"tips.note.dlc": "これはDLCで、ゲーム本体ではありません。先に本編をインストールしてください。",
|
||||
"tips.note.patch": "これはバックポート用ファイルのみで、ゲーム本体ではありません。単体ではインストールできません。",
|
||||
"tips.note.package": "これはPS5の偽PKGです。ファームウェア11.60以前でのみインストールできます。",
|
||||
"tips.note.browserViking": "このソースはPS5のブラウザで開きます。認証を完了して待ってください。Downloadボタンや広告は押さないでください。",
|
||||
"tips.note.browserOther": "このソースはPS5のブラウザで開き、ファイルのリンクを求められます。できればリストの上のソースを選んでください。",
|
||||
"tips.note.firmware": "このバージョンにはファームウェア{need}以降が必要です。設定 > システム > システムソフトウェアで確認してください。",
|
||||
"tips.tip.firmware.title": "ファームウェアを確認",
|
||||
"tips.tip.firmware.body": "Base 8.xxは8.xx以降が必要。BackPortは古い本体向け。",
|
||||
"tips.tip.fullGame.title": "ゲーム本体を選ぶ",
|
||||
"tips.tip.fullGame.body": "BaseかBackPort。DLCやバックポート用ファイルは不可。",
|
||||
"tips.tip.top.title": "上から選ぶ",
|
||||
"tips.tip.top.body": "上のソースほどおすすめです。",
|
||||
"tips.tip.retry.title": "失敗したら別のソース",
|
||||
"tips.tip.retry.body": "多くのゲームに複数あります。",
|
||||
"units.gigabytes": "{n} GB",
|
||||
"units.megabytes": "{n} MB",
|
||||
"units.millions": "{n}M",
|
||||
|
||||
@@ -172,6 +172,8 @@
|
||||
"errors.fileChanged": "O arquivo mudou no servidor",
|
||||
"errors.interrupted": "Interrompido quando o app fechou",
|
||||
"errors.linkGone": "Link de download não funciona mais",
|
||||
"errors.notGameFile": "O servidor enviou uma página da web em vez do jogo",
|
||||
"errors.pkgFirmware": "PKGs falsos de PS5 só instalam até o firmware 11.60",
|
||||
"errors.missingParts": "Faltam partes nesta fonte",
|
||||
"errors.needsBrowser": "Esta fonte precisa de navegador web",
|
||||
"errors.noConnection": "Sem conexão com o servidor",
|
||||
@@ -317,6 +319,7 @@
|
||||
"language.name.de": "Alemão",
|
||||
"language.name.en": "English",
|
||||
"language.name.es": "Español",
|
||||
"language.name.fa": "Persa",
|
||||
"language.name.fr": "Français",
|
||||
"language.name.hi": "Hindi",
|
||||
"language.name.id": "Indonésio",
|
||||
@@ -343,6 +346,10 @@
|
||||
"search.resultsFor": "Resultados para “{query}”",
|
||||
"search.tryGenre": "Verifique a ortografia ou tente um gênero:",
|
||||
"settings.controller": "Controle",
|
||||
"settings.downloads": "Downloads",
|
||||
"settings.speedLimit": "Limite de velocidade",
|
||||
"settings.speedLimitDetail": "Deixa banda para outros dispositivos. Atualizações do app nunca são limitadas.",
|
||||
"settings.speedUnlimited": "Ilimitado",
|
||||
"settings.title": "Configurações",
|
||||
"settings.vibration": "Vibração ao navegar",
|
||||
"settings.vibrationDetail": "Um pulso leve ao mover, selecionar e voltar",
|
||||
@@ -359,6 +366,10 @@
|
||||
"sources.kind.archive": "Arquivo",
|
||||
"sources.kind.image": "Imagem de jogo",
|
||||
"sources.kind.package": "Pacote",
|
||||
"sources.kind.patch": "Só arquivos de backport, não o jogo completo",
|
||||
"sources.status.dlc": "DLC: precisa do jogo base",
|
||||
"sources.status.package": "PKGs falsos de PS5 só instalam até o firmware 11.60",
|
||||
"sources.status.patch": "Precisa do jogo base, não instala sozinho",
|
||||
"sources.noDetails": "Sem detalhes",
|
||||
"sources.parts": "{count, plural, one {# parte} many {# milhões de partes} other {# partes}}",
|
||||
"sources.recommended": "Recomendado",
|
||||
@@ -378,6 +389,27 @@
|
||||
"time.seconds": "{n} s",
|
||||
"toast.openDownloads": "Abrir Downloads",
|
||||
"toast.viewGame": "Ver jogo",
|
||||
"tips.eyebrow": "Download",
|
||||
"tips.title": "Antes de baixar",
|
||||
"tips.downloading": "Você está baixando",
|
||||
"tips.about": "Sobre esta fonte",
|
||||
"tips.toggle": "Dicas para escolher a fonte",
|
||||
"tips.continue": "Continuar",
|
||||
"tips.changeSource": "Trocar fonte",
|
||||
"tips.note.dlc": "Isto é um DLC, não o jogo. Instale o jogo base primeiro.",
|
||||
"tips.note.patch": "São só arquivos de backport, não o jogo completo. Sozinhos não instalam.",
|
||||
"tips.note.package": "Isto é um PKG falso de PS5. Só instala no firmware 11.60 ou anterior.",
|
||||
"tips.note.browserViking": "Esta fonte abre no navegador do PS5. Conclua a verificação e aguarde. Não aperte Download nem anúncios.",
|
||||
"tips.note.browserOther": "Esta fonte abre no navegador do PS5 e depois pede o link do arquivo. Se puder, escolha uma fonte mais acima.",
|
||||
"tips.note.firmware": "Esta versão requer firmware {need} ou mais recente. Confira o seu em Configurações > Sistema > Software do sistema.",
|
||||
"tips.tip.firmware.title": "Veja o firmware",
|
||||
"tips.tip.firmware.body": "Base 8.xx requer 8.xx ou mais. BackPort é para consoles antigos.",
|
||||
"tips.tip.fullGame.title": "Pegue o jogo completo",
|
||||
"tips.tip.fullGame.body": "Base ou BackPort, não DLC nem arquivos de backport.",
|
||||
"tips.tip.top.title": "Comece pelo topo",
|
||||
"tips.tip.top.body": "As primeiras fontes funcionam melhor.",
|
||||
"tips.tip.retry.title": "Falhou? Tente outra",
|
||||
"tips.tip.retry.body": "A maioria dos jogos tem várias.",
|
||||
"units.gigabytes": "{n} GB",
|
||||
"units.megabytes": "{n} MB",
|
||||
"units.millions": "{n}M",
|
||||
@@ -413,7 +445,7 @@
|
||||
"versions.title": "Escolher versão",
|
||||
"capture.title": "Verificação do Vikingfile",
|
||||
"capture.preparing": "Preparando a verificação do arquivo…",
|
||||
"capture.capturing": "Passe a verificação e aperte Download",
|
||||
"capture.capturing": "Conclua a verificação e aguarde",
|
||||
"capture.validating": "Conferindo o arquivo capturado…",
|
||||
"capture.detail": "Volte aqui após apertar Download. O download começa automaticamente quando o arquivo é validado. A captura dura até 3 minutos."
|
||||
"capture.detail": "Não aperte Download nem anúncios: o link é capturado sozinho. Depois volte aqui e o download começa automaticamente. A captura dura até 3 minutos."
|
||||
}
|
||||
@@ -172,6 +172,8 @@
|
||||
"errors.fileChanged": "Файл изменился на сервере",
|
||||
"errors.interrupted": "Остановлено при закрытии приложения",
|
||||
"errors.linkGone": "Ссылка на загрузку больше не работает",
|
||||
"errors.notGameFile": "Хостинг прислал веб-страницу вместо игры",
|
||||
"errors.pkgFirmware": "Фейковые PKG для PS5 ставятся только до прошивки 11.60",
|
||||
"errors.missingParts": "В этом источнике не хватает частей",
|
||||
"errors.needsBrowser": "Этот источник требует веб-браузер",
|
||||
"errors.noConnection": "Нет соединения с сервером",
|
||||
@@ -317,6 +319,7 @@
|
||||
"language.name.de": "Немецкий",
|
||||
"language.name.en": "English",
|
||||
"language.name.es": "Испанский",
|
||||
"language.name.fa": "Персидский",
|
||||
"language.name.fr": "Французский",
|
||||
"language.name.hi": "Хинди",
|
||||
"language.name.id": "Индонезийский",
|
||||
@@ -343,6 +346,10 @@
|
||||
"search.resultsFor": "Результаты для \"{query}\"",
|
||||
"search.tryGenre": "Проверьте орфографию или попробуйте жанр:",
|
||||
"settings.controller": "Геймпад",
|
||||
"settings.downloads": "Загрузки",
|
||||
"settings.speedLimit": "Ограничение скорости",
|
||||
"settings.speedLimitDetail": "Оставляет канал другим устройствам. Обновления приложения не ограничиваются.",
|
||||
"settings.speedUnlimited": "Без лимита",
|
||||
"settings.title": "Настройки",
|
||||
"settings.vibration": "Вибрация при навигации",
|
||||
"settings.vibrationDetail": "Лёгкий отклик при перемещении, выборе и возврате",
|
||||
@@ -359,6 +366,10 @@
|
||||
"sources.kind.archive": "Архив",
|
||||
"sources.kind.image": "Образ игры",
|
||||
"sources.kind.package": "Пакет",
|
||||
"sources.kind.patch": "Только файлы бэкпорта, не полная игра",
|
||||
"sources.status.dlc": "DLC: нужна базовая игра",
|
||||
"sources.status.package": "Фейковые PKG для PS5 ставятся только до прошивки 11.60",
|
||||
"sources.status.patch": "Нужна базовая игра, отдельно не ставится",
|
||||
"sources.noDetails": "Нет деталей",
|
||||
"sources.parts": "{count, plural, one {# часть} few {# части} many {# частей} other {# частей}}",
|
||||
"sources.recommended": "Рекомендуемый",
|
||||
@@ -378,6 +389,27 @@
|
||||
"time.seconds": "{n} с",
|
||||
"toast.openDownloads": "Открыть Загрузки",
|
||||
"toast.viewGame": "Просмотреть игру",
|
||||
"tips.eyebrow": "Загрузка",
|
||||
"tips.title": "Перед загрузкой",
|
||||
"tips.downloading": "Вы скачиваете",
|
||||
"tips.about": "Об этом источнике",
|
||||
"tips.toggle": "Советы по выбору источника",
|
||||
"tips.continue": "Продолжить",
|
||||
"tips.changeSource": "Сменить источник",
|
||||
"tips.note.dlc": "Это DLC, а не игра. Сначала установите основную игру.",
|
||||
"tips.note.patch": "Это только файлы бэкпорта, а не полная игра. Отдельно они не устанавливаются.",
|
||||
"tips.note.package": "Это фейковый PKG для PS5. Он ставится только на прошивке 11.60 и ниже.",
|
||||
"tips.note.browserViking": "Этот источник откроется в браузере PS5. Пройдите проверку и подождите. Не нажимайте Download и рекламу.",
|
||||
"tips.note.browserOther": "Этот источник откроется в браузере PS5 и затем попросит ссылку на файл. Если можете, выберите источник выше в списке.",
|
||||
"tips.note.firmware": "Этой версии нужна прошивка {need} или новее. Свою смотрите в Настройки > Система > Системное ПО.",
|
||||
"tips.tip.firmware.title": "Проверьте прошивку",
|
||||
"tips.tip.firmware.body": "Base 8.xx — нужна 8.xx и новее. BackPort — для старых консолей.",
|
||||
"tips.tip.fullGame.title": "Берите полную игру",
|
||||
"tips.tip.fullGame.body": "Base или BackPort, не DLC и не файлы бэкпорта.",
|
||||
"tips.tip.top.title": "Начните сверху",
|
||||
"tips.tip.top.body": "Первые источники работают лучше.",
|
||||
"tips.tip.retry.title": "Ошибка? Другой источник",
|
||||
"tips.tip.retry.body": "У большинства игр их несколько.",
|
||||
"units.gigabytes": "{n} ГБ",
|
||||
"units.megabytes": "{n} МБ",
|
||||
"units.millions": "{n}M",
|
||||
|
||||
@@ -172,6 +172,8 @@
|
||||
"errors.fileChanged": "فائل سرور پر بدل گئی",
|
||||
"errors.interrupted": "ایپ بند ہونے پر روک دی گئی",
|
||||
"errors.linkGone": "ڈاؤن لوڈ لنک اب کام نہیں کرتی",
|
||||
"errors.notGameFile": "ہوسٹ نے گیم کے بجائے ویب پیج بھیجا",
|
||||
"errors.pkgFirmware": "PS5 کے جعلی PKG صرف فرم ویئر 11.60 تک انسٹال ہوتے ہیں",
|
||||
"errors.missingParts": "اس ذریعے میں حصے کم ہیں",
|
||||
"errors.needsBrowser": "اس ذریعے کو ویب براؤزر کی ضرورت ہے",
|
||||
"errors.noConnection": "سرور سے کوئی رابطہ نہیں",
|
||||
@@ -317,6 +319,7 @@
|
||||
"language.name.de": "جرمن",
|
||||
"language.name.en": "انگریزی",
|
||||
"language.name.es": "ہسپانوی",
|
||||
"language.name.fa": "فارسی",
|
||||
"language.name.fr": "فرانسیسی",
|
||||
"language.name.hi": "ہندی",
|
||||
"language.name.id": "انڈونیشین",
|
||||
@@ -343,6 +346,10 @@
|
||||
"search.resultsFor": "\"{query}\" کے نتائج",
|
||||
"search.tryGenre": "ہجے کی جانچ کریں، یا کوئی صنف کوشش کریں:",
|
||||
"settings.controller": "کنٹرولر",
|
||||
"settings.downloads": "ڈاؤن لوڈز",
|
||||
"settings.speedLimit": "رفتار کی حد",
|
||||
"settings.speedLimitDetail": "دوسرے آلات کے لیے بینڈوڈتھ چھوڑتا ہے۔ ایپ اپڈیٹس کبھی محدود نہیں ہوتیں۔",
|
||||
"settings.speedUnlimited": "لامحدود",
|
||||
"settings.title": "ترتیبات",
|
||||
"settings.vibration": "براؤز کرتے وقت وائبریشن",
|
||||
"settings.vibrationDetail": "حرکت، انتخاب اور واپس جانے پر ہلکی سی وائبریشن",
|
||||
@@ -359,6 +366,10 @@
|
||||
"sources.kind.archive": "آرکائیو",
|
||||
"sources.kind.image": "گیم کی تصویر",
|
||||
"sources.kind.package": "پیکج",
|
||||
"sources.kind.patch": "صرف بیک پورٹ فائلیں، مکمل گیم نہیں",
|
||||
"sources.status.dlc": "DLC: بنیادی گیم درکار ہے",
|
||||
"sources.status.package": "PS5 کے جعلی PKG صرف فرم ویئر 11.60 تک انسٹال ہوتے ہیں",
|
||||
"sources.status.patch": "بنیادی گیم درکار ہے، اکیلے انسٹال نہیں ہوتا",
|
||||
"sources.noDetails": "کوئی تفصیلات نہیں",
|
||||
"sources.parts": "{count, plural, one {# حصہ} other {# حصے}}",
|
||||
"sources.recommended": "سفارش کی جاتی ہے",
|
||||
@@ -378,6 +389,27 @@
|
||||
"time.seconds": "{n} سیکنڈ",
|
||||
"toast.openDownloads": "ڈاؤن لوڈز کھولیں",
|
||||
"toast.viewGame": "گیم دیکھیں",
|
||||
"tips.eyebrow": "ڈاؤن لوڈ",
|
||||
"tips.title": "ڈاؤن لوڈ سے پہلے",
|
||||
"tips.downloading": "آپ ڈاؤن لوڈ کر رہے ہیں",
|
||||
"tips.about": "اس سورس کے بارے میں",
|
||||
"tips.toggle": "سورس چننے کے مشورے",
|
||||
"tips.continue": "جاری رکھیں",
|
||||
"tips.changeSource": "سورس بدلیں",
|
||||
"tips.note.dlc": "یہ DLC ہے، گیم نہیں۔ پہلے بنیادی گیم انسٹال کریں۔",
|
||||
"tips.note.patch": "یہ صرف بیک پورٹ فائلیں ہیں، مکمل گیم نہیں۔ اکیلے انسٹال نہیں ہوتیں۔",
|
||||
"tips.note.package": "یہ PS5 کا جعلی PKG ہے۔ صرف فرم ویئر 11.60 یا پرانے پر انسٹال ہوتا ہے۔",
|
||||
"tips.note.browserViking": "یہ سورس PS5 براؤزر میں کھلتا ہے۔ تصدیق مکمل کریں، پھر انتظار کریں۔ Download یا کسی اشتہار کو نہ دبائیں۔",
|
||||
"tips.note.browserOther": "یہ سورس PS5 براؤزر میں کھلتا ہے اور پھر فائل کا لنک مانگتا ہے۔ ہو سکے تو فہرست میں اوپر والا سورس چنیں۔",
|
||||
"tips.note.firmware": "اس ورژن کو فرم ویئر {need} یا نیا درکار ہے۔ اپنا ترتیبات > سسٹم > سسٹم سافٹ ویئر میں دیکھیں۔",
|
||||
"tips.tip.firmware.title": "فرم ویئر دیکھیں",
|
||||
"tips.tip.firmware.body": "Base 8.xx کو 8.xx یا نیا چاہیے۔ BackPort پرانے کنسولز کے لیے ہے۔",
|
||||
"tips.tip.fullGame.title": "مکمل گیم لیں",
|
||||
"tips.tip.fullGame.body": "Base یا BackPort، DLC یا بیک پورٹ فائلیں نہیں۔",
|
||||
"tips.tip.top.title": "اوپر سے شروع کریں",
|
||||
"tips.tip.top.body": "پہلے سورس سب سے بہتر ہیں۔",
|
||||
"tips.tip.retry.title": "ناکام؟ دوسرا سورس",
|
||||
"tips.tip.retry.body": "زیادہ تر گیمز کے کئی سورس ہیں۔",
|
||||
"units.gigabytes": "{n} GB",
|
||||
"units.megabytes": "{n} MB",
|
||||
"units.millions": "{n}M",
|
||||
|
||||
@@ -172,6 +172,8 @@
|
||||
"errors.fileChanged": "服务器上的文件已更改",
|
||||
"errors.interrupted": "应用关闭时已停止",
|
||||
"errors.linkGone": "下载链接已失效",
|
||||
"errors.notGameFile": "托管网站发送的是网页而不是游戏",
|
||||
"errors.pkgFirmware": "PS5 伪 PKG 仅能在 11.60 及以下固件安装",
|
||||
"errors.missingParts": "此来源缺少部分文件",
|
||||
"errors.needsBrowser": "此来源需要网页浏览器",
|
||||
"errors.noConnection": "无法连接到服务器",
|
||||
@@ -317,6 +319,7 @@
|
||||
"language.name.de": "德语",
|
||||
"language.name.en": "英语",
|
||||
"language.name.es": "西班牙语",
|
||||
"language.name.fa": "波斯语",
|
||||
"language.name.fr": "法语",
|
||||
"language.name.hi": "印地语",
|
||||
"language.name.id": "印度尼西亚语",
|
||||
@@ -343,6 +346,10 @@
|
||||
"search.resultsFor": "“{query}”的搜索结果",
|
||||
"search.tryGenre": "请检查拼写,或试试某个类型:",
|
||||
"settings.controller": "手柄",
|
||||
"settings.downloads": "下载",
|
||||
"settings.speedLimit": "限速",
|
||||
"settings.speedLimitDetail": "为其他设备保留带宽。应用更新始终不限速。",
|
||||
"settings.speedUnlimited": "不限速",
|
||||
"settings.title": "设置",
|
||||
"settings.vibration": "浏览时振动",
|
||||
"settings.vibrationDetail": "移动、选择和返回时轻微振动",
|
||||
@@ -359,6 +366,10 @@
|
||||
"sources.kind.archive": "压缩包",
|
||||
"sources.kind.image": "游戏镜像",
|
||||
"sources.kind.package": "安装包",
|
||||
"sources.kind.patch": "仅含移植补丁文件,不是完整游戏",
|
||||
"sources.status.dlc": "DLC:需要本体游戏",
|
||||
"sources.status.package": "PS5 伪 PKG 仅能在 11.60 及以下固件安装",
|
||||
"sources.status.patch": "需要本体游戏,无法单独安装",
|
||||
"sources.noDetails": "无详情",
|
||||
"sources.parts": "{count, plural, other {# 个部分}}",
|
||||
"sources.recommended": "推荐",
|
||||
@@ -378,6 +389,27 @@
|
||||
"time.seconds": "{n} 秒",
|
||||
"toast.openDownloads": "打开下载",
|
||||
"toast.viewGame": "查看游戏",
|
||||
"tips.eyebrow": "下载",
|
||||
"tips.title": "下载之前",
|
||||
"tips.downloading": "你正在下载",
|
||||
"tips.about": "关于此来源",
|
||||
"tips.toggle": "选择来源的提示",
|
||||
"tips.continue": "继续",
|
||||
"tips.changeSource": "更换来源",
|
||||
"tips.note.dlc": "这是 DLC,不是游戏本体。请先安装本体游戏。",
|
||||
"tips.note.patch": "这只是移植补丁文件,不是完整游戏,无法单独安装。",
|
||||
"tips.note.package": "这是 PS5 伪 PKG,只能在 11.60 或更早的固件上安装。",
|
||||
"tips.note.browserViking": "此来源会在 PS5 浏览器中打开。完成验证后请等待,不要点击 Download 或任何广告。",
|
||||
"tips.note.browserOther": "此来源会在 PS5 浏览器中打开,之后会要求输入文件链接。如可以,请选择列表中更靠前的来源。",
|
||||
"tips.note.firmware": "此版本需要 {need} 或更新的固件。请在 设置 > 系统 > 系统软件 中查看你的版本。",
|
||||
"tips.tip.firmware.title": "检查固件",
|
||||
"tips.tip.firmware.body": "Base 8.xx 需要 8.xx 或更新。BackPort 适用于旧主机。",
|
||||
"tips.tip.fullGame.title": "选择完整游戏",
|
||||
"tips.tip.fullGame.body": "选 Base 或 BackPort,不要 DLC 或移植补丁文件。",
|
||||
"tips.tip.top.title": "从顶部开始",
|
||||
"tips.tip.top.body": "靠前的来源效果最好。",
|
||||
"tips.tip.retry.title": "失败?换个来源",
|
||||
"tips.tip.retry.body": "大多数游戏都有多个来源。",
|
||||
"units.gigabytes": "{n} GB",
|
||||
"units.megabytes": "{n} MB",
|
||||
"units.millions": "{n}M",
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
// ../pub-game-store/native/state/download-queue.js
|
||||
// reconstructed from the esbuild bundle in eboot.bin
|
||||
// MODIFIED: an Archive.org refusal fails over or fails as a dead link instead of asking for the browser.
|
||||
// MODIFIED: an archive the catalog's password doesn't open is tried with the known release passwords.
|
||||
|
||||
import { INCOMPLETE_PART, STALE_PARTIAL, cause } from '../downloads/errors.js';
|
||||
import { t } from '../i18n/core.js';
|
||||
import { archivePassword } from './archive-password.js';
|
||||
import { BrowserRequired, archiveRefusal, cancellation, createSourceResolver, sourceKind, webURL } from './download-sources.js';
|
||||
import { PKG_FIRMWARE_ERROR, fakePackagesInstall, isPs5Title } from './firmware.js';
|
||||
import { readJSON } from './read-json.js';
|
||||
import { mountedImages, shadowRequest, within2 } from './shadowmount.js';
|
||||
import { MARGIN2, spaceShortfall, stillNeeded } from './space.js';
|
||||
@@ -17,6 +19,13 @@ import { VIKING_PREFIX, capturedVikingFile, describeVikingCapture, linkPageMetad
|
||||
var ADOPTED = "A partial download from another source holds this name. Resume it from its original source, or delete it in Files.";
|
||||
var DELETED = "Its partial files were deleted. Restart to download it again, or remove it.";
|
||||
var REMOVAL_CUT = "The app closed while deleting its files. Delete it again.";
|
||||
// The passwords the catalog's archives are published with. Some entries name none or the wrong one,
|
||||
// so after the catalog's own (or none) these are tried in turn. A wrong or missing password is caught
|
||||
// on the archive's headers before anything is written ("RAR archive password is missing.",
|
||||
// "Incorrect RAR archive password.", "Incorrect RAR5 archive password."), and a failed attempt leaves
|
||||
// no staging behind, so each one costs a moment. They are checked on the console: nothing counts them.
|
||||
var KNOWN_PASSWORDS = ["DLPSGAME.COM", "[DLPSGAME.COM]", "www.DLPSGAME.COM", "SuperPSX", "downloadgameps3.com", "hako"];
|
||||
var PASSWORD_FAILURE = /archive password|passphrase/i;
|
||||
function durable(fs, stateDir2) {
|
||||
try {
|
||||
fs.mkdir(stateDir2, { recursive: true });
|
||||
@@ -212,7 +221,10 @@ import { VIKING_PREFIX, capturedVikingFile, describeVikingCapture, linkPageMetad
|
||||
notifications.show(t("downloads.notice.installed"), job2.title);
|
||||
} catch (error2) {
|
||||
job2.state = "installer-required";
|
||||
job2.error = error2.message;
|
||||
// The install is always tried: the firmware the title is told can be raised by the jailbreak.
|
||||
// Refused where it reads above 11.60 (an archive can turn out to hold a PKG, issue #6), the
|
||||
// likely reason is said instead of the service's code; a full drive still reads as one.
|
||||
job2.error = isPs5Title(job2.gameId) && !fakePackagesInstall() && !/space/i.test(error2.message) ? PKG_FIRMWARE_ERROR : error2.message;
|
||||
job2.message = t("downloads.installFailed");
|
||||
}
|
||||
job2.bytesPerSecond = 0;
|
||||
@@ -365,6 +377,10 @@ import { VIKING_PREFIX, capturedVikingFile, describeVikingCapture, linkPageMetad
|
||||
if (!archives?.inspect) return;
|
||||
const { kind, refusal } = archives.inspect([job2.downloadDestination]);
|
||||
if (refusal) throw new Error(refusal);
|
||||
// A source listed without a format is kept only for what its headers turn out to be: when they
|
||||
// are none Overdrive knows, the host sent something else, usually a web page. Leaving it as a
|
||||
// downloaded ".binary" (issue #8) told the user nothing.
|
||||
if (!kind && job2.release.format === "binary") throw new Error("Not a game file: the host sent something else.");
|
||||
if (!kind) return;
|
||||
const artifact2 = formats.detected(job2.release, job2.root, kind);
|
||||
if (artifact2.nextAction === "extraction-required") {
|
||||
@@ -400,6 +416,25 @@ import { VIKING_PREFIX, capturedVikingFile, describeVikingCapture, linkPageMetad
|
||||
}
|
||||
return null;
|
||||
}
|
||||
// The extractor writes files 0666, without execute: ShadowMount mounts the folder, but its
|
||||
// eboot.bin won't launch (CE-107750-0, issue #11) until everything is opened up, as the updater
|
||||
// does for Overdrive's own folder. A frame every 256 entries keeps a large game from stalling the UI.
|
||||
async function openUp(path) {
|
||||
let count = 0;
|
||||
const visit = async (dir2) => {
|
||||
fs.chmod(dir2, 511);
|
||||
for (const entry2 of fs.readDir(dir2)) {
|
||||
if (++count % 256 === 0) await wait(0);
|
||||
if (entry2.isDirectory) await visit(`${dir2}/${entry2.name}`);
|
||||
else fs.chmod(`${dir2}/${entry2.name}`, 511);
|
||||
}
|
||||
};
|
||||
try {
|
||||
await visit(path);
|
||||
} catch (error2) {
|
||||
console.log("[download-queue] permissions not opened up:", error2.message);
|
||||
}
|
||||
}
|
||||
function extraction(job2, files) {
|
||||
if (!archives) throw new Error("Archive extraction requires the updated PS5 React runtime.");
|
||||
if (releasesOf) {
|
||||
@@ -480,7 +515,8 @@ import { VIKING_PREFIX, capturedVikingFile, describeVikingCapture, linkPageMetad
|
||||
const outcome = await streamed.done;
|
||||
off();
|
||||
if (outcome.error && (job2.state === "pausing" || job2.cancelling)) throw outcome.error;
|
||||
if (outcome.error && !STREAM_FAILURE.test(cause(outcome.error.message))) throw outcome.error;
|
||||
// A password the stream couldn't use gets the known ones below, once every volume is here.
|
||||
if (outcome.error && !STREAM_FAILURE.test(cause(outcome.error.message)) && !PASSWORD_FAILURE.test(cause(outcome.error.message))) throw outcome.error;
|
||||
if (outcome.error) {
|
||||
console.log("[download-queue] extraction during download stopped, extracting again:", outcome.error.message);
|
||||
job2.written = 0;
|
||||
@@ -493,13 +529,24 @@ import { VIKING_PREFIX, capturedVikingFile, describeVikingCapture, linkPageMetad
|
||||
if (!result) {
|
||||
if (!fs.exists(job2.output) && fs.diskUsage(job2.root).free < (estimate || 0) + MARGIN2)
|
||||
throw new Error("Not enough space to extract this download. Free space and retry.");
|
||||
const task = archives.extract(options);
|
||||
active2.task = task;
|
||||
const off = task.subscribe(follow);
|
||||
try {
|
||||
result = await task.done;
|
||||
} finally {
|
||||
off();
|
||||
const { password: listed, ...unlocked } = options;
|
||||
const passwords = [listed, ...KNOWN_PASSWORDS.filter((password) => password !== listed)];
|
||||
for (let index = 0; !result; index++) {
|
||||
const task = archives.extract(passwords[index] === void 0 ? unlocked : { ...unlocked, password: passwords[index] });
|
||||
active2.task = task;
|
||||
const off = task.subscribe(follow);
|
||||
try {
|
||||
result = await task.done;
|
||||
} catch (error2) {
|
||||
const last = index + 1 >= passwords.length;
|
||||
if (last || job2.state === "pausing" || job2.cancelling || !PASSWORD_FAILURE.test(cause(error2.message))) throw error2;
|
||||
console.log(`[download-queue] archive password ${index + 1} of ${passwords.length} did not open it, trying the next`);
|
||||
job2.written = 0;
|
||||
sample = { at: Date.now(), bytes: 0 };
|
||||
emit2();
|
||||
} finally {
|
||||
off();
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (error2) {
|
||||
@@ -541,6 +588,7 @@ import { VIKING_PREFIX, capturedVikingFile, describeVikingCapture, linkPageMetad
|
||||
storageIdentity(job2);
|
||||
fs.rename(folder, destination);
|
||||
if (folder !== job2.output) await fs.removeAsync(job2.output);
|
||||
await openUp(destination);
|
||||
job2.output = destination;
|
||||
job2.publishTo = destination;
|
||||
job2.artifact.nextAction = "shadowmount";
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
import { DeviceInfo } from '@ps5-react/core';
|
||||
|
||||
// Fake PKGs install only up to this firmware; above it the system refuses them, after the whole
|
||||
// download (issues #6 and #17). Version strings read like "13.200.001": major and two minor digits.
|
||||
// What the title is told can be raised by the jailbreak (a console showing 13.20 in System Software
|
||||
// reported 13.59), so the version only warns and explains a refusal; it never hides a source.
|
||||
var LAST_PKG_FIRMWARE = [11, 60];
|
||||
var PKG_FIRMWARE_ERROR = "PS5 fake PKGs install only on firmware 11.60 or older. Choose another source.";
|
||||
var PKG_FORMATS = /* @__PURE__ */ new Set(["pkg", "fpkg"]);
|
||||
function firmwareVersion() {
|
||||
let text;
|
||||
try {
|
||||
text = DeviceInfo.get().firmware;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
const match = /(\d+)\.(\d{2})/.exec(text || "");
|
||||
return match ? [Number(match[1]), Number(match[2])] : null;
|
||||
}
|
||||
// The console's firmware for display ("13.20"), or null where it can't be read.
|
||||
function consoleFirmware() {
|
||||
const version = firmwareVersion();
|
||||
return version ? { major: version[0], text: `${version[0]}.${String(version[1]).padStart(2, "0")}` } : null;
|
||||
}
|
||||
// Unknown firmware (the desktop preview, an old runtime) counts as one that installs them.
|
||||
function fakePackagesInstall() {
|
||||
const version = firmwareVersion();
|
||||
if (!version) return true;
|
||||
const [major, minor] = version, [lastMajor, lastMinor] = LAST_PKG_FIRMWARE;
|
||||
return major < lastMajor || major === lastMajor && minor <= lastMinor;
|
||||
}
|
||||
var isPackage = (release) => PKG_FORMATS.has(release.format);
|
||||
// PS4 fake PKGs install on the PS5's later firmware too; the 11.60 limit is for PS5 ones (Orbit
|
||||
// Store's notes say the same). The title ID tells them apart; the filename starts with it too.
|
||||
var isPs5Title = (titleId) => /^PPSA/i.test(titleId || "");
|
||||
var isPs5Package = (release) => isPackage(release) && isPs5Title(release.titleId || release.filename);
|
||||
|
||||
export { PKG_FIRMWARE_ERROR, consoleFirmware, fakePackagesInstall, isPackage, isPs5Package, isPs5Title };
|
||||
@@ -1,5 +1,6 @@
|
||||
// ../pub-game-store/native/state/install-location.js
|
||||
// reconstructed from the esbuild bundle in eboot.bin
|
||||
// MODIFIED: the fallback finds the image under its released name, Overdrive.exfat, too.
|
||||
|
||||
|
||||
var SHADOWMOUNT = "http://127.0.0.1:10101/api/v1/games/info";
|
||||
@@ -33,7 +34,8 @@
|
||||
if (type === "image" && path.endsWith(".exfat")) return { image: path };
|
||||
throw new Error(`ShadowMount runs Overdrive from ${path}, an install of type ${type}`);
|
||||
}
|
||||
var imagesIn = ({ fs, dir: dir2, title }) => fs.exists(dir2) ? fs.readDir(dir2).filter((entry2) => !entry2.isDirectory && new RegExp(`^Overdrive-${title}.*\\.exfat$`, "i").test(entry2.name)).map((entry2) => ({ image: `${dir2}/${entry2.name}` })) : [];
|
||||
// Overdrive.exfat as released, or Overdrive-PPSA99058….exfat from before the rename.
|
||||
var imagesIn = ({ fs, dir: dir2, title }) => fs.exists(dir2) ? fs.readDir(dir2).filter((entry2) => !entry2.isDirectory && new RegExp(`^Overdrive(?:-${title})?\\b.*\\.exfat$`, "i").test(entry2.name)).map((entry2) => ({ image: `${dir2}/${entry2.name}` })) : [];
|
||||
function inHomebrew({ fs, roots, title }) {
|
||||
const found = roots().flatMap((root2) => [
|
||||
...fs.exists(`${root2}/homebrew/${title}/eboot.bin`) ? [{ installDir: `${root2}/homebrew/${title}` }] : [],
|
||||
|
||||
@@ -12,7 +12,10 @@ import { releaseSets } from './release-sets.js';
|
||||
if (!releases) {
|
||||
const parsed = JSON.parse(read(file));
|
||||
if (!Array.isArray(parsed)) throw new Error("Invalid release data; rebuild the catalog.");
|
||||
releases = releaseSets(parsed);
|
||||
// Each source carries its game's title ID (CUSA for PS4, PPSA for PS5): the firmware limit on
|
||||
// fake PKGs is the PS5's alone, and a source never says which console it is for.
|
||||
const titleId = /([a-z0-9]+)\.json$/i.exec(file)[1].toUpperCase();
|
||||
releases = releaseSets(parsed.map((release) => ({ ...release, titleId })));
|
||||
if (games2.size === KEPT2) games2.delete(games2.keys().next().value);
|
||||
}
|
||||
games2.delete(file);
|
||||
|
||||
@@ -12,7 +12,15 @@ import { archivePassword } from './archive-password.js';
|
||||
return `${(first >>> 0).toString(16)}${(second >>> 0).toString(16)}`;
|
||||
}
|
||||
var hostKey = (provider) => provider.toLowerCase().replace(/^www\./, "").replace(/\.[a-z]+$/, "");
|
||||
var VOLUME_NAME = /\bpart(\d+)\.(?:rar|7z|zip)\b/i;
|
||||
// DLPSGAME's "backport files" downloads hold only the eboot and a few files to copy over the base
|
||||
// game (issue #8). The catalog sometimes numbers one as a part of a full backport archive; it is
|
||||
// its own file, so it never joins a set.
|
||||
var PATCH_FILES = /backport[+_ -]*files/i;
|
||||
var isPatchOnly = (release) => {
|
||||
const first = release.parts?.[0]?.sources[0] ?? release;
|
||||
return PATCH_FILES.test(`${first.url || ""} ${first.browserUrl || ""} ${release.label || ""}`);
|
||||
};
|
||||
var VOLUME_NAME =/\bpart(\d+)\.(?:rar|7z|zip)\b/i;
|
||||
function missingVolumes(parts, declaredBytes) {
|
||||
if (parts.some((part, index) => part.number !== index + 1)) return "gap";
|
||||
const volumes = parts.map((part) => VOLUME_NAME.exec(part.name || "")?.[1]);
|
||||
@@ -26,7 +34,7 @@ import { archivePassword } from './archive-password.js';
|
||||
const groups = /* @__PURE__ */ new Map();
|
||||
const output = [];
|
||||
for (const release of releases) {
|
||||
const match = /\bpart\s*(\d+)\b/i.exec(release.label || release.volume || "");
|
||||
const match = !isPatchOnly(release) && /\bpart\s*(\d+)\b/i.exec(release.label || release.volume || "");
|
||||
if (!match) {
|
||||
output.push(release);
|
||||
continue;
|
||||
@@ -81,4 +89,4 @@ import { archivePassword } from './archive-password.js';
|
||||
};
|
||||
var sameRelease = (saved, release) => saved.id === release.id || Boolean(link(saved)) && link(saved) === link(release) && saved.parts?.length === release.parts?.length;
|
||||
|
||||
export { releaseSets, sameRelease };
|
||||
export { isPatchOnly, releaseSets, sameRelease };
|
||||
@@ -0,0 +1,46 @@
|
||||
import { useEffect, useState } from 'react';
|
||||
import { loadList, saveList } from './saved.js';
|
||||
import { Downloads } from '@ps5-react/core';
|
||||
|
||||
// A cap on what game downloads take from the connection (issue #15), in MB/s as the app shows
|
||||
// speeds (formatSpeed's MB is 1024 ** 2 bytes); 0 is no cap. Kept in settings.json beside the vibration, and
|
||||
// handed to the download engine at launch and on every change, running downloads included.
|
||||
// App updates are enqueued unlimited and never wait on it.
|
||||
var LIMITS = [0, 50, 25, 10, 5, 2, 1];
|
||||
var SETTINGS = "settings.json";
|
||||
var saved = loadList(SETTINGS, "settings").speedLimit;
|
||||
var speedLimit = LIMITS.includes(saved) ? saved : 0;
|
||||
var listeners = /* @__PURE__ */ new Set();
|
||||
function apply() {
|
||||
try {
|
||||
Downloads.setRateLimit(speedLimit * 1024 ** 2);
|
||||
} catch (error) {
|
||||
console.log("[speed-limit] not applied:", error.message);
|
||||
}
|
||||
}
|
||||
function setSpeedLimit(limit) {
|
||||
if (!LIMITS.includes(limit)) return;
|
||||
speedLimit = limit;
|
||||
const { speedLimit: _old, ...settings } = loadList(SETTINGS, "settings");
|
||||
saveList(SETTINGS, "settings", limit ? { ...settings, speedLimit: limit } : settings);
|
||||
apply();
|
||||
for (const listener of listeners) listener(limit);
|
||||
}
|
||||
// The next value one step up (faster, then unlimited) or down (slower), stopping at the ends.
|
||||
function stepSpeedLimit(direction) {
|
||||
const index = LIMITS.indexOf(speedLimit);
|
||||
setSpeedLimit(LIMITS[Math.min(LIMITS.length - 1, Math.max(0, index + direction))]);
|
||||
}
|
||||
function useSpeedLimit() {
|
||||
const [limit, setLimit] = (0, useState)(speedLimit);
|
||||
(0, useEffect)(() => {
|
||||
listeners.add(setLimit);
|
||||
return () => {
|
||||
listeners.delete(setLimit);
|
||||
};
|
||||
}, []);
|
||||
return limit;
|
||||
}
|
||||
apply();
|
||||
|
||||
export { LIMITS, setSpeedLimit, stepSpeedLimit, useSpeedLimit };
|
||||
@@ -155,7 +155,7 @@ import { formatBytes } from './size.js';
|
||||
}
|
||||
async function fetchRelease(update, onProgress) {
|
||||
const zip = `${workDir}/${update.version}.zip`;
|
||||
const download = downloads.enqueue({ url: update.url, destination: zip, sha256: update.sha256, expectedBytes: update.size, rejectHtml: true });
|
||||
const download = downloads.enqueue({ url: update.url, destination: zip, sha256: update.sha256, expectedBytes: update.size, rejectHtml: true, unlimited: true });
|
||||
const off = download.subscribe(({ written }) => onProgress({ state: "downloading", written: written || 0, total: update.size }));
|
||||
try {
|
||||
await download.done;
|
||||
|
||||
+3
-2
@@ -36,7 +36,8 @@ import { Text, motion, useIsFocused } from '@ps5-react/core';
|
||||
label && /* @__PURE__ */ (0, jsx)(Text, { style: [TEXT[variant], TEXT_SIZE[size], focused && variant === "ghost" && { color: "#f2f2f3" }], children: label })
|
||||
] });
|
||||
}
|
||||
function Button2({ variant = "secondary", size = "md", label, icon, iconFill, children, onPress, style, ...rest2 }) {
|
||||
// `halo: false` gives a primary button the plain ring the page's other buttons have.
|
||||
function Button2({ variant = "secondary", size = "md", label, icon, iconFill, children, onPress, style, halo = true, ...rest2 }) {
|
||||
return /* @__PURE__ */ (0, jsxs)(
|
||||
motion.View,
|
||||
{
|
||||
@@ -46,7 +47,7 @@ import { Text, motion, useIsFocused } from '@ps5-react/core';
|
||||
transition: pressMotion,
|
||||
style: ({ focused }) => [BASE, SIZE2[size], BOX[variant], focused && FOCUSED_BOX[variant], style],
|
||||
children: [
|
||||
variant === "primary" ? /* @__PURE__ */ (0, jsx)(FocusRing, { halo: true, radius: 6 }) : /* @__PURE__ */ (0, jsx)(FocusRing, {}),
|
||||
variant === "primary" && halo ? /* @__PURE__ */ (0, jsx)(FocusRing, { halo: true, radius: 6 }) : /* @__PURE__ */ (0, jsx)(FocusRing, {}),
|
||||
children,
|
||||
/* @__PURE__ */ (0, jsx)(Content, { variant, size, label, icon, iconFill })
|
||||
]
|
||||
|
||||
@@ -53,6 +53,10 @@ import { px } from './scale.js';
|
||||
"m7.5 4.27 9 5.15"
|
||||
],
|
||||
disc: [ring(12, 12, 10), ring(12, 12, 2)],
|
||||
// lucide 0.462 cpu, lightbulb and file-minus, for the download tips.
|
||||
cpu: ["M6 4h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z", "M10 9h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1z", "M15 2v2", "M15 20v2", "M2 15h2", "M2 9h2", "M20 15h2", "M20 9h2", "M9 2v2", "M9 20v2"],
|
||||
lightbulb: ["M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5", "M9 18h6", "M10 22h4"],
|
||||
fileMinus: ["M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", "M14 2v4a2 2 0 0 0 2 2h4", "M9 15h6"],
|
||||
archive: ["M3 3h18a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Z", "M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8", "M10 12h4"],
|
||||
folder: ["M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"],
|
||||
file: ["M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", "M14 2v4a2 2 0 0 0 2 2h4"],
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// ../pub-game-store/native/ui/LanguageSheet.jsx
|
||||
// reconstructed from the esbuild bundle in eboot.bin
|
||||
// MODIFIED: the sheet is the app's settings, with navigation vibration above the languages.
|
||||
// MODIFIED: the sheet is the app's settings: a download speed limit, navigation vibration, then the languages.
|
||||
|
||||
import '../assets/Inter-Regular.ttf';
|
||||
import { Fragment, jsx, jsxs } from 'react/jsx-runtime';
|
||||
@@ -11,6 +11,7 @@ import { Icon } from './Icon.jsx';
|
||||
import { SideSheet } from './SideSheet.jsx';
|
||||
import { colors } from './colors.js';
|
||||
import { setNavigationHaptics, useNavigationHaptics } from './haptics.js';
|
||||
import { LIMITS, setSpeedLimit, useSpeedLimit } from '../state/speed-limit.js';
|
||||
import { Text, View, useIsFocused } from '@ps5-react/core';
|
||||
|
||||
var nameOf = (code) => LOCALES.find((locale2) => locale2.code === code).name;
|
||||
@@ -28,6 +29,29 @@ import { Text, View, useIsFocused } from '@ps5-react/core';
|
||||
function Row4({ code, name, detail: detail2, checked, onPress }) {
|
||||
return /* @__PURE__ */ (0, jsx)(View, { focusKey: `language:${code}`, onPress, style: (_state) => [{ position: "relative", flexDirection: "row", alignItems: "center", gap: 24, borderRadius: 12, paddingHorizontal: 18, paddingVertical: 18 }, _state.focused ? { backgroundColor: "#212125" } : null], children: /* @__PURE__ */ (0, jsx)(LanguageFace, { name, detail: detail2, checked }) });
|
||||
}
|
||||
// One segment of the speed limit (issue #15): every value in view, the chosen one filled. The D-pad
|
||||
// moves along the row and Cross picks, so no value has to be typed.
|
||||
function SpeedSegment({ limit, chosen }) {
|
||||
const t2 = useT();
|
||||
return /* @__PURE__ */ (0, jsxs)(View, { focusKey: `settings:speed:${limit}`, autoFocus: chosen, onPress: () => setSpeedLimit(limit), style: { position: "relative", flex: limit ? 1 : 2, height: 60, alignItems: "center", justifyContent: "center", borderRadius: 12, backgroundColor: chosen ? colors.fg : colors.surface2 }, children: [
|
||||
/* @__PURE__ */ (0, jsx)(FocusRing, {}),
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 21, fontWeight: 600, color: chosen ? colors.accentFg : colors.muted, numberOfLines: 1 }, children: limit ? String(limit) : t2("settings.speedUnlimited") })
|
||||
] });
|
||||
}
|
||||
function SpeedLimit() {
|
||||
const t2 = useT();
|
||||
const limit = useSpeedLimit();
|
||||
return /* @__PURE__ */ (0, jsxs)(View, { style: { gap: 18, paddingHorizontal: 18, paddingTop: 6, paddingBottom: 18 }, children: [
|
||||
/* @__PURE__ */ (0, jsxs)(View, { style: { gap: 3 }, children: [
|
||||
/* @__PURE__ */ (0, jsxs)(View, { style: { flexDirection: "row", justifyContent: "space-between", alignItems: "center" }, children: [
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 23, fontWeight: 600, color: colors.fg }, children: t2("settings.speedLimit") }),
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 21, color: colors.fg }, children: limit ? t2("units.speed", { n: String(limit) }) : t2("settings.speedUnlimited") })
|
||||
] }),
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 21, color: colors.muted, lineHeight: 30 }, children: t2("settings.speedLimitDetail") })
|
||||
] }),
|
||||
/* @__PURE__ */ (0, jsx)(View, { style: { flexDirection: "row", gap: 9 }, children: LIMITS.map((value) => /* @__PURE__ */ (0, jsx)(SpeedSegment, { limit: value, chosen: value === limit }, value)) })
|
||||
] });
|
||||
}
|
||||
function SectionLabel({ icon, title, detail: detail2 }) {
|
||||
const text = /* @__PURE__ */ (0, jsxs)(View, { style: { flex: 1, gap: 3 }, children: [
|
||||
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 19, fontWeight: 600, color: colors.muted, letterSpacing: 1.5 }, children: title }),
|
||||
@@ -46,11 +70,13 @@ import { Text, View, useIsFocused } from '@ps5-react/core';
|
||||
chooseLanguage(code);
|
||||
onClose();
|
||||
};
|
||||
// The vibration row stays open on press, so the player feels the change at once; a language
|
||||
// choice still closes the sheet as before. Focus opens on the top row, where both are in view.
|
||||
// The speed limit and vibration stay open on press, so the change shows (or is felt) at once; a
|
||||
// language choice still closes the sheet as before. Focus opens on the chosen speed, at the top.
|
||||
return /* @__PURE__ */ (0, jsx)(SideSheet, { title: t2("settings.title"), onClose, children: /* @__PURE__ */ (0, jsxs)(View, { style: { gap: 6, padding: 9, paddingBottom: 48 }, children: [
|
||||
/* @__PURE__ */ (0, jsx)(SectionLabel, { icon: "download", title: t2("settings.downloads") }),
|
||||
/* @__PURE__ */ (0, jsx)(SpeedLimit, {}),
|
||||
/* @__PURE__ */ (0, jsx)(SectionLabel, { title: t2("settings.controller") }),
|
||||
/* @__PURE__ */ (0, jsx)(View, { focusKey: "settings:vibration", autoFocus: true, onPress: () => setNavigationHaptics(!vibration), style: (_state) => [{ position: "relative", flexDirection: "row", alignItems: "center", gap: 24, borderRadius: 12, paddingHorizontal: 18, paddingVertical: 18 }, _state.focused ? { backgroundColor: "#212125" } : null], children: /* @__PURE__ */ (0, jsx)(LanguageFace, { name: t2("settings.vibration"), detail: t2("settings.vibrationDetail"), checked: vibration }) }),
|
||||
/* @__PURE__ */ (0, jsx)(View, { focusKey: "settings:vibration", onPress: () => setNavigationHaptics(!vibration), style: (_state) => [{ position: "relative", flexDirection: "row", alignItems: "center", gap: 24, borderRadius: 12, paddingHorizontal: 18, paddingVertical: 18 }, _state.focused ? { backgroundColor: "#212125" } : null], children: /* @__PURE__ */ (0, jsx)(LanguageFace, { name: t2("settings.vibration"), detail: t2("settings.vibrationDetail"), checked: vibration }) }),
|
||||
/* @__PURE__ */ (0, jsx)(SectionLabel, { icon: "languages", title: t2("language.title"), detail: t2("language.subtitle") }),
|
||||
/* @__PURE__ */ (0, jsx)(Row4, { code: "system", name: t2("language.system"), detail: nameOf(systemLocale()), checked: choice2 === null, onPress: () => pick2(null) }),
|
||||
LOCALES.map(
|
||||
|
||||
+5
-1
@@ -11,7 +11,11 @@
|
||||
fg: "#f2f2f3",
|
||||
muted: "#a3a3ab",
|
||||
subtle: "#8a8a94",
|
||||
accentFg: "#0d0d0f"
|
||||
accentFg: "#0d0d0f",
|
||||
// Soft status tones beside the CDN pastels: a source that suits the console, or one to look at first.
|
||||
ok: "#a7f3d0",
|
||||
warn: "#fde68a",
|
||||
info: "#a5f3fc"
|
||||
};
|
||||
|
||||
export { colors };
|
||||
+1
-1
@@ -2,6 +2,6 @@
|
||||
// reconstructed from the esbuild bundle in eboot.bin
|
||||
|
||||
|
||||
var VERSION = "1.0.2";
|
||||
var VERSION = "1.0.4";
|
||||
|
||||
export { VERSION };
|
||||
@@ -1,5 +1,19 @@
|
||||
# Changelog
|
||||
|
||||
## Unreleased — Vikingfile capture without the Download button
|
||||
|
||||
- Browser capture finds the verified Vikingfile link as the page holds it once the verification
|
||||
passes, a JSON string with escaped slashes, so the user no longer selects Download and the
|
||||
advertisements around it. The scanner reads at about 8 MiB/s with a 1 GiB session budget, so it
|
||||
keeps looking through a slow verification; both changes follow Orbit Store 1.3.5.
|
||||
|
||||
## Unreleased — download speed limit
|
||||
|
||||
- Add `Downloads.setRateLimit(bytesPerSecond)` (native ABI v17, `network.setRateLimit`): every file
|
||||
download shares the cap, and a new value applies at once, to running downloads too. A capped
|
||||
download opens about one connection per MB/s and resumes its paused connections in turn, so none
|
||||
sits long enough to hit the 30-second low-speed cutoff. `unlimited: true` exempts a download.
|
||||
|
||||
## Unreleased — comparing upscalers
|
||||
|
||||
- `<Video compare={{upscale, split}}>` (native ABI v15, `video.setCompare`): right of `split` (0 to 1
|
||||
|
||||
@@ -155,6 +155,10 @@ include opt-in `rejectHtml`, exact `expectedBytes`, `storageRoot` identity check
|
||||
for receipt-backed SHA-256 verification of published files, and normalized
|
||||
`pieces: [{url, offset, size, sha1}]`. These options share ABI v2 on both hosts;
|
||||
there are no additional global native functions.
|
||||
`Downloads.setRateLimit(bytesPerSecond)` (ABI v17) caps what all file downloads
|
||||
receive together, 0 for no limit. It applies at once, running downloads included;
|
||||
a capped download opens about one connection per MB/s. A download enqueued with
|
||||
`unlimited: true`, such as an app's own update, is exempt.
|
||||
PS5 builds require `networking: true` and `filesystemAccess: "console"`; desktop
|
||||
networking is available by default. See [NETWORKING.md](NETWORKING.md) for
|
||||
options, resource limits, errors, lifecycle and the hardware-validation gap.
|
||||
@@ -623,14 +627,15 @@ controls, slashes, backslashes or `..`. The deadline is an integer from 1 to
|
||||
completion. `cancel()` shuts down the connection, stops the payload's next
|
||||
read, and rejects `done` with `AbortError`. Host exit stops and joins the worker.
|
||||
|
||||
The user must complete the provider's verification and select Download in the
|
||||
system browser. This API does not bypass verification or open the page; the app
|
||||
The user must complete the provider's verification in the system browser; the
|
||||
verified link is captured as Vikingfile's page holds it (a JSON string, slashes
|
||||
escaped), so the user need not select Download or its advertisements. This API does not bypass verification or open the page; the app
|
||||
opens it with `Linking.openURL` after submitting capture. Only a uniquely
|
||||
identified browser network process is read, with identity checked before every
|
||||
read. Scanning is limited to anonymous readable/writable nonexecutable user
|
||||
pages, 64 KiB every 32 ms, 128 MiB per session. No dumps, cookies, arbitrary
|
||||
pages, 64 KiB every 8 ms, 1 GiB per session. No dumps, cookies, arbitrary
|
||||
process selection or writes. Only complete ASCII/UTF-16 matching routes are
|
||||
returned. Provenance: `native/ps5/payloads/browser/README.md` (Orbit Store 1.0.1).
|
||||
returned. Provenance: `native/ps5/payloads/browser/README.md` (Orbit Store 1.0.1 and 1.3.5).
|
||||
|
||||
A captured URL may already be stale; the app must validate host, decoded
|
||||
filename, HTTP status, content type and length before starting immediately.
|
||||
|
||||
@@ -274,9 +274,19 @@ void device_info(DeviceInfo& info) {
|
||||
}
|
||||
SystemSwVersion version{};
|
||||
version.size = sizeof version;
|
||||
if (sceKernelGetSystemSwVersion(&version) == 0)
|
||||
const int version_result = sceKernelGetSystemSwVersion(&version);
|
||||
if (version_result == 0)
|
||||
std::snprintf(info.firmware, sizeof info.firmware, "%.*s",
|
||||
static_cast<int>(sizeof version.version_string), version.version_string);
|
||||
// Once per launch: the raw answer, since what the title is told can differ from the version
|
||||
// System Software shows (a console showing 13.20 reported 13.59).
|
||||
static bool version_logged = false;
|
||||
if (!version_logged) {
|
||||
version_logged = true;
|
||||
async_log::write("[PS5-REACT] system software version=0x%08x string=\"%.*s\" result=0x%08x",
|
||||
version.version, static_cast<int>(sizeof version.version_string), version.version_string,
|
||||
static_cast<unsigned>(version_result));
|
||||
}
|
||||
int temperature = 0;
|
||||
if (sceKernelGetCpuTemperature(&temperature) == 0) info.cpu_temperature = temperature;
|
||||
if (sceKernelGetSocSensorTemperature(0, &temperature) == 0) info.soc_temperature = temperature;
|
||||
|
||||
@@ -7,8 +7,15 @@ The bundle contains `orbit-store-1.0.1-source.tar.gz`, backend/browser_*.
|
||||
`browser_url.c` adapts the filename-bound route validation in backend/providers.c.
|
||||
The release/catalog dependency was replaced by an explicit selected filename.
|
||||
|
||||
From Orbit Store 1.3.5 (same licence), `browser_match.c` decodes JSON's escaped
|
||||
slash once, so the verified Vikingfile link is found before the page's Download
|
||||
button is pressed, and the scanner's overlap, read pace and session budget follow
|
||||
its `browser_scan.h`. Source bundle:
|
||||
https://github.com/saawant12/orbit-store-ps5/releases/download/v1.3.5/orbit-store-1.3.5-source-bundle.zip
|
||||
(`orbit-store-1.3.5-source.tar.gz`, backend/browser_match.c and backend/browser_scan.*).
|
||||
|
||||
Only the uniquely identified SceNKNetworkProcess/SceNKNetworkProc is read.
|
||||
Identity is rechecked before reads; no executable/file-backed pages, writes,
|
||||
cookies, dumps or arbitrary process selectors. Each session has a 128 MiB total
|
||||
read budget, 64 KiB reads separated by 32 ms, and a maximum 180-second deadline.
|
||||
cookies, dumps or arbitrary process selectors. Each session has a 1 GiB total
|
||||
read budget, 64 KiB reads separated by 8 ms, and a maximum 180-second deadline.
|
||||
Only a complete matching Vikingfile URL is returned. Buffers are wiped.
|
||||
@@ -1,4 +1,4 @@
|
||||
// Adapted from Orbit Store 1.0.1 by saawant12 (https://github.com/saawant12/orbit-store-ps5).
|
||||
// Adapted from Orbit Store 1.0.1 and 1.3.5 by saawant12 (https://github.com/saawant12/orbit-store-ps5).
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// Read-only browser capture; original corresponding source is recorded in README.md.
|
||||
#include "browser_match.h"
|
||||
@@ -9,6 +9,26 @@ static bool boundary(unsigned char c) {
|
||||
return c == 0 || c == ' ' || c == '\t' || c == '\r' || c == '\n' ||
|
||||
c == '"' || c == '\'' || c == '<' || c == '>';
|
||||
}
|
||||
/* One URL character at *position, in ASCII (step 1) or UTF-16LE (step 2). Vikingfile's verified
|
||||
* link is already in the network process once the verification passes, but as JSON, before a
|
||||
* click on the page's Download button (and its advertisements) makes a navigation URL of it
|
||||
* (Orbit Store 1.3.5). JSON's optional slash escape is decoded, once; no other escape is a
|
||||
* download address. */
|
||||
static bool next_url_char(const unsigned char *bytes, size_t length, size_t step,
|
||||
size_t *position, unsigned char *out) {
|
||||
if (*position > length || length - *position < step) return false;
|
||||
unsigned char c = bytes[*position];
|
||||
if (step == 2 && bytes[*position + 1]) return false;
|
||||
*position += step;
|
||||
if (c == '\\') {
|
||||
if (length - *position < step || bytes[*position] != '/' ||
|
||||
(step == 2 && bytes[*position + 1])) return false;
|
||||
*position += step;
|
||||
c = '/';
|
||||
}
|
||||
*out = c;
|
||||
return true;
|
||||
}
|
||||
bool browser_match(void *context, const unsigned char *bytes, size_t length) {
|
||||
BrowserMatch *match = context;
|
||||
for (size_t which = 0; which < 2; which++) {
|
||||
@@ -17,17 +37,19 @@ bool browser_match(void *context, const unsigned char *bytes, size_t length) {
|
||||
for (size_t step = 1; step <= 2; step++) {
|
||||
for (size_t i = 0; (plen + 1) * step <= length && i <= length - (plen + 1) * step; i++) {
|
||||
if (bytes[i] != 'h' || (i >= step && !boundary(bytes[i - step]))) continue;
|
||||
size_t position = i;
|
||||
bool valid = true;
|
||||
for (size_t j = 0; j < plen; j++) {
|
||||
if (bytes[i + j * step] != (unsigned char)prefix[j] ||
|
||||
(step == 2 && bytes[i + j * step + 1])) { valid = false; break; }
|
||||
unsigned char c;
|
||||
if (!next_url_char(bytes, length, step, &position, &c) ||
|
||||
c != (unsigned char)prefix[j]) { valid = false; break; }
|
||||
}
|
||||
if (!valid) continue;
|
||||
char candidate[sizeof match->url];
|
||||
memcpy(candidate, prefix, plen);
|
||||
for (size_t j = plen; j < sizeof candidate && (j + 1) * step <= length - i; j++) {
|
||||
unsigned char c = bytes[i + j * step];
|
||||
if (step == 2 && bytes[i + j * step + 1]) break;
|
||||
for (size_t j = plen; j < sizeof candidate; j++) {
|
||||
unsigned char c;
|
||||
if (!next_url_char(bytes, length, step, &position, &c)) break;
|
||||
if (boundary(c)) {
|
||||
candidate[j] = 0;
|
||||
if (browser_capture_url(match->filename, candidate)) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Adapted from Orbit Store 1.0.1 by saawant12 (https://github.com/saawant12/orbit-store-ps5).
|
||||
// Adapted from Orbit Store 1.0.1 and 1.3.5 by saawant12 (https://github.com/saawant12/orbit-store-ps5).
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// Read-only browser capture; original corresponding source is recorded in README.md.
|
||||
#include "browser_platform.h"
|
||||
@@ -86,8 +86,8 @@ bool probe_target_active(void *context) {
|
||||
|
||||
int probe_target_read(void *context, uint64_t address, void *bytes, size_t length) {
|
||||
ProbeTarget *target = context;
|
||||
/* Rate limit: at most 64 KiB every 32 ms, roughly 2 MiB/s. */
|
||||
struct timespec delay = {.tv_nsec = 32000000};
|
||||
/* Rate limit: at most 64 KiB every 8 ms, roughly 8 MiB/s. */
|
||||
struct timespec delay = {.tv_nsec = PROBE_READ_DELAY_NS};
|
||||
nanosleep(&delay, NULL);
|
||||
if (!probe_target_active(target)) return -1;
|
||||
return kernel_proc_copyout(target->pid, (intptr_t)address, bytes, length);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Adapted from Orbit Store 1.0.1 by saawant12 (https://github.com/saawant12/orbit-store-ps5).
|
||||
// Adapted from Orbit Store 1.0.1 and 1.3.5 by saawant12 (https://github.com/saawant12/orbit-store-ps5).
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// Read-only browser capture; original corresponding source is recorded in README.md.
|
||||
#include "browser_scan.h"
|
||||
@@ -21,7 +21,8 @@ ProbeResult probe_scan_region(ProbeReader *reader, uint64_t start, uint64_t end,
|
||||
if (!length || length == PROBE_MARKER_MAX) return PROBE_INVALID;
|
||||
unsigned char wide[PROBE_MARKER_MAX * 2] = {0};
|
||||
for (size_t i = 0; i < length; i++) wide[i * 2] = (unsigned char)marker[i];
|
||||
const size_t overlap = reader->match ? PROBE_MATCH_MAX * 2 - 1 : length * 2 - 1;
|
||||
/* A bounded URL may use two-byte JSON slash escapes in UTF-16. */
|
||||
const size_t overlap = reader->match ? PROBE_MATCH_MAX * 4 - 1 : length * 2 - 1;
|
||||
unsigned char *buffer = malloc(PROBE_CHUNK + overlap);
|
||||
if (!buffer) return PROBE_INVALID;
|
||||
size_t carried = 0;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Adapted from Orbit Store 1.0.1 by saawant12 (https://github.com/saawant12/orbit-store-ps5).
|
||||
// Adapted from Orbit Store 1.0.1 and 1.3.5 by saawant12 (https://github.com/saawant12/orbit-store-ps5).
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// Read-only browser capture; original corresponding source is recorded in README.md.
|
||||
#ifndef ORBIT_BROWSER_SCAN_H
|
||||
@@ -11,6 +11,10 @@
|
||||
#define PROBE_CHUNK 65536U
|
||||
#define PROBE_MARKER_MAX 256U
|
||||
#define PROBE_MATCH_MAX 544U /* Percent-encoded filename and route, including NUL. */
|
||||
/* Cumulative reads, not resident memory: enough to keep scanning through the whole verification
|
||||
* window at about 8 MiB/s, a late human verification included (Orbit Store 1.3.5). */
|
||||
#define PROBE_READ_DELAY_NS 8000000L
|
||||
#define PROBE_SESSION_BUDGET (1024ULL * 1024ULL * 1024ULL)
|
||||
typedef struct {
|
||||
void *context;
|
||||
int (*read)(void *, uint64_t, void *, size_t);
|
||||
|
||||
@@ -70,7 +70,7 @@ int main(void) {
|
||||
if (found != 1) return fail("The browser could not be identified safely. Reopen the page and retry.");
|
||||
BrowserMatch match = {.filename = filename};
|
||||
ProbeReader reader = {.context = &target, .read = probe_target_read, .active = active,
|
||||
.match = browser_match, .match_context = &match, .remaining = 128U * 1024U * 1024U};
|
||||
.match = browser_match, .match_context = &match, .remaining = PROBE_SESSION_BUDGET};
|
||||
ProbeResult result = PROBE_ABSENT;
|
||||
while (active(&target) && reader.remaining) {
|
||||
result = probe_target_scan(&target, &reader, prefix);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright (C) 2026 half144 and PS5 React contributors
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// Additional attribution term: see LICENSE-ATTRIBUTION.
|
||||
// Native API contract (ABI v16) between the hosts and `@ps5-react/core`. The input actions hosts
|
||||
// Native API contract (ABI v17) between the hosts and `@ps5-react/core`. The input actions hosts
|
||||
// pass to `__ps5ReactDispatch` are a separate contract with its own version (runtime/js/input.js).
|
||||
//
|
||||
// host_api.cpp (shared) installs `globalThis.__ps5ReactNative` through
|
||||
@@ -54,12 +54,15 @@
|
||||
// switches after this frame (PS5: restarts EGL, the TV resyncs)
|
||||
// network.download(url, path, options) task ID; queues native binary file I/O
|
||||
// options: expectedBytes, storageRoot, pieces[{url, offset, size, sha1}],
|
||||
// sha256, connections, adaptive, rangeBytes, resume, recoverCompleted, headers, rejectHtml
|
||||
// sha256, connections, adaptive, rangeBytes, resume, recoverCompleted, headers, rejectHtml,
|
||||
// unlimited (ABI v17; exempt from setRateLimit)
|
||||
// network.request(url, options) task ID; queues bounded HTTP text I/O
|
||||
// options: method, body, maxBytes, headers, followRedirects (default true)
|
||||
// terminal snapshots: status, body, effective url, allowlisted lowercase headers
|
||||
// network.cancel(id) requests cancellation
|
||||
// network.poll() progress/results; consumes terminal snapshots
|
||||
// network.setRateLimit(bytes) ABI v17; bytes per second all file downloads share, 0 for no limit;
|
||||
// applies at once, running downloads included, except unlimited ones
|
||||
// archives.extract(sources, destination, maxBytes) task ID; bounded native archive worker
|
||||
// archives.inspect(sources) {kind, refusal}; file type from leading bytes and, for an archive,
|
||||
// a decoder-memory refusal its headers so far justify; partial files ok
|
||||
|
||||
@@ -125,6 +125,8 @@ struct Transfer {
|
||||
bool length_known = false;
|
||||
std::uint64_t range_begin = 0, range_end = 0, range_total = 0;
|
||||
bool content_range = false, probe = false, paused = false, active = false, draining = false, redirected = false, cut = false;
|
||||
// Paused by the rate limit until its shared budget refills (paused waits for a free disk block).
|
||||
bool rate_paused = false;
|
||||
// A 200 or 206 that is not the range asked for but carries the file's validators: a proxy or a busy
|
||||
// node answering oddly, retried a few times rather than taken for a changed file.
|
||||
bool glitch = false;
|
||||
@@ -636,6 +638,7 @@ public:
|
||||
void cancel(std::uint32_t id);
|
||||
std::vector<Snapshot> poll();
|
||||
bool running() const { return running_; }
|
||||
void set_rate_limit(std::uint64_t bytes_per_second) { rate_limit_ = bytes_per_second; }
|
||||
private:
|
||||
std::mutex mutex_, disk_mutex_;
|
||||
std::condition_variable wake_, disk_wake_, sync_wake_;
|
||||
@@ -648,6 +651,14 @@ private:
|
||||
std::atomic<bool> stopping_{false}, writer_stopping_{false};
|
||||
std::atomic<unsigned> write_max_us_{0}, sync_max_us_{0};
|
||||
std::atomic<std::uint64_t> write_calls_{0}, write_bytes_{0};
|
||||
// The rate limit: a budget of bytes refilled each pass of the transfer loop, which callbacks spend.
|
||||
// Only the network thread touches the budget; the limit itself is set from JavaScript's thread.
|
||||
std::atomic<std::uint64_t> rate_limit_{0};
|
||||
double rate_budget_ = 0;
|
||||
Clock::time_point rate_refilled_{};
|
||||
std::size_t rate_turn_ = 0;
|
||||
void refill_rate(Clock::time_point now);
|
||||
void resume_rate_paused(Job& job);
|
||||
std::uint64_t perform_us_ = 0;
|
||||
pthread_t network_thread_{}, sync_thread_{};
|
||||
std::array<pthread_t, writer_count> writer_threads_{};
|
||||
@@ -887,6 +898,29 @@ std::size_t Service::header(char* data, std::size_t size, std::size_t count, voi
|
||||
return length;
|
||||
}
|
||||
|
||||
void Service::refill_rate(Clock::time_point now) {
|
||||
const auto limit = static_cast<double>(rate_limit_.load(std::memory_order_relaxed));
|
||||
const double seconds = std::min(1.0, std::chrono::duration<double>(now-rate_refilled_).count());
|
||||
rate_refilled_ = now;
|
||||
if (!limit) { rate_budget_ = 0; return; }
|
||||
// At most a quarter second's worth (256 KiB at least, above any one callback) banks up.
|
||||
rate_budget_ = std::min(rate_budget_+limit*seconds, std::max(limit/4, 256.0*1024));
|
||||
}
|
||||
|
||||
// Resumes transfers the limit paused, starting one further along each pass so none waits long.
|
||||
void Service::resume_rate_paused(Job& job) {
|
||||
const bool capped = rate_limit_.load(std::memory_order_relaxed) != 0;
|
||||
for (std::size_t step = 0; step < transfers_.size(); ++step) {
|
||||
Transfer& t = transfers_[(rate_turn_+step) % transfers_.size()];
|
||||
if (!t.active || !t.rate_paused) continue;
|
||||
if (capped && rate_budget_ < 64.0*1024) { rate_turn_ = (rate_turn_+step) % transfers_.size(); return; }
|
||||
t.rate_paused = false;
|
||||
const auto result = curl_easy_pause(t.curl, CURLPAUSE_CONT);
|
||||
if (result != CURLE_OK) { job.fail(curl_easy_strerror(result)); return; }
|
||||
}
|
||||
rate_turn_ = (rate_turn_+1) % transfers_.size();
|
||||
}
|
||||
|
||||
std::size_t Service::body(char* data, std::size_t size, std::size_t count, void* opaque) {
|
||||
auto& t = *static_cast<Transfer*>(opaque);
|
||||
if (size && count > block_size/size) { t.error = "unexpected callback block size"; return 0; }
|
||||
@@ -919,6 +953,11 @@ std::size_t Service::body(char* data, std::size_t size, std::size_t count, void*
|
||||
const std::size_t keep = t.cut ? static_cast<std::size_t>(std::min<std::uint64_t>(length, limit-t.accepted)) : length;
|
||||
if (!t.cut && (t.accepted > limit || length > limit-t.accepted)) { t.error = "response exceeds expected size"; return 0; }
|
||||
if (!keep) return length;
|
||||
if (!job.request.unlimited && t.owner->rate_limit_.load(std::memory_order_relaxed)) {
|
||||
// Over the budget: curl hands these bytes back once the transfer loop resumes the transfer.
|
||||
if (t.owner->rate_budget_ < static_cast<double>(keep)) { t.rate_paused = true; return CURL_WRITEFUNC_PAUSE; }
|
||||
t.owner->rate_budget_ -= static_cast<double>(keep);
|
||||
}
|
||||
if (t.block && block_size-t.fill < keep) t.owner->flush(t);
|
||||
if (!t.block) {
|
||||
t.block = t.owner->take_block();
|
||||
@@ -941,7 +980,7 @@ bool Service::configure(Transfer& t) {
|
||||
t.headers = nullptr; t.status = 0; t.header_bytes = 0;
|
||||
t.etag.clear(); t.last_modified.clear(); t.encoding.clear(); t.error.clear(); t.content_type.clear();
|
||||
t.response_headers.clear(); t.html_prefix.clear(); t.sample.clear();
|
||||
t.content_range = false; t.length_known = false; t.paused = false; t.retry_after = 0; t.glitch = false;
|
||||
t.content_range = false; t.length_known = false; t.paused = false; t.rate_paused = false; t.retry_after = 0; t.glitch = false;
|
||||
t.requested = t.length; t.cut = false;
|
||||
Job& job = *t.job;
|
||||
bool ok = true;
|
||||
@@ -1391,7 +1430,11 @@ void Service::run_job(const std::shared_ptr<Job>& job) {
|
||||
for (Transfer& t : transfers_) t.probe = false;
|
||||
if (prepared && !job->cancelled && !job->recovering) {
|
||||
{ std::lock_guard lock(job->mutex); job->snapshot.state = "downloading"; }
|
||||
const unsigned limit = job->ranged ? job->request.connections : 1;
|
||||
// A capped download needs few connections: about one per MB/s, so each gets bytes often enough to
|
||||
// stay over curl's low-speed cutoff (1 byte/s for 30 s) between its turns.
|
||||
const std::uint64_t capped = job->request.unlimited ? 0 : rate_limit_.load();
|
||||
const unsigned limit = !job->ranged ? 1 : !capped ? job->request.connections :
|
||||
std::min(std::max(static_cast<unsigned>(capped/(1024*1024)), 2u), job->request.connections);
|
||||
const unsigned initial = job->request.adaptive ? std::min(8u, limit) : limit;
|
||||
std::vector<Window> windows;
|
||||
const auto window_for = [&](const std::string& url) {
|
||||
@@ -1439,6 +1482,8 @@ void Service::run_job(const std::shared_ptr<Job>& job) {
|
||||
platform_log("download: resumed after a suspension; ranges it cut retry without counting");
|
||||
}
|
||||
last_pass = now; last_wall = wall;
|
||||
refill_rate(now);
|
||||
resume_rate_paused(*job);
|
||||
unsigned in_flight = 0;
|
||||
for (Transfer& t : transfers_) if (t.active || t.draining) ++in_flight;
|
||||
if (job->request.adaptive) for (Window& w : windows) w.grow(now, limit);
|
||||
@@ -1643,6 +1688,7 @@ void stop() { service.stop(); }
|
||||
std::uint32_t enqueue(Request request, std::string& error) { return service.enqueue(std::move(request), error); }
|
||||
void cancel(std::uint32_t id) { service.cancel(id); }
|
||||
std::vector<Snapshot> poll() { return service.poll(); }
|
||||
void set_rate_limit(std::uint64_t bytes_per_second) { service.set_rate_limit(bytes_per_second); }
|
||||
bool downloading() { return downloading_file; }
|
||||
bool running() { return service.running(); }
|
||||
const char* version() { return curl_version(); }
|
||||
@@ -1656,6 +1702,7 @@ std::uint32_t enqueue(Request, std::string& error) {
|
||||
}
|
||||
void cancel(std::uint32_t) {}
|
||||
std::vector<Snapshot> poll() { return {}; }
|
||||
void set_rate_limit(std::uint64_t) {}
|
||||
bool downloading() { return false; }
|
||||
bool running() { return false; }
|
||||
const char* version() { return "disabled"; }
|
||||
|
||||
@@ -23,6 +23,8 @@ struct Request {
|
||||
unsigned connections = 8;
|
||||
bool resume = true, adaptive = true, recover_completed = false;
|
||||
bool follow_redirects = true, reject_html = false;
|
||||
// Exempt from set_rate_limit (an app's own update).
|
||||
bool unlimited = false;
|
||||
};
|
||||
struct Snapshot {
|
||||
std::uint32_t id = 0;
|
||||
@@ -41,6 +43,9 @@ void stop();
|
||||
std::uint32_t enqueue(Request request, std::string& error);
|
||||
void cancel(std::uint32_t id);
|
||||
std::vector<Snapshot> poll();
|
||||
// Caps what file downloads receive together, in bytes per second; 0 lifts the cap. It applies at once,
|
||||
// to downloads already running too, except those marked unlimited.
|
||||
void set_rate_limit(std::uint64_t bytes_per_second);
|
||||
// True while a download to a file runs; image loading yields connections and memory to it.
|
||||
bool downloading();
|
||||
// True once start() succeeded: the platform's network stack (PS5: libSceNet) is up.
|
||||
|
||||
@@ -156,6 +156,7 @@ JSValue begin(JSContext* ctx, JSValueConst, int argc, JSValueConst* argv, bool d
|
||||
!boolean_option(ctx, options, "resume", request.resume) || !boolean_option(ctx, options, "adaptive", request.adaptive) ||
|
||||
!boolean_option(ctx, options, "recoverCompleted", request.recover_completed) ||
|
||||
!boolean_option(ctx, options, "rejectHtml", request.reject_html) ||
|
||||
!boolean_option(ctx, options, "unlimited", request.unlimited) ||
|
||||
!string_option(ctx, options, "sha256", request.sha256, 64) || !digest(request.sha256, 64) ||
|
||||
!number_option(ctx, options, "expectedBytes", request.expected_bytes, 1, 9007199254740991ULL) ||
|
||||
!pieces(ctx, options, request) || !mirrors(ctx, options, request))
|
||||
@@ -209,11 +210,18 @@ JSValue poll(JSContext* ctx, JSValueConst, int, JSValueConst*) {
|
||||
return out;
|
||||
}
|
||||
JSValue info(JSContext* ctx, JSValueConst, int, JSValueConst*) { return JS_NewString(ctx, network::version()); }
|
||||
// Bytes per second every file download shares; 0 lifts the cap.
|
||||
JSValue rate_limit(JSContext* ctx, JSValueConst, int argc, JSValueConst* argv) {
|
||||
double bytes = 0;
|
||||
if (!argc || JS_ToFloat64(ctx, &bytes, argv[0]) || !(bytes >= 0) || bytes > 9007199254740991.0)
|
||||
return JS_ThrowTypeError(ctx, "network.setRateLimit: expected bytes per second, 0 for no limit");
|
||||
network::set_rate_limit(static_cast<std::uint64_t>(bytes)); return JS_UNDEFINED;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
JSValue ps5_react_network_api(JSContext* ctx) {
|
||||
JSValue out = JS_NewObject(ctx);
|
||||
for (const auto& item : {std::pair<const char*, JSCFunction*>{"download", &download}, {"request", &request}, {"cancel", &cancel}, {"poll", &poll}, {"version", &info}})
|
||||
for (const auto& item : {std::pair<const char*, JSCFunction*>{"download", &download}, {"request", &request}, {"cancel", &cancel}, {"poll", &poll}, {"version", &info}, {"setRateLimit", &rate_limit}})
|
||||
JS_SetPropertyStr(ctx, out, item.first, JS_NewCFunction(ctx, item.second, item.first, 0));
|
||||
return out;
|
||||
}
|
||||
@@ -485,6 +485,13 @@ export const Downloads = {
|
||||
enqueueManifest({manifest, destination, ...options}) {
|
||||
return Downloads.enqueue({...options, ...normalizeDownloadManifest(manifest), destination});
|
||||
},
|
||||
/** Bytes per second every file download shares, 0 for no limit (ABI v17). It applies at once,
|
||||
* to running downloads too; one enqueued with `unlimited: true` (an app's own update) is exempt. */
|
||||
setRateLimit(bytesPerSecond) {
|
||||
if (!Number.isFinite(bytesPerSecond) || bytesPerSecond < 0)
|
||||
throw new TypeError('Downloads.setRateLimit: expected bytes per second, 0 for no limit.');
|
||||
host().network.setRateLimit(Math.floor(bytesPerSecond));
|
||||
},
|
||||
get transportVersion() { return host().network.version(); },
|
||||
};
|
||||
|
||||
|
||||
Reference in new issue
Block a user