Compare commits
1 Commits
fixes
...
tyiu/no-tr
| Author | SHA1 | Date | |
|---|---|---|---|
|
fe9d6da027
|
1
.github/workflows/run-tests.yaml
vendored
@@ -5,7 +5,6 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- "master"
|
||||
- "ci"
|
||||
pull_request:
|
||||
branches:
|
||||
- "*"
|
||||
|
||||
1
.gitignore
vendored
@@ -3,4 +3,3 @@ xcuserdata
|
||||
damus/TestingPrivate.swift
|
||||
.DS_Store
|
||||
TODO.bak
|
||||
tags
|
||||
|
||||
5
.mailmap
@@ -1,5 +0,0 @@
|
||||
Terry Yiu <git@tyiu.xyz> <963907+tyiu@users.noreply.github.com>
|
||||
Ben Weeks <ben.weeks@knowall.ai> <ben.weeks@outlook.com>
|
||||
Suhail Saqan <suhail.saqan@gmail.com> <43693074+suhailsaqan@users.noreply.github.com>
|
||||
cr0bar <cr0bar@cr0.bar> <cr0bar@users.noreply.github.com>
|
||||
Swift <scoder1747@gmail.com> <120697811+scoder1747@users.noreply.github.com>
|
||||
349
CHANGELOG.md
@@ -1,345 +1,8 @@
|
||||
## [1.6-4] - 2023-07-13
|
||||
## [1.4.3-1] - 2023-04-15
|
||||
|
||||
### Added
|
||||
|
||||
- Add the ability to follow hashtags (William Casarin)
|
||||
|
||||
### Changed
|
||||
|
||||
- Remove note size restriction for longform events (William Casarin)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Hide users and hashtags from home timeline when you unfollow (William Casarin)
|
||||
- Fixed a bug where following a user might not work due to poor connectivity (William Casarin)
|
||||
- Icon color for developer mode setting is incorrect in low-light mode (Bryan Montz)
|
||||
- Fixed nav bar color on login, eula, and account creation (ericholguin)
|
||||
|
||||
|
||||
### Removed
|
||||
|
||||
- Remove following Damus Will by default (William Casarin)
|
||||
|
||||
[1.6-4]: https://github.com/damus-io/damus/releases/tag/v1.6-4
|
||||
|
||||
## [1.6-3] - 2023-07-11
|
||||
|
||||
### Changed
|
||||
|
||||
- Start at top when reading longform events (William Casarin)
|
||||
- Allow reposting and quote reposting multiple times (William Casarin)
|
||||
|
||||
|
||||
### Fixed
|
||||
|
||||
- Show longform previews in notifications instead of the entire post (William Casarin)
|
||||
- Fix padding on longform events (William Casarin)
|
||||
- Fix action bar appearing on quoted longform previews (William Casarin)
|
||||
|
||||
|
||||
[1.6-3]: https://github.com/damus-io/damus/releases/tag/v1.6-3
|
||||
## [1.6-2] - 2023-07-11
|
||||
|
||||
### Added
|
||||
|
||||
- Add support for multilingual hashtags (cr0bar)
|
||||
- Add r tag when mentioning a url (William Casarin)
|
||||
- Add initial longform note support (William Casarin)
|
||||
- Enable banner image editing (Joel Klabo)
|
||||
- Add relay log in developer mode (Bryan Montz)
|
||||
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix lag when creating large posts (William Casarin)
|
||||
- Fix npub mentions failing to parse in some cases (William Casarin)
|
||||
- Fix PostView initial string to skip mentioning self when on own profile (Terry Yiu)
|
||||
- Fix freezing bug when tapping Developer settings menu (Terry Yiu)
|
||||
- Fix potential fake profile zap attacks (William Casarin)
|
||||
- Fix issue where malicious zappers can send fake zaps to another user's posts (William Casarin)
|
||||
- Fix profile post button mentions (cr0bar)
|
||||
- Fix icons on settings view (cr0bar)
|
||||
- Fix Invalid Zap bug in reposts (William Casarin)
|
||||
|
||||
|
||||
### Removed
|
||||
|
||||
- Remove old @ and & hex key mentions (William Casarin)
|
||||
|
||||
|
||||
[1.6-2]: https://github.com/damus-io/damus/releases/tag/v1.6-2
|
||||
## [1.6] - 2023-07-04
|
||||
|
||||
### Added
|
||||
|
||||
- Speed up user search (Terry Yiu)
|
||||
- Add post button to profile pages (William Casarin)
|
||||
- Add post button when logged in with private key and on own profile view (Terry Yiu)
|
||||
|
||||
### Changed
|
||||
|
||||
- Drop iOS15 support (Scott Penrose)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Load more content on profile view (William Casarin)
|
||||
- Fix reports to conform to NIP-56 (Terry Yiu)
|
||||
- Fix profile navigation bugs from muted users list and relay list views (Terry Yiu)
|
||||
- Fix navigation to translation settings view (Terry Yiu)
|
||||
- Fixed all navigation issues (Scott Penrose)
|
||||
- Disable post button when media upload in progress (Terry Yiu)
|
||||
- Fix taps on mentions in note drafts to not redirect to other Nostr clients (Terry Yiu)
|
||||
- Fix missing profile zap notification text (Terry Yiu)
|
||||
|
||||
|
||||
[1.6]: https://github.com/damus-io/damus/releases/tag/v1.6
|
||||
|
||||
## [1.5-5] - 2023-06-24
|
||||
|
||||
### Fixed
|
||||
|
||||
- Remove note zaps to fit apples appstore guidelines
|
||||
- Fix zap sheet popping (William Casarin)
|
||||
- Fix CustomizeZapView from randomly disappearing (William Casarin)
|
||||
- Fix "zapped your profile" strings to say "zapped you" (Terry Yiu)
|
||||
- Fix reconnect loop issues on iOS17 (William Casarin)
|
||||
- Fix some more thread jankiness (William Casarin)
|
||||
- Fix spelling of Nostr to use Titlecase instead of lowercase (Terry Yiu)
|
||||
- Rename all usages of the term Post as a noun to Note to conform to the Nostr spec (Terry Yiu)
|
||||
- Fix text cutoff on login with npub (gladiusKatana)
|
||||
- Fix hangs due to video player (William Casarin)
|
||||
|
||||
|
||||
[1.5-5]: https://github.com/damus-io/damus/releases/tag/v1.5-5
|
||||
|
||||
## [1.5-2] - 2023-05-30
|
||||
|
||||
### Added
|
||||
|
||||
- Add new full-bleed video player (William Casarin)
|
||||
- Add ability to show multiple posts per user in Universe (Ben Weeks)
|
||||
- Custom iconography added for other areas of the app. (Ben Weeks)
|
||||
- Custom iconography for the left navigation. (Ben Weeks)
|
||||
- Custom iconography for the tab buttons. (Ben Weeks)
|
||||
- Added dots under image carousel (Ben Weeks)
|
||||
- Add profile caching (Bryan Montz)
|
||||
- Add mention parsing and fine-grained text selection on description in ProfileView (Terry Yiu)
|
||||
|
||||
|
||||
### Changed
|
||||
|
||||
- Redesign phase 1 (text, icons)
|
||||
- Updated UI to use custom font (Ben Weeks)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix side menu bug in landscape (OlegAba)
|
||||
- Use "Follow me on nostr" text when looking at someone else's QR code (Ben Weeks)
|
||||
- Fix issue where cursor dissapears when typing long message (gladiusKatana)
|
||||
- Attempt fix for randomly broken animated gifs (William Casarin)
|
||||
- Fix cursor jumping when pressing return (gladius)
|
||||
- Fix side menu label size so that translations in longer languages fit without wrapping (Terry Yiu)
|
||||
- Fix reaction notification title to be consistent with ReactionView (Terry Yiu)
|
||||
- Fix nostr URL scheme to open properly even if there's already a different view open (Terry Yiu)
|
||||
- Fix crash related to preloading events (Bryan Montz)
|
||||
|
||||
|
||||
## v1.4.3 - 2023-05-08
|
||||
|
||||
### Added
|
||||
|
||||
- Add #zaps and #onlyzaps to custom hashtags (William Casarin)
|
||||
- Add OnlyZaps mode: disable reactions, only zaps! (William Casarin)
|
||||
- Add QR Code in profiles (ericholguin)
|
||||
- Add confirmation alert when clearing all bookmarks (Swift)
|
||||
- Add deep links for local notifications (Swift)
|
||||
- Add friends filter to DMs (William Casarin)
|
||||
- Add image metadata to image uploads (William Casarin)
|
||||
- Add nokyctranslate translation option (symbsrcool)
|
||||
- Add partial support for different repost variants (William Casarin)
|
||||
- Add paste button to login (Suhail Saqan)
|
||||
- Add q tag to quoted renotes (William Casarin)
|
||||
- Add setting to hide reactions (Terry Yiu)
|
||||
- Add thread muting (Terry Yiu)
|
||||
- Add unmute option in profile view (Joshua Jiang)
|
||||
- Add webp image support (William Casarin)
|
||||
- Added event preloading when scrolling (William Casarin)
|
||||
- Colorize friend icons (William Casarin)
|
||||
- Friends filter for notifications (William Casarin)
|
||||
- Preload images so they don't pop in (William Casarin)
|
||||
- Preload profile pictures while scrolling (William Casarin)
|
||||
- Preview media uploads when posting (Swift)
|
||||
- Save keys when logging in and when creating new keypair (Bryan Montz)
|
||||
- Show blurhash placeholders from image metadata (William Casarin)
|
||||
- Top-level tab state restoration (Bryan Montz)
|
||||
- You can now change the default zap type (William Casarin)
|
||||
- new iconography (Roberto Agreda)
|
||||
|
||||
|
||||
### Changed
|
||||
|
||||
- Add number formatting for sats entry and use selected zaps amount from picker as placeholder (Terry Yiu)
|
||||
- Adjust attachment images placement when posting (Swift)
|
||||
- Always check signatures of profile events (William Casarin)
|
||||
- Ask permission before uploading media (Swift)
|
||||
- Cached various UI elements so its not as laggy (William Casarin)
|
||||
- Change 500 custom zap to 420 (William Casarin)
|
||||
- Changed look of Repost and Quote buttons (ericholguin)
|
||||
- Enable like button on OnlyZaps profiles for people who don't have OnlyZaps mode on (William Casarin)
|
||||
- Load zaps instantly on events (William Casarin)
|
||||
- New looks to the custom zaps view (ericholguin)
|
||||
- Only show friends, not friend-of-friend in friend filter (William Casarin)
|
||||
- Preload events when they are queued (William Casarin)
|
||||
- Search hashtags automatically (William Casarin)
|
||||
- Show DM message in local notification (William Casarin)
|
||||
- replace Vault dependency with @KeychainStorage property wrapper (Bryan Montz)
|
||||
|
||||
|
||||
### Fixed
|
||||
|
||||
- Dismiss bookmarks view when switching tabs (William Casarin)
|
||||
- Do not allow non-numeric characters for sats amount and fix numeric entry for other number systems for all locales (Terry Yiu)
|
||||
- Do not translate own notes if logged in with private key (Terry Yiu)
|
||||
- Don't process blurhash if we already have image cached (William Casarin)
|
||||
- Fix "translated from english" bugs (William Casarin)
|
||||
- Fix Copy Link action does not dismiss ShareAction view (Bryan Montz)
|
||||
- Fix auto-translations bug where languages in preferred language still gets translated (Terry Yiu)
|
||||
- Fix bug where you could only mention users at the end of a post (Swift)
|
||||
- Fix bug with reaction notifications referencing the wrong event (Terry Yiu)
|
||||
- Fix buggy zap amounts and wallet selector settings (William Casarin)
|
||||
- Fix camera not dismissing (Swift)
|
||||
- Fix crash when loading DMs in the background (William Casarin)
|
||||
- Fix crash when you have invalid relays in your relay list (William Casarin)
|
||||
- Fix crash with LibreTranslate server setting selection and remove delisted vern server (Terry Yiu)
|
||||
- Fix having to set onlyzaps mode every time on restart (William Casarin)
|
||||
- Fix invalid DM author notifications (William Casarin)
|
||||
- Fix issue where uploaded images were from someone else (Swift)
|
||||
- Fix npub search fails on the first try (Bryan Montz)
|
||||
- Fix parse mention without space in content (Joshua Jiang)
|
||||
- Fix posts with no uploadedURLs always get two blank spaces at the end (Bryan Montz)
|
||||
- Fix relay signal indicator, properly show how many relays you are connected to (William Casarin)
|
||||
- Fix shuffling when choosing users to reply to (Joshua Jiang)
|
||||
- Fix slow reconnection issues (Bryan Montz)
|
||||
- Fix tap area when mentioning users (OlegAba)
|
||||
- Fix thread incompatibility for clients that add more than one reply tag (William Casarin)
|
||||
- Fix user notifications from old events immediately shown on install and login (Bryan Montz)
|
||||
- Fix weird #\[0] artifacts appearing in posts (William Casarin)
|
||||
- Fix wrong relative times on events (William Casarin)
|
||||
- Fixed blurhash appearing behind loaded images when swiping on carousel (William Casarin)
|
||||
- Fixed glitchy preview (William Casarin)
|
||||
- Fixed preview elements popping in (William Casarin)
|
||||
- Fixed repost turning green too early and not reposting sometimes (Swift)
|
||||
- Home now dismisses reactions view (William Casarin)
|
||||
- Load missing profiles from boosts on home view (Gísli Kristjánsson)
|
||||
- Load missing profiles from boosts on profile view (Gísli Kristjánsson)
|
||||
- Load profiles in hashtag searched (William Casarin)
|
||||
- Made DMs less poppy (William Casarin)
|
||||
- Preserve order of bookmarks when saving (William Casarin)
|
||||
- Properly scroll DM view when keyboard is open (William Casarin)
|
||||
- Saved Jack's soul. (Ben Weeks)
|
||||
- Zap type selection on smaller phones (ericholguin)
|
||||
|
||||
[1.4.3-21]: https://github.com/damus-io/damus/releases/tag/v1.4.3-21
|
||||
|
||||
## [1.4.3-20] - 2023-05-04
|
||||
|
||||
### Added
|
||||
|
||||
- Add webp image support (William Casarin)
|
||||
- Preload profile pictures while scrolling (William Casarin)
|
||||
- Save keys when logging in and when creating new keypair (Bryan Montz)
|
||||
- Top-level tab state restoration (Bryan Montz)
|
||||
- Added event preloading when scrolling (William Casarin)
|
||||
- Preload images so they don't pop in (William Casarin)
|
||||
|
||||
|
||||
### Changed
|
||||
|
||||
- Preload events when they are queued (William Casarin)
|
||||
- Search hashtags automatically (William Casarin)
|
||||
- Cached various UI elements so its not as laggy (William Casarin)
|
||||
|
||||
|
||||
### Fixed
|
||||
|
||||
- Don't process blurhash if we already have image cached (William Casarin)
|
||||
- Home now dismisses reactions view (William Casarin)
|
||||
- Fix auto-translations bug where languages in preferred language still gets translated (Terry Yiu)
|
||||
- Fix wrong relative times on events (William Casarin)
|
||||
- Load profiles in hashtag searched (William Casarin)
|
||||
- Fix weird #\[0] artifacts appearing in posts (William Casarin)
|
||||
- Fix "translated from english" bugs (Terry)
|
||||
- Fix crash when loading DMs in the background (William Casarin)
|
||||
- Fixed blurhash appearing behind loaded images when swiping on carousel (William Casarin)
|
||||
- Fix camera not dismissing (Swift)
|
||||
- Fix bug with reaction notifications referencing the wrong event (Terry Yiu)
|
||||
- Fix Copy Link action does not dismiss ShareAction view (Bryan Montz)
|
||||
- Saved Jack's soul. (Ben Weeks)
|
||||
- Fixed preview elements popping in (William Casarin)
|
||||
- Fixed glitchy preview (William Casarin)
|
||||
|
||||
|
||||
|
||||
[1.4.3-20]: https://github.com/damus-io/damus/releases/tag/v1.4.3-20
|
||||
## [1.4.3-15] - 2023-04-29
|
||||
|
||||
### Added
|
||||
|
||||
- Add q tag to quoted renotes (William Casarin)
|
||||
- Add confirmation alert when clearing all bookmarks (Swift)
|
||||
- Show blurhash placeholders from image metadata (William Casarin)
|
||||
- Add image metadata to image uploads (William Casarin)
|
||||
|
||||
|
||||
### Changed
|
||||
|
||||
- Load zaps instantly on events (William Casarin)
|
||||
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix thread incompatibility for clients that add more than one reply tag (amethyst, plebstr)
|
||||
- Preserve order of bookmarks when saving (William Casarin)
|
||||
- Fix crash when you have invalid relays in your relay list (William Casarin)
|
||||
|
||||
|
||||
|
||||
[1.4.3-14]: https://github.com/damus-io/damus/releases/tag/v1.4.3-14
|
||||
|
||||
## [1.4.3-10] - 2023-04-25
|
||||
|
||||
### Added
|
||||
|
||||
- Add paste button to login (Suhail Saqan)
|
||||
- Add nokyctranslate translation option (symbsrcool)
|
||||
- You can now change the default zap type (William Casarin)
|
||||
- Add partial support for different repost variants (William Casarin)
|
||||
|
||||
|
||||
### Changed
|
||||
|
||||
- Change 500 custom zap to 420 (William Casarin)
|
||||
- New looks to the custom zaps view (ericholguin)
|
||||
- Adjust attachment images placement when posting (Swift)
|
||||
- Only show friends, not friend-of-friend in friend filter (William Casarin)
|
||||
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix reposts on macos and ipad (William Casarin)
|
||||
- Fix slow reconnection issues (Bryan Montz)
|
||||
- Fix issue where uploaded images were from someone else (Swift)
|
||||
- Fix crash with LibreTranslate server setting selection and remove delisted vern server (Terry Yiu)
|
||||
- Fix buggy zap amounts and wallet selector settings (William Casarin)
|
||||
|
||||
|
||||
[1.4.3-10]: https://github.com/damus-io/damus/releases/tag/v1.4.3-10
|
||||
|
||||
## [1.4.3-2] - 2023-04-17
|
||||
|
||||
### Added
|
||||
|
||||
- Add deep links for local notifications (Swift)
|
||||
- Add deep links for local notifications (Swift + Will)
|
||||
- Add thread muting (Terry Yiu)
|
||||
- Preview media uploads when posting (Swift)
|
||||
- Add QR Code in profiles (ericholguin)
|
||||
@@ -347,24 +10,18 @@
|
||||
|
||||
### Changed
|
||||
|
||||
- Always check signatures of profile events (William Casarin)
|
||||
- Ask permission before uploading media (Swift)
|
||||
- Show DM message in local notification (William Casarin)
|
||||
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed repost turning green too early and not reposting sometimes (Swift)
|
||||
- Fix shuffling when choosing users to reply to (Joshua Jiang)
|
||||
- Do not translate own notes if logged in with private key (Terry Yiu)
|
||||
- Load missing profiles from boosts on home view (Gísli Kristjánsson)
|
||||
- Load missing profiles from boosts on profile view (Gísli Kristjánsson)
|
||||
- Fix tap area when mentioning users (OlegAba)
|
||||
- Fix invalid DM author notifications (William Casarin)
|
||||
- Fix relay signal indicator, properly show how many relays you are connected to (William Casarin)
|
||||
|
||||
|
||||
[1.4.3-2]: https://github.com/damus-io/damus/releases/tag/v1.4.3-2
|
||||
[1.4.3-1]: https://github.com/damus-io/damus/releases/tag/v1.4.3-1
|
||||
|
||||
## [1.4.2-2] - 2023-04-12
|
||||
|
||||
|
||||
8
Makefile
@@ -1,8 +0,0 @@
|
||||
|
||||
all: nostrscript/primal.wasm
|
||||
|
||||
nostrscript/%.wasm: nostrscript/%.ts nostrscript/nostr.ts Makefile
|
||||
asc $< --runtime stub --outFile $@ --optimize
|
||||
|
||||
clean:
|
||||
rm nostrscript/*.wasm
|
||||
@@ -1,3 +1,4 @@
|
||||
dependencies: [
|
||||
.Package(url: "https://github.com/daltoniam/Starscream.git", majorVersion: 4),
|
||||
.Package(url: "https://github.com/jb55/secp256k1.swift.git", branch: "main")
|
||||
]
|
||||
|
||||
25
README.md
@@ -92,30 +92,13 @@ damus implements the following [Nostr Implementation Possibilities][nips]
|
||||
|
||||
## Contributing
|
||||
|
||||
Contributors welcome! Start by examining known issues: https://github.com/damus-io/damus/issues.
|
||||
Contributors welcome!
|
||||
|
||||
### Mailing lists
|
||||
### Code
|
||||
|
||||
We have a few mailing lists that anyone can join to get involved in damus development:
|
||||
[Email patches][git-send-email] to jb55@jb55.com are preferred, but I accept PRs on GitHub as well.
|
||||
|
||||
- [dev][dev-list] - development discussions
|
||||
- [patches][patches-list] - code submission and review
|
||||
- [product][product-list] - product discussions
|
||||
- [design][design-list] - design discussions
|
||||
|
||||
[dev-list]: https://damus.io/list/dev
|
||||
[patches-list]: https://damus.io/list/patches
|
||||
[product-list]: https://damus.io/list/product
|
||||
[design-list]: https://damus.io/list/design
|
||||
|
||||
### Contributing
|
||||
|
||||
See [docs/CONTRIBUTING.md](./docs/CONTRIBUTING.md)
|
||||
|
||||
### Privacy
|
||||
Your internet protocol (IP) address is exposed to the relays you connect to, and third party media hosters (e.g. nostr.build, imgur.com, giphy.com, youtube.com etc.) that render on Damus. If you want to improve your privacy, consider utilizing a service that masks your IP address (e.g. a VPN) from trackers online.
|
||||
|
||||
The relay also learns which public keys you are requesting, meaning your public key will be tied to your IP address.
|
||||
[git-send-email]: http://git-send-email.io
|
||||
|
||||
### Translations
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ typedef struct mention_bech32_block {
|
||||
struct nostr_bech32 bech32;
|
||||
} mention_bech32_block_t;
|
||||
|
||||
typedef struct note_block {
|
||||
typedef struct block {
|
||||
enum block_type type;
|
||||
union {
|
||||
struct str_block str;
|
||||
@@ -45,13 +45,12 @@ typedef struct note_block {
|
||||
} block;
|
||||
} block_t;
|
||||
|
||||
typedef struct note_blocks {
|
||||
int words;
|
||||
typedef struct blocks {
|
||||
int num_blocks;
|
||||
struct note_block *blocks;
|
||||
struct block *blocks;
|
||||
} blocks_t;
|
||||
|
||||
void blocks_init(struct note_blocks *blocks);
|
||||
void blocks_free(struct note_blocks *blocks);
|
||||
void blocks_init(struct blocks *blocks);
|
||||
void blocks_free(struct blocks *blocks);
|
||||
|
||||
#endif /* block_h */
|
||||
|
||||
501
damus-c/cursor.h
@@ -1,438 +1,30 @@
|
||||
//
|
||||
// cursor.h
|
||||
// damus
|
||||
//
|
||||
// Created by William Casarin on 2023-04-09.
|
||||
//
|
||||
|
||||
#ifndef PROTOVERSE_CURSOR_H
|
||||
#define PROTOVERSE_CURSOR_H
|
||||
#ifndef cursor_h
|
||||
#define cursor_h
|
||||
|
||||
#include "typedefs.h"
|
||||
#include "varint.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#define unlikely(x) __builtin_expect((x),0)
|
||||
#define likely(x) __builtin_expect((x),1)
|
||||
typedef unsigned char u8;
|
||||
|
||||
struct cursor {
|
||||
unsigned char *start;
|
||||
unsigned char *p;
|
||||
unsigned char *end;
|
||||
const u8 *p;
|
||||
const u8 *start;
|
||||
const u8 *end;
|
||||
};
|
||||
|
||||
struct array {
|
||||
struct cursor cur;
|
||||
unsigned int elem_size;
|
||||
};
|
||||
|
||||
static inline void reset_cursor(struct cursor *cursor)
|
||||
{
|
||||
cursor->p = cursor->start;
|
||||
}
|
||||
|
||||
static inline void wipe_cursor(struct cursor *cursor)
|
||||
{
|
||||
reset_cursor(cursor);
|
||||
memset(cursor->start, 0, cursor->end - cursor->start);
|
||||
}
|
||||
|
||||
static inline void make_cursor(u8 *start, u8 *end, struct cursor *cursor)
|
||||
{
|
||||
cursor->start = start;
|
||||
cursor->p = start;
|
||||
cursor->end = end;
|
||||
}
|
||||
|
||||
static inline void make_array(struct array *a, u8* start, u8 *end, unsigned int elem_size)
|
||||
{
|
||||
make_cursor(start, end, &a->cur);
|
||||
a->elem_size = elem_size;
|
||||
}
|
||||
|
||||
static inline int cursor_eof(struct cursor *c)
|
||||
{
|
||||
return c->p == c->end;
|
||||
}
|
||||
|
||||
static inline void *cursor_malloc(struct cursor *mem, unsigned long size)
|
||||
{
|
||||
void *ret;
|
||||
|
||||
if (mem->p + size > mem->end) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = mem->p;
|
||||
mem->p += size;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void *cursor_alloc(struct cursor *mem, unsigned long size)
|
||||
{
|
||||
void *ret;
|
||||
if (!(ret = cursor_malloc(mem, size))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
memset(ret, 0, size);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int cursor_slice(struct cursor *mem, struct cursor *slice, size_t size)
|
||||
{
|
||||
u8 *p;
|
||||
if (!(p = cursor_alloc(mem, size))) {
|
||||
return 0;
|
||||
}
|
||||
make_cursor(p, mem->p, slice);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static inline void copy_cursor(struct cursor *src, struct cursor *dest)
|
||||
{
|
||||
dest->start = src->start;
|
||||
dest->p = src->p;
|
||||
dest->end = src->end;
|
||||
}
|
||||
|
||||
static inline int pull_byte(struct cursor *cursor, u8 *c)
|
||||
{
|
||||
if (unlikely(cursor->p >= cursor->end))
|
||||
return 0;
|
||||
|
||||
*c = *cursor->p;
|
||||
cursor->p++;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int cursor_pull_c_str(struct cursor *cursor, const char **str)
|
||||
{
|
||||
*str = (const char*)cursor->p;
|
||||
|
||||
for (; cursor->p < cursor->end; cursor->p++) {
|
||||
if (*cursor->p == 0) {
|
||||
cursor->p++;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static inline int cursor_push_byte(struct cursor *cursor, u8 c)
|
||||
{
|
||||
if (unlikely(cursor->p + 1 > cursor->end)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
*cursor->p = c;
|
||||
cursor->p++;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int cursor_pull(struct cursor *cursor, u8 *data, int len)
|
||||
{
|
||||
if (unlikely(cursor->p + len > cursor->end)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
memcpy(data, cursor->p, len);
|
||||
cursor->p += len;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int pull_data_into_cursor(struct cursor *cursor,
|
||||
struct cursor *dest,
|
||||
unsigned char **data,
|
||||
int len)
|
||||
{
|
||||
int ok;
|
||||
|
||||
if (unlikely(dest->p + len > dest->end)) {
|
||||
printf("not enough room in dest buffer\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
ok = cursor_pull(cursor, dest->p, len);
|
||||
if (!ok) return 0;
|
||||
|
||||
*data = dest->p;
|
||||
dest->p += len;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int cursor_dropn(struct cursor *cur, int size, int n)
|
||||
{
|
||||
if (n == 0)
|
||||
return 1;
|
||||
|
||||
if (unlikely(cur->p - size*n < cur->start)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
cur->p -= size*n;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int cursor_drop(struct cursor *cur, int size)
|
||||
{
|
||||
return cursor_dropn(cur, size, 1);
|
||||
}
|
||||
|
||||
static inline unsigned char *cursor_topn(struct cursor *cur, int len, int n)
|
||||
{
|
||||
n += 1;
|
||||
if (unlikely(cur->p - len*n < cur->start)) {
|
||||
return NULL;
|
||||
}
|
||||
return cur->p - len*n;
|
||||
}
|
||||
|
||||
static inline unsigned char *cursor_top(struct cursor *cur, int len)
|
||||
{
|
||||
if (unlikely(cur->p - len < cur->start)) {
|
||||
return NULL;
|
||||
}
|
||||
return cur->p - len;
|
||||
}
|
||||
|
||||
static inline int cursor_top_int(struct cursor *cur, int *i)
|
||||
{
|
||||
u8 *p;
|
||||
if (unlikely(!(p = cursor_top(cur, sizeof(*i))))) {
|
||||
return 0;
|
||||
}
|
||||
*i = *((int*)p);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int cursor_pop(struct cursor *cur, u8 *data, int len)
|
||||
{
|
||||
if (unlikely(cur->p - len < cur->start)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
cur->p -= len;
|
||||
memcpy(data, cur->p, len);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int cursor_push(struct cursor *cursor, u8 *data, int len)
|
||||
{
|
||||
if (unlikely(cursor->p + len >= cursor->end)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (cursor->p != data)
|
||||
memcpy(cursor->p, data, len);
|
||||
|
||||
cursor->p += len;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int cursor_push_int(struct cursor *cursor, int i)
|
||||
{
|
||||
return cursor_push(cursor, (u8*)&i, sizeof(i));
|
||||
}
|
||||
|
||||
static inline size_t cursor_count(struct cursor *cursor, size_t elem_size)
|
||||
{
|
||||
return (cursor->p - cursor->start)/elem_size;
|
||||
}
|
||||
|
||||
/* TODO: push_varint */
|
||||
static inline int push_varint(struct cursor *cursor, int n)
|
||||
{
|
||||
int ok, len;
|
||||
unsigned char b;
|
||||
len = 0;
|
||||
|
||||
while (1) {
|
||||
b = (n & 0xFF) | 0x80;
|
||||
n >>= 7;
|
||||
if (n == 0) {
|
||||
b &= 0x7F;
|
||||
ok = cursor_push_byte(cursor, b);
|
||||
len++;
|
||||
if (!ok) return 0;
|
||||
break;
|
||||
}
|
||||
|
||||
ok = cursor_push_byte(cursor, b);
|
||||
len++;
|
||||
if (!ok) return 0;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
/* TODO: pull_varint */
|
||||
static inline int pull_varint(struct cursor *cursor, int *n)
|
||||
{
|
||||
int ok, i;
|
||||
unsigned char b;
|
||||
*n = 0;
|
||||
|
||||
for (i = 0;; i++) {
|
||||
ok = pull_byte(cursor, &b);
|
||||
if (!ok) return 0;
|
||||
|
||||
*n |= ((int)b & 0x7F) << (i * 7);
|
||||
|
||||
/* is_last */
|
||||
if ((b & 0x80) == 0) {
|
||||
return i+1;
|
||||
}
|
||||
|
||||
if (i == 4) return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int cursor_pull_int(struct cursor *cursor, int *i)
|
||||
{
|
||||
return cursor_pull(cursor, (u8*)i, sizeof(*i));
|
||||
}
|
||||
|
||||
static inline int cursor_push_u16(struct cursor *cursor, u16 i)
|
||||
{
|
||||
return cursor_push(cursor, (u8*)&i, sizeof(i));
|
||||
}
|
||||
|
||||
static inline void *index_cursor(struct cursor *cursor, unsigned int index, int elem_size)
|
||||
{
|
||||
u8 *p;
|
||||
p = &cursor->start[elem_size * index];
|
||||
|
||||
if (unlikely(p >= cursor->end))
|
||||
return NULL;
|
||||
|
||||
return (void*)p;
|
||||
}
|
||||
|
||||
|
||||
static inline int push_sized_str(struct cursor *cursor, const char *str, int len)
|
||||
{
|
||||
return cursor_push(cursor, (u8*)str, len);
|
||||
}
|
||||
|
||||
static inline int cursor_push_str(struct cursor *cursor, const char *str)
|
||||
{
|
||||
return cursor_push(cursor, (u8*)str, (int)strlen(str));
|
||||
}
|
||||
|
||||
static inline int cursor_push_c_str(struct cursor *cursor, const char *str)
|
||||
{
|
||||
return cursor_push_str(cursor, str) && cursor_push_byte(cursor, 0);
|
||||
}
|
||||
|
||||
/* TODO: push varint size */
|
||||
static inline int push_prefixed_str(struct cursor *cursor, const char *str)
|
||||
{
|
||||
int ok, len;
|
||||
len = (int)strlen(str);
|
||||
ok = push_varint(cursor, len);
|
||||
if (!ok) return 0;
|
||||
return push_sized_str(cursor, str, len);
|
||||
}
|
||||
|
||||
static inline int pull_prefixed_str(struct cursor *cursor, struct cursor *dest_buf, const char **str)
|
||||
{
|
||||
int len, ok;
|
||||
|
||||
ok = pull_varint(cursor, &len);
|
||||
if (!ok) return 0;
|
||||
|
||||
if (unlikely(dest_buf->p + len > dest_buf->end)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
ok = pull_data_into_cursor(cursor, dest_buf, (unsigned char**)str, len);
|
||||
if (!ok) return 0;
|
||||
|
||||
ok = cursor_push_byte(dest_buf, 0);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int cursor_remaining_capacity(struct cursor *cursor)
|
||||
{
|
||||
return (int)(cursor->end - cursor->p);
|
||||
}
|
||||
|
||||
|
||||
#define max(a,b) ((a) > (b) ? (a) : (b))
|
||||
static inline void cursor_print_around(struct cursor *cur, int range)
|
||||
{
|
||||
unsigned char *c;
|
||||
|
||||
printf("[%ld/%ld]\n", cur->p - cur->start, cur->end - cur->start);
|
||||
|
||||
c = max(cur->p - range, cur->start);
|
||||
for (; c < cur->end && c < (cur->p + range); c++) {
|
||||
printf("%02x", *c);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
c = max(cur->p - range, cur->start);
|
||||
for (; c < cur->end && c < (cur->p + range); c++) {
|
||||
if (c == cur->p) {
|
||||
printf("^");
|
||||
continue;
|
||||
}
|
||||
printf(" ");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
#undef max
|
||||
|
||||
static inline int pull_bytes(struct cursor *cur, int count, const u8 **bytes) {
|
||||
if (cur->p + count > cur->end)
|
||||
return 0;
|
||||
|
||||
*bytes = cur->p;
|
||||
cur->p += count;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int parse_str(struct cursor *cur, const char *str) {
|
||||
int i;
|
||||
char c, cs;
|
||||
unsigned long len;
|
||||
|
||||
len = strlen(str);
|
||||
|
||||
if (cur->p + len >= cur->end)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
c = tolower(cur->p[i]);
|
||||
cs = tolower(str[i]);
|
||||
|
||||
if (c != cs)
|
||||
return 0;
|
||||
}
|
||||
|
||||
cur->p += len;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int is_whitespace(char c) {
|
||||
return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r';
|
||||
}
|
||||
|
||||
static inline int is_boundary(char c) {
|
||||
return is_whitespace(c) || ispunct(c);
|
||||
return !isalnum(c);
|
||||
}
|
||||
|
||||
static inline int is_invalid_url_ending(char c) {
|
||||
@@ -443,6 +35,13 @@ static inline int is_alphanumeric(char c) {
|
||||
return (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9');
|
||||
}
|
||||
|
||||
static inline void make_cursor(struct cursor *c, const u8 *content, size_t len)
|
||||
{
|
||||
c->start = content;
|
||||
c->end = content + len;
|
||||
c->p = content;
|
||||
}
|
||||
|
||||
static inline int consume_until_boundary(struct cursor *cur) {
|
||||
char c;
|
||||
|
||||
@@ -511,4 +110,62 @@ static inline int peek_char(struct cursor *cur, int ind) {
|
||||
return *(cur->p + ind);
|
||||
}
|
||||
|
||||
#endif
|
||||
static int parse_digit(struct cursor *cur, int *digit) {
|
||||
int c;
|
||||
if ((c = peek_char(cur, 0)) == -1)
|
||||
return 0;
|
||||
|
||||
c -= '0';
|
||||
|
||||
if (c >= 0 && c <= 9) {
|
||||
*digit = c;
|
||||
cur->p++;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static inline int pull_byte(struct cursor *cur, u8 *byte) {
|
||||
if (cur->p >= cur->end)
|
||||
return 0;
|
||||
|
||||
*byte = *cur->p;
|
||||
cur->p++;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int pull_bytes(struct cursor *cur, int count, const u8 **bytes) {
|
||||
if (cur->p + count > cur->end)
|
||||
return 0;
|
||||
|
||||
*bytes = cur->p;
|
||||
cur->p += count;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int parse_str(struct cursor *cur, const char *str) {
|
||||
int i;
|
||||
char c, cs;
|
||||
unsigned long len;
|
||||
|
||||
len = strlen(str);
|
||||
|
||||
if (cur->p + len >= cur->end)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
c = tolower(cur->p[i]);
|
||||
cs = tolower(str[i]);
|
||||
|
||||
if (c != cs)
|
||||
return 0;
|
||||
}
|
||||
|
||||
cur->p += len;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
#endif /* cursor_h */
|
||||
|
||||
@@ -5,7 +5,3 @@
|
||||
#include "damus.h"
|
||||
#include "bolt11.h"
|
||||
#include "amount.h"
|
||||
#include "nostr_bech32.h"
|
||||
#include "wasm.h"
|
||||
#include "nostrscript.h"
|
||||
|
||||
|
||||
@@ -12,25 +12,9 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
static int parse_digit(struct cursor *cur, int *digit) {
|
||||
int c;
|
||||
if ((c = peek_char(cur, 0)) == -1)
|
||||
return 0;
|
||||
|
||||
c -= '0';
|
||||
|
||||
if (c >= 0 && c <= 9) {
|
||||
*digit = c;
|
||||
cur->p++;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int parse_mention_index(struct cursor *cur, struct note_block *block) {
|
||||
static int parse_mention_index(struct cursor *cur, struct block *block) {
|
||||
int d1, d2, d3, ind;
|
||||
u8 *start = cur->p;
|
||||
const u8 *start = cur->p;
|
||||
|
||||
if (!parse_str(cur, "#["))
|
||||
return 0;
|
||||
@@ -59,9 +43,9 @@ static int parse_mention_index(struct cursor *cur, struct note_block *block) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int parse_hashtag(struct cursor *cur, struct note_block *block) {
|
||||
static int parse_hashtag(struct cursor *cur, struct block *block) {
|
||||
int c;
|
||||
u8 *start = cur->p;
|
||||
const u8 *start = cur->p;
|
||||
|
||||
if (!parse_char(cur, '#'))
|
||||
return 0;
|
||||
@@ -81,7 +65,7 @@ static int parse_hashtag(struct cursor *cur, struct note_block *block) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int add_block(struct note_blocks *blocks, struct note_block block)
|
||||
static int add_block(struct blocks *blocks, struct block block)
|
||||
{
|
||||
if (blocks->num_blocks + 1 >= MAX_BLOCKS)
|
||||
return 0;
|
||||
@@ -90,9 +74,9 @@ static int add_block(struct note_blocks *blocks, struct note_block block)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int add_text_block(struct note_blocks *blocks, const u8 *start, const u8 *end)
|
||||
static int add_text_block(struct blocks *blocks, const u8 *start, const u8 *end)
|
||||
{
|
||||
struct note_block b;
|
||||
struct block b;
|
||||
|
||||
if (start == end)
|
||||
return 1;
|
||||
@@ -104,8 +88,8 @@ static int add_text_block(struct note_blocks *blocks, const u8 *start, const u8
|
||||
return add_block(blocks, b);
|
||||
}
|
||||
|
||||
static int parse_url(struct cursor *cur, struct note_block *block) {
|
||||
u8 *start = cur->p;
|
||||
static int parse_url(struct cursor *cur, struct block *block) {
|
||||
const u8 *start = cur->p;
|
||||
|
||||
if (!parse_str(cur, "http"))
|
||||
return 0;
|
||||
@@ -137,8 +121,8 @@ static int parse_url(struct cursor *cur, struct note_block *block) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int parse_invoice(struct cursor *cur, struct note_block *block) {
|
||||
u8 *start, *end;
|
||||
static int parse_invoice(struct cursor *cur, struct block *block) {
|
||||
const u8 *start, *end;
|
||||
char *fail;
|
||||
struct bolt11 *bolt11;
|
||||
// optional
|
||||
@@ -177,12 +161,12 @@ static int parse_invoice(struct cursor *cur, struct note_block *block) {
|
||||
}
|
||||
|
||||
|
||||
static int parse_mention_bech32(struct cursor *cur, struct note_block *block) {
|
||||
u8 *start = cur->p;
|
||||
static int parse_mention_bech32(struct cursor *cur, struct block *block) {
|
||||
const u8 *start = cur->p;
|
||||
|
||||
if (!parse_str(cur, "nostr:"))
|
||||
return 0;
|
||||
|
||||
parse_char(cur, '@');
|
||||
parse_str(cur, "nostr:");
|
||||
|
||||
block->block.str.start = (const char *)cur->p;
|
||||
|
||||
if (!parse_nostr_bech32(cur, &block->block.mention_bech32.bech32)) {
|
||||
@@ -197,7 +181,7 @@ static int parse_mention_bech32(struct cursor *cur, struct note_block *block) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int add_text_then_block(struct cursor *cur, struct note_blocks *blocks, struct note_block block, u8 **start, const u8 *pre_mention)
|
||||
static int add_text_then_block(struct cursor *cur, struct blocks *blocks, struct block block, const u8 **start, const u8 *pre_mention)
|
||||
{
|
||||
if (!add_text_block(blocks, *start, pre_mention))
|
||||
return 0;
|
||||
@@ -210,28 +194,22 @@ static int add_text_then_block(struct cursor *cur, struct note_blocks *blocks, s
|
||||
return 1;
|
||||
}
|
||||
|
||||
int damus_parse_content(struct note_blocks *blocks, const char *content) {
|
||||
int damus_parse_content(struct blocks *blocks, const char *content) {
|
||||
int cp, c;
|
||||
struct cursor cur;
|
||||
struct note_block block;
|
||||
u8 *start, *pre_mention;
|
||||
struct block block;
|
||||
const u8 *start, *pre_mention;
|
||||
|
||||
blocks->words = 0;
|
||||
blocks->num_blocks = 0;
|
||||
make_cursor((u8*)content, (u8*)content + strlen(content), &cur);
|
||||
make_cursor(&cur, (const u8*)content, strlen(content));
|
||||
|
||||
start = cur.p;
|
||||
while (cur.p < cur.end && blocks->num_blocks < MAX_BLOCKS) {
|
||||
cp = peek_char(&cur, -1);
|
||||
c = peek_char(&cur, 0);
|
||||
|
||||
// new word
|
||||
if (is_whitespace(cp) && !is_whitespace(c)) {
|
||||
blocks->words++;
|
||||
}
|
||||
|
||||
pre_mention = cur.p;
|
||||
if (cp == -1 || is_boundary(cp) || c == '#') {
|
||||
if (cp == -1 || is_whitespace(cp)) {
|
||||
if (c == '#' && (parse_mention_index(&cur, &block) || parse_hashtag(&cur, &block))) {
|
||||
if (!add_text_then_block(&cur, blocks, block, &start, pre_mention))
|
||||
return 0;
|
||||
@@ -244,7 +222,7 @@ int damus_parse_content(struct note_blocks *blocks, const char *content) {
|
||||
if (!add_text_then_block(&cur, blocks, block, &start, pre_mention))
|
||||
return 0;
|
||||
continue;
|
||||
} else if ((c == 'n' || c == '@') && parse_mention_bech32(&cur, &block)) {
|
||||
} else if (c == 'n' && parse_mention_bech32(&cur, &block)) {
|
||||
if (!add_text_then_block(&cur, blocks, block, &start, pre_mention))
|
||||
return 0;
|
||||
continue;
|
||||
@@ -262,12 +240,12 @@ int damus_parse_content(struct note_blocks *blocks, const char *content) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
void blocks_init(struct note_blocks *blocks) {
|
||||
blocks->blocks = malloc(sizeof(struct note_block) * MAX_BLOCKS);
|
||||
void blocks_init(struct blocks *blocks) {
|
||||
blocks->blocks = malloc(sizeof(struct block) * MAX_BLOCKS);
|
||||
blocks->num_blocks = 0;
|
||||
}
|
||||
|
||||
void blocks_free(struct note_blocks *blocks) {
|
||||
void blocks_free(struct blocks *blocks) {
|
||||
if (!blocks->blocks) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -9,10 +9,10 @@
|
||||
#define damus_h
|
||||
|
||||
#include <stdio.h>
|
||||
#include "nostr_bech32.h"
|
||||
#include "block.h"
|
||||
|
||||
typedef unsigned char u8;
|
||||
|
||||
int damus_parse_content(struct note_blocks *blocks, const char *content);
|
||||
int damus_parse_content(struct blocks *blocks, const char *content);
|
||||
|
||||
#endif /* damus_h */
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
|
||||
#ifndef PROTOVERSE_DEBUG_H
|
||||
#define PROTOVERSE_DEBUG_H
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#define unusual(...) fprintf(stderr, "UNUSUAL: " __VA_ARGS__)
|
||||
|
||||
#ifdef DEBUG
|
||||
#define debug(...) printf(__VA_ARGS__)
|
||||
#else
|
||||
#define debug(...)
|
||||
#endif
|
||||
|
||||
#endif /* PROTOVERSE_DEBUG_H */
|
||||
@@ -1,34 +0,0 @@
|
||||
|
||||
#include "error.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
int note_error_(struct errors *errs_, struct cursor *p, const char *fmt, ...)
|
||||
{
|
||||
static char buf[512];
|
||||
struct error err;
|
||||
struct cursor *errs;
|
||||
va_list ap;
|
||||
|
||||
errs = &errs_->cur;
|
||||
|
||||
if (errs_->enabled == 0)
|
||||
return 0;
|
||||
|
||||
va_start(ap, fmt);
|
||||
vsprintf(buf, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
err.msg = buf;
|
||||
err.pos = p ? (int)(p->p - p->start) : 0;
|
||||
|
||||
if (!cursor_push_error(errs, &err)) {
|
||||
fprintf(stderr, "arena OOM when recording error, ");
|
||||
fprintf(stderr, "errs->p at %ld, remaining %ld, strlen %ld\n",
|
||||
errs->p - errs->start, errs->end - errs->p, strlen(buf));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
|
||||
#ifndef PROTOVERSE_ERROR_H
|
||||
#define PROTOVERSE_ERROR_H
|
||||
|
||||
#include "cursor.h"
|
||||
|
||||
struct error {
|
||||
int pos;
|
||||
const char *msg;
|
||||
};
|
||||
|
||||
struct errors {
|
||||
struct cursor cur;
|
||||
int enabled;
|
||||
};
|
||||
|
||||
#define note_error(errs, p, fmt, ...) note_error_(errs, p, "%s: " fmt, __FUNCTION__, ##__VA_ARGS__)
|
||||
|
||||
static inline int cursor_push_error(struct cursor *cur, struct error *err)
|
||||
{
|
||||
return cursor_push_int(cur, err->pos) &&
|
||||
cursor_push_c_str(cur, err->msg);
|
||||
}
|
||||
|
||||
static inline int cursor_pull_error(struct cursor *cur, struct error *err)
|
||||
{
|
||||
return cursor_pull_int(cur, &err->pos) &&
|
||||
cursor_pull_c_str(cur, &err->msg);
|
||||
}
|
||||
|
||||
int note_error_(struct errors *errs, struct cursor *p, const char *fmt, ...);
|
||||
|
||||
#endif /* PROTOVERSE_ERROR_H */
|
||||
@@ -26,7 +26,7 @@ bool hex_decode(const char *str, size_t slen, void *buf, size_t bufsize);
|
||||
/**
|
||||
* hex_encode - Create a nul-terminated hex string
|
||||
* @buf: the buffer to read the data from
|
||||
* @bufsize: the length of buf
|
||||
* @bufsize: the length of @buf
|
||||
* @dest: the string to fill
|
||||
* @destsize: the max size of the string
|
||||
*
|
||||
|
||||
@@ -52,13 +52,9 @@
|
||||
*/
|
||||
#define unlikely(cond) __builtin_expect(!!(cond), 0)
|
||||
#else
|
||||
#ifndef likely
|
||||
#define likely(cond) (!!(cond))
|
||||
#endif
|
||||
#ifndef unlikely
|
||||
#define unlikely(cond) (!!(cond))
|
||||
#endif
|
||||
#endif
|
||||
#else /* CCAN_LIKELY_DEBUG versions */
|
||||
#include <ccan/str/str.h>
|
||||
|
||||
|
||||
@@ -91,9 +91,6 @@ static int parse_nostr_bech32_type(const char *prefix, enum nostr_bech32_type *t
|
||||
} else if (strcmp(prefix, "npub") == 0) {
|
||||
*type = NOSTR_BECH32_NPUB;
|
||||
return 1;
|
||||
} else if (strcmp(prefix, "nsec") == 0) {
|
||||
*type = NOSTR_BECH32_NSEC;
|
||||
return 1;
|
||||
} else if (strcmp(prefix, "nprofile") == 0) {
|
||||
*type = NOSTR_BECH32_NPROFILE;
|
||||
return 1;
|
||||
@@ -119,10 +116,6 @@ static int parse_nostr_bech32_npub(struct cursor *cur, struct bech32_npub *npub)
|
||||
return pull_bytes(cur, 32, &npub->pubkey);
|
||||
}
|
||||
|
||||
static int parse_nostr_bech32_nsec(struct cursor *cur, struct bech32_nsec *nsec) {
|
||||
return pull_bytes(cur, 32, &nsec->nsec);
|
||||
}
|
||||
|
||||
static int tlvs_to_relays(struct nostr_tlvs *tlvs, struct relays *relays) {
|
||||
struct nostr_tlv *tlv;
|
||||
struct str_block *str;
|
||||
@@ -225,7 +218,7 @@ static int parse_nostr_bech32_nrelay(struct cursor *cur, struct bech32_nrelay *n
|
||||
}
|
||||
|
||||
int parse_nostr_bech32(struct cursor *cur, struct nostr_bech32 *obj) {
|
||||
u8 *start, *end;
|
||||
const u8 *start, *end;
|
||||
|
||||
start = cur->p;
|
||||
|
||||
@@ -264,7 +257,7 @@ int parse_nostr_bech32(struct cursor *cur, struct nostr_bech32 *obj) {
|
||||
}
|
||||
|
||||
struct cursor bcur;
|
||||
make_cursor(obj->buffer, obj->buffer + obj->buflen, &bcur);
|
||||
make_cursor(&bcur, obj->buffer, obj->buflen);
|
||||
|
||||
switch (obj->type) {
|
||||
case NOSTR_BECH32_NOTE:
|
||||
@@ -275,10 +268,6 @@ int parse_nostr_bech32(struct cursor *cur, struct nostr_bech32 *obj) {
|
||||
if (!parse_nostr_bech32_npub(&bcur, &obj->data.npub))
|
||||
goto fail;
|
||||
break;
|
||||
case NOSTR_BECH32_NSEC:
|
||||
if (!parse_nostr_bech32_nsec(&bcur, &obj->data.nsec))
|
||||
goto fail;
|
||||
break;
|
||||
case NOSTR_BECH32_NEVENT:
|
||||
if (!parse_nostr_bech32_nevent(&bcur, &obj->data.nevent))
|
||||
goto fail;
|
||||
|
||||
@@ -26,7 +26,6 @@ enum nostr_bech32_type {
|
||||
NOSTR_BECH32_NEVENT = 4,
|
||||
NOSTR_BECH32_NRELAY = 5,
|
||||
NOSTR_BECH32_NADDR = 6,
|
||||
NOSTR_BECH32_NSEC = 7,
|
||||
};
|
||||
|
||||
struct bech32_note {
|
||||
@@ -37,10 +36,6 @@ struct bech32_npub {
|
||||
const u8 *pubkey;
|
||||
};
|
||||
|
||||
struct bech32_nsec {
|
||||
const u8 *nsec;
|
||||
};
|
||||
|
||||
struct bech32_nevent {
|
||||
struct relays relays;
|
||||
const u8 *event_id;
|
||||
@@ -70,7 +65,6 @@ typedef struct nostr_bech32 {
|
||||
union {
|
||||
struct bech32_note note;
|
||||
struct bech32_npub npub;
|
||||
struct bech32_nsec nsec;
|
||||
struct bech32_nevent nevent;
|
||||
struct bech32_nprofile nprofile;
|
||||
struct bech32_naddr naddr;
|
||||
|
||||
@@ -1,192 +0,0 @@
|
||||
//
|
||||
// nostrscript.c
|
||||
// damus
|
||||
//
|
||||
// Created by William Casarin on 2023-06-02.
|
||||
//
|
||||
|
||||
#include "nostrscript.h"
|
||||
#include "wasm.h"
|
||||
#include "array_size.h"
|
||||
|
||||
// function to check if the character is in surrogate pair range
|
||||
static INLINE int is_surrogate(uint16_t uc) {
|
||||
return (uc - 0xd800u) < 2048u;
|
||||
}
|
||||
|
||||
// function to convert utf16 to utf8
|
||||
static int utf16_to_utf8(u16 utf16, u8 *utf8) {
|
||||
if (utf16 < 0x80) { // 1-byte sequence
|
||||
utf8[0] = (uint8_t) utf16;
|
||||
return 1;
|
||||
}
|
||||
else if (utf16 < 0x800) { // 2-byte sequence
|
||||
utf8[0] = (uint8_t) (0xc0 | (utf16 >> 6));
|
||||
utf8[1] = (uint8_t) (0x80 | (utf16 & 0x3f));
|
||||
return 2;
|
||||
}
|
||||
else if (!is_surrogate(utf16)) { // 3-byte sequence
|
||||
utf8[0] = (uint8_t) (0xe0 | (utf16 >> 12));
|
||||
utf8[1] = (uint8_t) (0x80 | ((utf16 >> 6) & 0x3f));
|
||||
utf8[2] = (uint8_t) (0x80 | (utf16 & 0x3f));
|
||||
return 3;
|
||||
}
|
||||
else { // surrogate pair, return error
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static int nostr_cmd(struct wasm_interp *interp) {
|
||||
struct val *params = NULL;
|
||||
const char *val = NULL;
|
||||
int len, cmd, ival;
|
||||
|
||||
if (!get_params(interp, ¶ms, 3) || params == NULL)
|
||||
return interp_error(interp, "get params");
|
||||
|
||||
// command
|
||||
cmd = params[0].num.i32;
|
||||
|
||||
// value
|
||||
|
||||
ival = params[1].num.i32;
|
||||
if (!mem_ptr_str(interp, ival, &val))
|
||||
val = 0;
|
||||
|
||||
// length
|
||||
len = params[2].num.i32;
|
||||
|
||||
intptr_t iptr = ival;
|
||||
return nscript_nostr_cmd(interp, cmd, val ? (void*)val : (void*)iptr, len);
|
||||
}
|
||||
|
||||
static int print_utf16_str(u16 *chars) {
|
||||
u16 *p = chars;
|
||||
int c;
|
||||
|
||||
while (*p) {
|
||||
if (utf16_to_utf8(*p, (u8*)&c) == -1)
|
||||
return 0;
|
||||
|
||||
printf("%c", c);
|
||||
|
||||
p++;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int nostr_log(struct wasm_interp *interp) {
|
||||
struct val *vals;
|
||||
const char *str;
|
||||
struct callframe *callframe;
|
||||
|
||||
if (!get_params(interp, &vals, 1))
|
||||
return interp_error(interp, "nostr_log get params");
|
||||
|
||||
if (!mem_ptr_str(interp, vals[0].num.i32, &str))
|
||||
return interp_error(interp, "nostr_log log param");
|
||||
|
||||
if (!(callframe = top_callframes(&interp->callframes, 2)))
|
||||
return interp_error(interp, "nostr_log callframe");
|
||||
|
||||
printf("nostr_log:%s: ", callframe->func->name);
|
||||
|
||||
print_utf16_str((u16*)str);
|
||||
printf("\n");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int nostr_set_bool(struct wasm_interp *interp) {
|
||||
struct val *params = NULL;
|
||||
const u16 *setting;
|
||||
u32 val, len;
|
||||
|
||||
if (!get_params(interp, ¶ms, 3) || params == NULL)
|
||||
return 0;
|
||||
|
||||
if (!mem_ptr_str(interp, params[0].num.i32, (const char**)&setting))
|
||||
return 0;
|
||||
|
||||
len = params[1].num.i32;
|
||||
val = params[2].num.i32 > 0 ? 1 : 0;
|
||||
|
||||
return nscript_set_bool(interp, setting, len, val);
|
||||
}
|
||||
|
||||
static int nostr_pool_send_to(struct wasm_interp *interp) {
|
||||
struct val *params = NULL;
|
||||
const u16 *req, *to;
|
||||
int req_len, to_len;
|
||||
|
||||
if (!get_params(interp, ¶ms, 4) || params == NULL)
|
||||
return 0;
|
||||
|
||||
if (!mem_ptr_str(interp, params[0].num.i32, (const char**)&req))
|
||||
return 0;
|
||||
|
||||
req_len = params[1].num.i32;
|
||||
|
||||
if (!mem_ptr_str(interp, params[2].num.i32, (const char**)&to))
|
||||
return 0;
|
||||
|
||||
to_len = params[3].num.i32;
|
||||
|
||||
return nscript_pool_send_to(interp, req, req_len, to, to_len);
|
||||
}
|
||||
|
||||
static int nscript_abort(struct wasm_interp *interp) {
|
||||
struct val *params = NULL;
|
||||
const char *msg = "", *filename;
|
||||
int line, col;
|
||||
|
||||
if (!get_params(interp, ¶ms, 4) || params == NULL)
|
||||
return interp_error(interp, "get params");
|
||||
|
||||
if (params[0].ref.addr != 0 && !mem_ptr_str(interp, params[0].ref.addr, &msg))
|
||||
return interp_error(interp, "abort msg");
|
||||
|
||||
if (!mem_ptr_str(interp, params[1].ref.addr, &filename))
|
||||
return interp_error(interp, "abort filename");
|
||||
|
||||
line = params[2].num.i32;
|
||||
col = params[3].num.i32;
|
||||
|
||||
printf("nscript_abort:");
|
||||
print_utf16_str((u16*)filename);
|
||||
printf(":%d:%d: ", line, col);
|
||||
print_utf16_str((u16*)msg);
|
||||
printf("\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct builtin nscript_builtins[] = {
|
||||
{ .name = "null", .fn = 0 },
|
||||
{ .name = "nostr_log", .fn = nostr_log },
|
||||
{ .name = "nostr_cmd", .fn = nostr_cmd },
|
||||
{ .name = "nostr_pool_send_to", .fn = nostr_pool_send_to },
|
||||
{ .name = "nostr_set_bool", .fn = nostr_set_bool },
|
||||
{ .name = "abort", .fn = nscript_abort },
|
||||
};
|
||||
|
||||
int nscript_load(struct wasm_parser *p, struct wasm_interp *interp, unsigned char *wasm, unsigned long len) {
|
||||
wasm_parser_init(p, wasm, len, len * 16, nscript_builtins, ARRAY_SIZE(nscript_builtins));
|
||||
|
||||
if (!parse_wasm(p)) {
|
||||
wasm_parser_free(p);
|
||||
return NSCRIPT_PARSE_ERR;
|
||||
}
|
||||
|
||||
if (!wasm_interp_init(interp, &p->module)) {
|
||||
print_error_backtrace(&interp->errors);
|
||||
wasm_parser_free(p);
|
||||
return NSCRIPT_INIT_ERR;
|
||||
}
|
||||
|
||||
//setup_wasi(&interp, argc, argv, env);
|
||||
//wasm_parser_free(&p);
|
||||
|
||||
return NSCRIPT_LOADED;
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
//
|
||||
// nostrscript.h
|
||||
// damus
|
||||
//
|
||||
// Created by William Casarin on 2023-06-02.
|
||||
//
|
||||
|
||||
#ifndef nostrscript_h
|
||||
#define nostrscript_h
|
||||
|
||||
#define NSCRIPT_LOADED 1
|
||||
#define NSCRIPT_PARSE_ERR 2
|
||||
#define NSCRIPT_INIT_ERR 3
|
||||
|
||||
#include <stdio.h>
|
||||
#include "wasm.h"
|
||||
|
||||
int nscript_load(struct wasm_parser *p, struct wasm_interp *interp, unsigned char *wasm, unsigned long len);
|
||||
int nscript_nostr_cmd(struct wasm_interp *interp, int, void*, int);
|
||||
int nscript_pool_send_to(struct wasm_interp *interp, const u16*, int, const u16 *, int);
|
||||
int nscript_set_bool(struct wasm_interp *interp, const u16*, int, int);
|
||||
|
||||
|
||||
#endif /* nostrscript_h */
|
||||
@@ -1,42 +0,0 @@
|
||||
|
||||
#ifndef CURSOR_PARSER
|
||||
#define CURSOR_PARSER
|
||||
|
||||
#include "cursor.h"
|
||||
|
||||
static int consume_bytes(struct cursor *cursor, const unsigned char *match, int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (cursor->p + len > cursor->end) {
|
||||
fprintf(stderr, "consume_bytes overflow\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
if (cursor->p[i] != match[i])
|
||||
return 0;
|
||||
}
|
||||
|
||||
cursor->p += len;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int consume_byte(struct cursor *cursor, unsigned char match)
|
||||
{
|
||||
if (unlikely(cursor->p >= cursor->end))
|
||||
return 0;
|
||||
if (*cursor->p != match)
|
||||
return 0;
|
||||
cursor->p++;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int consume_u32(struct cursor *cursor, unsigned int match)
|
||||
{
|
||||
return consume_bytes(cursor, (unsigned char*)&match, sizeof(match));
|
||||
}
|
||||
|
||||
#endif /* CURSOR_PARSER */
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
|
||||
#ifndef PROTOVERSE_TYPEDEFS_H
|
||||
#define PROTOVERSE_TYPEDEFS_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
typedef unsigned char u8;
|
||||
typedef unsigned int u32;
|
||||
typedef unsigned short u16;
|
||||
typedef uint64_t u64;
|
||||
typedef int64_t s64;
|
||||
|
||||
|
||||
#endif /* PROTOVERSE_TYPEDEFS_H */
|
||||
@@ -1,14 +0,0 @@
|
||||
|
||||
#ifndef PROTOVERSE_VARINT_H
|
||||
#define PROTOVERSE_VARINT_H
|
||||
|
||||
#define VARINT_MAX_LEN 9
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
size_t varint_put(unsigned char buf[VARINT_MAX_LEN], uint64_t v);
|
||||
size_t varint_size(uint64_t v);
|
||||
size_t varint_get(const unsigned char *p, size_t max, int64_t *val);
|
||||
|
||||
#endif /* PROTOVERSE_VARINT_H */
|
||||
7298
damus-c/wasm.c
850
damus-c/wasm.h
@@ -1,850 +0,0 @@
|
||||
|
||||
#ifndef PROTOVERSE_WASM_H
|
||||
#define PROTOVERSE_WASM_H
|
||||
|
||||
static const unsigned char WASM_MAGIC[] = {0,'a','s','m'};
|
||||
|
||||
#define WASM_VERSION 0x01
|
||||
#define MAX_U32_LEB128_BYTES 5
|
||||
#define MAX_U64_LEB128_BYTES 10
|
||||
#define MAX_CUSTOM_SECTIONS 32
|
||||
#define MAX_BUILTINS 64
|
||||
#define BUILTIN_SUSPEND 42
|
||||
|
||||
#define FUNC_TYPE_TAG 0x60
|
||||
|
||||
|
||||
#include "cursor.h"
|
||||
#include "error.h"
|
||||
|
||||
#ifdef NOINLINE
|
||||
#define INLINE __attribute__((noinline))
|
||||
#else
|
||||
#define INLINE inline
|
||||
#endif
|
||||
|
||||
|
||||
#define interp_error(p, fmt, ...) note_error(&((p)->errors), interp_codeptr(p), fmt, ##__VA_ARGS__)
|
||||
#define parse_err(p, fmt, ...) note_error(&((p)->errs), &(p)->cur, fmt, ##__VA_ARGS__)
|
||||
|
||||
enum valtype {
|
||||
val_i32 = 0x7F,
|
||||
val_i64 = 0x7E,
|
||||
val_f32 = 0x7D,
|
||||
val_f64 = 0x7C,
|
||||
val_ref_null = 0xD0,
|
||||
val_ref_func = 0x70,
|
||||
val_ref_extern = 0x6F,
|
||||
};
|
||||
|
||||
enum const_instr {
|
||||
ci_const_i32 = 0x41,
|
||||
ci_const_i64 = 0x42,
|
||||
ci_const_f32 = 0x43,
|
||||
ci_const_f64 = 0x44,
|
||||
ci_ref_null = 0xD0,
|
||||
ci_ref_func = 0xD2,
|
||||
ci_global_get = 0x23,
|
||||
ci_end = 0x0B,
|
||||
};
|
||||
|
||||
enum limit_type {
|
||||
limit_min = 0x00,
|
||||
limit_min_max = 0x01,
|
||||
};
|
||||
|
||||
struct limits {
|
||||
u32 min;
|
||||
u32 max;
|
||||
enum limit_type type;
|
||||
};
|
||||
|
||||
enum section_tag {
|
||||
section_custom,
|
||||
section_type,
|
||||
section_import,
|
||||
section_function,
|
||||
section_table,
|
||||
section_memory,
|
||||
section_global,
|
||||
section_export,
|
||||
section_start,
|
||||
section_element,
|
||||
section_code,
|
||||
section_data,
|
||||
section_data_count,
|
||||
section_name,
|
||||
num_sections,
|
||||
};
|
||||
|
||||
enum name_subsection_tag {
|
||||
name_subsection_module,
|
||||
name_subsection_funcs,
|
||||
name_subsection_locals,
|
||||
num_name_subsections,
|
||||
};
|
||||
|
||||
enum reftype {
|
||||
funcref = 0x70,
|
||||
externref = 0x6F,
|
||||
};
|
||||
|
||||
struct resulttype {
|
||||
unsigned char *valtypes; /* enum valtype */
|
||||
u32 num_valtypes;
|
||||
};
|
||||
|
||||
struct functype {
|
||||
struct resulttype params;
|
||||
struct resulttype result;
|
||||
};
|
||||
|
||||
struct table {
|
||||
enum reftype reftype;
|
||||
struct limits limits;
|
||||
};
|
||||
|
||||
struct tablesec {
|
||||
struct table *tables;
|
||||
u32 num_tables;
|
||||
};
|
||||
|
||||
enum elem_mode {
|
||||
elem_mode_passive,
|
||||
elem_mode_active,
|
||||
elem_mode_declarative,
|
||||
};
|
||||
|
||||
struct expr {
|
||||
u8 *code;
|
||||
u32 code_len;
|
||||
};
|
||||
|
||||
struct refval {
|
||||
u32 addr;
|
||||
};
|
||||
|
||||
struct table_inst {
|
||||
struct refval *refs;
|
||||
enum reftype reftype;
|
||||
u32 num_refs;
|
||||
};
|
||||
|
||||
struct numval {
|
||||
union {
|
||||
int i32;
|
||||
u32 u32;
|
||||
int64_t i64;
|
||||
uint64_t u64;
|
||||
float f32;
|
||||
double f64;
|
||||
};
|
||||
};
|
||||
|
||||
struct val {
|
||||
enum valtype type;
|
||||
union {
|
||||
struct numval num;
|
||||
struct refval ref;
|
||||
};
|
||||
};
|
||||
|
||||
struct elem_inst {
|
||||
struct val val;
|
||||
u16 elem;
|
||||
u16 init;
|
||||
};
|
||||
|
||||
struct elem {
|
||||
struct expr offset;
|
||||
u32 tableidx;
|
||||
struct expr *inits;
|
||||
u32 num_inits;
|
||||
enum elem_mode mode;
|
||||
enum reftype reftype;
|
||||
struct val val;
|
||||
};
|
||||
|
||||
struct customsec {
|
||||
const char *name;
|
||||
unsigned char *data;
|
||||
u32 data_len;
|
||||
};
|
||||
|
||||
struct elemsec {
|
||||
struct elem *elements;
|
||||
u32 num_elements;
|
||||
};
|
||||
|
||||
struct memsec {
|
||||
struct limits *mems; /* memtype */
|
||||
u32 num_mems;
|
||||
};
|
||||
|
||||
struct funcsec {
|
||||
u32 *type_indices;
|
||||
u32 num_indices;
|
||||
};
|
||||
|
||||
enum mut {
|
||||
mut_const,
|
||||
mut_var,
|
||||
};
|
||||
|
||||
struct globaltype {
|
||||
enum valtype valtype;
|
||||
enum mut mut;
|
||||
};
|
||||
|
||||
struct globalsec {
|
||||
struct global *globals;
|
||||
u32 num_globals;
|
||||
};
|
||||
|
||||
struct typesec {
|
||||
struct functype *functypes;
|
||||
u32 num_functypes;
|
||||
};
|
||||
|
||||
enum import_type {
|
||||
import_func,
|
||||
import_table,
|
||||
import_mem,
|
||||
import_global,
|
||||
};
|
||||
|
||||
struct importdesc {
|
||||
enum import_type type;
|
||||
union {
|
||||
u32 typeidx;
|
||||
struct limits tabletype;
|
||||
struct limits memtype;
|
||||
struct globaltype globaltype;
|
||||
};
|
||||
};
|
||||
|
||||
struct import {
|
||||
const char *module_name;
|
||||
const char *name;
|
||||
struct importdesc desc;
|
||||
int resolved_builtin;
|
||||
};
|
||||
|
||||
struct importsec {
|
||||
struct import *imports;
|
||||
u32 num_imports;
|
||||
};
|
||||
|
||||
struct global {
|
||||
struct globaltype type;
|
||||
struct expr init;
|
||||
struct val val;
|
||||
};
|
||||
|
||||
struct local_def {
|
||||
u32 num_types;
|
||||
enum valtype type;
|
||||
};
|
||||
|
||||
/* "code" */
|
||||
struct wasm_func {
|
||||
struct expr code;
|
||||
struct local_def *local_defs;
|
||||
u32 num_local_defs;
|
||||
};
|
||||
|
||||
enum func_type {
|
||||
func_type_wasm,
|
||||
func_type_builtin,
|
||||
};
|
||||
|
||||
struct func {
|
||||
union {
|
||||
struct wasm_func *wasm_func;
|
||||
struct builtin *builtin;
|
||||
};
|
||||
u32 num_locals;
|
||||
struct functype *functype;
|
||||
enum func_type type;
|
||||
const char *name;
|
||||
u32 idx;
|
||||
};
|
||||
|
||||
struct codesec {
|
||||
struct wasm_func *funcs;
|
||||
u32 num_funcs;
|
||||
};
|
||||
|
||||
enum exportdesc {
|
||||
export_func,
|
||||
export_table,
|
||||
export_mem,
|
||||
export_global,
|
||||
};
|
||||
|
||||
struct wexport {
|
||||
const char *name;
|
||||
u32 index;
|
||||
enum exportdesc desc;
|
||||
};
|
||||
|
||||
struct exportsec {
|
||||
struct wexport *exports;
|
||||
u32 num_exports;
|
||||
};
|
||||
|
||||
struct nameassoc {
|
||||
u32 index;
|
||||
const char *name;
|
||||
};
|
||||
|
||||
struct namemap {
|
||||
struct nameassoc *names;
|
||||
u32 num_names;
|
||||
};
|
||||
|
||||
struct namesec {
|
||||
const char *module_name;
|
||||
struct namemap func_names;
|
||||
int parsed;
|
||||
};
|
||||
|
||||
struct wsection {
|
||||
enum section_tag tag;
|
||||
};
|
||||
|
||||
enum bulk_tag {
|
||||
i_memory_copy = 10,
|
||||
i_memory_fill = 11,
|
||||
i_table_init = 12,
|
||||
i_elem_drop = 13,
|
||||
i_table_copy = 14,
|
||||
i_table_grow = 15,
|
||||
i_table_size = 16,
|
||||
i_table_fill = 17,
|
||||
};
|
||||
|
||||
enum instr_tag {
|
||||
/* control instructions */
|
||||
i_unreachable = 0x00,
|
||||
i_nop = 0x01,
|
||||
i_block = 0x02,
|
||||
i_loop = 0x03,
|
||||
i_if = 0x04,
|
||||
i_else = 0x05,
|
||||
i_end = 0x0B,
|
||||
i_br = 0x0C,
|
||||
i_br_if = 0x0D,
|
||||
i_br_table = 0x0E,
|
||||
i_return = 0x0F,
|
||||
i_call = 0x10,
|
||||
i_call_indirect = 0x11,
|
||||
|
||||
/* parametric instructions */
|
||||
i_drop = 0x1A,
|
||||
i_select = 0x1B,
|
||||
i_selects = 0x1C,
|
||||
|
||||
/* variable instructions */
|
||||
i_local_get = 0x20,
|
||||
i_local_set = 0x21,
|
||||
i_local_tee = 0x22,
|
||||
i_global_get = 0x23,
|
||||
i_global_set = 0x24,
|
||||
i_table_get = 0x25,
|
||||
i_table_set = 0x26,
|
||||
|
||||
/* memory instructions */
|
||||
i_i32_load = 0x28,
|
||||
i_i64_load = 0x29,
|
||||
i_f32_load = 0x2A,
|
||||
i_f64_load = 0x2B,
|
||||
i_i32_load8_s = 0x2C,
|
||||
i_i32_load8_u = 0x2D,
|
||||
i_i32_load16_s = 0x2E,
|
||||
i_i32_load16_u = 0x2F,
|
||||
i_i64_load8_s = 0x30,
|
||||
i_i64_load8_u = 0x31,
|
||||
i_i64_load16_s = 0x32,
|
||||
i_i64_load16_u = 0x33,
|
||||
i_i64_load32_s = 0x34,
|
||||
i_i64_load32_u = 0x35,
|
||||
i_i32_store = 0x36,
|
||||
i_i64_store = 0x37,
|
||||
i_f32_store = 0x38,
|
||||
i_f64_store = 0x39,
|
||||
i_i32_store8 = 0x3A,
|
||||
i_i32_store16 = 0x3B,
|
||||
i_i64_store8 = 0x3C,
|
||||
i_i64_store16 = 0x3D,
|
||||
i_i64_store32 = 0x3E,
|
||||
i_memory_size = 0x3F,
|
||||
i_memory_grow = 0x40,
|
||||
|
||||
/* numeric instructions */
|
||||
i_i32_const = 0x41,
|
||||
i_i64_const = 0x42,
|
||||
i_f32_const = 0x43,
|
||||
i_f64_const = 0x44,
|
||||
|
||||
i_i32_eqz = 0x45,
|
||||
i_i32_eq = 0x46,
|
||||
i_i32_ne = 0x47,
|
||||
i_i32_lt_s = 0x48,
|
||||
i_i32_lt_u = 0x49,
|
||||
i_i32_gt_s = 0x4A,
|
||||
i_i32_gt_u = 0x4B,
|
||||
i_i32_le_s = 0x4C,
|
||||
i_i32_le_u = 0x4D,
|
||||
i_i32_ge_s = 0x4E,
|
||||
i_i32_ge_u = 0x4F,
|
||||
|
||||
i_i64_eqz = 0x50,
|
||||
i_i64_eq = 0x51,
|
||||
i_i64_ne = 0x52,
|
||||
i_i64_lt_s = 0x53,
|
||||
i_i64_lt_u = 0x54,
|
||||
i_i64_gt_s = 0x55,
|
||||
i_i64_gt_u = 0x56,
|
||||
i_i64_le_s = 0x57,
|
||||
i_i64_le_u = 0x58,
|
||||
i_i64_ge_s = 0x59,
|
||||
i_i64_ge_u = 0x5A,
|
||||
|
||||
i_f32_eq = 0x5B,
|
||||
i_f32_ne = 0x5C,
|
||||
i_f32_lt = 0x5D,
|
||||
i_f32_gt = 0x5E,
|
||||
i_f32_le = 0x5F,
|
||||
i_f32_ge = 0x60,
|
||||
|
||||
i_f64_eq = 0x61,
|
||||
i_f64_ne = 0x62,
|
||||
i_f64_lt = 0x63,
|
||||
i_f64_gt = 0x64,
|
||||
i_f64_le = 0x65,
|
||||
i_f64_ge = 0x66,
|
||||
|
||||
i_i32_clz = 0x67,
|
||||
i_i32_ctz = 0x68,
|
||||
i_i32_popcnt = 0x69,
|
||||
|
||||
i_i32_add = 0x6A,
|
||||
i_i32_sub = 0x6B,
|
||||
i_i32_mul = 0x6C,
|
||||
i_i32_div_s = 0x6D,
|
||||
i_i32_div_u = 0x6E,
|
||||
i_i32_rem_s = 0x6F,
|
||||
i_i32_rem_u = 0x70,
|
||||
i_i32_and = 0x71,
|
||||
i_i32_or = 0x72,
|
||||
i_i32_xor = 0x73,
|
||||
i_i32_shl = 0x74,
|
||||
i_i32_shr_s = 0x75,
|
||||
i_i32_shr_u = 0x76,
|
||||
i_i32_rotl = 0x77,
|
||||
i_i32_rotr = 0x78,
|
||||
|
||||
i_i64_clz = 0x79,
|
||||
i_i64_ctz = 0x7A,
|
||||
i_i64_popcnt = 0x7B,
|
||||
i_i64_add = 0x7C,
|
||||
i_i64_sub = 0x7D,
|
||||
i_i64_mul = 0x7E,
|
||||
i_i64_div_s = 0x7F,
|
||||
i_i64_div_u = 0x80,
|
||||
i_i64_rem_s = 0x81,
|
||||
i_i64_rem_u = 0x82,
|
||||
i_i64_and = 0x83,
|
||||
i_i64_or = 0x84,
|
||||
i_i64_xor = 0x85,
|
||||
i_i64_shl = 0x86,
|
||||
i_i64_shr_s = 0x87,
|
||||
i_i64_shr_u = 0x88,
|
||||
i_i64_rotl = 0x89,
|
||||
i_i64_rotr = 0x8A,
|
||||
|
||||
i_f32_abs = 0x8b,
|
||||
i_f32_neg = 0x8c,
|
||||
i_f32_ceil = 0x8d,
|
||||
i_f32_floor = 0x8e,
|
||||
i_f32_trunc = 0x8f,
|
||||
i_f32_nearest = 0x90,
|
||||
i_f32_sqrt = 0x91,
|
||||
i_f32_add = 0x92,
|
||||
i_f32_sub = 0x93,
|
||||
i_f32_mul = 0x94,
|
||||
i_f32_div = 0x95,
|
||||
i_f32_min = 0x96,
|
||||
i_f32_max = 0x97,
|
||||
i_f32_copysign = 0x98,
|
||||
|
||||
i_f64_abs = 0x99,
|
||||
i_f64_neg = 0x9a,
|
||||
i_f64_ceil = 0x9b,
|
||||
i_f64_floor = 0x9c,
|
||||
i_f64_trunc = 0x9d,
|
||||
i_f64_nearest = 0x9e,
|
||||
i_f64_sqrt = 0x9f,
|
||||
i_f64_add = 0xa0,
|
||||
i_f64_sub = 0xa1,
|
||||
i_f64_mul = 0xa2,
|
||||
i_f64_div = 0xa3,
|
||||
i_f64_min = 0xa4,
|
||||
i_f64_max = 0xa5,
|
||||
i_f64_copysign = 0xa6,
|
||||
|
||||
i_i32_wrap_i64 = 0xa7,
|
||||
i_i32_trunc_f32_s = 0xa8,
|
||||
i_i32_trunc_f32_u = 0xa9,
|
||||
i_i32_trunc_f64_s = 0xaa,
|
||||
i_i32_trunc_f64_u = 0xab,
|
||||
i_i64_extend_i32_s = 0xac,
|
||||
i_i64_extend_i32_u = 0xad,
|
||||
i_i64_trunc_f32_s = 0xae,
|
||||
i_i64_trunc_f32_u = 0xaf,
|
||||
i_i64_trunc_f64_s = 0xb0,
|
||||
i_i64_trunc_f64_u = 0xb1,
|
||||
i_f32_convert_i32_s = 0xb2,
|
||||
i_f32_convert_i32_u = 0xb3,
|
||||
i_f32_convert_i64_s = 0xb4,
|
||||
i_f32_convert_i64_u = 0xb5,
|
||||
i_f32_demote_f64 = 0xb6,
|
||||
i_f64_convert_i32_s = 0xb7,
|
||||
i_f64_convert_i32_u = 0xb8,
|
||||
i_f64_convert_i64_s = 0xb9,
|
||||
i_f64_convert_i64_u = 0xba,
|
||||
i_f64_promote_f32 = 0xbb,
|
||||
|
||||
i_i32_reinterpret_f32 = 0xbc,
|
||||
i_i64_reinterpret_f64 = 0xbd,
|
||||
i_f32_reinterpret_i32 = 0xbe,
|
||||
i_f64_reinterpret_i64 = 0xbf,
|
||||
|
||||
i_i32_extend8_s = 0xc0,
|
||||
i_i32_extend16_s = 0xc1,
|
||||
i_i64_extend8_s = 0xc2,
|
||||
i_i64_extend16_s = 0xc3,
|
||||
i_i64_extend32_s = 0xc4,
|
||||
|
||||
i_ref_null = 0xD0,
|
||||
i_ref_is_null = 0xD1,
|
||||
i_ref_func = 0xD2,
|
||||
|
||||
i_bulk_op = 0xFC,
|
||||
/* TODO: more instrs */
|
||||
|
||||
};
|
||||
|
||||
enum blocktype_tag {
|
||||
blocktype_empty,
|
||||
blocktype_valtype,
|
||||
blocktype_index,
|
||||
};
|
||||
|
||||
struct blocktype {
|
||||
enum blocktype_tag tag;
|
||||
union {
|
||||
enum valtype valtype;
|
||||
int type_index;
|
||||
};
|
||||
};
|
||||
|
||||
struct instrs {
|
||||
unsigned char *data;
|
||||
u32 len;
|
||||
};
|
||||
|
||||
struct block {
|
||||
struct blocktype type;
|
||||
struct expr instrs;
|
||||
};
|
||||
|
||||
struct memarg {
|
||||
u32 offset;
|
||||
u32 align;
|
||||
};
|
||||
|
||||
struct br_table {
|
||||
u32 num_label_indices;
|
||||
u32 label_indices[512];
|
||||
u32 default_label;
|
||||
};
|
||||
|
||||
struct call_indirect {
|
||||
u32 tableidx;
|
||||
u32 typeidx;
|
||||
};
|
||||
|
||||
struct table_init {
|
||||
u32 tableidx;
|
||||
u32 elemidx;
|
||||
};
|
||||
|
||||
struct table_copy {
|
||||
u32 from;
|
||||
u32 to;
|
||||
};
|
||||
|
||||
struct bulk_op {
|
||||
enum bulk_tag tag;
|
||||
union {
|
||||
struct table_init table_init;
|
||||
struct table_copy table_copy;
|
||||
u32 idx;
|
||||
};
|
||||
};
|
||||
|
||||
struct select_instr {
|
||||
u8 *valtypes;
|
||||
u32 num_valtypes;
|
||||
};
|
||||
|
||||
struct instr {
|
||||
enum instr_tag tag;
|
||||
int pos;
|
||||
union {
|
||||
struct br_table br_table;
|
||||
struct bulk_op bulk_op;
|
||||
struct call_indirect call_indirect;
|
||||
struct memarg memarg;
|
||||
struct select_instr select;
|
||||
struct block block;
|
||||
struct expr else_block;
|
||||
double f64;
|
||||
float f32;
|
||||
int i32;
|
||||
u32 u32;
|
||||
int64_t i64;
|
||||
u64 u64;
|
||||
unsigned char memidx;
|
||||
enum reftype reftype;
|
||||
};
|
||||
};
|
||||
|
||||
enum datamode {
|
||||
datamode_active,
|
||||
datamode_passive,
|
||||
};
|
||||
|
||||
struct wdata_active {
|
||||
u32 mem_index;
|
||||
struct expr offset_expr;
|
||||
};
|
||||
|
||||
struct wdata {
|
||||
struct wdata_active active;
|
||||
u8 *bytes;
|
||||
u32 bytes_len;
|
||||
enum datamode mode;
|
||||
};
|
||||
|
||||
struct datasec {
|
||||
struct wdata *datas;
|
||||
u32 num_datas;
|
||||
};
|
||||
|
||||
struct startsec {
|
||||
u32 start_fn;
|
||||
};
|
||||
|
||||
struct module {
|
||||
unsigned int parsed;
|
||||
unsigned int custom_sections;
|
||||
|
||||
struct func *funcs;
|
||||
|
||||
u32 num_funcs;
|
||||
|
||||
struct customsec custom_section[MAX_CUSTOM_SECTIONS];
|
||||
struct typesec type_section;
|
||||
struct funcsec func_section;
|
||||
struct importsec import_section;
|
||||
struct exportsec export_section;
|
||||
struct codesec code_section;
|
||||
struct tablesec table_section;
|
||||
struct memsec memory_section;
|
||||
struct globalsec global_section;
|
||||
struct startsec start_section;
|
||||
struct elemsec element_section;
|
||||
struct datasec data_section;
|
||||
struct namesec name_section;
|
||||
};
|
||||
|
||||
// make sure the struct is packed so that
|
||||
struct label {
|
||||
u32 instr_pos; // resolved status is stored in HOB of pos
|
||||
u32 jump;
|
||||
};
|
||||
|
||||
struct callframe {
|
||||
struct cursor code;
|
||||
struct val *locals;
|
||||
struct func *func;
|
||||
u16 prev_stack_items;
|
||||
};
|
||||
|
||||
struct resolver {
|
||||
u16 label;
|
||||
u8 end_tag;
|
||||
u8 start_tag;
|
||||
};
|
||||
|
||||
struct global_inst {
|
||||
struct val val;
|
||||
};
|
||||
|
||||
struct module_inst {
|
||||
struct table_inst *tables;
|
||||
struct global_inst *globals;
|
||||
struct elem_inst *elements;
|
||||
|
||||
u32 num_tables;
|
||||
u32 num_globals;
|
||||
u32 num_elements;
|
||||
|
||||
int start_fn;
|
||||
unsigned char *globals_init;
|
||||
};
|
||||
|
||||
struct wasi {
|
||||
int argc;
|
||||
const char **argv;
|
||||
|
||||
int environc;
|
||||
const char **environ;
|
||||
};
|
||||
|
||||
struct wasm_interp;
|
||||
|
||||
struct builtin {
|
||||
const char *name;
|
||||
int (*fn)(struct wasm_interp *);
|
||||
int (*prepare_args)(struct wasm_interp *);
|
||||
};
|
||||
|
||||
struct wasm_interp {
|
||||
struct module *module;
|
||||
struct module_inst module_inst;
|
||||
struct wasi wasi;
|
||||
void *context;
|
||||
|
||||
struct builtin builtins[MAX_BUILTINS];
|
||||
int num_builtins;
|
||||
|
||||
int prev_resolvers, quitting;
|
||||
|
||||
struct errors errors; /* struct error */
|
||||
size_t ops;
|
||||
|
||||
struct cursor callframes; /* struct callframe */
|
||||
struct cursor stack; /* struct val */
|
||||
struct cursor mem; /* u8/mixed */
|
||||
|
||||
struct cursor memory; /* memory pages (65536 blocks) */
|
||||
|
||||
struct cursor locals; /* struct val */
|
||||
struct cursor labels; /* struct labels */
|
||||
struct cursor num_labels;
|
||||
|
||||
// resolve stack for the current function. every time a control
|
||||
// instruction is encountered, the label index is pushed. When an
|
||||
// instruction is popped, we can resolve the label
|
||||
struct cursor resolver_stack; /* struct resolver */
|
||||
struct cursor resolver_offsets; /* int */
|
||||
};
|
||||
|
||||
struct wasm_parser {
|
||||
struct module module;
|
||||
struct builtin *builtins;
|
||||
u32 num_builtins;
|
||||
struct cursor cur;
|
||||
struct cursor mem;
|
||||
struct errors errs;
|
||||
};
|
||||
|
||||
|
||||
int run_wasm(unsigned char *wasm, unsigned long len, int argc, const char **argv, char **env, int *retval);
|
||||
int parse_wasm(struct wasm_parser *p);
|
||||
int wasm_interp_init(struct wasm_interp *interp, struct module *module);
|
||||
void wasm_parser_free(struct wasm_parser *parser);
|
||||
void wasm_parser_init(struct wasm_parser *p, u8 *wasm, size_t wasm_len, size_t arena_size, struct builtin *, int num_builtins);
|
||||
void wasm_interp_free(struct wasm_interp *interp);
|
||||
int interp_wasm_module(struct wasm_interp *interp, int *retval);
|
||||
int interp_wasm_module_resume(struct wasm_interp *interp, int *retval);
|
||||
void print_error_backtrace(struct errors *errors);
|
||||
void setup_wasi(struct wasm_interp *interp, int argc, const char **argv, char **env);
|
||||
void print_callstack(struct wasm_interp *interp);
|
||||
|
||||
// builtin helpers
|
||||
int get_params(struct wasm_interp *interp, struct val** vals, u32 num_vals);
|
||||
int get_var_params(struct wasm_interp *interp, struct val** vals, u32 *num_vals);
|
||||
u8 *interp_mem_ptr(struct wasm_interp *interp, u32 ptr, int size);
|
||||
|
||||
static INLINE struct callframe *top_callframe(struct cursor *cur)
|
||||
{
|
||||
return (struct callframe*)cursor_top(cur, sizeof(struct callframe));
|
||||
}
|
||||
|
||||
|
||||
static INLINE struct cursor *interp_codeptr(struct wasm_interp *interp)
|
||||
{
|
||||
struct callframe *frame;
|
||||
if (unlikely(!(frame = top_callframe(&interp->callframes))))
|
||||
return 0;
|
||||
return &frame->code;
|
||||
}
|
||||
|
||||
|
||||
static INLINE int mem_ptr_str(struct wasm_interp *interp, u32 ptr,
|
||||
const char **str)
|
||||
{
|
||||
// still technically unsafe if the string runs over the end of memory...
|
||||
if (!(*str = (const char*)interp_mem_ptr(interp, ptr, 1))) {
|
||||
return interp_error(interp, "int memptr");
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static INLINE int mem_ptr_i32(struct wasm_interp *interp, u32 ptr, int **i)
|
||||
{
|
||||
if (!(*i = (int*)interp_mem_ptr(interp, ptr, sizeof(int))))
|
||||
return interp_error(interp, "int memptr");
|
||||
return 1;
|
||||
}
|
||||
|
||||
static INLINE int cursor_pushval(struct cursor *cur, struct val *val)
|
||||
{
|
||||
return cursor_push(cur, (u8*)val, sizeof(*val));
|
||||
}
|
||||
|
||||
static INLINE int cursor_push_i32(struct cursor *stack, int i)
|
||||
{
|
||||
struct val val;
|
||||
val.type = val_i32;
|
||||
val.num.i32 = i;
|
||||
|
||||
return cursor_pushval(stack, &val);
|
||||
}
|
||||
|
||||
static INLINE int stack_push_i32(struct wasm_interp *interp, int i)
|
||||
{
|
||||
return cursor_push_i32(&interp->stack, i);
|
||||
}
|
||||
|
||||
static INLINE struct callframe *top_callframes(struct cursor *cur, int top)
|
||||
{
|
||||
return (struct callframe*)cursor_topn(cur, sizeof(struct callframe), top);
|
||||
}
|
||||
|
||||
static INLINE int was_section_parsed(struct module *module,
|
||||
enum section_tag section)
|
||||
{
|
||||
if (section == section_custom)
|
||||
return module->custom_sections > 0;
|
||||
|
||||
return module->parsed & (1 << section);
|
||||
}
|
||||
|
||||
|
||||
#endif /* PROTOVERSE_WASM_H */
|
||||
@@ -1,14 +1,5 @@
|
||||
{
|
||||
"pins" : [
|
||||
{
|
||||
"identity" : "gsplayer",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/wxxsw/GSPlayer",
|
||||
"state" : {
|
||||
"revision" : "aa6dad7943d52f5207f7fcc2ad3e4274583443b8",
|
||||
"version" : "0.2.26"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "kingfisher",
|
||||
"kind" : "remoteSourceControl",
|
||||
@@ -25,6 +16,24 @@
|
||||
"state" : {
|
||||
"revision" : "40b4b38b3b1c83f7088c76189a742870e0ca06a9"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "starscream",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/daltoniam/Starscream",
|
||||
"state" : {
|
||||
"revision" : "df8d82047f6654d8e4b655d1b1525c64e1059d21",
|
||||
"version" : "4.0.4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"identity" : "vault",
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/SparrowTek/Vault",
|
||||
"state" : {
|
||||
"revision" : "87db56c3c8b6421c65b0745f73e08b0dc56f79d4",
|
||||
"version" : "1.0.3"
|
||||
}
|
||||
}
|
||||
],
|
||||
"version" : 2
|
||||
|
||||
@@ -1,98 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1500"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "4CE6DEE227F7A08100C66700"
|
||||
BuildableName = "damus.app"
|
||||
BlueprintName = "damus"
|
||||
ReferencedContainer = "container:damus.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "4CE6DEF227F7A08200C66700"
|
||||
BuildableName = "damusTests.xctest"
|
||||
BlueprintName = "damusTests"
|
||||
ReferencedContainer = "container:damus.xcodeproj">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
<TestableReference
|
||||
skipped = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "4CE6DEFC27F7A08200C66700"
|
||||
BuildableName = "damusUITests.xctest"
|
||||
BlueprintName = "damusUITests"
|
||||
ReferencedContainer = "container:damus.xcodeproj">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Release"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "4CE6DEE227F7A08100C66700"
|
||||
BuildableName = "damus.app"
|
||||
BlueprintName = "damus"
|
||||
ReferencedContainer = "container:damus.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "4CE6DEE227F7A08100C66700"
|
||||
BuildableName = "damus.app"
|
||||
BlueprintName = "damus"
|
||||
ReferencedContainer = "container:damus.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1500"
|
||||
LastUpgradeVersion = "1420"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
{
|
||||
"colors" : [
|
||||
{
|
||||
"color" : {
|
||||
"color-space" : "srgb",
|
||||
"components" : {
|
||||
"alpha" : "1.000",
|
||||
"blue" : "0x00",
|
||||
"green" : "0x00",
|
||||
"red" : "0x00"
|
||||
}
|
||||
},
|
||||
"idiom" : "universal"
|
||||
},
|
||||
{
|
||||
"appearances" : [
|
||||
{
|
||||
"appearance" : "luminosity",
|
||||
"value" : "dark"
|
||||
}
|
||||
],
|
||||
"color" : {
|
||||
"color-space" : "srgb",
|
||||
"components" : {
|
||||
"alpha" : "1.000",
|
||||
"blue" : "0xFF",
|
||||
"green" : "0xFF",
|
||||
"red" : "0xFF"
|
||||
}
|
||||
},
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "alby.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "alby.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "alby.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
}
|
||||
}
|
||||
11
damus/Assets.xcassets/alby.imageset/alby.svg
vendored
@@ -1,11 +0,0 @@
|
||||
<svg width="49" height="48" viewBox="0 0 49 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="3.59995" cy="3.59995" r="3.59995" transform="matrix(-1 0 0 1 13.832 9.96094)" fill="black"/>
|
||||
<path d="M9.63215 13.0205L16.3521 19.7404" stroke="black" stroke-width="1.79997"/>
|
||||
<circle cx="39.6317" cy="13.5609" r="3.59995" fill="black"/>
|
||||
<path d="M40.2917 13.0205L33.5718 19.7404" stroke="black" stroke-width="1.79997"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.2538 35.0429C9.31357 34.1193 8.18436 32.045 8.56261 29.9297C10.1861 20.8506 16.9519 14.041 25.0517 14.041C33.1712 14.041 39.9502 20.8836 41.5526 29.9957C41.9253 32.1149 40.7869 34.1881 38.84 35.1043C34.6741 37.0648 30.0209 38.1606 25.1117 38.1606C20.1516 38.1606 15.4528 37.0419 11.2538 35.0429Z" fill="#FFDF6F"/>
|
||||
<path d="M41.5526 29.9957L42.439 29.8398L41.5526 29.9957ZM38.84 35.1043L38.4568 34.29L38.84 35.1043ZM9.44855 30.0881C11.0173 21.3153 17.5017 14.941 25.0517 14.941V13.141C16.402 13.141 9.35492 20.3859 7.67668 29.7713L9.44855 30.0881ZM25.0517 14.941C32.62 14.941 39.1178 21.3464 40.6662 30.1516L42.439 29.8398C40.7826 20.4209 33.7225 13.141 25.0517 13.141V14.941ZM38.4568 34.29C34.4082 36.1952 29.8856 37.2607 25.1117 37.2607V39.0606C30.1561 39.0606 34.9399 37.9343 39.2232 35.9187L38.4568 34.29ZM25.1117 37.2607C20.2883 37.2607 15.7213 36.173 11.6407 34.2303L10.867 35.8556C15.1842 37.9108 20.015 39.0606 25.1117 39.0606V37.2607ZM40.6662 30.1516C40.965 31.8506 40.0553 33.5378 38.4568 34.29L39.2232 35.9187C41.5185 34.8385 42.8855 32.3791 42.439 29.8398L40.6662 30.1516ZM7.67668 29.7713C7.22342 32.306 8.57956 34.7666 10.867 35.8556L11.6407 34.2303C10.0476 33.4719 9.14529 31.784 9.44855 30.0881L7.67668 29.7713Z" fill="black"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.7154 32.7862C13.1536 32.1501 12.2272 30.4884 12.7684 28.8913C14.4373 23.9658 19.3057 20.4014 25.0515 20.4014C30.7973 20.4014 35.6657 23.9658 37.3346 28.8913C37.8758 30.4884 36.9494 32.1501 35.3876 32.7862C32.1977 34.0853 28.7082 34.8012 25.0515 34.8012C21.3948 34.8012 17.9053 34.0853 14.7154 32.7862Z" fill="black"/>
|
||||
<ellipse cx="29.1918" cy="28.0806" rx="2.99995" ry="2.39996" fill="white"/>
|
||||
<ellipse cx="20.6037" cy="28.0816" rx="2.99995" ry="2.39996" fill="white"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.2 KiB |
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "eula-bg.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
<svg width="430" height="813" viewBox="0 0 430 813" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g filter="url(#filter0_f_1069_29012)">
|
||||
<path d="M44.0811 256.851L186.315 111L276.203 223.574L244.02 388.295L69.9751 697.084L100.678 498.338L44.0811 256.851Z" fill="url(#paint0_linear_1069_29012)"/>
|
||||
</g>
|
||||
<g filter="url(#filter1_f_1069_29012)">
|
||||
<path d="M116.509 587.348L206.677 479.401L230.746 273.265L266.666 231.183L367.424 396.975L281.292 659.008L266.665 801.413L66.889 763.694L116.509 587.348Z" fill="url(#paint1_linear_1069_29012)"/>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_f_1069_29012" x="-66.6248" y="0.294121" width="453.534" height="807.496" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="55.3529" result="effect1_foregroundBlur_1069_29012"/>
|
||||
</filter>
|
||||
<filter id="filter1_f_1069_29012" x="-43.8172" y="120.477" width="521.947" height="791.642" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="55.3529" result="effect1_foregroundBlur_1069_29012"/>
|
||||
</filter>
|
||||
<linearGradient id="paint0_linear_1069_29012" x1="230.179" y1="166.577" x2="-67.7956" y2="310.108" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#D34CD9"/>
|
||||
<stop offset="1" stop-color="#4E4DF4"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_1069_29012" x1="139.483" y1="462.902" x2="377.854" y2="565.47" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#0DE8FF"/>
|
||||
<stop offset="1" stop-color="#641AAE"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "gradient.jpg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
BIN
damus/Assets.xcassets/gradient.imageset/gradient.jpg
vendored
|
Before Width: | Height: | Size: 118 KiB |
@@ -1,6 +0,0 @@
|
||||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "Fundrise.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "Fundrise.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "Fundrise.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13.3111 8.87301C12.8205 9.2228 12.2201 9.42856 11.5716 9.42856C9.91471 9.42856 8.57157 8.08541 8.57157 6.42856C8.57157 4.7717 9.91471 3.42856 11.5716 3.42856C12.6456 3.42856 13.5877 3.99292 14.1177 4.84125M6.85728 18.9319H9.09467C9.38639 18.9319 9.67632 18.9666 9.95912 19.0359L12.3232 19.6105C12.8361 19.7354 13.3705 19.7475 13.8889 19.6469L16.5027 19.1384C17.1931 19.0039 17.8284 18.6732 18.3261 18.189L20.1755 16.39C20.7036 15.8772 20.7036 15.0449 20.1755 14.5312C19.7 14.0686 18.947 14.0166 18.4091 14.4088L16.2538 15.9813C15.9451 16.2069 15.5695 16.3284 15.1833 16.3284H13.102H14.4268C15.1735 16.3284 15.7783 15.74 15.7783 15.0136V14.7506C15.7783 14.1476 15.3564 13.6217 14.7551 13.4759L12.7104 12.9786C12.3776 12.8979 12.0368 12.8571 11.6942 12.8571C10.8673 12.8571 9.37033 13.5418 9.37033 13.5418L6.85728 14.5928M18.8573 7.2857C18.8573 8.94256 17.5141 10.2857 15.8573 10.2857C14.2004 10.2857 12.8573 8.94256 12.8573 7.2857C12.8573 5.62884 14.2004 4.2857 15.8573 4.2857C17.5141 4.2857 18.8573 5.62884 18.8573 7.2857ZM3.42871 14.2286V19.2C3.42871 19.6801 3.42871 19.9201 3.52213 20.1034C3.60431 20.2647 3.73544 20.3958 3.89672 20.478C4.08007 20.5714 4.3201 20.5714 4.80014 20.5714H5.48585C5.9659 20.5714 6.20592 20.5714 6.38927 20.478C6.55055 20.3958 6.68168 20.2647 6.76386 20.1034C6.85728 19.9201 6.85728 19.6801 6.85728 19.2V14.2286C6.85728 13.7485 6.85728 13.5085 6.76386 13.3251C6.68168 13.1638 6.55055 13.0328 6.38927 12.9506C6.20592 12.8571 5.9659 12.8571 5.48585 12.8571H4.80014C4.3201 12.8571 4.08007 12.8571 3.89672 12.9506C3.73544 13.0328 3.60431 13.1638 3.52213 13.3251C3.42871 13.5085 3.42871 13.7485 3.42871 14.2286Z" stroke="black" stroke-width="1.71429" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.8 KiB |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "GIF.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "GIF.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "GIF.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.14272 5.99999H18.857C19.3304 5.99999 19.7141 6.38375 19.7141 6.85713V17.1428C19.7141 17.6162 19.3304 18 18.857 18H5.14272C4.66933 18 4.28557 17.6162 4.28557 17.1428V6.85714C4.28557 6.38375 4.66933 5.99999 5.14272 5.99999ZM2.57129 6.85714C2.57129 5.43698 3.72256 4.28571 5.14272 4.28571H18.857C20.2772 4.28571 21.4284 5.43697 21.4284 6.85713V17.1428C21.4284 18.563 20.2772 19.7143 18.857 19.7143H5.14272C3.72256 19.7143 2.57129 18.563 2.57129 17.1428V6.85714ZM9.22631 11.2305C9.2052 11.1445 9.17192 11.069 9.12647 11.0041C9.08102 10.9375 9.0242 10.8815 8.95602 10.8361C8.88946 10.789 8.81153 10.7541 8.72225 10.7313C8.63459 10.707 8.538 10.6948 8.43248 10.6948C8.2052 10.6948 8.01121 10.7492 7.8505 10.858C7.69141 10.9667 7.56965 11.1234 7.48524 11.3279C7.40244 11.5325 7.36105 11.7792 7.36105 12.0682C7.36105 12.3604 7.40082 12.6104 7.48037 12.8182C7.55991 13.026 7.67842 13.1851 7.83589 13.2955C7.99335 13.4059 8.18897 13.4611 8.42274 13.4611C8.62891 13.4611 8.80017 13.431 8.93653 13.371C9.07452 13.3109 9.17761 13.2257 9.24579 13.1153C9.31024 13.0109 9.34423 12.8892 9.34775 12.75H8.44222V11.7857H10.6533V12.4773C10.6533 12.9318 10.5567 13.3206 10.3635 13.6437C10.1719 13.9651 9.90731 14.2119 9.56965 14.3839C9.23361 14.5544 8.84806 14.6396 8.413 14.6396C7.92761 14.6396 7.50147 14.5365 7.13459 14.3304C6.7677 14.1242 6.48118 13.8304 6.27501 13.4489C6.07046 13.0674 5.96819 12.6137 5.96819 12.0877C5.96819 11.6753 6.03069 11.3101 6.15569 10.9919C6.28231 10.6737 6.45764 10.4051 6.68166 10.1859C6.90569 9.96512 7.16462 9.79872 7.45845 9.68671C7.75228 9.57307 8.06722 9.51625 8.40326 9.51625C8.69871 9.51625 8.97306 9.55846 9.22631 9.64288C9.48118 9.72567 9.70602 9.84417 9.90082 9.99839C10.0972 10.151 10.2555 10.332 10.3757 10.5414C10.4958 10.7508 10.5688 10.9805 10.5948 11.2305H9.22631ZM13.3242 9.58443V14.5714H11.9703V9.58443H13.3242ZM14.6515 9.58443V14.5714H16.0054V12.6234H17.9437V11.5325H16.0054V10.6753H18.158V9.58443H14.6515Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.1 KiB |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "Key.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "Key.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "Key.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M16.5001 8.99999C17.3285 8.99999 18.0001 8.32841 18.0001 7.49997C18.0001 6.67154 17.3285 5.99996 16.5001 5.99996C15.6717 5.99996 15.0001 6.67154 15.0001 7.49997C15.0001 8.32841 15.6717 8.99999 16.5001 8.99999Z" fill="black"/>
|
||||
<path d="M11.2501 18.0001V17.2501H12.7501C13.1643 17.2501 13.5001 16.9143 13.5001 16.5V15H15.0001C18.3138 15 21.0001 12.3137 21.0001 8.99999C21.0001 5.68625 18.3138 2.99994 15.0001 2.99994C11.6864 2.99994 9.00005 5.68625 9.00005 8.99999C9.00005 9.58815 9.0849 10.1576 9.24333 10.6961L3.43934 16.5C3.15804 16.7814 3 17.1629 3 17.5607V19.5001C3 20.3285 3.67158 21.0001 4.50001 21.0001H7.50004C8.32847 21.0001 9.00005 20.3285 9.00005 19.5001V18.7501H10.5001C10.9143 18.7501 11.2501 18.4143 11.2501 18.0001ZM10.5001 8.99999C10.5001 6.51469 12.5148 4.49995 15.0001 4.49995C17.4854 4.49995 19.5001 6.51469 19.5001 8.99999C19.5001 11.4853 17.4854 13.5 15.0001 13.5H12.7501C12.3359 13.5 12.0001 13.8358 12.0001 14.25V15.75H10.5001C10.0858 15.75 9.75005 16.0858 9.75005 16.5V17.2501H8.25004C7.83582 17.2501 7.50004 17.5858 7.50004 18.0001V19.5001H4.50001V17.5607L10.6335 11.4272C10.8436 11.2171 10.9099 10.9028 10.8025 10.6258C10.6074 10.1225 10.5001 9.57468 10.5001 8.99999Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "NFC.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "NFC.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "NFC.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M9.28787 16.8167C9.51778 17.0243 9.85483 17.0578 10.1227 16.9038C11.8035 15.9306 12.9285 14.0712 12.9285 11.9998C12.9285 9.9284 11.8057 8.06904 10.1227 7.09583C9.78117 6.89941 9.34367 7.01548 9.14725 7.35699C8.95082 7.69851 9.06689 8.136 9.4084 8.33243C10.6539 9.0534 11.4999 10.4462 11.4999 11.9998C11.4999 13.3703 10.8414 14.6158 9.83028 15.3859L6.26335 12.1828C5.96871 11.9194 5.51782 11.944 5.25443 12.2364C4.99104 12.5288 5.01559 12.9819 5.308 13.2453L9.28787 16.8167ZM5.14059 7.18289C4.91068 6.9753 4.57363 6.94182 4.30578 7.09583C2.62276 8.06904 1.5 9.9284 1.5 11.9998C1.5 14.0712 2.62276 15.9306 4.30578 16.9038C4.64729 17.1002 5.08479 16.9841 5.28121 16.6426C5.47764 16.3011 5.36157 15.8636 5.02005 15.6672C3.77453 14.9462 2.92856 13.5556 2.92856 11.9998C2.92856 10.6293 3.58703 9.38376 4.59818 8.61368L8.16511 11.8168C8.45975 12.0802 8.91064 12.0556 9.17403 11.7632C9.43742 11.4708 9.41287 11.0177 9.12046 10.7543L5.14059 7.18289Z" fill="black"/>
|
||||
<path d="M18.6611 3.29748C19.0684 2.87729 19.7029 2.9049 20.0765 3.36339C23.9746 8.12351 23.9746 15.8766 20.0761 20.6367C19.8785 20.8784 19.6085 21 19.3386 21C19.0968 21 18.8508 20.9016 18.6611 20.703C18.2543 20.2825 18.2275 19.5705 18.6018 19.1135C21.8136 15.1901 21.8136 8.80995 18.6018 4.887C18.2275 4.42997 18.2543 3.7179 18.6611 3.29748Z" fill="black"/>
|
||||
<path d="M15.2492 8.57679C14.8839 8.10992 14.9251 7.3993 15.3405 6.98915C15.7574 6.61884 16.3869 6.66571 16.7538 7.09007C18.8521 9.77599 18.8521 14.1424 16.7538 16.8259C16.5562 17.0794 16.2792 17.2083 16.0008 17.2083C15.7661 17.2083 15.5309 17.0738 15.3405 16.9285C14.9251 16.5183 14.884 15.8081 15.2492 15.3408C16.7071 13.4752 16.7071 10.4415 15.2492 8.57679Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.8 KiB |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "activity.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "activity.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "activity.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M2 11.9999H5.26711C5.70339 11.9999 6.08932 11.717 6.2207 11.301L8.7616 3.2548C8.83517 3.02184 9.16483 3.02184 9.2384 3.2548L14.7616 20.745C14.8352 20.9779 15.1648 20.9779 15.2384 20.745L17.7793 12.6987C17.9107 12.2827 18.2966 11.9999 18.7329 11.9999H22" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 447 B |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "add-bookmark.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "add-bookmark.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "add-bookmark.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13 7C13 6.44772 12.5523 6 12 6C11.4477 6 11 6.44772 11 7H13ZM11 13C11 13.5523 11.4477 14 12 14C12.5523 14 13 13.5523 13 13H11ZM15 11C15.5523 11 16 10.5523 16 10C16 9.44772 15.5523 9 15 9L15 11ZM9 9C8.44772 9 8 9.44771 8 10C8 10.5523 8.44772 11 9 11L9 9ZM16.47 20.1929L15.8888 21.0066L15.8888 21.0066L16.47 20.1929ZM12.93 17.6643L13.5112 16.8505L13.5112 16.8505L12.93 17.6643ZM11.07 17.6643L10.4888 16.8505L10.4888 16.8505L11.07 17.6643ZM7.52998 20.1929L6.94874 19.3791L6.94874 19.3791L7.52998 20.1929ZM12.2456 17.2595L12.4911 16.2901L12.4911 16.2901L12.2456 17.2595ZM11.7544 17.2595L11.5089 16.2901L11.5089 16.2901L11.7544 17.2595ZM5.20836 20.6678L6 20.0568L6 20.0568L5.20836 20.6678ZM5.96294 21.0561L5.92589 22.0554L5.92589 22.0554L5.96294 21.0561ZM18.7916 20.6678L18 20.0568L18 20.0568L18.7916 20.6678ZM18.0371 21.0561L18.0741 22.0554L18.0741 22.0554L18.0371 21.0561ZM18.891 3.54601L18 4L18 4L18.891 3.54601ZM18.454 3.10899L18.908 2.21799L18.908 2.21799L18.454 3.10899ZM5.10899 3.54601L4.21799 3.09202L4.21799 3.09202L5.10899 3.54601ZM5.54601 3.10899L5.09202 2.21799L5.09202 2.21799L5.54601 3.10899ZM11 7V13H13V7H11ZM15 9L9 9L9 11L15 11L15 9ZM18 4.6V18.8909H20V4.6H18ZM6 18.8909V4.6H4V18.8909H6ZM6.6 4H17.4V2H6.6V4ZM17.0513 19.3791L13.5112 16.8505L12.3487 18.478L15.8888 21.0066L17.0513 19.3791ZM10.4888 16.8505L6.94874 19.3791L8.11122 21.0066L11.6513 18.478L10.4888 16.8505ZM13.5112 16.8505C13.2454 16.6606 12.9003 16.3938 12.4911 16.2901L12 18.2289C11.956 18.2178 11.9466 18.2043 12.0065 18.2412C12.0771 18.2846 12.1705 18.3507 12.3487 18.478L13.5112 16.8505ZM11.6513 18.478C11.8295 18.3507 11.9229 18.2846 11.9935 18.2412C12.0534 18.2043 12.044 18.2178 12 18.2289L11.5089 16.2901C11.0997 16.3938 10.7546 16.6606 10.4888 16.8505L11.6513 18.478ZM12.4911 16.2901C12.1688 16.2085 11.8312 16.2085 11.5089 16.2901L12 18.2289H12L12.4911 16.2901ZM4 18.8909C4 19.3733 3.999 19.8046 4.0302 20.1459C4.06022 20.4742 4.1313 20.909 4.41673 21.2788L6 20.0568C6.07706 20.1567 6.04397 20.2053 6.02189 19.9638C6.001 19.7353 6 19.4131 6 18.8909H4ZM6.94874 19.3791C6.52379 19.6827 6.26104 19.8691 6.06296 19.9849C5.85365 20.1073 5.87396 20.0521 6 20.0568L5.92589 22.0554C6.39272 22.0727 6.7878 21.8779 7.07244 21.7115C7.3683 21.5385 7.71867 21.287 8.11122 21.0066L6.94874 19.3791ZM4.41673 21.2788C4.77954 21.7489 5.33249 22.0334 5.92589 22.0554L6 20.0568L6 20.0568L4.41673 21.2788ZM18 18.8909C18 19.4131 17.999 19.7353 17.9781 19.9638C17.956 20.2053 17.9229 20.1567 18 20.0568L19.5833 21.2788C19.8687 20.909 19.9398 20.4742 19.9698 20.1459C20.001 19.8046 20 19.3733 20 18.8909H18ZM15.8888 21.0066C16.2813 21.287 16.6317 21.5385 16.9276 21.7115C17.2122 21.8779 17.6073 22.0727 18.0741 22.0554L18 20.0568C18.126 20.0521 18.1463 20.1073 17.937 19.9849C17.739 19.8691 17.4762 19.6827 17.0513 19.3791L15.8888 21.0066ZM18 20.0568L18 20.0568L18.0741 22.0554C18.6675 22.0334 19.2205 21.7489 19.5833 21.2788L18 20.0568ZM20 4.6C20 4.33647 20.0008 4.07869 19.9831 3.86177C19.9644 3.63318 19.9203 3.36344 19.782 3.09202L18 4C17.9707 3.94249 17.9811 3.91972 17.9897 4.02463C17.9992 4.14122 18 4.30347 18 4.6H20ZM17.4 4C17.6965 4 17.8588 4.00078 17.9754 4.0103C18.0803 4.01887 18.0575 4.0293 18 4L18.908 2.21799C18.6366 2.07969 18.3668 2.03562 18.1382 2.01695C17.9213 1.99922 17.6635 2 17.4 2V4ZM19.782 3.09202C19.5903 2.71569 19.2843 2.40973 18.908 2.21799L18 4L18 4L19.782 3.09202ZM6 4.6C6 4.30347 6.00078 4.14122 6.0103 4.02463C6.01887 3.91972 6.0293 3.94249 6 4L4.21799 3.09202C4.07969 3.36344 4.03562 3.63318 4.01695 3.86177C3.99922 4.07869 4 4.33648 4 4.6H6ZM6.6 2C6.33647 2 6.07869 1.99922 5.86177 2.01695C5.63318 2.03562 5.36344 2.07969 5.09202 2.21799L6 4C5.94249 4.0293 5.91972 4.01887 6.02463 4.0103C6.14122 4.00078 6.30347 4 6.6 4V2ZM6 4L6 4L5.09202 2.21799C4.71569 2.40973 4.40973 2.71569 4.21799 3.09202L6 4Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.8 KiB |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "add-reaction.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "add-reaction.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "add-reaction.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M10.4986 9.5C10.4986 10.3284 9.939 11 9.24864 11C8.55828 11 7.99864 10.3284 7.99864 9.5C7.99864 8.67157 8.55828 8 9.24864 8C9.939 8 10.4986 8.67157 10.4986 9.5Z" fill="black"/>
|
||||
<path d="M15.9986 9.5C15.9986 10.3284 15.439 11 14.7486 11C14.0583 11 13.4986 10.3284 13.4986 9.5C13.4986 8.67157 14.0583 8 14.7486 8C15.439 8 15.9986 8.67157 15.9986 9.5Z" fill="black"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.9986 1C19.5509 1 19.9986 1.44772 19.9986 2V4H21.9986C22.5509 4 22.9986 4.44772 22.9986 5C22.9986 5.55228 22.5509 6 21.9986 6H19.9986V8C19.9986 8.55228 19.5509 9 18.9986 9C18.4464 9 17.9986 8.55228 17.9986 8V6H15.9986C15.4464 6 14.9986 5.55228 14.9986 5C14.9986 4.44772 15.4464 4 15.9986 4H17.9986V2C17.9986 1.44772 18.4464 1 18.9986 1ZM11.9926 2.94507C12.0533 3.494 11.6576 3.98826 11.1087 4.04902C7.11036 4.49161 4 7.88325 4 12C3.99999 16.4183 7.5817 20 12 20C16.1171 20 19.509 16.889 19.9511 12.8901C20.0118 12.3412 20.506 11.9454 21.0549 12.0061C21.6039 12.0667 21.9997 12.5609 21.939 13.1099C21.3862 18.1109 17.1479 22 12 22C6.47714 22 1.99998 17.5228 2 12C2 6.85256 5.88834 2.61466 10.8886 2.06116C11.4375 2.0004 11.9318 2.39614 11.9926 2.94507ZM8.46341 14.1213C8.85393 13.7308 9.4871 13.7308 9.87762 14.1213C11.0492 15.2929 12.9487 15.2929 14.1203 14.1213C14.5108 13.7308 15.1439 13.7308 15.5345 14.1213C15.925 14.5118 15.925 15.145 15.5345 15.5355C13.5818 17.4882 10.416 17.4882 8.46341 15.5355C8.07288 15.145 8.07288 14.5118 8.46341 14.1213Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "added-bookmark.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "added-bookmark.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "added-bookmark.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M16.47 20.1929L15.8888 21.0066L15.8888 21.0066L16.47 20.1929ZM12.93 17.6643L13.5112 16.8505L13.5112 16.8505L12.93 17.6643ZM11.07 17.6643L10.4888 16.8505L10.4888 16.8505L11.07 17.6643ZM7.52998 20.1929L6.94874 19.3791L6.94874 19.3791L7.52998 20.1929ZM12.2456 17.2595L12.4911 16.2901L12.4911 16.2901L12.2456 17.2595ZM11.7544 17.2595L11.5089 16.2901L11.5089 16.2901L11.7544 17.2595ZM5.20836 20.6678L6 20.0568L6 20.0568L5.20836 20.6678ZM5.96294 21.0561L5.92589 22.0554L5.92589 22.0554L5.96294 21.0561ZM18.7916 20.6678L18 20.0568L18 20.0568L18.7916 20.6678ZM18.0371 21.0561L18.0741 22.0554L18.0741 22.0554L18.0371 21.0561ZM18.891 3.54601L18 4L18 4L18.891 3.54601ZM18.454 3.10899L18.908 2.21799L18.908 2.21799L18.454 3.10899ZM5.10899 3.54601L4.21799 3.09202L4.21799 3.09202L5.10899 3.54601ZM5.54601 3.10899L5.09202 2.21799L5.09202 2.21799L5.54601 3.10899ZM10.2071 9.54289C9.81658 9.15237 9.18342 9.15237 8.79289 9.54289C8.40237 9.93342 8.40237 10.5666 8.79289 10.9571L10.2071 9.54289ZM11 11.75L10.2929 12.4571C10.6834 12.8476 11.3166 12.8476 11.7071 12.4571L11 11.75ZM15.2071 8.95711C15.5976 8.56658 15.5976 7.93342 15.2071 7.54289C14.8166 7.15237 14.1834 7.15237 13.7929 7.54289L15.2071 8.95711ZM18 4.6V18.8909H20V4.6H18ZM6 18.8909V4.6H4V18.8909H6ZM6.6 4H17.4V2H6.6V4ZM17.0513 19.3791L13.5112 16.8505L12.3487 18.478L15.8888 21.0066L17.0513 19.3791ZM10.4888 16.8505L6.94874 19.3791L8.11122 21.0066L11.6513 18.478L10.4888 16.8505ZM13.5112 16.8505C13.2454 16.6606 12.9003 16.3938 12.4911 16.2901L12 18.2289C11.956 18.2178 11.9466 18.2043 12.0065 18.2412C12.0771 18.2846 12.1705 18.3507 12.3487 18.478L13.5112 16.8505ZM11.6513 18.478C11.8295 18.3507 11.9229 18.2846 11.9935 18.2412C12.0534 18.2043 12.044 18.2178 12 18.2289L11.5089 16.2901C11.0997 16.3938 10.7546 16.6606 10.4888 16.8505L11.6513 18.478ZM12.4911 16.2901C12.1688 16.2085 11.8312 16.2085 11.5089 16.2901L12 18.2289H12L12.4911 16.2901ZM4 18.8909C4 19.3733 3.999 19.8046 4.0302 20.1459C4.06022 20.4742 4.1313 20.909 4.41673 21.2788L6 20.0568C6.07706 20.1567 6.04397 20.2053 6.02189 19.9638C6.001 19.7353 6 19.4131 6 18.8909H4ZM6.94874 19.3791C6.52379 19.6827 6.26104 19.8691 6.06296 19.9849C5.85365 20.1073 5.87396 20.0521 6 20.0568L5.92589 22.0554C6.39272 22.0727 6.7878 21.8779 7.07244 21.7115C7.3683 21.5385 7.71867 21.287 8.11122 21.0066L6.94874 19.3791ZM4.41673 21.2788C4.77954 21.7489 5.33249 22.0334 5.92589 22.0554L6 20.0568L6 20.0568L4.41673 21.2788ZM18 18.8909C18 19.4131 17.999 19.7353 17.9781 19.9638C17.956 20.2053 17.9229 20.1567 18 20.0568L19.5833 21.2788C19.8687 20.909 19.9398 20.4742 19.9698 20.1459C20.001 19.8046 20 19.3733 20 18.8909H18ZM15.8888 21.0066C16.2813 21.287 16.6317 21.5385 16.9276 21.7115C17.2122 21.8779 17.6073 22.0727 18.0741 22.0554L18 20.0568C18.126 20.0521 18.1463 20.1073 17.937 19.9849C17.739 19.8691 17.4762 19.6827 17.0513 19.3791L15.8888 21.0066ZM18 20.0568L18 20.0568L18.0741 22.0554C18.6675 22.0334 19.2205 21.7489 19.5833 21.2788L18 20.0568ZM20 4.6C20 4.33647 20.0008 4.07869 19.9831 3.86177C19.9644 3.63318 19.9203 3.36344 19.782 3.09202L18 4C17.9707 3.94249 17.9811 3.91972 17.9897 4.02463C17.9992 4.14122 18 4.30347 18 4.6H20ZM17.4 4C17.6965 4 17.8588 4.00078 17.9754 4.0103C18.0803 4.01887 18.0575 4.0293 18 4L18.908 2.21799C18.6366 2.07969 18.3668 2.03562 18.1382 2.01695C17.9213 1.99922 17.6635 2 17.4 2V4ZM19.782 3.09202C19.5903 2.71569 19.2843 2.40973 18.908 2.21799L18 4L18 4L19.782 3.09202ZM6 4.6C6 4.30347 6.00078 4.14122 6.0103 4.02463C6.01887 3.91972 6.0293 3.94249 6 4L4.21799 3.09202C4.07969 3.36344 4.03562 3.63318 4.01695 3.86177C3.99922 4.07869 4 4.33648 4 4.6H6ZM6.6 2C6.33647 2 6.07869 1.99922 5.86177 2.01695C5.63318 2.03562 5.36344 2.07969 5.09202 2.21799L6 4C5.94249 4.0293 5.91972 4.01887 6.02463 4.0103C6.14122 4.00078 6.30347 4 6.6 4V2ZM6 4L6 4L5.09202 2.21799C4.71569 2.40973 4.40973 2.71569 4.21799 3.09202L6 4ZM8.79289 10.9571L10.2929 12.4571L11.7071 11.0429L10.2071 9.54289L8.79289 10.9571ZM11.7071 12.4571L15.2071 8.95711L13.7929 7.54289L10.2929 11.0429L11.7071 12.4571Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 4.0 KiB |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "ai-2-stars.fill.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "ai-2-stars.fill.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "ai-2-stars.fill.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M16 8C16 7.44772 15.5523 7 15 7C14.4477 7 14 7.44772 14 8C14 10.3085 13.4892 11.7424 12.6158 12.6158C11.7424 13.4892 10.3085 14 8 14C7.44772 14 7 14.4477 7 15C7 15.5523 7.44772 16 8 16C10.3085 16 11.7424 16.5108 12.6158 17.3842C13.4892 18.2576 14 19.6915 14 22C14 22.5523 14.4477 23 15 23C15.5523 23 16 22.5523 16 22C16 19.6915 16.5108 18.2576 17.3842 17.3842C18.2576 16.5108 19.6915 16 22 16C22.5523 16 23 15.5523 23 15C23 14.4477 22.5523 14 22 14C19.6915 14 18.2576 13.4892 17.3842 12.6158C16.5108 11.7424 16 10.3085 16 8Z" fill="black"/>
|
||||
<path d="M7.5 2C7.5 1.44772 7.05228 1 6.5 1C5.94772 1 5.5 1.44772 5.5 2C5.5 3.44043 5.18016 4.24938 4.71477 4.71477C4.24938 5.18016 3.44043 5.5 2 5.5C1.44772 5.5 1 5.94772 1 6.5C1 7.05228 1.44772 7.5 2 7.5C3.44043 7.5 4.24938 7.81984 4.71477 8.28523C5.18016 8.75062 5.5 9.55957 5.5 11C5.5 11.5523 5.94772 12 6.5 12C7.05228 12 7.5 11.5523 7.5 11C7.5 9.55957 7.81984 8.75062 8.28523 8.28523C8.75062 7.81984 9.55957 7.5 11 7.5C11.5523 7.5 12 7.05228 12 6.5C12 5.94772 11.5523 5.5 11 5.5C9.55957 5.5 8.75062 5.18016 8.28523 4.71477C7.81984 4.24938 7.5 3.44043 7.5 2Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.2 KiB |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "ai-2-stars.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "ai-2-stars.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "ai-2-stars.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M22 15C17.1389 15 15 17.1389 15 22C15 17.1389 12.8611 15 8 15C12.8611 15 15 12.8611 15 8C15 12.8611 17.1389 15 22 15Z" stroke="black" stroke-width="2" stroke-linejoin="round"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M11 6.5C7.875 6.5 6.5 7.875 6.5 11C6.5 7.875 5.125 6.5 2 6.5C5.125 6.5 6.5 5.125 6.5 2C6.5 5.125 7.875 6.5 11 6.5Z" stroke="black" stroke-width="2" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 552 B |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "ai-3-stars.fill.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "ai-3-stars.fill.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "ai-3-stars.fill.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M14 8C14 7.44772 13.5523 7 13 7C12.4477 7 12 7.44772 12 8C12 10.3085 11.4892 11.7424 10.6158 12.6158C9.74243 13.4892 8.30848 14 6 14C5.44772 14 5 14.4477 5 15C5 15.5523 5.44772 16 6 16C8.30848 16 9.74243 16.5108 10.6158 17.3842C11.4892 18.2576 12 19.6915 12 22C12 22.5523 12.4477 23 13 23C13.5523 23 14 22.5523 14 22C14 19.6915 14.5108 18.2576 15.3842 17.3842C16.2576 16.5108 17.6915 16 20 16C20.5523 16 21 15.5523 21 15C21 14.4477 20.5523 14 20 14C17.6915 14 16.2576 13.4892 15.3842 12.6158C14.5108 11.7424 14 10.3085 14 8Z" fill="black"/>
|
||||
<path d="M6 5.5C6 5.22386 5.77614 5 5.5 5C5.22386 5 5 5.22386 5 5.5C5 6.48063 4.78279 7.0726 4.4277 7.4277C4.0726 7.78279 3.48063 8 2.5 8C2.22386 8 2 8.22386 2 8.5C2 8.77614 2.22386 9 2.5 9C3.48063 9 4.0726 9.21721 4.4277 9.5723C4.78279 9.9274 5 10.5194 5 11.5C5 11.7761 5.22386 12 5.5 12C5.77614 12 6 11.7761 6 11.5C6 10.5194 6.21721 9.9274 6.5723 9.5723C6.9274 9.21721 7.51937 9 8.5 9C8.77614 9 9 8.77614 9 8.5C9 8.22386 8.77614 8 8.5 8C7.51937 8 6.9274 7.78279 6.5723 7.4277C6.21721 7.0726 6 6.48063 6 5.5Z" fill="black"/>
|
||||
<path d="M11 1.5C11 1.22386 10.7761 1 10.5 1C10.2239 1 10 1.22386 10 1.5C10 2.13341 9.85918 2.47538 9.66728 2.66728C9.47538 2.85918 9.13341 3 8.5 3C8.22386 3 8 3.22386 8 3.5C8 3.77614 8.22386 4 8.5 4C9.13341 4 9.47538 4.14082 9.66728 4.33272C9.85918 4.52462 10 4.86659 10 5.5C10 5.77614 10.2239 6 10.5 6C10.7761 6 11 5.77614 11 5.5C11 4.86659 11.1408 4.52462 11.3327 4.33272C11.5246 4.14082 11.8666 4 12.5 4C12.7761 4 13 3.77614 13 3.5C13 3.22386 12.7761 3 12.5 3C11.8666 3 11.5246 2.85918 11.3327 2.66728C11.1408 2.47538 11 2.13341 11 1.5Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "ai-3-stars.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "ai-3-stars.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "ai-3-stars.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M13 7C13.5523 7 14 7.44772 14 8C14 10.3085 14.5108 11.7424 15.3842 12.6158C16.2576 13.4892 17.6915 14 20 14C20.5523 14 21 14.4477 21 15C21 15.5523 20.5523 16 20 16C17.6915 16 16.2576 16.5108 15.3842 17.3842C14.5108 18.2576 14 19.6915 14 22C14 22.5523 13.5523 23 13 23C12.4477 23 12 22.5523 12 22C12 19.6915 11.4892 18.2576 10.6158 17.3842C9.74243 16.5108 8.30848 16 6 16C5.44772 16 5 15.5523 5 15C5 14.4477 5.44772 14 6 14C8.30848 14 9.74243 13.4892 10.6158 12.6158C11.4892 11.7424 12 10.3085 12 8C12 7.44772 12.4477 7 13 7ZM13 12.7334C12.7361 13.212 12.4147 13.6453 12.03 14.03C11.6453 14.4147 11.212 14.7361 10.7334 15C11.212 15.2639 11.6453 15.5853 12.03 15.97C12.4147 16.3547 12.7361 16.788 13 17.2666C13.2639 16.788 13.5853 16.3547 13.97 15.97C14.3547 15.5853 14.788 15.2639 15.2666 15C14.788 14.7361 14.3547 14.4147 13.97 14.03C13.5853 13.6453 13.2639 13.212 13 12.7334Z" fill="black"/>
|
||||
<path d="M6 5.5C6 5.22386 5.77614 5 5.5 5C5.22386 5 5 5.22386 5 5.5C5 6.48063 4.78279 7.0726 4.4277 7.4277C4.0726 7.78279 3.48063 8 2.5 8C2.22386 8 2 8.22386 2 8.5C2 8.77614 2.22386 9 2.5 9C3.48063 9 4.0726 9.21721 4.4277 9.5723C4.78279 9.9274 5 10.5194 5 11.5C5 11.7761 5.22386 12 5.5 12C5.77614 12 6 11.7761 6 11.5C6 10.5194 6.21721 9.9274 6.5723 9.5723C6.9274 9.21721 7.51937 9 8.5 9C8.77614 9 9 8.77614 9 8.5C9 8.22386 8.77614 8 8.5 8C7.51937 8 6.9274 7.78279 6.5723 7.4277C6.21721 7.0726 6 6.48063 6 5.5Z" fill="black"/>
|
||||
<path d="M11 1.5C11 1.22386 10.7761 1 10.5 1C10.2239 1 10 1.22386 10 1.5C10 2.13341 9.85918 2.47538 9.66728 2.66728C9.47538 2.85918 9.13341 3 8.5 3C8.22386 3 8 3.22386 8 3.5C8 3.77614 8.22386 4 8.5 4C9.13341 4 9.47538 4.14082 9.66728 4.33272C9.85918 4.52462 10 4.86659 10 5.5C10 5.77614 10.2239 6 10.5 6C10.7761 6 11 5.77614 11 5.5C11 4.86659 11.1408 4.52462 11.3327 4.33272C11.5246 4.14082 11.8666 4 12.5 4C12.7761 4 13 3.77614 13 3.5C13 3.22386 12.7761 3 12.5 3C11.8666 3 11.5246 2.85918 11.3327 2.66728C11.1408 2.47538 11 2.13341 11 1.5Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.1 KiB |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "ai-avatar.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "ai-avatar.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "ai-avatar.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M3 5.00013C3 3.89556 3.89543 3.00013 5 3.00013H11C11.5523 3.00013 12 3.44785 12 4.00013C12 4.55241 11.5523 5.00013 11 5.00013H5V19.0001H7.10002C7.56329 16.7179 9.58104 15.0001 12 15.0001C14.419 15.0001 16.4367 16.7179 16.9 19.0001H19V13.0001C19 12.4478 19.4477 12.0001 20 12.0001C20.5523 12.0001 21 12.4478 21 13.0001V19.0001C21 20.1047 20.1046 21.0001 19 21.0001H5C3.89543 21.0001 3 20.1047 3 19.0001V5.00013ZM9.17071 19.0001H14.8293C14.4175 17.8349 13.3062 17.0001 12 17.0001C10.6938 17.0001 9.58254 17.8349 9.17071 19.0001ZM12 9.00013C11.1716 9.00013 10.5 9.6717 10.5 10.5001C10.5 11.3286 11.1716 12.0001 12 12.0001C12.8284 12.0001 13.5 11.3286 13.5 10.5001C13.5 9.6717 12.8284 9.00013 12 9.00013ZM8.5 10.5001C8.5 8.56713 10.067 7.00013 12 7.00013C13.933 7.00013 15.5 8.56713 15.5 10.5001C15.5 12.4331 13.933 14.0001 12 14.0001C10.067 14.0001 8.5 12.4331 8.5 10.5001Z" fill="black"/>
|
||||
<path d="M18.9472 1.89456C18.763 1.52603 18.237 1.52603 18.0528 1.89456L17.0745 3.85106C17.0262 3.94782 16.9477 4.02628 16.8509 4.07467L14.8944 5.05292C14.5259 5.23718 14.5259 5.76308 14.8944 5.94734L16.8509 6.9256C16.9477 6.97398 17.0262 7.05244 17.0745 7.1492L18.0528 9.1057C18.237 9.47423 18.763 9.47423 18.9472 9.1057L19.9255 7.1492C19.9738 7.05244 20.0523 6.97398 20.1491 6.9256L22.1056 5.94734C22.4741 5.76308 22.4741 5.23718 22.1056 5.05292L20.1491 4.07467C20.0523 4.02628 19.9738 3.94782 19.9255 3.85106L18.9472 1.89456Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.5 KiB |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "ai-image.fill.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "ai-image.fill.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "ai-image.fill.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M3 5C3 3.89543 3.89543 3 5 3H19C20.1046 3 21 3.89543 21 5V19C21 20.1046 20.1046 21 19 21H5C3.89543 21 3 20.1046 3 19V5ZM16.4142 19L9.41421 12C8.63317 11.219 7.36684 11.2189 6.58579 12L5 13.5858V5H19V19H16.4142Z" fill="black"/>
|
||||
<path d="M13.5745 8.35093L14.0528 7.39443C14.237 7.0259 14.763 7.0259 14.9472 7.39443L15.4255 8.35093C15.4738 8.44769 15.5523 8.52615 15.6491 8.57454L16.6056 9.05279C16.9741 9.23705 16.9741 9.76295 16.6056 9.94721L15.6491 10.4255C15.5523 10.4738 15.4738 10.5523 15.4255 10.6491L14.9472 11.6056C14.763 11.9741 14.237 11.9741 14.0528 11.6056L13.5745 10.6491C13.5262 10.5523 13.4477 10.4738 13.3509 10.4255L12.3944 9.94721C12.0259 9.76295 12.0259 9.23705 12.3944 9.05279L13.3509 8.57454C13.4477 8.52615 13.5262 8.44769 13.5745 8.35093Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 928 B |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "ai-image.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "ai-image.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "ai-image.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M3 5C3 3.89543 3.89543 3 5 3H19C20.1046 3 21 3.89543 21 5V19C21 20.1046 20.1046 21 19 21H5C3.89543 21 3 20.1046 3 19V5ZM19 5H5V13.5858L6.58579 12C7.36684 11.2189 8.63317 11.219 9.41421 12L16.4142 19H19V5ZM13.5858 19L8 13.4142L5 16.4142V19H13.5858Z" fill="black"/>
|
||||
<path d="M13.5745 8.35093L14.0528 7.39443C14.237 7.0259 14.763 7.0259 14.9472 7.39443L15.4255 8.35093C15.4738 8.44769 15.5523 8.52615 15.6491 8.57454L16.6056 9.05279C16.9741 9.23705 16.9741 9.76295 16.6056 9.94721L15.6491 10.4255C15.5523 10.4738 15.4738 10.5523 15.4255 10.6491L14.9472 11.6056C14.763 11.9741 14.237 11.9741 14.0528 11.6056L13.5745 10.6491C13.5262 10.5523 13.4477 10.4738 13.3509 10.4255L12.3944 9.94721C12.0259 9.76295 12.0259 9.23705 12.3944 9.05279L13.3509 8.57454C13.4477 8.52615 13.5262 8.44769 13.5745 8.35093Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 965 B |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "ai-star.fill.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "ai-star.fill.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "ai-star.fill.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13 3C13 2.44772 12.5523 2 12 2C11.4477 2 11 2.44772 11 3C11 6.18838 10.331 8.25562 9.1178 9.53621C7.91616 10.8046 5.98995 11.5 3 11.5C2.44772 11.5 2 11.9477 2 12.5C2 13.0523 2.44772 13.5 3 13.5C5.98995 13.5 7.91616 14.1954 9.1178 15.4638C10.331 16.7444 11 18.8116 11 22C11 22.5523 11.4477 23 12 23C12.5523 23 13 22.5523 13 22C13 18.8116 13.669 16.7444 14.8822 15.4638C16.0838 14.1954 18.01 13.5 21 13.5C21.5523 13.5 22 13.0523 22 12.5C22 11.9477 21.5523 11.5 21 11.5C18.01 11.5 16.0838 10.8046 14.8822 9.53621C13.669 8.25562 13 6.18838 13 3Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 671 B |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "ai-star.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "ai-star.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "ai-star.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M21 12.5C14.75 12.5 12 15.4028 12 22C12 15.4028 9.25 12.5 3 12.5C9.25 12.5 12 9.59722 12 3C12 9.59722 14.75 12.5 21 12.5Z" stroke="black" stroke-width="2" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 333 B |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "ai-star2.fill.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "ai-star2.fill.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "ai-star2.fill.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M12.9578 2.71265C12.8309 2.28967 12.4416 2 12 2C11.5584 2 11.1691 2.28967 11.0422 2.71265C10.3228 5.11046 9.39036 6.82042 8.10539 8.10539C6.82042 9.39036 5.11046 10.3228 2.71265 11.0422C2.28967 11.1691 2 11.5584 2 12C2 12.4416 2.28967 12.8309 2.71265 12.9578C5.11046 13.6772 6.82042 14.6096 8.10539 15.8946C9.39036 17.1796 10.3228 18.8895 11.0422 21.2873C11.1691 21.7103 11.5584 22 12 22C12.4416 22 12.8309 21.7103 12.9578 21.2873C13.6772 18.8895 14.6096 17.1796 15.8946 15.8946C17.1796 14.6096 18.8895 13.6772 21.2873 12.9578C21.7103 12.8309 22 12.4416 22 12C22 11.5584 21.7103 11.1691 21.2873 11.0422C18.8895 10.3228 17.1796 9.39036 15.8946 8.10539C14.6096 6.82042 13.6772 5.11046 12.9578 2.71265Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 828 B |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "ai-star2.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "ai-star2.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "ai-star2.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M3 12C8 10.5 10.5 8 12 3C13.5 8 16 10.5 21 12C16 13.5 13.5 16 12 21C10.5 16 8 13.5 3 12Z" stroke="black" stroke-width="2" stroke-linecap="square" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 284 B |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "ai-text.fill.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "ai-text.fill.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "ai-text.fill.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M4 5C3.44772 5 3 5.44772 3 6C3 6.55228 3.44772 7 4 7H20C20.5523 7 21 6.55228 21 6C21 5.44772 20.5523 5 20 5H4Z" fill="black"/>
|
||||
<path d="M17.9191 9.60608C17.7616 9.2384 17.4 9 17 9C16.6 9 16.2384 9.2384 16.0809 9.60608L14.7384 12.7384L11.6061 14.0809C11.2384 14.2384 11 14.6 11 15C11 15.4 11.2384 15.7616 11.6061 15.9191L14.7384 17.2616L16.0809 20.3939C16.2384 20.7616 16.6 21 17 21C17.4 21 17.7616 20.7616 17.9191 20.3939L19.2616 17.2616L22.3939 15.9191C22.7616 15.7616 23 15.4 23 15C23 14.6 22.7616 14.2384 22.3939 14.0809L19.2616 12.7384L17.9191 9.60608Z" fill="black"/>
|
||||
<path d="M4 11C3.44772 11 3 11.4477 3 12C3 12.5523 3.44772 13 4 13H9C9.55228 13 10 12.5523 10 12C10 11.4477 9.55228 11 9 11H4Z" fill="black"/>
|
||||
<path d="M4 17C3.44772 17 3 17.4477 3 18C3 18.5523 3.44772 19 4 19H7C7.55228 19 8 18.5523 8 18C8 17.4477 7.55228 17 7 17H4Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 968 B |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "ai-text.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "ai-text.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "ai-text.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M4 18H7M4 12H9M4 6H20M17 10L18.5 13.5L22 15L18.5 16.5L17 20L15.5 16.5L12 15L15.5 13.5L17 10Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 287 B |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "airplay.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "airplay.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "airplay.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M5.5 18C6.05228 18 6.5 17.5523 6.5 17C6.5 16.4477 6.05228 16 5.5 16V18ZM18.5 16C17.9477 16 17.5 16.4477 17.5 17C17.5 17.5523 17.9477 18 18.5 18V16ZM20.891 16.454L20 16L20 16L20.891 16.454ZM20.454 16.891L20.908 17.782L20.908 17.782L20.454 16.891ZM20.454 4.10899L20.908 3.21799L20.908 3.21799L20.454 4.10899ZM20.891 4.54601L20 5L20 5L20.891 4.54601ZM3.10899 4.54601L2.21799 4.09202L2.21799 4.09202L3.10899 4.54601ZM3.54601 4.10899L3.09202 3.21799L3.09202 3.21799L3.54601 4.10899ZM3.54601 16.891L4 16L4 16L3.54601 16.891ZM3.10899 16.454L2.21799 16.908L2.21799 16.908L3.10899 16.454ZM12 15L12.7809 14.3753C12.5911 14.1381 12.3038 14 12 14C11.6962 14 11.4089 14.1381 11.2191 14.3753L12 15ZM8 20L7.21913 19.3753C6.979 19.6755 6.93218 20.0867 7.0987 20.4332C7.26522 20.7797 7.61559 21 8 21V20ZM16 20V21C16.3844 21 16.7348 20.7797 16.9013 20.4332C17.0678 20.0867 17.021 19.6755 16.7809 19.3753L16 20ZM4.6 18H5.5V16H4.6V18ZM4 15.4V5.6H2V15.4H4ZM4.6 5H19.4V3H4.6V5ZM20 5.6V15.4H22V5.6H20ZM19.4 16H18.5V18H19.4V16ZM20 15.4C20 15.6965 19.9992 15.8588 19.9897 15.9754C19.9811 16.0803 19.9707 16.0575 20 16L21.782 16.908C21.9203 16.6366 21.9644 16.3668 21.9831 16.1382C22.0008 15.9213 22 15.6635 22 15.4H20ZM19.4 18C19.6635 18 19.9213 18.0008 20.1382 17.9831C20.3668 17.9644 20.6366 17.9203 20.908 17.782L20 16C20.0575 15.9707 20.0803 15.9811 19.9754 15.9897C19.8588 15.9992 19.6965 16 19.4 16V18ZM20 16L20 16L20.908 17.782C21.2843 17.5903 21.5903 17.2843 21.782 16.908L20 16ZM19.4 5C19.6965 5 19.8588 5.00078 19.9754 5.0103C20.0803 5.01887 20.0575 5.0293 20 5L20.908 3.21799C20.6366 3.07969 20.3668 3.03562 20.1382 3.01695C19.9213 2.99922 19.6635 3 19.4 3V5ZM22 5.6C22 5.33647 22.0008 5.07869 21.9831 4.86177C21.9644 4.63318 21.9203 4.36344 21.782 4.09202L20 5C19.9707 4.94249 19.9811 4.91972 19.9897 5.02463C19.9992 5.14122 20 5.30347 20 5.6H22ZM20 5L20 5L21.782 4.09202C21.5903 3.71569 21.2843 3.40973 20.908 3.21799L20 5ZM4 5.6C4 5.30347 4.00078 5.14122 4.0103 5.02463C4.01887 4.91972 4.0293 4.94249 4 5L2.21799 4.09202C2.07969 4.36344 2.03562 4.63318 2.01695 4.86177C1.99922 5.07869 2 5.33648 2 5.6H4ZM4.6 3C4.33647 3 4.07869 2.99922 3.86177 3.01695C3.63318 3.03562 3.36344 3.07969 3.09202 3.21799L4 5C3.94249 5.0293 3.91972 5.01887 4.02463 5.0103C4.14122 5.00078 4.30347 5 4.6 5V3ZM4 5L4 5L3.09202 3.21799C2.71569 3.40973 2.40973 3.71569 2.21799 4.09202L4 5ZM4.6 16C4.30347 16 4.14122 15.9992 4.02463 15.9897C3.91972 15.9811 3.94249 15.9707 4 16L3.09202 17.782C3.36344 17.9203 3.63318 17.9644 3.86177 17.9831C4.07869 18.0008 4.33647 18 4.6 18V16ZM2 15.4C2 15.6635 1.99922 15.9213 2.01695 16.1382C2.03562 16.3668 2.07969 16.6366 2.21799 16.908L4 16C4.0293 16.0575 4.01887 16.0803 4.0103 15.9754C4.00078 15.8588 4 15.6965 4 15.4H2ZM4 16L4 16L2.21799 16.908C2.40973 17.2843 2.71569 17.5903 3.09202 17.782L4 16ZM11.2191 14.3753L7.21913 19.3753L8.78087 20.6247L12.7809 15.6247L11.2191 14.3753ZM8 21H16V19H8V21ZM16.7809 19.3753L12.7809 14.3753L11.2191 15.6247L15.2191 20.6247L16.7809 19.3753Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.0 KiB |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "albums.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "albums.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "albums.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M4 6.00019V18.0002M8 5.00019V19.0002M12 4.99258V19.0078C12 19.6462 12.5901 20.1211 13.2137 19.9847L19.2137 18.6722C19.6728 18.5718 20 18.1652 20 17.6953V6.30508C20 5.83514 19.6728 5.42861 19.2137 5.32818L13.2137 4.01568C12.5901 3.87926 12 4.35419 12 4.99258Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 453 B |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "anchor.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "anchor.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "anchor.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M12 8C13.3807 8 14.5 6.88071 14.5 5.5C14.5 4.11929 13.3807 3 12 3C10.6193 3 9.5 4.11929 9.5 5.5C9.5 6.88071 10.6193 8 12 8ZM12 8V21M18 12H21V12.5C21 17.1944 17.1944 21 12.5 21H12M6 12H3V12.5C3 17.1944 6.80558 21 11.5 21H12" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 417 B |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "archive-folder.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "archive-folder.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "archive-folder.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M4.54601 19.891L5 19L5 19L4.54601 19.891ZM4.10899 19.454L3.21799 19.908L3.21799 19.908L4.10899 19.454ZM19.891 19.454L19 19L19 19L19.891 19.454ZM19.454 19.891L19 19L19 19L19.454 19.891ZM19.891 9.54601L19 10L19 10L19.891 9.54601ZM19.454 9.10899L19.908 8.21799L19.908 8.21799L19.454 9.10899ZM4.10899 9.54601L3.21799 9.09202L3.21799 9.09202L4.10899 9.54601ZM4.54601 9.10899L4.09202 8.21799L4.09202 8.21799L4.54601 9.10899ZM5 8C5 8.55228 5.44772 9 6 9C6.55228 9 7 8.55228 7 8H5ZM10.7929 3.29289L11.5 2.58579L11.5 2.58579L10.7929 3.29289ZM12.2071 4.70711L12.9142 4L12.9142 4L12.2071 4.70711ZM17 8C17 8.55228 17.4477 9 18 9C18.5523 9 19 8.55228 19 8H17ZM8 12C7.44772 12 7 12.4477 7 13C7 13.5523 7.44772 14 8 14V12ZM12 14C12.5523 14 13 13.5523 13 13C13 12.4477 12.5523 12 12 12V14ZM19 10.6V18.4H21V10.6H19ZM18.4 19H5.6V21H18.4V19ZM5 18.4V10.6H3V18.4H5ZM5.6 10H18.4V8H5.6V10ZM5.6 19C5.30347 19 5.14122 18.9992 5.02463 18.9897C4.91972 18.9811 4.94249 18.9707 5 19L4.09202 20.782C4.36344 20.9203 4.63318 20.9644 4.86177 20.9831C5.07869 21.0008 5.33647 21 5.6 21V19ZM3 18.4C3 18.6635 2.99922 18.9213 3.01695 19.1382C3.03562 19.3668 3.07969 19.6366 3.21799 19.908L5 19C5.0293 19.0575 5.01887 19.0803 5.0103 18.9754C5.00078 18.8588 5 18.6965 5 18.4H3ZM5 19L5 19L3.21799 19.908C3.40973 20.2843 3.71569 20.5903 4.09202 20.782L5 19ZM19 18.4C19 18.6965 18.9992 18.8588 18.9897 18.9754C18.9811 19.0803 18.9707 19.0575 19 19L20.782 19.908C20.9203 19.6366 20.9644 19.3668 20.9831 19.1382C21.0008 18.9213 21 18.6635 21 18.4H19ZM18.4 21C18.6635 21 18.9213 21.0008 19.1382 20.9831C19.3668 20.9644 19.6366 20.9203 19.908 20.782L19 19C19.0575 18.9707 19.0803 18.9811 18.9754 18.9897C18.8588 18.9992 18.6965 19 18.4 19V21ZM19 19L19 19L19.908 20.782C20.2843 20.5903 20.5903 20.2843 20.782 19.908L19 19ZM21 10.6C21 10.3365 21.0008 10.0787 20.9831 9.86177C20.9644 9.63318 20.9203 9.36344 20.782 9.09202L19 10C18.9707 9.94249 18.9811 9.91972 18.9897 10.0246C18.9992 10.1412 19 10.3035 19 10.6H21ZM18.4 10C18.6965 10 18.8588 10.0008 18.9754 10.0103C19.0803 10.0189 19.0575 10.0293 19 10L19.908 8.21799C19.6366 8.07969 19.3668 8.03562 19.1382 8.01695C18.9213 7.99922 18.6635 8 18.4 8V10ZM20.782 9.09202C20.5903 8.71569 20.2843 8.40973 19.908 8.21799L19 10L19 10L20.782 9.09202ZM5 10.6C5 10.3035 5.00078 10.1412 5.0103 10.0246C5.01887 9.91972 5.0293 9.94249 5 10L3.21799 9.09202C3.07969 9.36344 3.03562 9.63318 3.01695 9.86177C2.99922 10.0787 3 10.3365 3 10.6H5ZM5.6 8C5.33647 8 5.07869 7.99922 4.86177 8.01695C4.63318 8.03562 4.36344 8.07969 4.09202 8.21799L5 10C4.94249 10.0293 4.91972 10.0189 5.02463 10.0103C5.14122 10.0008 5.30347 10 5.6 10V8ZM5 10L5 10L4.09202 8.21799C3.71569 8.40973 3.40973 8.71569 3.21799 9.09202L5 10ZM7 8V4H5V8H7ZM7 4H10.0858V2H7V4ZM10.0858 4L11.5 5.41421L12.9142 4L11.5 2.58579L10.0858 4ZM12.9142 6H17V4H12.9142V6ZM17 6V8H19V6H17ZM17 6H19C19 4.89543 18.1046 4 17 4V6ZM11.5 5.41421C11.8751 5.78929 12.3838 6 12.9142 6V4L12.9142 4L11.5 5.41421ZM10.0858 4L10.0858 4L11.5 2.58579C11.1249 2.21071 10.6162 2 10.0858 2V4ZM7 4V4V2C5.89543 2 5 2.89543 5 4H7ZM8 14H12V12H8V14Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.1 KiB |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "archive.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "archive.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "archive.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M20 8H21C21 7.44772 20.5523 7 20 7V8ZM4 8V7C3.44772 7 3 7.44772 3 8H4ZM4.54601 19.891L5 19L5 19L4.54601 19.891ZM4.10899 19.454L3.21799 19.908L3.21799 19.908L4.10899 19.454ZM19.891 19.454L19 19L19 19L19.891 19.454ZM19.454 19.891L19 19L19 19L19.454 19.891ZM3 4V3C2.44772 3 2 3.44772 2 4H3ZM21 4H22C22 3.44772 21.5523 3 21 3V4ZM21 8V9C21.5523 9 22 8.55228 22 8H21ZM3 8H2C2 8.55228 2.44772 9 3 9V8ZM10 11C9.44772 11 9 11.4477 9 12C9 12.5523 9.44772 13 10 13V11ZM14 13C14.5523 13 15 12.5523 15 12C15 11.4477 14.5523 11 14 11V13ZM19 8V18.4H21V8H19ZM18.4 19H5.6V21H18.4V19ZM5 18.4V8H3V18.4H5ZM4 9H20V7H4V9ZM5.6 19C5.30347 19 5.14122 18.9992 5.02463 18.9897C4.91972 18.9811 4.94249 18.9707 5 19L4.09202 20.782C4.36344 20.9203 4.63318 20.9644 4.86177 20.9831C5.07869 21.0008 5.33647 21 5.6 21V19ZM3 18.4C3 18.6635 2.99922 18.9213 3.01695 19.1382C3.03562 19.3668 3.07969 19.6366 3.21799 19.908L5 19C5.0293 19.0575 5.01887 19.0803 5.0103 18.9754C5.00078 18.8588 5 18.6965 5 18.4H3ZM5 19L5 19L3.21799 19.908C3.40973 20.2843 3.71569 20.5903 4.09202 20.782L5 19ZM19 18.4C19 18.6965 18.9992 18.8588 18.9897 18.9754C18.9811 19.0803 18.9707 19.0575 19 19L20.782 19.908C20.9203 19.6366 20.9644 19.3668 20.9831 19.1382C21.0008 18.9213 21 18.6635 21 18.4H19ZM18.4 21C18.6635 21 18.9213 21.0008 19.1382 20.9831C19.3668 20.9644 19.6366 20.9203 19.908 20.782L19 19C19.0575 18.9707 19.0803 18.9811 18.9754 18.9897C18.8588 18.9992 18.6965 19 18.4 19V21ZM19 19L19 19L19.908 20.782C20.2843 20.5903 20.5903 20.2843 20.782 19.908L19 19ZM3 5H21V3H3V5ZM20 4V8H22V4H20ZM21 7H3V9H21V7ZM4 8V4H2V8H4ZM10 13H14V11H10V13Z" fill="black"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "arrow-bottom-down.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "arrow-bottom-down.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "arrow-bottom-down.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.5 6.5L17.25 17.25M9 18H17C17.5523 18 18 17.5523 18 17V9" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 253 B |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "arrow-bottom-left.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "arrow-bottom-left.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "arrow-bottom-left.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M17.5 6.5L6.75 17.25M6 9L6 17C6 17.5523 6.44771 18 7 18L15 18" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 256 B |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "arrow-down-circle.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "arrow-down-circle.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "arrow-down-circle.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M12 8L12 15.25M15 13L12.5303 15.4697C12.2374 15.7626 11.7626 15.7626 11.4697 15.4697L9 13M12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C16.9706 3 21 7.02944 21 12C21 16.9706 16.9706 21 12 21Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 397 B |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "arrow-down.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "arrow-down.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "arrow-down.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M18 14.4142L12.7071 19.7071C12.3166 20.0976 11.6834 20.0976 11.2929 19.7071L6 14.4142M12 19.1642L12 4.16421" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 302 B |
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"images": [
|
||||
{
|
||||
"filename": "arrow-expand-horizontal.svg",
|
||||
"idiom": "universal",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "2x",
|
||||
"filename": "arrow-expand-horizontal.svg"
|
||||
},
|
||||
{
|
||||
"idiom": "universal",
|
||||
"scale": "3x",
|
||||
"filename": "arrow-expand-horizontal.svg"
|
||||
}
|
||||
],
|
||||
"info": {
|
||||
"author": "xcode",
|
||||
"version": 1
|
||||
},
|
||||
"properties": {
|
||||
"template-rendering-intent": "template"
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M18.2499 8L21.7196 11.4697C22.0125 11.7625 22.0125 12.2374 21.7196 12.5303L18.2499 16M5.74989 8L2.28022 11.4697C1.98732 11.7625 1.98732 12.2374 2.28022 12.5303L5.74989 16M2.99989 12H20.9999" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 384 B |