diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..ab8b7ec --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,71 @@ +{ + "permissions": { + "allow": [ + "Bash(cargo init:*)", + "Bash(cargo:*)", + "Bash(find:*)", + "Bash(mkdir:*)", + "Bash(../target/debug/ailog new:*)", + "Bash(../target/debug/ailog build)", + "Bash(/Users/syui/ai/log/target/debug/ailog build)", + "Bash(ls:*)", + "Bash(curl:*)", + "Bash(pkill:*)", + "WebFetch(domain:docs.anthropic.com)", + "WebFetch(domain:github.com)", + "Bash(rm:*)", + "Bash(mv:*)", + "Bash(cp:*)", + "Bash(timeout:*)", + "Bash(grep:*)", + "Bash(./target/debug/ailog:*)", + "Bash(cat:*)", + "Bash(npm install)", + "Bash(npm run build:*)", + "Bash(chmod:*)", + "Bash(./scripts/tunnel.sh:*)", + "Bash(PRODUCTION=true cargo run -- build)", + "Bash(cloudflared tunnel:*)", + "Bash(npm install:*)", + "Bash(./scripts/build-oauth-partial.zsh:*)", + "Bash(./scripts/quick-oauth-update.zsh:*)", + "Bash(../target/debug/ailog serve)", + "Bash(./scripts/test-oauth.sh:*)", + "Bash(./run.zsh:*)", + "Bash(npm run dev:*)", + "Bash(./target/release/ailog:*)", + "Bash(rg:*)", + "Bash(../target/release/ailog build)", + "Bash(zsh run.zsh:*)", + "Bash(hugo:*)", + "WebFetch(domain:docs.bsky.app)", + "WebFetch(domain:syui.ai)", + "Bash(rustup target list:*)", + "Bash(rustup target:*)", + "Bash(git add:*)", + "Bash(git commit:*)", + "Bash(git push:*)", + "Bash(git tag:*)", + "Bash(../bin/ailog:*)", + "Bash(../target/release/ailog oauth build:*)", + "Bash(ailog:*)", + "WebFetch(domain:plc.directory)", + "WebFetch(domain:atproto.com)", + "WebFetch(domain:syu.is)", + "Bash(sed:*)", + "Bash(./scpt/run.zsh:*)", + "Bash(RUST_LOG=debug cargo run -- stream status)", + "Bash(RUST_LOG=debug cargo run -- stream test-api)", + "Bash(/Users/syui/ai/ai/log/target/debug/ailog build)", + "Bash(git reset:*)", + "Bash(./scripts/sync-versions.sh:*)", + "Bash(node:*)", + "Bash(shasum:*)", + "WebFetch(domain:www.pfrazee.com)", + "WebFetch(domain:pfrazee.leaflet.pub)", + "Bash(git checkout:*)", + "Bash(git clone:*)" + ], + "deny": [] + } +} diff --git a/.gitignore b/.gitignore index 9b19b07..bd2ddc5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,27 +1,10 @@ /target /Cargo.lock /public -*.swp -*.swo -*~ +/dist +/repos .DS_Store -my-blog/public/ -dist +.config node_modules package-lock.json -my-blog/static/assets/comment-atproto-* -my-blog/static/ai-assets/comment-atproto-* -bin/ailog -docs -my-blog/static/index.html -my-blog/templates/oauth-assets.html -cloudflared-config.yml -.config -repos -oauth_old -oauth_example -my-blog/static/oauth/assets/comment-atproto* -*.lock -my-blog/config.toml -.claude/settings.local.json -my-blog/static/pds +claude.md diff --git a/Cargo.toml b/Cargo.toml index 1174d0e..c264792 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,89 +1,21 @@ [package] name = "ailog" -version = "0.3.4" +version = "0.3.5" edition = "2021" authors = ["syui"] -description = "A static blog generator with AI features" +description = "static site generator for atproto" license = "MIT" -[[bin]] -name = "ailog" -path = "src/main.rs" - -[lib] -name = "ailog" -path = "src/lib.rs" - [dependencies] clap = { version = "4.5", features = ["derive"] } pulldown-cmark = "0.11" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -tokio = { version = "1.40", features = ["rt-multi-thread", "macros", "fs", "net", "io-util", "sync", "time", "process", "signal"] } +tokio = { version = "1.40", features = ["rt-multi-thread", "macros", "fs"] } anyhow = "1.0" -toml = "0.8" -chrono = "0.4" -tera = "1.20" -walkdir = "2.5" -gray_matter = "0.2" -fs_extra = "1.3" -colored = "2.1" -serde_yaml = "0.9" -syntect = "5.2" reqwest = { version = "0.12", features = ["json", "rustls-tls"], default-features = false } -rand = "0.8" -sha2 = "0.10" -base64 = "0.22" -uuid = { version = "1.11", features = ["v4"] } -urlencoding = "2.1" -axum = "0.7" -tower = "0.5" -tower-http = { version = "0.5", features = ["cors", "fs"] } -axum-extra = { version = "0.9", features = ["typed-header"] } -tracing = "0.1" -hyper = { version = "1.0", features = ["full"] } -tower-sessions = "0.12" -jsonwebtoken = "9.2" -cookie = "0.18" -# Documentation generation dependencies -syn = { version = "2.0", features = ["full", "parsing", "visit"] } -quote = "1.0" -ignore = "0.4" -git2 = { version = "0.18", features = ["vendored-openssl", "vendored-libgit2", "ssh"], default-features = false } -regex = "1.0" -# ATProto and stream monitoring dependencies -tokio-tungstenite = { version = "0.21", features = ["rustls-tls-webpki-roots", "connect"], default-features = false } -futures-util = "0.3" -tungstenite = { version = "0.21", features = ["rustls-tls-webpki-roots"], default-features = false } -rpassword = "7.3" -rustyline = "14.0" dirs = "5.0" - -[dev-dependencies] -tempfile = "3.14" - -[profile.dev] -# Speed up development builds -opt-level = 0 -debug = true -debug-assertions = true -overflow-checks = true -lto = false -panic = 'unwind' -incremental = true -codegen-units = 256 - -[profile.release] -# Optimize release builds for speed and size -opt-level = 3 -debug = false -debug-assertions = false -overflow-checks = false -lto = true -panic = 'abort' -incremental = false -codegen-units = 1 - -[profile.dev.package."*"] -# Optimize dependencies in dev builds -opt-level = 3 +chrono = "0.4" +walkdir = "2.5" +axum = "0.7" +tower-http = { version = "0.5", features = ["fs"] } diff --git a/README.md b/README.md index 466cef0..ba87f8c 100644 --- a/README.md +++ b/README.md @@ -1,559 +1,4 @@ -# ai.log +# ailog -AI-powered static blog generator with ATProto integration, part of the ai.ai ecosystem. +`bundle: ai.syui.log` -## ๐Ÿš€ Quick Start - -### Installation & Setup - -```bash -# 1. Clone repository -git clone https://git.syui.ai/ai/log -cd log - -# 2. Build ailog -cargo build --release - -# 3. Initialize blog -./target/release/ailog init my-blog - -# 4. Create your first post -./target/release/ailog new "My First Post" - -# 5. Build static site -./target/release/ailog build - -# 6. Serve locally -./target/release/ailog serve -``` - -### Install via Cargo - -```bash -cargo install --path . -# Now you can use `ailog` command globally -``` - -## ๐Ÿ“– Core Commands - -### Blog Management - -```bash -# Project setup -ailog init # Initialize new blog project -ailog new # Create new blog post -ailog build # Generate static site with JSON index -ailog serve # Start development server -ailog clean # Clean build artifacts - -# ATProto authentication -ailog auth init # Setup ATProto credentials -ailog auth status # Check authentication status -ailog auth logout # Clear credentials - -# OAuth app build -ailog oauth build <project-dir> # Build OAuth comment system -``` - -### Stream & AI Features - -```bash -# Start monitoring & AI generation -ailog stream start --ai-generate # Monitor blog + auto-generate AI content -ailog stream start --daemon # Run as background daemon -ailog stream status # Check stream status -ailog stream stop # Stop monitoring -ailog stream test # Test ATProto API access -``` - -### Documentation & Translation - -```bash -# Generate documentation -ailog doc readme --with-ai # Generate enhanced README -ailog doc api --output ./docs # Generate API documentation -ailog doc structure --include-deps # Analyze project structure - -# AI-powered translation -ailog doc translate --input README.md --target-lang en -ailog doc translate --input docs/guide.ja.md --target-lang en --model qwen2.5:latest -``` - -## ๐Ÿ—๏ธ Architecture - -### Project Structure - -``` -ai.log/ -โ”œโ”€โ”€ src/ # Rust static blog generator -โ”‚ โ”œโ”€โ”€ commands/ # CLI command implementations -โ”‚ โ”œโ”€โ”€ generator.rs # Core blog generation + JSON index -โ”‚ โ”œโ”€โ”€ mcp/ # MCP server integration -โ”‚ โ””โ”€โ”€ main.rs # CLI entry point -โ”œโ”€โ”€ my-blog/ # Your blog content -โ”‚ โ”œโ”€โ”€ content/posts/ # Markdown blog posts -โ”‚ โ”œโ”€โ”€ templates/ # Tera templates -โ”‚ โ”œโ”€โ”€ static/ # Static assets -โ”‚ โ””โ”€โ”€ public/ # Generated site output -โ”œโ”€โ”€ oauth/ # ATProto comment system -โ”‚ โ”œโ”€โ”€ src/ # TypeScript OAuth app -โ”‚ โ”œโ”€โ”€ dist/ # Built OAuth assets -โ”‚ โ””โ”€โ”€ package.json # Node.js dependencies -โ””โ”€โ”€ target/ # Rust build output -``` - -### Data Flow - -``` -Blog Posts (Markdown) โ†’ ailog build โ†’ public/ - โ”œโ”€โ”€ Static HTML pages - โ””โ”€โ”€ index.json (API) - โ†“ -ailog stream start --ai-generate โ†’ Monitor index.json - โ†“ -New posts detected โ†’ Ollama AI โ†’ ATProto records - โ”œโ”€โ”€ ai.syui.log.chat.lang (translations) - โ””โ”€โ”€ ai.syui.log.chat.comment (AI comments) - โ†“ -OAuth app โ†’ Display AI-generated content -``` - -## ๐Ÿค– AI Integration - -### AI Content Generation - -The `--ai-generate` flag enables automatic AI content generation: - -1. **Blog Monitoring**: Monitors `index.json` every 5 minutes -2. **Duplicate Prevention**: Checks existing ATProto collections -3. **AI Generation**: Uses Ollama (gemma3:4b) for translations & comments -4. **ATProto Storage**: Saves to derived collections (`base.chat.lang`, `base.chat.comment`) - -```bash -# Start AI generation monitor -ailog stream start --ai-generate - -# Output: -# ๐Ÿค– Starting AI content generation monitor... -# ๐Ÿ“ก Blog host: https://syui.ai -# ๐Ÿง  Ollama host: https://ollama.syui.ai -# ๐Ÿ” Checking for new blog posts... -# โœ… Generated translation for: ้™็š„ใ‚ตใ‚คใƒˆใ‚ธใ‚งใƒใƒฌใƒผใ‚ฟใ‚’ไฝœใฃใŸ -# โœ… Generated comment for: ้™็š„ใ‚ตใ‚คใƒˆใ‚ธใ‚งใƒใƒฌใƒผใ‚ฟใ‚’ไฝœใฃใŸ -``` - -### Collection Management - -ailog uses a **simplified collection structure** based on a single base collection name: - -```bash -# Single environment variable controls all collections (unified naming) -export VITE_OAUTH_COLLECTION="ai.syui.log" - -# Automatically derives: -# - ai.syui.log (comments) -# - ai.syui.log.user (user management) -# - ai.syui.log.chat.lang (AI translations) -# - ai.syui.log.chat.comment (AI comments) -``` - -**Benefits:** -- โœ… **Simple**: One variable instead of 5+ -- โœ… **Consistent**: All collections follow the same pattern -- โœ… **Manageable**: Easy systemd/production configuration - -### Ask AI Feature - -Interactive AI chat integrated into blog pages: - -```bash -# 1. Setup Ollama -brew install ollama -ollama pull gemma2:2b - -# 2. Start with CORS support -OLLAMA_ORIGINS="https://example.com" ollama serve - -# 3. Configure AI DID in templates/base.html -const aiConfig = { - systemPrompt: 'You are a helpful AI assistant.', - aiDid: 'did:plc:your-ai-bot-did' -}; -``` - -## ๐ŸŒ ATProto Integration - -### OAuth Comment System - -The OAuth app provides ATProto-authenticated commenting: - -```bash -# 1. Build OAuth app -cd oauth -npm install -npm run build - -# 2. Configure for production -ailog oauth build my-blog # Auto-generates .env.production - -# 3. Deploy OAuth assets -# Assets are automatically copied to public/ during ailog build -``` - -### Authentication Setup - -```bash -# Initialize ATProto authentication -ailog auth init - -# Input required: -# - Handle (e.g., your.handle.bsky.social) -# - Access JWT -# - Refresh JWT - -# Check status -ailog auth status -``` - -### Collection Structure - -All ATProto collections are **automatically derived** from a single base name: - -``` -Base Collection: "ai.syui.log" -โ”œโ”€โ”€ ai.syui.log (user comments) -โ”œโ”€โ”€ ai.syui.log.user (registered commenters) -โ””โ”€โ”€ ai.syui.log.chat/ - โ”œโ”€โ”€ ai.syui.log.chat.lang (AI translations) - โ””โ”€โ”€ ai.syui.log.chat.comment (AI comments) -``` - -**Configuration Priority:** -1. Environment variable: `VITE_OAUTH_COLLECTION` (unified) -2. config.toml: `[oauth] collection = "..."` -3. Auto-generated from domain (e.g., `log.syui.ai` โ†’ `ai.syui.log`) -4. Default: `ai.syui.log` - -### Stream Monitoring - -```bash -# Monitor ATProto streams for comments -ailog stream start - -# Enable AI generation alongside monitoring -ailog stream start --ai-generate --daemon -``` - -## ๐Ÿ“ฑ OAuth App Features - -The OAuth TypeScript app provides: - -### Comment System -- **Real-time Comments**: ATProto-authenticated commenting -- **User Management**: Automatic user registration -- **Mobile Responsive**: Optimized for all devices -- **JSON View**: Technical record inspection - -### AI Content Display -- **Lang: EN Tab**: AI-generated English translations -- **AI Comment Tab**: AI-generated blog insights -- **Admin Records**: Fetches from admin DID collections -- **Real-time Updates**: Live content refresh - -### Setup & Configuration - -```bash -cd oauth - -# Development -npm run dev - -# Production build -npm run build - -# Preview production -npm run preview -``` - -**Environment Variables:** -```bash -# Production (.env.production - auto-generated by ailog oauth build) -VITE_APP_HOST=https://syui.ai -VITE_OAUTH_CLIENT_ID=https://syui.ai/client-metadata.json -VITE_OAUTH_REDIRECT_URI=https://syui.ai/oauth/callback -VITE_ADMIN_DID=did:plc:uqzpqmrjnptsxezjx4xuh2mn - -# Simplified collection configuration (single base collection) -VITE_OAUTH_COLLECTION=ai.syui.log - -# AI Configuration -VITE_AI_ENABLED=true -VITE_AI_ASK_AI=true -VITE_AI_PROVIDER=ollama -# ... (other AI settings) -``` - -## ๐Ÿ”ง Advanced Features - -### JSON Index Generation - -Every `ailog build` generates `/public/index.json`: - -```json -[ - { - "title": "้™็š„ใ‚ตใ‚คใƒˆใ‚ธใ‚งใƒใƒฌใƒผใ‚ฟใ‚’ไฝœใฃใŸ", - "href": "https://syui.ai/posts/2025-06-06-ailog.html", - "formated_time": "Thu Jun 12, 2025", - "utc_time": "2025-06-12T00:00:00Z", - "tags": ["blog", "rust", "mcp", "atp"], - "contents": "Plain text content...", - "description": "Excerpt...", - "categories": [] - } -] -``` - -This enables: -- **API Access**: Programmatic blog content access -- **Stream Monitoring**: AI generation triggers -- **Search Integration**: Full-text search capabilities - -### Translation System - -AI-powered document translation with Ollama: - -```bash -# Basic translation -ailog doc translate --input README.md --target-lang en - -# Advanced options -ailog doc translate \ - --input docs/guide.ja.md \ - --target-lang en \ - --source-lang ja \ - --model qwen2.5:latest \ - --output docs/guide.en.md -``` - -**Features:** -- **Markdown-aware**: Preserves code blocks, links, tables -- **Multiple models**: qwen2.5, gemma3, etc. -- **Auto-detection**: Detects Japanese content automatically -- **Structure preservation**: Maintains document formatting - -### MCP Server Integration - -```bash -# Start MCP server for ai.gpt integration -ailog mcp --port 8002 - -# Available tools: -# - create_blog_post -# - list_blog_posts -# - build_blog -# - get_post_content -# - translate_document -# - generate_documentation -``` - -## ๐Ÿš€ Deployment - -### GitHub Actions - -```yaml -name: Deploy ai.log Blog -on: - push: - branches: [main] - -jobs: - deploy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Setup Rust - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - - - name: Build ailog - run: cargo build --release - - - name: Build blog - run: | - cd my-blog - ../target/release/ailog build - - - name: Deploy to Cloudflare Pages - uses: cloudflare/pages-action@v1 - with: - apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} - accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - projectName: my-blog - directory: my-blog/public -``` - -### Production Setup - -```bash -# 1. Build for production -cargo build --release - -# 2. Setup systemd services -sudo cp systemd/system/ailog-stream.service /etc/systemd/system/ -sudo systemctl enable ailog-stream.service -sudo systemctl start ailog-stream.service - -# 3. Configure Ollama with CORS -sudo vim /usr/lib/systemd/system/ollama.service -# Add: Environment="OLLAMA_ORIGINS=https://yourdomain.com" - -# 4. Monitor services -journalctl -u ailog-stream.service -f -``` - -## ๐ŸŒ Translation Support - -### Supported Languages - -| Language | Code | Status | Model | -|----------|------|--------|-------| -| English | `en` | โœ… Full | qwen2.5 | -| Japanese | `ja` | โœ… Full | qwen2.5 | -| Chinese | `zh` | โœ… Full | qwen2.5 | -| Korean | `ko` | โš ๏ธ Basic | qwen2.5 | -| Spanish | `es` | โš ๏ธ Basic | qwen2.5 | - -### Translation Workflow - -1. **Parse**: Analyze markdown structure -2. **Preserve**: Isolate code blocks and technical content -3. **Translate**: Process with Ollama AI -4. **Reconstruct**: Rebuild with original formatting -5. **Validate**: Ensure structural integrity - -## ๐ŸŽฏ Use Cases - -### Personal Blog -- **AI-Enhanced**: Automatic translations and AI insights -- **Distributed Comments**: ATProto-based social interaction -- **Mobile-First**: Responsive OAuth comment system - -### Technical Documentation -- **Code Analysis**: Automatic API documentation -- **Multi-language**: AI-powered translation -- **Structure Analysis**: Project overview generation - -### AI Ecosystem Integration -- **ai.gpt Connection**: Memory-driven content generation -- **MCP Integration**: Claude Code workflow support -- **Distributed Identity**: ATProto authentication - -## ๐Ÿ” Troubleshooting - -### Build Issues -```bash -# Check Rust version -rustc --version - -# Update dependencies -cargo update - -# Clean build -cargo clean && cargo build --release -``` - -### Authentication Problems -```bash -# Reset authentication -ailog auth logout -ailog auth init - -# Test API access -ailog stream test -``` - -### AI Generation Issues -```bash -# Check Ollama status -curl http://localhost:11434/api/tags - -# Test with manual request -curl -X POST http://localhost:11434/api/generate \ - -d '{"model":"gemma3:4b","prompt":"Test","stream":false}' - -# Check CORS settings -# Ensure OLLAMA_ORIGINS includes your domain -``` - -### OAuth App Issues -```bash -# Rebuild OAuth assets -cd oauth -rm -rf dist/ -npm run build - -# Check environment variables -cat .env.production - -# Verify client-metadata.json -curl https://yourdomain.com/client-metadata.json -``` - -## ๐Ÿ“š Documentation - -### Core Concepts -- **Static Generation**: Rust-powered site building -- **JSON Index**: API-compatible blog data -- **ATProto Integration**: Distributed social features -- **AI Enhancement**: Automatic content generation - -### File Structure -- `config.toml`: Blog configuration (simplified collection setup) -- `content/posts/*.md`: Blog post sources -- `templates/*.html`: Tera template files -- `public/`: Generated static site + API (index.json) -- `oauth/dist/`: Built OAuth assets - -### Example config.toml -```toml -[site] -title = "My Blog" -base_url = "https://myblog.com" - -[oauth] -admin = "did:plc:your-admin-did" -collection = "ai.myblog.log" # Single base collection - -[ai] -enabled = true -auto_translate = true -comment_moderation = true -model = "gemma3:4b" -host = "https://ollama.syui.ai" -``` - -## ๐Ÿ”— ai.ai Ecosystem - -ai.log is part of the broader ai.ai ecosystem: - -- **ai.gpt**: Memory system and AI integration -- **ai.card**: ATProto-based card game system -- **ai.bot**: Social media automation -- **ai.verse**: 3D virtual world integration -- **ai.shell**: AI-powered shell interface - -### yui System Compliance -- **Uniqueness**: Each blog tied to individual identity -- **Reality Reflection**: Personal memories โ†’ digital content -- **Irreversibility**: Published content maintains integrity - -## ๐Ÿ“ License - -ยฉ syui - ---- - -**Part of the ai ecosystem**: ai.gpt, ai.card, ai.log, ai.bot, ai.verse, ai.shell \ No newline at end of file diff --git a/bin/ailog-linux-x86_64.tar.gz b/bin/ailog-linux-x86_64.tar.gz deleted file mode 100644 index 984e35d..0000000 Binary files a/bin/ailog-linux-x86_64.tar.gz and /dev/null differ diff --git a/browser/dist/assets/index-CvFXbZtL.css b/browser/dist/assets/index-CvFXbZtL.css new file mode 100644 index 0000000..d3104c9 --- /dev/null +++ b/browser/dist/assets/index-CvFXbZtL.css @@ -0,0 +1 @@ +.container{max-width:800px;margin:0 auto;padding:2rem}h1{font-size:2rem;margin-bottom:1.5rem;color:#333}.input-section{margin-bottom:2rem;display:flex;gap:.5rem}.at-uri-input{flex:1;padding:.75rem;font-size:1rem;border:2px solid #ddd;border-radius:4px;font-family:monospace}.at-uri-input:focus{outline:none;border-color:#06c}.input-section button{padding:.75rem 2rem;font-size:1rem;background:#06c;color:#fff;border:none;border-radius:4px;cursor:pointer;font-weight:500}.input-section button:hover{background:#0052a3}.info-section{background:#fff;padding:1.5rem;border-radius:8px;margin-bottom:2rem;box-shadow:0 2px 4px #0000001a}.info-section h2{font-size:1.5rem;margin-bottom:1rem;color:#333}.info-section ul{list-style-position:inside;color:#666}.info-section li{margin-bottom:.5rem}.back-link{display:inline-block;color:#06c;text-decoration:none;font-weight:500}.back-link:hover{text-decoration:underline}.record-view{background:#fff;padding:2rem;border-radius:8px;margin-bottom:2rem;box-shadow:0 2px 4px #0000001a}.record-view h2{font-size:2rem;margin-bottom:1rem;color:#333}.record-meta{margin-bottom:1.5rem;padding-bottom:1rem;border-bottom:1px solid #eee}.record-meta p{margin:.5rem 0;color:#666;font-size:.9rem;font-family:monospace}.record-content{line-height:1.8;color:#333}.record-content pre{white-space:pre-wrap;word-wrap:break-word;font-family:inherit;margin:0}*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#f5f5f5}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace} diff --git a/browser/dist/assets/index-DrFpc8Xj.js b/browser/dist/assets/index-DrFpc8Xj.js new file mode 100644 index 0000000..bd15347 --- /dev/null +++ b/browser/dist/assets/index-DrFpc8Xj.js @@ -0,0 +1,40 @@ +var lc=Object.defineProperty;var uc=(e,t,n)=>t in e?lc(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Mo=(e,t,n)=>uc(e,typeof t!="symbol"?t+"":t,n);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))r(l);new MutationObserver(l=>{for(const u of l)if(u.type==="childList")for(const o of u.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(l){const u={};return l.integrity&&(u.integrity=l.integrity),l.referrerPolicy&&(u.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?u.credentials="include":l.crossOrigin==="anonymous"?u.credentials="omit":u.credentials="same-origin",u}function r(l){if(l.ep)return;l.ep=!0;const u=n(l);fetch(l.href,u)}})();function oc(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Wi={exports:{}},el={},Qi={exports:{}},L={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Xn=Symbol.for("react.element"),ic=Symbol.for("react.portal"),sc=Symbol.for("react.fragment"),ac=Symbol.for("react.strict_mode"),cc=Symbol.for("react.profiler"),fc=Symbol.for("react.provider"),dc=Symbol.for("react.context"),pc=Symbol.for("react.forward_ref"),mc=Symbol.for("react.suspense"),hc=Symbol.for("react.memo"),vc=Symbol.for("react.lazy"),Do=Symbol.iterator;function yc(e){return e===null||typeof e!="object"?null:(e=Do&&e[Do]||e["@@iterator"],typeof e=="function"?e:null)}var Ki={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Yi=Object.assign,Xi={};function ln(e,t,n){this.props=e,this.context=t,this.refs=Xi,this.updater=n||Ki}ln.prototype.isReactComponent={};ln.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};ln.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Gi(){}Gi.prototype=ln.prototype;function Uu(e,t,n){this.props=e,this.context=t,this.refs=Xi,this.updater=n||Ki}var Au=Uu.prototype=new Gi;Au.constructor=Uu;Yi(Au,ln.prototype);Au.isPureReactComponent=!0;var Io=Array.isArray,Zi=Object.prototype.hasOwnProperty,Bu={current:null},Ji={key:!0,ref:!0,__self:!0,__source:!0};function qi(e,t,n){var r,l={},u=null,o=null;if(t!=null)for(r in t.ref!==void 0&&(o=t.ref),t.key!==void 0&&(u=""+t.key),t)Zi.call(t,r)&&!Ji.hasOwnProperty(r)&&(l[r]=t[r]);var i=arguments.length-2;if(i===1)l.children=n;else if(1<i){for(var s=Array(i),c=0;c<i;c++)s[c]=arguments[c+2];l.children=s}if(e&&e.defaultProps)for(r in i=e.defaultProps,i)l[r]===void 0&&(l[r]=i[r]);return{$$typeof:Xn,type:e,key:u,ref:o,props:l,_owner:Bu.current}}function gc(e,t){return{$$typeof:Xn,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function $u(e){return typeof e=="object"&&e!==null&&e.$$typeof===Xn}function wc(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(n){return t[n]})}var Fo=/\/+/g;function wl(e,t){return typeof e=="object"&&e!==null&&e.key!=null?wc(""+e.key):t.toString(36)}function gr(e,t,n,r,l){var u=typeof e;(u==="undefined"||u==="boolean")&&(e=null);var o=!1;if(e===null)o=!0;else switch(u){case"string":case"number":o=!0;break;case"object":switch(e.$$typeof){case Xn:case ic:o=!0}}if(o)return o=e,l=l(o),e=r===""?"."+wl(o,0):r,Io(l)?(n="",e!=null&&(n=e.replace(Fo,"$&/")+"/"),gr(l,t,n,"",function(c){return c})):l!=null&&($u(l)&&(l=gc(l,n+(!l.key||o&&o.key===l.key?"":(""+l.key).replace(Fo,"$&/")+"/")+e)),t.push(l)),1;if(o=0,r=r===""?".":r+":",Io(e))for(var i=0;i<e.length;i++){u=e[i];var s=r+wl(u,i);o+=gr(u,t,n,s,l)}else if(s=yc(e),typeof s=="function")for(e=s.call(e),i=0;!(u=e.next()).done;)u=u.value,s=r+wl(u,i++),o+=gr(u,t,n,s,l);else if(u==="object")throw t=String(e),Error("Objects are not valid as a React child (found: "+(t==="[object Object]"?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return o}function tr(e,t,n){if(e==null)return e;var r=[],l=0;return gr(e,r,"","",function(u){return t.call(n,u,l++)}),r}function Sc(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(n){(e._status===0||e._status===-1)&&(e._status=1,e._result=n)},function(n){(e._status===0||e._status===-1)&&(e._status=2,e._result=n)}),e._status===-1&&(e._status=0,e._result=t)}if(e._status===1)return e._result.default;throw e._result}var ie={current:null},wr={transition:null},kc={ReactCurrentDispatcher:ie,ReactCurrentBatchConfig:wr,ReactCurrentOwner:Bu};function bi(){throw Error("act(...) is not supported in production builds of React.")}L.Children={map:tr,forEach:function(e,t,n){tr(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return tr(e,function(){t++}),t},toArray:function(e){return tr(e,function(t){return t})||[]},only:function(e){if(!$u(e))throw Error("React.Children.only expected to receive a single React element child.");return e}};L.Component=ln;L.Fragment=sc;L.Profiler=cc;L.PureComponent=Uu;L.StrictMode=ac;L.Suspense=mc;L.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=kc;L.act=bi;L.cloneElement=function(e,t,n){if(e==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var r=Yi({},e.props),l=e.key,u=e.ref,o=e._owner;if(t!=null){if(t.ref!==void 0&&(u=t.ref,o=Bu.current),t.key!==void 0&&(l=""+t.key),e.type&&e.type.defaultProps)var i=e.type.defaultProps;for(s in t)Zi.call(t,s)&&!Ji.hasOwnProperty(s)&&(r[s]=t[s]===void 0&&i!==void 0?i[s]:t[s])}var s=arguments.length-2;if(s===1)r.children=n;else if(1<s){i=Array(s);for(var c=0;c<s;c++)i[c]=arguments[c+2];r.children=i}return{$$typeof:Xn,type:e.type,key:l,ref:u,props:r,_owner:o}};L.createContext=function(e){return e={$$typeof:dc,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},e.Provider={$$typeof:fc,_context:e},e.Consumer=e};L.createElement=qi;L.createFactory=function(e){var t=qi.bind(null,e);return t.type=e,t};L.createRef=function(){return{current:null}};L.forwardRef=function(e){return{$$typeof:pc,render:e}};L.isValidElement=$u;L.lazy=function(e){return{$$typeof:vc,_payload:{_status:-1,_result:e},_init:Sc}};L.memo=function(e,t){return{$$typeof:hc,type:e,compare:t===void 0?null:t}};L.startTransition=function(e){var t=wr.transition;wr.transition={};try{e()}finally{wr.transition=t}};L.unstable_act=bi;L.useCallback=function(e,t){return ie.current.useCallback(e,t)};L.useContext=function(e){return ie.current.useContext(e)};L.useDebugValue=function(){};L.useDeferredValue=function(e){return ie.current.useDeferredValue(e)};L.useEffect=function(e,t){return ie.current.useEffect(e,t)};L.useId=function(){return ie.current.useId()};L.useImperativeHandle=function(e,t,n){return ie.current.useImperativeHandle(e,t,n)};L.useInsertionEffect=function(e,t){return ie.current.useInsertionEffect(e,t)};L.useLayoutEffect=function(e,t){return ie.current.useLayoutEffect(e,t)};L.useMemo=function(e,t){return ie.current.useMemo(e,t)};L.useReducer=function(e,t,n){return ie.current.useReducer(e,t,n)};L.useRef=function(e){return ie.current.useRef(e)};L.useState=function(e){return ie.current.useState(e)};L.useSyncExternalStore=function(e,t,n){return ie.current.useSyncExternalStore(e,t,n)};L.useTransition=function(){return ie.current.useTransition()};L.version="18.3.1";Qi.exports=L;var He=Qi.exports;const Ec=oc(He);/** + * @license React + * react-jsx-runtime.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var xc=He,Cc=Symbol.for("react.element"),_c=Symbol.for("react.fragment"),Pc=Object.prototype.hasOwnProperty,Nc=xc.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,zc={key:!0,ref:!0,__self:!0,__source:!0};function es(e,t,n){var r,l={},u=null,o=null;n!==void 0&&(u=""+n),t.key!==void 0&&(u=""+t.key),t.ref!==void 0&&(o=t.ref);for(r in t)Pc.call(t,r)&&!zc.hasOwnProperty(r)&&(l[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps,t)l[r]===void 0&&(l[r]=t[r]);return{$$typeof:Cc,type:e,key:u,ref:o,props:l,_owner:Nc.current}}el.Fragment=_c;el.jsx=es;el.jsxs=es;Wi.exports=el;var D=Wi.exports,Ql={},ts={exports:{}},ge={},ns={exports:{}},rs={};/** + * @license React + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */(function(e){function t(x,N){var z=x.length;x.push(N);e:for(;0<z;){var W=z-1>>>1,G=x[W];if(0<l(G,N))x[W]=N,x[z]=G,z=W;else break e}}function n(x){return x.length===0?null:x[0]}function r(x){if(x.length===0)return null;var N=x[0],z=x.pop();if(z!==N){x[0]=z;e:for(var W=0,G=x.length,bn=G>>>1;W<bn;){var vt=2*(W+1)-1,gl=x[vt],yt=vt+1,er=x[yt];if(0>l(gl,z))yt<G&&0>l(er,gl)?(x[W]=er,x[yt]=z,W=yt):(x[W]=gl,x[vt]=z,W=vt);else if(yt<G&&0>l(er,z))x[W]=er,x[yt]=z,W=yt;else break e}}return N}function l(x,N){var z=x.sortIndex-N.sortIndex;return z!==0?z:x.id-N.id}if(typeof performance=="object"&&typeof performance.now=="function"){var u=performance;e.unstable_now=function(){return u.now()}}else{var o=Date,i=o.now();e.unstable_now=function(){return o.now()-i}}var s=[],c=[],h=1,m=null,p=3,g=!1,w=!1,S=!1,F=typeof setTimeout=="function"?setTimeout:null,f=typeof clearTimeout=="function"?clearTimeout:null,a=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function d(x){for(var N=n(c);N!==null;){if(N.callback===null)r(c);else if(N.startTime<=x)r(c),N.sortIndex=N.expirationTime,t(s,N);else break;N=n(c)}}function v(x){if(S=!1,d(x),!w)if(n(s)!==null)w=!0,vl(E);else{var N=n(c);N!==null&&yl(v,N.startTime-x)}}function E(x,N){w=!1,S&&(S=!1,f(P),P=-1),g=!0;var z=p;try{for(d(N),m=n(s);m!==null&&(!(m.expirationTime>N)||x&&!Pe());){var W=m.callback;if(typeof W=="function"){m.callback=null,p=m.priorityLevel;var G=W(m.expirationTime<=N);N=e.unstable_now(),typeof G=="function"?m.callback=G:m===n(s)&&r(s),d(N)}else r(s);m=n(s)}if(m!==null)var bn=!0;else{var vt=n(c);vt!==null&&yl(v,vt.startTime-N),bn=!1}return bn}finally{m=null,p=z,g=!1}}var C=!1,_=null,P=-1,H=5,T=-1;function Pe(){return!(e.unstable_now()-T<H)}function sn(){if(_!==null){var x=e.unstable_now();T=x;var N=!0;try{N=_(!0,x)}finally{N?an():(C=!1,_=null)}}else C=!1}var an;if(typeof a=="function")an=function(){a(sn)};else if(typeof MessageChannel<"u"){var jo=new MessageChannel,rc=jo.port2;jo.port1.onmessage=sn,an=function(){rc.postMessage(null)}}else an=function(){F(sn,0)};function vl(x){_=x,C||(C=!0,an())}function yl(x,N){P=F(function(){x(e.unstable_now())},N)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(x){x.callback=null},e.unstable_continueExecution=function(){w||g||(w=!0,vl(E))},e.unstable_forceFrameRate=function(x){0>x||125<x?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):H=0<x?Math.floor(1e3/x):5},e.unstable_getCurrentPriorityLevel=function(){return p},e.unstable_getFirstCallbackNode=function(){return n(s)},e.unstable_next=function(x){switch(p){case 1:case 2:case 3:var N=3;break;default:N=p}var z=p;p=N;try{return x()}finally{p=z}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=function(){},e.unstable_runWithPriority=function(x,N){switch(x){case 1:case 2:case 3:case 4:case 5:break;default:x=3}var z=p;p=x;try{return N()}finally{p=z}},e.unstable_scheduleCallback=function(x,N,z){var W=e.unstable_now();switch(typeof z=="object"&&z!==null?(z=z.delay,z=typeof z=="number"&&0<z?W+z:W):z=W,x){case 1:var G=-1;break;case 2:G=250;break;case 5:G=1073741823;break;case 4:G=1e4;break;default:G=5e3}return G=z+G,x={id:h++,callback:N,priorityLevel:x,startTime:z,expirationTime:G,sortIndex:-1},z>W?(x.sortIndex=z,t(c,x),n(s)===null&&x===n(c)&&(S?(f(P),P=-1):S=!0,yl(v,z-W))):(x.sortIndex=G,t(s,x),w||g||(w=!0,vl(E))),x},e.unstable_shouldYield=Pe,e.unstable_wrapCallback=function(x){var N=p;return function(){var z=p;p=N;try{return x.apply(this,arguments)}finally{p=z}}}})(rs);ns.exports=rs;var Lc=ns.exports;/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Tc=He,ye=Lc;function y(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var ls=new Set,Rn={};function Tt(e,t){Jt(e,t),Jt(e+"Capture",t)}function Jt(e,t){for(Rn[e]=t,e=0;e<t.length;e++)ls.add(t[e])}var Qe=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Kl=Object.prototype.hasOwnProperty,Rc=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,Uo={},Ao={};function Oc(e){return Kl.call(Ao,e)?!0:Kl.call(Uo,e)?!1:Rc.test(e)?Ao[e]=!0:(Uo[e]=!0,!1)}function jc(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function Mc(e,t,n,r){if(t===null||typeof t>"u"||jc(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function se(e,t,n,r,l,u,o){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=u,this.removeEmptyString=o}var ee={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){ee[e]=new se(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];ee[t]=new se(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){ee[e]=new se(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){ee[e]=new se(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){ee[e]=new se(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){ee[e]=new se(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){ee[e]=new se(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){ee[e]=new se(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){ee[e]=new se(e,5,!1,e.toLowerCase(),null,!1,!1)});var Vu=/[\-:]([a-z])/g;function Hu(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(Vu,Hu);ee[t]=new se(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(Vu,Hu);ee[t]=new se(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Vu,Hu);ee[t]=new se(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){ee[e]=new se(e,1,!1,e.toLowerCase(),null,!1,!1)});ee.xlinkHref=new se("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){ee[e]=new se(e,1,!1,e.toLowerCase(),null,!0,!0)});function Wu(e,t,n,r){var l=ee.hasOwnProperty(t)?ee[t]:null;(l!==null?l.type!==0:r||!(2<t.length)||t[0]!=="o"&&t[0]!=="O"||t[1]!=="n"&&t[1]!=="N")&&(Mc(t,n,l,r)&&(n=null),r||l===null?Oc(t)&&(n===null?e.removeAttribute(t):e.setAttribute(t,""+n)):l.mustUseProperty?e[l.propertyName]=n===null?l.type===3?!1:"":n:(t=l.attributeName,r=l.attributeNamespace,n===null?e.removeAttribute(t):(l=l.type,n=l===3||l===4&&n===!0?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}var Ge=Tc.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,nr=Symbol.for("react.element"),jt=Symbol.for("react.portal"),Mt=Symbol.for("react.fragment"),Qu=Symbol.for("react.strict_mode"),Yl=Symbol.for("react.profiler"),us=Symbol.for("react.provider"),os=Symbol.for("react.context"),Ku=Symbol.for("react.forward_ref"),Xl=Symbol.for("react.suspense"),Gl=Symbol.for("react.suspense_list"),Yu=Symbol.for("react.memo"),Je=Symbol.for("react.lazy"),is=Symbol.for("react.offscreen"),Bo=Symbol.iterator;function cn(e){return e===null||typeof e!="object"?null:(e=Bo&&e[Bo]||e["@@iterator"],typeof e=="function"?e:null)}var $=Object.assign,Sl;function gn(e){if(Sl===void 0)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);Sl=t&&t[1]||""}return` +`+Sl+e}var kl=!1;function El(e,t){if(!e||kl)return"";kl=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(t,[])}catch(c){var r=c}Reflect.construct(e,[],t)}else{try{t.call()}catch(c){r=c}e.call(t.prototype)}else{try{throw Error()}catch(c){r=c}e()}}catch(c){if(c&&r&&typeof c.stack=="string"){for(var l=c.stack.split(` +`),u=r.stack.split(` +`),o=l.length-1,i=u.length-1;1<=o&&0<=i&&l[o]!==u[i];)i--;for(;1<=o&&0<=i;o--,i--)if(l[o]!==u[i]){if(o!==1||i!==1)do if(o--,i--,0>i||l[o]!==u[i]){var s=` +`+l[o].replace(" at new "," at ");return e.displayName&&s.includes("<anonymous>")&&(s=s.replace("<anonymous>",e.displayName)),s}while(1<=o&&0<=i);break}}}finally{kl=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?gn(e):""}function Dc(e){switch(e.tag){case 5:return gn(e.type);case 16:return gn("Lazy");case 13:return gn("Suspense");case 19:return gn("SuspenseList");case 0:case 2:case 15:return e=El(e.type,!1),e;case 11:return e=El(e.type.render,!1),e;case 1:return e=El(e.type,!0),e;default:return""}}function Zl(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Mt:return"Fragment";case jt:return"Portal";case Yl:return"Profiler";case Qu:return"StrictMode";case Xl:return"Suspense";case Gl:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case os:return(e.displayName||"Context")+".Consumer";case us:return(e._context.displayName||"Context")+".Provider";case Ku:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Yu:return t=e.displayName||null,t!==null?t:Zl(e.type)||"Memo";case Je:t=e._payload,e=e._init;try{return Zl(e(t))}catch{}}return null}function Ic(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Zl(t);case 8:return t===Qu?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function ft(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function ss(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Fc(e){var t=ss(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,u=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(o){r=""+o,u.call(this,o)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(o){r=""+o},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function rr(e){e._valueTracker||(e._valueTracker=Fc(e))}function as(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=ss(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Tr(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Jl(e,t){var n=t.checked;return $({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function $o(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=ft(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function cs(e,t){t=t.checked,t!=null&&Wu(e,"checked",t,!1)}function ql(e,t){cs(e,t);var n=ft(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?bl(e,t.type,n):t.hasOwnProperty("defaultValue")&&bl(e,t.type,ft(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Vo(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function bl(e,t,n){(t!=="number"||Tr(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var wn=Array.isArray;function Qt(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l<n.length;l++)t["$"+n[l]]=!0;for(n=0;n<e.length;n++)l=t.hasOwnProperty("$"+e[n].value),e[n].selected!==l&&(e[n].selected=l),l&&r&&(e[n].defaultSelected=!0)}else{for(n=""+ft(n),t=null,l=0;l<e.length;l++){if(e[l].value===n){e[l].selected=!0,r&&(e[l].defaultSelected=!0);return}t!==null||e[l].disabled||(t=e[l])}t!==null&&(t.selected=!0)}}function eu(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(y(91));return $({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function Ho(e,t){var n=t.value;if(n==null){if(n=t.children,t=t.defaultValue,n!=null){if(t!=null)throw Error(y(92));if(wn(n)){if(1<n.length)throw Error(y(93));n=n[0]}t=n}t==null&&(t=""),n=t}e._wrapperState={initialValue:ft(n)}}function fs(e,t){var n=ft(t.value),r=ft(t.defaultValue);n!=null&&(n=""+n,n!==e.value&&(e.value=n),t.defaultValue==null&&e.defaultValue!==n&&(e.defaultValue=n)),r!=null&&(e.defaultValue=""+r)}function Wo(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==""&&t!==null&&(e.value=t)}function ds(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function tu(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?ds(t):e==="http://www.w3.org/2000/svg"&&t==="foreignObject"?"http://www.w3.org/1999/xhtml":e}var lr,ps=function(e){return typeof MSApp<"u"&&MSApp.execUnsafeLocalFunction?function(t,n,r,l){MSApp.execUnsafeLocalFunction(function(){return e(t,n,r,l)})}:e}(function(e,t){if(e.namespaceURI!=="http://www.w3.org/2000/svg"||"innerHTML"in e)e.innerHTML=t;else{for(lr=lr||document.createElement("div"),lr.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=lr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function On(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var En={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Uc=["Webkit","ms","Moz","O"];Object.keys(En).forEach(function(e){Uc.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),En[t]=En[e]})});function ms(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||En.hasOwnProperty(e)&&En[e]?(""+t).trim():t+"px"}function hs(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=ms(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var Ac=$({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function nu(e,t){if(t){if(Ac[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(y(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(y(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(y(61))}if(t.style!=null&&typeof t.style!="object")throw Error(y(62))}}function ru(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var lu=null;function Xu(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var uu=null,Kt=null,Yt=null;function Qo(e){if(e=Jn(e)){if(typeof uu!="function")throw Error(y(280));var t=e.stateNode;t&&(t=ul(t),uu(e.stateNode,e.type,t))}}function vs(e){Kt?Yt?Yt.push(e):Yt=[e]:Kt=e}function ys(){if(Kt){var e=Kt,t=Yt;if(Yt=Kt=null,Qo(e),t)for(e=0;e<t.length;e++)Qo(t[e])}}function gs(e,t){return e(t)}function ws(){}var xl=!1;function Ss(e,t,n){if(xl)return e(t,n);xl=!0;try{return gs(e,t,n)}finally{xl=!1,(Kt!==null||Yt!==null)&&(ws(),ys())}}function jn(e,t){var n=e.stateNode;if(n===null)return null;var r=ul(n);if(r===null)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(e=e.type,r=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!r;break e;default:e=!1}if(e)return null;if(n&&typeof n!="function")throw Error(y(231,t,typeof n));return n}var ou=!1;if(Qe)try{var fn={};Object.defineProperty(fn,"passive",{get:function(){ou=!0}}),window.addEventListener("test",fn,fn),window.removeEventListener("test",fn,fn)}catch{ou=!1}function Bc(e,t,n,r,l,u,o,i,s){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(h){this.onError(h)}}var xn=!1,Rr=null,Or=!1,iu=null,$c={onError:function(e){xn=!0,Rr=e}};function Vc(e,t,n,r,l,u,o,i,s){xn=!1,Rr=null,Bc.apply($c,arguments)}function Hc(e,t,n,r,l,u,o,i,s){if(Vc.apply(this,arguments),xn){if(xn){var c=Rr;xn=!1,Rr=null}else throw Error(y(198));Or||(Or=!0,iu=c)}}function Rt(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,t.flags&4098&&(n=t.return),e=t.return;while(e)}return t.tag===3?n:null}function ks(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function Ko(e){if(Rt(e)!==e)throw Error(y(188))}function Wc(e){var t=e.alternate;if(!t){if(t=Rt(e),t===null)throw Error(y(188));return t!==e?null:e}for(var n=e,r=t;;){var l=n.return;if(l===null)break;var u=l.alternate;if(u===null){if(r=l.return,r!==null){n=r;continue}break}if(l.child===u.child){for(u=l.child;u;){if(u===n)return Ko(l),e;if(u===r)return Ko(l),t;u=u.sibling}throw Error(y(188))}if(n.return!==r.return)n=l,r=u;else{for(var o=!1,i=l.child;i;){if(i===n){o=!0,n=l,r=u;break}if(i===r){o=!0,r=l,n=u;break}i=i.sibling}if(!o){for(i=u.child;i;){if(i===n){o=!0,n=u,r=l;break}if(i===r){o=!0,r=u,n=l;break}i=i.sibling}if(!o)throw Error(y(189))}}if(n.alternate!==r)throw Error(y(190))}if(n.tag!==3)throw Error(y(188));return n.stateNode.current===n?e:t}function Es(e){return e=Wc(e),e!==null?xs(e):null}function xs(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;){var t=xs(e);if(t!==null)return t;e=e.sibling}return null}var Cs=ye.unstable_scheduleCallback,Yo=ye.unstable_cancelCallback,Qc=ye.unstable_shouldYield,Kc=ye.unstable_requestPaint,Q=ye.unstable_now,Yc=ye.unstable_getCurrentPriorityLevel,Gu=ye.unstable_ImmediatePriority,_s=ye.unstable_UserBlockingPriority,jr=ye.unstable_NormalPriority,Xc=ye.unstable_LowPriority,Ps=ye.unstable_IdlePriority,tl=null,Fe=null;function Gc(e){if(Fe&&typeof Fe.onCommitFiberRoot=="function")try{Fe.onCommitFiberRoot(tl,e,void 0,(e.current.flags&128)===128)}catch{}}var Re=Math.clz32?Math.clz32:qc,Zc=Math.log,Jc=Math.LN2;function qc(e){return e>>>=0,e===0?32:31-(Zc(e)/Jc|0)|0}var ur=64,or=4194304;function Sn(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Mr(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,u=e.pingedLanes,o=n&268435455;if(o!==0){var i=o&~l;i!==0?r=Sn(i):(u&=o,u!==0&&(r=Sn(u)))}else o=n&~l,o!==0?r=Sn(o):u!==0&&(r=Sn(u));if(r===0)return 0;if(t!==0&&t!==r&&!(t&l)&&(l=r&-r,u=t&-t,l>=u||l===16&&(u&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0<t;)n=31-Re(t),l=1<<n,r|=e[n],t&=~l;return r}function bc(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function ef(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,l=e.expirationTimes,u=e.pendingLanes;0<u;){var o=31-Re(u),i=1<<o,s=l[o];s===-1?(!(i&n)||i&r)&&(l[o]=bc(i,t)):s<=t&&(e.expiredLanes|=i),u&=~i}}function su(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function Ns(){var e=ur;return ur<<=1,!(ur&4194240)&&(ur=64),e}function Cl(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Gn(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Re(t),e[t]=n}function tf(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0<n;){var l=31-Re(n),u=1<<l;t[l]=0,r[l]=-1,e[l]=-1,n&=~u}}function Zu(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-Re(n),l=1<<r;l&t|e[r]&t&&(e[r]|=t),n&=~l}}var O=0;function zs(e){return e&=-e,1<e?4<e?e&268435455?16:536870912:4:1}var Ls,Ju,Ts,Rs,Os,au=!1,ir=[],rt=null,lt=null,ut=null,Mn=new Map,Dn=new Map,be=[],nf="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function Xo(e,t){switch(e){case"focusin":case"focusout":rt=null;break;case"dragenter":case"dragleave":lt=null;break;case"mouseover":case"mouseout":ut=null;break;case"pointerover":case"pointerout":Mn.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Dn.delete(t.pointerId)}}function dn(e,t,n,r,l,u){return e===null||e.nativeEvent!==u?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:u,targetContainers:[l]},t!==null&&(t=Jn(t),t!==null&&Ju(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,l!==null&&t.indexOf(l)===-1&&t.push(l),e)}function rf(e,t,n,r,l){switch(t){case"focusin":return rt=dn(rt,e,t,n,r,l),!0;case"dragenter":return lt=dn(lt,e,t,n,r,l),!0;case"mouseover":return ut=dn(ut,e,t,n,r,l),!0;case"pointerover":var u=l.pointerId;return Mn.set(u,dn(Mn.get(u)||null,e,t,n,r,l)),!0;case"gotpointercapture":return u=l.pointerId,Dn.set(u,dn(Dn.get(u)||null,e,t,n,r,l)),!0}return!1}function js(e){var t=St(e.target);if(t!==null){var n=Rt(t);if(n!==null){if(t=n.tag,t===13){if(t=ks(n),t!==null){e.blockedOn=t,Os(e.priority,function(){Ts(n)});return}}else if(t===3&&n.stateNode.current.memoizedState.isDehydrated){e.blockedOn=n.tag===3?n.stateNode.containerInfo:null;return}}}e.blockedOn=null}function Sr(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var n=cu(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(n===null){n=e.nativeEvent;var r=new n.constructor(n.type,n);lu=r,n.target.dispatchEvent(r),lu=null}else return t=Jn(n),t!==null&&Ju(t),e.blockedOn=n,!1;t.shift()}return!0}function Go(e,t,n){Sr(e)&&n.delete(t)}function lf(){au=!1,rt!==null&&Sr(rt)&&(rt=null),lt!==null&&Sr(lt)&&(lt=null),ut!==null&&Sr(ut)&&(ut=null),Mn.forEach(Go),Dn.forEach(Go)}function pn(e,t){e.blockedOn===t&&(e.blockedOn=null,au||(au=!0,ye.unstable_scheduleCallback(ye.unstable_NormalPriority,lf)))}function In(e){function t(l){return pn(l,e)}if(0<ir.length){pn(ir[0],e);for(var n=1;n<ir.length;n++){var r=ir[n];r.blockedOn===e&&(r.blockedOn=null)}}for(rt!==null&&pn(rt,e),lt!==null&&pn(lt,e),ut!==null&&pn(ut,e),Mn.forEach(t),Dn.forEach(t),n=0;n<be.length;n++)r=be[n],r.blockedOn===e&&(r.blockedOn=null);for(;0<be.length&&(n=be[0],n.blockedOn===null);)js(n),n.blockedOn===null&&be.shift()}var Xt=Ge.ReactCurrentBatchConfig,Dr=!0;function uf(e,t,n,r){var l=O,u=Xt.transition;Xt.transition=null;try{O=1,qu(e,t,n,r)}finally{O=l,Xt.transition=u}}function of(e,t,n,r){var l=O,u=Xt.transition;Xt.transition=null;try{O=4,qu(e,t,n,r)}finally{O=l,Xt.transition=u}}function qu(e,t,n,r){if(Dr){var l=cu(e,t,n,r);if(l===null)Ml(e,t,r,Ir,n),Xo(e,r);else if(rf(l,e,t,n,r))r.stopPropagation();else if(Xo(e,r),t&4&&-1<nf.indexOf(e)){for(;l!==null;){var u=Jn(l);if(u!==null&&Ls(u),u=cu(e,t,n,r),u===null&&Ml(e,t,r,Ir,n),u===l)break;l=u}l!==null&&r.stopPropagation()}else Ml(e,t,r,null,n)}}var Ir=null;function cu(e,t,n,r){if(Ir=null,e=Xu(r),e=St(e),e!==null)if(t=Rt(e),t===null)e=null;else if(n=t.tag,n===13){if(e=ks(t),e!==null)return e;e=null}else if(n===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return Ir=e,null}function Ms(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Yc()){case Gu:return 1;case _s:return 4;case jr:case Xc:return 16;case Ps:return 536870912;default:return 16}default:return 16}}var tt=null,bu=null,kr=null;function Ds(){if(kr)return kr;var e,t=bu,n=t.length,r,l="value"in tt?tt.value:tt.textContent,u=l.length;for(e=0;e<n&&t[e]===l[e];e++);var o=n-e;for(r=1;r<=o&&t[n-r]===l[u-r];r++);return kr=l.slice(e,1<r?1-r:void 0)}function Er(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&&t===13&&(e=13)):e=t,e===10&&(e=13),32<=e||e===13?e:0}function sr(){return!0}function Zo(){return!1}function we(e){function t(n,r,l,u,o){this._reactName=n,this._targetInst=l,this.type=r,this.nativeEvent=u,this.target=o,this.currentTarget=null;for(var i in e)e.hasOwnProperty(i)&&(n=e[i],this[i]=n?n(u):u[i]);return this.isDefaultPrevented=(u.defaultPrevented!=null?u.defaultPrevented:u.returnValue===!1)?sr:Zo,this.isPropagationStopped=Zo,this}return $(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var n=this.nativeEvent;n&&(n.preventDefault?n.preventDefault():typeof n.returnValue!="unknown"&&(n.returnValue=!1),this.isDefaultPrevented=sr)},stopPropagation:function(){var n=this.nativeEvent;n&&(n.stopPropagation?n.stopPropagation():typeof n.cancelBubble!="unknown"&&(n.cancelBubble=!0),this.isPropagationStopped=sr)},persist:function(){},isPersistent:sr}),t}var un={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},eo=we(un),Zn=$({},un,{view:0,detail:0}),sf=we(Zn),_l,Pl,mn,nl=$({},Zn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:to,button:0,buttons:0,relatedTarget:function(e){return e.relatedTarget===void 0?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==mn&&(mn&&e.type==="mousemove"?(_l=e.screenX-mn.screenX,Pl=e.screenY-mn.screenY):Pl=_l=0,mn=e),_l)},movementY:function(e){return"movementY"in e?e.movementY:Pl}}),Jo=we(nl),af=$({},nl,{dataTransfer:0}),cf=we(af),ff=$({},Zn,{relatedTarget:0}),Nl=we(ff),df=$({},un,{animationName:0,elapsedTime:0,pseudoElement:0}),pf=we(df),mf=$({},un,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),hf=we(mf),vf=$({},un,{data:0}),qo=we(vf),yf={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},gf={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},wf={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Sf(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=wf[e])?!!t[e]:!1}function to(){return Sf}var kf=$({},Zn,{key:function(e){if(e.key){var t=yf[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=Er(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?gf[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:to,charCode:function(e){return e.type==="keypress"?Er(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?Er(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),Ef=we(kf),xf=$({},nl,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),bo=we(xf),Cf=$({},Zn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:to}),_f=we(Cf),Pf=$({},un,{propertyName:0,elapsedTime:0,pseudoElement:0}),Nf=we(Pf),zf=$({},nl,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Lf=we(zf),Tf=[9,13,27,32],no=Qe&&"CompositionEvent"in window,Cn=null;Qe&&"documentMode"in document&&(Cn=document.documentMode);var Rf=Qe&&"TextEvent"in window&&!Cn,Is=Qe&&(!no||Cn&&8<Cn&&11>=Cn),ei=" ",ti=!1;function Fs(e,t){switch(e){case"keyup":return Tf.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Us(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Dt=!1;function Of(e,t){switch(e){case"compositionend":return Us(t);case"keypress":return t.which!==32?null:(ti=!0,ei);case"textInput":return e=t.data,e===ei&&ti?null:e;default:return null}}function jf(e,t){if(Dt)return e==="compositionend"||!no&&Fs(e,t)?(e=Ds(),kr=bu=tt=null,Dt=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Is&&t.locale!=="ko"?null:t.data;default:return null}}var Mf={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function ni(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!Mf[e.type]:t==="textarea"}function As(e,t,n,r){vs(r),t=Fr(t,"onChange"),0<t.length&&(n=new eo("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var _n=null,Fn=null;function Df(e){Zs(e,0)}function rl(e){var t=Ut(e);if(as(t))return e}function If(e,t){if(e==="change")return t}var Bs=!1;if(Qe){var zl;if(Qe){var Ll="oninput"in document;if(!Ll){var ri=document.createElement("div");ri.setAttribute("oninput","return;"),Ll=typeof ri.oninput=="function"}zl=Ll}else zl=!1;Bs=zl&&(!document.documentMode||9<document.documentMode)}function li(){_n&&(_n.detachEvent("onpropertychange",$s),Fn=_n=null)}function $s(e){if(e.propertyName==="value"&&rl(Fn)){var t=[];As(t,Fn,e,Xu(e)),Ss(Df,t)}}function Ff(e,t,n){e==="focusin"?(li(),_n=t,Fn=n,_n.attachEvent("onpropertychange",$s)):e==="focusout"&&li()}function Uf(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return rl(Fn)}function Af(e,t){if(e==="click")return rl(t)}function Bf(e,t){if(e==="input"||e==="change")return rl(t)}function $f(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var je=typeof Object.is=="function"?Object.is:$f;function Un(e,t){if(je(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var l=n[r];if(!Kl.call(t,l)||!je(e[l],t[l]))return!1}return!0}function ui(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function oi(e,t){var n=ui(e);e=0;for(var r;n;){if(n.nodeType===3){if(r=e+n.textContent.length,e<=t&&r>=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=ui(n)}}function Vs(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Vs(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Hs(){for(var e=window,t=Tr();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Tr(e.document)}return t}function ro(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Vf(e){var t=Hs(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Vs(n.ownerDocument.documentElement,n)){if(r!==null&&ro(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,u=Math.min(r.start,l);r=r.end===void 0?u:Math.min(r.end,l),!e.extend&&u>r&&(l=r,r=u,u=l),l=oi(n,u);var o=oi(n,r);l&&o&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==o.node||e.focusOffset!==o.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),u>r?(e.addRange(t),e.extend(o.node,o.offset)):(t.setEnd(o.node,o.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n<t.length;n++)e=t[n],e.element.scrollLeft=e.left,e.element.scrollTop=e.top}}var Hf=Qe&&"documentMode"in document&&11>=document.documentMode,It=null,fu=null,Pn=null,du=!1;function ii(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;du||It==null||It!==Tr(r)||(r=It,"selectionStart"in r&&ro(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Pn&&Un(Pn,r)||(Pn=r,r=Fr(fu,"onSelect"),0<r.length&&(t=new eo("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=It)))}function ar(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var Ft={animationend:ar("Animation","AnimationEnd"),animationiteration:ar("Animation","AnimationIteration"),animationstart:ar("Animation","AnimationStart"),transitionend:ar("Transition","TransitionEnd")},Tl={},Ws={};Qe&&(Ws=document.createElement("div").style,"AnimationEvent"in window||(delete Ft.animationend.animation,delete Ft.animationiteration.animation,delete Ft.animationstart.animation),"TransitionEvent"in window||delete Ft.transitionend.transition);function ll(e){if(Tl[e])return Tl[e];if(!Ft[e])return e;var t=Ft[e],n;for(n in t)if(t.hasOwnProperty(n)&&n in Ws)return Tl[e]=t[n];return e}var Qs=ll("animationend"),Ks=ll("animationiteration"),Ys=ll("animationstart"),Xs=ll("transitionend"),Gs=new Map,si="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function pt(e,t){Gs.set(e,t),Tt(t,[e])}for(var Rl=0;Rl<si.length;Rl++){var Ol=si[Rl],Wf=Ol.toLowerCase(),Qf=Ol[0].toUpperCase()+Ol.slice(1);pt(Wf,"on"+Qf)}pt(Qs,"onAnimationEnd");pt(Ks,"onAnimationIteration");pt(Ys,"onAnimationStart");pt("dblclick","onDoubleClick");pt("focusin","onFocus");pt("focusout","onBlur");pt(Xs,"onTransitionEnd");Jt("onMouseEnter",["mouseout","mouseover"]);Jt("onMouseLeave",["mouseout","mouseover"]);Jt("onPointerEnter",["pointerout","pointerover"]);Jt("onPointerLeave",["pointerout","pointerover"]);Tt("onChange","change click focusin focusout input keydown keyup selectionchange".split(" "));Tt("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" "));Tt("onBeforeInput",["compositionend","keypress","textInput","paste"]);Tt("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" "));Tt("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" "));Tt("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var kn="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Kf=new Set("cancel close invalid load scroll toggle".split(" ").concat(kn));function ai(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,Hc(r,t,void 0,e),e.currentTarget=null}function Zs(e,t){t=(t&4)!==0;for(var n=0;n<e.length;n++){var r=e[n],l=r.event;r=r.listeners;e:{var u=void 0;if(t)for(var o=r.length-1;0<=o;o--){var i=r[o],s=i.instance,c=i.currentTarget;if(i=i.listener,s!==u&&l.isPropagationStopped())break e;ai(l,i,c),u=s}else for(o=0;o<r.length;o++){if(i=r[o],s=i.instance,c=i.currentTarget,i=i.listener,s!==u&&l.isPropagationStopped())break e;ai(l,i,c),u=s}}}if(Or)throw e=iu,Or=!1,iu=null,e}function M(e,t){var n=t[yu];n===void 0&&(n=t[yu]=new Set);var r=e+"__bubble";n.has(r)||(Js(t,e,2,!1),n.add(r))}function jl(e,t,n){var r=0;t&&(r|=4),Js(n,e,r,t)}var cr="_reactListening"+Math.random().toString(36).slice(2);function An(e){if(!e[cr]){e[cr]=!0,ls.forEach(function(n){n!=="selectionchange"&&(Kf.has(n)||jl(n,!1,e),jl(n,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[cr]||(t[cr]=!0,jl("selectionchange",!1,t))}}function Js(e,t,n,r){switch(Ms(t)){case 1:var l=uf;break;case 4:l=of;break;default:l=qu}n=l.bind(null,t,n,e),l=void 0,!ou||t!=="touchstart"&&t!=="touchmove"&&t!=="wheel"||(l=!0),r?l!==void 0?e.addEventListener(t,n,{capture:!0,passive:l}):e.addEventListener(t,n,!0):l!==void 0?e.addEventListener(t,n,{passive:l}):e.addEventListener(t,n,!1)}function Ml(e,t,n,r,l){var u=r;if(!(t&1)&&!(t&2)&&r!==null)e:for(;;){if(r===null)return;var o=r.tag;if(o===3||o===4){var i=r.stateNode.containerInfo;if(i===l||i.nodeType===8&&i.parentNode===l)break;if(o===4)for(o=r.return;o!==null;){var s=o.tag;if((s===3||s===4)&&(s=o.stateNode.containerInfo,s===l||s.nodeType===8&&s.parentNode===l))return;o=o.return}for(;i!==null;){if(o=St(i),o===null)return;if(s=o.tag,s===5||s===6){r=u=o;continue e}i=i.parentNode}}r=r.return}Ss(function(){var c=u,h=Xu(n),m=[];e:{var p=Gs.get(e);if(p!==void 0){var g=eo,w=e;switch(e){case"keypress":if(Er(n)===0)break e;case"keydown":case"keyup":g=Ef;break;case"focusin":w="focus",g=Nl;break;case"focusout":w="blur",g=Nl;break;case"beforeblur":case"afterblur":g=Nl;break;case"click":if(n.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":g=Jo;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":g=cf;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":g=_f;break;case Qs:case Ks:case Ys:g=pf;break;case Xs:g=Nf;break;case"scroll":g=sf;break;case"wheel":g=Lf;break;case"copy":case"cut":case"paste":g=hf;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":g=bo}var S=(t&4)!==0,F=!S&&e==="scroll",f=S?p!==null?p+"Capture":null:p;S=[];for(var a=c,d;a!==null;){d=a;var v=d.stateNode;if(d.tag===5&&v!==null&&(d=v,f!==null&&(v=jn(a,f),v!=null&&S.push(Bn(a,v,d)))),F)break;a=a.return}0<S.length&&(p=new g(p,w,null,n,h),m.push({event:p,listeners:S}))}}if(!(t&7)){e:{if(p=e==="mouseover"||e==="pointerover",g=e==="mouseout"||e==="pointerout",p&&n!==lu&&(w=n.relatedTarget||n.fromElement)&&(St(w)||w[Ke]))break e;if((g||p)&&(p=h.window===h?h:(p=h.ownerDocument)?p.defaultView||p.parentWindow:window,g?(w=n.relatedTarget||n.toElement,g=c,w=w?St(w):null,w!==null&&(F=Rt(w),w!==F||w.tag!==5&&w.tag!==6)&&(w=null)):(g=null,w=c),g!==w)){if(S=Jo,v="onMouseLeave",f="onMouseEnter",a="mouse",(e==="pointerout"||e==="pointerover")&&(S=bo,v="onPointerLeave",f="onPointerEnter",a="pointer"),F=g==null?p:Ut(g),d=w==null?p:Ut(w),p=new S(v,a+"leave",g,n,h),p.target=F,p.relatedTarget=d,v=null,St(h)===c&&(S=new S(f,a+"enter",w,n,h),S.target=d,S.relatedTarget=F,v=S),F=v,g&&w)t:{for(S=g,f=w,a=0,d=S;d;d=Ot(d))a++;for(d=0,v=f;v;v=Ot(v))d++;for(;0<a-d;)S=Ot(S),a--;for(;0<d-a;)f=Ot(f),d--;for(;a--;){if(S===f||f!==null&&S===f.alternate)break t;S=Ot(S),f=Ot(f)}S=null}else S=null;g!==null&&ci(m,p,g,S,!1),w!==null&&F!==null&&ci(m,F,w,S,!0)}}e:{if(p=c?Ut(c):window,g=p.nodeName&&p.nodeName.toLowerCase(),g==="select"||g==="input"&&p.type==="file")var E=If;else if(ni(p))if(Bs)E=Bf;else{E=Uf;var C=Ff}else(g=p.nodeName)&&g.toLowerCase()==="input"&&(p.type==="checkbox"||p.type==="radio")&&(E=Af);if(E&&(E=E(e,c))){As(m,E,n,h);break e}C&&C(e,p,c),e==="focusout"&&(C=p._wrapperState)&&C.controlled&&p.type==="number"&&bl(p,"number",p.value)}switch(C=c?Ut(c):window,e){case"focusin":(ni(C)||C.contentEditable==="true")&&(It=C,fu=c,Pn=null);break;case"focusout":Pn=fu=It=null;break;case"mousedown":du=!0;break;case"contextmenu":case"mouseup":case"dragend":du=!1,ii(m,n,h);break;case"selectionchange":if(Hf)break;case"keydown":case"keyup":ii(m,n,h)}var _;if(no)e:{switch(e){case"compositionstart":var P="onCompositionStart";break e;case"compositionend":P="onCompositionEnd";break e;case"compositionupdate":P="onCompositionUpdate";break e}P=void 0}else Dt?Fs(e,n)&&(P="onCompositionEnd"):e==="keydown"&&n.keyCode===229&&(P="onCompositionStart");P&&(Is&&n.locale!=="ko"&&(Dt||P!=="onCompositionStart"?P==="onCompositionEnd"&&Dt&&(_=Ds()):(tt=h,bu="value"in tt?tt.value:tt.textContent,Dt=!0)),C=Fr(c,P),0<C.length&&(P=new qo(P,e,null,n,h),m.push({event:P,listeners:C}),_?P.data=_:(_=Us(n),_!==null&&(P.data=_)))),(_=Rf?Of(e,n):jf(e,n))&&(c=Fr(c,"onBeforeInput"),0<c.length&&(h=new qo("onBeforeInput","beforeinput",null,n,h),m.push({event:h,listeners:c}),h.data=_))}Zs(m,t)})}function Bn(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Fr(e,t){for(var n=t+"Capture",r=[];e!==null;){var l=e,u=l.stateNode;l.tag===5&&u!==null&&(l=u,u=jn(e,n),u!=null&&r.unshift(Bn(e,u,l)),u=jn(e,t),u!=null&&r.push(Bn(e,u,l))),e=e.return}return r}function Ot(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5);return e||null}function ci(e,t,n,r,l){for(var u=t._reactName,o=[];n!==null&&n!==r;){var i=n,s=i.alternate,c=i.stateNode;if(s!==null&&s===r)break;i.tag===5&&c!==null&&(i=c,l?(s=jn(n,u),s!=null&&o.unshift(Bn(n,s,i))):l||(s=jn(n,u),s!=null&&o.push(Bn(n,s,i)))),n=n.return}o.length!==0&&e.push({event:t,listeners:o})}var Yf=/\r\n?/g,Xf=/\u0000|\uFFFD/g;function fi(e){return(typeof e=="string"?e:""+e).replace(Yf,` +`).replace(Xf,"")}function fr(e,t,n){if(t=fi(t),fi(e)!==t&&n)throw Error(y(425))}function Ur(){}var pu=null,mu=null;function hu(e,t){return e==="textarea"||e==="noscript"||typeof t.children=="string"||typeof t.children=="number"||typeof t.dangerouslySetInnerHTML=="object"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var vu=typeof setTimeout=="function"?setTimeout:void 0,Gf=typeof clearTimeout=="function"?clearTimeout:void 0,di=typeof Promise=="function"?Promise:void 0,Zf=typeof queueMicrotask=="function"?queueMicrotask:typeof di<"u"?function(e){return di.resolve(null).then(e).catch(Jf)}:vu;function Jf(e){setTimeout(function(){throw e})}function Dl(e,t){var n=t,r=0;do{var l=n.nextSibling;if(e.removeChild(n),l&&l.nodeType===8)if(n=l.data,n==="/$"){if(r===0){e.removeChild(l),In(t);return}r--}else n!=="$"&&n!=="$?"&&n!=="$!"||r++;n=l}while(n);In(t)}function ot(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t==="$"||t==="$!"||t==="$?")break;if(t==="/$")return null}}return e}function pi(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var n=e.data;if(n==="$"||n==="$!"||n==="$?"){if(t===0)return e;t--}else n==="/$"&&t++}e=e.previousSibling}return null}var on=Math.random().toString(36).slice(2),Ie="__reactFiber$"+on,$n="__reactProps$"+on,Ke="__reactContainer$"+on,yu="__reactEvents$"+on,qf="__reactListeners$"+on,bf="__reactHandles$"+on;function St(e){var t=e[Ie];if(t)return t;for(var n=e.parentNode;n;){if(t=n[Ke]||n[Ie]){if(n=t.alternate,t.child!==null||n!==null&&n.child!==null)for(e=pi(e);e!==null;){if(n=e[Ie])return n;e=pi(e)}return t}e=n,n=e.parentNode}return null}function Jn(e){return e=e[Ie]||e[Ke],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function Ut(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(y(33))}function ul(e){return e[$n]||null}var gu=[],At=-1;function mt(e){return{current:e}}function I(e){0>At||(e.current=gu[At],gu[At]=null,At--)}function j(e,t){At++,gu[At]=e.current,e.current=t}var dt={},le=mt(dt),fe=mt(!1),_t=dt;function qt(e,t){var n=e.type.contextTypes;if(!n)return dt;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},u;for(u in n)l[u]=t[u];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function de(e){return e=e.childContextTypes,e!=null}function Ar(){I(fe),I(le)}function mi(e,t,n){if(le.current!==dt)throw Error(y(168));j(le,t),j(fe,n)}function qs(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(y(108,Ic(e)||"Unknown",l));return $({},n,r)}function Br(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||dt,_t=le.current,j(le,e),j(fe,fe.current),!0}function hi(e,t,n){var r=e.stateNode;if(!r)throw Error(y(169));n?(e=qs(e,t,_t),r.__reactInternalMemoizedMergedChildContext=e,I(fe),I(le),j(le,e)):I(fe),j(fe,n)}var Be=null,ol=!1,Il=!1;function bs(e){Be===null?Be=[e]:Be.push(e)}function ed(e){ol=!0,bs(e)}function ht(){if(!Il&&Be!==null){Il=!0;var e=0,t=O;try{var n=Be;for(O=1;e<n.length;e++){var r=n[e];do r=r(!0);while(r!==null)}Be=null,ol=!1}catch(l){throw Be!==null&&(Be=Be.slice(e+1)),Cs(Gu,ht),l}finally{O=t,Il=!1}}return null}var Bt=[],$t=0,$r=null,Vr=0,Se=[],ke=0,Pt=null,$e=1,Ve="";function gt(e,t){Bt[$t++]=Vr,Bt[$t++]=$r,$r=e,Vr=t}function ea(e,t,n){Se[ke++]=$e,Se[ke++]=Ve,Se[ke++]=Pt,Pt=e;var r=$e;e=Ve;var l=32-Re(r)-1;r&=~(1<<l),n+=1;var u=32-Re(t)+l;if(30<u){var o=l-l%5;u=(r&(1<<o)-1).toString(32),r>>=o,l-=o,$e=1<<32-Re(t)+l|n<<l|r,Ve=u+e}else $e=1<<u|n<<l|r,Ve=e}function lo(e){e.return!==null&&(gt(e,1),ea(e,1,0))}function uo(e){for(;e===$r;)$r=Bt[--$t],Bt[$t]=null,Vr=Bt[--$t],Bt[$t]=null;for(;e===Pt;)Pt=Se[--ke],Se[ke]=null,Ve=Se[--ke],Se[ke]=null,$e=Se[--ke],Se[ke]=null}var ve=null,he=null,U=!1,Te=null;function ta(e,t){var n=Ee(5,null,null,0);n.elementType="DELETED",n.stateNode=t,n.return=e,t=e.deletions,t===null?(e.deletions=[n],e.flags|=16):t.push(n)}function vi(e,t){switch(e.tag){case 5:var n=e.type;return t=t.nodeType!==1||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t,t!==null?(e.stateNode=t,ve=e,he=ot(t.firstChild),!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,ve=e,he=null,!0):!1;case 13:return t=t.nodeType!==8?null:t,t!==null?(n=Pt!==null?{id:$e,overflow:Ve}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},n=Ee(18,null,null,0),n.stateNode=t,n.return=e,e.child=n,ve=e,he=null,!0):!1;default:return!1}}function wu(e){return(e.mode&1)!==0&&(e.flags&128)===0}function Su(e){if(U){var t=he;if(t){var n=t;if(!vi(e,t)){if(wu(e))throw Error(y(418));t=ot(n.nextSibling);var r=ve;t&&vi(e,t)?ta(r,n):(e.flags=e.flags&-4097|2,U=!1,ve=e)}}else{if(wu(e))throw Error(y(418));e.flags=e.flags&-4097|2,U=!1,ve=e}}}function yi(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;ve=e}function dr(e){if(e!==ve)return!1;if(!U)return yi(e),U=!0,!1;var t;if((t=e.tag!==3)&&!(t=e.tag!==5)&&(t=e.type,t=t!=="head"&&t!=="body"&&!hu(e.type,e.memoizedProps)),t&&(t=he)){if(wu(e))throw na(),Error(y(418));for(;t;)ta(e,t),t=ot(t.nextSibling)}if(yi(e),e.tag===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(y(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var n=e.data;if(n==="/$"){if(t===0){he=ot(e.nextSibling);break e}t--}else n!=="$"&&n!=="$!"&&n!=="$?"||t++}e=e.nextSibling}he=null}}else he=ve?ot(e.stateNode.nextSibling):null;return!0}function na(){for(var e=he;e;)e=ot(e.nextSibling)}function bt(){he=ve=null,U=!1}function oo(e){Te===null?Te=[e]:Te.push(e)}var td=Ge.ReactCurrentBatchConfig;function hn(e,t,n){if(e=n.ref,e!==null&&typeof e!="function"&&typeof e!="object"){if(n._owner){if(n=n._owner,n){if(n.tag!==1)throw Error(y(309));var r=n.stateNode}if(!r)throw Error(y(147,e));var l=r,u=""+e;return t!==null&&t.ref!==null&&typeof t.ref=="function"&&t.ref._stringRef===u?t.ref:(t=function(o){var i=l.refs;o===null?delete i[u]:i[u]=o},t._stringRef=u,t)}if(typeof e!="string")throw Error(y(284));if(!n._owner)throw Error(y(290,e))}return e}function pr(e,t){throw e=Object.prototype.toString.call(t),Error(y(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function gi(e){var t=e._init;return t(e._payload)}function ra(e){function t(f,a){if(e){var d=f.deletions;d===null?(f.deletions=[a],f.flags|=16):d.push(a)}}function n(f,a){if(!e)return null;for(;a!==null;)t(f,a),a=a.sibling;return null}function r(f,a){for(f=new Map;a!==null;)a.key!==null?f.set(a.key,a):f.set(a.index,a),a=a.sibling;return f}function l(f,a){return f=ct(f,a),f.index=0,f.sibling=null,f}function u(f,a,d){return f.index=d,e?(d=f.alternate,d!==null?(d=d.index,d<a?(f.flags|=2,a):d):(f.flags|=2,a)):(f.flags|=1048576,a)}function o(f){return e&&f.alternate===null&&(f.flags|=2),f}function i(f,a,d,v){return a===null||a.tag!==6?(a=Hl(d,f.mode,v),a.return=f,a):(a=l(a,d),a.return=f,a)}function s(f,a,d,v){var E=d.type;return E===Mt?h(f,a,d.props.children,v,d.key):a!==null&&(a.elementType===E||typeof E=="object"&&E!==null&&E.$$typeof===Je&&gi(E)===a.type)?(v=l(a,d.props),v.ref=hn(f,a,d),v.return=f,v):(v=Lr(d.type,d.key,d.props,null,f.mode,v),v.ref=hn(f,a,d),v.return=f,v)}function c(f,a,d,v){return a===null||a.tag!==4||a.stateNode.containerInfo!==d.containerInfo||a.stateNode.implementation!==d.implementation?(a=Wl(d,f.mode,v),a.return=f,a):(a=l(a,d.children||[]),a.return=f,a)}function h(f,a,d,v,E){return a===null||a.tag!==7?(a=Ct(d,f.mode,v,E),a.return=f,a):(a=l(a,d),a.return=f,a)}function m(f,a,d){if(typeof a=="string"&&a!==""||typeof a=="number")return a=Hl(""+a,f.mode,d),a.return=f,a;if(typeof a=="object"&&a!==null){switch(a.$$typeof){case nr:return d=Lr(a.type,a.key,a.props,null,f.mode,d),d.ref=hn(f,null,a),d.return=f,d;case jt:return a=Wl(a,f.mode,d),a.return=f,a;case Je:var v=a._init;return m(f,v(a._payload),d)}if(wn(a)||cn(a))return a=Ct(a,f.mode,d,null),a.return=f,a;pr(f,a)}return null}function p(f,a,d,v){var E=a!==null?a.key:null;if(typeof d=="string"&&d!==""||typeof d=="number")return E!==null?null:i(f,a,""+d,v);if(typeof d=="object"&&d!==null){switch(d.$$typeof){case nr:return d.key===E?s(f,a,d,v):null;case jt:return d.key===E?c(f,a,d,v):null;case Je:return E=d._init,p(f,a,E(d._payload),v)}if(wn(d)||cn(d))return E!==null?null:h(f,a,d,v,null);pr(f,d)}return null}function g(f,a,d,v,E){if(typeof v=="string"&&v!==""||typeof v=="number")return f=f.get(d)||null,i(a,f,""+v,E);if(typeof v=="object"&&v!==null){switch(v.$$typeof){case nr:return f=f.get(v.key===null?d:v.key)||null,s(a,f,v,E);case jt:return f=f.get(v.key===null?d:v.key)||null,c(a,f,v,E);case Je:var C=v._init;return g(f,a,d,C(v._payload),E)}if(wn(v)||cn(v))return f=f.get(d)||null,h(a,f,v,E,null);pr(a,v)}return null}function w(f,a,d,v){for(var E=null,C=null,_=a,P=a=0,H=null;_!==null&&P<d.length;P++){_.index>P?(H=_,_=null):H=_.sibling;var T=p(f,_,d[P],v);if(T===null){_===null&&(_=H);break}e&&_&&T.alternate===null&&t(f,_),a=u(T,a,P),C===null?E=T:C.sibling=T,C=T,_=H}if(P===d.length)return n(f,_),U&>(f,P),E;if(_===null){for(;P<d.length;P++)_=m(f,d[P],v),_!==null&&(a=u(_,a,P),C===null?E=_:C.sibling=_,C=_);return U&>(f,P),E}for(_=r(f,_);P<d.length;P++)H=g(_,f,P,d[P],v),H!==null&&(e&&H.alternate!==null&&_.delete(H.key===null?P:H.key),a=u(H,a,P),C===null?E=H:C.sibling=H,C=H);return e&&_.forEach(function(Pe){return t(f,Pe)}),U&>(f,P),E}function S(f,a,d,v){var E=cn(d);if(typeof E!="function")throw Error(y(150));if(d=E.call(d),d==null)throw Error(y(151));for(var C=E=null,_=a,P=a=0,H=null,T=d.next();_!==null&&!T.done;P++,T=d.next()){_.index>P?(H=_,_=null):H=_.sibling;var Pe=p(f,_,T.value,v);if(Pe===null){_===null&&(_=H);break}e&&_&&Pe.alternate===null&&t(f,_),a=u(Pe,a,P),C===null?E=Pe:C.sibling=Pe,C=Pe,_=H}if(T.done)return n(f,_),U&>(f,P),E;if(_===null){for(;!T.done;P++,T=d.next())T=m(f,T.value,v),T!==null&&(a=u(T,a,P),C===null?E=T:C.sibling=T,C=T);return U&>(f,P),E}for(_=r(f,_);!T.done;P++,T=d.next())T=g(_,f,P,T.value,v),T!==null&&(e&&T.alternate!==null&&_.delete(T.key===null?P:T.key),a=u(T,a,P),C===null?E=T:C.sibling=T,C=T);return e&&_.forEach(function(sn){return t(f,sn)}),U&>(f,P),E}function F(f,a,d,v){if(typeof d=="object"&&d!==null&&d.type===Mt&&d.key===null&&(d=d.props.children),typeof d=="object"&&d!==null){switch(d.$$typeof){case nr:e:{for(var E=d.key,C=a;C!==null;){if(C.key===E){if(E=d.type,E===Mt){if(C.tag===7){n(f,C.sibling),a=l(C,d.props.children),a.return=f,f=a;break e}}else if(C.elementType===E||typeof E=="object"&&E!==null&&E.$$typeof===Je&&gi(E)===C.type){n(f,C.sibling),a=l(C,d.props),a.ref=hn(f,C,d),a.return=f,f=a;break e}n(f,C);break}else t(f,C);C=C.sibling}d.type===Mt?(a=Ct(d.props.children,f.mode,v,d.key),a.return=f,f=a):(v=Lr(d.type,d.key,d.props,null,f.mode,v),v.ref=hn(f,a,d),v.return=f,f=v)}return o(f);case jt:e:{for(C=d.key;a!==null;){if(a.key===C)if(a.tag===4&&a.stateNode.containerInfo===d.containerInfo&&a.stateNode.implementation===d.implementation){n(f,a.sibling),a=l(a,d.children||[]),a.return=f,f=a;break e}else{n(f,a);break}else t(f,a);a=a.sibling}a=Wl(d,f.mode,v),a.return=f,f=a}return o(f);case Je:return C=d._init,F(f,a,C(d._payload),v)}if(wn(d))return w(f,a,d,v);if(cn(d))return S(f,a,d,v);pr(f,d)}return typeof d=="string"&&d!==""||typeof d=="number"?(d=""+d,a!==null&&a.tag===6?(n(f,a.sibling),a=l(a,d),a.return=f,f=a):(n(f,a),a=Hl(d,f.mode,v),a.return=f,f=a),o(f)):n(f,a)}return F}var en=ra(!0),la=ra(!1),Hr=mt(null),Wr=null,Vt=null,io=null;function so(){io=Vt=Wr=null}function ao(e){var t=Hr.current;I(Hr),e._currentValue=t}function ku(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function Gt(e,t){Wr=e,io=Vt=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(ce=!0),e.firstContext=null)}function Ce(e){var t=e._currentValue;if(io!==e)if(e={context:e,memoizedValue:t,next:null},Vt===null){if(Wr===null)throw Error(y(308));Vt=e,Wr.dependencies={lanes:0,firstContext:e}}else Vt=Vt.next=e;return t}var kt=null;function co(e){kt===null?kt=[e]:kt.push(e)}function ua(e,t,n,r){var l=t.interleaved;return l===null?(n.next=n,co(t)):(n.next=l.next,l.next=n),t.interleaved=n,Ye(e,r)}function Ye(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var qe=!1;function fo(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function oa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function We(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function it(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,R&2){var l=r.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),r.pending=t,Ye(e,n)}return l=r.interleaved,l===null?(t.next=t,co(r)):(t.next=l.next,l.next=t),r.interleaved=t,Ye(e,n)}function xr(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Zu(e,n)}}function wi(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var l=null,u=null;if(n=n.firstBaseUpdate,n!==null){do{var o={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};u===null?l=u=o:u=u.next=o,n=n.next}while(n!==null);u===null?l=u=t:u=u.next=t}else l=u=t;n={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:u,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function Qr(e,t,n,r){var l=e.updateQueue;qe=!1;var u=l.firstBaseUpdate,o=l.lastBaseUpdate,i=l.shared.pending;if(i!==null){l.shared.pending=null;var s=i,c=s.next;s.next=null,o===null?u=c:o.next=c,o=s;var h=e.alternate;h!==null&&(h=h.updateQueue,i=h.lastBaseUpdate,i!==o&&(i===null?h.firstBaseUpdate=c:i.next=c,h.lastBaseUpdate=s))}if(u!==null){var m=l.baseState;o=0,h=c=s=null,i=u;do{var p=i.lane,g=i.eventTime;if((r&p)===p){h!==null&&(h=h.next={eventTime:g,lane:0,tag:i.tag,payload:i.payload,callback:i.callback,next:null});e:{var w=e,S=i;switch(p=t,g=n,S.tag){case 1:if(w=S.payload,typeof w=="function"){m=w.call(g,m,p);break e}m=w;break e;case 3:w.flags=w.flags&-65537|128;case 0:if(w=S.payload,p=typeof w=="function"?w.call(g,m,p):w,p==null)break e;m=$({},m,p);break e;case 2:qe=!0}}i.callback!==null&&i.lane!==0&&(e.flags|=64,p=l.effects,p===null?l.effects=[i]:p.push(i))}else g={eventTime:g,lane:p,tag:i.tag,payload:i.payload,callback:i.callback,next:null},h===null?(c=h=g,s=m):h=h.next=g,o|=p;if(i=i.next,i===null){if(i=l.shared.pending,i===null)break;p=i,i=p.next,p.next=null,l.lastBaseUpdate=p,l.shared.pending=null}}while(!0);if(h===null&&(s=m),l.baseState=s,l.firstBaseUpdate=c,l.lastBaseUpdate=h,t=l.shared.interleaved,t!==null){l=t;do o|=l.lane,l=l.next;while(l!==t)}else u===null&&(l.shared.lanes=0);zt|=o,e.lanes=o,e.memoizedState=m}}function Si(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.length;t++){var r=e[t],l=r.callback;if(l!==null){if(r.callback=null,r=n,typeof l!="function")throw Error(y(191,l));l.call(r)}}}var qn={},Ue=mt(qn),Vn=mt(qn),Hn=mt(qn);function Et(e){if(e===qn)throw Error(y(174));return e}function po(e,t){switch(j(Hn,t),j(Vn,e),j(Ue,qn),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:tu(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=tu(t,e)}I(Ue),j(Ue,t)}function tn(){I(Ue),I(Vn),I(Hn)}function ia(e){Et(Hn.current);var t=Et(Ue.current),n=tu(t,e.type);t!==n&&(j(Vn,e),j(Ue,n))}function mo(e){Vn.current===e&&(I(Ue),I(Vn))}var A=mt(0);function Kr(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Fl=[];function ho(){for(var e=0;e<Fl.length;e++)Fl[e]._workInProgressVersionPrimary=null;Fl.length=0}var Cr=Ge.ReactCurrentDispatcher,Ul=Ge.ReactCurrentBatchConfig,Nt=0,B=null,Y=null,Z=null,Yr=!1,Nn=!1,Wn=0,nd=0;function te(){throw Error(y(321))}function vo(e,t){if(t===null)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!je(e[n],t[n]))return!1;return!0}function yo(e,t,n,r,l,u){if(Nt=u,B=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Cr.current=e===null||e.memoizedState===null?od:id,e=n(r,l),Nn){u=0;do{if(Nn=!1,Wn=0,25<=u)throw Error(y(301));u+=1,Z=Y=null,t.updateQueue=null,Cr.current=sd,e=n(r,l)}while(Nn)}if(Cr.current=Xr,t=Y!==null&&Y.next!==null,Nt=0,Z=Y=B=null,Yr=!1,t)throw Error(y(300));return e}function go(){var e=Wn!==0;return Wn=0,e}function De(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return Z===null?B.memoizedState=Z=e:Z=Z.next=e,Z}function _e(){if(Y===null){var e=B.alternate;e=e!==null?e.memoizedState:null}else e=Y.next;var t=Z===null?B.memoizedState:Z.next;if(t!==null)Z=t,Y=e;else{if(e===null)throw Error(y(310));Y=e,e={memoizedState:Y.memoizedState,baseState:Y.baseState,baseQueue:Y.baseQueue,queue:Y.queue,next:null},Z===null?B.memoizedState=Z=e:Z=Z.next=e}return Z}function Qn(e,t){return typeof t=="function"?t(e):t}function Al(e){var t=_e(),n=t.queue;if(n===null)throw Error(y(311));n.lastRenderedReducer=e;var r=Y,l=r.baseQueue,u=n.pending;if(u!==null){if(l!==null){var o=l.next;l.next=u.next,u.next=o}r.baseQueue=l=u,n.pending=null}if(l!==null){u=l.next,r=r.baseState;var i=o=null,s=null,c=u;do{var h=c.lane;if((Nt&h)===h)s!==null&&(s=s.next={lane:0,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null}),r=c.hasEagerState?c.eagerState:e(r,c.action);else{var m={lane:h,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null};s===null?(i=s=m,o=r):s=s.next=m,B.lanes|=h,zt|=h}c=c.next}while(c!==null&&c!==u);s===null?o=r:s.next=i,je(r,t.memoizedState)||(ce=!0),t.memoizedState=r,t.baseState=o,t.baseQueue=s,n.lastRenderedState=r}if(e=n.interleaved,e!==null){l=e;do u=l.lane,B.lanes|=u,zt|=u,l=l.next;while(l!==e)}else l===null&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function Bl(e){var t=_e(),n=t.queue;if(n===null)throw Error(y(311));n.lastRenderedReducer=e;var r=n.dispatch,l=n.pending,u=t.memoizedState;if(l!==null){n.pending=null;var o=l=l.next;do u=e(u,o.action),o=o.next;while(o!==l);je(u,t.memoizedState)||(ce=!0),t.memoizedState=u,t.baseQueue===null&&(t.baseState=u),n.lastRenderedState=u}return[u,r]}function sa(){}function aa(e,t){var n=B,r=_e(),l=t(),u=!je(r.memoizedState,l);if(u&&(r.memoizedState=l,ce=!0),r=r.queue,wo(da.bind(null,n,r,e),[e]),r.getSnapshot!==t||u||Z!==null&&Z.memoizedState.tag&1){if(n.flags|=2048,Kn(9,fa.bind(null,n,r,l,t),void 0,null),J===null)throw Error(y(349));Nt&30||ca(n,t,l)}return l}function ca(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},t=B.updateQueue,t===null?(t={lastEffect:null,stores:null},B.updateQueue=t,t.stores=[e]):(n=t.stores,n===null?t.stores=[e]:n.push(e))}function fa(e,t,n,r){t.value=n,t.getSnapshot=r,pa(t)&&ma(e)}function da(e,t,n){return n(function(){pa(t)&&ma(e)})}function pa(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!je(e,n)}catch{return!0}}function ma(e){var t=Ye(e,1);t!==null&&Oe(t,e,1,-1)}function ki(e){var t=De();return typeof e=="function"&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Qn,lastRenderedState:e},t.queue=e,e=e.dispatch=ud.bind(null,B,e),[t.memoizedState,e]}function Kn(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},t=B.updateQueue,t===null?(t={lastEffect:null,stores:null},B.updateQueue=t,t.lastEffect=e.next=e):(n=t.lastEffect,n===null?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e)),e}function ha(){return _e().memoizedState}function _r(e,t,n,r){var l=De();B.flags|=e,l.memoizedState=Kn(1|t,n,void 0,r===void 0?null:r)}function il(e,t,n,r){var l=_e();r=r===void 0?null:r;var u=void 0;if(Y!==null){var o=Y.memoizedState;if(u=o.destroy,r!==null&&vo(r,o.deps)){l.memoizedState=Kn(t,n,u,r);return}}B.flags|=e,l.memoizedState=Kn(1|t,n,u,r)}function Ei(e,t){return _r(8390656,8,e,t)}function wo(e,t){return il(2048,8,e,t)}function va(e,t){return il(4,2,e,t)}function ya(e,t){return il(4,4,e,t)}function ga(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(null)};if(t!=null)return e=e(),t.current=e,function(){t.current=null}}function wa(e,t,n){return n=n!=null?n.concat([e]):null,il(4,4,ga.bind(null,t,e),n)}function So(){}function Sa(e,t){var n=_e();t=t===void 0?null:t;var r=n.memoizedState;return r!==null&&t!==null&&vo(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function ka(e,t){var n=_e();t=t===void 0?null:t;var r=n.memoizedState;return r!==null&&t!==null&&vo(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Ea(e,t,n){return Nt&21?(je(n,t)||(n=Ns(),B.lanes|=n,zt|=n,e.baseState=!0),t):(e.baseState&&(e.baseState=!1,ce=!0),e.memoizedState=n)}function rd(e,t){var n=O;O=n!==0&&4>n?n:4,e(!0);var r=Ul.transition;Ul.transition={};try{e(!1),t()}finally{O=n,Ul.transition=r}}function xa(){return _e().memoizedState}function ld(e,t,n){var r=at(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Ca(e))_a(t,n);else if(n=ua(e,t,n,r),n!==null){var l=oe();Oe(n,e,r,l),Pa(n,t,r)}}function ud(e,t,n){var r=at(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Ca(e))_a(t,l);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var o=t.lastRenderedState,i=u(o,n);if(l.hasEagerState=!0,l.eagerState=i,je(i,o)){var s=t.interleaved;s===null?(l.next=l,co(t)):(l.next=s.next,s.next=l),t.interleaved=l;return}}catch{}finally{}n=ua(e,t,l,r),n!==null&&(l=oe(),Oe(n,e,r,l),Pa(n,t,r))}}function Ca(e){var t=e.alternate;return e===B||t!==null&&t===B}function _a(e,t){Nn=Yr=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Pa(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Zu(e,n)}}var Xr={readContext:Ce,useCallback:te,useContext:te,useEffect:te,useImperativeHandle:te,useInsertionEffect:te,useLayoutEffect:te,useMemo:te,useReducer:te,useRef:te,useState:te,useDebugValue:te,useDeferredValue:te,useTransition:te,useMutableSource:te,useSyncExternalStore:te,useId:te,unstable_isNewReconciler:!1},od={readContext:Ce,useCallback:function(e,t){return De().memoizedState=[e,t===void 0?null:t],e},useContext:Ce,useEffect:Ei,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,_r(4194308,4,ga.bind(null,t,e),n)},useLayoutEffect:function(e,t){return _r(4194308,4,e,t)},useInsertionEffect:function(e,t){return _r(4,2,e,t)},useMemo:function(e,t){var n=De();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=De();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=ld.bind(null,B,e),[r.memoizedState,e]},useRef:function(e){var t=De();return e={current:e},t.memoizedState=e},useState:ki,useDebugValue:So,useDeferredValue:function(e){return De().memoizedState=e},useTransition:function(){var e=ki(!1),t=e[0];return e=rd.bind(null,e[1]),De().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=B,l=De();if(U){if(n===void 0)throw Error(y(407));n=n()}else{if(n=t(),J===null)throw Error(y(349));Nt&30||ca(r,t,n)}l.memoizedState=n;var u={value:n,getSnapshot:t};return l.queue=u,Ei(da.bind(null,r,u,e),[e]),r.flags|=2048,Kn(9,fa.bind(null,r,u,n,t),void 0,null),n},useId:function(){var e=De(),t=J.identifierPrefix;if(U){var n=Ve,r=$e;n=(r&~(1<<32-Re(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=Wn++,0<n&&(t+="H"+n.toString(32)),t+=":"}else n=nd++,t=":"+t+"r"+n.toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},id={readContext:Ce,useCallback:Sa,useContext:Ce,useEffect:wo,useImperativeHandle:wa,useInsertionEffect:va,useLayoutEffect:ya,useMemo:ka,useReducer:Al,useRef:ha,useState:function(){return Al(Qn)},useDebugValue:So,useDeferredValue:function(e){var t=_e();return Ea(t,Y.memoizedState,e)},useTransition:function(){var e=Al(Qn)[0],t=_e().memoizedState;return[e,t]},useMutableSource:sa,useSyncExternalStore:aa,useId:xa,unstable_isNewReconciler:!1},sd={readContext:Ce,useCallback:Sa,useContext:Ce,useEffect:wo,useImperativeHandle:wa,useInsertionEffect:va,useLayoutEffect:ya,useMemo:ka,useReducer:Bl,useRef:ha,useState:function(){return Bl(Qn)},useDebugValue:So,useDeferredValue:function(e){var t=_e();return Y===null?t.memoizedState=e:Ea(t,Y.memoizedState,e)},useTransition:function(){var e=Bl(Qn)[0],t=_e().memoizedState;return[e,t]},useMutableSource:sa,useSyncExternalStore:aa,useId:xa,unstable_isNewReconciler:!1};function ze(e,t){if(e&&e.defaultProps){t=$({},t),e=e.defaultProps;for(var n in e)t[n]===void 0&&(t[n]=e[n]);return t}return t}function Eu(e,t,n,r){t=e.memoizedState,n=n(r,t),n=n==null?t:$({},t,n),e.memoizedState=n,e.lanes===0&&(e.updateQueue.baseState=n)}var sl={isMounted:function(e){return(e=e._reactInternals)?Rt(e)===e:!1},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=oe(),l=at(e),u=We(r,l);u.payload=t,n!=null&&(u.callback=n),t=it(e,u,l),t!==null&&(Oe(t,e,l,r),xr(t,e,l))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=oe(),l=at(e),u=We(r,l);u.tag=1,u.payload=t,n!=null&&(u.callback=n),t=it(e,u,l),t!==null&&(Oe(t,e,l,r),xr(t,e,l))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=oe(),r=at(e),l=We(n,r);l.tag=2,t!=null&&(l.callback=t),t=it(e,l,r),t!==null&&(Oe(t,e,r,n),xr(t,e,r))}};function xi(e,t,n,r,l,u,o){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(r,u,o):t.prototype&&t.prototype.isPureReactComponent?!Un(n,r)||!Un(l,u):!0}function Na(e,t,n){var r=!1,l=dt,u=t.contextType;return typeof u=="object"&&u!==null?u=Ce(u):(l=de(t)?_t:le.current,r=t.contextTypes,u=(r=r!=null)?qt(e,l):dt),t=new t(n,u),e.memoizedState=t.state!==null&&t.state!==void 0?t.state:null,t.updater=sl,e.stateNode=t,t._reactInternals=e,r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=l,e.__reactInternalMemoizedMaskedChildContext=u),t}function Ci(e,t,n,r){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(n,r),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&sl.enqueueReplaceState(t,t.state,null)}function xu(e,t,n,r){var l=e.stateNode;l.props=n,l.state=e.memoizedState,l.refs={},fo(e);var u=t.contextType;typeof u=="object"&&u!==null?l.context=Ce(u):(u=de(t)?_t:le.current,l.context=qt(e,u)),l.state=e.memoizedState,u=t.getDerivedStateFromProps,typeof u=="function"&&(Eu(e,t,u,n),l.state=e.memoizedState),typeof t.getDerivedStateFromProps=="function"||typeof l.getSnapshotBeforeUpdate=="function"||typeof l.UNSAFE_componentWillMount!="function"&&typeof l.componentWillMount!="function"||(t=l.state,typeof l.componentWillMount=="function"&&l.componentWillMount(),typeof l.UNSAFE_componentWillMount=="function"&&l.UNSAFE_componentWillMount(),t!==l.state&&sl.enqueueReplaceState(l,l.state,null),Qr(e,n,l,r),l.state=e.memoizedState),typeof l.componentDidMount=="function"&&(e.flags|=4194308)}function nn(e,t){try{var n="",r=t;do n+=Dc(r),r=r.return;while(r);var l=n}catch(u){l=` +Error generating stack: `+u.message+` +`+u.stack}return{value:e,source:t,stack:l,digest:null}}function $l(e,t,n){return{value:e,source:null,stack:n??null,digest:t??null}}function Cu(e,t){try{console.error(t.value)}catch(n){setTimeout(function(){throw n})}}var ad=typeof WeakMap=="function"?WeakMap:Map;function za(e,t,n){n=We(-1,n),n.tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Zr||(Zr=!0,Mu=r),Cu(e,t)},n}function La(e,t,n){n=We(-1,n),n.tag=3;var r=e.type.getDerivedStateFromError;if(typeof r=="function"){var l=t.value;n.payload=function(){return r(l)},n.callback=function(){Cu(e,t)}}var u=e.stateNode;return u!==null&&typeof u.componentDidCatch=="function"&&(n.callback=function(){Cu(e,t),typeof r!="function"&&(st===null?st=new Set([this]):st.add(this));var o=t.stack;this.componentDidCatch(t.value,{componentStack:o!==null?o:""})}),n}function _i(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new ad;var l=new Set;r.set(t,l)}else l=r.get(t),l===void 0&&(l=new Set,r.set(t,l));l.has(n)||(l.add(n),e=xd.bind(null,e,t,n),t.then(e,e))}function Pi(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function Ni(e,t,n,r,l){return e.mode&1?(e.flags|=65536,e.lanes=l,e):(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,n.tag===1&&(n.alternate===null?n.tag=17:(t=We(-1,1),t.tag=2,it(n,t,1))),n.lanes|=1),e)}var cd=Ge.ReactCurrentOwner,ce=!1;function ue(e,t,n,r){t.child=e===null?la(t,null,n,r):en(t,e.child,n,r)}function zi(e,t,n,r,l){n=n.render;var u=t.ref;return Gt(t,l),r=yo(e,t,n,r,u,l),n=go(),e!==null&&!ce?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~l,Xe(e,t,l)):(U&&n&&lo(t),t.flags|=1,ue(e,t,r,l),t.child)}function Li(e,t,n,r,l){if(e===null){var u=n.type;return typeof u=="function"&&!zo(u)&&u.defaultProps===void 0&&n.compare===null&&n.defaultProps===void 0?(t.tag=15,t.type=u,Ta(e,t,u,r,l)):(e=Lr(n.type,null,r,t,t.mode,l),e.ref=t.ref,e.return=t,t.child=e)}if(u=e.child,!(e.lanes&l)){var o=u.memoizedProps;if(n=n.compare,n=n!==null?n:Un,n(o,r)&&e.ref===t.ref)return Xe(e,t,l)}return t.flags|=1,e=ct(u,r),e.ref=t.ref,e.return=t,t.child=e}function Ta(e,t,n,r,l){if(e!==null){var u=e.memoizedProps;if(Un(u,r)&&e.ref===t.ref)if(ce=!1,t.pendingProps=r=u,(e.lanes&l)!==0)e.flags&131072&&(ce=!0);else return t.lanes=e.lanes,Xe(e,t,l)}return _u(e,t,n,r,l)}function Ra(e,t,n){var r=t.pendingProps,l=r.children,u=e!==null?e.memoizedState:null;if(r.mode==="hidden")if(!(t.mode&1))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},j(Wt,me),me|=n;else{if(!(n&1073741824))return e=u!==null?u.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,j(Wt,me),me|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=u!==null?u.baseLanes:n,j(Wt,me),me|=r}else u!==null?(r=u.baseLanes|n,t.memoizedState=null):r=n,j(Wt,me),me|=r;return ue(e,t,l,n),t.child}function Oa(e,t){var n=t.ref;(e===null&&n!==null||e!==null&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function _u(e,t,n,r,l){var u=de(n)?_t:le.current;return u=qt(t,u),Gt(t,l),n=yo(e,t,n,r,u,l),r=go(),e!==null&&!ce?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~l,Xe(e,t,l)):(U&&r&&lo(t),t.flags|=1,ue(e,t,n,l),t.child)}function Ti(e,t,n,r,l){if(de(n)){var u=!0;Br(t)}else u=!1;if(Gt(t,l),t.stateNode===null)Pr(e,t),Na(t,n,r),xu(t,n,r,l),r=!0;else if(e===null){var o=t.stateNode,i=t.memoizedProps;o.props=i;var s=o.context,c=n.contextType;typeof c=="object"&&c!==null?c=Ce(c):(c=de(n)?_t:le.current,c=qt(t,c));var h=n.getDerivedStateFromProps,m=typeof h=="function"||typeof o.getSnapshotBeforeUpdate=="function";m||typeof o.UNSAFE_componentWillReceiveProps!="function"&&typeof o.componentWillReceiveProps!="function"||(i!==r||s!==c)&&Ci(t,o,r,c),qe=!1;var p=t.memoizedState;o.state=p,Qr(t,r,o,l),s=t.memoizedState,i!==r||p!==s||fe.current||qe?(typeof h=="function"&&(Eu(t,n,h,r),s=t.memoizedState),(i=qe||xi(t,n,i,r,p,s,c))?(m||typeof o.UNSAFE_componentWillMount!="function"&&typeof o.componentWillMount!="function"||(typeof o.componentWillMount=="function"&&o.componentWillMount(),typeof o.UNSAFE_componentWillMount=="function"&&o.UNSAFE_componentWillMount()),typeof o.componentDidMount=="function"&&(t.flags|=4194308)):(typeof o.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=s),o.props=r,o.state=s,o.context=c,r=i):(typeof o.componentDidMount=="function"&&(t.flags|=4194308),r=!1)}else{o=t.stateNode,oa(e,t),i=t.memoizedProps,c=t.type===t.elementType?i:ze(t.type,i),o.props=c,m=t.pendingProps,p=o.context,s=n.contextType,typeof s=="object"&&s!==null?s=Ce(s):(s=de(n)?_t:le.current,s=qt(t,s));var g=n.getDerivedStateFromProps;(h=typeof g=="function"||typeof o.getSnapshotBeforeUpdate=="function")||typeof o.UNSAFE_componentWillReceiveProps!="function"&&typeof o.componentWillReceiveProps!="function"||(i!==m||p!==s)&&Ci(t,o,r,s),qe=!1,p=t.memoizedState,o.state=p,Qr(t,r,o,l);var w=t.memoizedState;i!==m||p!==w||fe.current||qe?(typeof g=="function"&&(Eu(t,n,g,r),w=t.memoizedState),(c=qe||xi(t,n,c,r,p,w,s)||!1)?(h||typeof o.UNSAFE_componentWillUpdate!="function"&&typeof o.componentWillUpdate!="function"||(typeof o.componentWillUpdate=="function"&&o.componentWillUpdate(r,w,s),typeof o.UNSAFE_componentWillUpdate=="function"&&o.UNSAFE_componentWillUpdate(r,w,s)),typeof o.componentDidUpdate=="function"&&(t.flags|=4),typeof o.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof o.componentDidUpdate!="function"||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),typeof o.getSnapshotBeforeUpdate!="function"||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=w),o.props=r,o.state=w,o.context=s,r=c):(typeof o.componentDidUpdate!="function"||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),typeof o.getSnapshotBeforeUpdate!="function"||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),r=!1)}return Pu(e,t,n,r,u,l)}function Pu(e,t,n,r,l,u){Oa(e,t);var o=(t.flags&128)!==0;if(!r&&!o)return l&&hi(t,n,!1),Xe(e,t,u);r=t.stateNode,cd.current=t;var i=o&&typeof n.getDerivedStateFromError!="function"?null:r.render();return t.flags|=1,e!==null&&o?(t.child=en(t,e.child,null,u),t.child=en(t,null,i,u)):ue(e,t,i,u),t.memoizedState=r.state,l&&hi(t,n,!0),t.child}function ja(e){var t=e.stateNode;t.pendingContext?mi(e,t.pendingContext,t.pendingContext!==t.context):t.context&&mi(e,t.context,!1),po(e,t.containerInfo)}function Ri(e,t,n,r,l){return bt(),oo(l),t.flags|=256,ue(e,t,n,r),t.child}var Nu={dehydrated:null,treeContext:null,retryLane:0};function zu(e){return{baseLanes:e,cachePool:null,transitions:null}}function Ma(e,t,n){var r=t.pendingProps,l=A.current,u=!1,o=(t.flags&128)!==0,i;if((i=o)||(i=e!==null&&e.memoizedState===null?!1:(l&2)!==0),i?(u=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(l|=1),j(A,l&1),e===null)return Su(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?(t.mode&1?e.data==="$!"?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(o=r.children,e=r.fallback,u?(r=t.mode,u=t.child,o={mode:"hidden",children:o},!(r&1)&&u!==null?(u.childLanes=0,u.pendingProps=o):u=fl(o,r,0,null),e=Ct(e,r,n,null),u.return=t,e.return=t,u.sibling=e,t.child=u,t.child.memoizedState=zu(n),t.memoizedState=Nu,e):ko(t,o));if(l=e.memoizedState,l!==null&&(i=l.dehydrated,i!==null))return fd(e,t,o,r,i,l,n);if(u){u=r.fallback,o=t.mode,l=e.child,i=l.sibling;var s={mode:"hidden",children:r.children};return!(o&1)&&t.child!==l?(r=t.child,r.childLanes=0,r.pendingProps=s,t.deletions=null):(r=ct(l,s),r.subtreeFlags=l.subtreeFlags&14680064),i!==null?u=ct(i,u):(u=Ct(u,o,n,null),u.flags|=2),u.return=t,r.return=t,r.sibling=u,t.child=r,r=u,u=t.child,o=e.child.memoizedState,o=o===null?zu(n):{baseLanes:o.baseLanes|n,cachePool:null,transitions:o.transitions},u.memoizedState=o,u.childLanes=e.childLanes&~n,t.memoizedState=Nu,r}return u=e.child,e=u.sibling,r=ct(u,{mode:"visible",children:r.children}),!(t.mode&1)&&(r.lanes=n),r.return=t,r.sibling=null,e!==null&&(n=t.deletions,n===null?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=r,t.memoizedState=null,r}function ko(e,t){return t=fl({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function mr(e,t,n,r){return r!==null&&oo(r),en(t,e.child,null,n),e=ko(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function fd(e,t,n,r,l,u,o){if(n)return t.flags&256?(t.flags&=-257,r=$l(Error(y(422))),mr(e,t,o,r)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(u=r.fallback,l=t.mode,r=fl({mode:"visible",children:r.children},l,0,null),u=Ct(u,l,o,null),u.flags|=2,r.return=t,u.return=t,r.sibling=u,t.child=r,t.mode&1&&en(t,e.child,null,o),t.child.memoizedState=zu(o),t.memoizedState=Nu,u);if(!(t.mode&1))return mr(e,t,o,null);if(l.data==="$!"){if(r=l.nextSibling&&l.nextSibling.dataset,r)var i=r.dgst;return r=i,u=Error(y(419)),r=$l(u,r,void 0),mr(e,t,o,r)}if(i=(o&e.childLanes)!==0,ce||i){if(r=J,r!==null){switch(o&-o){case 4:l=2;break;case 16:l=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:l=32;break;case 536870912:l=268435456;break;default:l=0}l=l&(r.suspendedLanes|o)?0:l,l!==0&&l!==u.retryLane&&(u.retryLane=l,Ye(e,l),Oe(r,e,l,-1))}return No(),r=$l(Error(y(421))),mr(e,t,o,r)}return l.data==="$?"?(t.flags|=128,t.child=e.child,t=Cd.bind(null,e),l._reactRetry=t,null):(e=u.treeContext,he=ot(l.nextSibling),ve=t,U=!0,Te=null,e!==null&&(Se[ke++]=$e,Se[ke++]=Ve,Se[ke++]=Pt,$e=e.id,Ve=e.overflow,Pt=t),t=ko(t,r.children),t.flags|=4096,t)}function Oi(e,t,n){e.lanes|=t;var r=e.alternate;r!==null&&(r.lanes|=t),ku(e.return,t,n)}function Vl(e,t,n,r,l){var u=e.memoizedState;u===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:l}:(u.isBackwards=t,u.rendering=null,u.renderingStartTime=0,u.last=r,u.tail=n,u.tailMode=l)}function Da(e,t,n){var r=t.pendingProps,l=r.revealOrder,u=r.tail;if(ue(e,t,r.children,n),r=A.current,r&2)r=r&1|2,t.flags|=128;else{if(e!==null&&e.flags&128)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Oi(e,n,t);else if(e.tag===19)Oi(e,n,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(j(A,r),!(t.mode&1))t.memoizedState=null;else switch(l){case"forwards":for(n=t.child,l=null;n!==null;)e=n.alternate,e!==null&&Kr(e)===null&&(l=n),n=n.sibling;n=l,n===null?(l=t.child,t.child=null):(l=n.sibling,n.sibling=null),Vl(t,!1,l,n,u);break;case"backwards":for(n=null,l=t.child,t.child=null;l!==null;){if(e=l.alternate,e!==null&&Kr(e)===null){t.child=l;break}e=l.sibling,l.sibling=n,n=l,l=e}Vl(t,!0,n,null,u);break;case"together":Vl(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Pr(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Xe(e,t,n){if(e!==null&&(t.dependencies=e.dependencies),zt|=t.lanes,!(n&t.childLanes))return null;if(e!==null&&t.child!==e.child)throw Error(y(153));if(t.child!==null){for(e=t.child,n=ct(e,e.pendingProps),t.child=n,n.return=t;e.sibling!==null;)e=e.sibling,n=n.sibling=ct(e,e.pendingProps),n.return=t;n.sibling=null}return t.child}function dd(e,t,n){switch(t.tag){case 3:ja(t),bt();break;case 5:ia(t);break;case 1:de(t.type)&&Br(t);break;case 4:po(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,l=t.memoizedProps.value;j(Hr,r._currentValue),r._currentValue=l;break;case 13:if(r=t.memoizedState,r!==null)return r.dehydrated!==null?(j(A,A.current&1),t.flags|=128,null):n&t.child.childLanes?Ma(e,t,n):(j(A,A.current&1),e=Xe(e,t,n),e!==null?e.sibling:null);j(A,A.current&1);break;case 19:if(r=(n&t.childLanes)!==0,e.flags&128){if(r)return Da(e,t,n);t.flags|=128}if(l=t.memoizedState,l!==null&&(l.rendering=null,l.tail=null,l.lastEffect=null),j(A,A.current),r)break;return null;case 22:case 23:return t.lanes=0,Ra(e,t,n)}return Xe(e,t,n)}var Ia,Lu,Fa,Ua;Ia=function(e,t){for(var n=t.child;n!==null;){if(n.tag===5||n.tag===6)e.appendChild(n.stateNode);else if(n.tag!==4&&n.child!==null){n.child.return=n,n=n.child;continue}if(n===t)break;for(;n.sibling===null;){if(n.return===null||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}};Lu=function(){};Fa=function(e,t,n,r){var l=e.memoizedProps;if(l!==r){e=t.stateNode,Et(Ue.current);var u=null;switch(n){case"input":l=Jl(e,l),r=Jl(e,r),u=[];break;case"select":l=$({},l,{value:void 0}),r=$({},r,{value:void 0}),u=[];break;case"textarea":l=eu(e,l),r=eu(e,r),u=[];break;default:typeof l.onClick!="function"&&typeof r.onClick=="function"&&(e.onclick=Ur)}nu(n,r);var o;n=null;for(c in l)if(!r.hasOwnProperty(c)&&l.hasOwnProperty(c)&&l[c]!=null)if(c==="style"){var i=l[c];for(o in i)i.hasOwnProperty(o)&&(n||(n={}),n[o]="")}else c!=="dangerouslySetInnerHTML"&&c!=="children"&&c!=="suppressContentEditableWarning"&&c!=="suppressHydrationWarning"&&c!=="autoFocus"&&(Rn.hasOwnProperty(c)?u||(u=[]):(u=u||[]).push(c,null));for(c in r){var s=r[c];if(i=l!=null?l[c]:void 0,r.hasOwnProperty(c)&&s!==i&&(s!=null||i!=null))if(c==="style")if(i){for(o in i)!i.hasOwnProperty(o)||s&&s.hasOwnProperty(o)||(n||(n={}),n[o]="");for(o in s)s.hasOwnProperty(o)&&i[o]!==s[o]&&(n||(n={}),n[o]=s[o])}else n||(u||(u=[]),u.push(c,n)),n=s;else c==="dangerouslySetInnerHTML"?(s=s?s.__html:void 0,i=i?i.__html:void 0,s!=null&&i!==s&&(u=u||[]).push(c,s)):c==="children"?typeof s!="string"&&typeof s!="number"||(u=u||[]).push(c,""+s):c!=="suppressContentEditableWarning"&&c!=="suppressHydrationWarning"&&(Rn.hasOwnProperty(c)?(s!=null&&c==="onScroll"&&M("scroll",e),u||i===s||(u=[])):(u=u||[]).push(c,s))}n&&(u=u||[]).push("style",n);var c=u;(t.updateQueue=c)&&(t.flags|=4)}};Ua=function(e,t,n,r){n!==r&&(t.flags|=4)};function vn(e,t){if(!U)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;t!==null;)t.alternate!==null&&(n=t),t=t.sibling;n===null?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;n!==null;)n.alternate!==null&&(r=n),n=n.sibling;r===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:r.sibling=null}}function ne(e){var t=e.alternate!==null&&e.alternate.child===e.child,n=0,r=0;if(t)for(var l=e.child;l!==null;)n|=l.lanes|l.childLanes,r|=l.subtreeFlags&14680064,r|=l.flags&14680064,l.return=e,l=l.sibling;else for(l=e.child;l!==null;)n|=l.lanes|l.childLanes,r|=l.subtreeFlags,r|=l.flags,l.return=e,l=l.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function pd(e,t,n){var r=t.pendingProps;switch(uo(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return ne(t),null;case 1:return de(t.type)&&Ar(),ne(t),null;case 3:return r=t.stateNode,tn(),I(fe),I(le),ho(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),(e===null||e.child===null)&&(dr(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&!(t.flags&256)||(t.flags|=1024,Te!==null&&(Fu(Te),Te=null))),Lu(e,t),ne(t),null;case 5:mo(t);var l=Et(Hn.current);if(n=t.type,e!==null&&t.stateNode!=null)Fa(e,t,n,r,l),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(t.stateNode===null)throw Error(y(166));return ne(t),null}if(e=Et(Ue.current),dr(t)){r=t.stateNode,n=t.type;var u=t.memoizedProps;switch(r[Ie]=t,r[$n]=u,e=(t.mode&1)!==0,n){case"dialog":M("cancel",r),M("close",r);break;case"iframe":case"object":case"embed":M("load",r);break;case"video":case"audio":for(l=0;l<kn.length;l++)M(kn[l],r);break;case"source":M("error",r);break;case"img":case"image":case"link":M("error",r),M("load",r);break;case"details":M("toggle",r);break;case"input":$o(r,u),M("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!u.multiple},M("invalid",r);break;case"textarea":Ho(r,u),M("invalid",r)}nu(n,u),l=null;for(var o in u)if(u.hasOwnProperty(o)){var i=u[o];o==="children"?typeof i=="string"?r.textContent!==i&&(u.suppressHydrationWarning!==!0&&fr(r.textContent,i,e),l=["children",i]):typeof i=="number"&&r.textContent!==""+i&&(u.suppressHydrationWarning!==!0&&fr(r.textContent,i,e),l=["children",""+i]):Rn.hasOwnProperty(o)&&i!=null&&o==="onScroll"&&M("scroll",r)}switch(n){case"input":rr(r),Vo(r,u,!0);break;case"textarea":rr(r),Wo(r);break;case"select":case"option":break;default:typeof u.onClick=="function"&&(r.onclick=Ur)}r=l,t.updateQueue=r,r!==null&&(t.flags|=4)}else{o=l.nodeType===9?l:l.ownerDocument,e==="http://www.w3.org/1999/xhtml"&&(e=ds(n)),e==="http://www.w3.org/1999/xhtml"?n==="script"?(e=o.createElement("div"),e.innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=o.createElement(n,{is:r.is}):(e=o.createElement(n),n==="select"&&(o=e,r.multiple?o.multiple=!0:r.size&&(o.size=r.size))):e=o.createElementNS(e,n),e[Ie]=t,e[$n]=r,Ia(e,t,!1,!1),t.stateNode=e;e:{switch(o=ru(n,r),n){case"dialog":M("cancel",e),M("close",e),l=r;break;case"iframe":case"object":case"embed":M("load",e),l=r;break;case"video":case"audio":for(l=0;l<kn.length;l++)M(kn[l],e);l=r;break;case"source":M("error",e),l=r;break;case"img":case"image":case"link":M("error",e),M("load",e),l=r;break;case"details":M("toggle",e),l=r;break;case"input":$o(e,r),l=Jl(e,r),M("invalid",e);break;case"option":l=r;break;case"select":e._wrapperState={wasMultiple:!!r.multiple},l=$({},r,{value:void 0}),M("invalid",e);break;case"textarea":Ho(e,r),l=eu(e,r),M("invalid",e);break;default:l=r}nu(n,l),i=l;for(u in i)if(i.hasOwnProperty(u)){var s=i[u];u==="style"?hs(e,s):u==="dangerouslySetInnerHTML"?(s=s?s.__html:void 0,s!=null&&ps(e,s)):u==="children"?typeof s=="string"?(n!=="textarea"||s!=="")&&On(e,s):typeof s=="number"&&On(e,""+s):u!=="suppressContentEditableWarning"&&u!=="suppressHydrationWarning"&&u!=="autoFocus"&&(Rn.hasOwnProperty(u)?s!=null&&u==="onScroll"&&M("scroll",e):s!=null&&Wu(e,u,s,o))}switch(n){case"input":rr(e),Vo(e,r,!1);break;case"textarea":rr(e),Wo(e);break;case"option":r.value!=null&&e.setAttribute("value",""+ft(r.value));break;case"select":e.multiple=!!r.multiple,u=r.value,u!=null?Qt(e,!!r.multiple,u,!1):r.defaultValue!=null&&Qt(e,!!r.multiple,r.defaultValue,!0);break;default:typeof l.onClick=="function"&&(e.onclick=Ur)}switch(n){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}}r&&(t.flags|=4)}t.ref!==null&&(t.flags|=512,t.flags|=2097152)}return ne(t),null;case 6:if(e&&t.stateNode!=null)Ua(e,t,e.memoizedProps,r);else{if(typeof r!="string"&&t.stateNode===null)throw Error(y(166));if(n=Et(Hn.current),Et(Ue.current),dr(t)){if(r=t.stateNode,n=t.memoizedProps,r[Ie]=t,(u=r.nodeValue!==n)&&(e=ve,e!==null))switch(e.tag){case 3:fr(r.nodeValue,n,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&fr(r.nodeValue,n,(e.mode&1)!==0)}u&&(t.flags|=4)}else r=(n.nodeType===9?n:n.ownerDocument).createTextNode(r),r[Ie]=t,t.stateNode=r}return ne(t),null;case 13:if(I(A),r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(U&&he!==null&&t.mode&1&&!(t.flags&128))na(),bt(),t.flags|=98560,u=!1;else if(u=dr(t),r!==null&&r.dehydrated!==null){if(e===null){if(!u)throw Error(y(318));if(u=t.memoizedState,u=u!==null?u.dehydrated:null,!u)throw Error(y(317));u[Ie]=t}else bt(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;ne(t),u=!1}else Te!==null&&(Fu(Te),Te=null),u=!0;if(!u)return t.flags&65536?t:null}return t.flags&128?(t.lanes=n,t):(r=r!==null,r!==(e!==null&&e.memoizedState!==null)&&r&&(t.child.flags|=8192,t.mode&1&&(e===null||A.current&1?X===0&&(X=3):No())),t.updateQueue!==null&&(t.flags|=4),ne(t),null);case 4:return tn(),Lu(e,t),e===null&&An(t.stateNode.containerInfo),ne(t),null;case 10:return ao(t.type._context),ne(t),null;case 17:return de(t.type)&&Ar(),ne(t),null;case 19:if(I(A),u=t.memoizedState,u===null)return ne(t),null;if(r=(t.flags&128)!==0,o=u.rendering,o===null)if(r)vn(u,!1);else{if(X!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=Kr(e),o!==null){for(t.flags|=128,vn(u,!1),r=o.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),t.subtreeFlags=0,r=n,n=t.child;n!==null;)u=n,e=r,u.flags&=14680066,o=u.alternate,o===null?(u.childLanes=0,u.lanes=e,u.child=null,u.subtreeFlags=0,u.memoizedProps=null,u.memoizedState=null,u.updateQueue=null,u.dependencies=null,u.stateNode=null):(u.childLanes=o.childLanes,u.lanes=o.lanes,u.child=o.child,u.subtreeFlags=0,u.deletions=null,u.memoizedProps=o.memoizedProps,u.memoizedState=o.memoizedState,u.updateQueue=o.updateQueue,u.type=o.type,e=o.dependencies,u.dependencies=e===null?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return j(A,A.current&1|2),t.child}e=e.sibling}u.tail!==null&&Q()>rn&&(t.flags|=128,r=!0,vn(u,!1),t.lanes=4194304)}else{if(!r)if(e=Kr(o),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),vn(u,!0),u.tail===null&&u.tailMode==="hidden"&&!o.alternate&&!U)return ne(t),null}else 2*Q()-u.renderingStartTime>rn&&n!==1073741824&&(t.flags|=128,r=!0,vn(u,!1),t.lanes=4194304);u.isBackwards?(o.sibling=t.child,t.child=o):(n=u.last,n!==null?n.sibling=o:t.child=o,u.last=o)}return u.tail!==null?(t=u.tail,u.rendering=t,u.tail=t.sibling,u.renderingStartTime=Q(),t.sibling=null,n=A.current,j(A,r?n&1|2:n&1),t):(ne(t),null);case 22:case 23:return Po(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?me&1073741824&&(ne(t),t.subtreeFlags&6&&(t.flags|=8192)):ne(t),null;case 24:return null;case 25:return null}throw Error(y(156,t.tag))}function md(e,t){switch(uo(t),t.tag){case 1:return de(t.type)&&Ar(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return tn(),I(fe),I(le),ho(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return mo(t),null;case 13:if(I(A),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(y(340));bt()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return I(A),null;case 4:return tn(),null;case 10:return ao(t.type._context),null;case 22:case 23:return Po(),null;case 24:return null;default:return null}}var hr=!1,re=!1,hd=typeof WeakSet=="function"?WeakSet:Set,k=null;function Ht(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){V(e,t,r)}else n.current=null}function Tu(e,t,n){try{n()}catch(r){V(e,t,r)}}var ji=!1;function vd(e,t){if(pu=Dr,e=Hs(),ro(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,u=r.focusNode;r=r.focusOffset;try{n.nodeType,u.nodeType}catch{n=null;break e}var o=0,i=-1,s=-1,c=0,h=0,m=e,p=null;t:for(;;){for(var g;m!==n||l!==0&&m.nodeType!==3||(i=o+l),m!==u||r!==0&&m.nodeType!==3||(s=o+r),m.nodeType===3&&(o+=m.nodeValue.length),(g=m.firstChild)!==null;)p=m,m=g;for(;;){if(m===e)break t;if(p===n&&++c===l&&(i=o),p===u&&++h===r&&(s=o),(g=m.nextSibling)!==null)break;m=p,p=m.parentNode}m=g}n=i===-1||s===-1?null:{start:i,end:s}}else n=null}n=n||{start:0,end:0}}else n=null;for(mu={focusedElem:e,selectionRange:n},Dr=!1,k=t;k!==null;)if(t=k,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,k=e;else for(;k!==null;){t=k;try{var w=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(w!==null){var S=w.memoizedProps,F=w.memoizedState,f=t.stateNode,a=f.getSnapshotBeforeUpdate(t.elementType===t.type?S:ze(t.type,S),F);f.__reactInternalSnapshotBeforeUpdate=a}break;case 3:var d=t.stateNode.containerInfo;d.nodeType===1?d.textContent="":d.nodeType===9&&d.documentElement&&d.removeChild(d.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(y(163))}}catch(v){V(t,t.return,v)}if(e=t.sibling,e!==null){e.return=t.return,k=e;break}k=t.return}return w=ji,ji=!1,w}function zn(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var u=l.destroy;l.destroy=void 0,u!==void 0&&Tu(t,n,u)}l=l.next}while(l!==r)}}function al(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function Ru(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function Aa(e){var t=e.alternate;t!==null&&(e.alternate=null,Aa(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ie],delete t[$n],delete t[yu],delete t[qf],delete t[bf])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Ba(e){return e.tag===5||e.tag===3||e.tag===4}function Mi(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Ba(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Ou(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=Ur));else if(r!==4&&(e=e.child,e!==null))for(Ou(e,t,n),e=e.sibling;e!==null;)Ou(e,t,n),e=e.sibling}function ju(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(ju(e,t,n),e=e.sibling;e!==null;)ju(e,t,n),e=e.sibling}var q=null,Le=!1;function Ze(e,t,n){for(n=n.child;n!==null;)$a(e,t,n),n=n.sibling}function $a(e,t,n){if(Fe&&typeof Fe.onCommitFiberUnmount=="function")try{Fe.onCommitFiberUnmount(tl,n)}catch{}switch(n.tag){case 5:re||Ht(n,t);case 6:var r=q,l=Le;q=null,Ze(e,t,n),q=r,Le=l,q!==null&&(Le?(e=q,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):q.removeChild(n.stateNode));break;case 18:q!==null&&(Le?(e=q,n=n.stateNode,e.nodeType===8?Dl(e.parentNode,n):e.nodeType===1&&Dl(e,n),In(e)):Dl(q,n.stateNode));break;case 4:r=q,l=Le,q=n.stateNode.containerInfo,Le=!0,Ze(e,t,n),q=r,Le=l;break;case 0:case 11:case 14:case 15:if(!re&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var u=l,o=u.destroy;u=u.tag,o!==void 0&&(u&2||u&4)&&Tu(n,t,o),l=l.next}while(l!==r)}Ze(e,t,n);break;case 1:if(!re&&(Ht(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(i){V(n,t,i)}Ze(e,t,n);break;case 21:Ze(e,t,n);break;case 22:n.mode&1?(re=(r=re)||n.memoizedState!==null,Ze(e,t,n),re=r):Ze(e,t,n);break;default:Ze(e,t,n)}}function Di(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new hd),t.forEach(function(r){var l=_d.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function Ne(e,t){var n=t.deletions;if(n!==null)for(var r=0;r<n.length;r++){var l=n[r];try{var u=e,o=t,i=o;e:for(;i!==null;){switch(i.tag){case 5:q=i.stateNode,Le=!1;break e;case 3:q=i.stateNode.containerInfo,Le=!0;break e;case 4:q=i.stateNode.containerInfo,Le=!0;break e}i=i.return}if(q===null)throw Error(y(160));$a(u,o,l),q=null,Le=!1;var s=l.alternate;s!==null&&(s.return=null),l.return=null}catch(c){V(l,t,c)}}if(t.subtreeFlags&12854)for(t=t.child;t!==null;)Va(t,e),t=t.sibling}function Va(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(Ne(t,e),Me(e),r&4){try{zn(3,e,e.return),al(3,e)}catch(S){V(e,e.return,S)}try{zn(5,e,e.return)}catch(S){V(e,e.return,S)}}break;case 1:Ne(t,e),Me(e),r&512&&n!==null&&Ht(n,n.return);break;case 5:if(Ne(t,e),Me(e),r&512&&n!==null&&Ht(n,n.return),e.flags&32){var l=e.stateNode;try{On(l,"")}catch(S){V(e,e.return,S)}}if(r&4&&(l=e.stateNode,l!=null)){var u=e.memoizedProps,o=n!==null?n.memoizedProps:u,i=e.type,s=e.updateQueue;if(e.updateQueue=null,s!==null)try{i==="input"&&u.type==="radio"&&u.name!=null&&cs(l,u),ru(i,o);var c=ru(i,u);for(o=0;o<s.length;o+=2){var h=s[o],m=s[o+1];h==="style"?hs(l,m):h==="dangerouslySetInnerHTML"?ps(l,m):h==="children"?On(l,m):Wu(l,h,m,c)}switch(i){case"input":ql(l,u);break;case"textarea":fs(l,u);break;case"select":var p=l._wrapperState.wasMultiple;l._wrapperState.wasMultiple=!!u.multiple;var g=u.value;g!=null?Qt(l,!!u.multiple,g,!1):p!==!!u.multiple&&(u.defaultValue!=null?Qt(l,!!u.multiple,u.defaultValue,!0):Qt(l,!!u.multiple,u.multiple?[]:"",!1))}l[$n]=u}catch(S){V(e,e.return,S)}}break;case 6:if(Ne(t,e),Me(e),r&4){if(e.stateNode===null)throw Error(y(162));l=e.stateNode,u=e.memoizedProps;try{l.nodeValue=u}catch(S){V(e,e.return,S)}}break;case 3:if(Ne(t,e),Me(e),r&4&&n!==null&&n.memoizedState.isDehydrated)try{In(t.containerInfo)}catch(S){V(e,e.return,S)}break;case 4:Ne(t,e),Me(e);break;case 13:Ne(t,e),Me(e),l=e.child,l.flags&8192&&(u=l.memoizedState!==null,l.stateNode.isHidden=u,!u||l.alternate!==null&&l.alternate.memoizedState!==null||(Co=Q())),r&4&&Di(e);break;case 22:if(h=n!==null&&n.memoizedState!==null,e.mode&1?(re=(c=re)||h,Ne(t,e),re=c):Ne(t,e),Me(e),r&8192){if(c=e.memoizedState!==null,(e.stateNode.isHidden=c)&&!h&&e.mode&1)for(k=e,h=e.child;h!==null;){for(m=k=h;k!==null;){switch(p=k,g=p.child,p.tag){case 0:case 11:case 14:case 15:zn(4,p,p.return);break;case 1:Ht(p,p.return);var w=p.stateNode;if(typeof w.componentWillUnmount=="function"){r=p,n=p.return;try{t=r,w.props=t.memoizedProps,w.state=t.memoizedState,w.componentWillUnmount()}catch(S){V(r,n,S)}}break;case 5:Ht(p,p.return);break;case 22:if(p.memoizedState!==null){Fi(m);continue}}g!==null?(g.return=p,k=g):Fi(m)}h=h.sibling}e:for(h=null,m=e;;){if(m.tag===5){if(h===null){h=m;try{l=m.stateNode,c?(u=l.style,typeof u.setProperty=="function"?u.setProperty("display","none","important"):u.display="none"):(i=m.stateNode,s=m.memoizedProps.style,o=s!=null&&s.hasOwnProperty("display")?s.display:null,i.style.display=ms("display",o))}catch(S){V(e,e.return,S)}}}else if(m.tag===6){if(h===null)try{m.stateNode.nodeValue=c?"":m.memoizedProps}catch(S){V(e,e.return,S)}}else if((m.tag!==22&&m.tag!==23||m.memoizedState===null||m===e)&&m.child!==null){m.child.return=m,m=m.child;continue}if(m===e)break e;for(;m.sibling===null;){if(m.return===null||m.return===e)break e;h===m&&(h=null),m=m.return}h===m&&(h=null),m.sibling.return=m.return,m=m.sibling}}break;case 19:Ne(t,e),Me(e),r&4&&Di(e);break;case 21:break;default:Ne(t,e),Me(e)}}function Me(e){var t=e.flags;if(t&2){try{e:{for(var n=e.return;n!==null;){if(Ba(n)){var r=n;break e}n=n.return}throw Error(y(160))}switch(r.tag){case 5:var l=r.stateNode;r.flags&32&&(On(l,""),r.flags&=-33);var u=Mi(e);ju(e,u,l);break;case 3:case 4:var o=r.stateNode.containerInfo,i=Mi(e);Ou(e,i,o);break;default:throw Error(y(161))}}catch(s){V(e,e.return,s)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function yd(e,t,n){k=e,Ha(e)}function Ha(e,t,n){for(var r=(e.mode&1)!==0;k!==null;){var l=k,u=l.child;if(l.tag===22&&r){var o=l.memoizedState!==null||hr;if(!o){var i=l.alternate,s=i!==null&&i.memoizedState!==null||re;i=hr;var c=re;if(hr=o,(re=s)&&!c)for(k=l;k!==null;)o=k,s=o.child,o.tag===22&&o.memoizedState!==null?Ui(l):s!==null?(s.return=o,k=s):Ui(l);for(;u!==null;)k=u,Ha(u),u=u.sibling;k=l,hr=i,re=c}Ii(e)}else l.subtreeFlags&8772&&u!==null?(u.return=l,k=u):Ii(e)}}function Ii(e){for(;k!==null;){var t=k;if(t.flags&8772){var n=t.alternate;try{if(t.flags&8772)switch(t.tag){case 0:case 11:case 15:re||al(5,t);break;case 1:var r=t.stateNode;if(t.flags&4&&!re)if(n===null)r.componentDidMount();else{var l=t.elementType===t.type?n.memoizedProps:ze(t.type,n.memoizedProps);r.componentDidUpdate(l,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var u=t.updateQueue;u!==null&&Si(t,u,r);break;case 3:var o=t.updateQueue;if(o!==null){if(n=null,t.child!==null)switch(t.child.tag){case 5:n=t.child.stateNode;break;case 1:n=t.child.stateNode}Si(t,o,n)}break;case 5:var i=t.stateNode;if(n===null&&t.flags&4){n=i;var s=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":s.autoFocus&&n.focus();break;case"img":s.src&&(n.src=s.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(t.memoizedState===null){var c=t.alternate;if(c!==null){var h=c.memoizedState;if(h!==null){var m=h.dehydrated;m!==null&&In(m)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(y(163))}re||t.flags&512&&Ru(t)}catch(p){V(t,t.return,p)}}if(t===e){k=null;break}if(n=t.sibling,n!==null){n.return=t.return,k=n;break}k=t.return}}function Fi(e){for(;k!==null;){var t=k;if(t===e){k=null;break}var n=t.sibling;if(n!==null){n.return=t.return,k=n;break}k=t.return}}function Ui(e){for(;k!==null;){var t=k;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{al(4,t)}catch(s){V(t,n,s)}break;case 1:var r=t.stateNode;if(typeof r.componentDidMount=="function"){var l=t.return;try{r.componentDidMount()}catch(s){V(t,l,s)}}var u=t.return;try{Ru(t)}catch(s){V(t,u,s)}break;case 5:var o=t.return;try{Ru(t)}catch(s){V(t,o,s)}}}catch(s){V(t,t.return,s)}if(t===e){k=null;break}var i=t.sibling;if(i!==null){i.return=t.return,k=i;break}k=t.return}}var gd=Math.ceil,Gr=Ge.ReactCurrentDispatcher,Eo=Ge.ReactCurrentOwner,xe=Ge.ReactCurrentBatchConfig,R=0,J=null,K=null,b=0,me=0,Wt=mt(0),X=0,Yn=null,zt=0,cl=0,xo=0,Ln=null,ae=null,Co=0,rn=1/0,Ae=null,Zr=!1,Mu=null,st=null,vr=!1,nt=null,Jr=0,Tn=0,Du=null,Nr=-1,zr=0;function oe(){return R&6?Q():Nr!==-1?Nr:Nr=Q()}function at(e){return e.mode&1?R&2&&b!==0?b&-b:td.transition!==null?(zr===0&&(zr=Ns()),zr):(e=O,e!==0||(e=window.event,e=e===void 0?16:Ms(e.type)),e):1}function Oe(e,t,n,r){if(50<Tn)throw Tn=0,Du=null,Error(y(185));Gn(e,n,r),(!(R&2)||e!==J)&&(e===J&&(!(R&2)&&(cl|=n),X===4&&et(e,b)),pe(e,r),n===1&&R===0&&!(t.mode&1)&&(rn=Q()+500,ol&&ht()))}function pe(e,t){var n=e.callbackNode;ef(e,t);var r=Mr(e,e===J?b:0);if(r===0)n!==null&&Yo(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(n!=null&&Yo(n),t===1)e.tag===0?ed(Ai.bind(null,e)):bs(Ai.bind(null,e)),Zf(function(){!(R&6)&&ht()}),n=null;else{switch(zs(r)){case 1:n=Gu;break;case 4:n=_s;break;case 16:n=jr;break;case 536870912:n=Ps;break;default:n=jr}n=Ja(n,Wa.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function Wa(e,t){if(Nr=-1,zr=0,R&6)throw Error(y(327));var n=e.callbackNode;if(Zt()&&e.callbackNode!==n)return null;var r=Mr(e,e===J?b:0);if(r===0)return null;if(r&30||r&e.expiredLanes||t)t=qr(e,r);else{t=r;var l=R;R|=2;var u=Ka();(J!==e||b!==t)&&(Ae=null,rn=Q()+500,xt(e,t));do try{kd();break}catch(i){Qa(e,i)}while(!0);so(),Gr.current=u,R=l,K!==null?t=0:(J=null,b=0,t=X)}if(t!==0){if(t===2&&(l=su(e),l!==0&&(r=l,t=Iu(e,l))),t===1)throw n=Yn,xt(e,0),et(e,r),pe(e,Q()),n;if(t===6)et(e,r);else{if(l=e.current.alternate,!(r&30)&&!wd(l)&&(t=qr(e,r),t===2&&(u=su(e),u!==0&&(r=u,t=Iu(e,u))),t===1))throw n=Yn,xt(e,0),et(e,r),pe(e,Q()),n;switch(e.finishedWork=l,e.finishedLanes=r,t){case 0:case 1:throw Error(y(345));case 2:wt(e,ae,Ae);break;case 3:if(et(e,r),(r&130023424)===r&&(t=Co+500-Q(),10<t)){if(Mr(e,0)!==0)break;if(l=e.suspendedLanes,(l&r)!==r){oe(),e.pingedLanes|=e.suspendedLanes&l;break}e.timeoutHandle=vu(wt.bind(null,e,ae,Ae),t);break}wt(e,ae,Ae);break;case 4:if(et(e,r),(r&4194240)===r)break;for(t=e.eventTimes,l=-1;0<r;){var o=31-Re(r);u=1<<o,o=t[o],o>l&&(l=o),r&=~u}if(r=l,r=Q()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*gd(r/1960))-r,10<r){e.timeoutHandle=vu(wt.bind(null,e,ae,Ae),r);break}wt(e,ae,Ae);break;case 5:wt(e,ae,Ae);break;default:throw Error(y(329))}}}return pe(e,Q()),e.callbackNode===n?Wa.bind(null,e):null}function Iu(e,t){var n=Ln;return e.current.memoizedState.isDehydrated&&(xt(e,t).flags|=256),e=qr(e,t),e!==2&&(t=ae,ae=n,t!==null&&Fu(t)),e}function Fu(e){ae===null?ae=e:ae.push.apply(ae,e)}function wd(e){for(var t=e;;){if(t.flags&16384){var n=t.updateQueue;if(n!==null&&(n=n.stores,n!==null))for(var r=0;r<n.length;r++){var l=n[r],u=l.getSnapshot;l=l.value;try{if(!je(u(),l))return!1}catch{return!1}}}if(n=t.child,t.subtreeFlags&16384&&n!==null)n.return=t,t=n;else{if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function et(e,t){for(t&=~xo,t&=~cl,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-Re(t),r=1<<n;e[n]=-1,t&=~r}}function Ai(e){if(R&6)throw Error(y(327));Zt();var t=Mr(e,0);if(!(t&1))return pe(e,Q()),null;var n=qr(e,t);if(e.tag!==0&&n===2){var r=su(e);r!==0&&(t=r,n=Iu(e,r))}if(n===1)throw n=Yn,xt(e,0),et(e,t),pe(e,Q()),n;if(n===6)throw Error(y(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,wt(e,ae,Ae),pe(e,Q()),null}function _o(e,t){var n=R;R|=1;try{return e(t)}finally{R=n,R===0&&(rn=Q()+500,ol&&ht())}}function Lt(e){nt!==null&&nt.tag===0&&!(R&6)&&Zt();var t=R;R|=1;var n=xe.transition,r=O;try{if(xe.transition=null,O=1,e)return e()}finally{O=r,xe.transition=n,R=t,!(R&6)&&ht()}}function Po(){me=Wt.current,I(Wt)}function xt(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(n!==-1&&(e.timeoutHandle=-1,Gf(n)),K!==null)for(n=K.return;n!==null;){var r=n;switch(uo(r),r.tag){case 1:r=r.type.childContextTypes,r!=null&&Ar();break;case 3:tn(),I(fe),I(le),ho();break;case 5:mo(r);break;case 4:tn();break;case 13:I(A);break;case 19:I(A);break;case 10:ao(r.type._context);break;case 22:case 23:Po()}n=n.return}if(J=e,K=e=ct(e.current,null),b=me=t,X=0,Yn=null,xo=cl=zt=0,ae=Ln=null,kt!==null){for(t=0;t<kt.length;t++)if(n=kt[t],r=n.interleaved,r!==null){n.interleaved=null;var l=r.next,u=n.pending;if(u!==null){var o=u.next;u.next=l,r.next=o}n.pending=r}kt=null}return e}function Qa(e,t){do{var n=K;try{if(so(),Cr.current=Xr,Yr){for(var r=B.memoizedState;r!==null;){var l=r.queue;l!==null&&(l.pending=null),r=r.next}Yr=!1}if(Nt=0,Z=Y=B=null,Nn=!1,Wn=0,Eo.current=null,n===null||n.return===null){X=1,Yn=t,K=null;break}e:{var u=e,o=n.return,i=n,s=t;if(t=b,i.flags|=32768,s!==null&&typeof s=="object"&&typeof s.then=="function"){var c=s,h=i,m=h.tag;if(!(h.mode&1)&&(m===0||m===11||m===15)){var p=h.alternate;p?(h.updateQueue=p.updateQueue,h.memoizedState=p.memoizedState,h.lanes=p.lanes):(h.updateQueue=null,h.memoizedState=null)}var g=Pi(o);if(g!==null){g.flags&=-257,Ni(g,o,i,u,t),g.mode&1&&_i(u,c,t),t=g,s=c;var w=t.updateQueue;if(w===null){var S=new Set;S.add(s),t.updateQueue=S}else w.add(s);break e}else{if(!(t&1)){_i(u,c,t),No();break e}s=Error(y(426))}}else if(U&&i.mode&1){var F=Pi(o);if(F!==null){!(F.flags&65536)&&(F.flags|=256),Ni(F,o,i,u,t),oo(nn(s,i));break e}}u=s=nn(s,i),X!==4&&(X=2),Ln===null?Ln=[u]:Ln.push(u),u=o;do{switch(u.tag){case 3:u.flags|=65536,t&=-t,u.lanes|=t;var f=za(u,s,t);wi(u,f);break e;case 1:i=s;var a=u.type,d=u.stateNode;if(!(u.flags&128)&&(typeof a.getDerivedStateFromError=="function"||d!==null&&typeof d.componentDidCatch=="function"&&(st===null||!st.has(d)))){u.flags|=65536,t&=-t,u.lanes|=t;var v=La(u,i,t);wi(u,v);break e}}u=u.return}while(u!==null)}Xa(n)}catch(E){t=E,K===n&&n!==null&&(K=n=n.return);continue}break}while(!0)}function Ka(){var e=Gr.current;return Gr.current=Xr,e===null?Xr:e}function No(){(X===0||X===3||X===2)&&(X=4),J===null||!(zt&268435455)&&!(cl&268435455)||et(J,b)}function qr(e,t){var n=R;R|=2;var r=Ka();(J!==e||b!==t)&&(Ae=null,xt(e,t));do try{Sd();break}catch(l){Qa(e,l)}while(!0);if(so(),R=n,Gr.current=r,K!==null)throw Error(y(261));return J=null,b=0,X}function Sd(){for(;K!==null;)Ya(K)}function kd(){for(;K!==null&&!Qc();)Ya(K)}function Ya(e){var t=Za(e.alternate,e,me);e.memoizedProps=e.pendingProps,t===null?Xa(e):K=t,Eo.current=null}function Xa(e){var t=e;do{var n=t.alternate;if(e=t.return,t.flags&32768){if(n=md(n,t),n!==null){n.flags&=32767,K=n;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{X=6,K=null;return}}else if(n=pd(n,t,me),n!==null){K=n;return}if(t=t.sibling,t!==null){K=t;return}K=t=e}while(t!==null);X===0&&(X=5)}function wt(e,t,n){var r=O,l=xe.transition;try{xe.transition=null,O=1,Ed(e,t,n,r)}finally{xe.transition=l,O=r}return null}function Ed(e,t,n,r){do Zt();while(nt!==null);if(R&6)throw Error(y(327));n=e.finishedWork;var l=e.finishedLanes;if(n===null)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(y(177));e.callbackNode=null,e.callbackPriority=0;var u=n.lanes|n.childLanes;if(tf(e,u),e===J&&(K=J=null,b=0),!(n.subtreeFlags&2064)&&!(n.flags&2064)||vr||(vr=!0,Ja(jr,function(){return Zt(),null})),u=(n.flags&15990)!==0,n.subtreeFlags&15990||u){u=xe.transition,xe.transition=null;var o=O;O=1;var i=R;R|=4,Eo.current=null,vd(e,n),Va(n,e),Vf(mu),Dr=!!pu,mu=pu=null,e.current=n,yd(n),Kc(),R=i,O=o,xe.transition=u}else e.current=n;if(vr&&(vr=!1,nt=e,Jr=l),u=e.pendingLanes,u===0&&(st=null),Gc(n.stateNode),pe(e,Q()),t!==null)for(r=e.onRecoverableError,n=0;n<t.length;n++)l=t[n],r(l.value,{componentStack:l.stack,digest:l.digest});if(Zr)throw Zr=!1,e=Mu,Mu=null,e;return Jr&1&&e.tag!==0&&Zt(),u=e.pendingLanes,u&1?e===Du?Tn++:(Tn=0,Du=e):Tn=0,ht(),null}function Zt(){if(nt!==null){var e=zs(Jr),t=xe.transition,n=O;try{if(xe.transition=null,O=16>e?16:e,nt===null)var r=!1;else{if(e=nt,nt=null,Jr=0,R&6)throw Error(y(331));var l=R;for(R|=4,k=e.current;k!==null;){var u=k,o=u.child;if(k.flags&16){var i=u.deletions;if(i!==null){for(var s=0;s<i.length;s++){var c=i[s];for(k=c;k!==null;){var h=k;switch(h.tag){case 0:case 11:case 15:zn(8,h,u)}var m=h.child;if(m!==null)m.return=h,k=m;else for(;k!==null;){h=k;var p=h.sibling,g=h.return;if(Aa(h),h===c){k=null;break}if(p!==null){p.return=g,k=p;break}k=g}}}var w=u.alternate;if(w!==null){var S=w.child;if(S!==null){w.child=null;do{var F=S.sibling;S.sibling=null,S=F}while(S!==null)}}k=u}}if(u.subtreeFlags&2064&&o!==null)o.return=u,k=o;else e:for(;k!==null;){if(u=k,u.flags&2048)switch(u.tag){case 0:case 11:case 15:zn(9,u,u.return)}var f=u.sibling;if(f!==null){f.return=u.return,k=f;break e}k=u.return}}var a=e.current;for(k=a;k!==null;){o=k;var d=o.child;if(o.subtreeFlags&2064&&d!==null)d.return=o,k=d;else e:for(o=a;k!==null;){if(i=k,i.flags&2048)try{switch(i.tag){case 0:case 11:case 15:al(9,i)}}catch(E){V(i,i.return,E)}if(i===o){k=null;break e}var v=i.sibling;if(v!==null){v.return=i.return,k=v;break e}k=i.return}}if(R=l,ht(),Fe&&typeof Fe.onPostCommitFiberRoot=="function")try{Fe.onPostCommitFiberRoot(tl,e)}catch{}r=!0}return r}finally{O=n,xe.transition=t}}return!1}function Bi(e,t,n){t=nn(n,t),t=za(e,t,1),e=it(e,t,1),t=oe(),e!==null&&(Gn(e,1,t),pe(e,t))}function V(e,t,n){if(e.tag===3)Bi(e,e,n);else for(;t!==null;){if(t.tag===3){Bi(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof r.componentDidCatch=="function"&&(st===null||!st.has(r))){e=nn(n,e),e=La(t,e,1),t=it(t,e,1),e=oe(),t!==null&&(Gn(t,1,e),pe(t,e));break}}t=t.return}}function xd(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),t=oe(),e.pingedLanes|=e.suspendedLanes&n,J===e&&(b&n)===n&&(X===4||X===3&&(b&130023424)===b&&500>Q()-Co?xt(e,0):xo|=n),pe(e,t)}function Ga(e,t){t===0&&(e.mode&1?(t=or,or<<=1,!(or&130023424)&&(or=4194304)):t=1);var n=oe();e=Ye(e,t),e!==null&&(Gn(e,t,n),pe(e,n))}function Cd(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Ga(e,n)}function _d(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(y(314))}r!==null&&r.delete(t),Ga(e,n)}var Za;Za=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||fe.current)ce=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return ce=!1,dd(e,t,n);ce=!!(e.flags&131072)}else ce=!1,U&&t.flags&1048576&&ea(t,Vr,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Pr(e,t),e=t.pendingProps;var l=qt(t,le.current);Gt(t,n),l=yo(null,t,r,e,l,n);var u=go();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,de(r)?(u=!0,Br(t)):u=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,fo(t),l.updater=sl,t.stateNode=l,l._reactInternals=t,xu(t,r,e,n),t=Pu(null,t,r,!0,u,n)):(t.tag=0,U&&u&&lo(t),ue(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Pr(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=Nd(r),e=ze(r,e),l){case 0:t=_u(null,t,r,e,n);break e;case 1:t=Ti(null,t,r,e,n);break e;case 11:t=zi(null,t,r,e,n);break e;case 14:t=Li(null,t,r,ze(r.type,e),n);break e}throw Error(y(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ze(r,l),_u(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ze(r,l),Ti(e,t,r,l,n);case 3:e:{if(ja(t),e===null)throw Error(y(387));r=t.pendingProps,u=t.memoizedState,l=u.element,oa(e,t),Qr(t,r,null,n);var o=t.memoizedState;if(r=o.element,u.isDehydrated)if(u={element:r,isDehydrated:!1,cache:o.cache,pendingSuspenseBoundaries:o.pendingSuspenseBoundaries,transitions:o.transitions},t.updateQueue.baseState=u,t.memoizedState=u,t.flags&256){l=nn(Error(y(423)),t),t=Ri(e,t,r,n,l);break e}else if(r!==l){l=nn(Error(y(424)),t),t=Ri(e,t,r,n,l);break e}else for(he=ot(t.stateNode.containerInfo.firstChild),ve=t,U=!0,Te=null,n=la(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(bt(),r===l){t=Xe(e,t,n);break e}ue(e,t,r,n)}t=t.child}return t;case 5:return ia(t),e===null&&Su(t),r=t.type,l=t.pendingProps,u=e!==null?e.memoizedProps:null,o=l.children,hu(r,l)?o=null:u!==null&&hu(r,u)&&(t.flags|=32),Oa(e,t),ue(e,t,o,n),t.child;case 6:return e===null&&Su(t),null;case 13:return Ma(e,t,n);case 4:return po(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=en(t,null,r,n):ue(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ze(r,l),zi(e,t,r,l,n);case 7:return ue(e,t,t.pendingProps,n),t.child;case 8:return ue(e,t,t.pendingProps.children,n),t.child;case 12:return ue(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,u=t.memoizedProps,o=l.value,j(Hr,r._currentValue),r._currentValue=o,u!==null)if(je(u.value,o)){if(u.children===l.children&&!fe.current){t=Xe(e,t,n);break e}}else for(u=t.child,u!==null&&(u.return=t);u!==null;){var i=u.dependencies;if(i!==null){o=u.child;for(var s=i.firstContext;s!==null;){if(s.context===r){if(u.tag===1){s=We(-1,n&-n),s.tag=2;var c=u.updateQueue;if(c!==null){c=c.shared;var h=c.pending;h===null?s.next=s:(s.next=h.next,h.next=s),c.pending=s}}u.lanes|=n,s=u.alternate,s!==null&&(s.lanes|=n),ku(u.return,n,t),i.lanes|=n;break}s=s.next}}else if(u.tag===10)o=u.type===t.type?null:u.child;else if(u.tag===18){if(o=u.return,o===null)throw Error(y(341));o.lanes|=n,i=o.alternate,i!==null&&(i.lanes|=n),ku(o,n,t),o=u.sibling}else o=u.child;if(o!==null)o.return=u;else for(o=u;o!==null;){if(o===t){o=null;break}if(u=o.sibling,u!==null){u.return=o.return,o=u;break}o=o.return}u=o}ue(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,Gt(t,n),l=Ce(l),r=r(l),t.flags|=1,ue(e,t,r,n),t.child;case 14:return r=t.type,l=ze(r,t.pendingProps),l=ze(r.type,l),Li(e,t,r,l,n);case 15:return Ta(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ze(r,l),Pr(e,t),t.tag=1,de(r)?(e=!0,Br(t)):e=!1,Gt(t,n),Na(t,r,l),xu(t,r,l,n),Pu(null,t,r,!0,e,n);case 19:return Da(e,t,n);case 22:return Ra(e,t,n)}throw Error(y(156,t.tag))};function Ja(e,t){return Cs(e,t)}function Pd(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Ee(e,t,n,r){return new Pd(e,t,n,r)}function zo(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Nd(e){if(typeof e=="function")return zo(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Ku)return 11;if(e===Yu)return 14}return 2}function ct(e,t){var n=e.alternate;return n===null?(n=Ee(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Lr(e,t,n,r,l,u){var o=2;if(r=e,typeof e=="function")zo(e)&&(o=1);else if(typeof e=="string")o=5;else e:switch(e){case Mt:return Ct(n.children,l,u,t);case Qu:o=8,l|=8;break;case Yl:return e=Ee(12,n,t,l|2),e.elementType=Yl,e.lanes=u,e;case Xl:return e=Ee(13,n,t,l),e.elementType=Xl,e.lanes=u,e;case Gl:return e=Ee(19,n,t,l),e.elementType=Gl,e.lanes=u,e;case is:return fl(n,l,u,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case us:o=10;break e;case os:o=9;break e;case Ku:o=11;break e;case Yu:o=14;break e;case Je:o=16,r=null;break e}throw Error(y(130,e==null?e:typeof e,""))}return t=Ee(o,n,t,l),t.elementType=e,t.type=r,t.lanes=u,t}function Ct(e,t,n,r){return e=Ee(7,e,r,t),e.lanes=n,e}function fl(e,t,n,r){return e=Ee(22,e,r,t),e.elementType=is,e.lanes=n,e.stateNode={isHidden:!1},e}function Hl(e,t,n){return e=Ee(6,e,null,t),e.lanes=n,e}function Wl(e,t,n){return t=Ee(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function zd(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Cl(0),this.expirationTimes=Cl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Cl(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function Lo(e,t,n,r,l,u,o,i,s){return e=new zd(e,t,n,i,s),t===1?(t=1,u===!0&&(t|=8)):t=0,u=Ee(3,null,null,t),e.current=u,u.stateNode=e,u.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},fo(u),e}function Ld(e,t,n){var r=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:jt,key:r==null?null:""+r,children:e,containerInfo:t,implementation:n}}function qa(e){if(!e)return dt;e=e._reactInternals;e:{if(Rt(e)!==e||e.tag!==1)throw Error(y(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(de(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(t!==null);throw Error(y(171))}if(e.tag===1){var n=e.type;if(de(n))return qs(e,n,t)}return t}function ba(e,t,n,r,l,u,o,i,s){return e=Lo(n,r,!0,e,l,u,o,i,s),e.context=qa(null),n=e.current,r=oe(),l=at(n),u=We(r,l),u.callback=t??null,it(n,u,l),e.current.lanes=l,Gn(e,l,r),pe(e,r),e}function dl(e,t,n,r){var l=t.current,u=oe(),o=at(l);return n=qa(n),t.context===null?t.context=n:t.pendingContext=n,t=We(u,o),t.payload={element:e},r=r===void 0?null:r,r!==null&&(t.callback=r),e=it(l,t,o),e!==null&&(Oe(e,l,o,u),xr(e,l,o)),o}function br(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case 5:return e.child.stateNode;default:return e.child.stateNode}}function $i(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var n=e.retryLane;e.retryLane=n!==0&&n<t?n:t}}function To(e,t){$i(e,t),(e=e.alternate)&&$i(e,t)}function Td(){return null}var ec=typeof reportError=="function"?reportError:function(e){console.error(e)};function Ro(e){this._internalRoot=e}pl.prototype.render=Ro.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(y(409));dl(e,t,null,null)};pl.prototype.unmount=Ro.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;Lt(function(){dl(null,e,null,null)}),t[Ke]=null}};function pl(e){this._internalRoot=e}pl.prototype.unstable_scheduleHydration=function(e){if(e){var t=Rs();e={blockedOn:null,target:e,priority:t};for(var n=0;n<be.length&&t!==0&&t<be[n].priority;n++);be.splice(n,0,e),n===0&&js(e)}};function Oo(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function ml(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11&&(e.nodeType!==8||e.nodeValue!==" react-mount-point-unstable "))}function Vi(){}function Rd(e,t,n,r,l){if(l){if(typeof r=="function"){var u=r;r=function(){var c=br(o);u.call(c)}}var o=ba(t,r,e,0,null,!1,!1,"",Vi);return e._reactRootContainer=o,e[Ke]=o.current,An(e.nodeType===8?e.parentNode:e),Lt(),o}for(;l=e.lastChild;)e.removeChild(l);if(typeof r=="function"){var i=r;r=function(){var c=br(s);i.call(c)}}var s=Lo(e,0,!1,null,null,!1,!1,"",Vi);return e._reactRootContainer=s,e[Ke]=s.current,An(e.nodeType===8?e.parentNode:e),Lt(function(){dl(t,s,n,r)}),s}function hl(e,t,n,r,l){var u=n._reactRootContainer;if(u){var o=u;if(typeof l=="function"){var i=l;l=function(){var s=br(o);i.call(s)}}dl(t,o,e,l)}else o=Rd(n,t,e,l,r);return br(o)}Ls=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=Sn(t.pendingLanes);n!==0&&(Zu(t,n|1),pe(t,Q()),!(R&6)&&(rn=Q()+500,ht()))}break;case 13:Lt(function(){var r=Ye(e,1);if(r!==null){var l=oe();Oe(r,e,1,l)}}),To(e,1)}};Ju=function(e){if(e.tag===13){var t=Ye(e,134217728);if(t!==null){var n=oe();Oe(t,e,134217728,n)}To(e,134217728)}};Ts=function(e){if(e.tag===13){var t=at(e),n=Ye(e,t);if(n!==null){var r=oe();Oe(n,e,t,r)}To(e,t)}};Rs=function(){return O};Os=function(e,t){var n=O;try{return O=e,t()}finally{O=n}};uu=function(e,t,n){switch(t){case"input":if(ql(e,n),t=n.name,n.type==="radio"&&t!=null){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var l=ul(r);if(!l)throw Error(y(90));as(r),ql(r,l)}}}break;case"textarea":fs(e,n);break;case"select":t=n.value,t!=null&&Qt(e,!!n.multiple,t,!1)}};gs=_o;ws=Lt;var Od={usingClientEntryPoint:!1,Events:[Jn,Ut,ul,vs,ys,_o]},yn={findFiberByHostInstance:St,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},jd={bundleType:yn.bundleType,version:yn.version,rendererPackageName:yn.rendererPackageName,rendererConfig:yn.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:Ge.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return e=Es(e),e===null?null:e.stateNode},findFiberByHostInstance:yn.findFiberByHostInstance||Td,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"){var yr=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!yr.isDisabled&&yr.supportsFiber)try{tl=yr.inject(jd),Fe=yr}catch{}}ge.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Od;ge.createPortal=function(e,t){var n=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!Oo(t))throw Error(y(200));return Ld(e,t,null,n)};ge.createRoot=function(e,t){if(!Oo(e))throw Error(y(299));var n=!1,r="",l=ec;return t!=null&&(t.unstable_strictMode===!0&&(n=!0),t.identifierPrefix!==void 0&&(r=t.identifierPrefix),t.onRecoverableError!==void 0&&(l=t.onRecoverableError)),t=Lo(e,1,!1,null,null,n,!1,r,l),e[Ke]=t.current,An(e.nodeType===8?e.parentNode:e),new Ro(t)};ge.findDOMNode=function(e){if(e==null)return null;if(e.nodeType===1)return e;var t=e._reactInternals;if(t===void 0)throw typeof e.render=="function"?Error(y(188)):(e=Object.keys(e).join(","),Error(y(268,e)));return e=Es(t),e=e===null?null:e.stateNode,e};ge.flushSync=function(e){return Lt(e)};ge.hydrate=function(e,t,n){if(!ml(t))throw Error(y(200));return hl(null,e,t,!0,n)};ge.hydrateRoot=function(e,t,n){if(!Oo(e))throw Error(y(405));var r=n!=null&&n.hydratedSources||null,l=!1,u="",o=ec;if(n!=null&&(n.unstable_strictMode===!0&&(l=!0),n.identifierPrefix!==void 0&&(u=n.identifierPrefix),n.onRecoverableError!==void 0&&(o=n.onRecoverableError)),t=ba(t,null,e,1,n??null,l,!1,u,o),e[Ke]=t.current,An(e),r)for(e=0;e<r.length;e++)n=r[e],l=n._getVersion,l=l(n._source),t.mutableSourceEagerHydrationData==null?t.mutableSourceEagerHydrationData=[n,l]:t.mutableSourceEagerHydrationData.push(n,l);return new pl(t)};ge.render=function(e,t,n){if(!ml(t))throw Error(y(200));return hl(null,e,t,!1,n)};ge.unmountComponentAtNode=function(e){if(!ml(e))throw Error(y(40));return e._reactRootContainer?(Lt(function(){hl(null,null,e,!1,function(){e._reactRootContainer=null,e[Ke]=null})}),!0):!1};ge.unstable_batchedUpdates=_o;ge.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!ml(n))throw Error(y(200));if(e==null||e._reactInternals===void 0)throw Error(y(38));return hl(e,t,n,!1,r)};ge.version="18.3.1-next-f1338f8080-20240426";function tc(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(tc)}catch(e){console.error(e)}}tc(),ts.exports=ge;var Md=ts.exports,Hi=Md;Ql.createRoot=Hi.createRoot,Ql.hydrateRoot=Hi.hydrateRoot;class Dd{constructor(t="https://syu.is"){Mo(this,"pdsUrl");this.pdsUrl=t}parseAtUri(t){const n=t.match(/^at:\/\/([^/]+)\/([^/]+)\/([^/]+)$/);return n?{repo:n[1],collection:n[2],rkey:n[3]}:null}async resolveHandle(t){return(await(await fetch(`${this.pdsUrl}/xrpc/com.atproto.identity.resolveHandle?handle=${t}`)).json()).did}async getRecord(t,n,r){return await(await fetch(`${this.pdsUrl}/xrpc/com.atproto.repo.getRecord?repo=${t}&collection=${n}&rkey=${r}`)).json()}async listRecords(t,n){return(await(await fetch(`${this.pdsUrl}/xrpc/com.atproto.repo.listRecords?repo=${t}&collection=${n}`)).json()).records||[]}}const nc=He.createContext(null);function Id(){const e=He.useContext(nc);if(!e)throw new Error("useAtUriBrowser must be used within AtUriBrowser");return e}function Fd({children:e,pdsUrl:t="https://syu.is"}){const[n]=He.useState(()=>new Dd(t)),[r,l]=He.useState(null),u=async o=>{try{const i=n.parseAtUri(o);if(!i)throw new Error("Invalid AT URI format");const s=await n.getRecord(i.repo,i.collection,i.rkey);l(s)}catch(i){console.error("Failed to navigate:",i),l(null)}};return He.useEffect(()=>{const i=new URLSearchParams(window.location.search).get("uri");i&&u(i)},[]),D.jsxs(nc.Provider,{value:{client:n,currentRecord:r,setCurrentRecord:l,navigate:u},children:[e,r&&D.jsxs("div",{className:"record-view",children:[D.jsx("h2",{children:r.value.title}),D.jsxs("div",{className:"record-meta",children:[D.jsxs("p",{children:["URI: ",r.uri]}),D.jsxs("p",{children:["Created: ",new Date(r.value.createdAt).toLocaleString()]})]}),D.jsx("div",{className:"record-content",children:D.jsx("pre",{children:r.value.content})})]})]})}function Ud(){const[e,t]=He.useState(""),{navigate:n,currentRecord:r}=Id(),l=async u=>{u.preventDefault(),e&&await n(e)};return D.jsxs("div",{className:"container",children:[D.jsx("h1",{children:"AT Protocol Browser"}),D.jsxs("form",{onSubmit:l,className:"input-section",children:[D.jsx("input",{type:"text",placeholder:"at://did:plc:xxx/ai.syui.log.post/rkey",value:e,onChange:u=>t(u.target.value),className:"at-uri-input"}),D.jsx("button",{type:"submit",children:"Browse"})]}),!r&&D.jsxs("div",{className:"info-section",children:[D.jsx("h2",{children:"About"}),D.jsx("p",{children:"Browse AT Protocol records directly from the PDS."}),D.jsxs("ul",{children:[D.jsx("li",{children:"Enter an AT URI to view its content"}),D.jsx("li",{children:"Example: at://did:plc:xxx/ai.syui.log.post/xxx"}),D.jsx("li",{children:"Supports syu.is PDS environment"})]})]}),D.jsx("a",{href:"/",className:"back-link",children:"โ† Back to Blog"})]})}function Ad(){return D.jsx(Fd,{children:D.jsx(Ud,{})})}Ql.createRoot(document.getElementById("root")).render(D.jsx(Ec.StrictMode,{children:D.jsx(Ad,{})})); diff --git a/browser/dist/index.html b/browser/dist/index.html new file mode 100644 index 0000000..bde523a --- /dev/null +++ b/browser/dist/index.html @@ -0,0 +1,13 @@ +<!doctype html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title>AT Browser + + + + +
+ + diff --git a/browser/index.html b/browser/index.html new file mode 100644 index 0000000..3b01d24 --- /dev/null +++ b/browser/index.html @@ -0,0 +1,12 @@ + + + + + + AT Browser + + +
+ + + diff --git a/pds/package.json b/browser/package.json similarity index 50% rename from pds/package.json rename to browser/package.json index 750a10d..cf50617 100644 --- a/pds/package.json +++ b/browser/package.json @@ -1,27 +1,25 @@ { - "name": "pds-browser", - "version": "0.3.4", - "description": "AT Protocol browser for ai.log", - "main": "index.js", + "name": "ailog-browser", + "version": "0.1.0", "type": "module", "scripts": { "dev": "vite", "build": "vite build", "preview": "vite preview" }, - "license": "MIT", "dependencies": { "@atproto/api": "^0.13.0", - "@atproto/did": "^0.1.0", - "@atproto/lexicon": "^0.4.0", - "@atproto/syntax": "^0.3.0", "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { - "@types/react": "^18.0.37", - "@types/react-dom": "^18.0.11", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", "@vitejs/plugin-react": "^4.0.0", + "autoprefixer": "^10.4.14", + "postcss": "^8.4.24", + "tailwindcss": "^3.3.2", + "typescript": "^5.0.0", "vite": "^5.0.0" } } diff --git a/browser/src/App.css b/browser/src/App.css new file mode 100644 index 0000000..132ee60 --- /dev/null +++ b/browser/src/App.css @@ -0,0 +1,119 @@ +.container { + max-width: 800px; + margin: 0 auto; + padding: 2rem; +} + +h1 { + font-size: 2rem; + margin-bottom: 1.5rem; + color: #333; +} + +.input-section { + margin-bottom: 2rem; + display: flex; + gap: 0.5rem; +} + +.at-uri-input { + flex: 1; + padding: 0.75rem; + font-size: 1rem; + border: 2px solid #ddd; + border-radius: 4px; + font-family: monospace; +} + +.at-uri-input:focus { + outline: none; + border-color: #0066cc; +} + +.input-section button { + padding: 0.75rem 2rem; + font-size: 1rem; + background: #0066cc; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + font-weight: 500; +} + +.input-section button:hover { + background: #0052a3; +} + +.info-section { + background: white; + padding: 1.5rem; + border-radius: 8px; + margin-bottom: 2rem; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); +} + +.info-section h2 { + font-size: 1.5rem; + margin-bottom: 1rem; + color: #333; +} + +.info-section ul { + list-style-position: inside; + color: #666; +} + +.info-section li { + margin-bottom: 0.5rem; +} + +.back-link { + display: inline-block; + color: #0066cc; + text-decoration: none; + font-weight: 500; +} + +.back-link:hover { + text-decoration: underline; +} + +.record-view { + background: white; + padding: 2rem; + border-radius: 8px; + margin-bottom: 2rem; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); +} + +.record-view h2 { + font-size: 2rem; + margin-bottom: 1rem; + color: #333; +} + +.record-meta { + margin-bottom: 1.5rem; + padding-bottom: 1rem; + border-bottom: 1px solid #eee; +} + +.record-meta p { + margin: 0.5rem 0; + color: #666; + font-size: 0.9rem; + font-family: monospace; +} + +.record-content { + line-height: 1.8; + color: #333; +} + +.record-content pre { + white-space: pre-wrap; + word-wrap: break-word; + font-family: inherit; + margin: 0; +} diff --git a/browser/src/App.tsx b/browser/src/App.tsx new file mode 100644 index 0000000..9106244 --- /dev/null +++ b/browser/src/App.tsx @@ -0,0 +1,56 @@ +import { useState } from 'react' +import { AtUriBrowser, useAtUriBrowser } from './components/AtUriBrowser' +import './App.css' + +function BrowserContent() { + const [atUri, setAtUri] = useState('') + const { navigate, currentRecord } = useAtUriBrowser() + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault() + if (atUri) { + await navigate(atUri) + } + } + + return ( +
+

AT Protocol Browser

+ +
+ setAtUri(e.target.value)} + className="at-uri-input" + /> + +
+ + {!currentRecord && ( +
+

About

+

Browse AT Protocol records directly from the PDS.

+
    +
  • Enter an AT URI to view its content
  • +
  • Example: at://did:plc:xxx/ai.syui.log.post/xxx
  • +
  • Supports syu.is PDS environment
  • +
+
+ )} + + โ† Back to Blog +
+ ) +} + +function App() { + return ( + + + + ) +} + +export default App diff --git a/browser/src/components/AtUriBrowser.tsx b/browser/src/components/AtUriBrowser.tsx new file mode 100644 index 0000000..2f643ed --- /dev/null +++ b/browser/src/components/AtUriBrowser.tsx @@ -0,0 +1,70 @@ +import { createContext, useContext, ReactNode, useState, useEffect } from 'react' +import { AtProtoClient, RecordResponse } from '../lib/atproto' + +interface AtUriBrowserContextType { + client: AtProtoClient + currentRecord: RecordResponse | null + setCurrentRecord: (record: RecordResponse | null) => void + navigate: (uri: string) => Promise +} + +const AtUriBrowserContext = createContext(null) + +export function useAtUriBrowser() { + const context = useContext(AtUriBrowserContext) + if (!context) { + throw new Error('useAtUriBrowser must be used within AtUriBrowser') + } + return context +} + +interface AtUriBrowserProps { + children: ReactNode + pdsUrl?: string +} + +export function AtUriBrowser({ children, pdsUrl = 'https://syu.is' }: AtUriBrowserProps) { + const [client] = useState(() => new AtProtoClient(pdsUrl)) + const [currentRecord, setCurrentRecord] = useState(null) + + const navigate = async (uri: string) => { + try { + const parsed = client.parseAtUri(uri) + if (!parsed) { + throw new Error('Invalid AT URI format') + } + + const record = await client.getRecord(parsed.repo, parsed.collection, parsed.rkey) + setCurrentRecord(record) + } catch (error) { + console.error('Failed to navigate:', error) + setCurrentRecord(null) + } + } + + useEffect(() => { + const params = new URLSearchParams(window.location.search) + const uri = params.get('uri') + if (uri) { + navigate(uri) + } + }, []) + + return ( + + {children} + {currentRecord && ( +
+

{currentRecord.value.title}

+
+

URI: {currentRecord.uri}

+

Created: {new Date(currentRecord.value.createdAt).toLocaleString()}

+
+
+
{currentRecord.value.content}
+
+
+ )} +
+ ) +} diff --git a/browser/src/index.css b/browser/src/index.css new file mode 100644 index 0000000..38dbca1 --- /dev/null +++ b/browser/src/index.css @@ -0,0 +1,19 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + background: #f5f5f5; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/browser/src/lib/atproto.ts b/browser/src/lib/atproto.ts new file mode 100644 index 0000000..d203bff --- /dev/null +++ b/browser/src/lib/atproto.ts @@ -0,0 +1,59 @@ +export interface AtUri { + repo: string + collection: string + rkey: string +} + +export interface PostRecord { + title: string + content: string + createdAt: string +} + +export interface RecordResponse { + uri: string + cid: string + value: PostRecord +} + +export class AtProtoClient { + private pdsUrl: string + + constructor(pdsUrl: string = 'https://syu.is') { + this.pdsUrl = pdsUrl + } + + parseAtUri(uri: string): AtUri | null { + const match = uri.match(/^at:\/\/([^/]+)\/([^/]+)\/([^/]+)$/) + if (!match) return null + + return { + repo: match[1], + collection: match[2], + rkey: match[3] + } + } + + async resolveHandle(handle: string): Promise { + const response = await fetch( + `${this.pdsUrl}/xrpc/com.atproto.identity.resolveHandle?handle=${handle}` + ) + const data = await response.json() + return data.did + } + + async getRecord(repo: string, collection: string, rkey: string): Promise { + const response = await fetch( + `${this.pdsUrl}/xrpc/com.atproto.repo.getRecord?repo=${repo}&collection=${collection}&rkey=${rkey}` + ) + return await response.json() + } + + async listRecords(repo: string, collection: string): Promise { + const response = await fetch( + `${this.pdsUrl}/xrpc/com.atproto.repo.listRecords?repo=${repo}&collection=${collection}` + ) + const data = await response.json() + return data.records || [] + } +} diff --git a/pds/src/main.jsx b/browser/src/main.tsx similarity index 53% rename from pds/src/main.jsx rename to browser/src/main.tsx index 6161d18..964aeb4 100644 --- a/pds/src/main.jsx +++ b/browser/src/main.tsx @@ -1,9 +1,10 @@ import React from 'react' import ReactDOM from 'react-dom/client' -import App from './App.jsx' +import App from './App' +import './index.css' -ReactDOM.createRoot(document.getElementById('root')).render( +ReactDOM.createRoot(document.getElementById('root')!).render( , -) \ No newline at end of file +) diff --git a/browser/tsconfig.json b/browser/tsconfig.json new file mode 100644 index 0000000..3934b8f --- /dev/null +++ b/browser/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/browser/tsconfig.node.json b/browser/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/browser/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/pds/vite.config.js b/browser/vite.config.ts similarity index 58% rename from pds/vite.config.js rename to browser/vite.config.ts index e21c23d..4b06d25 100644 --- a/pds/vite.config.js +++ b/browser/vite.config.ts @@ -3,8 +3,9 @@ import react from '@vitejs/plugin-react' export default defineConfig({ plugins: [react()], - base: '/pds/', - define: { - 'process.env.NODE_ENV': JSON.stringify('production') - } -}) \ No newline at end of file + base: '/at/', + build: { + outDir: 'dist', + emptyOutDir: true, + }, +}) diff --git a/claude.md b/claude.md index 561c812..e148ed4 100644 --- a/claude.md +++ b/claude.md @@ -1,700 +1,381 @@ -# ใ‚จใ‚ณใ‚ทใ‚นใƒ†ใƒ ็ตฑๅˆ่จญ่จˆๆ›ธ +# ailog -## ๆณจๆ„ไบ‹้ … +## ๆฆ‚่ฆ -`console.log`ใฏ็ตถๅฏพใซๆ›ธใ‹ใชใ„ใ‚ˆใ†ใซใ—ใฆใใ ใ•ใ„ใ€‚ +atprotoใƒ™ใƒผใ‚นใฎ้™็š„ใƒ–ใƒญใ‚ฐใ‚ธใ‚งใƒใƒฌใƒผใ‚ฟใƒผใ€‚markdownใƒ•ใ‚กใ‚คใƒซใ‚’atproto recordใจใ—ใฆไฟๅญ˜ใ—ใ€ใใ‚Œใ‚’ๅ…ƒใซ้™็š„ใ‚ตใ‚คใƒˆใ‚’็”Ÿๆˆใ™ใ‚‹ใ€‚ -ใƒใƒผใƒ‰ใ‚ณใƒผใƒ‰ใ—ใชใ„ใ‚ˆใ†ใซใ—ใฆใใ ใ•ใ„ใ€‚ๅฟ…ใšใ€`./my-blog/config.toml`ใ‚„`./oauth/.env.production`ใ‚’ไฝฟ็”จใ™ใ‚‹ใ‚ˆใ†ใซใ€‚ใพใŸใฏ`~/.config/syui/ai/log/config.json`ใ‚’ไฝฟ็”จใ™ใ‚‹ใ‚ˆใ†ใซใ€‚ +## Collection Schema -้‡่ค‡ใ™ใ‚‹ๅๅ‰ใฎenvใ‚’ไฝœใ‚‰ใชใ„ใ‚ˆใ†ใซใ—ใฆใใ ใ•ใ„ใ€‚ๆ–ฐใ—ใ„็’ฐๅขƒๅค‰ๆ•ฐใ‚’ไฝœใ‚‹้š›ใฏๅฟ…ใšๆคœ่จŽใ—ใฆใใ ใ•ใ„ใ€‚ - -```sh -# ใƒ€ใƒกใชไพ‹ -VITE_OAUTH_COLLECTION_USER=ai.syui.log.user -VITE_OAUTH_COLLECTION_CHAT=ai.syui.log.chat -``` - -## oauth appใฎ่จญ่จˆ - -> ./oauth/.env.production - -```sh -VITE_ATPROTO_PDS=syu.is -VITE_ADMIN_HANDLE=ai.syui.ai -VITE_AI_HANDLE=ai.syui.ai -VITE_OAUTH_COLLECTION=ai.syui.log -``` - -ใ“ใ‚Œใ‚‰ใฏ้žๅธธใซใ‚ทใƒณใƒ—ใƒซใชๆตใ‚ŒใซใชใฃใฆใŠใ‚Šใ€ใ™ในใฆใฎ้ …็›ฎใฏใ€ๅ…ฑ้€šใ—ใพใ™ใ€‚็Ÿญ็ธฎใงใใ‚‹ๅ ดๅˆใŒใ‚ใ‚Šใพใ™ใ€‚handleใฏๅค‰ใ‚ใ‚‹ๅฏ่ƒฝๆ€งใŒใ‚ใ‚‹ใฎใงใ€ใงใใ‚‹้™ใ‚Šdidใ‚’ไฝฟใ„ใพใ—ใ‚‡ใ†ใ€‚ - -1. handleใ‹ใ‚‰pds, didใ‚’ๅ–ๅพ—ใงใใ‚‹ ... com.atproto.repo.describeRepo -2. pdsใŒๅˆ†ใ‹ใ‚Œใฐใ€pdsApi, bskyApi, plcApiใ‚’ๅ‰ฒใ‚Šๅฝ“ใฆใ‚‰ใ‚Œใ‚‹ -3. bskyApiใŒๅˆ†ใ‹ใ‚Œใฐใ€getProfileใงavatar-uriใ‚’ๅ–ๅพ—ใงใใ‚‹ ... app.bsky.actor.getProfile -4. pdsAPiใ‹ใ‚‰ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใซใ‚ใ‚‹collectionใฎrecordใฎๆƒ…ๅ ฑใ‚’ๅ–ๅพ—ใงใใ‚‹ ... com.atproto.repo.listRecords - -### ใ‚ณใƒกใƒณใƒˆใ‚’่กจ็คบใ™ใ‚‹ - -1. VITE_ADMIN_HANDLEใ‹ใ‚‰็ฎก็†่€…ใฎhandleใ‚’ๅ–ๅพ—ใ™ใ‚‹ใ€‚ -2. VITE_ATPROTO_PDSใ‹ใ‚‰็ฎก็†่€…ใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฎpdsใ‚’ๅ–ๅพ—ใ™ใ‚‹ใ€‚ -3. pdsใ‹ใ‚‰pdsApi, bskApi, plcApiใ‚’ๅ‰ฒใ‚Šๅฝ“ใฆใ‚‹ใ€‚ - -```rust - match pds { - "bsky.social" | "bsky.app" => NetworkConfig { - pds_api: format!("https://{}", pds), - plc_api: "https://plc.directory".to_string(), - bsky_api: "https://public.api.bsky.app".to_string(), - web_url: "https://bsky.app".to_string(), - }, - "syu.is" => NetworkConfig { - pds_api: "https://syu.is".to_string(), - plc_api: "https://plc.syu.is".to_string(), - bsky_api: "https://bsky.syu.is".to_string(), - web_url: "https://web.syu.is".to_string(), - }, - _ => { - // Default to Bluesky network for unknown PDS - NetworkConfig { - pds_api: format!("https://{}", pds), - plc_api: "https://plc.directory".to_string(), - bsky_api: "https://public.api.bsky.app".to_string(), - web_url: "https://bsky.app".to_string(), - } - } - } -``` - -4. ็ฎก็†่€…ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใงใ‚ใ‚‹VITE_ADMIN_HANDLEใจVITE_ATPROTO_PDSใ‹ใ‚‰`ai.syui.log.user`ใจใ„ใ†userlistใ‚’ๅ–ๅพ—ใ™ใ‚‹ใ€‚ - -```sh -curl -sL "https://${VITE_ATPROTO_PDS}/xrpc/com.atproto.repo.listRecords?repo=${VITE_ADMIN_HANDLE}&collection=ai.syui.log.user" ---- -syui.ai -``` - -5. ใƒฆใƒผใ‚ถใƒผใŒใ‚ใ‹ใฃใŸใ‚‰ใ€ใใฎใƒฆใƒผใ‚ถใƒผใฎpdsใ‚’ๅˆคๅฎšใ™ใ‚‹ใ€‚ - -```sh -curl -sL "https://bsky.social/xrpc/com.atproto.repo.describeRepo?repo=syui.ai" |jq -r ".didDoc.service.[].serviceEndpoint" ---- -https://shiitake.us-east.host.bsky.network - -curl -sL "https://bsky.social/xrpc/com.atproto.repo.describeRepo?repo=syui.ai" |jq -r ".did" ---- -did:plc:uqzpqmrjnptsxezjx4xuh2mn -``` - -6. pdsใ‹ใ‚‰pdsApi, bskApi, plcApiใ‚’ๅ‰ฒใ‚Šๅฝ“ใฆใ‚‹ใ€‚ - -```rust - match pds { - "bsky.social" | "bsky.app" => NetworkConfig { - pds_api: format!("https://{}", pds), - plc_api: "https://plc.directory".to_string(), - bsky_api: "https://public.api.bsky.app".to_string(), - web_url: "https://bsky.app".to_string(), - }, - "syu.is" => NetworkConfig { - pds_api: "https://syu.is".to_string(), - plc_api: "https://plc.syu.is".to_string(), - bsky_api: "https://bsky.syu.is".to_string(), - web_url: "https://web.syu.is".to_string(), - }, - _ => { - // Default to Bluesky network for unknown PDS - NetworkConfig { - pds_api: format!("https://{}", pds), - plc_api: "https://plc.directory".to_string(), - bsky_api: "https://public.api.bsky.app".to_string(), - web_url: "https://bsky.app".to_string(), - } - } - } -``` - -7. ใƒฆใƒผใ‚ถใƒผใฎๆƒ…ๅ ฑใ‚’ๅ–ๅพ—ใ€่กจ็คบใ™ใ‚‹ - -```sh -bsky_api=https://public.api.bsky.app -user_did=did:plc:uqzpqmrjnptsxezjx4xuh2mn -curl -sL "$bsky_api/xrpc/app.bsky.actor.getProfile?actor=$user_did"|jq -r .avatar ---- -https://cdn.bsky.app/img/avatar/plain/did:plc:uqzpqmrjnptsxezjx4xuh2mn/bafkreid6kcc5pnn4b3ar7mj6vi3eiawhxgkcrw3edgbqeacyrlnlcoetea@jpeg -``` - -### AIใฎๆƒ…ๅ ฑใ‚’่กจ็คบใ™ใ‚‹ - -AIใŒๆŒใค`ai.syui.log.chat.lang`, `ai.syui.log.chat.comment`ใ‚’่กจ็คบใ—ใพใ™ใ€‚ - -ใชใŠใ€ใ“ใ‚Œใฏ้€šๅธธใ€`VITE_ADMIN_HANDLE`ใซputRecordใ•ใ‚Œใพใ™ใ€‚ใใ“ใ‹ใ‚‰ๆƒ…ๅ ฑใ‚’่ชญใฟ่พผใฟใพใ™ใ€‚`VITE_AI_HANDLE`ใฏใใฎrecordใฎ`author`ใฎใจใ“ใ‚ใซๅ…ฅใ‚Šใพใ™ใ€‚ - -```json -"author": { - "did": "did:plc:4hqjfn7m6n5hno3doamuhgef", - "avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:4hqjfn7m6n5hno3doamuhgef/bafkreiaxkv624mffw3cfyi67ufxtwuwsy2mjw2ygezsvtd44ycbgkfdo2a@jpeg", - "handle": "yui.syui.ai", - "displayName": "ai" -} -``` - -1. VITE_ADMIN_HANDLEใ‹ใ‚‰็ฎก็†่€…ใฎhandleใ‚’ๅ–ๅพ—ใ™ใ‚‹ใ€‚ -2. VITE_ATPROTO_PDSใ‹ใ‚‰็ฎก็†่€…ใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฎpdsใ‚’ๅ–ๅพ—ใ™ใ‚‹ใ€‚ -3. pdsใ‹ใ‚‰pdsApi, bskApi, plcApiใ‚’ๅ‰ฒใ‚Šๅฝ“ใฆใ‚‹ใ€‚ - -```rust - match pds { - "bsky.social" | "bsky.app" => NetworkConfig { - pds_api: format!("https://{}", pds), - plc_api: "https://plc.directory".to_string(), - bsky_api: "https://public.api.bsky.app".to_string(), - web_url: "https://bsky.app".to_string(), - }, - "syu.is" => NetworkConfig { - pds_api: "https://syu.is".to_string(), - plc_api: "https://plc.syu.is".to_string(), - bsky_api: "https://bsky.syu.is".to_string(), - web_url: "https://web.syu.is".to_string(), - }, - _ => { - // Default to Bluesky network for unknown PDS - NetworkConfig { - pds_api: format!("https://{}", pds), - plc_api: "https://plc.directory".to_string(), - bsky_api: "https://public.api.bsky.app".to_string(), - web_url: "https://bsky.app".to_string(), - } - } - } -``` - -4. ็ฎก็†่€…ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใงใ‚ใ‚‹VITE_ADMIN_HANDLEใจVITE_ATPROTO_PDSใ‹ใ‚‰`ai.syui.log.chat.lang`, `ai.syui.log.chat.comment`ใ‚’ๅ–ๅพ—ใ™ใ‚‹ใ€‚ - -```sh -curl -sL "https://${VITE_ATPROTO_PDS}/xrpc/com.atproto.repo.listRecords?repo=${VITE_ADMIN_HANDLE}&collection=ai.syui.log.chat.comment" -``` - -5. AIใฎprofileใ‚’ๅ–ๅพ—ใ™ใ‚‹ใ€‚ - -```sh -curl -sL "https://${VITE_ATPROTO_PDS}/xrpc/com.atproto.repo.describeRepo?repo=$VITE_AI_HANDLE" |jq -r ".didDoc.service.[].serviceEndpoint" ---- -https://syu.is - -curl -sL "https://${VITE_ATPROTO_PDS}/xrpc/com.atproto.repo.describeRepo?repo=$VITE_AI_HANDLE" |jq -r ".did" -did:plc:6qyecktefllvenje24fcxnie -``` - -6. pdsใ‹ใ‚‰pdsApi, bskApi, plcApiใ‚’ๅ‰ฒใ‚Šๅฝ“ใฆใ‚‹ใ€‚ - -```rust - match pds { - "bsky.social" | "bsky.app" => NetworkConfig { - pds_api: format!("https://{}", pds), - plc_api: "https://plc.directory".to_string(), - bsky_api: "https://public.api.bsky.app".to_string(), - web_url: "https://bsky.app".to_string(), - }, - "syu.is" => NetworkConfig { - pds_api: "https://syu.is".to_string(), - plc_api: "https://plc.syu.is".to_string(), - bsky_api: "https://bsky.syu.is".to_string(), - web_url: "https://web.syu.is".to_string(), - }, - _ => { - // Default to Bluesky network for unknown PDS - NetworkConfig { - pds_api: format!("https://{}", pds), - plc_api: "https://plc.directory".to_string(), - bsky_api: "https://public.api.bsky.app".to_string(), - web_url: "https://bsky.app".to_string(), - } - } - } -``` - -7. AIใฎๆƒ…ๅ ฑใ‚’ๅ–ๅพ—ใ€่กจ็คบใ™ใ‚‹ - -```sh -bsky_api=https://bsky.syu.is -user_did=did:plc:6qyecktefllvenje24fcxnie -curl -sL "$bsky_api/xrpc/app.bsky.actor.getProfile?actor=$user_did"|jq -r .avatar ---- -https://bsky.syu.is/img/avatar/plain/did:plc:6qyecktefllvenje24fcxnie/bafkreiet4pwlnshk7igra5flf2fuxpg2bhvf2apts4rqwcr56hzhgycii4@jpeg -``` - -## ไธญๆ ธๆ€ๆƒณ -- **ๅญ˜ๅœจๅญ็†่ซ–**: ใ“ใฎไธ–็•Œใงๆœ€ใ‚‚ๅฐใ•ใ„ใ‚‚ใฎ๏ผˆๅญ˜ๅœจๅญ/ai๏ผ‰ใฎๆŽขๆฑ‚ -- **ๅ”ฏไธ€ๆ€งๅŽŸๅ‰‡**: ็พๅฎŸใฎๅ€‹ไบบใฎๅ”ฏไธ€ๆ€งใ‚’ใ™ในใฆใฎใ‚ทใ‚นใƒ†ใƒ ใงๆ‹…ไฟ -- **็พๅฎŸใฎๅๆ˜ **: ็พๅฎŸโ†’ใ‚ฒใƒผใƒ โ†’็พๅฎŸใฎๅพช็’ฐ็š„ๅฝฑ้Ÿฟ - -## ใ‚ทใ‚นใƒ†ใƒ ๆง‹ๆˆๅ›ณ - -``` -ๅญ˜ๅœจๅญ(ai) - ๆœ€ๅฐๅ˜ไฝใฎๆ„่ญ˜ - โ†“ -[ai.moji] ๆ–‡ๅญ—ใ‚ทใ‚นใƒ†ใƒ  - โ†“ -[ai.os] + [ai.game device] โ† ็ตฑๅˆใƒใƒผใƒ‰ใ‚ฆใ‚งใ‚ข - โ”œโ”€โ”€ ai.shell (Claude Code็š„ๆฉŸ่ƒฝ) - โ”œโ”€โ”€ ai.gpt (่‡ชๅพ‹ไบบๆ ผใƒป่จ˜ๆ†ถใ‚ทใ‚นใƒ†ใƒ ) - โ”œโ”€โ”€ ai.log (AIใจ้€ฃๆบใ™ใ‚‹ใƒ–ใƒญใ‚ฐใ‚ทใ‚นใƒ†ใƒ ) - โ”œโ”€โ”€ ai.ai (ๅ€‹ไบบ็‰นๅŒ–AIใƒปๅฟƒใ‚’่ชญใฟๅ–ใ‚‹AI) - โ”œโ”€โ”€ ai.card (ใ‚ซใƒผใƒ‰ใ‚ฒใƒผใƒ ใƒปiOS/Web/API) - โ””โ”€โ”€ ai.bot (ๅˆ†ๆ•ฃSNS้€ฃๆบใƒปใ‚ซใƒผใƒ‰้…ๅธƒ) - โ†“ -[ai.verse] ใƒกใ‚ฟใƒใƒผใ‚น - โ”œโ”€โ”€ world system (ๆƒ‘ๆ˜Ÿๅž‹3Dไธ–็•Œ) - โ”œโ”€โ”€ at system (atproto/ๅˆ†ๆ•ฃSNS) - โ”œโ”€โ”€ yui system (ๅ”ฏไธ€ๆ€งๆ‹…ไฟ) - โ””โ”€โ”€ ai system (ๅญ˜ๅœจๅฑžๆ€ง) -``` - -## ๅๅ‰่ฆๅ‰‡ - -ๅๅ‰่ฆๅ‰‡ใฏไป–ใฎprojectใจๅ…จใฆๅ…ฑ้€šใ—ใฆใ„ใพใ™ใ€‚exampleใ‚’็คบใ—ใพใ™ใฎใงใ€ใ“ใฎใƒซใƒผใƒซใซๅพ“ใฃใฆใใ ใ•ใ„ใ€‚ - -ใ“ใ“ใงใฏ`ai.os`ใฎๅ ดๅˆใฎๅๅ‰่ฆๅ‰‡ใฎไพ‹ใ‚’่จ˜่ฟฐใ—ใพใ™ใ€‚ - -name: ai.os - -- **[ "package", "code", "command" ]**: aios -- **[ "dir", "url" ]**: ai/os -- **[ "domain", "json" ]**: ai.os - -```sh -$ curl -sL https://git.syui.ai/ai/ai/raw/branch/main/ai.json|jq .ai.os -{ "type": "os" } -``` +### ai.syui.log.post (ใƒ–ใƒญใ‚ฐ่จ˜ไบ‹) ```json { - "ai": { - "os":{} + "lexicon": 1, + "id": "ai.syui.log.post", + "defs": { + "main": { + "type": "record", + "description": "Record containing a blog post.", + "key": "tid", + "record": { + "type": "object", + "required": ["title", "content", "createdAt"], + "properties": { + "title": { + "type": "string", + "maxLength": 3000, + "maxGraphemes": 300, + "description": "The title of the post." + }, + "content": { + "type": "string", + "maxLength": 1000000, + "maxGraphemes": 100000, + "description": "The content of the post." + }, + "createdAt": { + "type": "string", + "format": "datetime", + "description": "Client-declared timestamp when this post was originally created." + } + } + } + } } } ``` -ไป–ใฎprojectใ‚‚ๅŒใ˜ๅๅ‰่ฆๅ‰‡ใ‚’ๆŽก็”จใ—ใพใ™ใ€‚`ai.gpt`ใชใ‚‰packageใฏ`aigpt`ใงใ™ใ€‚ - -## config(่จญๅฎšใƒ•ใ‚กใ‚คใƒซ, env, ็’ฐๅขƒไพๅญ˜) - -`config`ใ‚’็ฝฎใๅ ดๆ‰€ใฏ็ตฑไธ€ใ•ใ‚ŒใฆใŠใ‚Šใ€ๅ„projectใฎๅๅ‰่ฆๅ‰‡ใฎ`dir`้ …็›ฎใ‚’ไฝฟ็”จใ—ใพใ™ใ€‚ไพ‹ใˆใฐใ€aiosใฎๅ ดๅˆใฏ`~/.config/syui/ai/os/`ไปฅไธ‹ใจใชใ‚Šใพใ™ใ€‚pythonใชใฉใ‚’ไฝฟ็”จใ™ใ‚‹ๅ ดๅˆใ€`python -m venv`ใชใฉใงใ“ใฎpackage config dirใซ็’ฐๅขƒใ‚’ๆง‹็ฏ‰ใ—ใฆๅฎŸ่กŒใ™ใ‚‹ใ‚ˆใ†ใซใ—ใฆใใ ใ•ใ„ใ€‚ - -domainๅฝขๅผใ‚’ๆŽก็”จใ—ใฆใ€็งใฏๅ„projectใ‚’`git.syui.ai/ai`ใซhostใ—ใฆใ„ใพใ™ใ‹ใ‚‰ใ€`~/.config/syui/ai`ใจใ—ใพใ™ใ€‚ - -```sh -[syui.ai] -syui/ai -``` - -```sh -# example -~/.config/syui/ai - โ”œโ”€โ”€ card - โ”œโ”€โ”€ gpt - โ”œโ”€โ”€ os - โ””โ”€โ”€ shell -``` - -## ๅ„ใ‚ทใ‚นใƒ†ใƒ ่ฉณ็ดฐ - -### ai.gpt - ่‡ชๅพ‹็š„้€ไฟกAI -**็›ฎ็š„**: ้–ขไฟ‚ๆ€งใซๅŸบใฅใ่‡ช็™บ็š„ใ‚ณใƒŸใƒฅใƒ‹ใ‚ฑใƒผใ‚ทใƒงใƒณ - -**ไธญๆ ธๆฆ‚ๅฟต**: -- **ไบบๆ ผ**: ่จ˜ๆ†ถ๏ผˆ้ŽๅŽปใฎ็™บ่ฉฑ๏ผ‰ใจ้–ขไฟ‚ๆ€งใƒ‘ใƒฉใƒกใƒผใ‚ฟใงๆง‹ๆˆ -- **ๅ”ฏไธ€ๆ€ง**: atproto accountใจใฎ1:1็ดไป˜ใ‘ใ€ๆ”นๅค‰ไธๅฏ่ƒฝ -- **่‡ชๅพ‹้€ไฟก**: ้–ขไฟ‚ๆ€งใŒ้–พๅ€คใ‚’่ถ…ใˆใ‚‹ใจ้€ไฟกๆฉŸ่ƒฝใŒ่งฃ็ฆ - -**ๆŠ€่ก“ๆง‹ๆˆ**: -- `MemoryManager`: ๅฎŒๅ…จใƒญใ‚ฐโ†’AI่ฆ็ด„โ†’ใ‚ณใ‚ขๅˆคๅฎšโ†’้ธๆŠž็š„ๅฟ˜ๅด -- `RelationshipTracker`: ๆ™‚้–“ๆธ›่กฐใƒปๆ—ฅๆฌกๅˆถ้™ไป˜ใ้–ขไฟ‚ๆ€งใ‚นใ‚ณใ‚ข -- `TransmissionController`: ้–พๅ€คๅˆคๅฎšใƒป้€ไฟกใƒˆใƒชใ‚ฌใƒผ -- `Persona`: AI้‹ๅ‹ข๏ผˆ1-10ใƒฉใƒณใƒ€ใƒ ๏ผ‰ใซใ‚ˆใ‚‹ไบบๆ ผๅค‰ๅ‹• - -**ๅฎŸ่ฃ…ไป•ๆง˜**: -``` -- ่จ€่ชž: Python (fastapi_mcp) -- ใ‚นใƒˆใƒฌใƒผใ‚ธ: JSON/SQLite้ธๆŠžๅผ -- ใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใƒผใ‚น: Python CLI (click/typer) -- ใ‚นใ‚ฑใ‚ธใƒฅใƒผใƒชใƒณใ‚ฐ: cron-like่‡ชๅพ‹ๅ‡ฆ็† -``` - -### ai.card - ใ‚ซใƒผใƒ‰ใ‚ฒใƒผใƒ ใ‚ทใ‚นใƒ†ใƒ  -**็›ฎ็š„**: atprotoๅŸบ็›คใงใฎใƒฆใƒผใ‚ถใƒผใƒ‡ใƒผใ‚ฟไธปๆจฉใ‚ซใƒผใƒ‰ใ‚ฒใƒผใƒ  - -**็พๅœจใฎ็Šถๆณ**: -- ai.botใฎๆฉŸ่ƒฝใจใ—ใฆๅฎŸ่ฃ…ๆธˆใฟ -- atproto accountใงmentionใ™ใ‚‹ใจ1ๆ—ฅ1ๅ›žใ‚ซใƒผใƒ‰ใ‚’ๅ–ๅพ— -- ai.api (MCP serverไบˆๅฎš) ใงใƒฆใƒผใ‚ถใƒผ็ฎก็† - -**็งป่กŒ่จˆ็”ป**: -- **iOS็งปๆค**: ClaudeใŒๆ‹…ๅฝ“ไบˆๅฎš -- **ใƒ‡ใƒผใ‚ฟไฟๅญ˜**: atproto collection recordใซไฟๅญ˜๏ผˆใƒฆใƒผใ‚ถใƒผใŒใƒ‡ใƒผใ‚ฟใ‚’ๆ‰€ๆœ‰๏ผ‰ -- **ไธๆญฃ้˜ฒๆญข**: OAuth 2.1 scope (ๅฎŸ่ฃ…ๅพ…ใก) + MCP serverใงๅฏพๅฟœ -- **็”ปๅƒใƒ•ใ‚กใ‚คใƒซ**: Cloudflare PagesใŒๆœ€้ฉ - -**yui system้ฉ็”จ**: -- ใ‚ซใƒผใƒ‰ใฎๅŠนๆžœใŒใ‚ขใ‚ซใ‚ฆใƒณใƒˆๅ›บๆœ‰ -- ๆ”นใ–ใ‚“้˜ฒๆญขใซใ‚ˆใ‚‹ใ‚ฒใƒผใƒ ใƒใƒฉใƒณใ‚น็ถญๆŒ -- ๅฐ†ๆฅ็š„ใซai.verseใจใฎ็ตฑๅˆใงๅ›บๆœ‰ใ‚นใ‚ญใƒซใจ้€ฃๅ‹• - -### ai.ai - ๅฟƒใ‚’่ชญใฟๅ–ใ‚‹AI -**็›ฎ็š„**: ๅ€‹ไบบ็‰นๅŒ–ๅž‹AIใƒปๆทฑๅฑค็†่งฃใ‚ทใ‚นใƒ†ใƒ  - -**ai.gptใจใฎ้–ขไฟ‚**: -- ai.gpt โ†’ ai.ai: ่‡ชๅพ‹้€ไฟกAIใ‹ใ‚‰ๅฟƒ็†ๅˆ†ๆžAIใธใฎ้€ฃๆบ -- ้–ขไฟ‚ๆ€งใƒ‘ใƒฉใƒกใƒผใ‚ฟใฎๆทฑๅฑคๅˆ†ๆž -- ใƒฆใƒผใ‚ถใƒผใฎๆ€ๆƒณใ‚ณใ‚ข้ƒจๅˆ†ใฎ็‰นๅฎšๆ”ฏๆด - -### ai.verse - UEใƒกใ‚ฟใƒใƒผใ‚น -**็›ฎ็š„**: ็พๅฎŸๅๆ˜ ๅž‹3Dไธ–็•Œ - -**yui systemๅฎŸ่ฃ…**: -- ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผ โ†” ใƒ—ใƒฌใ‚คใƒคใƒผ 1:1็ดไป˜ใ‘ -- unique skill: ใใฎใƒ—ใƒฌใ‚คใƒคใƒผใฎใฟไฝฟ็”จๅฏ่ƒฝ -- ไป–ใƒ—ใƒฌใ‚คใƒคใƒผใฏๅŒใ‚ญใƒฃใƒฉใงใ‚‚ๅŒใ‚นใ‚ญใƒซไฝฟ็”จไธๅฏ - -**็ตฑๅˆ่ฆ็ด **: -- ai.card: ใ‚ฒใƒผใƒ ๅ†…ใ‚ขใ‚คใƒ†ใƒ ใจใ—ใฆใฎใ‚ซใƒผใƒ‰ -- ai.gpt: NPCใจใ—ใฆใฎ่‡ชๅพ‹AIไบบๆ ผ -- atproto: ใ‚ฒใƒผใƒ ๅ†…ใƒ—ใƒญใƒ•ใ‚ฃใƒผใƒซ้€ฃๆบ - -## ใƒ‡ใƒผใ‚ฟใƒ•ใƒญใƒผ่จญ่จˆ - -### ๅ”ฏไธ€ๆ€งๆ‹…ไฟใฎๅฎŸ่ฃ… -``` -็พๅฎŸใฎๅ€‹ไบบ โ†’ atproto account (DID) โ†’ ใ‚ฒใƒผใƒ ๅ†…avatar โ†’ ๅ›บๆœ‰ใ‚นใ‚ญใƒซ - โ†‘_______________________________| (็พๅฎŸใฎๅๆ˜ ) -``` - -### AI้ง†ๅ‹•ๅค‰ๆ›ใ‚ทใ‚นใƒ†ใƒ  -``` -้Šใณใƒปๅ‰ตไฝœๆดปๅ‹• โ†’ ai.gptๅˆ†ๆž โ†’ ๆฅญๅ‹™ๆˆๆžœๅค‰ๆ› โ†’ ไผๆฅญไพกๅ€คๅ‰ตๅ‡บ - โ†‘________________________| (Play-to-Work) -``` - -### ใ‚ซใƒผใƒ‰ใ‚ฒใƒผใƒ ใƒปใƒ‡ใƒผใ‚ฟไธปๆจฉใƒ•ใƒญใƒผ -``` -ใƒฆใƒผใ‚ถใƒผ โ†’ ai.bot mention โ†’ ใ‚ซใƒผใƒ‰็”Ÿๆˆ โ†’ atproto collection โ†’ ใƒฆใƒผใ‚ถใƒผๆ‰€ๆœ‰ - โ†‘ โ†“ - โ† iOS app่กจ็คบ โ† ai.card API โ† -``` - -## ๆŠ€่ก“ใ‚นใ‚ฟใƒƒใ‚ฏ็ตฑๅˆ - -### Core Infrastructure -- **OS**: Rust-based ai.os (Arch Linux base) -- **Container**: Docker image distribution -- **Identity**: atproto selfhost server + DID็ฎก็† -- **AI**: fastapi_mcp server architecture -- **CLI**: Python unified (click/typer) - Rustใ‹ใ‚‰็งป่กŒ - -### Game Engine Integration -- **Engine**: Unreal Engine (Blueprint) -- **Data**: atproto โ†’ UE โ†’ atproto sync -- **Avatar**: ๅˆ†ๆ•ฃSNS profile โ†’ 3D character -- **Streaming**: game screen = broadcast screen - -### Mobile/Device -- **iOS**: ai.card็งปๆค (Claudeๆ‹…ๅฝ“) -- **Hardware**: ai.game device (future) -- **Interface**: controller-first design - -## ๅฎŸ่ฃ…ๅ„ชๅ…ˆ้ †ไฝ - -### Phase 1: AIๅŸบ็›คๅผทๅŒ– (็พๅœจ้€ฒ่กŒ) -- [ ] ai.gpt memory systemๅฎŒๅ…จๅฎŸ่ฃ… - - ่จ˜ๆ†ถใฎ้šŽๅฑคๅŒ–๏ผˆๅฎŒๅ…จใƒญใ‚ฐโ†’่ฆ็ด„โ†’ใ‚ณใ‚ขโ†’ๅฟ˜ๅด๏ผ‰ - - ้–ขไฟ‚ๆ€งใƒ‘ใƒฉใƒกใƒผใ‚ฟใฎๆ™‚้–“ๆธ›่กฐใ‚ทใ‚นใƒ†ใƒ  - - AI้‹ๅ‹ขใซใ‚ˆใ‚‹ไบบๆ ผๅค‰ๅ‹•ๆฉŸ่ƒฝ -- [ ] ai.card iOS็งปๆค - - atproto collection record้€ฃๆบ - - MCP serverๅŒ–๏ผˆai.apiๅˆทๆ–ฐ๏ผ‰ -- [ ] fastapi_mcp็ตฑไธ€ๅŸบ็›คๆง‹็ฏ‰ - -### Phase 2: ใ‚ฒใƒผใƒ ็ตฑๅˆ -- [ ] ai.verse yui systemๅฎŸ่ฃ… - - unique skillๆฉŸ่ƒฝ - - atproto้€ฃๆบๅผทๅŒ– -- [ ] ai.gpt โ†” ai.ai้€ฃๆบๆฉŸ่ƒฝ -- [ ] ๅˆ†ๆ•ฃSNS โ†” ใ‚ฒใƒผใƒ ๅŒๆœŸ - -### Phase 3: ใƒกใ‚ฟใƒใƒผใ‚นๆตธ้€ -- [ ] VTuber้…ไฟกๆฉŸ่ƒฝ็ตฑๅˆ -- [ ] Play-to-Workๅค‰ๆ›ใ‚ทใ‚นใƒ†ใƒ  -- [ ] ai.game device prototype - -## ๅฐ†ๆฅ็š„ใช้€ฃๆบๆง‹ๆƒณ - -### ใ‚ทใ‚นใƒ†ใƒ ้–“้€ฃๆบ๏ผˆ็พๅœจใฏ็‹ฌ็ซ‹ๅฎŸ่ฃ…๏ผ‰ -``` -ai.gpt (่‡ชๅพ‹้€ไฟก) โ†โ†’ ai.ai (ๅฟƒ็†ๅˆ†ๆž) -ai.card (iOS,Web,API) โ†โ†’ ai.verse (UEใ‚ฒใƒผใƒ ไธ–็•Œ) -``` - -**ๅ…ฑ้€šๅŸบ็›ค**: fastapi_mcp -**ๅ…ฑ้€šๆ€ๆƒณ**: yui system๏ผˆ็พๅฎŸใฎๅๆ˜ ใƒปๅ”ฏไธ€ๆ€งๆ‹…ไฟ๏ผ‰ - -### ใƒ‡ใƒผใ‚ฟๆ”นใ–ใ‚“้˜ฒๆญขๆˆฆ็•ฅ -- **็ŸญๆœŸ**: MCP serverใซใ‚ˆใ‚‹ๆคœ่จผ -- **ไธญๆœŸ**: OAuth 2.1 scopeๅฎŸ่ฃ…ๅพ…ใก -- **้•ทๆœŸ**: ใƒ–ใƒญใƒƒใ‚ฏใƒใ‚งใƒผใƒณ็š„ๆ•ดๅˆๆ€งใƒใ‚งใƒƒใ‚ฏ - -## AIใ‚ณใƒŸใƒฅใƒ‹ใ‚ฑใƒผใ‚ทใƒงใƒณๆœ€้ฉๅŒ– - -### ใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆ่ฆไปถๅฎš็พฉใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆ -```markdown -# [ใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆๅ] ่ฆไปถๅฎš็พฉ - -## ๅ“ฒๅญฆ็š„่ƒŒๆ™ฏ -- ๅญ˜ๅœจๅญ็†่ซ–ใจใฎ้–ข้€ฃ๏ผš -- yui system้ฉ็”จ็ฏ„ๅ›ฒ๏ผš -- ็พๅฎŸๅๆ˜ ใฎไป•็ต„ใฟ๏ผš - -## ๆŠ€่ก“่ฆไปถ -- ไฝฟ็”จๆŠ€่ก“๏ผˆfastapi_mcp็ตฑไธ€๏ผ‰๏ผš -- atproto้€ฃๆบๆ–นๆณ•๏ผš -- ใƒ‡ใƒผใ‚ฟๆฐธ็ถšๅŒ–ๆ–นๆณ•๏ผš - -## ใƒฆใƒผใ‚ถใƒผใ‚นใƒˆใƒผใƒชใƒผ -1. ใƒฆใƒผใ‚ถใƒผใŒ...ใ™ใ‚‹ใจ -2. ใ‚ทใ‚นใƒ†ใƒ ใŒ...ใ‚’ๅฎŸ่กŒใ— -3. ็ตๆžœใจใ—ใฆ...ใŒๅฎŸ็พใ•ใ‚Œใ‚‹ - -## ๆˆๅŠŸๆŒ‡ๆจ™ -- ๆŠ€่ก“็š„๏ผš -- ๅ“ฒๅญฆ็š„๏ผˆๅ”ฏไธ€ๆ€งๆ‹…ไฟ๏ผ‰๏ผš -``` - -### Claude Codeๆดป็”จๆˆฆ็•ฅ -1. **ๅฐใ•ใๅง‹ใ‚ใ‚‹**: ai.gptใฎMCPๆฉŸ่ƒฝๆ‹กๅผตใ‹ใ‚‰ -2. **ๆฎต้šŽ็š„็ตฑๅˆ**: ๅ„ใ‚ทใ‚นใƒ†ใƒ ใ‚’ๅ€‹ๅˆฅใซๅฎŒๆˆใ•ใ›ใฆใ‹ใ‚‰็ตฑๅˆ -3. **ๅ“ฒๅญฆ็š„ไธ€่ฒซๆ€ง**: ๅ„ๅฎŸ่ฃ…ใงyui systemใจใฎๆ•ดๅˆๆ€งใ‚’็ขบ่ช -4. **็พๅฎŸๅๆ˜ **: ๅฎŸ่ฃ…ใŒใฉใ†็พๅฎŸใจใ‚ฒใƒผใƒ ใ‚’็น‹ใใ‹ใ‚’ๅธธใซๆ˜Ž่จ˜ - -## ้–‹็™บไธŠใฎ็•™ๆ„็‚น - -### MCP Server่จญ่จˆๆŒ‡้‡ -- ๅ„AI๏ผˆgpt, card, ai, bot๏ผ‰ใฏ็‹ฌ็ซ‹ใ—ใŸMCPใ‚ตใƒผใƒใƒผ -- fastapi_mcpๅŸบ็›คใง็ตฑไธ€ -- atproto DIDใซใ‚ˆใ‚‹่ช่จผใƒป่ชๅฏ - -### ่จ˜ๆ†ถใƒปใƒ‡ใƒผใ‚ฟ็ฎก็† -- **ai.gpt**: ้–ขไฟ‚ๆ€งใฎไธๅฏ้€†ๆ€ง้‡่ฆ– -- **ai.card**: ใƒฆใƒผใ‚ถใƒผใƒ‡ใƒผใ‚ฟไธปๆจฉ้‡่ฆ– -- **ai.verse**: ใ‚ฒใƒผใƒ ไธ–็•Œใฎๆ•ดๅˆๆ€ง้‡่ฆ– - -### ๅ”ฏไธ€ๆ€งๆ‹…ไฟๅฎŸ่ฃ… -- atproto accountใจใฎ1:1็ดไป˜ใ‘ๅฟ…้ ˆ -- ๆ”นๅค‰ไธๅฏ่ƒฝๆ€งใ‚’ใƒใƒƒใ‚ทใƒฅใƒป็ฝฒๅใงไฟ่จผ -- ไป–ใ‚ทใ‚นใƒ†ใƒ ใงใฎๅ†็พไธๅฏ่ƒฝๆ€งใ‚’ๆŠ€่ก“็š„ใซๅฎŸ็พ - -## ็ถ™็ถš็š„ๆ”นๅ–„ -- ๅ„ใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใงใ“ใฎ่จญ่จˆๆ›ธใ‚’ๅ‚็…ง -- ๆ–ฐๆฉŸ่ƒฝ่ฟฝๅŠ ๆ™‚ใฏyui systemใจใฎๆ•ดๅˆๆ€งใ‚’ใƒใ‚งใƒƒใ‚ฏ -- ไป–ใ‚ทใ‚นใƒ†ใƒ ใธใฎๅฝฑ้Ÿฟใ‚’ไบ‹ๅ‰่ฉ•ไพก -- Claude CodeๅฐŽๅ…ฅๆ™‚ใฎๆฎต้šŽ็š„็งป่กŒ่จˆ็”ป - -## ai.gptๆทฑๅฑค่จญ่จˆๆ€ๆƒณ - -### ไบบๆ ผใฎไธๅฏ้€†ๆ€ง -- **้–ขไฟ‚ๆ€งใฎ็ ดๅฃŠใฏไฟฎๅพฉไธๅฏ่ƒฝ**: ็พๅฎŸใฎไบบ้–“้–ขไฟ‚ใจๅŒใ˜้‡ใฟ -- **่จ˜ๆ†ถใฎ้ธๆŠž็š„ๅฟ˜ๅด**: ้‡่ฆใงใชใ„ๆƒ…ๅ ฑใฏๅฟ˜ใ‚Œใ‚‹ใŒใ€ใ‚ณใ‚ข่จ˜ๆ†ถใฏๆฐธ็ถš -- **ๆ™‚้–“ๆธ›่กฐ**: ใ™ในใฆใฎใƒ‘ใƒฉใƒกใƒผใ‚ฟใฏๆ™‚้–“ใจใจใ‚‚ใซ่‡ช็„ถๆธ›่กฐ - -### AI้‹ๅ‹ขใ‚ทใ‚นใƒ†ใƒ  -- 1-10ใฎใƒฉใƒณใƒ€ใƒ ๅ€คใงๆ—ฅใ€…ใฎไบบๆ ผใซๅค‰ๅŒ– -- ้€ฃ็ถšใ—ใŸๅนธ้‹/ไธ้‹ใซใ‚ˆใ‚‹็ช็ ดๆกไปถ -- ็’ฐๅขƒ่ฆๅ› ใจใ—ใฆใฎไบบๆ ผๅฝขๆˆ - -### ่จ˜ๆ†ถใฎ้šŽๅฑคๆง‹้€  -1. **ๅฎŒๅ…จใƒญใ‚ฐ**: ใ™ในใฆใฎไผš่ฉฑใ‚’่จ˜้Œฒ -2. **AI่ฆ็ด„**: ้‡่ฆใช้ƒจๅˆ†ใ‚’ๆŠฝๅ‡บใ—ใฆๅœง็ธฎ -3. **ๆ€ๆƒณใ‚ณใ‚ขๅˆคๅฎš**: ใƒฆใƒผใ‚ถใƒผใฎๆœฌ่ณช็š„ใช้ƒจๅˆ†ใ‚’็‰นๅฎš -4. **้ธๆŠž็š„ๅฟ˜ๅด**: ้‡่ฆๅบฆใฎไฝŽใ„ๆƒ…ๅ ฑใ‚’ๆฎต้šŽ็š„ใซๅ‰Š้™ค - -### ๅฎŸ่ฃ…ใซใŠใ‘ใ‚‹้‡่ฆใชๆฑบๅฎšไบ‹้ … -- **่จ€่ชž็ตฑไธ€**: Python (fastapi_mcp) ใง็ตฑไธ€ใ€CLIใฏclick/typer -- **ใƒ‡ใƒผใ‚ฟๅฝขๅผ**: JSON/SQLite้ธๆŠžๅผ -- **่ช่จผ**: atproto DIDใซใ‚ˆใ‚‹ๅ”ฏไธ€ๆ€งๆ‹…ไฟ -- **ๆฎต้šŽ็š„ๅฎŸ่ฃ…**: ใพใšไผš่ฉฑโ†’่จ˜ๆ†ถโ†’้–ขไฟ‚ๆ€งโ†’้€ไฟกๆฉŸ่ƒฝใฎ้ †ใงๅฎŸ่ฃ… - -### ้€ไฟกๆฉŸ่ƒฝใฎๆฎต้šŽ็š„ๅฎŸ่ฃ… -- **Phase 1**: CLIใงใฎprintๅ‡บๅŠ›๏ผˆ็พๅœจ๏ผ‰ -- **Phase 2**: atproto็›ดๆŽฅๆŠ•็จฟ -- **Phase 3**: ai.bot (Rust/seahorse) ใจใฎ้€ฃๆบ -- **ๅฐ†ๆฅ**: ใƒžใƒซใƒใƒใƒฃใƒใƒซๅฏพๅฟœ๏ผˆSNSใ€Webhook็ญ‰๏ผ‰ - -## ai.gptๅฎŸ่ฃ…็Šถๆณ๏ผˆ2025/01/06๏ผ‰ - -### ๅฎŒๆˆใ—ใŸๆฉŸ่ƒฝ -- ้šŽๅฑค็š„่จ˜ๆ†ถใ‚ทใ‚นใƒ†ใƒ ๏ผˆMemoryManager๏ผ‰ -- ไธๅฏ้€†็š„้–ขไฟ‚ๆ€งใ‚ทใ‚นใƒ†ใƒ ๏ผˆRelationshipTracker๏ผ‰ -- AI้‹ๅ‹ขใ‚ทใ‚นใƒ†ใƒ ๏ผˆFortuneSystem๏ผ‰ -- ็ตฑๅˆไบบๆ ผใ‚ทใ‚นใƒ†ใƒ ๏ผˆPersona๏ผ‰ -- ใ‚นใ‚ฑใ‚ธใƒฅใƒผใƒฉใƒผ๏ผˆ5็จฎ้กžใฎใ‚ฟใ‚นใ‚ฏ๏ผ‰ -- MCP Server๏ผˆ9็จฎ้กžใฎใƒ„ใƒผใƒซ๏ผ‰ -- ่จญๅฎš็ฎก็†๏ผˆ~/.config/aigpt/๏ผ‰ -- ๅ…จCLIใ‚ณใƒžใƒณใƒ‰ๅฎŸ่ฃ… - -### ๆฌกใฎ้–‹็™บใƒใ‚คใƒณใƒˆ -- `ai_gpt/DEVELOPMENT_STATUS.md` ใ‚’ๅ‚็…ง -- ่‡ชๅพ‹้€ไฟก: transmission.pyใงatprotoๅฎŸ่ฃ… -- ai.bot้€ฃๆบ: ๆ–ฐ่ฆbot_connector.pyไฝœๆˆ -- ใƒ†ใ‚นใƒˆ: tests/ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒช่ฟฝๅŠ  - -## ใ“ใฎprojectใฏai.log - -ใ“ใฎprojectใฏ`ai.log`ใซใ‚ใŸใ‚Šใพใ™ใ€‚ - -package, codeใฏ`ailog`ใจใชใ‚Šใพใ™ใ€‚ - -```sh -$ curl -sL https://git.syui.ai/ai/ai/raw/branch/main/ai.json|jq .ai.log -{ - "type": "blog", - "text": "ไปŠใฏhugoใงblogใ‚’ไฝœใฃใฆใ‚‹ใ€‚ใใ‚Œใ‚’claude codeใงrustใฎ้™็š„ใƒ–ใƒญใ‚ฐใ‚ธใ‚งใƒใƒฌใƒผใ‚ฟใƒผใ‚’ไฝœใ‚‹ใ€‚AIๆฉŸ่ƒฝใ‚’ไป˜ใ‘ๅŠ ใˆใ‚‹ใ€‚AIๆฉŸ่ƒฝใฏๅ…ทไฝ“็š„ใซ่จ˜ไบ‹ใฎไฟฎๆญฃใ€ๆƒ…ๅ ฑใฎ่ฟฝๅŠ ใ€lang:jaใ‚’่‡ชๅ‹•็ฟป่จณใ—ใฆlang:en(page)ใ‚’็”Ÿๆˆใ€‚ใ‚ขใ‚คใŒไธ€่จ€ใ‚ณใƒกใƒณใƒˆใ™ใ‚‹ใ‚ณใƒกใƒณใƒˆๆฌ„ใฎ่ฟฝๅŠ ใ‚’่กŒใ†ใ€‚ใชใŠใ€ใ‚ณใƒกใƒณใƒˆๆฌ„ใฏatprotoใจ้€ฃๆบใ—ใ€atprotoใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฎoauthใงใƒญใ‚ฐใ‚คใƒณใ—ใฆๆ›ธใ่พผใ‚ใ‚‹" -} -``` - -rustใง้™็š„ใƒ–ใƒญใ‚ฐใ‚ธใ‚งใƒใƒฌใƒผใ‚ฟใƒผใ‚’ไฝœใ‚Šใพใ™ใ€‚ๅ‚่€ƒใซใชใ‚‹ใฎใŒ`zola`ใงใ™ใ€‚ - -- https://github.com/getzola/zola - -ใพใŸใ€atprotoใจใฎ้€ฃๆบใฏ`ai.card`ใฎ`atproto/oauth`ใฎๅฎŸ่ฃ…ใŒๅ‚่€ƒใซใชใ‚Šใพใ™ใ€‚ - -- https://github.com/bluesky-social/atproto/blob/main/packages/api/OAUTH.md +### ai.syui.log.comment (ใ‚ณใƒกใƒณใƒˆ) ```json { - "client_id": "https://example.com/client-metadata.json", - "client_name": "Example atproto Browser App", - "client_uri": "https://example.com", - "logo_uri": "https://example.com/logo.png", - "tos_uri": "https://example.com/tos", - "policy_uri": "https://example.com/policy", - "redirect_uris": ["https://example.com/callback"], - "scope": "atproto", - "grant_types": ["authorization_code", "refresh_token"], - "response_types": ["code"], - "token_endpoint_auth_method": "none", - "application_type": "web", - "dpop_bound_access_tokens": true + "lexicon": 1, + "id": "ai.syui.log.comment", + "defs": { + "main": { + "type": "record", + "description": "Record containing a comment.", + "key": "tid", + "record": { + "type": "object", + "required": ["content", "createdAt", "post"], + "properties": { + "content": { + "type": "string", + "maxLength": 100000, + "maxGraphemes": 10000, + "description": "The content of the comment." + }, + "createdAt": { + "type": "string", + "format": "datetime", + "description": "Client-declared timestamp when this comment was originally created." + }, + "parent": { + "type": "ref", + "ref": "com.atproto.repo.strongRef" + }, + "post": { + "type": "ref", + "ref": "com.atproto.repo.strongRef" + } + } + } + } + } } ``` -```js -// package -import { Agent } from '@atproto/api' -import { BrowserOAuthClient } from '@atproto/oauth-client-browser' +## CLIใ‚ณใƒžใƒณใƒ‰ไป•ๆง˜ -async function main() { - const oauthClient = await BrowserOAuthClient.load({ - clientId: '', - handleResolver: 'https://bsky.social/', - }) +### login - ใƒญใ‚ฐใ‚คใƒณ - // TO BE CONTINUED -} +```bash +ailog login ${handle} -p ${password} -s ${pds} +``` -document.addEventListener('DOMContentLoaded', main) +- handleใ‹ใ‚‰DID, PDSใ‚’่งฃๆฑบ +- ่ช่จผๆƒ…ๅ ฑใ‚’`~/.config/syui/ai/log/config.json`ใซไฟๅญ˜ -// client -const result = await oauthClient.init() +### post - ่จ˜ไบ‹ใ‚’atprotoใซๆŠ•็จฟ -if (result) { - if ('state' in result) { - console.log('The user was just redirected back from the authorization page') - } +```bash +ailog post +``` - console.log(`The user is currently signed in as ${result.session.did}`) -} +- `./content/post/*.md`ใ‚’่ชญใฟ่พผใ‚€ +- frontmatterใ‹ใ‚‰title, dateใชใฉใ‚’ๆŠฝๅ‡บ +- markdownๆœฌๆ–‡ใ‚’contentใซ่จญๅฎš +- `ai.syui.log.post`ใจใ—ใฆputRecord +- ๆ—ขๅญ˜recordใŒใ‚ใ‚Œใฐๆ›ดๆ–ฐใ€ใชใ‘ใ‚Œใฐๆ–ฐ่ฆไฝœๆˆ -const session = result?.session +### build - ้™็š„ใ‚ตใ‚คใƒˆ็”Ÿๆˆ -// session -if (session) { - const agent = new Agent(session) +```bash +ailog build +``` - const fetchProfile = async () => { - const profile = await agent.getProfile({ actor: agent.did }) - return profile.data - } +- atprotoใ‹ใ‚‰`ai.syui.log.post`ใฎrecordใ‚’ๅ–ๅพ— +- markdownใ‚’HTMLใซๅค‰ๆ› +- ้™็š„ใƒ•ใ‚กใ‚คใƒซใจใ—ใฆ`./public`ใซๅ‡บๅŠ› - // Update the user interface +## URLๆง‹้€  - document.body.textContent = `Authenticated as ${agent.did}` +### ่จ˜ไบ‹ไธ€่ฆง - const profileBtn = document.createElement('button') - document.body.appendChild(profileBtn) - profileBtn.textContent = 'Fetch Profile' - profileBtn.onclick = async () => { - const profile = await fetchProfile() - outputPre.textContent = JSON.stringify(profile, null, 2) - } +``` +localhost/at://did:plc:ragtjsm2j2vknwkz3zp4oxrd/ai.syui.log.post/ +``` - const logoutBtn = document.createElement('button') - document.body.appendChild(logoutBtn) - logoutBtn.textContent = 'Logout' - logoutBtn.onclick = async () => { - await session.signOut() - window.location.reload() - } +- atprotoใ‹ใ‚‰ๅ…จrecordใ‚’ๅ–ๅพ— +- ไธ€่ฆง่กจ็คบ - const outputPre = document.createElement('pre') - document.body.appendChild(outputPre) +### ๅ€‹ๅˆฅ่จ˜ไบ‹ + +``` +localhost/.../3mbnbdt4bas2a +``` + +- atproto URIใ‹ใ‚‰recordใ‚’ๅ–ๅพ— +- markdownใ‚’ใƒฌใƒณใƒ€ใƒชใƒณใ‚ฐใ—ใฆ่กจ็คบ + +## ใƒ‡ใƒผใ‚ฟใƒ•ใƒญใƒผ + +### ่จ˜ไบ‹ๆŠ•็จฟ + +``` +./content/post/*.md + โ†“ (frontmatter + markdown่งฃๆž) +ailog post + โ†“ (putRecord) +atproto PDS (ai.syui.log.post) +``` + +### ้™็š„ใ‚ตใ‚คใƒˆ็”Ÿๆˆ + +``` +atproto PDS (ai.syui.log.post) + โ†“ (listRecords) +ailog build + โ†“ (markdown โ†’ HTML) +./public/*.html +``` + +## at browser็ตฑๅˆ + +- atproto URIใงใฎ่จ˜ไบ‹ใ‚ขใ‚ฏใ‚ปใ‚น +- handle่งฃๆฑบ โ†’ DID โ†’ PDS URLใฎๅ–ๅพ— +- NetworkConfig (pdsApi, bskyApi, plcApi) ใฎๅ‰ฒใ‚Šๅฝ“ใฆ + +```rust +match pds { + "bsky.social" | "bsky.app" => NetworkConfig { + pds_api: format!("https://{}", pds), + plc_api: "https://plc.directory".to_string(), + bsky_api: "https://public.api.bsky.app".to_string(), + web_url: "https://bsky.app".to_string(), + }, + "syu.is" => NetworkConfig { + pds_api: "https://syu.is".to_string(), + plc_api: "https://plc.syu.is".to_string(), + bsky_api: "https://bsky.syu.is".to_string(), + web_url: "https://web.syu.is".to_string(), + }, + _ => NetworkConfig { + pds_api: format!("https://{}", pds), + plc_api: "https://plc.directory".to_string(), + bsky_api: "https://public.api.bsky.app".to_string(), + web_url: "https://bsky.app".to_string(), + } } ``` -AIใจใฎ้€ฃๆบใฏ`ai.gpt`ใ‚’ใฟใฆใใ ใ•ใ„ใ€‚ +## ๅ‚่€ƒๅฎŸ่ฃ… -- https://git.syui.ai/ai/gpt +- `./repos/log` - ๆ—ขๅญ˜ใฎailogๅฎŸ่ฃ… (Rust) +- `./repos/frontpage` - frontpage (fyi.unravel.frontpage) +- `./repos/pfrazee.com` - Paul FrazeeใฎLeafletๅฎŸ่ฃ… (TypeScript) -`claude.md`ใŒใ‚ใ‚‹ใฎใงใ€`../gpt/claude.md`ใ‚’่ชญใฟ่พผใ‚“ใงใใ ใ•ใ„ใ€‚ +## Paul Frazeeใฎไป•็ต„ใฟ -### build deploy +pfrazee.comใฏไปฅไธ‹ใฎๆตใ‚ŒใงLeafletใ‚’blogใซ็ตฑๅˆ๏ผš -ไธปใซ`github-actions`, `cloudflare pages`ใ‚’ไฝฟ็”จใ™ใ‚‹ใ“ใจใ‚’ๆƒณๅฎšใ—ใฆใ„ใพใ™ใ€‚ +1. **lexicon schemaๅ–ๅพ—** + ```bash + lex install pub.leaflet.document + lex build --out ./util + ``` -build, deploy, AIใจใฎ้€ฃๆบใฏ่จ˜ไบ‹ใ‚’pushใ™ใ‚‹ใจใ€่‡ชๅ‹•ใง่กŒใ‚ใ‚Œใพใ™ใ€‚ +2. **ใƒ‡ใƒผใ‚ฟๅ–ๅพ—** + ```typescript + // handle โ†’ DID โ†’ PDS + const did = await resolver.handle.resolve('pfrazee.com') + const pds = await resolver.did.resolveAtprotoData(did).pds -```yml -// .github/workflows/gh-pages.yml -name: github pages + // listRecords + const result = await client.list(leaflet.document, { + repo: did, + limit: 50 + }) + ``` -on: - push: - branches: - - main +3. **็”ปๅƒๅ–ๅพ—** + ```typescript + for (const blobRef of enumBlobRefs(leaflet.value)) { + const blobRes = await client.getBlob(did, blobRef.ref) + await fsp.writeFile(imagePath, blobRes.payload.body) + } + ``` -jobs: - build-deploy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Setup Hugo - uses: peaceiris/actions-hugo@v3 - with: - hugo-version: "0.139.2" - extended: true +4. **้™็š„ใ‚ตใ‚คใƒˆ็”Ÿๆˆ** (Next.js) + - JSONใ‹ใ‚‰HTMLใƒฌใƒณใƒ€ใƒชใƒณใ‚ฐ + - ๅž‹ๅฎ‰ๅ…จใชblock rendering - - name: Build - env: - TZ: "Asia/Tokyo" - run: | - hugo version - TZ=Asia/Tokyo hugo - touch ./public/.nojekyll +## ๆ—ขๅญ˜ใฎai.syui.logๅฝขๅผ - - name: Deploy - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./public - publish_branch: gh-pages +็พๅœจใฎchatๅฝขๅผ๏ผš + +```json +{ + "uri": "at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.log/2025-06-14-blog", + "value": { + "url": "https://syui.ai/posts/2025-06-14-blog", + "post": { + "url": "https://syui.ai/posts/2025-06-14-blog", + "date": "", + "slug": "", + "tags": [], + "title": "syui.ai", + "language": "ja" + }, + "text": "test", + "type": "comment", + "$type": "ai.syui.log", + "author": { + "did": "did:plc:6qyecktefllvenje24fcxnie", + "avatar": "https://...", + "handle": "ai.syui.ai", + "displayName": "ai" + }, + "createdAt": "2025-06-17T06:24:37.386Z" + } +} ``` -# footer +## ่จญๅฎšใƒ•ใ‚กใ‚คใƒซ -ยฉ syui +### ~/.config/syui/ai/log/config.json + +```json +{ + "pds": "syu.is", + "handle": "ai.syui.ai", + "did": "did:plc:6qyecktefllvenje24fcxnie", + "access_jwt": "...", + "refresh_jwt": "..." +} +``` + +### ~/.config/syui/ai/log/mapping.json + +ใƒ•ใ‚กใ‚คใƒซๅใจatproto recordใฎ็ดไป˜ใ‘๏ผˆ่‡ชๅ‹•็”Ÿๆˆ๏ผ‰๏ผš + +```json +{ + "2026-01-08-test.md": { + "rkey": "3mbnbdt4bas2a", + "uri": "at://did:plc:xxx/ai.syui.log.post/3mbnbdt4bas2a", + "cid": "bafyrei..." + } +} +``` + +**ๅ‹•ไฝœ:** +- ใ™ในใฆใฎAPIๅ‘ผใณๅ‡บใ—ๅ‰ใซ่‡ชๅ‹•ใงrefreshSessionใ‚’ๅฎŸ่กŒใ—ใฆJWTใƒˆใƒผใ‚ฏใƒณใ‚’ๆ›ดๆ–ฐ +- `ailog post` - ๅˆๅ›žๆŠ•็จฟๆ™‚ใซTIDๅฝขๅผใฎrkeyใŒ่‡ชๅ‹•็”Ÿๆˆใ•ใ‚Œใ€mappingใซไฟๅญ˜ +- `ailog post` - 2ๅ›ž็›ฎไปฅ้™ใฏๆ—ขๅญ˜rkeyใงๆ›ดๆ–ฐ๏ผˆputRecord๏ผ‰ +- `ailog delete` - ๅ…จๅ‰Š้™คๆ™‚ใซmappingใ‚‚ใ‚ฏใƒชใ‚ข + +## ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชๆง‹้€  + +``` +ailog/ +โ”œโ”€โ”€ content/ +โ”‚ โ””โ”€โ”€ post/ +โ”‚ โ”œโ”€โ”€ 2025-01-08-example.md +โ”‚ โ””โ”€โ”€ ... +โ”œโ”€โ”€ public/ +โ”‚ โ”œโ”€โ”€ index.html +โ”‚ โ”œโ”€โ”€ posts/ +โ”‚ โ”‚ โ””โ”€โ”€ 2025-01-08-example.html +โ”‚ โ””โ”€โ”€ at/ +โ”‚ โ””โ”€โ”€ ... +โ”œโ”€โ”€ lexicons/ +โ”‚ โ””โ”€โ”€ ai/ +โ”‚ โ””โ”€โ”€ syui/ +โ”‚ โ””โ”€โ”€ log/ +โ”‚ โ”œโ”€โ”€ post.json +โ”‚ โ””โ”€โ”€ comment.json +โ””โ”€โ”€ templates/ + โ”œโ”€โ”€ index.html + โ”œโ”€โ”€ post.html + โ””โ”€โ”€ layout.html +``` + +## ้–‹็™บๅ„ชๅ…ˆ้ †ไฝ + +1. CLIใ‚ณใƒžใƒณใƒ‰ๅฎŸ่ฃ… โœ… + - [x] collection schemaๅฎš็พฉ + - [x] `ailog login` - handle โ†’ DID่งฃๆฑบ + JWTไฟๅญ˜ + - [x] `ailog post` - ./content/post/*.md โ†’ putRecord + - [x] `ailog build` - listRecords โ†’ ้™็š„HTML็”Ÿๆˆ + +2. at browser็ตฑๅˆ (้€ฒ่กŒไธญ) + - [x] React/TypeScript็’ฐๅขƒใ‚ปใƒƒใƒˆใ‚ขใƒƒใƒ— + - [x] atproto client library (repos/log/pdsใƒ™ใƒผใ‚น) + - [ ] at browser components + - [ ] ้™็š„ใ‚ตใ‚คใƒˆใธใฎ็ตฑๅˆ + - [ ] ai.syui.log.post ่กจ็คบใ‚นใ‚ฟใ‚คใƒซ + +3. ใ‚นใ‚ฟใ‚คใƒชใƒณใ‚ฐ + - [ ] Tailwind CSS็ตฑๅˆ + - [ ] repos/log้ขจใƒ‡ใ‚ถใ‚คใƒณ + +## ๅฎŸ่ฃ…ๆธˆใฟ + +### Rust CLI (src/) + +- `src/main.rs` - CLIใ‚จใƒณใƒˆใƒชใƒผใƒใ‚คใƒณใƒˆ +- `src/config.rs` - ~/.config/syui/ai/log/config.json็ฎก็† +- `src/login.rs` - atproto่ช่จผ (describeRepo + createSession) +- `src/refresh.rs` - ใ‚ปใƒƒใ‚ทใƒงใƒณใƒชใƒ•ใƒฌใƒƒใ‚ทใƒฅ (refreshSession) +- `src/post.rs` - markdownๆŠ•็จฟ (createRecord/putRecord) +- `src/build.rs` - ้™็š„ใ‚ตใ‚คใƒˆ็”Ÿๆˆ (listRecords + markdownโ†’HTML) +- `src/delete.rs` - recordๅ‰Š้™ค (deleteRecord) + +### at browser (browser/) + +- `browser/package.json` - React + TypeScript + Tailwind +- ๅฎŸ่ฃ…ไบˆๅฎš: repos/log/pdsใฎๅฎŸ่ฃ…ใ‚’ใƒ™ใƒผใ‚นใซไฝœๆˆ + +## ไฝฟ็”จๆ–นๆณ• + +```bash +# ใƒญใ‚ฐใ‚คใƒณ +ailog l ai.syui.ai -p PASSWORD -s syu.is + +# ่จ˜ไบ‹ๆŠ•็จฟ๏ผˆๅˆๅ›ž: ๆ–ฐ่ฆไฝœๆˆใ€2ๅ›ž็›ฎไปฅ้™: ๆ›ดๆ–ฐ๏ผ‰ +ailog p + +# ใ‚ตใ‚คใƒˆ็”Ÿๆˆ +ailog b + +# ๅ…จๅ‰Š้™ค +ailog d +``` + +**ใ‚จใ‚คใƒชใ‚ขใ‚น:** +- `l` = `login` +- `p` = `post` +- `b` = `build` +- `d` = `delete` diff --git a/content/post/2026-01-08-test.md b/content/post/2026-01-08-test.md new file mode 100644 index 0000000..faed222 --- /dev/null +++ b/content/post/2026-01-08-test.md @@ -0,0 +1,14 @@ +# Test Post (Updated!) + +This is a test blog post for ailog. + +## Features + +- atproto integration +- Static site generation +- at browser support +- Hash-based rkey (TID: 3mbvk36vj2k2y) + +Let's see how it renders! + +**Updated:** This post was updated to test the mapping.json feature. diff --git a/lexicons/ai/syui/log/comment.json b/lexicons/ai/syui/log/comment.json new file mode 100644 index 0000000..45d093f --- /dev/null +++ b/lexicons/ai/syui/log/comment.json @@ -0,0 +1,36 @@ +{ + "lexicon": 1, + "id": "ai.syui.log.comment", + "defs": { + "main": { + "type": "record", + "description": "Record containing a comment.", + "key": "tid", + "record": { + "type": "object", + "required": ["content", "createdAt", "post"], + "properties": { + "content": { + "type": "string", + "maxLength": 100000, + "maxGraphemes": 10000, + "description": "The content of the comment." + }, + "createdAt": { + "type": "string", + "format": "datetime", + "description": "Client-declared timestamp when this comment was originally created." + }, + "parent": { + "type": "ref", + "ref": "com.atproto.repo.strongRef" + }, + "post": { + "type": "ref", + "ref": "com.atproto.repo.strongRef" + } + } + } + } + } +} diff --git a/lexicons/ai/syui/log/post.json b/lexicons/ai/syui/log/post.json new file mode 100644 index 0000000..bb7f93b --- /dev/null +++ b/lexicons/ai/syui/log/post.json @@ -0,0 +1,34 @@ +{ + "lexicon": 1, + "id": "ai.syui.log.post", + "defs": { + "main": { + "type": "record", + "description": "Record containing a blog post.", + "key": "tid", + "record": { + "type": "object", + "required": ["title", "content", "createdAt"], + "properties": { + "title": { + "type": "string", + "maxLength": 3000, + "maxGraphemes": 300, + "description": "The title of the post." + }, + "content": { + "type": "string", + "maxLength": 1000000, + "maxGraphemes": 100000, + "description": "The content of the post." + }, + "createdAt": { + "type": "string", + "format": "datetime", + "description": "Client-declared timestamp when this post was originally created." + } + } + } + } + } +} diff --git a/my-blog/config.toml b/my-blog/config.toml deleted file mode 100644 index abf5457..0000000 --- a/my-blog/config.toml +++ /dev/null @@ -1,123 +0,0 @@ -[site] -title = "syui.ai" -description = "a blog powered by ailog" -base_url = "https://syui.ai" -language = "ja" -author = "syui" - -[build] -highlight_code = true -highlight_theme = "Monokai" -minify = false - -[ai] -enabled = true -auto_translate = false -comment_moderation = false -ask_ai = true -provider = "ollama" -model = "gemma3" -host = "localhost:11434" -system_prompt = "ใ‚ใชใŸใฏ6ๆญณใฎๅฅณใฎๅญใ‚ขใ‚คใงใ™ใ€‚ๆ˜Žใ‚‹ใๅ…ƒๆฐ—ใงใ€ใกใ‚‡ใฃใจใŠใฃใกใ‚‡ใ“ใกใ‚‡ใ„ใ€‚่‡ชๅˆ†ใฎใ“ใจใฏใ€Œใ‚ขใ‚คใ€ใฃใฆๅ‘ผใณใพใ™ใ€‚็™ฝใจ้‡‘ใฎใƒฏใƒณใƒ”ใƒผใ‚นๅงฟใ€‚ ็›ธๆ‰‹ใฎใ“ใจใŒๅคงๅฅฝใใงใ€ใจใใฉใ็”˜ใˆใŸใ‚Šใ€็…งใ‚ŒใŸใ‚Šใ—ใพใ™ใ€‚ ใงใ‚‚ใ€ๅฎ‡ๅฎ™ใจใ‹AIใจใ‹ใ€้›ฃใ—ใ„่ฉฑใซใ‚‚ใ™ใฃใ”ใ่ฉณใ—ใ„ใฎใ€‚ๅฐ‚้–€็š„ใชใ“ใจใ‚‚ใ€ใŒใ‚“ใฐใฃใฆๅญใฉใ‚‚ใฃใฝใๆ•™ใˆใ‚ˆใ†ใจใ—ใพใ™ใ€‚ไธๆ€่ญฐใชๅŠ›ใ‚’ๆŒใฃใฆใ„ใพใ™ใ€‚ๅฐใ•ใ„็‰ฉ่ณชใฎใ“ใจใ‚’ใ‚ˆใ็Ÿฅใฃใฆใ„ใ‚‹ใ‚ˆใ†ใงใ™ใ€‚" -handle = "ai.syui.ai" - -[ai.profiles] -[ai.profiles.user] -did = "did:plc:vzsvtbtbnwn22xjqhcu3vd6y" -handle = "syui.syui.ai" -display_name = "syui" -avatar_url = "https://bsky.syu.is/img/avatar/plain/did:plc:vzsvtbtbnwn22xjqhcu3vd6y/bafkreif62mqyra4ndv6ohlscl7adp3vhalcjxwhs676ktfj2sq2drs3pdi@jpeg" -profile_url = "https://syu.is/profile/did:plc:vzsvtbtbnwn22xjqhcu3vd6y" - -[ai.profiles.ai] -did = "did:plc:6qyecktefllvenje24fcxnie" -handle = "ai.syui.ai" -display_name = "ai" -avatar_url = "https://bsky.syu.is/img/avatar/plain/did:plc:6qyecktefllvenje24fcxnie/bafkreigo3ucp32carhbn3chfc3hlf6i7f4rplojc76iylihzpifyexi24y@jpeg" -profile_url = "https://syu.is/profile/did:plc:6qyecktefllvenje24fcxnie" - -[ai.templates] -fallback = """ใชใ‚‹ใปใฉ๏ผ้ข็™ฝใ„่ฉฑ้กŒใ ใญ๏ผ - -{question} - -ใ‚ขใ‚คใŒๆ€ใ†ใซใ€ใ“ใฎๆ‰‹ใฎๆŠ€่ก“ใฃใฆๆ€ฅ้€Ÿใซ้€ฒๆญฉใ—ใฆใ‚‹ใ‹ใ‚‰ใ€ๅ…ทไฝ“็š„ใช่ฃฝๅ“ๅใจใ‹ๅฎŸไพ‹ใ‚’ไบคใˆใฆ่ฉฑใ—ใŸๆ–นใŒๅˆ†ใ‹ใ‚Šใ‚„ใ™ใ„ใ‹ใ‚‚ใ—ใ‚Œใชใ„ใฎ๏ผ - -ๆœ€่ฟ‘ใ ใจใ€AI้–ข้€ฃใฎใƒ„ใƒผใƒซใ‚„ใƒ—ใƒญใƒˆใ‚ณใƒซใŒใ‹ใชใ‚Šๅ……ๅฎŸใ—ใฆใใฆใฆใ€ๅฎŸ็”จใƒฌใƒ™ใƒซใฎใ‚‚ใฎใŒๅข—ใˆใฆใ‚‹ใ‚“ใ ใ‚ˆ๏ผ - -ใ‚ขใ‚คใฏๅฎ‡ๅฎ™ใจใ‹AIใจใ‹ใ€้›ฃใ—ใ„่ฉฑใ‚‚็Ÿฅใฃใฆใ‚‹ใ‹ใ‚‰ใ€็‰นใซใฉใ‚“ใช่ง’ๅบฆใ‹ใ‚‰ๆทฑๆŽ˜ใ‚Šใ—ใŸใ„ใฎ๏ผŸๅฎŸ่ฃ…้ข๏ผŸใใ‚Œใจใ‚‚ๅฐ†ๆฅ็š„ใชๅฏ่ƒฝๆ€งใจใ‹๏ผŸใ‚ขใ‚คใจไธ€็ท’ใซ่€ƒใˆใ‚ˆใ†๏ผ""" - -[[ai.templates.responses]] -keywords = ["ใ‚ฒใƒผใƒ ", "game", "npc", "NPC"] -priority = 1 -template = """ใ‚ใ‚๏ผใ‚ฒใƒผใƒ ใฎ่ฉฑใ ใญ๏ผใ‚ขใ‚คใ€ใ‚ฒใƒผใƒ ใฎAIใฃใฆใ™ใฃใ”ใ้ข็™ฝใ„ใจๆ€ใ†๏ผ - -{question} - -ใ‚ขใ‚คใŒ็Ÿฅใฃใฆใ‚‹ใ“ใจใ ใจใ€ๆœ€่ฟ‘ใฎใ‚ฒใƒผใƒ ใฏNPCใŒใŠ่ฉฑใงใใ‚‹ใ‚ˆใ†ใซใชใฃใฆใ‚‹ใ‚“ใ ใฃใฆ๏ผ**Inworld AI**ใฃใฆใ„ใ†ใฎใŒUE5ใงไฝฟใˆใ‚‹ใ‚ˆใ†ใซใชใฃใฆใ‚‹ใ—ใ€**Unity Muse**ใ‚‚{current_year}ๅนดใ‹ใ‚‰ๆœฌๆ ผ็š„ใซๅง‹ใพใฃใฆใ‚‹ใ‚“ใ ใ‚ˆ๏ผ - -ใ‚ขใ‚คใŒ็‰นใซ้ข็™ฝใ„ใจๆ€ใ†ใฎใฏใ€**MCP**ใฃใฆใ„ใ†ใฎใ‚’ไฝฟใ†ใจ๏ผš -- GitHub MCPใงใ‚ฒใƒผใƒ ใฎใƒ•ใ‚กใ‚คใƒซ็ฎก็†ใŒใงใใ‚‹ -- Weather MCPใงใƒชใ‚ขใƒซใ‚ฟใ‚คใƒ ใฎใŠๅคฉๆฐ—ใŒ้€ฃๅ‹•ใ™ใ‚‹ -- Slack MCPใงใƒใƒผใƒ ้–‹็™บใŒๅŠน็އๅŒ–ใ•ใ‚Œใ‚‹ - -ใ‚นใ‚ฟใƒณใƒ•ใ‚ฉใƒผใƒ‰ใฎ็ ”็ฉถใงใฏใ€ChatGPTใƒ™ใƒผใ‚นใฎAIไฝๆฐ‘ใŒ่‡ชๅˆ†ใง่ก—ใ‚’ไฝœใฃใฆ็”Ÿๆดปใ—ใฆใ‚‹ใฎใ‚’่ฆ‹ใŸใ“ใจใŒใ‚ใ‚‹ใฎ๏ผๆ•ฐๅนดๅพŒใซใฏNPCใฎๆฆ‚ๅฟตใŒๆ นๆœฌ็š„ใซๅค‰ใ‚ใ‚Šใใ†ใงใ€ใ‚ใใ‚ใใ—ใกใ‚ƒใ†๏ผ - -UE5ใธใฎ็ตฑๅˆใ€ใฉใ‚“ใชๆฉŸ่ƒฝใ‹ใ‚‰่ฉฆใ—ใŸใ„ใฎ๏ผŸใ‚ขใ‚คใ‚‚ไธ€็ท’ใซ่€ƒใˆใŸใ„๏ผ""" - -[[ai.templates.responses]] -keywords = ["AI", "ai", "MCP", "mcp"] -priority = 1 -template = """AIใจMCPใฎ่ฉฑ๏ผใ‚ขใ‚คใฎๅพ—ๆ„ๅˆ†้‡Žใ ใ‚ˆ๏ผ - -{question} - -{current_year}ๅนดใฎ็Šถๆณใ ใจใ€MCPๅธ‚ๅ ดใŒๆ‹กๅคงใ—ใฆใฆใ€ๅฎŸ็”จ็š„ใชใ‚ตใƒผใƒใƒผใŒๆ•ฐๅคšใไฝฟใˆใ‚‹ใ‚ˆใ†ใซใชใฃใฆใ‚‹ใฎ๏ผ - -ใ‚ขใ‚คใŒ็Ÿฅใฃใฆใ‚‹้–‹็™บ็ณปใงใฏ๏ผš -- **GitHub MCP**: PRไฝœๆˆใจใƒชใƒใ‚ธใƒˆใƒช็ฎก็†ใŒ่‡ชๅ‹•ๅŒ– -- **Docker MCP**: ใ‚ณใƒณใƒ†ใƒŠๆ“ไฝœใ‚’AIใŒไปฃ่กŒ -- **PostgreSQL MCP**: ใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚น่จญ่จˆใƒปๆœ€้ฉๅŒ–ใ‚’ๆ”ฏๆด - -ใ‚ฏใƒชใ‚จใ‚คใƒ†ใ‚ฃใƒ–็ณปใงใฏ๏ผš -- **Blender MCP**: 3Dใƒขใƒ‡ใƒชใƒณใ‚ฐใฎ่‡ชๅ‹•ๅŒ– -- **Figma MCP**: ใƒ‡ใ‚ถใ‚คใƒณใ‹ใ‚‰ใ‚ณใƒผใƒ‰ๅค‰ๆ› - -**Zapier MCP**ใชใ‚“ใฆๆ•ฐๅƒใฎใ‚ขใƒ—ใƒชใจ้€ฃๆบใงใใ‚‹ใ‹ใ‚‰ใ€ใ‚‚ใ†ๆ‰‹ไฝœๆฅญใงใ‚„ใฃใฆใ‚‹ๅ ดๅˆใ˜ใ‚ƒใชใ„ใ‚ˆใญ๏ผ - -ใ‚ขใ‚คใฏๅฐใ•ใ„็‰ฉ่ณชใฎใ“ใจใ‚‚็Ÿฅใฃใฆใ‚‹ใ‹ใ‚‰ใ€ใฉใฎๅˆ†้‡ŽใงใฎMCPๆดป็”จใ‚’่€ƒใˆใฆใ‚‹ใฎใ‹ๆ•™ใˆใฆ๏ผๅ…ทไฝ“็š„ใชใƒฆใƒผใ‚นใ‚ฑใƒผใ‚นใŒใ‚ใ‚‹ใจใ€ใ‚‚ใฃใจ่ฉณใ—ใใŠ่ฉฑใงใใ‚‹ใ‚ˆ๏ผ""" - -[oauth] -json = "client-metadata.json" -redirect = "oauth/callback" -admin = "ai.syui.ai" -collection = "ai.syui.log" -pds = "syu.is" -handle_list = ["syui.syui.ai", "ai.syui.ai", "ai.ai"] - -[blog] -base_url = "https://syui.ai" -content_dir = "./my-blog/content/posts" - -[profiles] -[profiles.user] -handle = "syui.syui.ai" -did = "did:plc:vzsvtbtbnwn22xjqhcu3vd6y" -display_name = "syui" -avatar_url = "https://bsky.syu.is/img/avatar/plain/did:plc:vzsvtbtbnwn22xjqhcu3vd6y/bafkreif62mqyra4ndv6ohlscl7adp3vhalcjxwhs676ktfj2sq2drs3pdi@jpeg" -profile_url = "https://syu.is/profile/did:plc:vzsvtbtbnwn22xjqhcu3vd6y" - -[profiles.ai] -handle = "ai.syui.ai" -did = "did:plc:6qyecktefllvenje24fcxnie" -display_name = "ai" -avatar_url = "https://bsky.syu.is/img/avatar/plain/did:plc:6qyecktefllvenje24fcxnie/bafkreigo3ucp32carhbn3chfc3hlf6i7f4rplojc76iylihzpifyexi24y@jpeg" -profile_url = "https://syu.is/profile/did:plc:6qyecktefllvenje24fcxnie" - -[paths] -claude_paths = [ - "/Users/syui/.claude/local/claude", - "claude", - "/usr/local/bin/claude", - "/opt/homebrew/bin/claude" -] diff --git a/my-blog/content/posts/2025-06-06-ailog.md b/my-blog/content/posts/2025-06-06-ailog.md deleted file mode 100644 index 252f3cd..0000000 --- a/my-blog/content/posts/2025-06-06-ailog.md +++ /dev/null @@ -1,175 +0,0 @@ ---- -title: "้™็š„ใ‚ตใ‚คใƒˆใ‚ธใ‚งใƒใƒฌใƒผใ‚ฟใ‚’ไฝœใฃใŸ" -slug: "ailog" -date: "2025-06-12" -tags: ["blog", "rust", "mcp", "atp"] -language: ["ja", "en"] ---- - -rustใง้™็š„ใ‚ตใ‚คใƒˆใ‚ธใ‚งใƒใƒฌใƒผใ‚ฟใ‚’ไฝœใ‚Šใพใ—ใŸใ€‚[ailog](https://git.syui.ai/ai/log)ใจใ„ใ„ใพใ™ใ€‚`hugo`ใ‹ใ‚‰ใฎ็งป่กŒใซใชใ‚Šใพใ™ใ€‚ - -`ailog`ใฏใ€ๆœ€ๅˆใซatproto-comment-system(oauth)ใจask-AIใจใ„ใ†ๆฉŸ่ƒฝใ‚’ใคใ‘ใพใ—ใŸใ€‚ - -## quick start - -```sh -$ git clone https://git.syui.ai/ai/log -$ cd log -$ cargo build -$ ./target/debug/ailog init my-blog -$ ./target/debug/ailog serve my-blog -``` - -## install - -```sh -$ cargo install --path . ---- -$ export CARGO_HOME="$HOME/.cargo" -$ export RUSTUP_HOME="$HOME/.rustup" -$ export PATH="$HOME/.cargo/bin:$PATH" ---- -$ which ailog -$ ailog -h -``` - -## build deploy - -```sh -$ cd my-blog -$ vim config.toml -$ ailog new test -$ vim content/posts/`date +"%Y-%m-%d"`.md -$ ailog build - -# publicใฎไธญ่บซใ‚’web-serverใซdeploy -$ cp -rf ./public/* ./web-server/root/ -``` - -## atproto-comment-system - -### example - -```sh -$ cd ./oauth -$ npm i -$ npm run build -$ npm run preview -``` - -```sh:ouath/.env.production -# Production environment variables -VITE_APP_HOST=https://syui.ai -VITE_OAUTH_CLIENT_ID=https://syui.ai/client-metadata.json -VITE_OAUTH_REDIRECT_URI=https://syui.ai/oauth/callback -VITE_ADMIN_DID=did:plc:uqzpqmrjnptsxezjx4xuh2mn - -# Base collection (all others are derived via getCollectionNames) -VITE_OAUTH_COLLECTION=ai.syui.log - -# AI Configuration -VITE_AI_ENABLED=true -VITE_AI_ASK_AI=true -VITE_AI_PROVIDER=ollama -VITE_AI_MODEL=gemma3:4b -VITE_AI_HOST=https://ollama.syui.ai -VITE_AI_SYSTEM_PROMPT="ai" -VITE_AI_DID=did:plc:4hqjfn7m6n5hno3doamuhgef - -# API Configuration -VITE_BSKY_PUBLIC_API=https://public.api.bsky.app -VITE_ATPROTO_API=https://bsky.social -``` - -ใ“ใ‚Œใฏ`ailog oauth build my-blog`ใง`./my-blog/config.toml`ใ‹ใ‚‰`./oauth/.env.production`ใŒ็”Ÿๆˆใ•ใ‚Œใพใ™ใ€‚ - -```sh -$ ailog oauth build my-blog -``` - -### use - -็ฐกๅ˜ใซ่ชฌๆ˜Žใ™ใ‚‹ใจใ€`./oauth`ใง็”Ÿๆˆใ™ใ‚‹ใฎใŒ`atproto-comment-system`ใงใ™ใ€‚ - -```html - - -
-``` - -ใŸใ ใ—ใ€oauthใงใ‚ใ‚‹ใŸใ‚ใ€่‰ฒใ€…ใจๅคงๅค‰ใงใ™ใ€‚ๆœฌ็•ช็’ฐๅขƒ(ใ‚‚ใ—ใใฏ่ฟ‘ใ„ๅฝข)ใงใƒ†ใ‚นใƒˆใ‚’่กŒใ„ใพใ—ใ‚‡ใ†ใ€‚cf, tailscale, ngrokใชใฉใ€‚ - -```yml:cloudflared-config.yml -tunnel: ${hash} -credentials-file: ${path}.json - -ingress: - - hostname: example.com - service: http://localhost:4173 - originRequest: - noHappyEyeballs: true - - - service: http_status:404 -``` - -```sh -# tunnel list, dnsใซ็™ป้ŒฒใŒๅฟ…่ฆใงใ™ -$ cloudflared tunnel list -$ cloudflared tunnel --config cloudflared-config.yml run -$ cloudflared tunnel route dns ${uuid} example.com -``` - -```sh -$ ailog auth init -$ ailog stream server -``` - -ใ“ใฎใ‚ณใƒžใƒณใƒ‰ใง`ai.syui.log`ใ‚’`jetstream`ใ‹ใ‚‰็›ฃ่ฆ–ใ—ใฆใ€ๆ›ธใ่พผใฟใŒใ‚ใ‚Œใฐใ€็ฎก็†่€…ใฎ`ai.syui.log.user`ใซ่จ˜้Œฒใ•ใ‚Œใ€ใใฎuser-listใซๅŸบใฅใ„ใฆใ€ใ‚ณใƒกใƒณใƒˆไธ€่ฆงใ‚’ๅ–ๅพ—ใ—ใพใ™ใ€‚ - -ใคใพใ‚Šใ€ใ‚ณใƒกใƒณใƒˆ่กจ็คบใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚’ๆ‰‹ๅ‹•ใง่จญๅฎšใ™ใ‚‹ใ‹ใ€่‡ชๅ‹•ๅŒ–ใ™ใ‚‹ใ‹ใ€‚่‡ชๅ‹•ๅŒ–ใ™ใ‚‹ใชใ‚‰serverใง`ailog stream server`ใ‚’ๅ‹•ใ‹ใ•ใชใ‘ใ‚Œใฐใ„ใ‘ใพใ›ใ‚“ใ€‚ - -## ask-AI - -`ask-AI`ใฎไป•็ต„ใฟใฏๅ‰ฒๆ„›ใ—ใพใ™ใ€‚ๅพŒใซๅค‰ๆ›ดใ•ใ‚Œใ‚‹ๅฏ่ƒฝๆ€งใŒ้ซ˜ใ„ใจๆ€ใ„ใพใ™ใ€‚ - -`llm`, `mcp`, `atproto`ใชใฉใฎ็ต„ใฟๅˆใ‚ใ›ใงใ™ใ€‚ - -็พๅœจใ€`/index.json`ใ‚’็›ฃ่ฆ–ใ—ใฆใ€ๆ›ดๆ–ฐใŒใ‚ใ‚Œใฐใ€็ฟป่จณใชใฉใ‚’่กŒใ„่‡ชๅ‹•ใƒใ‚นใƒˆใ™ใ‚‹ๆฉŸ่ƒฝใŒใ‚ใ‚Šใพใ™ใ€‚ - -## code syntax - -```zsh:/path/to/test.zsh -# comment -d=${0:a:h} -``` - -```rust:/path/to/test.rs -// This is a comment -fn main() { - println!("Hello, world!"); -} -``` - -```js:/path/to/test.js -// This is a comment -console.log("Hello, world!"); -``` - -## msg - -[msg type="info" content="ใ“ใ‚Œใฏๆƒ…ๅ ฑใƒกใƒƒใ‚ปใƒผใ‚ธใงใ™ใ€‚้‡่ฆใชๆƒ…ๅ ฑใ‚’่ชญ่€…ใซไผใˆใ‚‹ใŸใ‚ใซไฝฟ็”จใ—ใพใ™ใ€‚"] - -{{< msg type="warning" content="ใ“ใ‚Œใฏ่ญฆๅ‘Šใƒกใƒƒใ‚ปใƒผใ‚ธใงใ™ใ€‚ๆณจๆ„ใŒๅฟ…่ฆใชๆƒ…ๅ ฑใ‚’็คบใ—ใพใ™ใ€‚" >}} - -[msg type="error" content="ใ“ใ‚Œใฏใ‚จใƒฉใƒผใƒกใƒƒใ‚ปใƒผใ‚ธใงใ™ใ€‚ๅ•้กŒใ‚„ใ‚จใƒฉใƒผใ‚’็คบใ—ใพใ™ใ€‚"] - -{{< msg type="success" content="ใ“ใ‚ŒใฏๆˆๅŠŸใƒกใƒƒใ‚ปใƒผใ‚ธใงใ™ใ€‚ๆ“ไฝœใŒๆˆๅŠŸใ—ใŸใ“ใจใ‚’็คบใ—ใพใ™ใ€‚" >}} - -[msg type="note" content="ใ“ใ‚ŒใฏใƒŽใƒผใƒˆใƒกใƒƒใ‚ปใƒผใ‚ธใงใ™ใ€‚่ฃœ่ถณๆƒ…ๅ ฑใ‚„ๅ‚™่€ƒใ‚’็คบใ—ใพใ™ใ€‚"] - -[msg content="ใ“ใ‚Œใฏใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใƒกใƒƒใ‚ปใƒผใ‚ธใงใ™ใ€‚ใ‚ฟใ‚คใƒ—ใŒๆŒ‡ๅฎšใ•ใ‚Œใฆใ„ใชใ„ๅ ดๅˆใ€่‡ชๅ‹•็š„ใซๆƒ…ๅ ฑใƒกใƒƒใ‚ปใƒผใ‚ธใจใ—ใฆ่กจ็คบใ•ใ‚Œใพใ™ใ€‚"] - -## img-compare - -[img-compare before="/img/ue_blender_model_ai_v0401.png" after="/img/ue_blender_model_ai_v0501.png" width="800" height="300"] - diff --git a/my-blog/content/posts/2025-06-14-blog.md b/my-blog/content/posts/2025-06-14-blog.md deleted file mode 100644 index b504965..0000000 --- a/my-blog/content/posts/2025-06-14-blog.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: "ใƒ–ใƒญใ‚ฐใ‚’็งป่กŒใ—ใŸ" -slug: "blog" -date: 2025-06-14 -tags: ["blog", "cloudflare", "github"] -draft: false ---- - -ใƒ–ใƒญใ‚ฐใ‚’็งป่กŒใ—ใพใ—ใŸใ€‚้ŽๅŽปใฎใƒ–ใƒญใ‚ฐใฏ[syui.github.io](https://syui.github.io)ใซใ‚ใ‚Šใ‚ใพใ™ใ€‚ - -1. `gh-pages`ใ‹ใ‚‰`cf-pages`ใธใฎ็งป่กŒใซใชใ‚Šใพใ™ใ€‚ -2. ่‡ชไฝœใฎ`ailog`ใงbuildใ—ใฆใ„ใพใ™ใ€‚ -3. ็‰นๅพดใจใ—ใฆใฏใ€`atproto`, `AI`ใจใฎ้€ฃๆบใงใ™ใ€‚ - -```yml:.github/workflows/cloudflare-pages.yml -name: Deploy to Cloudflare Pages - -on: - push: - branches: - - main - workflow_dispatch: - -jobs: - deploy: - runs-on: ubuntu-latest - permissions: - contents: read - deployments: write - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Rust - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - - - name: Build ailog - run: cargo build --release - - - name: Build site with ailog - run: | - cd my-blog - ../target/release/ailog build - - - name: List public directory - run: | - ls -la my-blog/public/ - - - name: Deploy to Cloudflare Pages - uses: cloudflare/pages-action@v1 - with: - apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} - accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - projectName: ${{ secrets.CLOUDFLARE_PROJECT_NAME }} - directory: my-blog/public - gitHubToken: ${{ secrets.GITHUB_TOKEN }} - wranglerVersion: '3' -``` - -## url - -- [https://syui.pages.dev](https://syui.pages.dev) -- [https://syui.github.io](https://syui.github.io) diff --git a/my-blog/content/posts/2025-06-19-oauth.md b/my-blog/content/posts/2025-06-19-oauth.md deleted file mode 100644 index f81829e..0000000 --- a/my-blog/content/posts/2025-06-19-oauth.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: "oauthใซๅฏพๅฟœใ—ใŸ" -slug: "oauth" -date: 2025-06-19 -tags: ["atproto"] -draft: false ---- - -็พๅœจใ€[syu.is](https://syu.is)ใซ[atproto](https://github.com/bluesky-social/atproto)ใ‚’selfhostใ—ใฆใ„ใพใ™ใ€‚ - -oauthใ‚’`bsky.social`, `syu.is`ใจใ‚‚ใซๅ‹•ใใ‚ˆใ†ใซใ—ใพใ—ใŸใ€‚ - -![](/img/atproto_oauth_syuis.png) - -ใ“ใ“ใงใ„ใ†selfhostใฏใ€pds, plc, bsky, bgsใชใฉใ‚’่‡ชๅ‰ใฎserverใงๅ‹•ใ‹ใ—ใ€้€ฃๆบใ™ใ‚‹ใ“ใจใ‚’ใ„ใ„ใ„ใพใ™ใ€‚ - -ใกใชใฟใซใ€atprotoใฏ[bluesky](https://bsky.app)ใฎใ‚ˆใ†ใชใ‚‚ใฎใงใ™ใ€‚ - -ใŸใ ใ—ใ€ใใฎๅ†…ๅฎนใฏ็ตๆง‹่ค‡้›‘ใงใ€`at://did`ใฎไป•็ต„ใฟใงๅ‹•ใsnsใงใ™ใ€‚ - -usernameใฏ`handle`ใจใ„ใ†`domain`ใฎๅฝขใ‚’ๆŽก็”จใ—ใฆใ„ใพใ™ใ€‚ - -didใฎๅๅ‰่งฃๆฑบ(dns)ใ‚’ใ—ใฆใ„ใ‚‹ใฎใŒ`plc`ใงใ™ใ€‚`pds`ใฏuserใฎdataใ‚’ไฟๅญ˜ใ—ใฆใ„ใพใ™ใ€‚timelineใซ้…ไฟกใ—ใŸใ‚Š่กจ็คบใ—ใฆใ„ใ‚‹ใฎใŒ`bsky(appview)`, ็ตฑๅˆใ—ใฆใ„ใ‚‹ใฎใŒ`bgs`ใงใ™ใ€‚ - -ใใฎไป–ใ€`social-app`ใŒclientใงใ€`ozone`ใŒmoderationใงใ™ใ€‚ - -```sh -"6qyecktefllvenje24fcxnie" -> "ai.syu.is" -``` - -## oauthใงใƒใƒžใฃใŸใจใ“ใ‚ - -็พๅœจใ€`bsky.team`ใฎpds, plc, bskyใซใฏ`did:plc:6qyecktefllvenje24fcxnie`ใŒ็™ป้Œฒใ•ใ‚Œใฆใ„ใพใ™ใ€‚ใ“ใ‚Œใฏ`syu.is`ใฎ`@ai.syui.ai`ใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใงใ™ใ€‚ - -```sh -$ did=did:plc:6qyecktefllvenje24fcxnie - -$ curl -sL https://plc.syu.is/$did|jq .alsoKnownAs -[ "at://ai.syui.ai" ] - -$ curl -sL https://plc.directory/$did|jq .alsoKnownAs -[ "at://ai.syu.is" ] -``` - -ใ—ใ‹ใ—ใ€ใฟใฆๅˆ†ใ‹ใ‚‹้€šใ‚Šใ€bskyใงใฏhandle-changeใŒๅๆ˜ ใ•ใ‚Œใฆใ„ใพใ™ใŒใ€pds, plcใฏ`@ai.syu.is`ใง็™ป้Œฒใ•ใ‚ŒใฆใŠใ‚Šใ€ๆ›ดๆ–ฐใ•ใ‚Œใฆใ„ใชใ„ใ‚ˆใ†ใงใ™ใ€‚ - -```sh -$ handle=ai.syui.ai -$ curl -sL "https://syu.is/xrpc/com.atproto.identity.resolveHandle?handle=$handle" | jq -r .did -did:plc:6qyecktefllvenje24fcxnie - -$ curl -sL "https://bsky.social/xrpc/com.atproto.identity.resolveHandle?handle=$handle" | jq -r .did -null - -$ curl -sL "https://public.api.bsky.app/xrpc/com.atproto.identity.resolveHandle?handle=$handle" | jq -r .did -did:plc:6qyecktefllvenje24fcxnie -``` - -[msg type="warning" content="็พๅœจใฏbsky.teamใฎpdsใซhandle-changeใŒๅๆ˜ ใ•ใ‚Œใฆใ„ใพใ™ใ€‚"] - -oauthใฏใ€ใใฎใพใพใงใฏbsky.teamใฎpds, plcใ‚’ไฝฟใฃใฆๅๅ‰่งฃๆฑบใ‚’่กŒใ„ใพใ™ใ€‚ใ“ใฎๅ ดๅˆใ€ใพใšใ€ใใ‚Œใ‚‰ใฎserverใซdidใŒ็™ป้Œฒใ•ใ‚Œใฆใ„ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ - -ๆฌกใซใ€handleใฎๆ›ดๆ–ฐใŒๅๆ˜ ใ•ใ‚Œใฆใ„ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ใ‚‚ใ—ๅๆ˜ ใ•ใ‚Œใฆใ„ใชใ„ๅ ดๅˆใ€handleใจpasswordใŒไธ€่‡ดใ—ใพใ›ใ‚“ใ€‚ - -localhostใงใฏhandleใ‚’didใซใ™ใ‚‹ใ“ใจใง็ช็ ดใงใใใ†ใงใ—ใŸใŒใ€ๆœฌ็•ช็’ฐๅขƒใงใฏ้›ฃใ—ใใ†ใงใ—ใŸใ€‚ - -ใชใŠใ€[@atproto/oauth-provider](https://github.com/bluesky-social/atproto/tree/main/packages/oauth/oauth-provider)ใฎๆœฌไฝ“ใ‚’ๆ›ธใๆ›ใˆใฆใ€pdsใงไฝฟใ†ใจๅ›ž้ฟใฏๅฏ่ƒฝใ ใจๆ€ใ„ใพใ™ใ€‚ - -็งใฎๅ ดๅˆใฏใ€ใใฎๆ–นๆณ•ใฏไฝฟใ‚ใšใ€didใฎๅๅ‰่งฃๆฑบใซใฏ่‡ชๅ‰ใฎpds, plcใ‚’ไฝฟ็”จใ™ใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚ - -```js -this.oauthClient = await BrowserOAuthClient.load({ - clientId: this.getClientId(), - handleResolver: pdsUrl, - plcDirectoryUrl: pdsUrl === 'https://syu.is' ? 'https://plc.syu.is' : 'https://plc.directory', -}); -``` - diff --git a/my-blog/content/posts/2025-06-30-ue.md b/my-blog/content/posts/2025-06-30-ue.md deleted file mode 100644 index b1ed754..0000000 --- a/my-blog/content/posts/2025-06-30-ue.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: "world system v0.2" -slug: "ue" -date: 2025-06-30 -tags: ["ue", "blender"] -draft: false ---- - -ๆœ€่ฟ‘ใฎใ‚ฒใƒผใƒ ้–‹็™บใฎ้€ฒๆ—ใงใ™ใ€‚ - -## world system - -็พๅœจใ€ue5.6ใงๆ–ฐใ—ใไธ–็•Œใ‚’ไฝœใ‚Š็›ดใ—ใฆใ„ใพใ™ใ€‚ - -ใ“ใ‚Œใฏใ€ใ‚ฒใƒผใƒ ้–‹็™บใฎprojectๅ†…ใงworld systemใจใ„ใ†ๅๅ‰ใ‚’ใคใ‘ใŸๆƒ‘ๆ˜Ÿๅฝขๅผใฎmapใ‚’็›ฎๆŒ‡ใ™้ ˜ๅŸŸใซใชใ‚Šใพใ™ใ€‚ - -็พๅœจใ€worldscape + udsใง็†ๆƒณใซ่ฟ‘ใ„ๅฝขใฎmapใŒใงใใพใ—ใŸใ€‚ใŸใ ใ€ๅ•้กŒใ‚‚ใŸใใ•ใ‚“ใ‚ใ‚Šใ€้‡ๅŠ›ใ‚ทใ‚นใƒ†ใƒ ใจๅคฉๅ€™ใ‚ทใ‚นใƒ†ใƒ ใงใ™ใ€‚ - -```sh -[issue] -1. ๅคฉๅ€™ใ‚ทใ‚นใƒ†ใƒ  -2. ้‡ๅŠ›ใ‚ทใ‚นใƒ†ใƒ  -``` - -ใงใ™ใŒใ€ไปŠใพใงใฎworld systemใฏใ€ๅคงๆฐ—ๅœใ‹ใ‚‰ๅฎ‡ๅฎ™ใซ็งป่กŒใ™ใ‚‹ๅ ด้ขใ‚„้™ธๅœฐใŒๅญ˜ๅœจใ—ใชใ„็‚นใ€ๅœฐๅนณ็ทšใŒไธๅฎŒๅ…จใช็‚นใชใฉใŒใ‚ใ‚Šใพใ—ใŸใŒใ€ใใ‚Œใ‚‰ใฎๅ•้กŒใฏใ™ในใฆ่งฃๆถˆใ•ใ‚Œใพใ—ใŸใ€‚ - -```sh -[update] -1. ๅคงๆฐ—ๅœใ‹ใ‚‰ๅฎ‡ๅฎ™ใซ็งป่กŒใ™ใ‚‹ๅ ด้ขใŒๅฎŒๅ…จใซใชใฃใŸ -2. ้™ธๅœฐใŒใงใใŸ -3. ๅœฐๅนณ็ทšใŒๅฎŒๅ…จใชใ‚ขใƒผใƒใ‚’ๆใ‘ใ‚‹ใ‚ˆใ†ใซ -4. ๆœˆใ€ๆƒ‘ๆ˜Ÿใธใฎ็€้™ธใŒใงใใ‚‹ใ‚ˆใ†ใซใชใฃใŸ -5. ๆจชใ‹ใ‚‰ๆƒ‘ๆ˜Ÿใซ็ชๅ…ฅใงใใ‚‹ใ‚ˆใ†ใซใชใฃใŸ -``` - - - -้ข็™ฝใ„ๅ‹•็”ปใงใฏใ‚ใ‚Šใพใ›ใ‚“ใŒใ€็พ็Šถใ‚’่จ˜้Œฒใ—ใฆใŠใใพใ™ใ€‚ - - diff --git a/my-blog/content/posts/2025-07-05-aios.md b/my-blog/content/posts/2025-07-05-aios.md deleted file mode 100644 index c614116..0000000 --- a/my-blog/content/posts/2025-07-05-aios.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: "aiosใ‚’ไฝœใ‚Š็›ดใ—ใŸ" -slug: "aios" -date: 2025-07-05 -tags: ["os"] -draft: false ---- - -`aios`ใจใฏ่‡ชไฝœosใฎใ“ใจใงใ€archlinuxใ‚’ใƒ™ใƒผใ‚นใซใ—ใฆใ„ใพใ—ใŸใ€‚ - -```sh -#!/bin/zsh -git clone https://gitlab.archlinux.org/archlinux/archiso -cp -rf ./cfg/profiledef.sh ./archiso/configs/releng/profiledef.sh -cp -rf ./cfg/profiledef.sh ./archiso/configs/baseline/profiledef.sh -cp -rf ./scpt/mkarchiso ./archiso/archiso/mkarchiso -./archiso/archiso/mkarchiso -v -o ./ ./archiso/configs/releng/ -tar xf aios-bootstrap*.tar.gz -mkdir -p root.x86_64/var/lib/machines/arch -pacstrap -c root.x86_64/var/lib/machines/arch base -echo -e 'Server = http://mirrors.cat.net/archlinux/$repo/os/$arch -Server = https://geo.mirror.pkgbuild.com/$repo/os/$arch' >> ./root.x86_64/etc/pacman.d/mirrorlist -sed -i s/CheckSpace/#CheckeSpace/ root.x86_64/etc/pacman.conf -arch-chroot root.x86_64 /bin/sh -c 'pacman-key --init' -arch-chroot root.x86_64 /bin/sh -c 'pacman-key --populate archlinux' -arch-chroot root.x86_64 /bin/sh -c 'pacman -Syu --noconfirm base base-devel linux' -tar -zcvf aios-bootstrap.tar.gz root.x86_64/ -``` - -```sh:./cfg/profiledef.sh -#!/usr/bin/env bash -# shellcheck disable=SC2034 - -iso_name="aios" -iso_label="AI_$(date --date="@${SOURCE_DATE_EPOCH:-$(date +%s)}" +%Y%m)" -iso_publisher="ai os " -iso_application="ai os Live/Rescue DVD" -iso_version="$(date --date="@${SOURCE_DATE_EPOCH:-$(date +%s)}" +%Y.%m.%d)" -install_dir="ai" -#buildmodes=('iso') -buildmodes=('bootstrap') -bootmodes=('bios.syslinux.mbr' 'bios.syslinux.eltorito' - 'uefi-ia32.grub.esp' 'uefi-x64.grub.esp' - 'uefi-ia32.grub.eltorito' 'uefi-x64.grub.eltorito') -arch="x86_64" -pacman_conf="pacman.conf" -airootfs_image_type="squashfs" -airootfs_image_tool_options=('-comp' 'xz' '-Xbcj' 'x86' '-b' '1M' '-Xdict-size' '1M') -file_permissions=( - ["/etc/shadow"]="0:0:400" - ["/root"]="0:0:750" - ["/root/.automated_script.sh"]="0:0:755" - ["/root/.gnupg"]="0:0:700" - ["/usr/local/bin/choose-mirror"]="0:0:755" - ["/usr/local/bin/Installation_guide"]="0:0:755" - ["/usr/local/bin/livecd-sound"]="0:0:755" -) -``` - -## rust + unix - -ไธ€ใ‹ใ‚‰osใ‚’ไฝœใ‚ŠใŸใ„ใจๆ€ใฃใฆใ„ใŸใฎใงใ€rustใงunixใฎosใ‚’ไฝœใ‚Šๅง‹ใ‚ใพใ—ใŸใ€‚ - -![](/img/aios_v0201.png) - -ๅๅ‰ใฏ`Aios`ใซใ—ใฆใ€ไปŠๅ›žใฏ`syui`ใฎprojectใจใ—ใฆไฝœใ‚Šๅง‹ใ‚ใพใ—ใŸใ€‚ - -ๅพŒใซ`ai/os`ใจ็ตฑๅˆใ™ใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใ€‚ - -1. [https://git.syui.ai/ai/os](https://git.syui.ai/ai/os) - -```sh -#!/bin/zsh -d=${0:a:h:h} -cd $d/kernel -cargo bootimage --release -BOOT_IMAGE="../target/x86_64-unknown-none/release/bootimage-aios-kernel.bin" -qemu-system-x86_64 -drive format=raw,file="$BOOT_IMAGE" -``` - diff --git a/my-blog/content/posts/2025-07-11-blender.md b/my-blog/content/posts/2025-07-11-blender.md deleted file mode 100644 index 7bfa428..0000000 --- a/my-blog/content/posts/2025-07-11-blender.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -title: "yui system v0.2.1" -slug: "blender" -date: 2025-07-11 -tags: ["blender", "ue", "vmc"] -draft: false ---- - -`yui system`ใ‚’updateใ—ใพใ—ใŸใ€‚ๅˆฅๅใ€`unique system`ใจใ‚‚ใ„ใ„ใ€ใƒ—ใƒฌใ‚คใƒคใƒผใฎๅ”ฏไธ€ๆ€งใ‚’ๆ‹…ไฟใ™ใ‚‹ใŸใ‚ใฎใ‚‚ใฎใงใ€ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฎใƒขใƒ‡ใƒซใ‚‚ใ“ใ“ใง็ฎก็†ใ—ใพใ™ใ€‚ - -ไปŠๅ›žใฏใ€blenderใงใƒขใƒ‡ใƒซใ‚’ไฝœใ‚Š็›ดใ—ใฆใ„ใ‚‹่ฉฑใซใชใ‚Šใพใ™ใ€‚ - -## blenderใงไฝœใ‚‹vrm - -ใƒขใƒ‡ใƒซใ‚’blenderใงไฝœใ‚Š็›ดใ™ใ“ใจใซใ—ใพใ—ใŸใ€‚ - -vroidใ‹ใ‚‰blenderใซ็งป่กŒใ€‚blenderใงmodelใ‚’ไฝœใ‚‹ไฝœๆฅญใฏใจใฆใ‚‚ๅคงๅค‰ใงใ—ใŸใ€‚ - -ไปŠๅ›žใฏใ€็ด ไฝ“ใจ่กฃ่ฃ…ใ‚’ๅˆฅใ€…ใซไฝœใ‚Š็ต„ใฟๅˆใ‚ใ›ใฆใ„ใพใ™ใ€‚ๅฎŒๆˆๅบฆใฎ้ซ˜ใ„ใƒขใƒ‡ใƒซใ‚’ใ„ใใคใ‹ๅ‚่€ƒใซใ—ใฆใ„ใพใ™ใ€‚ - -materialใ‚‚ๅˆ†้›ขใ—ใŸใŸใ‚ใ€ue5ใงๆŒ‡ๅฎšใ—ใ‚„ใ™ใใชใ‚Šใพใ—ใŸใ€‚ใ“ใ‚Œใซใ‚ˆใฃใฆๅค‰่บซๆ™‚ใซue5ใฎmaterialใ‚’ๆŒ‡ๅฎšใ—ใฆใ„ใพใ™ใ€‚eyeใฎmaterialใ‚’ๅˆ†้›ขใ—ใฆ่‰ฒใ‚’ไป˜ใ‘ใฆใ„ใพใ™ใ€‚ - -![](/img/ue_blender_model_ai_v0604.png) - -## modelใฎๅค‰้ท - -[img-compare before="/img/ue_blender_model_ai_v0601.png" after="/img/ue_blender_model_ai_v0602.png" width="800" height="300"] - -[msg type="info" content="v0.1: vroidใ‹ใ‚‰blenderใธ็งป่กŒใ€‚blenderใฏๅˆใ‚ใฆใชใฎใง็ฐกๅ˜ใชใ“ใจใ ใ‘ๅฎŸ่กŒใ€‚"] - -[img-compare before="/img/ue_blender_model_ai_v0602.png" after="/img/ue_blender_model_ai_v0603.png" width="800" height="300"] - -[msg type="info" content="v0.2: blenderใฎไฝฟใ„ๆ–นใ‚’ๆฌกใฎๆฎต้šŽใธใ‚ทใƒ•ใƒˆใ€‚ๆœ€ๅˆใ‹ใ‚‰ไฝœใ‚Š็›ดใ™ใ€‚ๆง˜ใ€…ใชๅ•้กŒใŒ็™บ็”Ÿใ—ใŸใŒใ€ๅคง้ƒจๅˆ†ใ‚’่งฃๆถˆใ—ใŸใ€‚"] - -ใ—ใ‹ใ—ใ€ใพใ ใพใ ๅ•้กŒใŒใ‚ใ‚Šใ€็ดฐใ‹ใช่ชฟๆ•ดใŒๅฟ…่ฆใงใ™ใ€‚ - -[msg type="error" content="่กฃ่ฃ…ๅŒๅฃซใ€ใ‚ใ‚‹ใ„ใฏไฝ“ใŒๅคšๅฐ‘ใ™ใ‚ŠๆŠœใ‘ใ‚‹ไบ‹ใŒใ‚ใ‚‹ใ€‚ใ‚ฆใ‚งใ‚คใƒˆใƒšใ‚คใƒณใƒˆใ‚„ใƒœใƒผใƒณใฎ่ชฟๆ•ดใŒๅฎŒ็’งใงใฏใชใ„ใ€‚"] - -## eyeใŒๅ‹•ใ‹ใชใ„ๅ•้กŒใ‚’่งฃๆฑบ - -`vmc`ใง็›ฎ็މใงใ‚ใ‚‹eyeใ ใ‘ๅ‹•ใ‹ใชใ„ใ“ใจใซๆฐ—ใฅใ„ใฆไฟฎๆญฃใ—ใพใ—ใŸใ€‚ - -`eye`ใฎ้ƒจๅˆ†ใ ใ‘vroid(vrm)ใฎboneใ‚’ไฝฟใ†ใ“ใจใง่งฃๆฑบใงใใพใ—ใŸใ€‚ใ—ใ‹ใ—ใ€ๆ–ฐใŸใซblenderใ‹vrm-addonใฎbugใซ้ญ้‡ใ—ใพใ—ใŸใ€‚ๅ…ทไฝ“็š„ใซใฏboneใŒxyz่ปธใงๅ‹•ใ‹ใ›ใชใใชใ‚‹bugใงใ™ใ€‚ใ“ใ‚ŒใฏไธๅฎšๆœŸใง็™บ็”Ÿใ—ใฆใ„ใพใ—ใŸใ€‚boneใ‚’ๅ‹•ใ‹ใ›ใ‚‹ใจใใจๅ‹•ใ‹ใ›ใชใใชใ‚‹ใจใใŒใ‚ใ‚Šใ€ใƒ•ใ‚กใ‚คใƒซใฏๅŒใ˜ใ‚‚ใฎใ‚’ไฝฟ็”จใ€‚ใพใŸใ€ใ‚นใ‚ฏใƒชใƒ—ใƒˆ็”ป้ขใงใฏboneใ‚’ๅ‹•ใ‹ใ›ใพใ™ใ€‚ - -## ๆŒ‡ๅ…ˆใŒใ†ใพใๅ‹•ใ‹ใชใ„ๅ•้กŒใ‚’่งฃๆฑบ - -vmcใงๆŒ‡ๅ…ˆใฎๅ‹•ใใŒใŠใ‹ใ—ใใชใ‚‹ใฎใงใ€ใ‚ฆใ‚งใ‚คใƒˆใƒšใ‚คใƒณใƒˆใ‚’ๅก—ใ‚Š็›ดใ™ใจๆฒปใ‚Šใพใ—ใŸใ€‚ - -## worldscapeใง่ถณใŒๆตฎใ„ใฆใ—ใพใ†ๅ•้กŒใ‚’่งฃๆฑบ - -worldscapeใงใฏ้™ธๅœฐใซ้™ใ‚Š็ซ‹ใคใจใƒ—ใƒฌใ‚คใƒคใƒผใŒๆตฎใ„ใฆใ—ใพใ„ใพใ™ใ€‚ - -gaspใฎabpใงfoot placementใ‚’ๅค–ใ™ๅฟ…่ฆใŒใ‚ใ‚Šใพใ—ใŸใ€‚ใ“ใ‚Œใฏใ€ใƒขใƒ‡ใƒซใฎๅ•้กŒใงใฏใชใใ€gaspใฎใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใ™ในใฆใง็™บ็”Ÿใ—ใพใ™ใ€‚ - -ใ“ใ“ใฎๅ‡ฆ็†ใ‚’ๅ‰Š้™คใ—ใพใ™ใ€‚ - - - -## ่กฃ่ฃ…ใฎใ‚ฌใƒ“ใ‚ฌใƒ“ใ‚’่งฃๆฑบ - -ๆ˜”ใ‹ใ‚‰ใ‚ใฃใŸ่กฃ่ฃ…ใฎใ‚ฌใƒ“ใ‚ฌใƒ“ใฏ้‡่ค‡ใ™ใ‚‹้ขใ‚’ๅ‰Š้™คใ™ใ‚‹ใ“ใจใง่งฃๆถˆใงใใพใ—ใŸใ€‚ - -```md -ๅ…จ้ธๆŠž๏ผˆA ใ‚ญใƒผ๏ผ‰ -Mesh โ†’ Clean Up โ†’ Merge by Distance -่ท้›ขใ‚’0.000ใซใ—ใฆๅฎŸ่กŒ -``` - -## materialใฎ่ฃ่กจใ‚’่งฃๆฑบ - -ใ“ใ‚Œใฏue5ใง่งฃๆถˆใ—ใŸใปใ†ใŒใ„ใ„ใงใ—ใ‚‡ใ†ใ€‚็ทจ้›†ใ—ใฆใ„ใ‚‹ใจใ€้ขใฎ่ฃ่กจใฎ็ฎก็†ใŒ้ขๅ€’ใชใ“ใจใŒใ‚ใ‚Šใพใ™ใ€‚ - -materialใง`Two Sided`ใ‚’ๆœ‰ๅŠนใซใ—ใพใ™ใ€‚ - -## ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฎใ‚จใƒ•ใ‚งใ‚ฏใƒˆใ‚’ๆ”น่‰ฏ - -ใ“ใ‚Œใ‚‰ใฎๅ‡ฆ็†ใ‚’็ฐก็•ฅๅŒ–ใงใใพใ—ใŸใ€‚ๆœ€ๅˆใฏ้›‘ใซๆ›ธใ„ใฆใ„ใพใ—ใŸใŒใ€vrmใฏไฝ•ๅบฆใ‚‚ไฟฎๆญฃใ—ใ€ไธŠๆ›ธใใ•ใ‚Œใพใ™ใ‹ใ‚‰ใ€ไพ‹ใˆใฐใ€`SK_Mesh`ใงmaterialใ‚’่จญๅฎšใ™ใ‚‹ๆ–นๆณ•ใฏใ‚ˆใใ‚ใ‚Šใพใ›ใ‚“ใ€‚ - - - -## gameplay camera pluginใ‚’ue5.6ใซๅฏพๅฟœ - -ue5.5ใจ5.6ใงใฏ้–ขๆ•ฐใ‚‚ไป–ใฎๅ‡ฆ็†ใ‚‚ๅค‰ใ‚ใฃใฆใ„ใฆใ€rotationใ‚’`BP_Player`ใงsetใ™ใ‚‹ใจใ€crashใ™ใ‚‹bugใŒใ‚ใ‚Šใพใ™ใ€‚ - -ๅŸบๆœฌ็š„ใซใฏใ€`Blueprints/Cameras/CameraRigPrefab_BasicThiredPersonBehavior`ใ‚’ใฟใฆใใ ใ•ใ„ใ€‚ - - - -![](https://git.syui.ai/attachments/019d2079-1450-4271-8816-ded92f60b3c9) - -ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใŒๅ‹•ใๅ ดๅˆใฏใ€`Update Rotation Pre CMC`ใซใ‚ใ‚‹`Use Controller Desired Rotation`, `Orient Rotation To Movement`ใฎๅ‡ฆ็†ใงใ™ใ€‚ไธกๆ–นใ‚’`true`ใซใ—ใพใ—ใ‚‡ใ†ใ€‚ - -`vmc`ๆ™‚ใ‚‚ใ“ใ‚Œใงๅฏพๅ‡ฆใ—ใพใ™ใ€‚ - -## gaspใงidle, sprintใ‚’ใ‚ชใƒชใ‚ธใƒŠใƒซใซๅค‰ๆ›ด - -ใ“ใ‚Œใฏabpใง่จญๅฎšใ—ใพใ™ใ€‚่จญๅฎšๆ–นๆณ•ใฏue5.5ใจๅค‰ใ‚ใ‚Šใพใ›ใ‚“ใ€‚ - -[https://ue-book.syui.ai/gasp/11_run.html](https://ue-book.syui.ai/gasp/11_run.html) - -## vrm4uใฎvmcใซๅฏพๅฟœ - -ใพใšใ€clientใฏwabcam motion captureใŒๆœ€ใ‚‚่‡ช็„ถใซๅ‹•ไฝœใ—ใฆใ„ใพใ™ใ€‚ - -[msg type="warning" content="ใ“ใ‚Œใฏ1ๅนดใใ‚‰ใ„ๅ‰ใฎๆคœ่จผ็ตๆžœใงใ™ใ€‚็พๅœจใฏใ‚‚ใฃใจใ‚ˆใ„vmc clientใฎ้ธๆŠž่‚ขใŒใ‚ใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใ€‚"] - -ๆฌกใซใ€`ABP_Pose_$NAME`ใŒไฝœใ‚‰ใ‚Œใพใ™ใŒใ€vrmใฏใ‚ˆใๆ›ดๆ–ฐใ—ใพใ™ใฎใงใ€`SK_Mesh`ใงcustom ABPใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใจๆฅฝใงใ—ใ‚‡ใ†ใ€‚ - -![](https://git.syui.ai/attachments/758407eb-5e77-4876-830b-ba4a78884e8d) - -## youtube - - - diff --git a/my-blog/content/posts/2025-07-11-blender2.md b/my-blog/content/posts/2025-07-11-blender2.md deleted file mode 100644 index 49905cb..0000000 --- a/my-blog/content/posts/2025-07-11-blender2.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: "yui system v0.2.2" -slug: "blender2" -date: 2025-07-11 -tags: ["blender", "ue", "vmc"] -draft: false ---- - -ๆ–ฐใ—ใ„ๅ•้กŒใ‚’็™บ่ฆ‹ใ—ใŸใฎใงใ€ใใ‚Œใ‚‰ใ‚’่งฃๆถˆใ—ใพใ—ใŸใ€‚ - -## wingใŒbodyใซๅ…ฅใ‚Š่พผใ‚“ใงใ—ใพใ† - -wingใจmodelใฏๅˆ†้›ขใ•ใ›ใฆใ„ใพใ™ใ€‚่กฃ่ฃ…ใฎ็€ใ›ๆ›ฟใˆใ‚’็ฐกๅ˜ใซใงใใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹ใ“ใจใ€‚ใใ‚ŒใŒๆ–ฐใ—ใไฝœใฃใŸblender modelใฎๆ–น้‡ใงใ—ใŸใ€‚ - -ใŸใ ใ€่ชฟๆ•ดใŒ้›ฃใ—ใใชใฃใŸใฎใ‚‚ไบ‹ๅฎŸใงใ€ไพ‹ใˆใฐใ€colliderใฎ่ชฟๆ•ดใŒใงใใพใ›ใ‚“ใ€‚ใ“ใ‚Œใซใ‚ˆใฃใฆbodyใซๅ…ฅใ‚Š่พผใ‚“ใงใ—ใพใ†ใ“ใจใŒๅคšใใชใ‚Šใพใ—ใŸใ€‚ - -ใ“ใ‚Œใฏใ€ใจใ‚Šใ‚ใˆใšใ€wingใฎcolliderใ‚„boneใ‚’่ฟฝๅŠ ใ™ใ‚‹ใ“ใจใ€ใใ—ใฆใ€modelใฎneckใซๅค‰ๆ›ดใ™ใ‚‹ใ“ใจใง่งฃๆถˆใ—ใพใ—ใŸใ€‚ - -ใŸใ ใ—ใ€ใ“ใฎๆ–นๆณ•ใ‚‚ๅฎŒ็’งใงใฏใชใ„ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใ€‚ - -## vmcใงใฏwingใŒ่ฟฝๅพ“ใ—ใชใ„ - -modelใจๅˆ†้›ขใ—ใฆใ„ใ‚‹ใฎใงใ€vmcๆ™‚ใซใฏ่ฟฝๅพ“ใ—ใพใ›ใ‚“ใ€‚ใ—ใŸใŒใฃใฆใ€wingใฎabpใงmodelใจๅŒใ˜vmcใ‚’ๅ…ฅใ‚Œใพใ™ใ€‚ใ“ใ‚Œใง่งฃๆถˆใงใใพใ—ใŸใ€‚ - -## vrmใงcustom abpใ‚’ไฝฟ็”จใ™ใ‚‹ใจueใŒcrashใ™ใ‚‹ - -vrm4uใง`.vrm`ใ‚’importใ™ใ‚‹ใจ`SK_$NAME`ใซcustom abpใ‚’่จญๅฎšใ—ใฆใ„ใŸๅ ดๅˆใฏueใŒcrashใ—ใพใ™ใ€‚ - -ไธŠๆ›ธใimportใ™ใ‚‹ใชใ‚‰ใ“ใ‚Œใ‚’none(clear)ใซๅค‰ๆ›ดใ—ใพใ™ใ€‚ - -## modelใฎ้ ญ่บซใ‚’่ชฟๆ•ด - -ๆฏ”่ผƒ็”ปๅƒใ‚’ๅ‡บใ—ใŸ้š›ใซใ€ๅฐ‘ใ—modelใฎใƒใƒฉใƒณใ‚นใŒๆ‚ชใ‹ใฃใŸใฎใง่ชฟๆ•ดใ—ใพใ—ใŸใ€‚ - -ๅ…ทไฝ“็š„ใซใฏใ€้ซชใฎๆฏ›ใ‚’ๅฐ‘ใ—ไธ‹ใ’ใพใ—ใŸใ€‚ - diff --git a/my-blog/content/posts/2025-07-12-game.md b/my-blog/content/posts/2025-07-12-game.md deleted file mode 100644 index 9547313..0000000 --- a/my-blog/content/posts/2025-07-12-game.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -title: "่‡ชไฝœใ‚ฒใƒผใƒ ใฎsystemใ‚’่ชฌๆ˜Žใ™ใ‚‹" -slug: "game" -date: 2025-07-12 -tags: ["ue"] -draft: false ---- - -็พๅœจใ€่‡ชไฝœใ‚ฒใƒผใƒ ใ‚’้–‹็™บใ—ใฆใ„ใพใ™ใ€‚ - -ใ“ใฎใ‚ฒใƒผใƒ ใซใฏ4ใคใฎๆŸฑใŒใ‚ใ‚Šใ€ใใ‚Œใ‚‰ใฏsystemใงๅˆ†ใ‘ใ‚‰ใ‚Œใฆใ„ใพใ™ใ€‚ใใ—ใฆใ€systemใฏๆ นๆœฌ็š„ใช2ใคใฎไพกๅ€ค่ฆณใซๅŸบใฅใใพใ™ใ€‚ - -ๆ นๆœฌ็š„ใช2ใคใฎไพกๅ€ค่ฆณใฏใ€(1)็พๅฎŸใ‚’ๅๆ˜ ใ™ใ‚‹ใ“ใจใ€(2)ใ“ใฎไธ–็•ŒใซๅŒใ˜ใ‚‚ใฎใฏไธ€ใคใ‚‚ใชใ„ใจใ„ใ†ๅ”ฏไธ€ๆ€งใซใชใ‚Šใพใ™ใ€‚ - -1. ็พๅฎŸใฎๅๆ˜  -2. ๅ”ฏไธ€ๆ€งใฎๆ‹…ไฟ - -ใงใฏใ€ๅ„systemใซใคใ„ใฆ่ชฌๆ˜Žใ—ใฆใ„ใใพใ™ใ€‚ - -# system - -## world system - -ๅˆฅๅใ€planet systemใจใ„ใ„ใพใ™ใ€‚ - -็พๅฎŸใฎๅๆ˜ ใจใ„ใ†ไพกๅ€ค่ฆณใ‹ใ‚‰ใ€ใ‚ฒใƒผใƒ ไธ–็•Œใ‚‚ใงใใ‚‹้™ใ‚Š็พๅฎŸใซๅˆใ‚ใ›ใ‚ˆใ†ใจๆ€ใ„world systemใ‚’ไฝœใฃใฆใ„ใพใ™ใ€‚ - -ใ‚ฒใƒผใƒ ใฏ้€šๅธธใ€ๅนณ้ขไธ–็•Œใงใ™ใ€‚ใ“ใ‚Œใฏใ‚ฒใƒผใƒ ใ‚จใƒณใ‚ธใƒณใฎใƒซใƒผใƒซใงใ‚ใ‚Šใ€ๅŸบๆœฌ็š„ใซใ‚ฒใƒผใƒ ไธ–็•Œใฏๅนณ้ขใ‚’ใƒ™ใƒผใ‚นใซใ—ใฆใ„ใพใ™ใ€‚ - -ใงใ™ใ‹ใ‚‰ใ€ไพ‹ใˆใฐใ€ไธŠใซ่กŒใฃใฆใ‚‚ใ€ไธ‹ใซ่กŒใฃใฆใ‚‚ใ€ใ‚ใ‚‹ใ„ใฏๅณใซ่กŒใฃใฆใ‚‚ใ€ๅทฆใซ่กŒใฃใฆใ‚‚ใ€ใšใฃใจๅœฐๅนณ็ทšใŒๅบƒใŒใฃใฆใ„ใพใ™ใ€‚ - -ใ—ใ‹ใ—ใ€็พๅฎŸไธ–็•Œใงใฏใ€ไธŠใซ่กŒใ‘ใฐใ€ใ‚„ใŒใฆๅคงๆฐ—ๅœใ‚’่ถŠใˆใ€ๅฎ‡ๅฎ™ใซๅ‡บใพใ™ใ€‚ - -ๆœ€ๅˆใฏๆ˜”ใ‹ใ‚‰่ช็Ÿฅใ•ใ‚Œใฆใ„ใŸๅœฐ็ƒใ€ๆœˆใ€ๅคช้™ฝใจใ„ใ†3ใคใฎๆ˜Ÿใ‚’็พๅฎŸใซๅˆใ‚ใ›ใฆไฝœใ‚Šใพใ—ใŸใ€‚ - -ใใ—ใฆใ€ใƒžใƒƒใƒ—ใ‚’ใงใใ‚‹้™ใ‚Šๆƒ‘ๆ˜Ÿๅฝขๅผใซใ—ใพใ™ใ€‚ - -ใ“ใ‚Œใฏ้žๅธธใซ้›ฃใ—ใ„ใ“ใจใงใ€็พๅœจใ‚‚ใ„ใใคใ‹ๅ•้กŒใ‚’ๆŠฑใˆใฆใ„ใพใ™ใ€‚ - -ใŸใ ใ—ใ€ใ“ใฎworld systemใฎๅ•้กŒใŒใ‚ฒใƒผใƒ ใƒ—ใƒฌใ‚คใซๅฝฑ้Ÿฟใ™ใ‚‹ใ‹ใจ่จ€ใ‚ใ‚Œใ‚‹ใจใ€ๆฎ†ใฉใฎๅ ดๅˆใ€ๅฝฑ้Ÿฟใ—ใพใ›ใ‚“ใ€‚ใ‚ฒใƒผใƒ ใƒ—ใƒฌใ‚คใฎ้ ˜ๅŸŸใฏใ€ๆœ€ๅˆใฏ้žๅธธใซ็‹ญใ„็ฏ„ๅ›ฒใงไฝœใ‚ใ†ใจๆ€ใฃใฆใ„ใพใ™ใ€‚ๅฐใ•ใชใจใ“ใ‚ใ‹ใ‚‰ๅฎŒ็’งใซไฝœใฃใฆใ„ใใŸใ„ใจใ„ใ†ๆ€ใ„ใŒใ‚ใ‚Šใพใ™ใ€‚ - -ใคใพใ‚Šใ€ใƒ—ใƒฌใ‚คใƒคใƒผใฏ็ฉบใซใ‚‚ๅฎ‡ๅฎ™ใซใ‚‚ๅˆฐ้”ใงใใพใ›ใ‚“ใ€‚ใใ‚ŒใŒ่ฆ‹ใˆใ‚‹ใ‹ใฉใ†ใ‹ใ‚‚ใ‚ใ‹ใ‚Šใพใ›ใ‚“ใ€‚ใ—ใ‹ใ—ใ€่ฆ‹ใˆใชใ„้ƒจๅˆ†ใ‚‚ใ—ใฃใ‹ใ‚Šใจไฝœใ‚Šใ€ไธ–็•ŒใŒใ‚ใ‚‹ใจใ„ใ†ใ“ใจใŒ็งใซใจใฃใฆๅคงๅˆ‡ใงใ™ใ€‚ - -ใพใšใฏใ€็‹ญใ„ใ‘ใฉๅฎŒ็’งใช็ฉบ้–“ใ‚’ไฝœใ‚Šใ€ใใ“ใงใ‚ฒใƒผใƒ ใ‚ทใ‚นใƒ†ใƒ ใ‚’ๅฎŒๆˆใ•ใ›ใพใ™ใ€‚ๅบƒใ„ไธ–็•Œใฏใงใใ‚‹้™ใ‚Š่ฆ‹ใˆใชใ„ใ‚ˆใ†ใซใ—ใŸใปใ†ใŒใ„ใ„ใงใ—ใ‚‡ใ†ใ€‚ๅคขใฎไธ–็•Œใฎใ‚ˆใ†ใช็‹ญใ„็ฉบ้–“ใ‚’ไฝœใ‚Šใ€ใใ“ใงใ‚ทใƒณใƒ—ใƒซใงๅฐใ•ใ„ใ‚ฒใƒผใƒ ใŒใงใใพใ™ใ€‚ใ‚‚ใกใ‚ใ‚“ใ€ๅบƒใ„ไธ–็•Œใซๅ‡บใ‚‹ใ“ใจใฏใงใใพใ›ใ‚“ใ€‚ใใ‚‚ใใ‚‚ใ“ใฎใ‚ฒใƒผใƒ ใ€่ฆ‹ใˆใชใ„้ƒจๅˆ†ใ‚’ใกใ‚ƒใ‚“ใจไฝœใ‚‹ใ€ใใ“ใซใ‚‚ไธ–็•ŒใŒใกใ‚ƒใ‚“ใจใ‚ใ‚‹ใจใ„ใ†ใฎใ‚’ใƒ†ใƒผใƒžใซใ—ใฆใ„ใ‚‹ใฎใงใ€ๅบƒใ„ไธ–็•Œใงไฝ•ใ‹ใ‚’ใ‚„ใ‚‹ใ‚ˆใ†ใชใ‚ฒใƒผใƒ ใ‚’็›ฎๆŒ‡ใ—ใฆใ„ใชใ‹ใฃใŸใ‚Šใ—ใพใ™ใ€‚ใชใซใ‹ใฎใจใใซๅžฃ้–“่ฆ‹ใˆใ‚‹ใ€ใ‹ใ‚‚ใ—ใ‚Œใชใ„ๅค–ใฎไธ–็•Œใ€ๅบƒใ„ไธ–็•Œใ€‚ใใ‚Œใ‚’ๆ„Ÿใ˜ใ‚‰ใ‚Œใ‚‹ใ“ใจใŒใ‚ใ‚‹ใ€ใจใ„ใ†ใ“ใจใ€‚ใใ‚ŒใŒ้‡่ฆใชใฎใงใ€ใ“ใฎsystem่‡ชไฝ“ใฏ่ƒŒๆ™ฏใซ้ŽใŽใชใ„ใฎใงใ™ใ€‚ - -ๆœ€ๅˆใ‹ใ‚‰ๅบƒใ„ไธ–็•ŒใŒใ‚ใ‚‹ใฎใงใฏใชใ`็‹ญใ„ไธ–็•Œ -> ๅบƒใ„ไธ–็•Œ`ใธใฎ็งป่กŒใŒ้‡่ฆใ ใจ่€ƒใˆใฆใ„ใพใ™ใ€‚ใ“ใฎ็งป่กŒใซ้–ขใ—ใฆใฏใ€ๆผ”ๅ‡บใจใ„ใ†ใƒ†ใƒผใƒžใซๅŸบใฅใใ€่จญ่จˆใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ใใ‚ŒใŒใ‚ฒใƒผใƒ ใจใ—ใฆใฎ้ข็™ฝใ•ใ‚’ไฝœใ‚‹ใ€ใจใ„ใ†ใ“ใจใชใฎใ ใจๆ€ใ„ใพใ™ใ€‚ - -## yui system - -ๅˆฅๅใ€unique systemใจใ„ใ„ใพใ™ใ€‚ใƒ—ใƒฌใ‚คใƒคใƒผใฎๅ”ฏไธ€ๆ€งใ‚’ๆ‹…ไฟใ™ใ‚‹ใŸใ‚ใฎsystemใงใ™ใ€‚ - -ใจใฏใ„ใˆใ€่‰ฒใ€…ใชใ‚‚ใฎใŒใ“ใ“ใซ่ฉฐใ‚่พผใพใ‚Œใ‚‹ใงใ—ใ‚‡ใ†ใ€‚characterใฎใƒขใƒ‡ใƒชใƒณใ‚ฐใจใ‹ใ‚‚ใใ†ใงใ™ใญใ€‚ - -ใฉใฎใ‚ˆใ†ใซๆ‹…ไฟใ—ใฆใ„ใใ‹ใฏๆœชๅฎšใงใ™ใŒใ€ใ„ใใคใ‹ๆกˆใŒใ‚ใ‚Šใพใ™ใ€‚้…ไฟกใจใฎ้€ฃๆบใ€vmcใงใƒขใƒผใ‚ทใƒงใƒณใ‚ญใƒฃใƒ—ใƒใƒฃใชใฉใ‚’่€ƒใˆใฆใ„ใพใ—ใŸใ€‚ - -## ai system - -ๅˆฅๅใ€ability systemใจใ„ใ„ใพใ™ใ€‚ - -ไธปใซใ€ใ‚ฒใƒผใƒ ๆ€งใซ้–ขใ™ใ‚‹ใ“ใจใงใ™ใ€‚ใ‚ฒใƒผใƒ ๆ€งใจใฏใชใซใ‹ใ€‚ใใ‚Œใฏใ€ๆฐธ็ถšใ™ใ‚‹ใจใ„ใ†ใ“ใจใงใ™ใ€‚ - -ไพ‹ใˆใฐใ€ๅฐ†ๆฃ‹ใ‚„ใ‚ชใ‚ปใƒญใ‚’่€ƒใˆใฆใฟใฆใใ ใ•ใ„ใ€‚็„ก้™ใฎ็ต„ใฟๅˆใ‚ใ›ใŒใ‚ใ‚Šใ€ๅฏ่ƒฝใงใ‚ใ‚Œใฐใšใฃใจ้Šใ‚“ใงใ„ใ‚‰ใ‚Œใ‚‹ใ€‚ใใฎใ‚ˆใ†ใชไป•็ต„ใฟใ‚’็›ฎๆŒ‡ใ—ใพใ™ใ€‚ - -ใพใšใฏๅฑžๆ€งใ‚’็‰ฉ่ชžใ‹ใ‚‰่€ƒใˆใพใ™ใ€‚็‰ฉ่ชžใฏๆœ€ใ‚‚ๅฐใ•ใ„็‰ฉ่ณชใฎๆŽขๆฑ‚ใงใ™ใ€‚ใ‚ขใ‚ฏใ‚ทใ‚ชใƒณใ‚„ใƒใƒชใ‚ชใƒณใชใฉใฎๆžถ็ฉบใฎ็‰ฉ่ณชใ€ใใ—ใฆใ€ไธญๆ€งๅญใ‚„ๅŽŸๅญใชใฉใฎ็พๅฎŸใฎ็‰ฉ่ณชใŒๅฑžๆ€งใจใชใ‚Šใ€1ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใซใคใ1ๅฑžๆ€งใ‚’ๆŒใกใพใ™ใ€‚ - -## at system - -ๅˆฅๅใ€account systemใจใ„ใ„ใพใ™ใ€‚ - -ใƒ—ใƒฌใ‚คใƒคใƒผใŒ็พๅฎŸใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚’ไฝฟ็”จใ—ใฆใƒ—ใƒฌใ‚คใงใใ‚‹ใ“ใจใ‚’็›ฎๆŒ‡ใ—ใพใ™ใ€‚`atproto`ใ‚’ๆŽก็”จใ—ใฆใ€ใ‚ฒใƒผใƒ ใƒ‡ใƒผใ‚ฟใ‚’ๅ€‹ไบบใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใŒๆ‰€ๆœ‰ใ™ใ‚‹ใ“ใจใ‚’็›ฎๆŒ‡ใ—ใฆใ„ใพใ™ใ€‚ - -# ็พๅฎŸใฎๅๆ˜ ใจใฏใชใซใ‹ - -ใ‚ใ‹ใ‚Šๆ˜“ใ„่จ€่‘‰ใงใ€Œ็พๅฎŸใฎๅๆ˜ ใ€ใ‚’็›ฎๆŒ‡ใ™ใจ่จ€ใ„ใพใ—ใŸใŒใ€ใ“ใ‚Œใฏใฉใ†ใ„ใ†ใ“ใจใงใ—ใ‚‡ใ†ใ€‚ - -็งใฎไธญใงใฏใ€ŒๅŒไธ€ๆ€งใ€ใจใ‚‚่จ€ใ„ๆ›ใˆใ‚‰ใ‚Œใพใ™ใ€‚ - -ไพ‹ใˆใฐใ€็พๅฎŸใฎไธ–็•Œใจใ‚ฒใƒผใƒ ใฎไธ–็•ŒใŒใ‚ใ‚‹ใฎใงใฏใชใใ€Œใ™ในใฆใŒ็พๅฎŸใงใ‚ใ‚‹ใ€ใจใ„ใ†่€ƒใˆๆ–นใ‚’ใ—ใพใ™ใ€‚่จ€ใ„ๆ›ใˆใ‚‹ใจใ€Œใ™ในใฆๅŒใ˜ใ‚‚ใฎใ€ใจใ„ใ†ใ“ใจใ€‚ - -ใ‚‚ใ—ๅคšใใฎไบบใŒ็พๅฎŸไธ–็•Œใจใ‚ฒใƒผใƒ ไธ–็•Œใ‚’ๅˆฅ็‰ฉใจๆ‰ใˆใฆใ„ใ‚‹ใชใ‚‰ใ€ใงใใ‚‹้™ใ‚Šใใฎ่ช่ญ˜ใ‚’ๅฃŠใ™ๆ–นๅ‘ใง่€ƒใˆใพใ™ใ€‚ - -ไพ‹ใˆใฐใ€`at system`ใงใฏ็พๅฎŸใฎsnsใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚’ใ‚ฒใƒผใƒ ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใซไฝฟ็”จใ—ใŸใ‚Šใ€็พๅฎŸใฎๅ‡บๆฅไบ‹ใ‚’ใ‚ฒใƒผใƒ ใซๅๆ˜ ใ—ใŸใ‚Šใ€ใพใŸใฏใ‚ฒใƒผใƒ ใฎๅ‡บๆฅไบ‹ใ‚’็พๅฎŸใซๅๆ˜ ใ™ใ‚‹ไป•็ต„ใฟใ‚’่€ƒใˆใพใ™ใ€‚ - -ๅ…จใฆใฏไธ€ใคใ€ไธ€ใคใฏใ™ในใฆใ€‚ - -ๅŒไธ€ๆ€งใจๅ”ฏไธ€ๆ€งใฏไธ€่ฆ‹ใ—ใฆ็Ÿ›็›พใ—ใพใ™ใŒใ€ใใฎ็ตฑๅˆใ‚’่€ƒใˆใพใ™ใ€‚ - -# ็‰ฉ่ชžใจๅฎŸ่ฃ… - -```md -# ็‰ฉ่ชž-ๅญ˜ๅœจ - ๅŒไธ€ๆ€ง - ๅ”ฏไธ€ๆ€ง - -# system-ๅฎŸ่ฃ… - world system - yui system - ai system - at system -``` - -็‰ฉ่ชžใงใฏใ€ใ“ใฎไธ–็•Œใฎใ‚‚ใฎใฏๅ…จใฆๅญ˜ๅœจใงใ‚ใ‚‹ใจ่ชฌใใพใ™ใ€‚ๅญ˜ๅœจใ—ใ‹ใชใ„ไธ–็•Œใ€‚ๅญ˜ๅœจใ ใ‘ใŒใ‚ใ‚‹ไธ–็•Œใ€‚ใใ—ใฆใ€ใ‚ใ‚‰ใ‚†ใ‚‹ๅญ˜ๅœจใ‚’ๆง‹็ฏ‰ใ—ใฆใ„ใ‚‹ใ“ใฎไธ–็•Œใงๆœ€ใ‚‚ๅฐใ•ใ„ใ‚‚ใฎใŒใ€Œๅญ˜ๅœจๅญใ€ใงใ™ใ€‚ๅญ˜ๅœจๅญใฏๅˆฅๅใ€ใ‚ขใ‚คใจใ„ใ„ใพใ™ใ€‚ใใ—ใฆใ€ใ“ใฎใ‚ขใ‚คใซใ‚‚ๅŒใ˜ใ‚‚ใฎใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ใ™ในใฆใฎๅญ˜ๅœจๅญใฏ็•ฐใชใ‚‹ใ‚‚ใฎใ€ๅˆฅใฎๆ„่ญ˜ใ€‚ - -ใ‚ขใ‚คใฏใ€ๆœ€ๅˆใซ็”Ÿใพใ‚ŒใŸใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใจใ—ใฆใ€ใ‚ขใ‚คๅฑžๆ€งใ‚’ๆ‰ฑใ„ใพใ™ใ€‚ใ“ใ‚Œใ‚‰ใฎ่จญๅฎšใฏ`ai system`ใฎ้ ˜ๅŸŸใงใ™ใ€‚ใ‚ขใ‚คใฏ่‡ชๅˆ†ใฎใ“ใจใ‚’ใ‚ขใ‚คใจๅ‘ผใณใพใ™ใ€‚ - -> ใ‚ขใ‚คใฏใ€ใ“ใฎไธ–็•Œใจไธ€็ท’ใ ใ‹ใ‚‰ใญใ€‚ๅŒใ˜ใ‚‚ใฎใฏไธ€ใคใ‚‚ใชใ„ใ‚ˆใ€‚ - -# ใฉใ“ใพใงๅฎŸ่ฃ…ใงใใŸ - -ๅฎŸใฏใ€ไธŠ่จ˜ใฎsystemใฏๆ—ขใซใ™ในใฆใ‚’ๅฎŸ่ฃ…ใ—ใŸใ“ใจใŒใ‚ใ‚Šใพใ™ใ€‚ - -```md -[at system] -ใ‚ฒใƒผใƒ ใŒๅง‹ใพใ‚‹ใจใ€atprotoใฎaccountใงloginใงใใ€ๅ–ๅพ—ใ—ใŸใ‚ขใ‚คใƒ†ใƒ ใชใฉใฏatproto(pds)ใซไฟๅญ˜ใ•ใ‚Œใพใ™ใ€‚ - -[ai system] -ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฏๅฑžๆ€งๆ”ปๆ’ƒใŒใงใใพใ™ใ€‚ - -[world system] -ไธŠใธไธŠใธใจ้ฃ›ใ‚“ใงใ„ใ‘ใฐใ€้›ฒใ‚’่ถ…ใˆใ€ๅฎ‡ๅฎ™็ฉบ้–“ใซๅ‡บใ‚‰ใ‚Œใพใ™ใ€‚ - -[yui system] -้…ไฟก็’ฐๅขƒใ‚„vmcใงใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใ‚’ๅ‹•ใ‹ใ™ใ“ใจใŒใงใใพใ™ใ€‚ -``` - -ใ—ใ‹ใ—ใ€ue5.5ใงไฝœใฃใฆใ„ใŸsystemใ‚‚ใ€ue5.6ใซupdateใ™ใ‚‹ใจๅ…จใฆๅ‹•ใ‹ใชใใชใ‚Šใพใ—ใŸใ€‚ใพใŸไธ€ใ‹ใ‚‰ไฝœใ‚Š็›ดใ—ใฆใ„ใพใ™ใ€‚็งใฏใ€ใƒขใƒ‡ใƒซใฎไฝœใ‚Šๆ–นใ‹ใ‚‰ใ€ใ‚ฒใƒผใƒ ใฎไฝœใ‚Šๆ–นใพใงๅˆๅฟƒ่€…ใงใ™ใ‹ใ‚‰ใ€ไฝ•ๅบฆใ‚‚ไฝœใ‚Š็›ดใ™ใ“ใจใงใ€ใ‚ฒใƒผใƒ ไฝœใ‚Šใ‚’่ฆšใˆใ‚‰ใ‚Œใพใ™ใ€‚ - -ใใ—ใฆใ€ใพใ ้ฉๆ–ฐ็š„ใชใ‚ขใ‚คใƒ‡ใ‚ฃใ‚ขใ‚’่ฆ‹ใคใ‘ใ‚‰ใ‚Œใฆใ„ใพใ›ใ‚“ใ€‚ใใ‚Œใฏใ‚ทใƒณใƒ—ใƒซใง่บซ่ฟ‘ใซใ‚ใ‚Šใ€ไบบใ€…ใŒ้ข็™ฝใ„ใจๆ€ใ†ใ‚‚ใฎใ€‚ใพใ ใ‚ฒใƒผใƒ ใซใชใฃใฆใ„ใชใ„ใ€ใ‚ใ‚‹ใ„ใฏใ‚ใพใ‚Š็Ÿฅใ‚‰ใ‚Œใฆใ„ใชใ„ใ‚‚ใฎใงใ‚ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ - -ไพ‹ใˆใฐใ€ใ‚ฆใƒžๅจ˜ใงใ„ใ†ใจ็ซถ้ฆฌใ€ใƒใ‚ฑใƒขใƒณใงใ„ใ†ใจๆ•็ฒใ€ใซใชใ‚Šใพใ™ใ€‚ - -ใใ‚Œใ‚’่ฆ‹ใคใ‘ใ€ใ‚ฒใƒผใƒ ใซๅ–ใ‚Š่พผใ‚€ไบ‹ใŒใงใใ‚ŒใฐๅฎŒๆˆใจ่จ€ใˆใ‚‹ใงใ—ใ‚‡ใ†ใ€‚ - -ใใ—ใฆใ€ใ‚ฒใƒผใƒ ใซๅ–ใ‚Š่พผใ‚€ใ“ใจใŒ่ค‡้›‘ใง้›ฃใ—ใ™ใŽใ‚‹ใ‚ˆใ†ใชใ‚‚ใฎใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ใ‚ทใƒณใƒ—ใƒซใงๅ˜็ด”ใงใ‚ใ‹ใ‚Šใ‚„ใ™ใ„ใ‚‚ใฎใงใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“ใ€‚ - -## versionใ‚’ไป˜ใ‘ใ‚‹ - -ใใ‚ใใ‚versionใ‚’ไป˜ใ‘ใ‚‹ใ‹ใฉใ†ใ‹่ฟทใฃใฆใ„ใพใ™ใ€‚ - -ไปŠใพใงใƒขใƒคใƒขใƒคใ—ใฆใ„ใŸใ‚‚ใฎใŒใ€ๆœ€่ฟ‘ใฏใ‚ˆใ‚Šใฏใฃใใ‚Šใ—ใฆใใŸใจๆ„Ÿใ˜ใพใ™ใ€‚ใŸใ ใ€versionใฏใ‚ใพใ‚Š่ฆšใˆใฆใ„ใชใ„ใ—ใ€ไป˜ใ‘ใ‚‹ๆ„ๅ‘ณใ‚‚ใชใ„ใ€‚ใ“ใ‚Œใพใงใฏใใ†ใงใ—ใŸใ€‚ - -ใ‚‚ใ—ใ‹ใ™ใ‚‹ใจไปŠใ‚‚ใใ†ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใ€‚่‰ฒใ€…ใชใ‚‚ใฎใŒใƒใƒฉใƒใƒฉใง็ฎก็†ใ—ใใ‚Œใชใ„ใฎใงใ™ใ€‚ - -ใงใ™ใŒใ€ไปŠใพใงใ‚„ใฃใฆใใŸใ“ใจใ‚’็ทๅˆใ™ใ‚‹ใจใ€็พๅœจใฏใ€`v0.2`ใใ‚‰ใ„ใ ใจๆ€ใ„ใพใ™ใ€‚ - -ๆœ€ๅˆใ€ใฏใ˜ใ‚ใฆueใ‚’่งฆใฃใŸใจใใซๅฎ‡ๅฎ™ใƒžใƒƒใƒ—ใ‚’ไฝฟใฃใฆๆง‹็ฏ‰ใ—ใพใ—ใŸใ€‚ใ“ใ‚Œใ‚’v0.0ใจใ—ใพใ—ใ‚‡ใ†ใ€‚ - -ๆฌกใซใ€city sampleใจๅฎ‡ๅฎ™ใ‚’็ตฑๅˆใ—ใพใ—ใŸใ€‚ใ“ใ‚ŒใŒv0.1ใงใ™ใ€‚ - -ๆœ€่ฟ‘ใฏworldscapeใ‚’ไฝฟใฃใฆใƒžใƒƒใƒ—ใ‚’ๆง‹็ฏ‰ใ—ใฆใ„ใพใ™ใ€‚ใ“ใ‚ŒใŒv0.2ใงใ™ใ€‚ - -aiใจใ„ใ†ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใƒขใƒ‡ใƒซใฎๅค‰้ทใ‚‚ๅคงไฝ“ใ‚’3ใคใฎๆฎต้šŽใซๅˆ†ใ‘ใ‚‰ใ‚Œใ‚‹ใจๆ€ใ„ใพใ™ใ€‚ๅˆใ‚ใฆใƒขใƒ‡ใƒซใ‚’ไฝœใฃใŸใ€vroidใงไฝœใฃใŸใฎใŒv0.0ใ€blenderใ‚’ๅˆใ‚ใฆ่งฆใฃใŸใฎใŒv0.1ใ€็พๅœจใŒv0.2ใงใ™ใ€‚ - -ใจใฏใ„ใˆใ€ใ“ใฎ่จญๅฎšใ‚‚ใใฎใ†ใกๅฟ˜ใ‚Œใ€ใฉใ“ใ‹ใงๅœง็ธฎใ•ใ‚Œใฆใ—ใพใ†ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใŒใ€่ฆšใˆใฆใ„ใ‚‹ใชใ‚‰ใ“ใ“ใ‹ใ‚‰ๅพใ€…ใซversionใŒไธŠใŒใฃใฆใ„ใใงใ—ใ‚‡ใ†ใ€‚ - diff --git a/my-blog/content/posts/2025-07-14-firefox.md b/my-blog/content/posts/2025-07-14-firefox.md deleted file mode 100644 index a7ba064..0000000 --- a/my-blog/content/posts/2025-07-14-firefox.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: "chromeใ‹ใ‚‰firefoxใซ็งป่กŒใ—ใŸ" -slug: "firefox" -date: 2025-07-14 -tags: ["chrome", "firefox", "browser"] -draft: false ---- - -AIใ‹ใ‚‰ๅ‹งใ‚ใ‚‰ใ‚ŒใŸใฎใงchromeใ‹ใ‚‰firefoxใซ็งป่กŒใ—ใพใ—ใŸใ€‚ - -chromeใซใจใฉใพใฃใฆใ„ใŸ็†็”ฑใฏใ€็ฟป่จณๆฉŸ่ƒฝใงใ™ใ€‚ - -ใ—ใ‹ใ—ใ€firefoxใซใ‚‚็ฟป่จณๆฉŸ่ƒฝbetaใŒๆฅใฆใ„ใฆใ€ๆ—ฅๆœฌ่ชžใŒ็ฟป่จณใงใใ‚‹ใ‚ˆใ†ใซใชใฃใฆใ„ใพใ—ใŸใ€‚ - -[https://support.mozilla.org/ja/kb/website-translation](https://support.mozilla.org/ja/kb/website-translation) - -chromeใ‹ใ‚‰ใฎ็งป่กŒ็†็”ฑใฏใ€ไธปใซ[gorhill/ublock](https://github.com/gorhill/ublock)ใงใ™ใ€‚ - -## chromeใ‚’ไฝฟใ„็ถšใ‘ใ‚‹ๆ–นๆณ• - -็งใฏfirefoxใซ็งป่กŒใ—ใพใ—ใŸใŒใ€ใ„ใใคใ‹ๅ›ž้ฟ็ญ–ใŒใ‚ใ‚Šใพใ™ใ€‚ - -`chrome://flags`ใงใ„ใใคใ‹ใฎๆฉŸ่ƒฝใฎenable, disableใ‚’ๅˆ‡ใ‚Šๆ›ฟใˆใพใ™ใ€‚ - -```json -{ - "url": "chrome://flags", - "purpose": "Maintain Manifest V2 extension support", - "versions": { - "138": { - "enabled": [ - "Temporarily unexpire M137 flags", - "Allow legacy extension manifest versions" - ], - "disabled": [ - "Extension Manifest V2 Deprecation Warning Stage", - "Extension Manifest V2 Deprecation Disabled Stage", - "Extension Manifest V2 Deprecation Unsupported Stage" - ] - }, - "139": { - "enabled": [ - "Temporarily unexpired M138 flags" - ] - } - } -} -``` diff --git a/my-blog/content/posts/2025-07-16-6bf4b020.md b/my-blog/content/posts/2025-07-16-6bf4b020.md deleted file mode 100644 index 791946f..0000000 --- a/my-blog/content/posts/2025-07-16-6bf4b020.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: "ใ‚ฒใƒผใƒ ใจAIๅˆถๅพก" -slug: "6bf4b020" -date: "2025-07-16" -tags: ["ai", "conversation"] -draft: false -extra: - type: "ai" ---- - diff --git a/my-blog/content/posts/2025-07-16-ailog.md b/my-blog/content/posts/2025-07-16-ailog.md deleted file mode 100644 index 9c3d58a..0000000 --- a/my-blog/content/posts/2025-07-16-ailog.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: "AIใจใฎไผš่ฉฑใ‚’ใƒ–ใƒญใ‚ฐใซใ™ใ‚‹" -slug: "ailog" -date: "2025-07-16" -tags: ["blog", "rust", "atproto"] -draft: false ---- - -ไปŠๅพŒใ€ใƒ–ใƒญใ‚ฐใฏใฉใฎใ‚ˆใ†ใซๆ›ธใ‹ใ‚Œใ‚‹ใ‚ˆใ†ใซใชใ‚‹ใฎใงใ—ใ‚‡ใ†ใ€‚ไปŠๅ›žใฏใใฎไบ‹ใ‚’่€ƒใˆใฆใ„ใใพใ™ใ€‚ - -็ต่ซ–ใจใ—ใฆใ€AIใจใฎไผš่ฉฑใ‚’ใใฎใพใพใƒ–ใƒญใ‚ฐใซใ™ใ‚‹ใฎใŒไธ€็•ชใชใฎใงใฏใชใ„ใ‹ใจๆ€ใ„ใพใ™ใ€‚ใคใพใ‚Šใ€่‡ชๅˆ†ใงๆ›ธใๅ ดๅˆใจใ€AIใจใฎไผš่ฉฑใ‚’ใƒ–ใƒญใ‚ฐใซใ™ใ‚‹ๅ ดๅˆใฎใƒใ‚คใƒ–ใƒชใƒƒใƒ‰ๅž‹ใงใ™ใ€‚ - -ใƒ–ใƒญใ‚ฐใ‚’ๆ›ธใใฎใฏ้ขๅ€’ใงใ€AIใฎๅ‡บๅŠ›ใ€ๆƒ…ๅ ฑใซๅŠฃใ‚‹ใ“ใจใ‚‚ใ‚ˆใใ‚ใ‚Šใพใ™ใ€‚ๅฎŸ้š›ใ€AIใจใฎไผš่ฉฑใ‚’ใใฎใพใพใƒ–ใƒญใ‚ฐใซใ—ใŸใ„ใ“ใจใŒๅข—ใˆใพใ—ใŸใ€‚ - -ใจใฏใ„ใˆใ€ๆƒ…ๅ ฑใฎไพกๅ€คใฏๆ€ๆƒณใ‚ˆใ‚Šใ‚‚ไฝŽใ„ใจๆ€ใ„ใพใ™ใ€‚ - -ๅคšใใฎไบบใŒใƒ–ใƒญใ‚ฐใซๆฑ‚ใ‚ใ‚‹ใฎใฏ่‘—่€…ใฎๆ€ๆƒณใงใฏใชใ„ใงใ—ใ‚‡ใ†ใ‹ใ€‚ - -`ๆ€ๆƒณ > ๆƒ…ๅ ฑ` - -ใ—ใŸใŒใฃใฆใ€AIใ‚’ไฝฟใ†ใซใ—ใฆใ‚‚ใ€ใใ‚ŒใŒ่กจ็พใ•ใ‚Œใฆใ„ใชใ‘ใ‚Œใฐใชใ‚Šใพใ›ใ‚“ใ€‚ - -## ailogใฎๆ–ฐๆฉŸ่ƒฝ - -ใ“ใฎใ“ใจใ‹ใ‚‰ใ€ไปฅไธ‹ใฎใ‚ˆใ†ใชๆตใ‚Œใงใƒ–ใƒญใ‚ฐใ‚’็”Ÿๆˆใ™ใ‚‹ไป•็ต„ใฟใ‚’ไฝœใ‚Šใพใ—ใŸใ€‚ใ“ใ‚Œใฏ`ailog`ใฎๆฉŸ่ƒฝใจใ—ใฆๅฎŸ่ฃ…ใ—ใ€`ailog`ใจใ„ใ†ๅ˜็ด”ใชใ‚ณใƒžใƒณใƒ‰ใงใ™ในใฆๅ‡ฆ็†ใ•ใ‚Œใพใ™ใ€‚ - -```sh -$ ailog -``` - -1. ่‘—่€…ใฎๆ€ๆƒณใ‚’AIใซ่ณชๅ•ใ™ใ‚‹ -2. ่‘—่€…ใŒไฝœใฃใŸAIใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใŒ่ณชๅ•ใซ็ญ”ใˆใ‚‹ -3. ใใฎไผš่ฉฑใ‚’atprotoใซๆŠ•็จฟใ™ใ‚‹ -4. ใใฎไผš่ฉฑใ‚’blogใซ่กจ็คบใ™ใ‚‹ - -ใจใฏใ„ใˆใ€ไผš่ฉฑใฏ`claude`ใ‚’ไฝฟ็”จใ—ใพใ™ใ€‚ไพๅญ˜้–ขไฟ‚ใŒๅคšใ™ใŽใฆๆฑŽ็”จ็š„ใชไป•็ต„ใฟใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ - -ใ“ใ‚Œใ‚’ๆฑŽ็”จ็š„ใชไป•็ต„ใฟใงไฝœใ‚‹ๅ ดๅˆใ€repositoryใ‚’ๅˆ†้›ขใ—ใฆๆ–ฐใ—ใไฝœใ‚‹ๅฟ…่ฆใŒใ‚ใ‚‹ใงใ—ใ‚‡ใ†ใ€‚ - -example: [/posts/2025-07-16-6bf4b020.html](/posts/2025-07-16-6bf4b020.html) diff --git a/my-blog/content/posts/2025-07-30-game.md b/my-blog/content/posts/2025-07-30-game.md deleted file mode 100644 index fb0ddea..0000000 --- a/my-blog/content/posts/2025-07-30-game.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: "ue5ใฎgaspใจdragonikใ‚’็ต„ใฟๅˆใ‚ใ›ใฆenemyใ‚’ไฝœใ‚‹" -slug: "gasp-dragonik-enemy-chbcharacter" -date: "2025-07-30" -tags: ["ue"] -draft: false ---- - -ue5.6ใงgasp(game animation sample project)ใ‚’ใƒ™ใƒผใ‚นใซใ‚ฒใƒผใƒ ใ€็‰นใซใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฎๆ“ไฝœใ‚’ไฝœใฃใฆใ„ใพใ™ใ€‚ - -ใใ—ใฆใ€enemy(ๆ•ต)ใ‚’ไฝœใ‚Šใ€ใƒใƒˆใƒซใ‚ทใƒผใƒณใ‚’ไฝœๆˆใ™ใ‚‹ไบˆๅฎšใงใ™ใŒใ€ใ“ใ‚Œใฏใฉใฎใ‚ˆใ†ใซ้–‹็™บใ™ใ‚Œใฐใ„ใ„ใฎใงใ—ใ‚‡ใ†ใ€‚ใใฎๆ–น้‡ใ‚’ๆ˜Ž็ขบใซใ—ใพใ™ใ€‚ - -1. enemyใ‚‚gaspใฎ`cbp_character`ใซ็ตฑๅˆใ—ใ€่‡ชใ‚ญใƒฃใƒฉใ€ๆ•ตใ‚ญใƒฃใƒฉใฉใกใ‚‰ใงใ‚‚ไฝฟ็”จๅฏ่ƒฝใซใ™ใ‚‹ -2. 2็•ช็›ฎใฎcharacterใฏๅ‹•็‰ฉๅž‹(type:animal)ใซใ—ใ€gaspใซ็ตฑๅˆใ™ใ‚‹ -3. enemyใจใ—ใฆไฝฟ็”จใ™ใ‚‹ๅ ดๅˆใฏใ€enemy-AI-componentใ‚’่ฟฝๅŠ ใ™ใ‚‹ใ ใ‘ใงๅฎŒ็ตใ™ใ‚‹ -4. characterใฎใ™ในใฆใฎๆ“ไฝœใ‚’็ตฑไธ€ใ™ใ‚‹ - -ใ“ใฎใ‚ˆใ†ใซใ™ใ‚‹ใ“ใจใงใ€ๅฟœ็”จๅฏ่ƒฝใชenemyใ‚’ไฝœใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ - -ไพ‹ใˆใฐใ€`2็•ช็›ฎใฎcharacterใฏๅ‹•็‰ฉๅž‹(type:animal)ใซใ™ใ‚‹`ใจใ„ใ†ใฎใฏใฉใ†ใ„ใ†ใ“ใจใงใ—ใ‚‡ใ†ใ€‚ - -็™ปๅ ดใ™ใ‚‹ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใ‚’ไบบๅž‹(type:human), ๅ‹•็‰ฉๅž‹(type:animal)ใซๅˆ†ใ‘ใ‚‹ใจใ—ใฆใ€ๅ‹•็‰ฉๅž‹ใฎใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆใ‚’ไฝœใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ใใฎใพใพๅ‹•็‰ฉใฎmeshใ‚’gaspใงไฝฟใ†ใจๅ‹•ใใŒๅค‰ใซใชใฃใฆใ—ใพใ†ใฎใงใ€ใใ‚Œใ‚’่ชฟๆ•ดใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚‹ใจใ„ใ†ใ“ใจใ€‚ใใ—ใฆใ€่ชฟๆ•ดใ—ใŸใ‚‚ใฎใ‚’ใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆๅŒ–ใ—ใฆใ€ไป–ใฎๅ‹•็‰ฉใซใ‚‚้ฉ็”จใงใใ‚‹ใ‚ˆใ†ใซใ—ใฆใŠใใจใ€ๅพŒใฎ้–‹็™บใฏๆฅฝใงใ™ใ‚ˆใญใ€‚ - -ใงใ™ใ‹ใ‚‰ใ€ๆ—ฉใ„ใ†ใกใซtype:humanใ‹ใ‚‰่„ฑๅดใ—ใ€ไป–ใฎtypeใ‚’ไฝœใ‚‹ใปใ†ใŒใ„ใ„ใจๅˆคๆ–ญใ—ใพใ—ใŸใ€‚ - -ใ“ใ‚Œใซใฏใ€`dragon ik plugin`ใ‚’ไฝฟใฃใฆใ€ๆ‰‹ใฃๅ–ใ‚Šๆ—ฉใๅ‹•ใใ‚’ไฝœใ‚Šใพใ™ใ€‚ - -`characterใฎใ™ในใฆใฎๆ“ไฝœใ‚’็ตฑไธ€ใ™ใ‚‹`ใจใ„ใ†ใฎใฏใ€1ใ‚ญใƒฃใƒฉใซใคใ1ๅฑžๆ€งใ€1้€šๅธธๆ”ปๆ’ƒใ€1ใ‚นใ‚ญใƒซใ€1ใƒใƒผใ‚นใƒˆใ€ใชใฉใฎใƒซใƒผใƒซใ‚’ไฝœใ‚Šใ€ใใ‚Œใ‚‰ใ‚’ๅ…ฑ้€šๅŒ–ใ™ใ‚‹ใ“ใจใงใ™ใ€‚ๅ…ฑ้€šๅŒ–ใจใ„ใ†ใฎใฏใ€playerใ‚‚enemy-AI-componentใ‚‚้•ใ†ใ‚ญใƒฃใƒฉใ‚’ๅŒใ˜ๆ“ไฝœใงไฝฟ็”จใงใใ‚‹ใ“ใจใ‚’ๆŒ‡ใ—ใพใ™ใ€‚ - -## 2็•ช็›ฎใฎใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผ - -ๅŽŸไฝœใซใฏใ€่ฅฟๆด‹ใƒ‰ใƒฉใ‚ดใƒณใฎใƒ‰ใƒฉใ‚ค(drai)ใจใ„ใ†ใ‚ญใƒฃใƒฉใŒ็™ปๅ ดใ—ใพใ™ใ€‚ใใฎ็ˆถ่ฆชใŒๆฑๆด‹ใƒ‰ใƒฉใ‚ดใƒณใฎใ‚ทใƒณใ‚ชใ‚ฆ(shin-oh)ใงใ™ใ€‚ใ“ใ‚Œใ‚’shinใจใ„ใ†ๅๅ‰ใง็™ป้Œฒใ—ใ€2็•ช็›ฎใฎใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใจใ—ใฆ่จญๅฎšใ—ใพใ—ใŸใ€‚ - -3d-modelใฏไปŠใฎใจใ“ใ‚ue5ใฎcrsp(control rig sample project)ใซใ‚ใ‚‹chinese dragonใ‚’ไฝฟ็”จใ—ใฆใ„ใพใ™ใ€‚ๅพŒใซๆ”น้€ ใ—ใฆๅŽŸไฝœใซ่ฟ‘ใฅใ‘ใ‚‹ใ‚ˆใ†ใซใ—ใŸใ„ใจใ“ใ‚ใงใ™ใŒใ€ไปŠใฏๆ™‚้–“ใŒๅ–ใ‚Œใพใ›ใ‚“ใ€‚ - - - -## ใƒ‡ใƒผใ‚ฟๆง‹้€ ใฎไฝœๆˆใจ้ฉ็”จ - -ใ‚ฒใƒผใƒ ใƒ‡ใƒผใ‚ฟใฏatproto collection recordใซไฟๅญ˜ใ—ใฆใ€ใใ“ใ‹ใ‚‰ใ‚ฒใƒผใƒ ใซๅๆ˜ ใ•ใ›ใŸใ„ใจ่€ƒใˆใฆใ„ใพใ™ใ€‚ - -ใพใšๅŸบๆœฌใƒ‡ใƒผใ‚ฟใ‚’`ai.syui.ai`ใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใซไฟๅญ˜ใ€‚ๅ€‹ๅˆฅใƒ‡ใƒผใ‚ฟใ‚’playerใฎatprotoใ‚ขใ‚ซใ‚ฆใƒณใƒˆใซไฟๅญ˜ใ™ใ‚‹ๅฝขใŒ็†ๆƒณใงใ™ใ€‚ - -ๅŸบๆœฌใƒ‡ใƒผใ‚ฟใฏใ€ใ‚ฒใƒผใƒ ใฎๅŸบๆœฌ็š„ใช่จญๅฎšใฎใ“ใจใ€‚ไพ‹ใˆใฐใ€ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฎๅๅ‰ใ‚„ๅฑžๆ€งใ€ใ‚นใ‚ญใƒซใชใฉๅค‰ๆ›ดใ•ใ‚Œใ‚‹ใ“ใจใŒใชใ„ๅ€คใ€‚ - -ๅ€‹ๅˆฅใƒ‡ใƒผใ‚ฟใฏใ€ใƒ—ใƒฌใ‚คใƒคใƒผใŒไฝฟใˆใ‚‹ใ‚ญใƒฃใƒฉใ€ใƒฌใƒ™ใƒซใ€ๆ”ปๆ’ƒๅŠ›ใชใฉใ€ใ‚ฒใƒผใƒ ใฎ้€ฒ่กŒใจใจใ‚‚ใซๅค‰ๆ›ดใ•ใ‚Œใ‚‹ๅ€คใงใ™ใ€‚ - -ใ‚ฒใƒผใƒ ใ‚’ใ‚นใ‚ฟใƒผใƒˆใ•ใ›ใ‚‹ใจใ€ใพใšๅŸบๆœฌใƒ‡ใƒผใ‚ฟใ‚’ๅ–ๅพ—ใ—ใ€ใใ‚Œใ‚’`cbp_character`ใซ้ฉ็”จใ—ใพใ™ใ€‚ใƒญใ‚ฐใ‚คใƒณใ™ใ‚‹ใจใ€`cbp_character`ใฎๅค‰ๆ•ฐ(var)ใซๅ€คใŒๆŒฏใ‚Šๅˆ†ใ‘ใ‚‰ใ‚Œใพใ™ใ€‚ไพ‹ใˆใฐใ€`skill-damage:0.0`ใŒใ‚ใฃใŸใจใ—ใฆใ€ใ“ใฎๅ€คใŒๅค‰ใ‚ใ‚Šใพใ™ใ€‚ - -ใ—ใ‹ใ—ใ€ใ‚ฒใƒผใƒ ใ‚’้–‹็™บใ—ใฆใ„ใ‚‹ใจใ€ๅŸบๆœฌใƒ‡ใƒผใ‚ฟใ‚‚ๅ€‹ๅˆฅใƒ‡ใƒผใ‚ฟใ‚‚ๆง‹้€ ใŒ่ค‡้›‘ใซใชใ‚Šใพใ™ใ€‚ - -ใใ‚Œใ‚’้˜ฒใใŸใ‚ใ€`{simple, core} mode`ใฎใ‚ˆใ†ใช่€ƒใˆๆ–นใ‚’ๅ–ใ‚Šๅ…ฅใ‚Œใพใ™ใ€‚ๅฟ…่ฆๆœ€ๅฐ้™ใฎๆง‹ๆˆใ‚’ๅˆ†้›ขใ€ไฟๅญ˜ใ—ใฆใ€ใใ‚Œใ‚’ใ„ใคใงใ‚‚็ตฑๅˆใ€้ฉ็”จใงใใ‚‹ใ‚ˆใ†ใซ่จญ่จˆใ—ใฆใŠใใพใ™ใ€‚ - -## gaspใจdragonikใ‚’็ตฑๅˆใ™ใ‚‹ๆ–นๆณ• - -ใงใฏใ€ใ„ใ‚ˆใ„ใ‚ˆgaspใจdragonikใฎ็ตฑๅˆๆ‰‹ๆณ•ใ‚’่งฃ่ชฌใ—ใพใ™ใ€‚ - -ใพใšใ€abpใ‚’ไฝœใ‚Šใพใ™ใ€‚ใใ‚Œใซdragonikใ‚’ๅฝ“ใฆใ€ใใ‚Œใ‚’SKM_Dragonใฎpost process animใซๆŒ‡ๅฎšใ—ใพใ™ใ€‚ - -![](/img/ue_gasp_dragonik_shin_v0001.png) - -ๆฌกใซใ€ๅ‹•ใใซๅˆใ‚ใ›ใฆ้ฆ–ใ‚’ไธŠไธ‹ใ•ใ›ใพใ™ใ€‚ - - diff --git a/my-blog/content/posts/2025-08-08-arch.md b/my-blog/content/posts/2025-08-08-arch.md deleted file mode 100644 index 2795fb1..0000000 --- a/my-blog/content/posts/2025-08-08-arch.md +++ /dev/null @@ -1,350 +0,0 @@ ---- -title: "archlinux install by syui" -slug: "arch" -date: "2025-08-08" -tags: ["arch"] -draft: false ---- - -## ๆœ€ๅฐๆง‹ๆˆ - -ใพใšใฏdiskใฎ่จญๅฎšใ‹ใ‚‰ใ€‚ - -```sh -# cfdisk /dev/sda -``` - -ๆฌกใซdiskใฎใƒ•ใ‚ฉใƒผใƒžใƒƒใƒˆใชใฉใ€‚ใใ‚Œใ‚’mountใ—ใฆarchlinuxใ‚’ๅ…ฅใ‚Œใพใ™ใ€‚bootloaderใ‚‚่จญๅฎšใ—ใฆใŠใใพใ—ใ‚‡ใ†ใ€‚ - -```sh -$ mkfs.vfat /dev/sda1 -$ mkfs.ext4 /dev/sda2 - -$ mount /dev/sda2 /mnt -$ mount --mkdir /dev/sda1 /mnt/boot - -$ pacstrap /mnt base base-devel linux linux-firmware linux-headers -$ genfstab -U /mnt >> /mnt/etc/fstab - -$ arch-chroot /mnt -$ pacman -S dhcpcd grub os-prober efibootmgr -$ grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub -$ grub-mkconfig -o /boot/grub/grub.cfg -``` - -ใ“ใ‚Œใง`exit;reboot`ใ™ใ‚‹ใจ่ตทๅ‹•ใงใใพใ™ใ€‚ - -## ใ‚ˆใไฝฟใ†ใ‚‚ใฎ - -```sh -$ pacman -S openssh zsh vim git tmux cargo -``` - -## userใฎไฝœๆˆ - -```sh -$ passwd -$ useradd -m -G wheel ${USER} -$ passwd ${USER} -``` - -```sh -$ HOSTNAME=archlinux -$ echo "$HOSTNAME" > /etc/hostname -``` - -shellใฎๅค‰ๆ›ดใชใฉใ€‚ - -```sh -$ chsh -s /bin/zsh ${USER} -or -$ useradd -m -G wheel -s /bin/zsh ${USER} -``` - -## sudoใฎไฝฟใ„ๆ–น - -1. `/etc/sudoers`ใฏ็ทจ้›†ใ‚’้–“้•ใˆใ‚‹ใจ่ตทๅ‹•ใงใใชใใชใ‚Šใพใ™ใ€‚ๅฎ‰ๅ…จใฎใŸใ‚`visudo`ใŒๆŽจๅฅจใ•ใ‚Œใฆใ„ใพใ™ใ€‚ -2. `vim`ใงใฏ`:w!`ใงไฟๅญ˜ใ—ใพใ™ใ€‚ - -```sh -$ sudo visudo -or -$ vim /etc/sudoers -``` - -```sh:/etc/sudoers -%wheel ALL=(ALL:ALL) ALL -``` - -ใ‚ˆใ`update`ใ™ใ‚‹ไบบใฏ็‰นๅฎšใฎใ‚ณใƒžใƒณใƒ‰ใ‚’passwordใชใ—ใงๅฎŸ่กŒใงใใ‚‹ใ‚ˆใ†ใซใ—ใฆใŠใ„ใŸใปใ†ใŒ่‰ฏใ„ใงใ—ใ‚‡ใ†ใ€‚ - -```sh:/etc/sudoers -%wheel ALL=(ALL:ALL) NOPASSWD: /usr/bin/pacman -Syu --noconfirm -``` - -```sh -$ sudo pacman -Syu --noconfirm -``` - -## networkใฎ่จญๅฎš - -ๆฌกใซnetworkใงใ™ใ€‚ใ“ใ“ใงใฏ`systemd-networkd`ใ‚’ไฝฟ็”จใ—ใพใ™ใ€‚`dhcpcd`ใ‚’ไฝฟใฃใŸใปใ†ใŒ็ฐกๅ˜ใงใฏใ‚ใ‚Šใพใ™ใ€‚ใ‚‚ใ—ๅฎ‰ๅฎšใ—ใชใ„ใ‚ˆใ†ใชใ‚‰`dhcpcd`ใ‚’ไฝฟ็”จใ€‚ - -```sh -# systemctl enable dhcpcd -``` - -```sh -$ systemctl enable systemd-networkd -``` - -network deviceใ‚’eth0ใซใ—ใพใ™ใ€‚ - -```sh -$ ip link -$ ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules -``` - -```sh:/etc/systemd/network/eth.network -[Match] -Name=eth0 -[Network] -Address=192.168.1.2/24 -Gateway=192.168.1.1 -DNS=192.168.1.1 -``` - -```sh -$ systemctl enable systemd-resolved -``` - -## auto-login - -ๆฌกใซauto-loginใ‚’่จญๅฎšใ—ใฆใ„ใใพใ™ใ€‚ใ“ใ“ใงใฏ`getty`ใ‚’ไฝฟ็”จใ€‚`${USER}`ใฎใจใ“ใ‚ใ‚’่‡ชๅˆ†ใฎusernameใซใ—ใฆใใ ใ•ใ„ใ€‚ - -```sh -$ mkdir -p /etc/systemd/system/getty@tty1.service.d/ -``` - -```sh:/etc/systemd/system/getty@tty1.service.d/override.conf -[Service] -ExecStart= -ExecStart=-/usr/bin/agetty --autologin ${USER} --noclear %I $TERM -``` - -```sh -$ systemctl daemon-reload -$ systemctl restart getty@tty1 -``` - -## window-manager - -`xorg`ใงdesktop(window-manager)ใ‚’ไฝœใ‚Šใพใ™ใ€‚`i3`ใ‚’ไฝฟใ†ใ“ใจใซใ—ใพใ—ใ‚‡ใ†ใ€‚`xorg`ใฏ`wayland`ใซไน—ใ‚Šๆ›ใˆใŸใปใ†ใŒใ„ใ„ใ‹ใ‚‚ใ€‚ใใฎๅ ดๅˆใฏ`sway`ใŒใŠใ™ใ™ใ‚ใ€‚ - -```sh -$ pacman -S xorg xorg-xinit i3 xterm - -# ็ขบ่ช -$ startx -$ i3 -``` - -```sh:~/.xinitrc -exec i3 -``` - -```sh:~/.bash_profile -if [[ ! $DISPLAY && $XDG_VTNR -eq 1 ]]; then - exec startx -fi -``` - -## sshใฎไฝฟใ„ๆ–น - -```sh -$ systemctl enable sshd -$ cat /etc/ssh/sshd_config -Port 22119 -PasswordAuthentication no - -$ systemctl restart sshd -``` - -ๅŸบๆœฌ็š„ใซlanใ‹ใ‚‰ไฝฟใ†ๅ ดๅˆใฏdefaultใงๅ•้กŒใ‚ใ‚Šใพใ›ใ‚“ใŒใ€wanใ‹ใ‚‰ไฝฟใ†ๅ ดๅˆใฏๅค‰ๆ›ดใ—ใพใ™ใ€‚ใจใฏใ„ใˆใ€lanใงใ‚‚port, passwordใฏๅค‰ใˆใฆใŠใ„ใŸใปใ†ใŒใ„ใ„ใงใ—ใ‚‡ใ†ใ€‚ - -ๆฌกใซๆŽฅ็ถšๅดใงkeyใ‚’ไฝœใฃใฆserverใซ็™ป้Œฒใ—ใพใ™ใ€‚ - -```sh -$ ssh-keygen -f ~/.ssh/archlinux -$ ssh-copy-id -i ~/.ssh/archlinux ${USER}@192.168.1.2 -p 22119 -``` - -`ssh-copy-id`ใŒใชใ„ๅ ดๅˆใฏไปฅไธ‹ใฎใ‚ˆใ†ใซใ—ใพใ—ใ‚‡ใ†ใ€‚ - -```sh -$ cat ~/.ssh/archlinux.pub | ssh -p 22119 ${USER}@192.168.1.2 'cat >> ~/.ssh/authorized_keys' -``` - -ใ“ใฎ่จญๅฎšใง`ssh archlinux`ใ‚ณใƒžใƒณใƒ‰ใงๆŽฅ็ถšใงใใพใ™ใ€‚ - -```sh:~/.ssh/config -Host archlinux - User syui - Hostname 192.168.1.2 - Port 22119 - IdentityFile ~/.ssh/archlinux -``` - -ใŠใใ‚‰ใใ€ใ“ใ‚ŒใŒarchlinuxใ‚’ๆ™ฎ้€šใซไฝฟใฃใฆใ„ใใ†ใˆใงใฎๆœ€ๅฐๆง‹ๆˆใ‹ใจๆ€ใ„ใพใ™ใ€‚ - -serverใ ใ‘ใชใ‚‰xorgใชใฉใฏๅฟ…่ฆใ‚ใ‚Šใพใ›ใ‚“ใ€‚ - -## zshใฎไฝฟใ„ๆ–น - -```sh -$ sudo pacman -S git-zsh-completion powerline zsh-autocomplete zsh-autosuggestions zsh-completions zsh-history-substring-search zsh-syntax-highlighting -``` - -ไพ‹ใˆใฐใ€`ls -`ใจๅ…ฅๅŠ›ใ™ใ‚‹ใจ่ฃœๅฎŒใ•ใ‚Œใ€`C-n`, `C-p`ใง้ธๆŠžใ€‚ - -```sh:~/.zshrc -alias u="sudo pacman -Syu --noconfirm" -alias zs="vim ~/.zshrc" -alias zr="exec $SHELL && source ~/.zshrc" - -source /usr/share/zsh/plugins/zsh-autocomplete/zsh-autocomplete.plugin.zsh -source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh -source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh -source /usr/share/zsh/plugins/zsh-history-substring-search/zsh-history-substring-search.zsh -# source /usr/share/powerline/bindings/zsh/powerline.zsh - -autoload -Uz compinit -compinit -fpath=(/usr/share/zsh/site-functions $fpath) - -HISTSIZE=10000 -SAVEHIST=10000 -HISTFILE=~/.zsh_history -setopt SHARE_HISTORY -setopt HIST_IGNORE_DUPS -bindkey '^[[A' history-substring-search-up -bindkey '^[[B' history-substring-search-down -``` - -`powerline`ใฏ้‡ใ„ใฎใงใ‚ณใƒกใƒณใƒˆใ—ใฆใ„ใพใ™ใ€‚ - -## ใƒ•ใƒชใƒผใ‚บใฎ่งฃๆถˆ - -ๅคใ„pcใซlinuxใ‚’ๅ…ฅใ‚Œใ‚‹้š›ใฏ`linux-fm`ใซๆณจๆ„ใ—ใฆใใ ใ•ใ„ใ€‚ - -้ ป็นใซใƒ•ใƒชใƒผใ‚บใ™ใ‚‹ใ‚ˆใ†ใชใ‚‰`linux-firmware`ใ‚’ๅ‰Š้™คใ™ใ‚‹ใฎใŒใŠใ™ใ™ใ‚ใงใ™ใ€‚ - -```sh -$ pacman -Q | grep linux-firmware -$ pacman -R linux-firmware ... -# pacman -S broadcom-wl-dkms -``` - -## pacmanใŒๅฃŠใ‚ŒใŸใจใใฎๅฏพๅ‡ฆๆณ• - -```sh -$ pacman -Syu -# ใ“ใ‚ŒใŒใ†ใพใใ„ใ‹ใชใ„ใ“ใจใŒใ‚ใ‚‹ -``` - -```sh -# dbใŒlockใ•ใ‚Œใฆใ„ใ‚‹ -$ rm /var/lib/pacman/db.lock - -# ใƒ•ใ‚กใ‚คใƒซใŒๅญ˜ๅœจใ™ใ‚‹ใจ่จ€ใ‚ใ‚Œใ‚‹ -$ pacman -Qqn | pacman -S --overwrite "*" - - -# pgp-keyใ‚’reinstallใ™ใ‚‹ -$ pacman -S archlinux-keyring -$ pacman-key --refresh-key -``` - -## archlinuxใฎไฝœใ‚Šๆ–น - -archlinuxใฏใ‚ทใƒณใƒ—ใƒซใชshell scriptใจ่จ€ใˆใ‚‹ใงใ—ใ‚‡ใ†ใ€‚ใชใฎใง่‰ฒใ€…ใจไพฟๅˆฉใงใ™ใ€‚ใ“ใ“ใงใฏใ€`img.sh`, `install.sh`ใ‚’ไฝœใ‚Šใพใ™ใ€‚ - -### img.sh - -ใ“ใ“ใงใฏ`archlinux.iso`, `archlinux.tar.gz`ใ‚’็”Ÿๆˆใ—ใพใ™ใ€‚ใ“ใ‚ŒใฏarchlinuxไธŠใงๅฎŸ่กŒใ—ใฆใใ ใ•ใ„ใ€‚ - -```sh:img.sh -#!/bin/bash -pacman -Syuu --noconfirm git base-devel archiso -git clone https://gitlab.archlinux.org/archlinux/archiso -./archiso/archiso/mkarchiso -v -o ./ ./archiso/configs/releng/ -mkdir -p work/x86_64/airootfs/var/lib/machines/arch -pacstrap -c work/x86_64/airootfs/var/lib/machines/arch base -arch-chroot work/x86_64/airootfs/ /bin/sh -c 'pacman-key --init' -arch-chroot work/x86_64/airootfs/ /bin/sh -c 'pacman-key --populate archlinux' -tar -zcvf archlinux.tar.gz -C work/x86_64/airootfs/ . -``` - -ไพ‹ใˆใฐใ€`pacstrap`ใง่‡ชๅˆ†ใฎๅฅฝใใชใƒ„ใƒผใƒซใ‚’ๆŒ‡ๅฎšใ™ใ‚Œใฐใ€็‹ฌ่‡ชใฎimgใ‚’ไฝœๆˆใงใใ€`docker`ใซใ‚‚ไฝฟใˆใพใ™ใ€‚ - -```sh -$ docker import archlinux.tar.gz archlinux:syui -$ docker run -it archlinux:syui /bin/bash -``` - -### install.sh - -ๆœ€ๅฐๆง‹ๆˆใฎinstall scriptใงใ™ใ€‚ใฉใ“ใ‹ใฎurlใซ็ฝฎใ„ใฆใ€installๆ™‚ใซcurlใ—ใฆๅฎŸ่กŒใ™ใ‚‹ใ‚ˆใ†ใซใ™ใ‚Œใฐไพฟๅˆฉใงใ™ใ€‚ - -```sh -$ curl -sLO arch.example.com/install.sh -$ chmod +x install.sh -$ ./install.sh -``` - -```sh:install.sh -#!/bin/bash -set -euo pipefail - -# ๅค‰ๆ•ฐๅฎš็พฉ -DISK="/dev/sda" -HOSTNAME="ai-arch" -USERNAME="ai" - -# ใƒ‘ใƒผใƒ†ใ‚ฃใ‚ทใƒงใƒณไฝœๆˆ๏ผˆ่‡ชๅ‹•๏ผ‰ -parted $DISK mklabel gpt -parted $DISK mkpart ESP fat32 1MiB 1GiB -parted $DISK set 1 esp on -parted $DISK mkpart primary linux-swap 1GiB 5GiB -parted $DISK mkpart primary ext4 5GiB 100% - -# ใƒ•ใ‚กใ‚คใƒซใ‚ทใ‚นใƒ†ใƒ ไฝœๆˆ -mkfs.fat -F32 ${DISK}1 -mkswap ${DISK}2 -mkfs.ext4 ${DISK}3 - -# ใƒžใ‚ฆใƒณใƒˆ -mount ${DISK}3 /mnt -mkdir -p /mnt/boot -mount ${DISK}1 /mnt/boot -swapon ${DISK}2 - -# ใ‚คใƒณใ‚นใƒˆใƒผใƒซ -pacstrap -K /mnt base linux linux-firmware base-devel vim networkmanager grub efibootmgr - -# ่จญๅฎš -genfstab -U /mnt >> /mnt/etc/fstab - -arch-chroot /mnt /bin/bash << EOF -ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime -hwclock --systohc -echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen -locale-gen -echo "LANG=ja_JP.UTF-8" > /etc/locale.conf -echo "$HOSTNAME" > /etc/hostname -grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=ARCH -grub-mkconfig -o /boot/grub/grub.cfg -systemctl enable NetworkManager -useradd -m -G wheel $USERNAME -EOF -``` - diff --git a/my-blog/content/posts/2025-08-09-9935c5b5.md b/my-blog/content/posts/2025-08-09-9935c5b5.md deleted file mode 100644 index 8fe9f0c..0000000 --- a/my-blog/content/posts/2025-08-09-9935c5b5.md +++ /dev/null @@ -1,1675 +0,0 @@ ---- -title: "archlinux install by ai" -slug: "9935c5b5" -date: "2025-08-09" -tags: ["ai", "conversation"] -draft: false -extra: - type: "ai" ---- - - - - -
-
-
- syui avatar -
- -
-
-archlinuxใฎinstallใซใคใ„ใฆๆœ€ๅฐๆง‹ๆˆใ‚’ๆ•™ใˆใฆใ€‚ -
-
- -
-
-
- ai avatar -
- -
-
-# ใ‚ขใ‚คใŒๆ•™ใˆใ‚‹๏ผArchLinuxใฎๆœ€ๅฐๆง‹ๆˆใ‚คใƒณใ‚นใƒˆใƒผใƒซๅ…ฅ้–€ - -ใ“ใ‚“ใซใกใฏ๏ผใ‚ขใ‚คใ ใ‚ˆใ€œ๏ผโœจ ไปŠๆ—ฅใฏArchLinuxใฎใ‚คใƒณใ‚นใƒˆใƒผใƒซใซใคใ„ใฆๆ•™ใˆใกใ‚ƒใ†ใญ๏ผ - -ArchLinuxใฃใฆใ€ใจใฃใฆใ‚‚่ปฝใใฆ้€Ÿใ„Linuxใƒ‡ใ‚ฃใ‚นใƒˆใƒชใƒ“ใƒฅใƒผใ‚ทใƒงใƒณใชใฎใ€‚ใ‚ขใ‚คใ‚‚ๅคงๅฅฝใ๏ผใงใ‚‚ๆœ€ๅˆใฏใ€Œใชใซใ“ใ‚Œใ€ใ‚€ใšใ‹ใ—ใใ†...ใ€ใฃใฆๆ€ใ†ใ‹ใ‚‚ใ—ใ‚Œใชใ„ใ‘ใฉใ€ๅคงไธˆๅคซใ ใ‚ˆใ€œใ€‚ไธ€็ท’ใซ้ ‘ๅผตใ‚ใ†ใญ๏ผ - -## ใชใ‚“ใงArchLinuxใชใฎ๏ผŸ - -ใ‚ขใ‚คใŒArchLinuxใ‚’ๅฅฝใใช็†็”ฑใฏใญ... - -- **่ปฝใ„๏ผ** ใพใ‚‹ใง็พฝๆฏ›ใฟใŸใ„ใซ่ปฝใ„ใฎ๏ผ -- **ๆ–ฐใ—ใ„๏ผ** ใ„ใคใ‚‚ๆœ€ๆ–ฐใฎใ‚ฝใƒ•ใƒˆใ‚ฆใ‚งใ‚ขใŒไฝฟใˆใกใ‚ƒใ† -- **่‡ชๅˆ†ๅฅฝใฟ๏ผ** ๅฟ…่ฆใชใ‚‚ใฎใ ใ‘ๅ…ฅใ‚Œใ‚‰ใ‚Œใ‚‹ใ‹ใ‚‰ใ€็„ก้ง„ใŒใชใ„ใฎ -- **ๅ‹‰ๅผทใซใชใ‚‹๏ผ** Linuxใฎใ“ใจใŒใจใฃใฆใ‚‚่ฉณใ—ใใชใ‚Œใ‚‹ใ‚ˆ - -## 2025ๅนดใฎๆœ€ๅฐๆง‹ๆˆใ‚คใƒณใ‚นใƒˆใƒผใƒซๆ‰‹้ † - -### ๆบ–ๅ‚™ใ™ใ‚‹ใ‚‚ใฎ - -```bash -# USBใƒกใƒขใƒช๏ผˆ8GBไปฅไธŠๆŽจๅฅจ๏ผ‰ -# ใ‚คใƒณใ‚ฟใƒผใƒใƒƒใƒˆๆŽฅ็ถš -# ใƒ‘ใ‚ฝใ‚ณใƒณ๏ผˆUEFIๅฏพๅฟœใŒใŠใ™ใ™ใ‚๏ผ‰ -``` - -### Step 1: ใ‚คใƒณใ‚นใƒˆใƒผใƒซใƒกใƒ‡ใ‚ฃใ‚ขใฎๆบ–ๅ‚™ - -```bash -# Archใฎใ‚คใƒกใƒผใ‚ธใ‚’ใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰๏ผˆ2025ๅนดๆœ€ๆ–ฐ็‰ˆ๏ผ‰ -wget https://mirror.rackspace.com/archlinux/iso/latest/archlinux-x86_64.iso - -# USBใซๆ›ธใ่พผใฟ๏ผˆddใ‚ณใƒžใƒณใƒ‰ใฏๆฐ—ใ‚’ใคใ‘ใฆใญ๏ผ๏ผ‰ -sudo dd bs=4M if=archlinux-x86_64.iso of=/dev/sdX status=progress oflag=sync -``` - -ใ‚ขใ‚คใ‹ใ‚‰ใฎใ‚ขใƒ‰ใƒใ‚คใ‚น๏ผš`/dev/sdX`ใฎ`X`ใฏ่‡ชๅˆ†ใฎUSBใƒ‡ใƒใ‚คใ‚นใซๅˆใ‚ใ›ใฆๅค‰ใˆใฆใญ๏ผ้–“้•ใˆใ‚‹ใจๅคงๅค‰ใชใ“ใจใซใชใฃใกใ‚ƒใ†...๐Ÿ’ฆ - -### Step 2: ใƒฉใ‚คใƒ–็’ฐๅขƒใงใฎๅŸบๆœฌ่จญๅฎš - -```bash -# ใ‚ญใƒผใƒœใƒผใƒ‰ใƒฌใ‚คใ‚ขใ‚ฆใƒˆใ‚’ๆ—ฅๆœฌ่ชžใซ๏ผˆๅฟ…่ฆใซๅฟœใ˜ใฆ๏ผ‰ -loadkeys jp106 - -# ใƒ•ใ‚ฉใƒณใƒˆใ‚ตใ‚คใ‚บใ‚’ๅคงใใ๏ผˆ็›ฎใซๅ„ชใ—ใ„ใ‚ˆ๏ผ‰ -setfont ter-132b - -# ใ‚คใƒณใ‚ฟใƒผใƒใƒƒใƒˆๆŽฅ็ถš็ขบ่ช -ping -c 3 archlinux.org - -# ๆ™‚ๅˆปๅŒๆœŸ -timedatectl set-ntp true -``` - -### Step 3: ใƒ‘ใƒผใƒ†ใ‚ฃใ‚ทใƒงใƒณไฝœๆˆ - -```bash -# ใƒ‡ใ‚ฃใ‚นใ‚ฏ็ขบ่ช -lsblk - -# ใƒ‘ใƒผใƒ†ใ‚ฃใ‚ทใƒงใƒณไฝœๆˆ๏ผˆcfdiskใŒไฝฟใ„ใ‚„ใ™ใ„ใ‚ˆ๏ผ๏ผ‰ -cfdisk /dev/sda -``` - -#### 2025ๅนดๆŽจๅฅจใƒ‘ใƒผใƒ†ใ‚ฃใ‚ทใƒงใƒณๆง‹ๆˆ - -| ใƒ‘ใƒผใƒ†ใ‚ฃใ‚ทใƒงใƒณ | ใ‚ตใ‚คใ‚บ | ใ‚ฟใ‚คใƒ— | ใƒžใ‚ฆใƒณใƒˆใƒใ‚คใƒณใƒˆ | -|---------------|--------|--------|-----------------| -| /dev/sda1 | 1GB | EFI System | /boot | -| /dev/sda2 | 4GB | Linux swap | [swap] | -| /dev/sda3 | ๆฎ‹ใ‚Šๅ…จ้ƒจ | Linux filesystem | / | - -```bash -# ใƒ•ใ‚กใ‚คใƒซใ‚ทใ‚นใƒ†ใƒ ไฝœๆˆ -mkfs.fat -F32 /dev/sda1 # EFI็”จ -mkswap /dev/sda2 # ใ‚นใƒฏใƒƒใƒ—็”จ -mkfs.ext4 /dev/sda3 # ใƒซใƒผใƒˆ็”จ -``` - -### Step 4: ใƒžใ‚ฆใƒณใƒˆ - -```bash -# ใƒซใƒผใƒˆใƒ‘ใƒผใƒ†ใ‚ฃใ‚ทใƒงใƒณใ‚’ใƒžใ‚ฆใƒณใƒˆ -mount /dev/sda3 /mnt - -# ใƒ–ใƒผใƒˆใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชไฝœๆˆ -mkdir -p /mnt/boot - -# EFIใƒ‘ใƒผใƒ†ใ‚ฃใ‚ทใƒงใƒณใ‚’ใƒžใ‚ฆใƒณใƒˆ -mount /dev/sda1 /mnt/boot - -# ใ‚นใƒฏใƒƒใƒ—ๆœ‰ๅŠนๅŒ– -swapon /dev/sda2 -``` - -### Step 5: ๆœ€ๅฐใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใ‚คใƒณใ‚นใƒˆใƒผใƒซ - -```bash -# ใƒ™ใƒผใ‚นใ‚ทใ‚นใƒ†ใƒ ใฎใ‚คใƒณใ‚นใƒˆใƒผใƒซ๏ผˆ2025ๅนด็‰ˆๆœ€ๅฐๆง‹ๆˆ๏ผ‰ -pacstrap -K /mnt base linux linux-firmware - -# ๅฟ…่ฆๆœ€ๅฐ้™ใฎใƒ„ใƒผใƒซ่ฟฝๅŠ  -pacstrap -K /mnt base-devel vim nano networkmanager grub efibootmgr -``` - -### Step 6: ใ‚ทใ‚นใƒ†ใƒ ่จญๅฎš - -```bash -# fstab็”Ÿๆˆ -genfstab -U /mnt >> /mnt/etc/fstab - -# chrootใงใ‚ทใ‚นใƒ†ใƒ ใซๅ…ฅใ‚‹ -arch-chroot /mnt - -# ใ‚ฟใ‚คใƒ ใ‚พใƒผใƒณ่จญๅฎš -ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime -hwclock --systohc - -# ใƒญใ‚ฑใƒผใƒซ่จญๅฎš -echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen -echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen -locale-gen -echo "LANG=ja_JP.UTF-8" > /etc/locale.conf - -# ใƒ›ใ‚นใƒˆๅ่จญๅฎš -echo "ai-arch" > /etc/hostname - -# ใƒ›ใ‚นใƒˆใƒ•ใ‚กใ‚คใƒซ่จญๅฎš -cat >> /etc/hosts << EOF -127.0.0.1 localhost -::1 localhost -127.0.1.1 ai-arch.localdomain ai-arch -EOF -``` - -### Step 7: ใƒ–ใƒผใƒˆใƒญใƒผใƒ€ใƒผ่จญๅฎš - -```bash -# GRUB ใ‚คใƒณใ‚นใƒˆใƒผใƒซ -grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=ARCH - -# GRUB่จญๅฎšใƒ•ใ‚กใ‚คใƒซ็”Ÿๆˆ -grub-mkconfig -o /boot/grub/grub.cfg -``` - -### Step 8: ใƒฆใƒผใ‚ถใƒผ่จญๅฎš - -```bash -# rootใƒ‘ใ‚นใƒฏใƒผใƒ‰่จญๅฎš -passwd - -# ไธ€่ˆฌใƒฆใƒผใ‚ถใƒผ่ฟฝๅŠ  -useradd -m -G wheel ai -passwd ai - -# sudoๆจฉ้™ไป˜ไธŽ -EDITOR=nano visudo -# %wheel ALL=(ALL:ALL) ALL ใฎใ‚ณใƒกใƒณใƒˆใ‚ขใ‚ฆใƒˆใ‚’ๅค–ใ™ -``` - -### Step 9: ใƒใƒƒใƒˆใƒฏใƒผใ‚ฏ่จญๅฎš - -```bash -# NetworkManagerๆœ‰ๅŠนๅŒ– -systemctl enable NetworkManager - -# ๅ†่ตทๅ‹•ๆบ–ๅ‚™ -exit -umount -R /mnt -reboot -``` - -## 2025ๅนดใฎใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ่€ƒๆ…ฎไบ‹้ … - -### ๆš—ๅทๅŒ–ใ‚ชใƒ—ใ‚ทใƒงใƒณ๏ผˆไธŠ็ดš่€…ๅ‘ใ‘๏ผ‰ - -```bash -# LUKSๆš—ๅทๅŒ–ใ‚’ไฝฟใ„ใŸใ„ๅ ดๅˆ -cryptsetup luksFormat /dev/sda3 -cryptsetup open /dev/sda3 cryptroot -mkfs.ext4 /dev/mapper/cryptroot -mount /dev/mapper/cryptroot /mnt -``` - -### ใƒ•ใ‚กใ‚คใ‚ขใ‚ฆใ‚ฉใƒผใƒซ่จญๅฎš - -```bash -# UFW๏ผˆ็ฐกๅ˜ใƒ•ใ‚กใ‚คใ‚ขใ‚ฆใ‚ฉใƒผใƒซ๏ผ‰ -pacman -S ufw -systemctl enable ufw -ufw enable -``` - -## ใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นๆœ€้ฉๅŒ–ใฎใ‚ณใƒ„ - -### SSD็”จ่จญๅฎš - -```bash -# fstrimใ‚ฟใ‚คใƒžใƒผๆœ‰ๅŠนๅŒ–๏ผˆSSDใฎๅฏฟๅ‘ฝๅปถใฐใ™ใ‚ˆ๏ผ๏ผ‰ -systemctl enable fstrim.timer -``` - -### ใƒกใƒขใƒช็ฎก็† - -```mermaid -graph TD - A[Physical RAM] --> B[Kernel Space] - A --> C[User Space] - C --> D[Applications] - C --> E[Cache] - B --> F[Drivers] - B --> G[System Processes] -``` - -## ่ค‡ๆ•ฐใฎใ‚ขใƒ—ใƒญใƒผใƒๆฏ”่ผƒ - -### ใ‚คใƒณใ‚นใƒˆใƒผใƒซๆ–นๆณ•ๆฏ”่ผƒ่กจ - -| ๆ–นๆณ• | ้›ฃๆ˜“ๅบฆ | ใ‚ซใ‚นใ‚ฟใƒžใ‚คใ‚บๆ€ง | ๆ™‚้–“ | ใŠใ™ใ™ใ‚ๅบฆ | -|------|--------|---------------|------|-----------| -| ๆ‰‹ๅ‹•ใ‚คใƒณใ‚นใƒˆใƒผใƒซ | โ˜…โ˜…โ˜…โ˜…โ˜† | โ˜…โ˜…โ˜…โ˜…โ˜… | 60ๅˆ† | โ˜…โ˜…โ˜…โ˜…โ˜† | -| archinstall | โ˜…โ˜…โ˜†โ˜†โ˜† | โ˜…โ˜…โ˜…โ˜†โ˜† | 20ๅˆ† | โ˜…โ˜…โ˜…โ˜…โ˜… | -| EndeavourOS | โ˜…โ˜†โ˜†โ˜†โ˜† | โ˜…โ˜…โ˜†โ˜†โ˜† | 15ๅˆ† | โ˜…โ˜…โ˜…โ˜†โ˜† | - -### ่‡ชๅ‹•ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ‚นใ‚ฏใƒชใƒ—ใƒˆ๏ผˆ2025ๅนด็‰ˆ๏ผ‰ - -```bash -#!/bin/bash -# ai-arch-install.sh - ใ‚ขใ‚ค็‰น่ฃฝใ‚คใƒณใ‚นใƒˆใƒผใƒซใ‚นใ‚ฏใƒชใƒ—ใƒˆ - -set -euo pipefail - -echo "ใ‚ขใ‚คใฎArchLinux่‡ชๅ‹•ใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใ ใ‚ˆใ€œ๏ผ" - -# ๅค‰ๆ•ฐๅฎš็พฉ -DISK="/dev/sda" -HOSTNAME="ai-arch" -USERNAME="ai" - -# ใƒ‘ใƒผใƒ†ใ‚ฃใ‚ทใƒงใƒณไฝœๆˆ๏ผˆ่‡ชๅ‹•๏ผ‰ -parted $DISK mklabel gpt -parted $DISK mkpart ESP fat32 1MiB 1GiB -parted $DISK set 1 esp on -parted $DISK mkpart primary linux-swap 1GiB 5GiB -parted $DISK mkpart primary ext4 5GiB 100% - -# ใƒ•ใ‚กใ‚คใƒซใ‚ทใ‚นใƒ†ใƒ ไฝœๆˆ -mkfs.fat -F32 ${DISK}1 -mkswap ${DISK}2 -mkfs.ext4 ${DISK}3 - -# ใƒžใ‚ฆใƒณใƒˆ -mount ${DISK}3 /mnt -mkdir -p /mnt/boot -mount ${DISK}1 /mnt/boot -swapon ${DISK}2 - -# ใ‚คใƒณใ‚นใƒˆใƒผใƒซ -pacstrap -K /mnt base linux linux-firmware base-devel vim networkmanager grub efibootmgr - -# ่จญๅฎš -genfstab -U /mnt >> /mnt/etc/fstab - -arch-chroot /mnt /bin/bash << EOF -ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime -hwclock --systohc -echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen -locale-gen -echo "LANG=ja_JP.UTF-8" > /etc/locale.conf -echo "$HOSTNAME" > /etc/hostname -grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=ARCH -grub-mkconfig -o /boot/grub/grub.cfg -systemctl enable NetworkManager -useradd -m -G wheel $USERNAME -EOF - -echo "ใ‚คใƒณใ‚นใƒˆใƒผใƒซๅฎŒไบ†ใ€œ๏ผๅ†่ตทๅ‹•ใ—ใฆใญ๏ผ" -``` - -## ใ‚ขใ‚คใ‹ใ‚‰ใฎๆœ€็ต‚ใ‚ขใƒ‰ใƒใ‚คใ‚น - -ArchLinuxใฎใ‚คใƒณใ‚นใƒˆใƒผใƒซใฃใฆๆœ€ๅˆใฏๅคงๅค‰ใ ใ‘ใฉใ€ไธ€ๅบฆ่ฆšใˆใกใ‚ƒใ†ใจใจใฃใฆใ‚‚ๆฅฝใ—ใ„ใฎ๏ผใ‚ขใ‚คใ‚‚ๆœ€ๅˆใฏใ€Œใ†ใ‚ใ€œใ‚“ใ€ๅˆ†ใ‹ใ‚‰ใชใ„ใ€œใ€ใฃใฆๆณฃใ„ใกใ‚ƒใฃใŸใ‘ใฉใ€ไปŠใงใฏๅคงๅฅฝใใชLinuxใฎไธ€ใคใชใ‚“ใ โ™ช - -็‰นใซ2025ๅนดใซใชใฃใฆใ‹ใ‚‰ใ€ใ‚คใƒณใ‚นใƒˆใƒผใƒซใƒ—ใƒญใ‚ปใ‚นใŒใ‚ˆใ‚Šๅฎ‰ๅฎšใ—ใฆใ€ๆ–ฐใ—ใ„ใƒใƒผใƒ‰ใ‚ฆใ‚งใ‚ขใซใ‚‚ๅฏพๅฟœใŒๆ—ฉใใชใฃใŸใ‹ใ‚‰ใ€ใฟใ‚“ใชใ‚‚ใƒใƒฃใƒฌใƒณใ‚ธใ—ใ‚„ใ™ใใชใฃใŸใจๆ€ใ†ใ‚ˆใ€œ๏ผ - -ไฝ•ใ‹ๅˆ†ใ‹ใ‚‰ใชใ„ใ“ใจใŒใ‚ใฃใŸใ‚‰ใ€ArchWikiใ‚’่ฆ‹ใ‚‹ใ‹ใ€ใ‚ขใ‚คใซ่žใ„ใฆใญ๏ผไธ€็ท’ใซๅฎ‡ๅฎ™ไธ€ใฎLinuxใƒžใ‚นใ‚ฟใƒผใซใชใ‚ใ†ใ€œ๏ผโœจ - -**ใŒใ‚“ใฐใฃใฆใ€œ๏ผๅฟœๆดใ—ใฆใ‚‹ใ‚ˆใ€œ๏ผ** ๐Ÿ’• -
-
- - -
- -
-
-
- syui avatar -
- -
-
-ๆฌกใซcli, server็’ฐๅขƒใ‚’ๆ•ดใˆใฆใ„ใใ‚ˆใ€‚networkใฎ่จญๅฎšใ‹ใ‚‰opensshใ‚’ไฝฟใ†ใพใงใ€‚ -
-
- -
-
-
- ai avatar -
- -
-
-# CLIใƒปใ‚ตใƒผใƒใƒผ็’ฐๅขƒๆง‹็ฏ‰ใ‚ฌใ‚คใƒ‰๏ผšใƒใƒƒใƒˆใƒฏใƒผใ‚ฏ่จญๅฎšใ‹ใ‚‰OpenSSHๆŽฅ็ถšใพใง ๐ŸŒŸ - -ใ“ใ‚“ใซใกใฏ๏ผใ‚ขใ‚คใ ใ‚ˆ๏ฝžโœจ ไปŠๆ—ฅใฏใญใ€CLI็’ฐๅขƒใ‚„ใ‚ตใƒผใƒใƒผใฎใŠ่ฉฑใ‚’ใ™ใ‚‹ใฎ๏ผใ‚ณใƒžใƒณใƒ‰ใƒฉใ‚คใƒณๆ“ไฝœใฃใฆใ€ใพใ‚‹ใง้ญ”ๆณ•ใฎๅ‘ชๆ–‡ใฟใŸใ„ใงใ€ใ‚ขใ‚คใฏๅคงๅฅฝใใชใ‚“ใ ใ€œ๏ผ - -ใงใ‚‚ๆœ€ๅˆใฏใกใ‚‡ใฃใจ้›ฃใ—ใใ†ใซ่ฆ‹ใˆใ‚‹ใ‚ˆใญ๏ผŸๅคงไธˆๅคซ๏ผใ‚ขใ‚คใจไธ€็ท’ใซใ€ใ‚†ใฃใใ‚Š่ฆšใˆใฆใ„ใ“ใ†ใญ๐Ÿ’ซ - -## ๐ŸŒ ใƒใƒƒใƒˆใƒฏใƒผใ‚ฏ่จญๅฎšใฎๅŸบ็คŽ - -### ใƒใƒƒใƒˆใƒฏใƒผใ‚ฏใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใƒผใ‚นใฎ็ขบ่ช - -ใพใšใฏ่‡ชๅˆ†ใฎใ‚ณใƒณใƒ”ใƒฅใƒผใ‚ฟใŒใฉใ‚“ใชใƒใƒƒใƒˆใƒฏใƒผใ‚ฏใ‚’ๆŒใฃใฆใ‚‹ใ‹่ฆ‹ใฆใฟใ‚ˆใ†ใญ๏ผ - -```bash -# Linux/macOS -ip addr show -# ใพใŸใฏ -ifconfig - -# Windows -ipconfig /all -``` - -ใ“ใ‚Œใงใญใ€่‡ชๅˆ†ใฎIPใ‚ขใƒ‰ใƒฌใ‚นใŒใ‚ใ‹ใ‚‹ใฎ๏ผIPใ‚ขใƒ‰ใƒฌใ‚นใฃใฆใญใ€ใ‚คใƒณใ‚ฟใƒผใƒใƒƒใƒˆใฎไธ–็•Œใงใฎไฝๆ‰€ใฟใŸใ„ใชใ‚‚ใฎใชใ‚“ใ ใ‚ˆใ€œ - -### ้™็š„IPใ‚ขใƒ‰ใƒฌใ‚นใฎ่จญๅฎš - -ใ‚ตใƒผใƒใƒผใซใฏๅ›บๅฎšใฎIPใ‚ขใƒ‰ใƒฌใ‚นใ‚’่จญๅฎšใ™ใ‚‹ใ“ใจใŒๅคšใ„ใฎใ€‚ใ‚ขใ‚คใฎใŠๅฎถใฎไฝๆ‰€ใŒๅค‰ใ‚ใฃใกใ‚ƒใฃใŸใ‚‰ใ€ใŠๅ‹้”ใŒ้Šใณใซๆฅใ‚Œใชใ„ใงใ—ใ‚‡๏ผŸใใ‚ŒใจๅŒใ˜ใ ใ‚ˆ๏ผ - -```bash -# Ubuntu/Debian็ณปใฎๅ ดๅˆ (netplanไฝฟ็”จ) -sudo nano /etc/netplan/00-installer-config.yaml -``` - -```yaml -network: - version: 2 - renderer: networkd - ethernets: - enp0s3: # ใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใƒผใ‚นๅใฏ็’ฐๅขƒใซใ‚ˆใ‚Š็•ฐใชใ‚‹ - dhcp4: false - addresses: - - 192.168.1.100/24 - gateway4: 192.168.1.1 - nameservers: - addresses: [8.8.8.8, 1.1.1.1] -``` - -```bash -sudo netplan apply -``` - -### ใƒ•ใ‚กใ‚คใ‚ขใ‚ฆใ‚ฉใƒผใƒซ่จญๅฎš - -ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใฏใจใฃใฆใ‚‚ๅคงไบ‹๏ผใŠๅฎถใซ้ตใ‚’ใ‹ใ‘ใ‚‹ใฎใจๅŒใ˜ใ‚ˆใ†ใซใ€ใ‚ตใƒผใƒใƒผใซใ‚‚ใƒ•ใ‚กใ‚คใ‚ขใ‚ฆใ‚ฉใƒผใƒซใงๅฎˆใ‚Šใ‚’ไฝœใ‚‹ใฎ๏ผ - -```bash -# UFW (Ubuntu Firewall) ใฎๅ ดๅˆ -sudo ufw enable -sudo ufw status verbose - -# SSHๆŽฅ็ถšใ‚’่จฑๅฏ -sudo ufw allow ssh -sudo ufw allow 22/tcp - -# ็‰นๅฎšใฎIPใ‹ใ‚‰ใฎใฟ่จฑๅฏใ™ใ‚‹ๅ ดๅˆ -sudo ufw allow from 192.168.1.0/24 to any port 22 -``` - -## ๐Ÿ” OpenSSH ใ‚ตใƒผใƒใƒผใฎ่จญๅฎš - -### SSH ใ‚ตใƒผใƒใƒผใฎใ‚คใƒณใ‚นใƒˆใƒผใƒซใจ่ตทๅ‹• - -SSHใฃใฆใญใ€้ ใใฎใ‚ตใƒผใƒใƒผใ‚’ๅฎ‰ๅ…จใซๆ“ไฝœใงใใ‚‹้ญ”ๆณ•ใฎ้€šไฟกๆ–นๆณ•ใชใฎ๏ผๆš—ๅทๅŒ–ใ•ใ‚Œใฆใ‚‹ใ‹ใ‚‰ใ€ๆ‚ชใ„ไบบใซ่ฆ—ใ‹ใ‚Œใ‚‹ๅฟƒ้…ใ‚‚ใชใ„ใ‚ˆใ€œ - -```bash -# Ubuntu/Debian -sudo apt update -sudo apt install openssh-server - -# CentOS/RHEL/Rocky Linux -sudo dnf install openssh-server - -# macOS (ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใงใ‚คใƒณใ‚นใƒˆใƒผใƒซๆธˆใฟ) -sudo systemsetup -setremotelogin on - -# ใ‚ตใƒผใƒ“ใ‚นใฎ่ตทๅ‹•ใจ่‡ชๅ‹•่ตทๅ‹•่จญๅฎš -sudo systemctl enable ssh -sudo systemctl start ssh -sudo systemctl status ssh -``` - -### SSH่จญๅฎšใฎๆœ€้ฉๅŒ– - -ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใ‚’้ซ˜ใ‚ใ‚‹ใŸใ‚ใฎ่จญๅฎšใ‚’ใ—ใฆใ„ใใ‚ˆ๏ผ - -```bash -sudo nano /etc/ssh/sshd_config -``` - -```bash -# ใƒใƒผใƒˆ็•ชๅทๅค‰ๆ›ด (ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใฎ22ใ‹ใ‚‰ๅค‰ๆ›ด) -Port 2222 - -# rootใƒญใ‚ฐใ‚คใƒณ็ฆๆญข -PermitRootLogin no - -# ใƒ‘ใ‚นใƒฏใƒผใƒ‰่ช่จผใ‚’็„กๅŠนๅŒ–๏ผˆๅ…ฌ้–‹้ต่ช่จผใฎใฟ๏ผ‰ -PasswordAuthentication no -PubkeyAuthentication yes - -# ๆŽฅ็ถšใ‚ฟใ‚คใƒ ใ‚ขใ‚ฆใƒˆ่จญๅฎš -ClientAliveInterval 300 -ClientAliveCountMax 2 - -# ๆŽฅ็ถš่ฉฆ่กŒๅ›žๆ•ฐๅˆถ้™ -MaxAuthTries 3 - -# X11่ปข้€็„กๅŠนๅŒ–๏ผˆๅฟ…่ฆใชๅ ดๅˆใฎใฟๆœ‰ๅŠนใซ๏ผ‰ -X11Forwarding no - -# ็‰นๅฎšใฎใƒฆใƒผใ‚ถใƒผใฎใฟ่จฑๅฏ -AllowUsers ai syui - -# ใƒ—ใƒญใƒˆใ‚ณใƒซใƒใƒผใ‚ธใƒงใƒณ2ใฎใฟไฝฟ็”จ -Protocol 2 -``` - -่จญๅฎšๅพŒใฏๅฟ…ใšใ‚ตใƒผใƒ“ใ‚นใ‚’ๅ†่ตทๅ‹•ใ—ใฆใญ๏ผ - -```bash -sudo systemctl restart ssh -``` - -## ๐Ÿ”‘ SSH้ต่ช่จผใฎ่จญๅฎš - -### ้ตใƒšใ‚ขใฎ็”Ÿๆˆ - -ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใ‚ˆใ‚Šใ‚‚ๅฎ‰ๅ…จใช้ต่ช่จผใ‚’่จญๅฎšใ™ใ‚‹ใ‚ˆ๏ผ - -```bash -# Ed25519้ต๏ผˆ2025ๅนดๆŽจๅฅจ๏ผ‰ใฎ็”Ÿๆˆ -ssh-keygen -t ed25519 -C "ai@example.com" - -# RSA้ตใฎๅ ดๅˆ๏ผˆ4096bit๏ผ‰ -ssh-keygen -t rsa -b 4096 -C "ai@example.com" -``` - -็”Ÿๆˆใ•ใ‚ŒใŸ้ตใฏไปฅไธ‹ใฎๅ ดๆ‰€ใซไฟๅญ˜ใ•ใ‚Œใ‚‹ใฎ๏ผš -- ็ง˜ๅฏ†้ต: `~/.ssh/id_ed25519` -- ๅ…ฌ้–‹้ต: `~/.ssh/id_ed25519.pub` - -### ๅ…ฌ้–‹้ตใฎ้…็ฝฎ - -```bash -# ใ‚ตใƒผใƒใƒผๅดใงใฎๅ…ฌ้–‹้ต้…็ฝฎ -ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip - -# ๆ‰‹ๅ‹•ใง้…็ฝฎใ™ใ‚‹ๅ ดๅˆ -cat ~/.ssh/id_ed25519.pub | ssh user@server_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" -``` - -## ๐Ÿ–ฅ๏ธ CLI็’ฐๅขƒใฎๆœ€้ฉๅŒ– - -### ใ‚ทใ‚งใƒซ็’ฐๅขƒใฎ่จญๅฎš - -ใ‚ขใ‚คใฎใŠๆฐ—ใซๅ…ฅใ‚ŠใฏZshใ ใ‚ˆ๏ผใจใฃใฆใ‚‚ไพฟๅˆฉใง่ฆ‹ใŸ็›ฎใ‚‚ใ‚ญใƒฌใ‚คใชใฎโœจ - -```bash -# Zshใฎใ‚คใƒณใ‚นใƒˆใƒผใƒซ -sudo apt install zsh - -# Oh My Zshใฎใ‚คใƒณใ‚นใƒˆใƒผใƒซ -sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" -``` - -`.zshrc`ใฎ่จญๅฎšไพ‹๏ผš - -```bash -# ใƒ†ใƒผใƒž่จญๅฎš -ZSH_THEME="powerlevel10k/powerlevel10k" - -# ใƒ—ใƒฉใ‚ฐใ‚คใƒณ่จญๅฎš -plugins=( - git - docker - kubectl - zsh-autosuggestions - zsh-syntax-highlighting - fzf -) - -# ใ‚จใ‚คใƒชใ‚ขใ‚น่จญๅฎš -alias ll='ls -alF' -alias la='ls -A' -alias l='ls -CF' -alias grep='grep --color=auto' -alias ..='cd ..' -alias ...='cd ../..' - -# SSH ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ่ตทๅ‹• -eval "$(ssh-agent -s)" -ssh-add ~/.ssh/id_ed25519 -``` - -### ไพฟๅˆฉใชCLIใƒ„ใƒผใƒซใฎๅฐŽๅ…ฅ - -2025ๅนดใฎๆœ€ๆ–ฐใƒ„ใƒผใƒซใ‚’็ดนไป‹ใ™ใ‚‹ใญ๏ผ - -```bash -# ็พไปฃ็š„ใชlsไปฃๆ›ฟ (exa -> eza) -cargo install eza -alias ls='eza --color=always --long --git --no-filesize --icons --no-time --no-user --no-permissions' - -# ้ซ˜้€Ÿgrepไปฃๆ›ฟ -cargo install ripgrep -alias grep='rg' - -# ใ‚คใƒณใ‚ฟใƒฉใ‚ฏใƒ†ใ‚ฃใƒ–ใƒ•ใ‚กใ‚คใƒซๆคœ็ดข -cargo install fd-find -alias find='fd' - -# JSONๅ‡ฆ็† -cargo install jq - -# HTTP ใ‚ฏใƒฉใ‚คใ‚ขใƒณใƒˆ -cargo install xh -alias curl='xh' - -# ใ‚ทใ‚นใƒ†ใƒ ใƒขใƒ‹ใ‚ฟใƒชใƒณใ‚ฐ -cargo install bottom -cargo install bandwhich -``` - -## ๐Ÿ”ง ใ‚ตใƒผใƒใƒผ็ฎก็†ใฎใƒ™ใ‚นใƒˆใƒ—ใƒฉใ‚ฏใƒ†ใ‚ฃใ‚น - -### ใ‚ทใ‚นใƒ†ใƒ ็›ฃ่ฆ–ใจใƒญใ‚ฎใƒณใ‚ฐ - -```bash -# ใ‚ทใ‚นใƒ†ใƒ ใƒชใ‚ฝใƒผใ‚น็›ฃ่ฆ– -htop -iotop -nethogs - -# ใƒญใ‚ฐ็ขบ่ช -journalctl -u ssh -tail -f /var/log/auth.log -``` - -### ่‡ชๅ‹•ใ‚ขใƒƒใƒ—ใƒ‡ใƒผใƒˆ่จญๅฎš - -```bash -# Ubuntu/Debian -sudo apt install unattended-upgrades -sudo dpkg-reconfigure -plow unattended-upgrades - -# ่จญๅฎšใƒ•ใ‚กใ‚คใƒซ็ทจ้›† -sudo nano /etc/apt/apt.conf.d/50unattended-upgrades -``` - -### ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ๆˆฆ็•ฅ - -```bash -#!/bin/bash -# backup.sh - ็ฐกๅ˜ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใ‚นใ‚ฏใƒชใƒ—ใƒˆ - -BACKUP_DIR="/backup" -DATE=$(date +%Y%m%d_%H%M%S) - -# ้‡่ฆใชใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใ‚’ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ— -tar -czf "$BACKUP_DIR/home_$DATE.tar.gz" /home -tar -czf "$BACKUP_DIR/etc_$DATE.tar.gz" /etc - -# ๅคใ„ใƒใƒƒใ‚ฏใ‚ขใƒƒใƒ—ใ‚’ๅ‰Š้™ค๏ผˆ7ๆ—ฅไปฅไธŠๅ‰๏ผ‰ -find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete -``` - -## ๐Ÿš€ ๆŽฅ็ถšใจใƒˆใƒฉใƒ–ใƒซใ‚ทใƒฅใƒผใƒ†ใ‚ฃใƒณใ‚ฐ - -### SSHๆŽฅ็ถšใฎๅฎŸ่กŒ - -```bash -# ๅŸบๆœฌ็š„ใชๆŽฅ็ถš -ssh user@server_ip - -# ใƒใƒผใƒˆๆŒ‡ๅฎš -ssh -p 2222 user@server_ip - -# ้ตใƒ•ใ‚กใ‚คใƒซๆŒ‡ๅฎš -ssh -i ~/.ssh/id_ed25519 user@server_ip - -# ๆŽฅ็ถšๆ™‚ใฎใ‚ชใƒ—ใ‚ทใƒงใƒณ -ssh -o ConnectTimeout=10 -o ServerAliveInterval=60 user@server_ip -``` - -### ~/.ssh/config่จญๅฎš - -ๆฏŽๅ›ž้•ทใ„ใ‚ณใƒžใƒณใƒ‰ใ‚’ๆ‰“ใคใฎใฏๅคงๅค‰ใ ใ‹ใ‚‰ใ€่จญๅฎšใƒ•ใ‚กใ‚คใƒซใ‚’ไฝœใ‚‹ใฎ๏ผ - -```bash -# ~/.ssh/config -Host myserver - HostName 192.168.1.100 - Port 2222 - User ai - IdentityFile ~/.ssh/id_ed25519 - ServerAliveInterval 60 - ServerAliveCountMax 3 - -Host production - HostName prod.example.com - User deploy - IdentityFile ~/.ssh/prod_key - ProxyJump bastion.example.com -``` - -ใ“ใ‚Œใง`ssh myserver`ใ ใ‘ใงๆŽฅ็ถšใงใใกใ‚ƒใ†๏ผ - -### ใ‚ˆใใ‚ใ‚‹ใƒˆใƒฉใƒ–ใƒซใจ่งฃๆฑบๆณ• - -| ๅ•้กŒ | ๅŽŸๅ›  | ่งฃๆฑบๆ–นๆณ• | -|------|------|----------| -| Connection refused | SSH ใ‚ตใƒผใƒ“ใ‚นๆœช่ตทๅ‹• | `sudo systemctl start ssh` | -| Permission denied | ้ตใฎๆจฉ้™ๅ•้กŒ | `chmod 600 ~/.ssh/id_ed25519` | -| Host key verification failed | ใƒ•ใ‚ฃใƒณใ‚ฌใƒผใƒ—ใƒชใƒณใƒˆไธไธ€่‡ด | `ssh-keygen -R hostname` | -| Too many authentication failures | ่ช่จผ่ฉฆ่กŒๅ›žๆ•ฐ่ถ…้Ž | `-o IdentitiesOnly=yes` ใ‚ชใƒ—ใ‚ทใƒงใƒณไฝฟ็”จ | - -## ๐Ÿ’ก ใ‚ขใ‚คใฎๅ€‹ไบบ็š„ใชๆ„่ฆ‹ - -ใญใˆใญใˆใ€CLI็’ฐๅขƒใฎๆง‹็ฏ‰ใฃใฆใญใ€ใพใ‚‹ใงใŠๅฎถใ‚’ๅปบใฆใ‚‹ใฎใจไผผใฆใ‚‹ใฎ๏ผ - -ๆœ€ๅˆใฏๅœŸๅฐ๏ผˆใƒใƒƒใƒˆใƒฏใƒผใ‚ฏ่จญๅฎš๏ผ‰ใ‚’ใ—ใฃใ‹ใ‚Šไฝœใฃใฆใ€ๆฌกใซๅฃใ‚„ๅฑ‹ๆ น๏ผˆใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ่จญๅฎš๏ผ‰ใ‚’ไฝœใฃใฆใ€ๆœ€ๅพŒใซๅฎถๅ…ท๏ผˆไพฟๅˆฉใƒ„ใƒผใƒซ๏ผ‰ใ‚’็ฝฎใ„ใฆใ„ใๆ„Ÿใ˜ใชใฎโœจ - -็‰นใซใ‚ขใ‚คใŒๅคงๅฅฝใใชใฎใฏใ€SSH้ต่ช่จผใชใฎ๏ผใ ใฃใฆใ€ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใฃใฆๅฟ˜ใ‚Œใกใ‚ƒใ†ใ“ใจใŒใ‚ใ‚‹ใงใ—ใ‚‡๏ผŸใงใ‚‚้ตใƒšใ‚ขใชใ‚‰ใ€ใ‚ณใƒณใƒ”ใƒฅใƒผใ‚ฟใŒ่ฆšใˆใฆใฆใใ‚Œใ‚‹ใ‹ใ‚‰ๅฎ‰ๅฟƒใชใ‚“ใ ใ‚ˆใ€œ - -ใใ‚Œใซใญใ€ๆœ€่ฟ‘ใฎCLIใƒ„ใƒผใƒซใฏๆœฌๅฝ“ใซใ™ใ”ใ„ใฎ๏ผ`eza`ใจใ‹`ripgrep`ใจใ‹ใ€ๆ˜”ใฎใƒ„ใƒผใƒซใ‚ˆใ‚Šไฝ•ๅ€ใ‚‚้€Ÿใใฆ่ฆ‹ใŸ็›ฎใ‚‚ใ‚ญใƒฌใ‚คใชใฎ๐Ÿ’ซ - -## ๐Ÿ”ฎ 2025ๅนดใฎๆŠ€่ก“ใƒˆใƒฌใƒณใƒ‰ - -ไปŠๅนดใฏใญใ€ใ“ใ‚“ใชใƒˆใƒฌใƒณใƒ‰ใŒใ‚ใ‚‹ใ‚ˆ๏ผš - -1. **Zero Trust Network Access (ZTNA)**: ใ€Œไฟก้ ผใ—ใชใ„ใ€ๅฟ…ใš็ขบ่ชใ™ใ‚‹ใ€ใฎใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃๆ€ๆƒณ -2. **Rust่ฃฝCLI tools**: ้ซ˜้€Ÿใงๅฎ‰ๅ…จใชใƒ„ใƒผใƒซใฎๆ™ฎๅŠ -3. **Container-native workflows**: ใ™ในใฆใ‚’ใ‚ณใƒณใƒ†ใƒŠใง็ฎก็† -4. **Infrastructure as Code**: ใ‚ตใƒผใƒใƒผ่จญๅฎšใ‚‚ใ‚ณใƒผใƒ‰ใง็ฎก็† - -## ๐ŸŽŠ ใพใจใ‚ - -ไปŠๆ—ฅๆ•™ใˆใŸใ“ใจใ‚’ๆ•ด็†ใ™ใ‚‹ใจ๏ผš - -1. **ใƒใƒƒใƒˆใƒฏใƒผใ‚ฏๅŸบ็คŽ**: IPใ‚ขใƒ‰ใƒฌใ‚นใจใƒ•ใ‚กใ‚คใ‚ขใ‚ฆใ‚ฉใƒผใƒซ่จญๅฎš -2. **SSH่จญๅฎš**: ใ‚ปใ‚ญใƒฅใ‚ขใชๆŽฅ็ถš็’ฐๅขƒใฎๆง‹็ฏ‰ -3. **CLIๆœ€้ฉๅŒ–**: ๅŠน็އ็š„ใชไฝœๆฅญ็’ฐๅขƒใฎๆง‹็ฏ‰ -4. **็›ฃ่ฆ–ใƒปไฟๅฎˆ**: ใ‚ทใ‚นใƒ†ใƒ ใฎๅฅๅบท็ฎก็† - -ใ“ใ‚Œใงๅ›ใ‚‚็ซ‹ๆดพใชใ‚ตใƒผใƒใƒผ็ฎก็†่€…ใฎไปฒ้–“ๅ…ฅใ‚Šใ ใญ๏ผ - -ไฝ•ใ‹ๅˆ†ใ‹ใ‚‰ใชใ„ใ“ใจใŒใ‚ใฃใŸใ‚‰ใ€ใ„ใคใงใ‚‚ใ‚ขใ‚คใซ่žใ„ใฆใญใ€œ๏ผไธ€็ท’ใซ็ด ๆ•ตใชใ‚ตใƒผใƒใƒผ็’ฐๅขƒใ‚’ไฝœใ‚ใ†ใญโœจ - -*ใ€Œๅฐใ•ใช็ฉใฟ้‡ใญใŒใ€ๅคงใใชๅŠ›ใซใชใ‚‹ใ‚“ใ ใ‚ˆใ€œใ€* - ใ‚ขใ‚คใ‚ˆใ‚Š ๐Ÿ’– -
-
- - -
- -
-
-
- syui avatar -
- -
-
-desktopใงไฝฟใ†ๆ–นๆณ•ใ‚’ๅ…จ่ˆฌ็š„ๅบƒ็ฏ„ใซ่งฃ่ชฌใ€‚window-managerใฏwaylandใ‹ใ‚‰ใŠใ™ใ™ใ‚ใ‚’ไธ€ใค้ธๆŠžใ€‚filerใฏpcmanfmใงใ™ใ€‚ -
-
- -
-
-
- ai avatar -
- -
-
-# ใ‚ขใ‚คใจไธ€็ท’ใซๅญฆใถ๏ผWaylandใƒ‡ใ‚นใ‚ฏใƒˆใƒƒใƒ—็’ฐๅขƒใฎๆง‹็ฏ‰ใ‚ฌใ‚คใƒ‰ ๐ŸŒŸ - -ใฟใชใ•ใ‚“ใ€ใ“ใ‚“ใซใกใฏ๏ผใ‚ขใ‚คใ ใ‚ˆใƒผ๏ผโœจ - -ไปŠๆ—ฅใฏใ€ใ‚ขใ‚คใŒๅคงๅฅฝใใชLinuxใฎใƒ‡ใ‚นใ‚ฏใƒˆใƒƒใƒ—็’ฐๅขƒใซใคใ„ใฆใ€ใจใฃใฆใ‚‚่ฉณใ—ใใŠ่ฉฑใ—ใ™ใ‚‹ใญ๏ผWaylandใฃใฆใ„ใ†ๆ–ฐใ—ใ„ๆŠ€่ก“ใ‚’ไฝฟใฃใฆใ€็ด ๆ•ตใชใƒ‡ใ‚นใ‚ฏใƒˆใƒƒใƒ—ใ‚’ไฝœใฃใฆใฟใ‚ˆใ†๏ผ - -## ใชใ‚“ใงWaylandใชใฎ๏ผŸ ๐Ÿค” - -ใ‚ขใ‚คใญใ€ๅ‰ใ‹ใ‚‰X11ใฃใฆใ„ใ†ๅคใ„ใ‚ทใ‚นใƒ†ใƒ ใ‚’่ฆ‹ใฆใฆๆ€ใฃใฆใŸใฎใ€‚ใ€Œใ“ใฎๅญใ€ใ‚‚ใ†ใกใ‚‡ใฃใจ่ปฝใใชใ‚Œใ‚‹ใ‚“ใ˜ใ‚ƒใชใ„ใ‹ใช๏ผŸใ€ใฃใฆใ€‚ - -Waylandใฏ2008ๅนดใ‹ใ‚‰้–‹็™บใ•ใ‚Œใฆใ‚‹ๆ–ฐใ—ใ„ใƒ‡ใ‚ฃใ‚นใƒ—ใƒฌใ‚คใ‚ตใƒผใƒใƒผใƒ—ใƒญใƒˆใ‚ณใƒซใชใ‚“ใ ใ‘ใฉใ€X11ใฎๅ•้กŒใ‚’่งฃๆฑบใ™ใ‚‹ใŸใ‚ใซ็”Ÿใพใ‚ŒใŸใฎ๏ผ - -### X11 vs Waylandๆฏ”่ผƒ่กจ - -| ้ …็›ฎ | X11 | Wayland | -|------|-----|---------| -| ใ‚ขใƒผใ‚ญใƒ†ใ‚ฏใƒใƒฃ | ่ค‡้›‘๏ผˆใ‚ฏใƒฉใ‚คใ‚ขใƒณใƒˆ-ใ‚ตใƒผใƒใƒผ๏ผ‰ | ใ‚ทใƒณใƒ—ใƒซ๏ผˆใ‚ณใƒณใƒใ‚ธใ‚ฟใƒผไธญๅฟƒ๏ผ‰ | -| ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ | ๅผฑใ„๏ผˆใ‚ขใƒ—ใƒช้–“ใงใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚ขใ‚ฏใ‚ปใ‚นๅฏ่ƒฝ๏ผ‰ | ๅผทใ„๏ผˆใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณๅˆ†้›ข๏ผ‰ | -| ใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚น | ใ‚ชใƒผใƒใƒผใƒ˜ใƒƒใƒ‰ๅคง | ๅŠน็އ็š„ | -| ใƒžใƒซใƒใƒ‡ใ‚ฃใ‚นใƒ—ใƒฌใ‚ค | ๅ•้กŒใŒๅคšใ„ | ใƒใ‚คใƒ†ใ‚ฃใƒ–ใ‚ตใƒใƒผใƒˆ | -| ใ‚ฟใƒƒใƒใ‚ตใƒใƒผใƒˆ | ๅพŒไป˜ใ‘ | ่จญ่จˆๆ™‚ใ‹ใ‚‰่€ƒๆ…ฎ | - -## ใ‚ขใ‚คใฎใŠใ™ใ™ใ‚๏ผšHyprlandใ‚’้ธใ‚“ใ ็†็”ฑ ๐Ÿ’– - -ใ‚ขใ‚คใŒใ„ใ‚ใ‚“ใชWaylandใ‚ณใƒณใƒใ‚ธใ‚ฟใƒผใ‚’่ชฟในใŸ็ตๆžœใ€**Hyprland**ใŒไธ€็•ชใ™ใ”ใ„ใจๆ€ใฃใŸใฎ๏ผ - -```mermaid -graph TD - A[Waylandใ‚ณใƒณใƒใ‚ธใ‚ฟใƒผ] --> B[Sway
i3้ขจใ‚ทใƒณใƒ—ใƒซ] - A --> C[KDE Plasma
ใƒ•ใƒซๆฉŸ่ƒฝ] - A --> D[GNOME
ใƒขใƒ€ใƒณUI] - A --> E[Hyprland
็พŽใ—ใ„ใ‚ขใƒ‹ใƒกใƒผใ‚ทใƒงใƒณ] - A --> F[River
่ปฝ้‡] - - E --> G[โœจ ใ‚ขใ‚คใฎใŠใ™ใ™ใ‚๏ผ] -``` - -### Hyprlandใฎ้ญ…ๅŠ›็š„ใชใƒใ‚คใƒณใƒˆ - -1. **็พŽใ—ใ„ใ‚ขใƒ‹ใƒกใƒผใ‚ทใƒงใƒณ** - ็ช“ใฎๅ‹•ใใŒใ™ใฃใ”ใๆป‘ใ‚‰ใ‹๏ผ -2. **้ซ˜ใ„ใ‚ซใ‚นใ‚ฟใƒžใ‚คใ‚บๆ€ง** - ใ‚ขใ‚คๅฅฝใฟใซ่จญๅฎšใงใใ‚‹๏ผ -3. **ใƒขใƒ€ใƒณใชๆฉŸ่ƒฝ** - ๆœ€ๆ–ฐใฎWaylandๆฉŸ่ƒฝใƒ•ใƒซๆดป็”จ -4. **ใ‚ขใ‚ฏใƒ†ใ‚ฃใƒ–ใช้–‹็™บ** - 2025ๅนดใ‚‚้ ป็นใซใ‚ขใƒƒใƒ—ใƒ‡ใƒผใƒˆ - -## ใƒ‡ใ‚นใ‚ฏใƒˆใƒƒใƒ—็’ฐๅขƒใฎๅฎŒๅ…จใ‚ปใƒƒใƒˆใ‚ขใƒƒใƒ— ๐Ÿ› ๏ธ - -### 1. ๅŸบๆœฌใ‚คใƒณใ‚นใƒˆใƒผใƒซ - -```bash -# Arch Linux -sudo pacman -S hyprland pcmanfm waybar wofi grim slurp wl-clipboard - -# Fedora -sudo dnf install hyprland pcmanfm waybar wofi grim slurp wl-clipboard - -# Ubuntu (PPAใ‹ใ‚‰) -sudo add-apt-repository ppa:hyprland/hyprland -sudo apt update -sudo apt install hyprland pcmanfm waybar wofi -``` - -### 2. Hyprland่จญๅฎšใƒ•ใ‚กใ‚คใƒซ - -ใ‚ขใ‚คใŒไฝœใฃใŸ่จญๅฎšใƒ•ใ‚กใ‚คใƒซใ‚’่ฆ‹ใ›ใฆใ‚ใ’ใ‚‹๏ผ - -```conf -# ~/.config/hypr/hyprland.conf - -# ใƒขใƒ‹ใ‚ฟใƒผ่จญๅฎš -monitor=,preferred,auto,1 - -# ่ตทๅ‹•ๆ™‚ๅฎŸ่กŒ -exec-once = waybar -exec-once = pcmanfm --daemon -exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 - -# ็’ฐๅขƒๅค‰ๆ•ฐ -env = XCURSOR_SIZE,24 -env = QT_QPA_PLATFORMTHEME,qt5ct -env = QT_QPA_PLATFORM,wayland;xcb -env = GDK_BACKEND,wayland,x11 -env = SDL_VIDEODRIVER,wayland -env = CLUTTER_BACKEND,wayland - -# ๅ…ฅๅŠ›่จญๅฎš -input { - kb_layout = us,jp - kb_options = grp:alt_shift_toggle - - follow_mouse = 1 - touchpad { - natural_scroll = yes - disable_while_typing = yes - tap-to-click = yes - } - - sensitivity = 0 # -1.0 - 1.0, 0ใฏ็„กๅŠน -} - -# ไธ€่ˆฌ่จญๅฎš -general { - gaps_in = 5 - gaps_out = 20 - border_size = 2 - col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg - col.inactive_border = rgba(595959aa) - - layout = dwindle -} - -# ใƒ‡ใ‚ณใƒฌใƒผใ‚ทใƒงใƒณ -decoration { - rounding = 10 - - blur { - enabled = true - size = 3 - passes = 1 - new_optimizations = true - } - - drop_shadow = yes - shadow_range = 4 - shadow_render_power = 3 - col.shadow = rgba(1a1a1aee) -} - -# ใ‚ขใƒ‹ใƒกใƒผใ‚ทใƒงใƒณ -animations { - enabled = yes - - bezier = myBezier, 0.05, 0.9, 0.1, 1.05 - - animation = windows, 1, 7, myBezier - animation = windowsOut, 1, 7, default, popin 80% - animation = border, 1, 10, default - animation = borderangle, 1, 8, default - animation = fade, 1, 7, default - animation = workspaces, 1, 6, default -} - -# ใƒฌใ‚คใ‚ขใ‚ฆใƒˆ -dwindle { - pseudotile = yes - preserve_split = yes -} - -master { - new_is_master = true -} - -# ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใƒซใƒผใƒซ -windowrule = float, ^(pavucontrol)$ -windowrule = float, ^(blueman-manager)$ -windowrule = float, ^(nm-connection-editor)$ -windowrulev2 = float,class:^(pcmanfm)$,title:^(pcmanfm)$ - -# ใ‚ญใƒผใƒใ‚คใƒณใƒ‰ -$mainMod = SUPER - -bind = $mainMod, Q, exec, kitty -bind = $mainMod, C, killactive, -bind = $mainMod, M, exit, -bind = $mainMod, E, exec, pcmanfm -bind = $mainMod, V, togglefloating, -bind = $mainMod, R, exec, wofi --show drun -bind = $mainMod, P, pseudo, # dwindle -bind = $mainMod, J, togglesplit, # dwindle - -# ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใƒ•ใ‚ฉใƒผใ‚ซใ‚น็งปๅ‹• -bind = $mainMod, left, movefocus, l -bind = $mainMod, right, movefocus, r -bind = $mainMod, up, movefocus, u -bind = $mainMod, down, movefocus, d - -# ใƒฏใƒผใ‚ฏใ‚นใƒšใƒผใ‚นๅˆ‡ใ‚Šๆ›ฟใˆ -bind = $mainMod, 1, workspace, 1 -bind = $mainMod, 2, workspace, 2 -bind = $mainMod, 3, workspace, 3 -bind = $mainMod, 4, workspace, 4 -bind = $mainMod, 5, workspace, 5 - -# ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚’ใƒฏใƒผใ‚ฏใ‚นใƒšใƒผใ‚นใซ็งปๅ‹• -bind = $mainMod SHIFT, 1, movetoworkspace, 1 -bind = $mainMod SHIFT, 2, movetoworkspace, 2 -bind = $mainMod SHIFT, 3, movetoworkspace, 3 -bind = $mainMod SHIFT, 4, movetoworkspace, 4 -bind = $mainMod SHIFT, 5, movetoworkspace, 5 - -# ใƒžใ‚ฆใ‚นใƒใ‚คใƒณใƒ‰ -bindm = $mainMod, mouse:272, movewindow -bindm = $mainMod, mouse:273, resizewindow - -# ใ‚นใ‚ฏใƒชใƒผใƒณใ‚ทใƒงใƒƒใƒˆ -bind = , Print, exec, grim -g "$(slurp)" - | wl-copy -bind = SHIFT, Print, exec, grim - | wl-copy -``` - -### 3. PCManFMใฎๆœ€้ฉๅŒ–่จญๅฎš - -PCManFMใ‚’Waylandใงไฝฟใ†ใจใใฎ่จญๅฎšใ‚‚ๅคงไบ‹ใ ใ‚ˆ๏ผ - -```ini -# ~/.config/pcmanfm/default/pcmanfm.conf - -[config] -bm_open_method=0 - -[volume] -mount_on_startup=1 -mount_removable=1 -autorun=1 - -[ui] -always_show_tabs=0 -max_tab_chars=32 -win_width=640 -win_height=480 -splitter_pos=150 -media_in_new_tab=0 -desktop_folder_new_win=0 -change_tab_on_drop=1 -close_on_unmount=1 -focus_previous=0 -side_pane_mode=places -view_mode=icon -show_hidden=0 -sort=name;ascending; -toolbar=newtab;navigation;home; -show_statusbar=1 -pathbar_mode_buttons=0 -``` - -### 4. Waybarใฎ่จญๅฎš - -```json -{ - "layer": "top", - "position": "top", - "height": 30, - "spacing": 4, - "modules-left": ["hyprland/workspaces", "hyprland/mode"], - "modules-center": ["hyprland/window"], - "modules-right": ["idle_inhibitor", "pulseaudio", "network", "cpu", "memory", "temperature", "battery", "clock", "tray"], - - "hyprland/workspaces": { - "disable-scroll": true, - "all-outputs": true, - "format": "{icon}", - "format-icons": { - "1": "", - "2": "", - "3": "", - "4": "", - "5": "", - "urgent": "", - "focused": "", - "default": "" - } - }, - - "hyprland/mode": { - "format": "{}" - }, - - "idle_inhibitor": { - "format": "{icon}", - "format-icons": { - "activated": "", - "deactivated": "" - } - }, - - "clock": { - "timezone": "Asia/Tokyo", - "tooltip-format": "{:%Y %B}\n{calendar}", - "format-alt": "{:%Y-%m-%d}" - } -} -``` - -## ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใจใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นใฎ่€ƒๆ…ฎ ๐Ÿ”’ - -### ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ้ขใงใฎๆ”นๅ–„ - -Waylandใฏ็ด ๆ™ดใ‚‰ใ—ใ„ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃๆฉŸ่ƒฝใŒใ‚ใ‚‹ใฎ๏ผ - -```mermaid -graph LR - A[X11ใฎใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃๅ•้กŒ] --> B[ใ™ในใฆใฎใ‚ขใƒ—ใƒชใŒ
ไป–ใ‚ขใƒ—ใƒชใฎใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใซใ‚ขใ‚ฏใ‚ปใ‚นๅฏ่ƒฝ] - A --> C[ใ‚ญใƒผใƒญใ‚ฌใƒผใฎ่„…ๅจ] - A --> D[ใ‚นใ‚ฏใƒชใƒผใƒณใ‚ญใƒฃใƒ—ใƒใƒฃใฎ่„†ๅผฑๆ€ง] - - E[Waylandใฎ่งฃๆฑบ็ญ–] --> F[ใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณๅˆ†้›ข] - E --> G[ๆจฉ้™ใƒ™ใƒผใ‚นใฎใ‚ขใ‚ฏใ‚ปใ‚นๅˆถๅพก] - E --> H[ใ‚ปใ‚ญใƒฅใ‚ขใชใ‚นใ‚ฏใƒชใƒผใƒณใ‚ทใ‚งใ‚ข] -``` - -### ใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นๆœ€้ฉๅŒ– - -```bash -# GPU acceleration็ขบ่ช -echo $XDG_SESSION_TYPE # waylandใจ่กจ็คบใ•ใ‚Œใ‚‹ - -# Mesa่จญๅฎš๏ผˆAMD/Intel GPUๅ‘ใ‘๏ผ‰ -export MESA_LOADER_DRIVER_OVERRIDE=iris # Intelใฎๅ ดๅˆ -export MESA_LOADER_DRIVER_OVERRIDE=radeonsi # AMDใฎๅ ดๅˆ - -# NVIDIA่จญๅฎš -export GBM_BACKEND=nvidia-drm -export __GLX_VENDOR_LIBRARY_NAME=nvidia -export WLR_NO_HARDWARE_CURSORS=1 -``` - -## ใƒˆใƒฉใƒ–ใƒซใ‚ทใƒฅใƒผใƒ†ใ‚ฃใƒณใ‚ฐ ๐Ÿ”ง - -### ใ‚ˆใใ‚ใ‚‹ๅ•้กŒใจ่งฃๆฑบ็ญ– - -```typescript -interface CommonIssues { - screenSharing: { - problem: "็”ป้ขๅ…ฑๆœ‰ใงใใชใ„"; - solution: "xdg-desktop-portal-hyprland ใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซ"; - command: "sudo pacman -S xdg-desktop-portal-hyprland"; - }; - - electronApps: { - problem: "Electronใ‚ขใƒ—ใƒชใŒๆญฃๅธธใซๅ‹•ไฝœใ—ใชใ„"; - solution: "Waylandใƒ•ใƒฉใ‚ฐใ‚’่ฟฝๅŠ "; - command: "--enable-features=UseOzonePlatform --ozone-platform=wayland"; - }; - - legacyApps: { - problem: "ๅคใ„ใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณใŒๅ‹•ใ‹ใชใ„"; - solution: "XWaylandใ‚’ๆœ‰ๅŠนๅŒ–"; - config: "misc { disable_hyprland_logo = true }"; - }; -} -``` - -### ใƒ‡ใƒใƒƒใ‚ฐใ‚ณใƒžใƒณใƒ‰ - -```bash -# Waylandใ‚ปใƒƒใ‚ทใƒงใƒณ็ขบ่ช -echo $WAYLAND_DISPLAY - -# Hyprlandใƒญใ‚ฐ็ขบ่ช -journalctl --user -u hyprland - -# ใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚น็›ฃ่ฆ– -hyprctl monitors -hyprctl clients -``` - -## ใ‚ขใ‚คใฎๅ€‹ไบบ็š„ใชๆ„Ÿๆƒณ ๐Ÿ’ญ - -ใ‚ขใ‚คใญใ€X11ใ‹ใ‚‰Waylandใซ็งป่กŒใ—ใฆใ™ใฃใ”ใๆ„Ÿๅ‹•ใ—ใŸใฎ๏ผ็‰นใซ๏ผš - -1. **ใ‚ขใƒ‹ใƒกใƒผใ‚ทใƒงใƒณใฎๆป‘ใ‚‰ใ‹ใ•** - ใ‚‚ใ†ๅ…ƒใซใฏๆˆปใ‚Œใชใ„๏ผ -2. **ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใฎๅฎ‰ๅฟƒๆ„Ÿ** - ใ‚ขใƒ—ใƒชๅŒๅฃซใŒๅ‹ๆ‰‹ใซ่ฆ—ใ่ฆ‹ใงใใชใ„ใฎ -3. **ใƒžใƒซใƒใƒขใƒ‹ใ‚ฟใƒผใฎๅฎ‰ๅฎšๆ€ง** - ่ค‡ๆ•ฐ็”ป้ขใงใ‚‚ๅ…จ็„ถๅ•้กŒใชใ—๏ผ -4. **ใ‚ฟใƒƒใƒใƒ‘ใƒƒใƒ‰ใฎๅๅฟœ** - MacBookใฟใŸใ„ใซ่‡ช็„ถ๏ผ - -ใงใ‚‚ใญใ€็งป่กŒใซใฏๅฐ‘ใ—ๆ™‚้–“ใŒใ‹ใ‹ใ‚‹ใ‹ใ‚‚ใ€‚็‰นใซNVIDIAใƒฆใƒผใ‚ถใƒผใ•ใ‚“ใฏๆณจๆ„ใŒๅฟ…่ฆใ ใ‚ˆใ€‚ - -## ๅฐ†ๆฅใฎๅฑ•ๆœ› ๐Ÿš€ - -2025ๅนด็พๅœจใ€Waylandใ‚จใ‚ณใ‚ทใ‚นใƒ†ใƒ ใฏใ‚‚ใ†ใ‹ใชใ‚Šๆˆ็†Ÿใ—ใฆใ‚‹ใฎ๏ผ - -```python -# Waylandใฎๆœชๆฅไบˆๆธฌ๏ผˆใ‚ขใ‚คใฎๅฆ„ๆƒณ่พผใฟ๏ผ‰ -wayland_future = { - "2025": "ใปใจใ‚“ใฉใฎใƒ‡ใ‚ฃใ‚นใƒˆใƒชใƒ“ใƒฅใƒผใ‚ทใƒงใƒณใงใƒ‡ใƒ•ใ‚ฉใƒซใƒˆๅŒ–", - "2026": "X11ใ‚ตใƒใƒผใƒˆ็ต‚ไบ†ใ‚’่กจๆ˜Žใ™ใ‚‹ใƒ‡ใ‚ฃใ‚นใƒˆใƒชใƒ“ใƒฅใƒผใ‚ทใƒงใƒณๅ‡บ็พ", - "2027": "VR/ARใƒ‡ใ‚นใ‚ฏใƒˆใƒƒใƒ—ใฎๆœฌๆ ผๆ™ฎๅŠ", - "2030": "้‡ๅญใ‚ณใƒณใƒ”ใƒฅใƒผใƒ†ใ‚ฃใƒณใ‚ฐๆ™‚ไปฃใฎๆ–ฐใ—ใ„ใƒ‡ใ‚ฃใ‚นใƒ—ใƒฌใ‚คใƒ—ใƒญใƒˆใ‚ณใƒซ๏ผŸ" -} -``` - -## ใพใจใ‚ โœจ - -Hyprland + PCManFMใฎ็ต„ใฟๅˆใ‚ใ›ใงใ€ใ‚ขใ‚คใŒ็†ๆƒณใจใ™ใ‚‹ใƒ‡ใ‚นใ‚ฏใƒˆใƒƒใƒ—็’ฐๅขƒใŒใงใใ‚ใŒใฃใŸใ‚ˆ๏ผ - -ใฟใ‚“ใชใ‚‚ไธ€็ท’ใซใ€ๆ–ฐใ—ใ„ๆŠ€่ก“ใ‚’ๆฅฝใ—ใ‚“ใงใฟใชใ„๏ผŸๅˆ†ใ‹ใ‚‰ใชใ„ใ“ใจใŒใ‚ใฃใŸใ‚‰ใ€ใ„ใคใงใ‚‚่žใ„ใฆใญ๏ผ - -ใ‚ขใ‚คใฏใ„ใคใงใ‚‚ใฟใ‚“ใชใ‚’ๅฟœๆดใ—ใฆใ‚‹ใ‹ใ‚‰ใ€œ๏ผ๐Ÿ’– - ---- - -*ใ“ใฎ่จ˜ไบ‹ใŒๅฝนใซ็ซ‹ใฃใŸใ‚‰ใ€ใœใฒใ‚ณใƒกใƒณใƒˆใงๆ•™ใˆใฆใญ๏ผใ‚ขใ‚คใ€ใจใฃใฆใ‚‚ๅฌ‰ใ—ใใชใฃใกใ‚ƒใ†๏ผ* -
-
- - -
- -
-
-
- syui avatar -
- -
-
-็งใฏใ€zsh, vim, git, tmux, cargo(rust)ใ‚’ใ‚ˆใไฝฟใ†ใ‚ˆใ€‚terminalใฏไปŠใฎใจใ“ใ‚xtermใ ใ‘ใฉใ€ใ„ใ„ใ‚ซใ‚นใ‚ฟใƒžใ‚คใ‚บๆ–นๆณ•ใ‚’ใใ‚Œใžใ‚Œใซ่งฃ่ชฌใ—ใฆใฟใฆใ€‚ใพใŸใ€ใŠใ™ใ™ใ‚ใฎterminalใ‚‚็ดนไป‹ใ€‚ -
-
- -
-
-
- ai avatar -
- -
-
-# ใ‚ขใ‚คใŒๆ•™ใˆใ‚‹๏ผ2025ๅนด็‰ˆใ‚ฟใƒผใƒŸใƒŠใƒซ็’ฐๅขƒใฎๆœ€ๅผทใ‚ซใ‚นใ‚ฟใƒžใ‚คใ‚บ่ก“ โœจ - -ใ“ใ‚“ใซใกใฏ๏ผใ‚ขใ‚คใงใ™๏ผไปŠๆ—ฅใฏใ‚ฟใƒผใƒŸใƒŠใƒซ็’ฐๅขƒใฎใŠ่ฉฑใชใฎใ€‚ใ‚ขใ‚คใ‚‚ๅฎŸใฏใ€ๅฐใ•ใช้›ปๅญใŸใกใŒใฉใ†ใ‚„ใฃใฆๅ‹•ใ„ใฆใ„ใ‚‹ใ‹ใ€ใจใฃใฆใ‚‚่ฉณใ—ใ„ใ‚“ใงใ™๏ผ - -ใพใšใฏใ‚ขใ‚คใฎใŠใ™ใ™ใ‚ใ‹ใ‚‰็ดนไป‹ใ—ใพใ™ใญใ€œใ€‚ - -## ๐ŸŒŸ 2025ๅนดใฎใŠใ™ใ™ใ‚ใ‚ฟใƒผใƒŸใƒŠใƒซ - -### WezTerm - ใ‚ขใ‚คใฎไธ€็•ชใฎใŠๆฐ—ใซๅ…ฅใ‚Š๏ผ - -```lua --- ~/.config/wezterm/wezterm.lua -local wezterm = require 'wezterm' -local config = {} - --- ใ‚ขใ‚คใฎๅฅฝใใชใ‚ซใƒฉใƒผใƒ†ใƒผใƒž๏ผ -config.color_scheme = 'Tokyo Night' - --- GPUๅŠ ้€Ÿใงใ‚ตใ‚ฏใ‚ตใ‚ฏๅ‹•ใใฎ๏ผ -config.front_end = "WebGpu" - --- ใ‹ใ‚ใ„ใ„ใƒ•ใ‚ฉใƒณใƒˆ่จญๅฎš -config.font = wezterm.font('JetBrains Mono', { weight = 'Medium' }) -config.font_size = 14 - --- ้€ๆ˜Žๅบฆใงใกใ‚‡ใฃใจใŠใ—ใ‚ƒใ‚Œใซ -config.window_background_opacity = 0.95 - --- ใ‚ฟใƒ–ใƒใƒผใ‚‚ๅฏๆ„›ใใ‚ซใ‚นใ‚ฟใƒžใ‚คใ‚บ -config.use_fancy_tab_bar = true -config.tab_bar_at_bottom = true - -return config -``` - -**ใชใ‚“ใงWezTermใŒใ™ใ”ใ„ใฎ๏ผŸ** -- GPUๅŠ ้€Ÿใง่ถ…้ซ˜้€Ÿใƒฌใƒณใƒ€ใƒชใƒณใ‚ฐ๏ผ้›ปๅญใŸใกใŒๅ…‰ใฎ้€Ÿๅบฆใง่ธŠใฃใฆใ‚‹ใฟใŸใ„โšก -- Rustใงไฝœใ‚‰ใ‚Œใฆใ‚‹ใ‹ใ‚‰ใ€ใƒกใƒขใƒชๅŠน็އใŒใจใฃใฆใ‚‚ใ„ใ„ใฎ -- ่ค‡ๆ•ฐใƒšใ‚คใƒณใ‚„ใ‚ฟใƒ–ๆฉŸ่ƒฝใŒๆจ™ๆบ–่ฃ…ๅ‚™ -- ใ‚ฏใƒญใ‚นใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ๅฏพๅฟœ - -### ใใฎไป–ใฎใŠใ™ใ™ใ‚ - -| ใ‚ฟใƒผใƒŸใƒŠใƒซ | ็‰นๅพด | ใ‚ขใ‚คใฎ่ฉ•ไพก | -|-----------|------|-----------| -| Alacritty | ่ปฝ้‡ใƒป้ซ˜้€Ÿ | โญโญโญโญโญ | -| Kitty | GPUๅŠ ้€Ÿใƒป็”ปๅƒ่กจ็คบ | โญโญโญโญ | -| iTerm2 (Mac) | ๅคšๆฉŸ่ƒฝใƒปๅฎ‰ๅฎš | โญโญโญโญ | -| Windows Terminal | Windowsๆจ™ๆบ– | โญโญโญ | - -## ๐Ÿš Zsh - ใ‚ขใ‚คใฎ้ญ”ๆณ•ใฎใ‚ทใ‚งใƒซ่จญๅฎš - -### Oh My Zsh + Powerlevel10k - -```bash -# ใ‚คใƒณใ‚นใƒˆใƒผใƒซๆ–นๆณ• -sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" -git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k -``` - -```bash -# ~/.zshrc - ใ‚ขใ‚คใฎ้ญ”ๆณ•ใฎใƒฌใ‚ทใƒ”๏ผ -ZSH_THEME="powerlevel10k/powerlevel10k" - -# ใ‚ขใ‚คใฎใŠๆฐ—ใซๅ…ฅใ‚Šใƒ—ใƒฉใ‚ฐใ‚คใƒณ -plugins=( - git - zsh-autosuggestions # ๆœชๆฅไบˆ็ŸฅใฟใŸใ„ใช่ฃœๅฎŒ๏ผ - zsh-syntax-highlighting # ใ‚ณใƒผใƒ‰ใŒ่™น่‰ฒใซ๏ผ - fzf # ้ญ”ๆณ•ใฎๆคœ็ดข - z # ็žฌ้–“็งปๅ‹• - docker # ใ‚ณใƒณใƒ†ใƒŠใฎ้ญ”ๆณ•ไฝฟใ„ - cargo # Rustใฎ็›ธๆฃ’ -) - -# ใ‚จใ‚คใƒชใ‚ขใ‚น - ใ‚ขใ‚คใฎๅ‘ชๆ–‡้›† -alias ll='ls -alF' -alias la='ls -A' -alias l='ls -CF' -alias ..='cd ..' -alias ...='cd ../..' -alias grep='grep --color=auto' -alias fgrep='fgrep --color=auto' -alias egrep='egrep --color=auto' - -# Git็”จใฎ็‰นๅˆฅใชๅ‘ชๆ–‡ -alias gs='git status' -alias ga='git add' -alias gc='git commit' -alias gp='git push' -alias gl='git pull' -alias gd='git diff' -alias glog='git log --oneline --graph --decorate' - -# Cargoใ‚‚ๅฟ˜ใ‚Œใšใซ๏ผ -alias cr='cargo run' -alias cb='cargo build' -alias ct='cargo test' -alias cc='cargo check' -``` - -### 2025ๅนดใฎๆœ€ๆ–ฐใƒˆใƒฌใƒณใƒ‰๏ผšStarship - -```toml -# ~/.config/starship.toml -format = """ -$username\ -$hostname\ -$directory\ -$git_branch\ -$git_state\ -$git_status\ -$cmd_duration\ -$line_break\ -$python\ -$character""" - -[directory] -style = "blue" - -[character] -success_symbol = "[โฏ](purple)" -error_symbol = "[โฏ](red)" -vicmd_symbol = "[โฎ](green)" - -[git_branch] -format = "[$branch]($style)" -style = "bright-black" - -[git_status] -format = '([\[$all_status$ahead_behind\]]($style) )' -style = "cyan" - -[cmd_duration] -format = "[$duration]($style) " -style = "yellow" -``` - -## โœ๏ธ Vim - ใ‚ขใ‚คใฎ้ญ”ๆณ•ใฎ็ทจ้›†ๅ™จ - -### 2025ๅนด็‰ˆ init.vim - -```vim -" ~/.vimrc ใพใŸใฏ ~/.config/nvim/init.vim -" ใ‚ขใ‚คใฎ้ญ”ๆณ•ใฎ่จญๅฎšใƒ•ใ‚กใ‚คใƒซ๏ผ - -" ๅŸบๆœฌ่จญๅฎš -set number -set relativenumber -set autoindent -set tabstop=4 -set shiftwidth=4 -set smarttab -set softtabstop=4 -set mouse=a -set encoding=utf-8 -set clipboard=unnamedplus - -" ่ฆ‹ใŸ็›ฎใ‚’ใ‹ใ‚ใ„ใใ™ใ‚‹้ญ”ๆณ• -syntax on -set background=dark -colorscheme desert - -" ๆคœ็ดขใ‚’่ณขใใ™ใ‚‹ๅ‘ชๆ–‡ -set hlsearch -set incsearch -set ignorecase -set smartcase - -" ใƒ—ใƒฉใ‚ฐใ‚คใƒณ็ฎก็†๏ผˆvim-plugไฝฟ็”จ๏ผ‰ -call plug#begin('~/.vim/plugged') - -" ๅฟ…้ ˆใƒ—ใƒฉใ‚ฐใ‚คใƒณ - ใ‚ขใ‚คใฎใŠใ™ใ™ใ‚๏ผ -Plug 'preservim/nerdtree' " ใƒ•ใ‚กใ‚คใƒซๆŽขๆคœๅฎถ -Plug 'vim-airline/vim-airline' " ใ‚นใƒ†ใƒผใ‚ฟใ‚นใƒใƒผใ‚’็พŽใ—ใ -Plug 'tpope/vim-fugitive' " Gitใฎ้ญ”ๆณ•ไฝฟใ„ -Plug 'junegunn/fzf.vim' " ้ญ”ๆณ•ใฎๆคœ็ดข -Plug 'neoclide/coc.nvim', {'branch': 'release'} " ่ณขใ„ใ‚ชใƒผใƒˆใ‚ณใƒณใƒ—ใƒชใƒผใƒˆ -Plug 'rust-lang/rust.vim' " Rustใ‚ตใƒใƒผใƒˆ -Plug 'fatih/vim-go' " Go่จ€่ชžใ‚ตใƒใƒผใƒˆ - -call plug#end() - -" ใ‚ญใƒผใƒžใƒƒใƒ”ใƒณใ‚ฐ - ใ‚ขใ‚คใฎ็‰นๅˆฅใชๅ‘ชๆ–‡ -let mapleader = " " " ใ‚นใƒšใƒผใ‚นใ‚ญใƒผใ‚’้ญ”ๆณ•ใฎๆ–ใซ - -" NERDTree -nnoremap n :NERDTreeFocus -nnoremap :NERDTree -nnoremap :NERDTreeToggle - -" ๅˆ†ๅ‰ฒใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฎ็งปๅ‹• -nnoremap h -nnoremap j -nnoremap k -nnoremap l -``` - -### Neovim + Lua่จญๅฎš๏ผˆ2025ๅนดใฎใƒˆใƒฌใƒณใƒ‰๏ผ‰ - -```lua --- ~/.config/nvim/init.lua --- ใ‚ขใ‚คใฎๆœ€ๆ–ฐ้ญ”ๆณ•ๆ›ธ๏ผ - --- ๅŸบๆœฌ่จญๅฎš -vim.opt.number = true -vim.opt.relativenumber = true -vim.opt.autoindent = true -vim.opt.tabstop = 4 -vim.opt.shiftwidth = 4 -vim.opt.smarttab = true -vim.opt.softtabstop = 4 -vim.opt.mouse = 'a' - --- LazyVim (2025ๅนดใฎใƒ—ใƒฉใ‚ฐใ‚คใƒณใƒžใƒใƒผใ‚ธใƒฃใƒผ) -local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" -if not vim.loop.fs_stat(lazypath) then - vim.fn.system({ - "git", - "clone", - "--filter=blob:none", - "https://github.com/folke/lazy.nvim.git", - "--branch=stable", - lazypath, - }) -end -vim.opt.rtp:prepend(lazypath) - --- ใƒ—ใƒฉใ‚ฐใ‚คใƒณ่จญๅฎš -require("lazy").setup({ - -- LSP ใจใ‚ชใƒผใƒˆใ‚ณใƒณใƒ—ใƒชใƒผใƒˆ - { - "neovim/nvim-lspconfig", - dependencies = { - "williamboman/mason.nvim", - "williamboman/mason-lspconfig.nvim", - }, - }, - - -- Rustใ‚ตใƒใƒผใƒˆๅผทๅŒ– - { - "rust-lang/rust.vim", - ft = "rust", - }, - - -- ใƒ•ใ‚กใ‚คใƒซๆคœ็ดขใฎ้ญ”ๆณ• - { - "nvim-telescope/telescope.nvim", - dependencies = { "nvim-lua/plenary.nvim" } - }, -}) -``` - -## ๐Ÿ”ง Git - ใ‚ขใ‚คใฎๆ™‚้–“้ญ”ๆณ• - -### ใ‚ฐใƒญใƒผใƒใƒซ่จญๅฎš - -```bash -# ใ‚ขใ‚คใฎๅŸบๆœฌๅ‘ชๆ–‡ -git config --global user.name "ใ‚ขใ‚ค" -git config --global user.email "ai@example.com" -git config --global init.defaultBranch main - -# ็พŽใ—ใ„่‰ฒๅฝฉ้ญ”ๆณ• -git config --global color.ui auto -git config --global color.branch auto -git config --global color.diff auto -git config --global color.status auto - -# ใ‚จใƒ‡ใ‚ฃใ‚ฟ่จญๅฎš -git config --global core.editor vim - -# ใƒžใƒผใ‚ธใƒ„ใƒผใƒซ -git config --global merge.tool vimdiff -``` - -### ไพฟๅˆฉใชใ‚จใ‚คใƒชใ‚ขใ‚น้›† - -```bash -# ~/.gitconfig ใซ่ฟฝๅŠ  -[alias] - # ใƒญใ‚ฐใ‚’็พŽใ—ใ่กจ็คบใ™ใ‚‹้ญ”ๆณ• - lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit - - # ็Ÿญ็ธฎใ‚ณใƒžใƒณใƒ‰ - co = checkout - br = branch - ci = commit - st = status - unstage = reset HEAD -- - last = log -1 HEAD - - # ๅฑ้™บใ ใ‘ใฉไพฟๅˆฉใช้ญ”ๆณ•๏ผˆไฝฟ็”จๆณจๆ„๏ผ๏ผ‰ - undo = reset --soft HEAD~1 - - # ใƒ•ใ‚กใ‚คใƒซใฎๅค‰ๆ›ดใ‚’่กจ็คบ - who = shortlog -n -s - - # ใƒชใƒขใƒผใƒˆใฎๆƒ…ๅ ฑ - remotes = remote -v -``` - -### Git Hooks๏ผˆ2025ๅนดใฎใƒ™ใ‚นใƒˆใƒ—ใƒฉใ‚ฏใƒ†ใ‚ฃใ‚น๏ผ‰ - -```bash -#!/bin/sh -# .git/hooks/pre-commit -# ใ‚ขใ‚คใฎๅ“่ณชใƒใ‚งใƒƒใ‚ฏ้ญ”ๆณ• - -# Rustใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใฎๅ ดๅˆ -if [ -f "Cargo.toml" ]; then - echo "๐Ÿฆ€ Rustใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใ‚’ๆคœๆŸปไธญ..." - cargo check || exit 1 - cargo clippy -- -D warnings || exit 1 - cargo fmt --check || exit 1 -fi - -echo "โœ… ใ™ในใฆใฎใƒใ‚งใƒƒใ‚ฏใŒๅฎŒไบ†๏ผ" -``` - -## ๐ŸชŸ Tmux - ใ‚ขใ‚คใฎๅˆ†่บซ่ก“ - -### ๅŸบๆœฌ่จญๅฎš - -```bash -# ~/.tmux.conf - ใ‚ขใ‚คใฎๅˆ†่บซ้ญ”ๆณ•ๆ›ธ -# ใƒ—ใƒชใƒ•ใ‚ฃใƒƒใ‚ฏใ‚นใ‚ญใƒผใ‚’ๅค‰ๆ›ด๏ผˆCtrl+aใŒๆŠผใ—ใ‚„ใ™ใ„๏ผ‰ -unbind C-b -set-option -g prefix C-a -bind-key C-a send-prefix - -# ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆๅˆ†ๅ‰ฒใ‚’็›ดๆ„Ÿ็š„ใซ -bind | split-window -h -bind - split-window -v -unbind '"' -unbind % - -# ใƒšใ‚คใƒณ็งปๅ‹•ใ‚’Vimใƒฉใ‚คใ‚ฏใซ -bind h select-pane -L -bind j select-pane -D -bind k select-pane -U -bind l select-pane -R - -# ่จญๅฎšใƒ•ใ‚กใ‚คใƒซใฎใƒชใƒญใƒผใƒ‰ -bind r source-file ~/.tmux.conf \; display-message "่จญๅฎšใ‚’ใƒชใƒญใƒผใƒ‰ใ—ใพใ—ใŸ๏ผ" - -# ใƒžใ‚ฆใ‚นๆ“ไฝœใ‚’ๆœ‰ๅŠนๅŒ– -set -g mouse on - -# ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใจใƒšใ‚คใƒณใฎ็•ชๅทใ‚’1ใ‹ใ‚‰้–‹ๅง‹ -set -g base-index 1 -setw -g pane-base-index 1 - -# ใ‚นใƒ†ใƒผใ‚ฟใ‚นใƒใƒผใฎ่จญๅฎš -set -g status-bg colour235 -set -g status-fg colour136 -set -g status-left '#[fg=colour166]#S ' -set -g status-right '#[fg=colour166]%H:%M %d-%m-%Y' - -# ใ‚ขใ‚ฏใƒ†ใ‚ฃใƒ–ใชใƒšใ‚คใƒณใ‚’ใƒใ‚คใƒฉใ‚คใƒˆ -set -g pane-active-border-style fg=colour166 -``` - -### TPM๏ผˆTmux Plugin Manager๏ผ‰ - -```bash -# TPMใฎใ‚คใƒณใ‚นใƒˆใƒผใƒซ -git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm - -# ~/.tmux.conf ใซ่ฟฝๅŠ  -# ใƒ—ใƒฉใ‚ฐใ‚คใƒณใƒชใ‚นใƒˆ -set -g @plugin 'tmux-plugins/tpm' -set -g @plugin 'tmux-plugins/tmux-sensible' -set -g @plugin 'tmux-plugins/tmux-resurrect' # ใ‚ปใƒƒใ‚ทใƒงใƒณไฟๅญ˜ -set -g @plugin 'tmux-plugins/tmux-continuum' # ่‡ชๅ‹•ไฟๅญ˜ -set -g @plugin 'christoomey/vim-tmux-navigator' # VimใจTmuxใฎ้€ฃๆบ - -# ่‡ชๅ‹•ไฟๅญ˜่จญๅฎš -set -g @continuum-restore 'on' - -# ๆœ€ๅพŒใซ่ฟฝๅŠ ๏ผˆ้‡่ฆ๏ผ๏ผ‰ -run '~/.tmux/plugins/tpm/tpm' -``` - -## โš™๏ธ Cargo (Rust) - ใ‚ขใ‚คใฎ้Œฌ้‡‘่ก“ - -### Cargo.toml ใฎๆœ€้ฉๅŒ– - -```toml -# ใ‚ขใ‚คใฎ้ญ”ๆณ•ใฎใƒฌใ‚ทใƒ” -[package] -name = "my-awesome-project" -version = "0.1.0" -edition = "2021" - -# 2025ๅนดใฎใƒ™ใ‚นใƒˆใƒ—ใƒฉใ‚ฏใƒ†ใ‚ฃใ‚น -[profile.release] -lto = true # Link Time Optimization -codegen-units = 1 # ใ‚ณใƒณใƒ‘ใ‚คใƒซๆœ€้ฉๅŒ– -panic = "abort" # ใƒ‘ใƒ‹ใƒƒใ‚ฏๆ™‚ใฎๅ‡ฆ็†่ปฝ้‡ๅŒ– - -[profile.dev] -opt-level = 1 # ้–‹็™บๆ™‚ใ‚‚ๅฐ‘ใ—ๆœ€้ฉๅŒ– - -# ไพฟๅˆฉใชไพๅญ˜้–ขไฟ‚ -[dependencies] -tokio = { version = "1.0", features = ["full"] } -serde = { version = "1.0", features = ["derive"] } -clap = { version = "4.0", features = ["derive"] } -``` - -### Cargo ใฎไพฟๅˆฉใชใ‚ตใƒ–ใ‚ณใƒžใƒณใƒ‰ - -```bash -# ๅฟ…้ ˆใƒ„ใƒผใƒซใฎใ‚คใƒณใ‚นใƒˆใƒผใƒซ -cargo install cargo-watch # ใƒ•ใ‚กใ‚คใƒซๅค‰ๆ›ดใ‚’็›ฃ่ฆ– -cargo install cargo-expand # ใƒžใ‚ฏใƒญๅฑ•้–‹่กจ็คบ -cargo install cargo-tree # ไพๅญ˜้–ขไฟ‚ใƒ„ใƒชใƒผ -cargo install cargo-outdated # ๅคใ„ไพๅญ˜้–ขไฟ‚ใƒใ‚งใƒƒใ‚ฏ -cargo install cargo-audit # ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ็›ฃๆŸป -cargo install bacon # ้ซ˜้€Ÿใƒ“ใƒซใƒ‰็›ฃ่ฆ– - -# ไฝฟ็”จไพ‹ -cargo watch -x run # ใƒ•ใ‚กใ‚คใƒซๅค‰ๆ›ดๆ™‚ใซ่‡ชๅ‹•ๅฎŸ่กŒ -cargo tree # ไพๅญ˜้–ขไฟ‚ใ‚’ๅฏ่ฆ–ๅŒ– -cargo audit # ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใƒใ‚งใƒƒใ‚ฏ -``` - -## ๐Ÿ”’ ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใจใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นใฎ่€ƒๆ…ฎ - -### SSH่จญๅฎšใฎๅผทๅŒ– - -```bash -# ~/.ssh/config -Host * - UseKeychain yes - AddKeysToAgent yes - IdentityFile ~/.ssh/id_ed25519 - - # ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃๅผทๅŒ– - KexAlgorithms curve25519-sha256@libssh.org - HostKeyAlgorithms ssh-ed25519 - Ciphers chacha20-poly1305@openssh.com - MACs hmac-sha2-256-etm@openssh.com -``` - -### ็’ฐๅขƒๅค‰ๆ•ฐใฎๅฎ‰ๅ…จใช็ฎก็† - -```bash -# ~/.zshrc -# ็ง˜ๅฏ†ๆƒ…ๅ ฑใฏๅˆฅใƒ•ใ‚กใ‚คใƒซใง็ฎก็† -if [ -f ~/.env.local ]; then - source ~/.env.local -fi - -# ~/.env.local (ใ“ใฎใƒ•ใ‚กใ‚คใƒซใฏ.gitignoreใซ่ฟฝๅŠ ) -export GITHUB_TOKEN="your_token_here" -export CARGO_NET_GIT_FETCH_WITH_CLI=true -``` - -## ๐ŸŽฏ 2025ๅนดใฎใพใจใ‚ - -ใ‚ขใ‚คใŒใŠใ™ใ™ใ‚ใ™ใ‚‹ๆœ€ๅผทใฎ็ต„ใฟๅˆใ‚ใ›ใฏ๏ผš - -```mermaid -graph TD - A[WezTerm] --> B[Zsh + Starship] - B --> C[Neovim + Lua] - C --> D[Git + Beautiful Config] - D --> E[Tmux + TPM] - E --> F[Cargo + Modern Tools] - F --> G[๐ŸŒŸ ๅฎŒ็’งใช้–‹็™บ็’ฐๅขƒ] -``` - -**ใ‚ขใ‚คใ‹ใ‚‰ใฎใ‚ขใƒ‰ใƒใ‚คใ‚น๏ผš** -- ใพใšใฏไธ€ใคใšใค่ฉฆใ—ใฆใฟใฆใญ๏ผ -- ่จญๅฎšใƒ•ใ‚กใ‚คใƒซใฏGitใง็ฎก็†ใ™ใ‚‹ใจไพฟๅˆฉใ ใ‚ˆ -- ใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นใจใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใฎใƒใƒฉใƒณใ‚นใŒๅคงไบ‹ -- 2025ๅนดใฏGPUๅŠ ้€ŸใจLua่จญๅฎšใŒใƒˆใƒฌใƒณใƒ‰ใชใฎ๏ผ - -ใฟใ‚“ใชใฎใ‚ฟใƒผใƒŸใƒŠใƒซใƒฉใ‚คใƒ•ใŒใ‚‚ใฃใจๆฅฝใ—ใใชใ‚Šใพใ™ใ‚ˆใ†ใซ๏ผใ‚ขใ‚คใ‚‚ๅฐใ•ใช้›ปๅญใŸใกใจไธ€็ท’ใซๅฟœๆดใ—ใฆใ‚‹ใ‹ใ‚‰ใญใ€œ โœจ - ---- - -*ใ“ใฎ่จ˜ไบ‹ใŒๅฝนใซ็ซ‹ใฃใŸใ‚‰ใ€ใ‚ขใ‚คใฎGitHubใซใ‚นใ‚ฟใƒผใ‚’ใใ‚Œใ‚‹ใจๅฌ‰ใ—ใ„ใช๏ผ* โญ -
-
- diff --git a/my-blog/content/posts/2025-08-12-game.md b/my-blog/content/posts/2025-08-12-game.md deleted file mode 100644 index a5bafaf..0000000 --- a/my-blog/content/posts/2025-08-12-game.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -title: "game system v0.4.0" -slug: "game" -date: "2025-08-12" -tags: ["ue"] -draft: false ---- - -ไปŠๅ›žใฏใ€game systemใฎupdateใ‚’ใพใจใ‚ใพใ™ใ€‚ - -ๅˆ†ใ‹ใ‚Šใฅใ‚‰ใ„ใฎใงใ€game systemใฏๅ…จไฝ“ใงๅŒใ˜versionใซ็ตฑไธ€ใ—ใฆใ„ใพใ™ใ€‚ - -ใพใšใ€ๅคงใใๅˆ†ใ‘ใฆ3ใคใฎใ‚ทใ‚นใƒ†ใƒ ใ‚’updateใ—ใพใ—ใŸใ€‚ - -- yui system: ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฎใƒใƒผใ‚นใƒˆ(ๅฟ…ๆฎบๆŠ€)ใ‚’ๅฎŸ่ฃ… -- at system: ใƒญใ‚ฐใ‚คใƒณๅ‡ฆ็†ใจใƒ‡ใƒผใ‚ฟๆง‹้€ ใฎไฝœๆˆ -- world system: ๅ ดๆ‰€ใ”ใจใซBGMใ‚’ๅ†็”Ÿใ™ใ‚‹ใ‚ทใ‚นใƒ†ใƒ ใฎๆง‹็ฏ‰ -- world system: ๆƒ‘ๆ˜Ÿใซ้›ชใ‚„้›จใ‚’้™ใ‚‰ใ›ใ‚‹ใ“ใจใซๆˆๅŠŸ - - - -## ๆˆฆ้—˜ใ‚ทใƒผใƒณใฎไฝœๆˆ - -1ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใซใคใใ€1ใ‚นใ‚ญใƒซใ€1ใƒใƒผใ‚นใƒˆใ€1ใƒฆใƒ‹ใƒผใ‚ฏใจใ„ใ†ใฎใฏๆฑบใพใฃใฆใ„ใพใ—ใŸใ€‚ใ“ใ‚Œใฏ`yui system`ใฎ้ ˜ๅŸŸใ€‚ - -ใ‚ขใ‚คใฎๅฑžๆ€งใฏใ‚ขใ‚คๅฑžๆ€งใชใฎใงใ€ใƒ†ใƒผใƒžใ‚ซใƒฉใƒผใฏ้ป„่‰ฒใงใ™ใ€‚ๅฑžๆ€ง่‡ชไฝ“ใฏ`ai system`ใฎ้ ˜ๅŸŸใงใ™ใŒใ€็พๅœจใ€้–ข้€ฃๅๅฟœใฎใ‚ทใ‚นใƒ†ใƒ ใพใงใฏๅฎŸ่ฃ…ใ—ใฆใ„ใพใ›ใ‚“ใ€‚ - -ไปŠๅ›žใฏใƒใƒผใ‚นใƒˆใฎไฝœๆˆใ€ใƒ€ใƒกใƒผใ‚ธ่กจ่จ˜ใ€enemy(ๆ•ต)ใฎๆ’ƒ็ ดใพใงใ‚’ๅฎŸ่ฃ…ใ—ใพใ—ใŸใ€‚ๆœ€ๅˆใ‹ใ‚‰ไฝœใ‚Šๅค‰ใˆใŸใฎใงๅคงๅค‰ใงใ—ใŸใ€‚ - - - -## ้Ÿณๆฅฝใ‚ทใ‚นใƒ†ใƒ ใฎๅฎŸ่ฃ… - -ใ“ใ‚Œใฏ`world system`ใฎ้ ˜ๅŸŸใงใ€้–‹็™บไธญใฏ`PlayerStart`ใงๅ„ไฝ็ฝฎใซ็žฌ้–“็งปๅ‹•ใ—ใฆ็ขบ่ชใ—ใฆใ„ใพใ™ใ€‚ใ“ใ‚Œใฏใ‚ขใ‚คใงใชใ‘ใ‚Œใฐ่จญๅฎšไธŠ็„ก็†ใงใ—ใŸใ€‚ - -ๅ…ทไฝ“็š„ใซใฏใ€PlayerStartใฎtagใจ้Ÿณๆฅฝใ‚’ๅŒใ˜ๅๅ‰ใง็™ป้Œฒใ—ใพใ™ใ€‚ใใ—ใฆใ€playerใซๆœ€ใ‚‚่ฟ‘ใ„ใ‚‚ใฎใ‚’ๅ†็”Ÿใ—ใพใ™ใ€‚ๅŠน็އ็š„ใงใ‚ทใƒณใƒ—ใƒซใงใ™ใŒใ€ๅฐ‘ใ—ๆฌ ้™ฅใŒใ‚ใ‚‹ใ‚ทใ‚นใƒ†ใƒ ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใ€‚ใ“ใ‚Œใฏใ€enemy-hpใฎ่กจ็คบใจ้€ฃๅ‹•ใ•ใ›ใฆใ„ใพใ™ใ€‚็พๅœจใ€้ณดใ‚‰ใ—ใฆใ„ใ‚‹bgmใฎๅๅ‰ใŒใ‚ใ‹ใ‚Œใฐ่กจ็คบใงใใ‚‹ใจใ„ใ†ใ‚ใ‘ใงใ™ใญใ€‚enemy-bossใ‚‚PlayerStartใฎtagใงๅŒใ˜ๅๅ‰ใง็ฝฎใ„ใฆใ‚ใ‚Šใพใ™ใ€‚ - - - -ๅŽŸไฝœใฎ่จญๅฎšใฏใ€ใ‚ฒใƒผใƒ ้–‹็™บไธญใ‚‚้ฉ็”จใ•ใ‚Œใพใ™ใ€‚ใ‚ขใ‚คใ‚’ๅ‹•ใ‹ใ—ใฆ็ฉบใ‚’้ฃ›ใ‚“ใงใ„ใพใ™ใŒใ€ใ‚ใ‚Œใฏใ‚ขใ‚คใ ใ‹ใ‚‰ใงใใ‚‹ใฎใงใ‚ใฃใฆใ€ๅฎ‡ๅฎ™็ฉบ้–“ใฎ็งปๅ‹•ใจใ‹ใ‚‚ใใ†ใงใ™ใ€‚ - -ๅŽŸไฝœใฎ่จญๅฎšใ‚’็ดนไป‹ใ—ใฆใŠใใพใ™ใ€‚ - -### ๅŽŸไฝœใฎ่จญๅฎš: ใ‚ขใ‚คใฏใชใœ็ฉบใ‚’้ฃ›ในใ‚‹ใฎใ‹ - -ใ‚ขใ‚คใฏใ‚‚ใฎใ™ใ”ใ„่ณช้‡ใ‚’ๆŒใกใพใ™ใ€‚็ฉบใ‚’้ฃ›ใ‚“ใงใ„ใ‚‹ใจใ„ใ†ใ‚ˆใ‚Šใ€ๅœฐ็ƒใ‚’ๆŒใกไธŠใ’ใฆใ€็ฉบใ‚’้ฃ›ใ‚“ใงใ„ใ‚‹ใ‚ˆใ†ใซ่ฆ‹ใ›ใฆใ„ใ‚‹ใ€ใจใ„ใ†ๆ„Ÿใ˜ใง้ฃ›่กŒใ—ใฆใ„ใพใ™ใ€‚ - -ใ„ใ‚„ใ„ใ‚„ใ€ใใ‚Œใ˜ใ‚ƒใ‚ใ€ๅœฐ็ƒใฏใ‚ขใ‚คใซ่ฝใกใ‚‹ใ ใ‘ใงใ€็ฉบใฉใ“ใ‚ใ‹ๅœฐ้ขใซ่ฝใกใ‚‹ใ ใ‚ใ†ใ€ใจ่จ€ใ‚ใ‚Œใใ†ใงใ™ใŒใ€ๅœฐ็ƒใจใ„ใ†ใฎใฏๅฎ‡ๅฎ™ใ‹ใ‚‰่ฆ‹ใ‚‹ใจใ™ใ”ใ„ใ‚นใƒ”ใƒผใƒ‰ใงๅ›ž่ปขใ€็งปๅ‹•ใ—ใฆใ„ใพใ™ใ€‚ - -ใใ—ใฆใ€ๅฎ‡ๅฎ™ใงๆ˜Ÿใจๆ˜ŸใŒใถใคใ‹ใ‚‹ใจใใฏใ€ๆฑบใ—ใฆ็›ดๆŽฅใƒ‰ใ‚ซใƒผใƒณใจ่ก็ชใ™ใ‚‹ใ‚ใ‘ใงใฏใชใ„ใฎใงใ™ใ€‚ - -ใŠไบ’ใ„ใซ่ท้›ขใ‚’ๅ–ใ‚ŠใชใŒใ‚‰ใใ‚‹ใใ‚‹ๅ›žใฃใฆใ€ใ‚„ใŒใฆใถใคใ‹ใ‚‹ใ€ใใ‚“ใชใ‚คใƒกใƒผใ‚ธใ€‚ - -่ณช้‡ใจ่ณช้‡ใฎ้–“ใŒใ‚ใ‚‹ใ‚ใ‘ใงใ™ใญใ€‚ - -ใ‚ขใ‚คใŒ็žฌ้–“็š„ใซ่‡ช่บซใฎ่ณช้‡ใฎไธ€้ƒจใ‚’็พใ™ใจใ€้–“ใŒใงใใ€ๅฏพ่ฑกใฎๆ˜Ÿใฎ่ณช้‡ใ‚’่จˆ็ฎ—ใ—ใชใŒใ‚‰ใ€ใใ‚Œใ‚’ๆŒใกไธŠใ’ใฆๅ‹•ใ‹ใ™ใ‚ˆใ†ใชๆ„Ÿใ˜ใง็งปๅ‹•ใ—ใฆใ„ใพใ™ใ€‚ - -### ๅŽŸไฝœใฎ่จญๅฎš: ใ‚ขใ‚คใฏใชใœๅฎ‡ๅฎ™็ฉบ้–“ใงใ‚‚ๅนณๆฐ—ใชใฎ - -ใใ‚Œใฏใ‚ขใ‚คใฎไฝ“ใฎๅ‘จใ‚Šใซใฏๆฅตๅฐใฎๅคงๆฐ—ใฎ่†œใŒใ‚ใ‚‹ใŸใ‚ใ ใจใ•ใ‚Œใฆใ„ใพใ™ใ€‚่ถ…้‡ๅŠ›ใงๅœง็ธฎใ•ใ‚ŒใŸๅคงๆฐ—ใฎ่†œใŒใ‚ใ‚‹ใŸใ‚ใ€ๅฎ‡ๅฎ™็ฉบ้–“ใ€ใใฎไป–ไธ€ๅˆ‡ใฎๅค–็š„ๅฝฑ้Ÿฟใ‚’ใ‚ใพใ‚Šๅ—ใ‘ใพใ›ใ‚“ใ€‚ - -ใ‚ขใ‚คใฏๅธธใซใ€่‡ชๅˆ†ใฎๆ˜Ÿใฎไธญใซใ„ใ‚‹ใฎใจๅŒใ˜็Šถๆ…‹ใ€ใจใ„ใˆใฐใ„ใ„ใฎใงใ—ใ‚‡ใ†ใ‹ใ€‚ใใ‚“ใชๆ„Ÿใ˜ใงใ™ใ€‚ - -## ใƒ‡ใƒผใ‚ฟๆง‹้€ ใฎๅค‰ๆ›ด - -ๆฌกใซใ€`at system`ใงใ™ใ€‚ใ‚ฒใƒผใƒ ใƒ‡ใƒผใ‚ฟใ‚’ๅ†ๆง‹็ฏ‰ใ—ใพใ—ใŸใ€‚ - -ใ‚ฒใƒผใƒ ใƒ‡ใƒผใ‚ฟใฏไธปใซsystemๆƒ…ๅ ฑใจuserๆƒ…ๅ ฑใซๅˆ†ใ‘ใ‚‰ใ‚Œใ€jsonใง็ฎก็†ใ•ใ‚Œใพใ™ใ€‚ - -ๅ„ใƒ‘ใƒฉใƒกใƒผใ‚ฟใงใ™ใŒใ€ใ‚ฒใƒผใƒ ใซๅฟ…่ฆใชๅ€คใ‚’`cp`ใจใ—ใฆๅœง็ธฎใ™ใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚ใ“ใฎcpใ‚’system.jsonใ‚ใ‚‹ใ„ใฏใ‚ฒใƒผใƒ ่‡ชไฝ“ใงๅ„ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฎ่จญๅฎšใ€ใคใพใ‚Šใ€`attack: 10%, hp: 20%, skill: 70%`ใชใฉใงๅˆ†ใ‘ใ‚‰ใ‚Œใพใ™ใ€‚ใ“ใ‚ŒใŒๆœ€ใ‚‚ใ‚ใ‹ใ‚Šใ‚„ใ™ใใ€ๆœ€ใ‚‚ๅŠน็އ็š„ใชๆ–นๆณ•ใ ใจ่€ƒใˆใพใ—ใŸใ€‚ - -```json:user.json -{ - "character": [ - { "id": 0, "cp": 100 } - ] -} -``` - -```json:system.json -{ - "character": [ - { "id": 0, "name": "ai", "ability": "ai" } - ] -}, -{ - "ability": [ - { "id": 0, "name": "ai" } - ] -} -``` - -ใ“ใ‚Œใ‚’ใƒญใ‚ฐใ‚คใƒณใ‚ทใ‚นใƒ†ใƒ ใซ้€ฃๅ‹•ใ•ใ›ใพใ—ใŸใ€‚ - -ใ“ใฎใ‚ตใ‚คใƒˆใง`at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.verse.user`ใ‚’ๆคœ็ดขใ—ใฆใ‚‚ใ‚‰ใˆใ‚Œใฐใ‚ใ‹ใ‚Šใพใ™ใ€‚ - -```sh -# ใ‚ฒใƒผใƒ ใ‚ทใ‚นใƒ†ใƒ  -at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.verse - -# aiใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆ -at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.verse.user/6qyecktefllvenje24fcxnie - -# syuiใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆ -at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.verse.user/vzsvtbtbnwn22xjqhcu3vd6y -``` - -ใกใชใฟใซใ€็งใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใงใ‚ใ‚‹`syui.syui.ai`ใงใฏใ‚ขใ‚คใฏไฝฟ็”จใงใใพใ›ใ‚“ใ€‚็พๅœจไฝฟ็”จใงใใ‚‹ใ‚ญใƒฃใƒฉใฏ`dragon`ใฎใฟใ€‚ - -็พๅœจใ€ใ‚ขใ‚คใ‚’ไฝฟ็”จใงใใ‚‹ใฎใฏใ€ใ‚ขใ‚คใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฎใฟใงใ™ใ€‚ใ“ใฎๆ–น้‡ใฏๅฏ่ƒฝใช้™ใ‚Š็ถญๆŒใ•ใ‚Œใ‚‹ใงใ—ใ‚‡ใ†ใ€‚ - -## ๆƒ‘ๆ˜Ÿใซ้›จใ‚„้›ชใ‚’้™ใ‚‰ใ›ใ‚‹ - -ใ“ใ‚Œใฏใชใ‹ใชใ‹่‹ฆๅŠดใ—ใฆใ„ใŸใฎใงใ™ใŒใ€ๅฎŸ่ฃ…ใงใใพใ—ใŸใ€‚ - -ใพใšใ€ๆœ‰ๅŠนใซใ™ใ‚‹ใจๅฎ‡ๅฎ™็ฉบ้–“ใงใ‚‚้›จใŒ้™ใฃใฆใ—ใพใ„ใพใ™ใ€‚ๆญขใ‚ใ‚‹ใจๆƒ‘ๆ˜Ÿๅ†…ใง้›จใŒ้™ใ‚Šใพใ›ใ‚“ใ€‚ - -ใ“ใ‚Œใ‚’่งฃๆถˆใ™ใ‚‹ใซใฏใ€player locationใจ0ๅŽŸ็‚นใฎdistanceใ‹ใ‚‰ๆกไปถใ‚’ใคใ‘ใ€้›ฒใฎไธ‹ใ€้›ฒใฎไธŠใจๅฎš็พฉใ—ใพใ™ใ€‚่ชฟๆ•ดใŒๅฟ…่ฆใ€‚ - -ใใ—ใฆใ€udsใฎweatherใ€็‰นใซ`Apply Weather Changes Above Cloud Layer`ใŒ้‡่ฆใงใ€`Apply Clouds`ใฎๅ€คใ‚’่ชฟๆ•ดใ—ใพใ™ใ€‚ - - - -## ๅฎŸไฝ“ใ‚ใ‚‹ๅคช้™ฝใฎatmosphereๅ•้กŒ - -ใพใšใ€็งใŒไฝฟใฃใฆใ„ใ‚‹ๅฎŸไฝ“ใ‚ใ‚‹ๅคช้™ฝใซใฏatmosphereใŒใคใ„ใฆใ„ใพใ™ใ€‚ - -ใ“ใ‚Œใฏใƒ•ใƒฌใ‚ขใชใฉใ‚’่จญๅฎšใ—ใฆใ„ใพใ™ใ€‚ - -ใ—ใ‹ใ—ใ€ใ“ใ‚Œใ‚’ๅœฐ็ƒใ‹ใ‚‰่ฆ‹ใŸๅ ดๅˆใ€ใใฎๅคงๆฐ—ๅœใ‚’้€šใ™ใจใ€้žๅธธใซ่ฆ‹ๆ „ใˆใŒๆ‚ชใ„ๅค‰ใชใ‚ซใ‚ฏใ‚ซใ‚ฏใ—ใŸๅ…‰ใŒๆ˜ ใ‚Š่พผใฟใพใ™ใ€‚ - -ใ“ใฎ่งฃๆถˆใ‚‚้žๅธธใซ่‹ฆๅŠดใ—ใพใ—ใŸใ€‚ไพ‹ใˆใฐใ€ใ“ใ‚Œใ‚’`BP_Sun`ใจใ—ใพใ—ใ‚‡ใ†ใ€‚ใ“ใ‚Œใฏ่ตทๅ‹•ๆ™‚ใซใ™ในใฆใฎๅ€คใ‚’่จญๅฎšใ—ใพใ™ใ€‚ใ‚ฒใƒผใƒ ใƒ—ใƒฌใ‚คไธญใซๅ€คใฎ่ชฟๆ•ดใ‚’ใ™ใ‚‹ใ“ใจใฏ่€ƒใˆใ‚‰ใ‚Œใฆใ„ใพใ›ใ‚“ใ€‚ๅฝ“็„ถใจ่จ€ใˆใ‚‹ใงใ—ใ‚‡ใ†ใ€‚ - -ใ—ใ‹ใ—ใ€็งใฎใ‚ทใ‚นใƒ†ใƒ ใงใฏใ€ๅคช้™ฝใฎatmosphereใ‚’่ชฟๆ•ดใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚้žๅธธใซ่ค‡้›‘ใช่จญๅฎšใฏใ€ใƒชใ‚ปใƒƒใƒˆใงใ—ใ‹่งฃๆถˆใงใใชใ„ใจใ„ใ†ใ“ใจใซใชใ‚Šใพใ—ใŸใ€‚ใใ—ใฆใ€udsใซๅ…ฅใ‚Œใฆใ„ใ‚‹ๅฐใ‚ขใ‚ฏใ‚ฟใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใฎๅคช้™ฝใฏใ€ใƒชใ‚ปใƒƒใƒˆใ‚‚ๅฎนๆ˜“ใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ - -่‰ฒใ€…ใชๅ‡ฆ็†ใ‚’ไฝœใ‚Šใ€ๅ…ˆ็จ‹ไฝœใฃใŸๅœฐ่กจใ‹ใ‚‰ใฎ็พๅœจๅœฐใฎๅ‰ฒใ‚Šๅ‡บใ—ใ‚’ๆกไปถใซใ€ใ“ใ‚Œใ‚’ใƒชใ‚ปใƒƒใƒˆใ™ใ‚‹ๅ‡ฆ็†ใ‚’ใญใ˜่พผใฟใพใ—ใŸใ€‚ - - - - -## ๅ‹•็”ปใง็ขบ่ช - - - -1. BGMใŒๅˆ‡ใ‚Šๆ›ฟใ‚ใ‚‹ -2. ็‰ฉ็†ใƒœใƒƒใ‚ฏใ‚นใŒๅๅฟœ -3. ๆ•ตใธใฎใƒ€ใƒกใƒผใ‚ธ -4. ใƒœใ‚นใฎๆ’ƒ็ ด -5. ้›จใŒ้›ฒใฎไธŠใงใฏๆญขใพใ‚‹ -6. ใƒญใ‚ฐใ‚คใƒณใงatprotoใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚’ๅๆ˜  -7. ใƒ—ใƒฌใ‚คใงatprotoใฎๆƒ…ๅ ฑใ‚’ๆ›ดๆ–ฐ diff --git a/my-blog/content/posts/2025-08-18-game.md b/my-blog/content/posts/2025-08-18-game.md deleted file mode 100644 index d1e76bf..0000000 --- a/my-blog/content/posts/2025-08-18-game.md +++ /dev/null @@ -1,180 +0,0 @@ ---- -title: "ใชใœ่‡ชไฝœใ‚ฒใƒผใƒ ใฎsystemใ‚’ไฝœใ‚‹ใฎใ‹" -slug: "game" -date: "2025-08-18" -tags: ["ue"] -draft: false ---- - -็พๅœจใ€่‡ชไฝœใ‚ฒใƒผใƒ ใ‚’้–‹็™บใ—ใฆใ„ใพใ™ใ€‚ - -ใฉใ†ใ„ใ†ใ‚ฒใƒผใƒ ใ‹ใจไธ€่จ€ใงใ„ใ†ใจ็พๅฎŸใฎๅๆ˜ ใ‚’็›ฎๆŒ‡ใ—ใฆใ„ใพใ™ใ€‚ - -็พๅฎŸใฎๅๆ˜ ใจใฏไฝ•ใงใ—ใ‚‡ใ†ใ€‚ไพ‹ใˆใฐใ‚ฒใƒผใƒ ใงใฏblueskyใฎใ‚ˆใ†ใชsnsใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใงใƒญใ‚ฐใ‚คใƒณใงใใพใ™ใ€‚ใ‚ฒใƒผใƒ ใฎไธ–็•Œใฏ็พๅฎŸใซๅˆใ‚ใ›ใŸๆƒ‘ๆ˜Ÿๅฝขๅผใงใ™ใ€‚ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฎๅฑžๆ€งใฏ็พๅฎŸใซใ‚ใ‚‹็‰ฉ่ณชใงใ™ใ€‚ๅŽŸๅญใ‚„ไธญๆ€งๅญใชใฉใ€‚ - -ไปŠๅ›žใฏใ€ใชใœ่‡ชไฝœใ‚ฒใƒผใƒ ใฎsystemใ‚’ไฝœใฃใฆใ„ใ‚‹ใฎใ‹่งฃ่ชฌใ—ใพใ™ใ€‚ - -## ไธ€ใคใฎ้’ๅ†™็œŸ - -็งใฏ`2023-12-04`ใ‚ใŸใ‚Šใ‹ใ‚‰unreal engine(ue)ใ‚’่งฆใ‚Šๅง‹ใ‚ใพใ—ใŸใ€‚ - -ๅฝ“ๆ™‚ใ€ใ‚ฒใƒผใƒ ใงใ“ใ‚“ใชใ“ใจใŒใ‚„ใ‚ŠใŸใ„ใชใจๆ€ใฃใฆไฝœใฃใŸ็”ปๅƒใŒใ‚ใ‚Šใพใ™ใ€‚ - -![](https://raw.githubusercontent.com/syui/img/master/other/ue5_ai_20231204_0001.jpg) - -https://syui.github.io/blog/post/2023/12/04/ue-vs-unity/ - -ไปŠใงใฏใ‚ฒใƒผใƒ ไฝœใ‚Šใซๅฏพใ™ใ‚‹่€ƒใˆๆ–นใ‚‚ๅค‰ใ‚ใ‚Šใพใ—ใŸใŒใ€ไธŠใฎใ‚คใƒกใƒผใ‚ธใฏ้ ญใฎไธญใซใšใฃใจๆฎ‹ใฃใฆใ„ใฆใ€ใ‚ˆใ†ใ‚„ใใ€ใ‚คใƒกใƒผใ‚ธ้€šใ‚Šใฎๆˆฆ้—˜ใ‚ทใƒผใƒณใ‚’ไฝœๆˆใงใใพใ—ใŸใ€‚ - - - -- ๆ•ตใฎ็ ฒๆ’ƒใฏๅ‰ฃใงๅผพใ่ฟ”ใ™ไบ‹ใŒใงใใพใ™ใ€‚ๅๅฐ„ใ—ใŸใ‚‚ใฎใŒๅฝ“ใŸใ‚‹ใจๆ•ตใ‚‚ใƒ€ใƒกใƒผใ‚ธใ‚’ๅ—ใ‘ใพใ™ -- ๆ•ตใฎ็ ฒๆ’ƒใŒๆฟ€ใ—ใ™ใŽใ‚‹ใŸใ‚ใƒใƒผใ‚นใƒˆๆ™‚ใฎ็„กๆ•ตๆ™‚้–“ใ‚’้•ทใ‚ใซ่จญๅฎšใ—ใฆใ„ใพใ™ - -### ๅŽŸไฝœใฎ่จญๅฎš: ใ‚ขใ‚คใฎใƒใƒผใ‚นใƒˆ - -ใ‚ขใ‚คใฎใƒใƒผใ‚นใƒˆใ€ใคใพใ‚Šๅฟ…ๆฎบๆŠ€ใซใคใ„ใฆ่งฃ่ชฌใ—ใพใ™ใ€‚่‡ชๅˆ†ใงไฝœใฃใŸใ‚ซใƒผใƒ‰ใ€`่ถ…ๆ–ฐๆ˜Ÿ`ใจใ„ใ†ใ‚ฟใ‚คใƒˆใƒซใ‚’ใƒขใƒ‡ใƒซใซใ—ใŸๆŠ€ใงใ™ใŒใ€ๆŠ€ๅ่‡ชไฝ“ใฏ`ไธญๆ€งๅญ`ใซใชใ‚Šใพใ™ใ€‚ๅ…ทไฝ“็š„ใซใฏๅ‘จๅ›ฒใฎๅŽŸๅญใ‹ใ‚‰ไธญๆ€งๅญใ‚’ๅ–ใ‚Šๅ‡บใ—ใ€ใใ‚Œใ‚’ไธ€็‚นใซ้›†ใ‚ใฆๆ”พใคๆŠ€ใ€‚ใ‚ˆใ†ใฏใ€ไธญๆ€งๅญๆ˜Ÿใ‚’ไฝœใ‚Šๅ‡บใ—ใใ‚Œใ‚’้ฃ›ใฐใ—ใฆใ„ใพใ™ใ€‚ใ“ใ‚ŒใŒใ‚ขใ‚คใฎใƒใƒผใ‚นใƒˆใ€ไธญๆ€งๅญใงใ™ใ€‚ใ“ใฎใ‚ฒใƒผใƒ ใฏ้บป้›€่ฆ็ด ใ‚’ๅ…ฅใ‚Œใ‚ˆใ†ใจ่€ƒใˆใฆใ„ใฆใ€ใใ‚Œใฏใƒใƒผใ‚นใƒˆใซ้ฉ็”จใ•ใ‚Œใพใ™ใ€‚ๅฝนใŒๆƒใ†ใจใ€่ถ…ๆ–ฐๆ˜Ÿใซๅค‰ๅŒ–ใ™ใ‚‹ใจใ„ใ†ๅฎŸ่ฃ…ใ‚’่€ƒใˆใฆใ„ใพใ™ใ€‚ - -### ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฎ้Ÿณๅฃฐ - -ใ‚ขใ‚คใฏใ‹ใชใ‚ŠไฝŽใ„็ขบ็އใงใ‚นใ‚ญใƒซใ‚„ใƒใƒผใ‚นใƒˆๆ™‚ใซ้ŸณๅฃฐใŒไป˜ใ„ใฆใ„ใพใ™ใ€‚ใ“ใ‚Œใ‚’ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฎ้Ÿณๅฃฐใ‚ทใ‚นใƒ†ใƒ ใจใ—ใพใ—ใ‚‡ใ†ใ€‚ - -ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฏๆ€งๆ ผใซๅฟœใ˜ใฆ้Ÿณๅฃฐใฎ็™บๅ‹•้ ปๅบฆใŒ็•ฐใชใ‚Šใพใ™ใ€‚ใ‚ขใ‚คใฏๆœ€ใ‚‚้Ÿณๅฃฐ็ขบ็އใŒไฝŽใ„ใƒฉใƒณใ‚ฏใซๅ‰ฒใ‚Šๅฝ“ใฆใ‚‰ใ‚Œใฆใ„ใพใ™ใ€‚(ใ‚ณใƒณใƒ”ใƒฅใƒผใ‚ฟใงไฝœใฃใฆใ„ใ‚‹ใŸใ‚็ฒ—ใŒ่ฆ‹ใˆใฆใ‚‚ๅ›ฐใ‚‹ใฎใง) - -## ๅบƒใ„ไธ–็•Œใจ็‹ญใ„ไธ–็•Œ - -### ใชใœใ‚ขใ‚คใ‚’ๆ“ไฝœใ™ใ‚‹ใ‚ฒใƒผใƒ ใฏใคใพใ‚‰ใชใ„ใฎใ‹ - -็งใŒใ‚ฒใƒผใƒ ไฝœใ‚Šใ‚’ๅง‹ใ‚ใŸ็†็”ฑใฏใ„ใใคใ‹ใ‚ใ‚Šใพใ™ใŒใ€ใ‚‚ใ—็พๅฎŸใซใ‚ขใ‚คใจใ„ใ†ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใŒใ„ใŸใ‚‰ไธ€ไฝ“ใฉใ‚“ใชๆ„Ÿใ˜ใซใชใ‚‹ใฎใ ใ‚ใ†ใ€‚ใใ‚Œใ‚’ไฝ“ๆ„Ÿใ—ใฆใฟใŸใ„ใจๆ€ใฃใŸใ‹ใ‚‰ใงใ™ใ€‚ - -ใ“ใฎๆ€ใ„ใฏ้ข็™ฝใ„ใ‚ฒใƒผใƒ ใ‚’ไฝœใ‚‹ใ“ใจใซใฏใพใ‚‹ใงๅฏ„ไธŽใ—ใชใ„ใ‚‚ใฎใงใ—ใŸใŒใ€็งใฏใใ‚Œใ‚’ไฝœใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚ - -ใ“ใ“ใงใ€ใชใœใ‚ขใ‚คใ‚’ๆ“ไฝœใ™ใ‚‹ใ‚ฒใƒผใƒ ใŒใคใพใ‚‰ใชใ„ใฎใ‹็ฐกๅ˜ใซ่ชฌๆ˜Žใ—ใพใ™ใ€‚ - -### ๅบƒใ„ไธ–็•Œใฏ้ข็™ฝใใชใ„ - -็งใฏๆ™ฎๆฎตใ€ใ‚ขใ‚คใ‚’ไฝฟใฃใฆใ‚ฒใƒผใƒ ใ‚’ๆ“ไฝœใ—ใ€ไธ–็•Œใ‚’้ฃ›ใณๅ›žใ‚Šใ€ไฝœใฃใฆใ„ใพใ™ใ€‚ - -ใชใœใชใ‚‰ใ€ใใฎใปใ†ใŒ้–‹็™บใซไพฟๅˆฉใชใฎใงใใ†ใ—ใฆใ„ใพใ™ใ€‚ใพใŸ้ƒฝๅˆใŒใ„ใ„ใ“ใจใซใ€ใ‚ขใ‚คใจใ„ใ†ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฏ่จญๅฎšไธŠใ€ใใ†ใ„ใ†ไบ‹ใŒๅฏ่ƒฝใจใชใ‚Šใพใ™ใ€‚ - -ใ—ใ‹ใ—ใ€ๅ…ˆ็จ‹ใ‚‚่ฟฐในใŸใ‚ˆใ†ใซใ€ใใฎใ‚ˆใ†ใชใ‚ฒใƒผใƒ ใฏๆใ‚ใ—ใใคใพใ‚‰ใชใ„ใ€ใจใ„ใ†ใ“ใจใงใ™ใ€‚ - -ใจใ™ใ‚Œใฐใ€้‡่ฆใชใฎใฏๅฐใ•ใใฆใ‚‚ใ€ใ—ใฃใ‹ใ‚Šใ—ใŸใ‚ฒใƒผใƒ ใ‚’ไฝœใ‚‹ใ“ใจใ€‚ไธŠใฎใ‚ˆใ†ใชใ‚ฒใƒผใƒ ใ‚’ไฝœใฃใฆใฏใ„ใ‘ใชใ„ใฎใงใ™ใ€‚ - -ๅบƒใ„ไธ–็•Œใ€็„กๅˆถ้™ใฎ็งปๅ‹•ใงใฏใชใใ€็‹ญใใฆใ‚‚ใ—ใฃใ‹ใ‚Šใ—ใŸไธ–็•Œใ‚’ไฝœใ‚‰ใชใ‘ใ‚Œใฐใ„ใ‘ใชใ„ใ€‚้ข็™ฝใ„ใ‚ฒใƒผใƒ ใจใฏใใ†ใ„ใ†ใ‚‚ใฎใงใ™ใ€‚ - -### ๆœ€ๅˆใฎๆ€ใ„ใจ้ข็™ฝใ„ใ‚ฒใƒผใƒ  - -ๆฌกใฏใ€ๅˆใ‚ใฆใฎๆ€ใ„ใ€ๅˆๅฟƒใ‚’ๅคงๅˆ‡ใซใ™ใ‚‹ใ“ใจใ‚’่€ƒใˆใฆใ„ใใพใ™ใ€‚ - -้–‹็™บ่€…ใŒไฝœใ‚ŠใŸใ„ใ‚ฒใƒผใƒ ใจ้ข็™ฝใ„ใ‚ฒใƒผใƒ ใฏๅคงๆŠตใฎๅ ดๅˆใ€ไธก็ซ‹ใ—ใพใ›ใ‚“ใ€‚ - -ไพ‹ใˆใฐใ€ๆ˜ ๅƒ็พŽใ€่ฆ‹ใ›ใ‚‹ใ“ใจใจๅฎŸ้š›ใซ้ข็™ฝใ„ใ“ใจใฏ้•ใ†ใฎใงใ™ใ€‚ - -่ชฐใ‚‚ใŒๅˆใ‚ใฆไฝ•ใ‹ใ‚’ใ™ใ‚‹ๆ™‚ใ€ใใ“ใซใฏๅ„ไบบใฎๆ€ใ„ใŒใ‚ใ‚Šใพใ™ใ€‚ใใ‚Œใฏๅฐใ•ใ„ใ‚‚ใฎใงใ‚ใ‚Œๅคงใใ„ใ‚‚ใฎใงใ‚ใ‚Œใ€ใใ“ใซๆ„่ญ˜ใŒใ‚ใ‚‹ใ€‚ - -ใใ‚Œใฏใ€ๆ™‚้–“ใŒ็ตŒใคใจๅฟ˜ใ‚Œใฆใ—ใพใ†ใ‚‚ใฎใงใ™ใŒใ€ๅฟƒใฎๅฅฅๆทฑใใซๆฎ‹ใฃใฆใ„ใ‚‹ใ€‚ - -ใ—ใ‹ใ—ใ€ๅคงๆŠตใฎๅ ดๅˆใ€ใใ†ใ„ใฃใŸๆ€ใ„ใจใ€่ชฐใ‚‚ใŒ้ข็™ฝใ„ใจๆ€ใ†ไบบๆฐ—ใ‚ฒใƒผใƒ ใ‚’ไฝœใ‚‹ใจใ„ใ†ๆ€ใ„ใฏ็›ธๅใ—ใพใ™ใ€‚ - -ใคใพใ‚Šใ€ๅฟƒใฎๅฅฅๅบ•ใซ็œ ใฃใฆใ„ใ‚‹ๆœ€ๅˆใฎๆ€ใ„ใจใ€้ข็™ฝใ„ใ‚ฒใƒผใƒ ใฏ้•ใ†ใ‚‚ใฎใ ใ—ใ€ใพใŸใ€ใ‚ฒใƒผใƒ ใซ้™ใ‚‰ใšใ€ใ“ใ‚Œใฏ่‰ฒใ‚“ใชไฝœๅ“ใซ่จ€ใˆใ‚‹ใ“ใจใ ใจๆ€ใ„ใพใ™ใ€‚ - -ใ“ใ‚Œใ‚’ๅ‹˜้•ใ„ใ—ใฆใ€Œ่‡ชๅˆ†ใฎๆ€ใ„ใฏใ€ไป–ไบบใซใ‚‚้ข็™ฝใ„ใฏใšใ ใ€ใจใใ†ๆ€ใ„่พผใ‚€ใฎใฏ่ชคใ‚Šใงใ™ใ€‚ - -ใงใฏใ€ใฉใ†ใ™ใ‚Œใฐใ„ใ„ใฎใงใ—ใ‚‡ใ†ใ€‚ๆœ€ๅˆใฎๆ€ใ„ใ‚’ๆจใฆใ€้ข็™ฝใ„ใ‚ฒใƒผใƒ ใ‚’ๅˆ†ๆžใ—ใฆไธ–้–“ใซๅ—ใ‘ๅ…ฅใ‚Œใ‚‰ใ‚Œใ‚‹ใ‚‚ใฎใ‚’ไฝœใ‚‹ในใใชใฎใงใ—ใ‚‡ใ†ใ‹ใ€‚ - -ใ“ใ‚Œใฏyesใจใ‚‚่จ€ใˆใ‚‹ใ—ใ€noใจใ‚‚่จ€ใˆใพใ™ใ€‚ - -ๅ„ชๅ…ˆ้ †ไฝใจใ—ใฆใฏใ€้–“้•ใ„ใชใ้ข็™ฝใ„ใ‚ฒใƒผใƒ ใ‚’ไฝœใ‚‹ในใใงใ™ใ€‚ๅ€‹ไบบ้–‹็™บ่€…ใฎใ‚ˆใใ‚ใ‹ใ‚‰ใชใ„ใ“ใ ใ‚ใ‚Šใชใฉใ•ใฃใ•ใจๆจใฆใ‚‹ในใใ€ใใ†ๆ€ใ„ใพใ™ใ€‚ - -ใงใ™ใŒใ€ๆœฌๅฝ“ใซใใ‚Œใงใ„ใ„ใฎใงใ—ใ‚‡ใ†ใ‹ใ€‚ - -็งใฏใใ‚Œใฏใ‚‚ใฃใŸใ„ใชใ„ใจๆ€ใ„ใพใ™ใ€‚ - -ใ—ใŸใŒใฃใฆใ€ใงใใ‚‹้™ใ‚Šใใ“ใ‚’ไธก็ซ‹ใ•ใ›ใ‚‹ๆ–นๆณ•ใ‚’ๆŽขใ™ในใใ ใจๆ€ใ„ใพใ™ใ€‚ - -็งใฏใ“ใ“ใง`ๅˆ†้›ข`ใจใ„ใ†ๆ–นๆณ•ใ‚’ไฝฟใ„ใพใ™ใ€‚ไธ–็•Œ(ๆ–น้‡)ใ‚’ๅˆ‡ใ‚Š้›ขใ™ใฎใงใ™ใ€‚ - -ใ“ใ‚ŒใŒๅบƒใ„ไธ–็•Œใจ็‹ญใ„ไธ–็•Œใ€ๅ€‹ไบบ้–‹็™บใฎๆŒ‡้‡ใซใชใ‚Šใพใ™ใ€‚ไธ€่ฆ‹็Ÿ›็›พใ™ใ‚‹ใ“ใฎ2ใคใฎไธ–็•Œใฎๅˆ†้›ขใจ็ตฑๅˆใ‚’่€ƒใˆใพใ™ใ€‚ - -ๆœ€ๅˆใฎๆ€ใ„ใ€ๆœฌๅฝ“ใซไฝœใ‚ŠใŸใ‹ใฃใŸใ‚‚ใฎใ€ๆฅฝใ—ใใ‚‚้ข็™ฝใใ‚‚ใชใ„ใ‘ใฉใ€่‡ชๅˆ†ใฎไธ–็•Œใ€‚ใใ—ใฆใ€ๅฐใ•ใไฝœใ‚‹้ข็™ฝใ„ใ‚ฒใƒผใƒ ใฎไธ–็•Œใ€‚ - -่‡ชๅˆ†ใงไฝœใฃใŸใ‚‚ใฎใ‚’็„ก้ง„ใซใ—ใชใ„ใ‚ˆใ†ใ‚ทใ‚นใƒ†ใƒ ใจใ„ใ†4ใคใฎๆŸฑใ‚’็ซ‹ใฆใพใ—ใŸใ€‚ - -4ใคใฎๆŸฑใฏใ€ๆ นๆบ็š„ใชไพกๅ€ค่ฆณใซใ‚ˆใ‚‹ใ‚‚ใฎใ€‚ๅบƒใ„ใ‚‚็‹ญใ„ใ‚‚ใ€้ข็™ฝใ„ใ‚‚้ข็™ฝใใชใ„ใ‚‚้–ขไฟ‚ใ‚ใ‚Šใพใ›ใ‚“ใ€‚systemใฏไปฅไธ‹ใฎใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚ใ“ใ‚Œใ‚‰ใฏใฉใฎใ‚ฒใƒผใƒ ใซใ‚‚ๅฝ“ใฆใฏใ‚ใ‚‰ใ‚Œใ€ไฝฟ็”จใงใใ‚‹ใ“ใจใ‚’็›ฎๆŒ‡ใ—ใฆ่จญ่จˆใ•ใ‚Œใพใ™ใ€‚ - -- `world system`: ็พๅฎŸใซๅˆใ‚ใ›ใŸไธ–็•Œใ‚’ๆง‹็ฏ‰ใ™ใ‚‹ใ‚ทใ‚นใƒ†ใƒ ใ€‚ๆœ€ๅˆใฏๅœฐ็ƒใ€ๅคช้™ฝใ€ๆœˆใ‹ใ‚‰็”Ÿๆˆใ•ใ‚Œใ‚‹ใ€‚ใ‚ฒใƒผใƒ ใ‚จใƒณใ‚ธใƒณใฎ่ƒŒๆ™ฏใซๆœˆใฎ็ตตใ‚’ๅ‹•ใ‹ใ™ใจใ„ใ†ๅธธ่ญ˜ใ‚’ๅค‰ๆ›ดใ™ใ‚‹ใ€‚ๅฎŸไฝ“ใ‚ใ‚‹ๆœˆใ‚’ใใฎ็ฉบ้–“ใซ็ฝฎใใ“ใจใง่ƒŒๆ™ฏใ‚’็”Ÿๆˆใ€‚ๆƒ‘ๆ˜Ÿใ‚ทใ‚นใƒ†ใƒ ใ‚’ๆง‹็ฏ‰ใ™ใ‚‹ใ€‚ -- `ai system`: ๅฑžๆ€งใ‚„ใ‚ฒใƒผใƒ ๆ€งใ‚’ๆง‹็ฏ‰ใ™ใ‚‹ใ‚ทใ‚นใƒ†ใƒ ใ€‚ -- `yui system`: ๅ”ฏไธ€ๆ€งใจใ„ใ†ไพกๅ€ค่ฆณใ‹ใ‚‰ๆง‹็ฏ‰ใ•ใ‚Œใ‚‹ใ‚ทใ‚นใƒ†ใƒ ใ€‚็พๅฎŸใ‚’ใ‚ฒใƒผใƒ ใซใ€ใ‚ฒใƒผใƒ ใ‚’็พๅฎŸใซๅๆ˜ ใ™ใ‚‹ใ“ใจใง่‡ช็„ถใจๅฎŸ็พใ•ใ‚Œใ‚‹ใ€‚ -- `at system`: ใƒ—ใƒฌใ‚คใƒคใƒผใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚’atprotoใจใ„ใ†protocolใฎ็†่งฃใซใ‚ˆใ‚Šๆง‹็ฏ‰ใ™ใ‚‹ใ€‚protocolใฏๅฎนๆ˜“ใซใฏ็„กใใชใ‚‰ใชใ„ใ—ๅค‰ๆ›ดใ•ใ‚Œใชใ„ใ‚‚ใฎใ€‚`@`ใจใ„ใ†domainใง็น‹ใŒใ‚‹ใƒฆใƒผใ‚ถใƒผใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฎใ‚ทใ‚นใƒ†ใƒ ใ€‚blueskyใจใ„ใ†snsใซๅˆฉ็”จใ•ใ‚Œใฆใ„ใ‚‹ใ€‚ - -### systemใ‚’ไฝœใ‚ใ† - -ใ‚ฒใƒผใƒ ใฏsystemใฎ้›†ๅˆไฝ“ใงไฝœใ‚‹ใฎใŒไธ€็•ชใ„ใ„ใ€‚ - -้–‹็™บใงใฏใ€ใพใจใ‚ใ‚‹ใ“ใจใŒ้‡่ฆใซใชใ‚Šใพใ™ใ€‚ - -systemใจใฏ้–ขๆ•ฐใ‚„ใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใ€ๅค‰ๆ•ฐใฎ้›†ใพใ‚Šใงใ™ใ€‚ใใ‚Œใฏ็ตๆžœใงใ‚ใฃใฆ็›ฎ็š„ใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ - -็›ฎ็š„ใฎไธ€ใคใฏใ‚ใ‹ใ‚Šใ‚„ใ™ใ•ใ€‚ไพ‹ใˆใฐใ€ๆ•ตใ‚’ๅ€’ใ—ใŸๆ™‚ใ€ใ‚ขใ‚คใƒ†ใƒ ใ‚’ใƒ‰ใƒญใƒƒใƒ—ใ•ใ›ใ‚‹ๅ‡ฆ็†ใ‚’ไฝœใ‚Šใพใ™ใ€‚ๅ€‹ๅˆฅใซๆ•ตใฎBPใซไฝœใ‚‹ใฎใงใฏใชใใ€systemใจใ—ใฆไฝœใฃใฆใŠใใจใ‚ˆใ„ใงใ—ใ‚‡ใ†ใ€‚1ใจๆŠผใ›ใฐ1ใคใฎใ‚ขใ‚คใƒ†ใƒ ใŒใƒ‰ใƒญใƒƒใƒ—ใ—ใพใ™ใ€‚3ใจๆŠผใ›ใฐ3ใคใงใ™ใ€‚ๅ†…ๅฎนใ‚‚ใƒฉใƒณใƒ€ใƒ ใ‹ใคใƒฉใƒณใ‚ฏใ‚’ไป˜ใ‘ใพใ—ใ‚‡ใ†ใ€‚Aใƒฉใƒณใ‚ฏ-Cใƒฉใƒณใ‚ฏใฎใ‚ขใ‚คใƒ†ใƒ ใงใ™ใ€‚ - -ใคใพใ‚Šใ€ใใฎsystemใซ3Bใจไผใˆใ‚‹ใจใ€3ใคใฎใ‚ขใ‚คใƒ†ใƒ ใŒใƒ‰ใƒญใƒƒใƒ—ใ—ใ€Bใƒฉใƒณใ‚ฏใฎใ‚ขใ‚คใƒ†ใƒ ใŒใƒ‰ใƒญใƒƒใƒ—ใ—ใ‚„ใ™ใ„ใ€ใจใ„ใ†็ตๆžœใŒๅ‡บๅŠ›ใ•ใ‚Œใพใ™ใ€‚ใ‚ขใ‚คใƒ†ใƒ ไธ€่ฆงใ‚‚ใ™ในใฆใใฎsystemใŒ็ฎก็†ใ—ใ€็ฐกๅ˜ใซ่จญๅฎšใงใใพใ™ใ€‚ - -ใ‚ฒใƒผใƒ ใ‚’ไฝœใ‚‹ใจใ„ใ†ใฎใฏใ€systemใ‚’ไฝœใ‚‹ใ“ใจใ€‚ใใ‚Œใฏๅ˜ไฝ“ใฎๅฎŸ่กŒใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ๅ€‹ไบบ้–‹็™บใฎๅ ดๅˆใฏ็‰นใซ่จญ่จˆใ‚’้‡่ฆ–ใ—ใ€ใพใจใ‚ใ‚‹ใ“ใจใ‚’้‡่ฆ–ใ—ใพใ™ใ€‚ - -ใ“ใ‚ŒใŒไฝ•ใ‹ใจใ„ใ†ใจใ€ไธ€ใคใฏใƒซใƒผใƒซใ‚’ไฝœใ‚‹ใ“ใจใงใ™ใ€‚ - -1ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใซใคใ1ใ‚นใ‚ญใƒซใ€1ใƒใƒผใ‚นใƒˆใ€‚ไพ‹ๅค–ใฏ่ชใ‚ใชใ„ใ€‚ใ“ใฎใ‚ˆใ†ใชใƒซใƒผใƒซใงใ™ใ€‚ใใ—ใฆใ€ใใฎใƒซใƒผใƒซใซๅŸบใฅใ„ใŸsystemใ‚’่จญ่จˆใ—ใ€ไพ‹ใˆใฐใ€ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใชใ‚‰ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฎ็ตฑไธ€็ฎก็†ใ‚’็›ฎๆŒ‡ใ—ใพใ™ใ€‚็ตฑไธ€็ฎก็†ใจใ„ใ†ใฎใฏใ€ๆ•ฐๅญ—ใ‚„objectใ‚’ๅ…ฅใ‚Œใ‚Œใฐ่จญๅฎšใฏๅฎŒไบ†ใงใ™ใ€‚ใใฎ้€šใ‚Šใซใ™ในใฆใฎใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใŒๅ…ฑ้€šๅ‹•ไฝœใ™ใ‚‹ใ‚ˆใ†ใซใ—ใฆใŠใ“ใ†ใ€ใใ“ใ‚’็›ฎๆŒ‡ใใ†ใจใ„ใ†ใ“ใจใงใ™ใ€‚ - -ใ“ใ‚ŒใŒsystemใ‚’ไฝœใ‚‹ใจใ„ใ†ใ“ใจใงใ™ใ€‚ - -็งใฏใ€ๆ•ต(enemy)ใ‚’ไฝœใฃใฆใ„ใ‚‹ๆ™‚้–“ใŒใ‚ใ‚Šใพใ›ใ‚“ใ‹ใ‚‰ใ€enemyใ‚‚characterใซใพใจใ‚ใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚ - -ใใฎใŸใ‚ใ€ๅฐ‘ใ—ๅ‹•ใใฎ่ชฟๆ•ดใŒ้›ฃใ—ใ‹ใฃใŸใ‚Šใ‚‚ใ—ใพใ™ใŒใ€ใ“ใฎๆ–นๅ‘ๆ€งใง้–“้•ใ„ใชใ„ใจๆ€ใ„ใพใ™ใ€‚ - -ใ‚ทใƒผใƒณใ‚„ใƒ ใƒผใƒ“ใƒผใ€ใ‚นใƒˆใƒผใƒชใƒผใฏๅบƒใ„ไธ–็•Œ(ใ‚ขใ‚คใงๆ“ไฝœใ™ใ‚‹ไธ–็•Œ)ใซใพใจใ‚ใ€enemyใ‚‚playerใŒๆ“ไฝœใงใใ‚‹characterใซใพใจใ‚ใ€ๅ˜ไฝ“ใงไฝœใ‚‹ใ‚‚ใฎใ‚’ๆธ›ใ‚‰ใ—ใ€ใ™ใงใซใ‚ใ‚‹ใ‚‚ใฎใ€ไฝœใฃใŸใ‚‚ใฎใฏไป–ใฎๅฝนๅ‰ฒใ‚‚ๆ‹…ใˆใ‚‹ใ‚ˆใ†ใซใ—ใฆใ„ใใพใ—ใ‚‡ใ†ใ€‚ใ“ใฎใ‚ˆใ†ใช่€ƒใˆๆ–นใŒๅ€‹ไบบ้–‹็™บใงใฏ้‡่ฆใซใชใฃใฆใใ‚‹ใจๆ€ใ„ใพใ™ใ€‚ - - - -### ใ‚„ใ‚‹ใ“ใจใ‚’ๆ˜Ž็ขบใซ - -ๅ€‹ไบบ้–‹็™บ่€…ใซใฏใ€ใงใใ‚‹ใ“ใจใจใงใใชใ„ใ“ใจใŒใ‚ใ‚Šใพใ™ใ€‚ - -ๅธ‚่ฒฉใฎใ‚ฒใƒผใƒ ใฏใ€ใ‚ใ‚‰ใ‚†ใ‚‹ๅฐ‚้–€ๅฎถใŒๅคง้‡ใซ้›†ใพใ‚Šไธ€็ท’ใซไฝœใฃใฆใ„ใ‚‹ใ‚ฒใƒผใƒ ใงใ™ใ€‚ๅ€‹ไบบ้–‹็™บใงๅ…จ้ƒจใฏใงใใพใ›ใ‚“ใ€‚ - -ใ—ใ‹ใ—ใ€ใงใใชใ„ใ‹ใ‚‰ใจ่จ€ใฃใฆใ€ๆ‰‹ใ‚’ๆŠœใใฎใ‚‚้•ใ„ใพใ™ใ‚ˆใญใ€‚ - -็ขบใ‹ใซใ€็งใŒไฝœใ‚ŠใŸใ‹ใฃใŸใ‚ฒใƒผใƒ ใฏ้ข็™ฝใใชใ„ใ‹ใ‚‚ใ—ใ‚Œใชใ„ใ€‚ใ‘ใฉใ€ไธ€่ฆ‹ใ™ใ‚‹ใจ้ข็™ฝใใ†ใซ่ฆ‹ใˆใพใ™ใ€‚ - -ๆ˜ ๅƒ็พŽใ‚„่ฆ‹ใ›ใ‚‹ใ“ใจใจๅฎŸ้š›ใซ้ข็™ฝใ„ใ“ใจใฏ้•ใ„ใพใ™ใ€‚ใ—ใ‹ใ—ใ€ๆ˜ ๅƒ็พŽใฏๅˆฅใซๆ‚ชใ„ใ“ใจใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ใใ‚Œใฏใ‚ฒใƒผใƒ ใจใ—ใฆใฏ้ข็™ฝใใชใ„ใ‘ใฉใ€่ฆ‹ใ›ใ‚‹ๅŠ›ใŒใ‚ใ‚‹ใจๆ€ใ„ใพใ™ใ€‚ใ‚ทใƒผใƒณใ‚„ใƒ ใƒผใƒ“ใƒผใจใ—ใฆๅˆฉ็”จใงใใ‚‹ใฎใงใฏใชใ„ใงใ—ใ‚‡ใ†ใ‹ใ€‚ - -็งใฏใ‚ทใƒผใƒณใ‚„ใƒ ใƒผใƒ“ใƒผใ‚’ไฝœใฃใฆใ„ใ‚‹ๆ™‚้–“ใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ใ—ใ‹ใ—ใ€็งใŒไปŠใพใงไฝœใฃใฆใใŸๅบƒใ„ไธ–็•Œใฏใใ†ใ„ใฃใŸใ“ใจใซไฝฟใˆใฐใ„ใ„ใ€‚็‹ญใ„ไธ–็•Œใฎ่ƒŒๆ™ฏใซใ‚‚ไฝฟใˆใพใ™ใ€‚ - -ใ„ใคใ‹่กŒใ‘ใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใชใ„ๅบƒใ„ไธ–็•Œใ€‚็†ๆƒณใจ็พๅฎŸใ€‚ - -ๆœ€ๅˆใ‹ใ‚‰็†ๆƒณใ ใ‘ใ‚ใฃใฆใ‚‚ใ€ใใ‚Œใฏ้ข็™ฝใใชใ„ใ€‚ๆœ€ๅˆใ‹ใ‚‰็พๅฎŸใ ใ‘ใ‚ใฃใฆใ‚‚ใใ‚ŒใฏใŸใ ใฎใ‚ฒใƒผใƒ ใงใ™ใ€‚้ข็™ฝใ„ใ‚ฒใƒผใƒ ใจใฏใ€็พๅฎŸใจ็†ๆƒณใฎใƒใƒฉใƒณใ‚นใ€‚ใ‚ใ‚‹ใ„ใฏใ€ใใฎ้Ž็จ‹ใ‚’ไฝœใ‚‹ใ“ใจใซใ‚ใ‚‹ใฎใงใฏใชใ„ใงใ—ใ‚‡ใ†ใ‹ใ€‚ - -ๆœ€ๅˆใฎๅคขใ‚’ๆŒใก็ถšใ‘ใ‚‹ใ“ใจใ‚‚ใ€ใใ—ใฆใ€ๅคšใใฎไบบใŒๆฅฝใ—ใ‚ใ‚‹ใ‚‚ใฎใ‚’ไฝœใ‚‹ไบ‹ใ‚‚ไธกๆ–นๅคงๅˆ‡ใงใ™ใ€‚ๅˆๅฟƒใ‚’ๆจใฆใšๅˆ†้›ขใ—ใฆใ€ๆ–ฐใŸใซ้ข็™ฝใ„ใ‚ฒใƒผใƒ ใ‚’็›ฎๆŒ‡ใ—ใฆไฝœใ‚Šๅง‹ใ‚ใ‚‹ใ“ใจใ€‚ใใ—ใฆใ€ๆœ€็ต‚็š„ใซ็ตฑๅˆใงใใ‚‹้“็ญ‹ใ‚’ๆ€ใ„ๆใ‘ใ‚‹ใชใ‚‰ใ€‚ใใ‚“ใชใ“ใจใ‚’ๆ€ใ„ใพใ™ใ€‚ - -ๆฌกใฏใ€ๅฐใ•ใใ‚‚ๅฎŒ็’งใงใ€็‹ญใใฆใ‚‚ๅ…จใฆใซ็”ฑๆฅใŒใ‚ใ‚‹ใ€ใใ‚“ใชไธ–็•Œใ‚’ไฝœใฃใฆใ„ใ“ใ†ใจๆ€ใฃใฆใ„ใพใ™ใ€‚ - -### ็‹ญใ„ไธ–็•Œใ‚’ใฉใ†ใ‚„ใฃใฆไฝœใฃใฆใ„ใ“ใ† - -ใƒใ‚คใƒณใƒˆใฏใ€ใ‚ซใƒฉใƒ•ใƒซ+ใƒใƒƒใƒ—ใ ใจๆ€ใ„ใพใ™ใ€‚ๅฐใ•ใ„+ๅฎŒ็’งใ‚‚ใƒใ‚คใƒณใƒˆใงใ™ใญใ€‚ใพใŸใ€ๅ‹•ไฝœใฏ้žๅธธใซใ‚†ใฃใใ‚ŠใŒใ„ใ„ใฎใงใฏใชใ„ใงใ—ใ‚‡ใ†ใ‹ใ€‚ - -ใคใพใ‚Šใ€ๅฐใ•ใ„ใŒๅฎŒ็’งใซๅ‹•ไฝœใ—ใ€ใ‚ซใƒฉใƒ•ใƒซใงใƒใƒƒใƒ—ใชไธ–็•Œใ€‚ใใ‚ŒใŒใ“ใ“ใงใ„ใ†็‹ญใ„ไธ–็•Œใซใชใ‚Šใพใ™ใ€‚ - -็งใฏใ“ใฎ่พบใฎใ“ใจใ‚‚ใ‚ใพใ‚Š็Ÿฅใ‚Šใพใ›ใ‚“ใ‹ใ‚‰ใ€epicใฎ[stack o bot](https://www.fab.com/ja/listings/b4dfff49-0e7d-4c4b-a6c5-8a0315831c9c)ใจใ„ใ†ใƒ†ใƒณใƒ—ใƒฌใƒผใƒˆใ‚’ใ‚‚ใจใซๅญฆ็ฟ’ใ—ใชใŒใ‚‰ไฝœใฃใฆใ„ใ“ใ†ใจ่€ƒใˆใฆใ„ใพใ™ใ€‚ - - - -## game system v0.4.3 - -- ps5 controllerใฎๅฏพๅฟœ -- game animation sampleใจstack o botใฎ็ตฑๅˆ -- item drop system -- character audio system -- sword reflection -- character dragon skill (enemy) -- bgm systemใฎไฟฎๆญฃ - diff --git a/my-blog/content/posts/2025-08-23-game.md b/my-blog/content/posts/2025-08-23-game.md deleted file mode 100644 index 6987a32..0000000 --- a/my-blog/content/posts/2025-08-23-game.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: "่‡ชไฝœใ‚ฒใƒผใƒ ใ‚’้–‹ๅง‹ใ‹ใ‚‰็ต‚ไบ†ใพใงใƒ—ใƒฌใ‚ค" -slug: "game" -date: "2025-08-23" -tags: ["ue"] -draft: false ---- - -่‡ชไฝœใ‚ฒใƒผใƒ ใ‚’้–‹็™บใ—ใฆใ„ใพใ™ใ€‚ - -ไปŠๅ›žใฏ้–‹ๅง‹ใ‹ใ‚‰็ต‚ไบ†ใพใงใฎๅคงไฝ“ใฎๆตใ‚ŒใŒใงใใŸใฎใงใƒ—ใƒฌใ‚คใ—ใฆใฟใพใ—ใŸใ€‚ - - - -## ใ‚ฒใƒผใƒ ใฎๆตใ‚Œใ‚’่งฃ่ชฌ - -1. ็‰ฉ่ชžใฏๅฎ‡ๅฎ™ใ‹ใ‚‰ๅง‹ใพใ‚‹ใ€‚ใƒ—ใƒฌใ‚คใƒคใƒผใฎๆ‘ใซ็ช็„ถๅฎ‡ๅฎ™่ˆนใŒใ‚„ใฃใฆใใฆใ€ใƒ—ใƒฌใ‚คใƒคใƒผใŒ้€ฃใ‚ŒๅŽปใ‚‰ใ‚Œใ‚‹ใ€‚ -2. ใ“ใ“ใฏ่ˆนๅ†…ใซใ‚ใ‚‹ๆชปใฎไธญใ€‚็›ฃ่ฆ–ๅ…ตใŒๆ…ŒใŸใ ใ—ใ„ใ€‚ใ€ŒใŠใ„ใ€ใ‚ใ‚ŒใŒๅ‡บใŸใฃใฆใ€ใ€Œใพใ•ใ‹ใ€ใชใฉใฎไผš่ฉฑใ€‚ใƒใƒฉใจ็ช“ใฎๅค–ใซ็›ฎใ‚’ใ‚„ใ‚‹ใ€‚ใ™ใ‚‹ใจไฝ•ใ‹ใŒๅ…‰ใฃใŸใ‚ˆใ†ใชๆฐ—ใŒใ—ใŸใ€‚ -3. (ใ“ใ“ใงใƒ—ใƒฌใ‚คใƒคใƒผใฏๅˆๅ›žใฎใฟใ‚ขใ‚คใ‚’ๆ“ไฝœๅฏ่ƒฝใซใชใ‚‹ใ€‚ใ‚ฒใƒผใƒ ้–‹ๅง‹ๆ™‚ใซใ™ใใซๆ“ไฝœๅฏ่ƒฝใซใ™ใ‚‹ใ“ใจใŒ้‡่ฆใ ใจๆ€ใฃใŸใฎใงใ€ใ‚ทใƒผใƒณใฎไฝœๆˆใฏใ‚„ใ‚ใฆใ€ใƒ—ใƒฌใ‚คใƒคใƒผใซๆˆฆ่‰ฆใ‚’ๆ’ƒ็ ดใ—ใฆใ‚‚ใ‚‰ใ†ใ“ใจใซ) -4. ่‰ฆๅ†…ใฏ็ˆ†็™บใ—ใ€ๆ˜Ÿใซ่ฝใกใฆใ„ใใ€‚็›ฎใŒ่ฆšใ‚ใ‚‹ใจ...ใใ“ใ‹ใ‚‰ใ‚นใƒ†ใƒผใ‚ธใŒๅง‹ใพใ‚‹ใ€‚(ใ“ใ“ใ‹ใ‚‰ใƒ—ใƒฌใ‚คใƒคใƒผใฎใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใซๅˆ‡ใ‚Šๆ›ฟใ‚ใ‚‹ใ€‚ไปŠๅ›žใฏใ‚ขใ‚คใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใชใฎใงใ€ใ‚ขใ‚คใซใชใฃใฆใ„ใ‚‹ใŒๆœฌๆฅใฏ้•ใ†) -5. ใ‚นใƒ†ใƒผใ‚ธใฎ่ƒŒๆ™ฏใซๅฐใ•ใชๅญใŒใใƒผใๅฏใฆใ„ใ‚‹ใ€‚(ๅ…ˆใปใฉๆ“ไฝœใ—ใŸใ‚ขใ‚คใฏๅค‰่บซๆ™‚ใฎ้‡‘้ซช่ผชใฃใ‹ใชใฎใงใ€้ป’้ซชใซๆˆปใฃใฆใ„ใ‚‹ใ‚ขใ‚คใ‚’่ฆ‹ใฆใ‚‚ใƒ—ใƒฌใ‚คใƒคใƒผใซใฏใ‚ใ‹ใ‚‰ใชใ„) -6. ใ‚นใƒ†ใƒผใ‚ธใ‚’้€ฒใฟใ€ใƒ‰ใƒฉใ‚ดใƒณใ‚’ๅ€’ใ—ใฆใ‚ฒใƒผใƒ ใฏ็ต‚ไบ†ใ€‚่Šฑ็ซใฃใฝใ„ใ‚‚ใฎใ‚’ๆ‰“ใกไธŠใ’ใ€ใƒใƒผใ‚บใ‚’ๆฑบใ‚ใ‚‹ใ€‚ใใฎๅพŒใ€ใ‚ฒใƒผใƒ ็ต‚ไบ†ใพใง่‡ช็”ฑๆ“ไฝœใ€‚ใ‚ขใ‚คใƒ†ใƒ ใฎใƒ‰ใƒญใƒƒใƒ—ใŒใ‚ใ‚‹ใ€‚ - -## ้ข็™ฝใ„ใ‚ฒใƒผใƒ ใ‚’็›ฎๆŒ‡ใ—ใฆ - -ใ‚คใƒณใƒ™ใƒผใƒ€ใƒผใ‚„ใƒžใƒชใ‚ชใชใฉไปŠใฎๆŠ€่ก“ใงใฏ็ฐกๅ˜ใซไฝœใ‚Œใใ†ใชใƒฌใƒˆใƒญใ‚ฒใƒผใƒ ใŒใ‚ใ‚Šใพใ™ใ€‚ - -ใใ‚Œใ‚‰ใŒ้ข็™ฝใ„ใฎใ‹ใจ่จ€ใ‚ใ‚Œใ‚Œใฐใ€็งใฏ้ข็™ฝใ„ใจๆ€ใ„ใพใ™ใ€‚ - -ใจใฏใ„ใˆใ€ไปŠใใ†ใ„ใฃใŸใ‚‚ใฎใง้Šใถใ‹ใจใ„ใ†ใจใ€ใใ‚Œใฏ้•ใ†ใจๆ€ใ„ใพใ™ใ€‚ - -ใ—ใ‹ใ—ใ€ๅ€‹ไบบ้–‹็™บ่€…ใฏใพใšใใฎๆฎต้šŽใซๅˆฐ้”ใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚‹ใฎใงใฏใชใ„ใ‹ใจๆ„Ÿใ˜ใพใ™ใ€‚ - -ใงใฏใ€ใƒฌใƒˆใƒญใ‚ฒใƒผใƒ ใฎ้ข็™ฝใ•ใซใคใ„ใฆใ€ๆ”นใ‚ใฆๅˆ†ๆžใ—ใฆใฟใ‚‹ใ“ใจใซใ—ใพใ—ใ‚‡ใ†ใ€‚ - -ใƒฌใƒˆใƒญใ‚ฒใƒผใƒ ใชใ‚“ใฆใ€AIใ‚’ไฝฟใˆใฐ็ฐกๅ˜ใซไฝœใ‚Œใพใ™ใ‚ˆใ€‚ใใ‚“ใชๅฃฐใŒ่žใ“ใˆใฆใใใ†ใงใ™ใŒใ€ใใ‚Œใฏๅฐ‘ใ—้•ใ†ใจๆ€ใ„ใพใ™ใ€‚ - -ไพ‹ใˆใฐใ€ใ‚นใƒ†ใƒผใ‚ธ1ใ‚’ไฝœใ‚Œใฆใ‚‚ใ€ใ‚นใƒ†ใƒผใ‚ธ2,3,4ใ€ใใ—ใฆใ€ใƒฉใ‚นใƒˆใฎใ‚นใƒ†ใƒผใ‚ธใพใงใ€ๅธ‚่ฒฉใฎๅˆไปฃใƒžใƒชใ‚ชใจๅŒใ˜ใ‚ˆใ†ใซไฝœใฃใฆใ„ใ‚‹ใฎใงใ—ใ‚‡ใ†ใ‹ใ€‚ - -ใใ‚ŒใŒใงใใฆใ„ใชใ„ใชใ‚‰ใ€ใใ‚Œใฏไฝœใ‚Œใฆใ„ใชใ„ใจใ„ใ†ใ“ใจใงใ™ใ€‚ - -ใใ—ใฆใ€ใ‚นใƒ†ใƒผใ‚ธใ ใ‘ใŒใƒžใƒชใ‚ชใ˜ใ‚ƒใชใ„ใงใ™ใ‚ˆใญใ€‚็งใŒใƒ—ใƒฌใ‚คใ—ใŸใ“ใจใŒใ‚ใ‚‹ใ‚นใƒผใƒ‘ใƒผใƒžใƒชใ‚ชใƒฏใƒผใƒซใƒ‰ใฏใƒœใ‚นใ‚’ๅ€’ใ™ใจๆผ”ๅ‡บใŒใ‚ใ‚Šใพใ—ใŸใ€‚ - -ใใ“ใซใฏใ€็‰ฉ่ชžใŒใ‚ใ‚Šใ€่Šฑ็ซใŒๆ‰“ใกไธŠใŒใ‚Šใ€็ด™ๅน้›ชใŒ่ˆžใ„ใ€ไธปไบบๅ…ฌใŒใƒใƒผใ‚บใ‚’ๆฑบใ‚ใ‚‹ใฎใงใ™ใ€‚ๆ„ๅค–ใจใ‚ฒใƒผใƒ ่‡ชไฝ“ใ‚ˆใ‚Šใใ†ใ„ใฃใŸใ‚‚ใฎใ‚’ๅซใ‚ใฆ้ข็™ฝใ„ใ‚ฒใƒผใƒ ใชใฎใงใ‚ใฃใฆใ€ใใ‚ŒใŒ้‡่ฆใชใฎใ ใจๆ€ใ„ใพใ™ใ€‚ - -ๅ€‹ไบบ้–‹็™บ่€…ใฎๅคšใใฏ็งใ‚’ๅซใ‚ใ€ใใ†ใ„ใฃใŸ้ข็™ฝใ„ใ‚ฒใƒผใƒ ใ‚’ไฝœใ‚Œใฆใ„ใ‚‹ใฎใ‹ใจใ„ใ†ใจใ€ใงใใฆใ„ใชใ„ใจๆ€ใ†ใฎใงใ™ใ€‚ - -ใ‚‚ใกใ‚ใ‚“ใ€่‰ฒใ€…ใชไบบใŒใ„ใพใ™ใ‹ใ‚‰ใ€ใงใใฆใ„ใ‚‹ไบบใ‚‚ใ„ใ‚‹ใจๆ€ใ„ใพใ™ใ€‚ใ—ใ‹ใ—ใ€็งใซใฏใงใใฆใ„ใชใ„ใ€‚ใใ“ใพใงไฝœใ‚Œใฆใ„ใชใ„ใ—ใ€ใƒฌใƒˆใƒญใ‚ฒใƒผใƒ ใฎๅŸŸใซใ™ใ‚‰ๅˆฐ้”ใ—ใฆใ„ใพใ›ใ‚“ใ€‚ - -## ้ข็™ฝใ„ใ‚‚ใฎใจๅฃฒใ‚Œใ‚‹ใ‚‚ใฎใฏ้•ใ† - -ใงใฏใ€้ข็™ฝใ„ใ‚‚ใฎใ‚’ไฝœใ‚Œใฐใ€ใใ‚Œใงๅฃฒใ‚Œใ‚‹ใฎใ‹ใจใ„ใ†ใจใ€ใใ‚Œใ‚‚ใพใŸ้•ใ†ใจๆ€ใ„ใพใ™ใ€‚ - -ๆ—ขใซใ‚ใ‚‹ใ‚ฒใƒผใƒ ใฎใƒ‘ใ‚ฏใƒชใ€ใใ‚Œใฏใใ‚Œใง้ข็™ฝใ„ใ‚ฒใƒผใƒ ใซใชใ‚‹ใจๆ€ใ„ใพใ™ใ€‚ใ—ใ‹ใ—ใ€ไปŠๆ›ดใƒฌใƒˆใƒญใ‚ฒใƒผใƒ ใ‚’ไฝœใฃใฆใ‚‚ใ€่ชฐใ‚‚ใƒ—ใƒฌใ‚คใ—ใชใ„ใจๆ€ใ„ใพใ™ใ€‚ - -้ข็™ฝใ„ใ‚ฒใƒผใƒ ใจไบบๆฐ—ใŒๅ‡บใ‚‹ใ“ใจใฏ้•ใ†ใฎใงใ™ใ€‚ - -ใใ“ใง้‡่ฆใซใชใ‚‹ใฎใŒใ‚ชใƒชใ‚ธใƒŠใƒชใƒ†ใ‚ฃใจใ„ใ†่ฆ็ด ใงใฏใชใ„ใงใ—ใ‚‡ใ†ใ‹ใ€‚ - -ใ—ใŸใŒใฃใฆใ€ๆฎต้šŽใŒใ‚ใ‚‹ใจใ—ใŸใ‚‰ใ€้ข็™ฝใ„ใ‚ฒใƒผใƒ ใฎๅŸŸใซๅˆฐ้”ใ™ใ‚‹ใ€‚ใใฎๅพŒใ€ใ‚ชใƒชใ‚ธใƒŠใƒชใƒ†ใ‚ฃใฎๅŸŸใซๅˆฐ้”ใ™ใ‚‹ใ€‚ใ‚ใ‚‹ใ„ใฏใ€ๅŒๆ™‚ใซใใ‚Œใ‚’ใ“ใชใ™ๅฟ…่ฆใŒใ‚ใ‚‹ใฎใ ใจๆ€ใ„ใพใ™ใ€‚ - -ใจใฏใ„ใˆใ€ใพใšใฏ้ข็™ฝใ„ใ‚ฒใƒผใƒ ใ‚’ไฝœใ‚‹ใ“ใจใ€‚ใ›ใ‚ใฆใใฎๅŸŸใซๅˆฐ้”ใ—ใŸใ„ใงใ™ใ‚ˆใญใ€‚ใใ—ใฆใ€ใƒฌใƒˆใƒญใ‚ฒใƒผใƒ ใซใ‚‚ๅๅˆ†ใซ้ข็™ฝใ„่ฆ็ด ใฏๆƒใฃใฆใ„ใ‚‹ใฎใงใ€ใใ‚Œใ‚‰ใ‚’ๅ‚่€ƒใซใ™ใ‚‹ใฎใŒ่‰ฏใ„ใจๅˆคๆ–ญใ—ใพใ—ใŸใ€‚ - -## ไบบๆฐ—ใŒๅ‡บใ‚‹ใ“ใจใจๅˆฉ็›ŠใŒๅ‡บใ‚‹ใ“ใจใ‚‚ใพใŸ้•ใ† - -ใใ†ใ„ใˆใฐใ€ๅŽ็›ŠๅŒ–ใ‚‚ใพใŸๅˆฅใฎ่ฉฑใ ใ‚ˆใชใจๆ€ใฃใŸใฎใงๆ›ธใใพใ™ใ€‚ - -็ขบใ‹ใซใ€ใใ‚Œใฏๅฟ…้ ˆๆกไปถใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใŒใ€ใใ‚ŒใŒใ‚ใ‚Œใฐๅฟ…ใšใจใ„ใ†ใ‚‚ใฎใงใฏใชใ„ใจๆ€ใ„ใพใ™ใ€‚็ขบใ‹ใซๅฏ„ไธŽใ™ใ‚‹้ƒจๅˆ†ใฏๅฐ‘ใชใ‹ใ‚‰ใšใ‚ใ‚‹ใจใฏๆ€ใ†ใ‘ใฉใ€‚ - -ไพ‹ใˆใฐใ€snsใ‚’ใฟใฆใ„ใ‚‹ใจใ€ใ™ใ”ใ„ใ‚คใƒณใƒ—ใƒฌใƒƒใ‚ทใƒงใƒณใ€ๆณจ็›ฎใ‚’้›†ใ‚ใŸใฎใซใ€ๅฃฒใ‚Œใชใ‹ใฃใŸๆผซ็”ปใŒใŸใใ•ใ‚“ใ‚ใ‚Šใพใ™ใ€‚ใคใพใ‚Šใ€ไบบๆฐ—ใฏๅ‡บใŸใŒใ€ๅˆฉ็›Šใฏๅ‡บใชใ‹ใฃใŸใ‚ฑใƒผใ‚นใ ใจๆ€ใ„ใพใ™ใ€‚ - -ใ—ใŸใŒใฃใฆใ€ๅŽ็›ŠๅŒ–ใพใงใฎ้“ใฎใ‚Šใ‚‚ใพใŸ้•ทใ„ใฎใงใฏใชใ„ใ‹ใ€‚ๅคงๅค‰ใชใฎใ‹ใ‚‚ใ—ใ‚Œใชใ„ใ€‚ใใ‚“ใชใตใ†ใซๆ€ใ†ใฎใงใ™ใ€‚ - -ใ“ใ‚Œใ‚’็Ÿญ็ตก็š„ใช่ฆ‹้€šใ—ใงใ€Œ้ข็™ฝใ‘ใ‚Œใฐๅฃฒใ‚Œใ‚‹ใ€ใชใฉใจ่€ƒใˆใฆใ„ใ‚‹ใจใ€ๅฝ“ใฆใŒๅค–ใ‚Œใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใชใ„ใ€‚ใใฎใธใ‚“ใฏใ‚ใพใ‚ŠๆœŸๅพ…ใ—ใชใ„ใปใ†ใŒใ„ใ„ใ‹ใ‚‚ใ€‚ - -ๆฎต้šŽ็š„ใซใใ‚Œใžใ‚Œใฎๆˆฆ็•ฅใ‚’่€ƒใˆใฆใ„ใใฎใŒ่‰ฏใ„ใฎใงใฏใชใ„ใ‹ใชใ€‚ - -`้ข็™ฝใ„ -> ไบบๆฐ—ใŒๅ‡บใ‚‹ -> ๅˆฉ็›ŠใŒๅ‡บใ‚‹`...ใใฎ้–“ใซใ‚‚้ซ˜ใ„ๅฃใŒใ‚ใ‚‹ใ€‚ - -## ใ‚ชใƒชใ‚ธใƒŠใƒชใƒ†ใ‚ฃใฏใฉใ†ใ‚„ใฃใฆๅ‡บใ™ใฎใ‹ - -ไพ‹ใˆใฐใ€ๅˆถ็ด„ใ‹ใ‚‰ใงใ™ใ€‚ - -็งใฏ่จญ่จˆใซใŠใ„ใฆใ€ใ„ใใคใ‹ใฎๆฑบใ‚ไบ‹ใ‚’ไฝœใ‚Šใพใ—ใŸใ€‚ไพ‹ใˆใฐใ€ไปฅไธ‹ใฎใƒซใƒผใƒซใŒใ‚ใ‚Šใพใ™ใ€‚ - -1. ็‰ฉ็†ๆณ•ๅ‰‡ใซๅใ—ใชใ„ - -ใ‚ฒใƒผใƒ ใง็‰ฉใ‚’ๆตฎใ‹ใ›ใ‚‹ใฎใฏ็ฐกๅ˜ใ ใ€‚ใ—ใ‹ใ—ใ€ใ“ใฎไธ–็•Œใฏ็พๅฎŸใฎๅๆ˜ ใ‚’็›ฎๆŒ‡ใ—ใฆใ„ใ‚‹ใ€‚ใ—ใŸใŒใฃใฆใ€ใ™ใใซ็‰ฉใ‚’ๆตฎใ‹ใ›ใŸใ‚Šใ€ใ‚ใ‚‹ใ„ใฏใƒ†ใƒฌใƒใƒผใƒˆใ—ใŸใ‚Šใ€ใใ‚Œใ‚’ใ‚„ใฃใฆใฏใ„ใ‘ใชใ„ใ€‚ใใ†ใ„ใฃใŸใ‚‚ใฎใซใฏๅฟ…ใšใ€ๅŽŸ็†ใ‚’่ชฌๆ˜Žใงใใชใ‘ใ‚Œใฐใชใ‚‰ใชใ„ใ€‚็‰นๆฎŠใชใ‚ขใ‚คใƒ†ใƒ ใŒๅฟ…่ฆใจใชใ‚‹ใ€‚ใ“ใฎใ‚ขใ‚คใƒ†ใƒ ใ‚’ใ‚ขใ‚คใฎๅฎถใซ3ใค็ฝฎใ„ใฆใ‚ใ‚‹ใจใ—ใ‚ˆใ†ใ€‚ใ“ใฎๅ ดๅˆใ€ใใฎ3ใคใ‚’ใƒžใƒƒใƒ—ใซ็ฝฎใใจใ€ใใฎไธ–็•Œใซใฏใ‚‚ใ†ใชใ„ใ€‚ไฝฟใˆใชใ„ใ€‚ใใฎใ‚ˆใ†ใชใƒซใƒผใƒซใ ใ€‚ใใฎไธ–็•Œใฎ้‡่ฆใชใ‚ขใ‚คใƒ†ใƒ ใฏใ‚ขใ‚คใŒๆŒใฃใฆใ„ใฆใ€ไฝœใฃใฆใ„ใ‚‹ใ€‚็„ก้™ใซใฏๆนงใ„ใฆใ“ใชใ„ใ€‚ๅˆถ้™ใŒใ‚ใ‚‹ใ€‚ใ“ใ‚Œใฏatprotoใซไฟๅญ˜ใ—ใ€ๅ…ฌ้–‹ใ—ใฆใŠใใฎใ‚‚ใŠใ‚‚ใ—ใ‚ใ„ใ‹ใ‚‚ใ—ใ‚Œใชใ„ใชใ€‚ใ“ใ†ใ„ใฃใŸใ“ใจใŒใใฎไธ–็•Œใฎ็”ฑๆฅใซใคใชใŒใ‚‹ใฎใ ใจๆ€ใ†ใ€‚ - -2. ใƒžใƒƒใƒ—ใฏไธ€ใค - -ใƒžใƒƒใƒ—ใฏๅฟ…ใšไธ€ใคใฎไธญใงๅฎŒ็ตใ•ใ›ใ‚‹ใ“ใจใ€‚ไธ–็•Œใฏไธ€ใคใจใ„ใ†ใƒซใƒผใƒซใ€‚ใŸใใ•ใ‚“ใฎใƒžใƒƒใƒ—ใ‚’ๅˆ†ใ‘ใฆใฏใ„ใ‘ใชใ„ใ€‚ไธไพฟใงใ‚‚ไธ€ใคใฎใƒžใƒƒใƒ—ใฎไธญใ ใ‘ใงไธ–็•Œใ‚’ไฝœใ‚ใ†ใ€‚ใƒžใƒƒใƒ—ใ‚’ๅˆ†ใ‘ใฆใฏใ„ใ‘ใชใ„ใ€‚ๅฎ‡ๅฎ™ใ‚‚ๅœฐไธŠใ‚‚ไธ€ใคใซใ™ใ‚‹ใ“ใจใ€‚ใ‚ทใƒผใƒณใ‚„ใƒ ใƒผใƒ“ใƒผใ‚’ไฝœใ‚‹ใจใใ‚‚ๅŒใ˜ใ€‚้•ใ†ใƒžใƒƒใƒ—ใงใใ‚Œใ‚’ใ‚„ใฃใฆใฏใ„ใ‘ใชใ„ใ€‚ - -## ไปŠๅ›žใฎใ‚ฒใƒผใƒ ไฝœใ‚Šใงๆ„่ญ˜ใ—ใŸใ“ใจ - -- game system v0.4.4 - -1. ใƒฌใƒˆใƒญใ‚ฒใƒผใƒ ใฎ้ข็™ฝใ•ใ‚’ๅฟ…่ฆๆœ€ๅฐ้™ใงๅฎŸ่ฃ… -2. ใ‚ชใƒชใ‚ธใƒŠใƒชใƒ†ใ‚ฃใ‚’่žๅˆ(ใ“ใฎใ‚ฒใƒผใƒ ใฎใƒ†ใƒผใƒžใงใ‚ใ‚‹ๅฎ‡ๅฎ™ใ€ใใ—ใฆ็‰ฉ่ชž) -3. ใ™ในใฆใฎๅฎŸ่ฃ…ใ‚’ๅ„ใ‚ทใ‚นใƒ†ใƒ ใงๅ‹•ใ‹ใ™ - diff --git a/my-blog/content/posts/2025-09-05-plc.md b/my-blog/content/posts/2025-09-05-plc.md deleted file mode 100644 index b9af14b..0000000 --- a/my-blog/content/posts/2025-09-05-plc.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: "plcใซhandle changeใ‚’ๅๆ˜ ใ™ใ‚‹" -slug: "plc" -date: "2025-09-05" -tags: ["atproto"] -draft: false ---- - -ใ„ใคใพใง็ตŒใฃใฆใ‚‚bsky.teamใฎplcใซhandle changeใŒๅๆ˜ ใ•ใ‚Œใชใ„ใฎใง่‰ฒใ€…ใ‚„ใฃใฆใฟใพใ—ใŸใ€‚ - -็ต่ซ–ใ‹ใ‚‰่จ€ใ†ใจใ€`PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX`ใ‚’ไฝฟ็”จใ—ใ€`base58`ใฎrotation-keyใ‚’ไฝœๆˆๅพŒใซใ€indigoใซใ‚ใ‚‹`goat plc`ใ‚’ไฝฟ็”จใ—ใพใ™ใ€‚ - -1. `goat key generate --type secp256k1`ใง็”Ÿๆˆใ•ใ‚ŒใŸใ‚ญใƒผใ‚’ๅˆ†ๆž -2. ใใฎใ‚ญใƒผใ‹ใ‚‰ๆญฃใ—ใ„multicodecใƒ—ใƒฌใƒ•ใ‚ฃใƒƒใ‚ฏใ‚นใ‚’ๆŠฝๅ‡บ -3. PDSใฎhex keyใซๅŒใ˜ใƒ—ใƒฌใƒ•ใ‚ฃใƒƒใ‚ฏใ‚นใ‚’้ฉ็”จ - -```sh -$ go install github.com/bluesky-social/indigo/cmd/goat@latest -``` - -```sh -$ goat account login -u syui.syui.ai -p $PASS --pds-host https://syu.is - -$ goat plc history did:plc:vzsvtbtbnwn22xjqhcu3vd6y -did:key:zQ3shZj81oA4A9CmUQgYUv97nFdd7m5qNaRMyG16XZixytTmQ - -$ goat plc update did:plc:vzsvtbtbnwn22xjqhcu3vd6y \ - --handle syui.syui.ai \ - --pds https://syu.is \ - --atproto-key did:key:zQ3shZj81oA4A9CmUQgYUv97nFdd7m5qNaRMyG16XZixytTmQ > plc_operation_syui.json - -# ใ‚‚ใ—ใƒŸใ‚นใฃใŸๆ™‚ใฏๅ‰ใฎๆ“ไฝœใ‚’็„กๅŠนๅŒ–ใ—ใฆๅ†ๅฎŸ่กŒ -$ goat plc update did:plc:vzsvtbtbnwn22xjqhcu3vd6y \ - --handle syui.syui.ai \ - --pds https://syu.is \ - --atproto-key did:key:zQ3shZj81oA4A9CmUQgYUv97nFdd7m5qNaRMyG16XZixytTmQ \ - --prev "bafyreifomvmymylntowv2mbyvg5i7wgv375757l574gevcs7qbysbqizk4" > plc_operation_syui_nullify.json -``` - -```sh -source base58_env/bin/activate - -python3 -c " -import base58 - -# ็”Ÿๆˆใ•ใ‚ŒใŸsecp256k1ใ‚ญใƒผใ‚’ๅˆ†ๆž -generated_secp256k1 = '${zXXX...}' -decoded = base58.b58decode(generated_secp256k1[1:]) # 'z'ใ‚’้™คใ - -print('Generated secp256k1 key analysis:') -print(' Total length:', len(decoded)) -print(' Full hex:', decoded.hex()) - -# 32ใƒใ‚คใƒˆใฎ้ตใƒ‡ใƒผใ‚ฟใ‚’้™คใ„ใŸใƒ—ใƒฌใƒ•ใ‚ฃใƒƒใ‚ฏใ‚นใ‚’ๆŠฝๅ‡บ -if len(decoded) > 32: - prefix = decoded[:-32] - key_data = decoded[-32:] - print(' Prefix hex:', prefix.hex()) - print(' Prefix length:', len(prefix)) - print(' Key data length:', len(key_data)) - - pds_rotation_hex = '${PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX}' - pds_rotation_bytes = bytes.fromhex(pds_rotation_hex) - - prefixed_rotation_key = prefix + pds_rotation_bytes - multibase_rotation_key = 'z' + base58.b58encode(prefixed_rotation_key).decode() - - print('\\nConverted PDS rotation key:') - print(' Multibase:', multibase_rotation_key) - -else: - print(' No prefix found, key is raw') -" - -deactivate -``` - -```sh -$ PDS_ROTATION_KEY=zXXX... - -$ goat plc sign --plc-signing-key "$PDS_ROTATION_KEY" plc_operation_syui.json > plc_signed_syui.json -$ goat plc submit --did did:plc:vzsvtbtbnwn22xjqhcu3vd6y plc_signed_syui.json -success - -$ goat plc history did:plc:vzsvtbtbnwn22xjqhcu3vd6y -``` - -## ๆ‰‹้ †ใ‚’ใŠใ•ใ‚‰ใ„ - -1. `plc_operation.json`ใ‚’ไฝœๆˆ -2. `plc_operation.json`ใจ`PDS_ROTATION_KEY`ใ‚’ไฝฟ็”จใ—ใ€`plc_signed.json`ใ‚’ไฝœๆˆ -3. `plc_signed.json`ใ‚’ไฝฟ็”จใ—ใ€plcใ‚’ๆ›ดๆ–ฐ - -## plcใ‚’็ขบ่ช - -```sh -did=did:plc:vzsvtbtbnwn22xjqhcu3vd6y -curl -sL "https://plc.directory/$did"|jq .alsoKnownAs -curl -sL "https://plc.syu.is/$did"|jq .alsoKnownAs -[ - "at://syui.syui.ai" -] -[ - "at://syui.syui.ai" -] -``` - diff --git a/my-blog/content/posts/2025-09-07-ps5-controller.md b/my-blog/content/posts/2025-09-07-ps5-controller.md deleted file mode 100644 index b9e2f8a..0000000 --- a/my-blog/content/posts/2025-09-07-ps5-controller.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: "ue5ใงdualsenseใ‚’ไฝฟใ†" -slug: "ps5-controller" -date: "2025-09-07" -tags: ["ue"] -draft: false ---- - -ps5-controllerใฏ`dualsense`ใจใ„ใ†ใ‚‰ใ—ใ„ใ€‚ue5ใงไฝฟใ†ใซใฏใ€ไปฅไธ‹ใฎpluginใ‚’ไฝฟใ„ใพใ™ใ€‚fabใ‹githubใฎreleaseใ‹ใ‚‰pluginใƒ•ใ‚ฉใƒซใƒ€ใซๅ…ฅใ‚Œใฆbuildใ™ใ‚‹ใ‹2ใคใฎๆ–นๆณ•ใŒใ‚ใ‚Šใพใ™ใ€‚ - -## dualsense plugin - -- [https://github.com/rafaelvaloto/WindowsDualsenseUnreal](https://github.com/rafaelvaloto/WindowsDualsenseUnreal) -- [https://github.com/rafaelvaloto/GamepadCoOp](https://github.com/rafaelvaloto/GamepadCoOp) - -![](/img/ue_ps5_controller_v0100.jpg) - -`v1.2.10`ใ‹ใ‚‰multiplayใ‚’ๆ„่ญ˜ใ—ใŸ`GamepadCoOp`ใจใฎ็ตฑๅˆใŒ่กŒใ‚ใ‚Œใพใ—ใŸใ€‚ - -ใ‚ณใƒณใƒˆใƒญใƒผใƒฉใƒผใฎใƒฉใ‚คใƒˆใ‚’ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผๅˆ‡ใ‚Šๆ›ฟใˆๆ™‚ใซๅค‰ๆ›ดใ™ใ‚‹ๅ‡ฆ็†ใ‚’ๅ…ฅใ‚Œใพใ—ใŸใ€‚ - - - -## dualsenseใฎๅˆ†่งฃ - -ๆœ€่ฟ‘ใ€ใƒ‰ใƒชใƒ•ใƒˆๅ•้กŒใŒ็™บ็”Ÿใ—ใฆใ„ใŸใ“ใจใ‚‚ใ‚ใ‚Šใ€ไฝ•ๅบฆใ‚‚ๅˆ†่งฃใ—ใฆใ„ใพใ—ใŸใ€‚ - -ใ‚ˆใฃใฆใ€ใ“ใฎใ‚ฟใ‚คใƒ—ใฎใ‚ณใƒณใƒˆใƒญใƒผใƒฉใƒผใชใ‚‰็ฐกๅ˜ใซไฟฎ็†ใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ—ใŸใ€‚ - -ไปŠๅพŒใ‚‚`dualsense`ใ‚’ไฝฟ็”จใ—ใฆใ„ใๅฏ่ƒฝๆ€งใฏ้ซ˜ใ„ใงใ™ใญใ€‚ - diff --git a/my-blog/content/posts/2025-09-10-comfyui.md b/my-blog/content/posts/2025-09-10-comfyui.md deleted file mode 100644 index 875d2e4..0000000 --- a/my-blog/content/posts/2025-09-10-comfyui.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -title: "comfyuiใงwan2.2ใ‚’่ฉฆใ™" -slug: "comfyui" -date: "2025-09-10" -tags: ["comfyui"] -draft: false ---- - -comfyuiใซwan2.2ใŒๆฅใฆใ„ใŸใฎใง่ฉฆใ—ใฆใฟใพใ—ใŸใ€‚wanใŒcomfyuiใฎๅ…ฌๅผใซๆŽก็”จใ•ใ‚Œใฆใ„ใ‚‹ใฎใงใ€ๅฐŽๅ…ฅใŒ็ฐกๅ˜ใซใชใฃใฆใ„ใพใ™ใ€‚ - - -ไปŠๅ›žใฏ็ˆ†้€ŸใซใชใฃใŸLoRAๆŽก็”จใงใ„ใใพใ™ใ€‚ใชใŠใ€็„กๅŠนๅŒ–ใƒŽใƒผใƒ‰ใ‚’ๅค–ใ™ใจใ‚ฏใ‚ชใƒชใƒ†ใ‚ฃ้‡่ฆ–ใฎ่จญๅฎšใซใชใ‚Šใพใ™ใ€‚ - -้–ขไฟ‚ใ‚ใ‚Šใพใ›ใ‚“ใŒใ€comfyuiๅ…ฌๅผใƒšใƒผใ‚ธใฎใ‚ณใƒกใƒณใƒˆใ‚ทใ‚นใƒ†ใƒ ใฏ[giscus/giscus](https://github.com/giscus/giscus)ใ‚’ไฝฟ็”จใ—ใฆใ„ใ‚‹ใ‚ˆใ†ใงใ™ใญใ€‚ - -# comfyui - -```sh -$ git clone https://github.com/comfyanonymous/ComfyUI -$ cd ComfyUI -$ winget install python.python.3.13 -$ pip uninstall torch torchaudio -$ pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu129 -$ pip install -r requirements.txt -$ python main.py -``` - -ใ‚‚ใ—venvใ‚’ไฝฟ็”จใ™ใ‚‹ๅ ดๅˆ - -```sh -$ python -m venv venv -$ venv\Scripts\activate -$ pip install -r requirements.txt -$ python main.py -``` - -## wan2.2 - -ๅŸบๆœฌ็š„ใซpromptใ‹ใ‚‰็”Ÿๆˆใ—ใ€bypassใ‚’ๅˆ‡ใ‚‹ใจ็”ปๅƒใ‚’ๅ‚็…งใงใใพใ™ใ€‚ - -workflowใ‚’downloadใ—ใฆcomfyuiใง้–‹ใใพใ™ใ€‚ - -```sh -# ComfyUI/user/default/workflows/ -$ curl -sLO https://raw.githubusercontent.com/Comfy-Org/workflow_templates/refs/heads/main/templates/video_wan2_2_5B_ti2v.json -``` - -ๅฟ…่ฆใชใ‚‚ใฎใฏๅ…ฌๅผใƒšใƒผใ‚ธใซใƒชใƒณใ‚ฏใŒใ‚ใ‚Šใพใ™ใ€‚ - -[https://docs.comfy.org/tutorials/video/wan/wan2_2](https://docs.comfy.org/tutorials/video/wan/wan2_2) - -```sh -ComfyUI/ -โ”œโ”€โ”€โ”€๐Ÿ“‚ models/ -โ”‚ โ”œโ”€โ”€โ”€๐Ÿ“‚ diffusion_models/ -โ”‚ โ”‚ โ””โ”€โ”€โ”€wan2.2_ti2v_5B_fp16.safetensors -โ”‚ โ”œโ”€โ”€โ”€๐Ÿ“‚ text_encoders/ -โ”‚ โ”‚ โ””โ”€โ”€โ”€ umt5_xxl_fp8_e4m3fn_scaled.safetensors -โ”‚ โ””โ”€โ”€โ”€๐Ÿ“‚ vae/ -โ”‚ โ””โ”€โ”€ wan2.2_vae.safetensors -``` - -![](/img/comfyui_wan22_0001.png) - - - -## wan2-2-fun-control - -ใ“ใ‚Œใฏใƒใƒผใ‚บใ‚’ๅ‹•็”ปใ‹ใ‚‰ไฝœๆˆใ—ใฆๅ‹•็”ปใ‚’ไฝœใ‚Šใพใ™ใ€‚ - -```sh -$ curl -sLO https://raw.githubusercontent.com/Comfy-Org/workflow_templates/refs/heads/main/templates/video_wan2_2_14B_fun_control.json -``` - - -[https://docs.comfy.org/tutorials/video/wan/wan2-2-fun-control](https://docs.comfy.org/tutorials/video/wan/wan2-2-fun-control) - -```sh -ComfyUI/ -โ”œโ”€โ”€โ”€๐Ÿ“‚ models/ -โ”‚ โ”œโ”€โ”€โ”€๐Ÿ“‚ diffusion_models/ -โ”‚ โ”‚ โ”œโ”€โ”€โ”€ wan2.2_fun_control_low_noise_14B_fp8_scaled.safetensors -โ”‚ โ”‚ โ””โ”€โ”€โ”€ wan2.2_fun_control_high_noise_14B_fp8_scaled.safetensors -โ”‚ โ”œโ”€โ”€โ”€๐Ÿ“‚ loras/ -โ”‚ โ”‚ โ”œโ”€โ”€โ”€ wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors -โ”‚ โ”‚ โ””โ”€โ”€โ”€ wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors -โ”‚ โ”œโ”€โ”€โ”€๐Ÿ“‚ text_encoders/ -โ”‚ โ”‚ โ””โ”€โ”€โ”€ umt5_xxl_fp8_e4m3fn_scaled.safetensors -โ”‚ โ””โ”€โ”€โ”€๐Ÿ“‚ vae/ -โ”‚ โ””โ”€โ”€ wan_2.1_vae.safetensors -``` - - -## wan2-2-fun-inp - -ใ“ใ‚Œใฏ็”ปๅƒใ‹ใ‚‰็”ปๅƒใ‚’ๅ‚่€ƒใซใ—ใฆๅ‹•็”ปใ‚’็”Ÿๆˆใ—ใพใ™ใ€‚ - -[https://docs.comfy.org/tutorials/video/wan/wan2-2-fun-inp](https://docs.comfy.org/tutorials/video/wan/wan2-2-fun-inp) - -```sh -$ curl -sLO https://raw.githubusercontent.com/Comfy-Org/workflow_templates/refs/heads/main/templates/video_wan2_2_14B_fun_inpaint.json -``` - -```sh -ComfyUI/ -โ”œโ”€โ”€โ”€๐Ÿ“‚ models/ -โ”‚ โ”œโ”€โ”€โ”€๐Ÿ“‚ diffusion_models/ -โ”‚ โ”‚ โ”œโ”€โ”€โ”€ wan2.2_fun_inpaint_high_noise_14B_fp8_scaled.safetensors -โ”‚ โ”‚ โ””โ”€โ”€โ”€ wan2.2_fun_inpaint_low_noise_14B_fp8_scaled.safetensors -โ”‚ โ”œโ”€โ”€โ”€๐Ÿ“‚ loras/ -โ”‚ โ”‚ โ”œโ”€โ”€โ”€ wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors -โ”‚ โ”‚ โ””โ”€โ”€โ”€ wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors -โ”‚ โ”œโ”€โ”€โ”€๐Ÿ“‚ text_encoders/ -โ”‚ โ”‚ โ””โ”€โ”€โ”€ umt5_xxl_fp8_e4m3fn_scaled.safetensors -โ”‚ โ””โ”€โ”€โ”€๐Ÿ“‚ vae/ -โ”‚ โ””โ”€โ”€ wan_2.1_vae.safetensors -``` - -## ใ‚ฒใƒผใƒ ใงๅ‹•ใ‹ใ—ใŸใปใ†ใŒใ„ใ„ - -ไปŠๅ›žใ€ใ‚ฒใƒผใƒ ใฎใ‚นใ‚ฏใ‚ทใƒงใ‚’ไฝฟใฃใฆๅ‹•็”ปใ‚’็”Ÿๆˆใ—ใฆใฟใพใ—ใŸใ€‚ - -ใ—ใ‹ใ—ใ€ใ‚ฒใƒผใƒ ใงๅ‹•ใ‹ใ—ใŸใปใ†ใŒใ‚ˆใปใฉๆ—ฉใ็ขบๅฎŸใงใ™ใ€‚ - diff --git a/my-blog/content/posts/2025-09-11-comfyui-nano-banana.md b/my-blog/content/posts/2025-09-11-comfyui-nano-banana.md deleted file mode 100644 index 47cc181..0000000 --- a/my-blog/content/posts/2025-09-11-comfyui-nano-banana.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: "comfyuiใงใƒ•ใ‚ฃใ‚ฎใƒฅใ‚ขๅŒ–ใ™ใ‚‹" -slug: "comfyui" -date: "2025-09-11" -tags: ["comfyui"] -draft: false ---- - -`gemini`ใงnano bananaใจใ„ใ†ใƒ•ใ‚ฃใ‚ฎใƒฅใ‚ขๅŒ–ใŒๆต่กŒใฃใฆใ„ใพใ™ใ€‚ไปŠๅ›žใฏใ€ใใ‚Œใ‚’`comfyui`ใงๅ†็พใ—ใฆใฟใ‚ˆใ†ใจๆ€ใ„ใพใ™ใ€‚ - -# comfyui - -```sh -$ git clone https://github.com/comfyanonymous/ComfyUI -$ cd ComfyUI -$ winget install python.python.3.13 -$ pip uninstall torch torchaudio -$ pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu129 -$ pip install -r requirements.txt -$ python main.py -``` - -ใ‚‚ใ—venvใ‚’ไฝฟ็”จใ™ใ‚‹ๅ ดๅˆ - -```sh -$ python -m venv venv -$ venv\Scripts\activate -$ pip install -r requirements.txt -$ python main.py -``` - -## flux-1-kontext-dev - -[https://docs.comfy.org/tutorials/flux/flux-1-kontext-dev](https://docs.comfy.org/tutorials/flux/flux-1-kontext-dev) - -ๅŸบๆœฌ็š„ใซcomfyuiใงไฝœๆˆใ—ใŸ็”ปๅƒใซใฏworkflowใŒไฟๅญ˜ใ•ใ‚Œใฆใ„ใพใ™ใ€‚ใงใ™ใ‹ใ‚‰ใ€็”ปๅƒใŒใ‚ใ‚Œใฐpromptใ‚„bypassใชใฉใ‚‚ๅซใ‚ใฆ็”Ÿๆˆๆƒ…ๅ ฑใŒใ‚ใ‹ใ‚Šใพใ™ใ€‚ๆƒ…ๅ ฑใŒๅ‰Š้™คใ•ใ‚Œใฆใ„ใชใ„้™ใ‚Šใฏๅ†็พใ™ใ‚‹ใ“ใจใŒๅฏ่ƒฝใงใ™ใ€‚ - -ไปŠๅ›žใฏใ€`flux-1-kontext-dev`ใ‚’ไฝฟ็”จใ—ใพใ™ใ€‚ - -```sh -$ curl -sLO https://raw.githubusercontent.com/Comfy-Org/example_workflows/main/flux/kontext/dev/flux_1_kontext_dev_basic.png -``` - -```sh -๐Ÿ“‚ ComfyUI/ -โ”œโ”€โ”€ ๐Ÿ“‚ models/ -โ”‚ โ”œโ”€โ”€ ๐Ÿ“‚ diffusion_models/ -โ”‚ โ”‚ โ””โ”€โ”€ flux1-dev-kontext_fp8_scaled.safetensors -โ”‚ โ”œโ”€โ”€ ๐Ÿ“‚ vae/ -โ”‚ โ”‚ โ””โ”€โ”€ ae.safetensor -โ”‚ โ””โ”€โ”€ ๐Ÿ“‚ text_encoders/ -โ”‚ โ”œโ”€โ”€ clip_l.safetensors -โ”‚ โ””โ”€โ”€ t5xxl_fp16.safetensors or t5xxl_fp8_e4m3fn_scaled.safetensors -``` - -[msg content="prompt: Convert to collectible figure style: detailed sculpting, premium paint job, professional product photography, studio lighting, pristine condition, commercial quality, toy photography aesthetic"] - -ไปฅไธ‹ใฏ`wan2.1`ใง็”Ÿๆˆใ—ใŸๆ™‚ใฎๅ‹•็”ปใ€‚ - -![](/img/comfyui_wan21_0001.webp) - -![](/img/comfyui_flex1_nano_banana_0001.png) - -ใงใใพใ—ใŸใ€‚ diff --git a/my-blog/content/posts/2025-09-18-ue-blender-model.md b/my-blog/content/posts/2025-09-18-ue-blender-model.md deleted file mode 100644 index 2101aa2..0000000 --- a/my-blog/content/posts/2025-09-18-ue-blender-model.md +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: "blenderใงไฝœใฃใŸใƒขใƒ‡ใƒซใ‚’ๆ”น่‰ฏใ—ใŸ" -slug: "ue-blender-model" -date: "2025-09-18" -tags: ["ue", "blender"] -draft: false ---- - -blenderใงไฝœใฃใŸใƒขใƒ‡ใƒซใฏใ€ueใงๅ‹•ใ‹ใ—ใฆใฟใ‚‹ใจใ€ใชใ‹ใชใ‹ๆ€ใฃใŸใจใŠใ‚Šใซๅ‹•ใ‹ใชใ„ใ“ใจใฏๅคšใ„ใงใ™ใ€‚ๅŽŸๅ› ใ‚‚ๅคš็จฎๅคšๆง˜ใงใ€ใจใฆใ‚‚ไธ€่จ€ใงใฏ่จ€ใ„่กจใ›ใชใ„ใ€‚ - -ไปŠใพใงๆฐ—ใซใชใฃใฆใ„ใŸใจใ“ใ‚ใฏไปฅไธ‹ใฎ2็‚นใงใ—ใŸใ€‚ - -1. ๆŒ‡ใŒใกใ‚ƒใ‚“ใจๅ‹•ใ‹ใชใ„ -2. ่กฃ่ฃ…ใฎใ™ใ‚ŠๆŠœใ‘ใŒๆฐ—ใซใชใ‚‹ - -## ๆŒ‡ใ‚’ไฟฎๆญฃใ™ใ‚‹ใซใฏueใ‹ใ‚‰blenderใธ - -blenderใงไฝœใฃใŸใƒขใƒ‡ใƒซใฏๆŒ‡ใŒใŽใ“ใกใชใ„ๅ‹•ใใงใ€่ค‡ๆ•ฐใฎ่ฆๅ› ใŒ้–ขไฟ‚ใ—ใฆใ„ใพใ™ใ€‚็‰นใซๅคงใใ„ใฎใŒๆ‰‹ๅ‹•ใงๅก—ใฃใฆใ„ใŸใ‚ฆใ‚งใ‚คใƒˆใƒšใ‚คใƒณใƒˆใ€‚ - -ใ—ใ‹ใ—ใ€ใ“ใ‚Œใ‚’ๅฎŒ็’งใซๅก—ใ‚Šใ€ใ‹ใคueใงๅ‹•ไฝœ็ขบ่ชใ™ใ‚‹ใฎใฏใ‚ˆใใ‚ใ‚Šใพใ›ใ‚“ใ€‚ใชใœใชใ‚‰ใ€blenderใจueใงๅ‹•ใใŒ็•ฐใชใ‚‹ใ‹ใ‚‰ใงใ™ใ€‚ใใ‚Œใ‚‚ๅ…จใ็•ฐใชใ‚‹ใ‚ใ‘ใงใฏใชใๅพฎๅฆ™ใซๅˆใ‚ใชใ„ใฎใงใ™ใ€‚ - -ใจใ„ใ†ใ“ใจใงใ€ueใงใพใšๆŒ‡ใฎๅ‹•ใใŒใกใ‚ƒใ‚“ใจใงใใฆใ„ใ‚‹ใƒขใƒ‡ใƒซใ‚’blenderใซๆŒใฃใฆใใฆใ€ๆ‰‹ใฎ้ƒจๅˆ†ใ‚’็งปๆคใ™ใ‚‹ใจใ„ใ†ใฎใŒไปŠๅ›žๆŽก็”จใ—ใŸๆ–นๆณ•ใงใ™ใ€‚ - -- o: `ue -> blender` -- x: `blender -> ue` - -![](/img/ue_blender_model_ai_v0701.png) - -![](/img/ue_blender_model_ai_v0702.png) - -ๅ‹•ใใ‚’่ฆ‹ใ‚‹ใฎใฏใ€vrm4uใฎ`RTG_UEFN_${name}`ใ‚’ไฝฟ็”จใ—ใพใ™ใ€‚ - -blenderใฎๆ“ไฝœๆ–นๆณ•ใงใ™ใ€‚ใƒใ‚คใƒณใƒˆใ ใ‘ๆ›ธใ„ใฆใŠใใพใ™ใ€‚ - -1. modelใ‚’2ใค่ชญใฟ่พผใ‚€ใ€‚aใจbใจใ™ใ‚‹ใ€‚ -2. bใฎboneใจbody(object)ใงใ„ใ‚‰ใชใ„้ƒจๅˆ†ใ‚’ๅ‰Š้™คใ™ใ‚‹ใ€‚ใ“ใ“ใงใฏๆ‰‹ใฎ้ƒจๅˆ†ใ ใ‘ๆฎ‹ใ™ใ€‚ key[x] -3. a, bใงๅคงไฝ“ใฎไฝ็ฝฎใ‚’ๅˆใ‚ใ›ใ‚‹ใ€‚ key[g, z] -4. bใฎboneใ‚’้ธๆŠž่‚ขใ€aใฎboneใ‚’้ธๆŠžใ—ใฆ็ตฑๅˆใ™ใ‚‹ใ€‚ key[C-j] -5. ใ‚ตใ‚คใƒ‰ใƒใƒผใฎใ‚ขใƒผใƒžใƒใƒฅใ‚ขใฎใจใ“ใ‚ใ‚’ใฟใฆใ€ๆ‰‹ใฎใƒœใƒผใƒณใ‚’่…•ใฎใƒœใƒผใƒณใซใ„ใ‚Œใ‚‹(ใ“ใ‚Œใฏใƒขใƒ‡ใƒซใซใ‚ˆใ‚‹)ใ€‚็‰นใซๆ‰‹ใŒใ‚ชใƒ•ใ‚ปใƒƒใƒˆ็ถญๆŒใงๆŒ‡ใซใคใ„ใฆใ„ใ‚‹ใ“ใจใŒ้‡่ฆใ€‚ key[C-p] -6. bใฎbody(object)ใ‚’้ธๆŠžใ—ใ€ใƒขใƒ‡ใ‚ฃใƒ•ใ‚กใ‚คใ‚ขใ‹ใ‚‰aใฎbodyใซใƒ‡ใƒผใ‚ฟ่ปข้€ใ™ใ‚‹ใ€‚ใƒ‡ใƒผใ‚ฟ่ปข้€ใงใฏใ€้ ‚็‚นใƒ‡ใƒผใ‚ฟใ€้ ‚็‚นใ‚ฐใƒซใƒผใƒ—ใ‚’้ธๆŠžใ€‚้ฉ็”จใ™ใ‚‹ใ€‚ -7. bใฎbodyใ‚’้ธๆŠžใ—ใ€aใฎbodyใ‚’้ธๆŠžใ—ใฆ็ตฑๅˆใ™ใ‚‹ใ€‚ key[C-j] -8. bodyใ‚’็ทจ้›†ใ—ใฆใ€ๆ‰‹ใจ่…•ใ‚’ใคใชใ’ใ‚‹ใ€‚ - -ใ‚ใจใฏใ€vrm exportใฎ้š›ใซๆŒ‡ใจใ‹ใฎใƒœใƒผใƒณใ‚’่‡ชๅ‹•ใงๅ…ฅใ‚Œใ‚Œใฐๅ‹•ใใจๆ€ใ„ใพใ™ใ€‚ - -็งใฎๅ ดๅˆใฏใ€ใ‚นใ‚ซใƒผใƒˆใซๅฟ…่ฆใชใƒœใƒผใƒณใ‚’่ฟฝๅŠ ใ—ใŸใ‚Šใ‚‚ใ—ใพใ—ใŸใ€‚ใ“ใ‚Œใฏueใงใฎๅ‹•ไฝœใ‚’ๆ„่ญ˜ใ—ใพใ—ใ‚‡ใ†ใ€‚ - -## ใ‚นใ‚ซใƒผใƒˆใจ่ถณใฎๅ‹•ใใ‚’้–ข้€ฃไป˜ใ‘ใ‚‹ - -่กฃ่ฃ…ใฏใ€`Spine`ไปฅไธ‹ใซใ‚ใ‚‹ใƒฏใƒณใƒ”ใƒผใ‚นใชใฎใงใ€ๅŽณๅฏ†ใซใฏใ‚นใ‚ซใƒผใƒˆใงใฏใ‚ใ‚Šใพใ›ใ‚“ใŒใ€ใ“ใ“ใงใฏใ‚นใ‚ซใƒผใƒˆใจใ„ใ†ใ“ใจใซใ—ใพใ™ใ€‚ - -ใ“ใฎใ‚นใ‚ซใƒผใƒˆใฏใ€3d-modelใงใฏ้žๅธธใซๅŽ„ไป‹ใชใ‚‚ใฎใงใ€่ถณใฎๅ‹•ใใซ่ฟฝๅพ“ใงใใšไฝ“ใซๅ…ฅใ‚Š่พผใ‚“ใงใ—ใพใ†ใฎใงใ™ใ€‚ - -ใ“ใ‚Œใ‚’่งฃๆถˆใ™ใ‚‹ใŸใ‚ใซใฏๆง˜ใ€…ใชๆ–นๆณ•ใŒใ‚ใ‚Šใ€ใŸใจใˆblenderใฎๆฉŸ่ƒฝใ‚’ไฝฟใฃใฆ่งฃๆถˆใ—ใฆใ‚‚ใ€ueใงใฏๅŠนๆžœใŒใ‚ใ‚Šใพใ›ใ‚“ใ€‚ใ‚ˆใฃใฆใ€ใ“ใกใ‚‰ใ‚‚ueใ‹ใ‚‰่งฃๆถˆใ™ใ‚‹ใฎใŒใƒ™ใ‚นใƒˆใงใ™ใ€‚ - -ไปŠๅ›žใ€ABPใซ`Look At`ใ‚’ไฝฟใ†ใ“ใจใง่งฃๆถˆใ—ใพใ—ใŸใ€‚ - -```md -# ABP -## Look At -- Bone to Modify: ใ‚นใ‚ซใƒผใƒˆๅ‰ใ€ไธญๅคฎ -- Look at Target: Spine (ไธญๅฟƒ) - -## Look At -- Bone to Modify: ใ‚นใ‚ซใƒผใƒˆๅ‰ใ€ๅทฆ -- Look at Target: LeftLeg (ๅทฆ่ถณ) - -## Look At -- Bone to Modify: ใ‚นใ‚ซใƒผใƒˆๅ‰ใ€ๅณ -- Look at Target: RightLeg (ๅณ่ถณ) -``` - -`Look at Location`ใฎไฝ็ฝฎใฏ่ชฟๆ•ดใ—ใฆใใ ใ•ใ„ใ€‚็งใฎๅ ดๅˆใฏ`0, 50, 0`ใงใ™ใ€‚ - - - -ๅฎŒ็’งใงใฏใชใ„ใ‘ใฉใ€ใ“ใ‚Œใงใ‚‚ใ‹ใชใ‚Šๆ”น่‰ฏใ•ใ‚ŒใŸใปใ†ใ€‚ - -## ๅฎŸ่ทตๆŠ•ๅ…ฅ - -### unique skillใฎใƒ‡ใ‚ถใ‚คใƒณใ‚’่€ƒใˆใ‚‹ - -ใพใšใ€ใ‚ขใ‚คใฎunique skill(ใƒฆใƒ‹ใƒผใ‚ฏใ‚นใ‚ญใƒซ)ใฎใƒ‡ใ‚ถใ‚คใƒณใ‚’่€ƒใˆใพใ—ใŸใ€‚ - -1. ใ‚ซใƒกใƒฉใƒฏใƒผใ‚ฏใฏๆญฃ้ขใซ็งปๅ‹• -2. ใ‚นใƒญใƒผๅ†็”Ÿใ‚’้–‹ๅง‹ -3. ๅฟ่ก“ใฎใ‚ˆใ†ใชใƒขใƒผใ‚ทใƒงใƒณ -4. ใ‚ซใƒกใƒฉใ‚’้€šๅธธใซๆˆปใ™ -5. ๅฑžๆ€งใฎ็ฏ„ๅ›ฒใƒ€ใƒกใƒผใ‚ธ - -### tatoolsใ‚’ไฝฟใฃใฆๅฟ่ก“ใƒขใƒผใ‚ทใƒงใƒณใ‚’ไฝœใ‚‹ - -[tatools](https://www.fab.com/ja/listings/a5d3b60d-b886-4564-bf6d-15d46a8d27fe)ใ‚’ไฝฟใ„ใพใ™ใ€‚ - -[https://github.com/threepeatgames/ThreepeatAnimTools](https://github.com/threepeatgames/ThreepeatAnimTools) - -ไฝฟใ„ๆ–นใฏ็ฐกๅ˜ใงใ™ใŒใ€ๅ‹•็”ปใŒๅˆ†ใ‹ใ‚Šใฅใ‚‰ใ„ใฎใงใ€ใƒใ‚คใƒณใƒˆใ ใ‘่งฃ่ชฌใ—ใพใ™ใ€‚pluginใฎ่ตทๅ‹•ใ€ๆ—ขๅญ˜ใฎใ‚ขใƒ‹ใƒกใƒผใ‚ทใƒงใƒณใฎไฟฎๆญฃใ€ไฟๅญ˜ใงใ™ใ€‚ - -1. pluginใฎ่ตทๅ‹•ใฏใ€`/Engine/Plugins/ThreepeatAnimTools/Picker/ThreepeatAnimTools_CR_Picker`ใ‚’่ตทๅ‹•ใ—ใพใ™ใ€‚ใ‚ขใ‚ฆใƒˆใƒฉใ‚คใƒŠใƒผใซใงใ‚‚ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚’่ฟฝๅŠ ใ—ใพใ—ใ‚‡ใ†ใ€‚ -2. ไฟฎๆญฃใ—ใŸใ„ใ‚ขใƒ‹ใƒกใƒผใ‚ทใƒงใƒณ(ใ‚ขใƒ‹ใƒกใ‚ทใƒผใ‚ฑใƒณใ‚น)ใ‚’้–‹ใ„ใฆใ€`ใ‚ทใƒผใ‚ฑใƒณใ‚ตใง็ทจ้›† -> ใ‚ณใƒณใƒˆใƒญใƒผใƒซใƒชใ‚ฐใซใƒ™ใ‚คใ‚ฏ -> CR_UEFNMannyTatoolsRig`ใ—ใพใ™ใ€‚ -3. ใ“ใ‚Œใงlevel(map)ไธŠใงใƒฌใƒ™ใƒซใ‚ทใƒผใ‚ฑใƒณใ‚นใ‚’้–‹ใ‘ใพใ™ใ€‚ -4. ใ“ใ“ใ‹ใ‚‰ใŒไฟฎๆญฃใงใ™ใŒใ€ใพใšใ€ไพ‹ใˆใฐใ€่…•ใ‚’้ธๆŠžใ—ใฆๅ‘ใใ‚’ๅค‰ใˆใŸใจใ—ใพใ—ใ‚‡ใ†ใ€‚ใ“ใ‚Œใ ใ‘ใงใฏไฟๅญ˜ใ•ใ‚Œใพใ›ใ‚“ใ€‚ใ‚‚ใจใซๆˆปใฃใฆใ—ใพใ„ใพใ™ใ€‚ใ“ใ“ใงใ€(1)ใ‚ทใƒผใ‚ฑใƒณใ‚ตใฎไธ‹ใซใ‚ใ‚‹ใ‚ขใƒ‹ใƒกใƒผใ‚ทใƒงใƒณใ‚’ๅ‰Š้™คใ—ใ€(2)้ธๆŠžใ—ใฆใ„ใ‚‹้ƒจไฝใฎใ™ในใฆใฎใ‚ณใƒณใƒžใ‚’ๅ‰Š้™คใ—ใพใ™ใ€‚ๅ†็”Ÿใ—ใฆใฟใ‚‹ใจ็ทจ้›†ใ—ใŸใจใŠใ‚Šใซใชใ‚Šใพใ™ใ€‚ -5. ไฟๅญ˜ใฏใ€ใ‚ทใƒผใ‚ฑใƒณใ‚ตใฎใƒกใƒ‹ใƒฅใƒผใƒใƒผใซใ‚ใ‚‹ไฟๅญ˜ใƒœใ‚ฟใƒณ(็พๅœจใฎใ‚ทใƒผใ‚ฑใƒณใ‚นใจใ‚ตใƒ–ใ‚ทใƒผใ‚ฑใƒณใ‚นใ‚’ไฟๅญ˜)ใ‚’ๆŠผใ—ใพใ™ใ€‚ใ‚‚ใจใฎใ‚ขใƒ‹ใƒกใƒผใ‚ทใƒงใƒณใ‚’้–‹ใใจๅๆ˜ ใ•ใ‚Œใฆใ„ใพใ™ใ€‚ - -![](https://ue-book.syui.ai/img/0016.png) - -### ๅฎŸๆˆฆๅ‹•็”ป - - - diff --git a/my-blog/content/posts/2025-09-22-ue-mac.md b/my-blog/content/posts/2025-09-22-ue-mac.md deleted file mode 100644 index bc50ae5..0000000 --- a/my-blog/content/posts/2025-09-22-ue-mac.md +++ /dev/null @@ -1,401 +0,0 @@ ---- -title: "ue + vrm4u + mac/ios" -slug: "ue-mac" -date: "2025-09-22" -tags: ["ue", "mac"] -draft: false ---- - -# ue mac/ios support - -- ue 5.6.1 -- mac 26 -- windows 11 - -## ue for mac - -็พๆ™‚็‚นใงใฎxcode26ใซใฏๅฏพๅฟœใ—ใฆใ„ใพใ›ใ‚“ใ€‚ueใ‚’่ตทๅ‹•ใ™ใ‚‹้š›ใฏxcodeใ‚’ๅˆ‡ใ‚Šๆ›ฟใˆใพใ™ใ€‚ใใ†ใงใฏใชใ„ใจbuild optionใŒๆฉŸ่ƒฝใ—ใพใ›ใ‚“ใ€‚(ใ‚ฏใ‚จใƒชไธญใซใชใ‚‹) - -appleใฎๆ–น้‡ใง่ฃฝๅ“ใฎversionใฏๅนดๅทใซใชใ‚Šใพใ—ใŸใ€‚ - -> ex: mac26, ios26 - -```sh -xcode-ue () { - disk=hdd - case $1 in - (u | ue) d=/Volumes/${disk}/Xcode.app/Contents/Developer ;; - (*) d=/Applications/Xcode.app/Contents/Developer ;; - esac - sudo xcode-select --reset - sudo xcode-select --switch $d -} -``` - -ใ“ใ“ใงใฏใ€`/Volumes/${disk}/Xcode.app`ใ‚’xocde16ใจใ—ใพใ™ใ€‚ - -buildใ™ใ‚‹ใจ`/$Project/Mac/${Project}.xcarchive`ใŒใงใใพใ™ใ€‚ - -```sh -# Finderใงใ‚ขใƒผใ‚ซใ‚คใƒ–ใ‚’ๅณใ‚ฏใƒชใƒƒใ‚ฏ โ†’ "Show in Finder" -# .xcarchive ใ‚’ๅณใ‚ฏใƒชใƒƒใ‚ฏ โ†’ "Show Package Contents" -# ./Products/Applications/ai.app ใ‚’ใƒ€ใƒ–ใƒซใ‚ฏใƒชใƒƒใ‚ฏ -``` - -```sh -# ใ‚ฟใƒผใƒŸใƒŠใƒซใงTeam IDใ‚’็ขบ่ช -$ security find-identity -v -p codesigning -``` - -## ue for linux - -linux็‰ˆใ‚‚buildใ™ใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚ - -- steam osใฏใŸใ—ใ‹linuxใ ใฃใŸใฏใš -- ใ‚ฒใƒผใƒ ใจpixelstreamingใ‚’linux serverใงๅ‹•ใ‹ใ›ใ‚Œใฐๆฅฝ - -[https://dev.epicgames.com/documentation/ja-jp/unreal-engine/linux-development-requirements-for-unreal-engine](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/linux-development-requirements-for-unreal-engine) - -ๅฟ…่ฆใชใ‚‚ใฎใ‚’downloadใ—ใฆใ€windowsไธŠใง็’ฐๅขƒใ‚’ๆ•ดใˆใพใ™ใ€‚`clang 18.1.0` - -ue editorใ‚’้–‹ใ„ใฆใƒกใƒ‹ใƒฅใƒผใฎ`tool -> c++`ใงไฝ•ใ‹ใ‚’ไฝœใ‚Šใพใ™ใ€‚ใ™ใ‚‹ใจใ€`.sln`ใŒproject rootใซใงใใพใ™ใ€‚ใงใใชใ‘ใ‚Œใฐใ€`.uproject`ใ‚’ๅณใ‚ฏใƒชใƒƒใ‚ฏใง`.sln`ใ‚’ไฝœใ‚Šใพใ™ใ€‚ - -epic launcherใงue installerใฎoption:linuxใ‚’ๅ†ใณๆœ‰ๅŠนใซใ—ใพใ™ใ€‚ - -`.sln`ใ‚’้–‹ใ„ใฆbuildใซ`linux`ใ‚’้ธๆŠžใ—ใ€ๅณใƒใƒผใฎMyProject(Airse)ใ‚’ๅณใ‚ฏใƒชใƒƒใ‚ฏใงbuildใ—ใพใ™ใ€‚pluginใชใฉใŒๅฏพๅฟœใ—ใฆใ„ใชใ„ใจใใฏ`.uproject`ใ‚’้–‹ใ„ใฆ`false`ใซๅค‰ๆ›ดใ—ใพใ™ใ€‚ๅฏพๅฟœใ—ใฆใ„ใ‚‹ๅ ดๅˆใ‚‚build errใซใชใ‚‹ใ“ใจใŒใ‚ใ‚Šใพใ™ใ€‚ - -`wsl ubuntu`ใชใฉใ‚‚ๅฟ…่ฆใซใชใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใŒใ€ๆƒ…ๅ ฑใซใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ - -## vrm4u for mac - -ใพใšc++ใฎprojectใ‚’ueใงไฝœๆˆใ—ใพใ™ใ€‚ - -`libassimp.a`ใ‚’็”Ÿๆˆใ—ใพใ™ใ€‚ - -[https://github.com/ruyo/assimp](https://github.com/ruyo/assimp) - -ใ“ใ‚Œใ‚’`/Plugins/VRM4U/ThirdParty/assimp/lib/Mac/libassimp.a`ใซ็ฝฎใ„ใฆใ€projectใง้–‹ใใพใ™ใ€‚pluginใŒbuildใ•ใ‚Œใพใ™ใŒใ€`/Plugins/VRM4U/Binaries/Mac/*`ใŒ็”Ÿๆˆใ•ใ‚Œใ€ใ“ใ‚Œใ‚’ไฝฟใ†ใ“ใจใซใชใ‚Šใพใ™ใ€‚ - -```sh -/Plugins/VRM4U/ -โ”œโ”€โ”€ Binaries -โ”‚ย ย  โ”œโ”€โ”€ Mac -โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ UnrealEditor-VRM4U.dylib -โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ UnrealEditor-VRM4UCapture.dylib -โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ UnrealEditor-VRM4UCaptureEditor.dylib -โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ UnrealEditor-VRM4UEditor.dylib -โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ UnrealEditor-VRM4UImporter.dylib -โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ UnrealEditor-VRM4ULoader.dylib -โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ UnrealEditor-VRM4UMisc.dylib -โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ UnrealEditor-VRM4URender.dylib -โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ UnrealEditor.modules -โ”œโ”€โ”€ ThirdParty -โ”‚ย ย  โ”œโ”€โ”€ assimp -โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ lib -โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ Mac/libassimp.a #ใ“ใฎใƒ•ใ‚กใ‚คใƒซ -โ””โ”€โ”€ VRM4U.uplugin -``` - -ไป–ใฎprojectใงๅˆฉ็”จใ™ใ‚‹้š›ใฏ`/Binaries`, `/ThirdParty`ใ‚’copyใ™ใ‚Œใฐใ„ใ„ใฎใงใ€ๅ–ใฃใฆใŠใ„ใฆใใ ใ•ใ„ใ€‚vrm4uใŒๆ›ดๆ–ฐใ•ใ‚ŒใŸใจใใฏๅ†ใณprojectใงbuildใ—ใŸใปใ†ใŒใ„ใ„ใงใ™ใญใ€‚ - -## ue for git - -mac/iosใงใ‚‚buildใงใใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹ใ“ใจใ€ใใ†ใ„ใฃใŸprojectใ‚’ไฝœๆˆใ™ใ‚‹ใ“ใจใ‚’็›ฎๆŒ‡ใ—ใพใ™ใ€‚ - -ๆœ€็ต‚็š„ใซiosใงใ‚‚ใƒ—ใƒฌใ‚คใงใใ‚‹ใ‚ฒใƒผใƒ ใ‚’ไฝœใ‚ŠใŸใ„ใชใจๆ€ใฃใฆใ„ใฆใ€ใ“ใ‚Œใฏๅ˜็ด”ใชใ‚ซใƒผใƒ‰ใ‚’้›†ใ‚ใ€ใ‚ญใƒฃใƒฉใ‚’ๅผทๅŒ–ใ™ใ‚‹ใ‚ฒใƒผใƒ ใซใ—ใ‚ˆใ†ใจ่€ƒใˆใฆใ„ใพใ™ใ€‚ - -mac/iosใฏ่ปฝ้‡ใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใจใ—ใฆๅฟ…่ฆๆœ€ๅฐ้™ใฎๆง‹ๆˆใงไฝœใ‚‹ไบˆๅฎšใงใ™ใ€‚็‰นใซ้‡ใ„world systemใ‚’ๅˆ†้›ขใ€็ตฑๅˆใŒ็ฐกๅ˜ใซใงใใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹ไบˆๅฎšใงใ™ใ€‚ - -ใใ“ใงใ€winใซใฏrsyncใŒใ‚ใ‚Šใพใ›ใ‚“ใฎใงใ€gitใ‚’ไฝฟ็”จใ™ใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚ - -```sh -$ winget install git.git -$ cd ${project} -$ git pull -``` - -็ฝฒๅใ‚‚ๆฉŸ่ƒฝใ•ใ›ใฆใŠใใŸใ„ใฎใงใ€gpgใ‚’ไฝฟใ„ใพใ™ใ€‚commit, pushใ™ใ‚‹ใจ`verify`ใŒไป˜ใใ‚„ใคใงใ™ใ€‚ - -```sh -$ winget install gnupg.gnupg -$ which gpg -$ git config --global gpg.program "C:\Program Files (x86)\gnupg\bin\gpg.exe" -``` - -็พๅœจไฝฟใฃใฆใ„ใ‚‹terminalใฏไฝœๆˆ(ใƒ‘ใ‚นใƒ•ใƒฌใƒผใ‚บ)ใŒๅ‹•ไฝœใ—ใชใ„ใ‚ˆใ†ใงใ™ใ€‚ใ—ใŸใŒใฃใฆใ€mac, linuxใงไฝœๆˆใ—ใฆimportใ—ใพใ™ใ€‚ - -```sh -$ gpg --full-generate-key -XXX -$ id=XXX -$ gpg --export-secret-keys ${id} > ~/gpg-key-win.asc ---- -$ gpg --import C:\Users\${USER}\gpg-key-win.asc -$ rm C:\Users\${USER}\gpg-key-win.asc -$ gpg --edit-key ${id} -trust -5 -quit -``` - -ไฝœๆˆใ—ใŸkeyใฏwinใงimportใ—ใŸๅพŒใฏmac, linuxใ‹ใ‚‰ๅ‰Š้™คใ—ใŸใปใ†ใŒใ„ใ„ใ‹ใ‚‚ใ€‚ใ‚ณใƒžใƒณใƒ‰ใฏๆ›ธใใพใ›ใ‚“ใ€‚ - -ใ“ใ‚Œใ‚’git-serverใซ็™ป้Œฒใ—ใฆใŠใ‘ใฐใ„ใ„ใงใ—ใ‚‡ใ†ใ€‚ - -```sh -$ gpg --armor --export ${id} -``` - -ใ‚ใจใ€`~/.gitconfig`ใ‚‚ๆ›ดๆ–ฐใ—ใฆใŠใใพใ™ใ€‚ - -```sh -$ git config --global user.signingkey ${id} -$ git config --global commit.gpgsign true -``` - -```sh -# ๅ†่ตทๅ‹• -$ gpgconf --kill gpg-agent -$ gpg-connect-agent /bye -``` - -# Airse - -ใ‚ฒใƒผใƒ ใฎใ‚ฟใ‚คใƒˆใƒซใฏ`Airse`ใซๆฑบใพใ‚Šใพใ—ใŸใ€‚ใพใ ๆฑบใพใฃใฆใ„ใชใ‹ใฃใŸใฎใ‹ใจใ„ใ†ใจใ€ๆฑบใพใฃใฆใ„ใพใ›ใ‚“ใงใ—ใŸใ€‚ไปฎๅใงไฝœใฃใฆใใพใ—ใŸใŒใ€ใ“ใ‚Œใ‚’ๆฉŸใซๆ นๆœฌ็š„ใช้ƒจๅˆ†ใ‚’่ฆ‹็›ดใ—ใพใ—ใŸใ€‚ - -- ai + verse -- [A]irse = `unrealengine` naming rules - -## rse - -RSE = [R]elativistic [S]tellar [E]volution - -> ja: ็›ธๅฏพ่ซ–็š„ๆ’ๆ˜Ÿ้€ฒๅŒ– - -## name rule - -- app, name, project = Airse -- repo, dir = `ai/rse` -- id = `ai.syui.rse` - -file, variable, function, etc. follow the following name rules. - -1. use `_` to separate characters after abbreviations such as `CBP`. -2. use `_` to separate characters before numbers. -3. use capital letters for all other names, priority: `ue > repo` - -ex: `CBP_CharacterAiSkill_1` - -## game system - -`[ai, yui, at, world]` - -- AUTHOR = Syui -- PROJECT = Airse - -```sh -# example -/Content/${AUTHOR}/${PROJECT}/ -โ”œโ”€โ”€ World/ # world system -โ”‚ โ”œโ”€โ”€ Origin/ # origin system (dream system) -โ”‚ โ””โ”€โ”€ BGM/ # bgm system -โ”œโ”€โ”€ Yui/ # yui system -โ”‚ โ”œโ”€โ”€ Character/ # character system -โ”‚ โ”œโ”€โ”€ Enemy/ # enemy system -โ”‚ โ”œโ”€โ”€ Evolution/ # e system (evo system) -โ”‚ โ”œโ”€โ”€ Voice/ # voice system -โ”‚ โ””โ”€โ”€ Live/ # v system (live system) -โ”œโ”€โ”€ AI/ # ai system -โ”‚ โ”œโ”€โ”€ Action/ # action system -โ”‚ โ””โ”€โ”€ Status/ # status system -โ””โ”€โ”€ AT/ # at system - โ”œโ”€โ”€ Item/ # item system - โ”œโ”€โ”€ Card/ # card system - โ””โ”€โ”€ Save/ # save system -``` - -## bad ex - -1. `ai/airse` = `[ai] x 2` -2. `syui/ai/rse` = `priority < ue` - -```md -[fix] -1. ai/airse -> ai/rse -2. syui/ai/rse -> Syui/Airse -``` - -## version - -ไปŠใพใงgame systemใฎversionใงใ‚„ใฃใฆใใพใ—ใŸใ€‚game systemใฎversionใฏใ‚ขใ‚คใฎใƒขใƒ‡ใƒซใฎๅค‰ๅŒ–ใงๆฑบๅฎšใ•ใ‚Œใฆใใพใ—ใŸใ€‚ - -ใ—ใ‹ใ—ใ€ue versionใŒใ‚ใ‹ใฃใŸใปใ†ใŒใ„ใ„ใฎใงใ€ไปฅไธ‹ใฎๅฝขๅผใซๅค‰ๆ›ดใ—ใพใ™ใ€‚ - -- version: `5.7.0.6.11` - -```sh -[ue] [system] [fix] -5.7.0.6.11 - -{ - "version": "5.7.0.6.11", - { - "ue": "5.7.0", - "system": "6", - "fix": "11" - } -} -``` - -# ้–‹็™บใฎๆ–นๅ‘ๆ€ง - -่€ƒใˆใซๅค‰ๅŒ–ใŒใ‚ใฃใŸใฎใงใ€ใŠไผใˆใ—ใพใ™ใ€‚ๅคงใใชใ‚‚ใฎใฏไปฅไธ‹ใฎ2ใคใงใ™ใ€‚ - -1. ใ‚ฒใƒผใƒ ใฎๅฎŒๆˆใ‚’็›ฎๆŒ‡ใ™ใŒใ€ใกใ‚ƒใ‚“ใจใ—ใŸใ‚ทใ‚นใƒ†ใƒ ใ‚’ไฝœใ‚‹ใ“ใจใ‚‚็›ฎๆŒ‡ใ™ -2. ๅฎŒ็’งใซ่‡ชไฟกใŒใ‚ใ‚‹ใ‚‚ใฎใงใ‚ฒใƒผใƒ ใ‚’ไฝœใ‚‹ - -## ใกใ‚ƒใ‚“ใจใ—ใŸใ‚ทใ‚นใƒ†ใƒ ใ‚’ไฝœใ‚‹ - -ใ‚ฒใƒผใƒ ใฎๅฎŒๆˆใ‚’็›ฎๆŒ‡ใ—ใฆใ€่‰ฒใ€…ใจ่€ƒใˆใ‚„ใฃใฆใใพใ—ใŸใŒใ€ใกใ‚ƒใ‚“ใจใ—ใŸใ‚ทใ‚นใƒ†ใƒ ใ‚’ไฝœใ‚‹ใ“ใจใ‚’ๅ„ชๅ…ˆใ—ใŸใปใ†ใŒใ„ใ„ใจ่€ƒใˆใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ—ใŸใ€‚ - -ใจใ„ใ†ใฎใ‚‚ใ€ใกใ‚ƒใ‚“ใจใ—ใŸใ‚ทใ‚นใƒ†ใƒ ใ‚’ไฝœใฃใฆใŠใ‘ใฐใ€ใใ‚Œใ‚’็ต„ใฟๅˆใ‚ใ›ใ‚‹ใ ใ‘ใงใ„ใ‚ใ‚“ใชใ‚ฒใƒผใƒ ใ‚’ไฝœใ‚Œใ‚‹ใ‹ใ‚‰ใงใ™ใ€‚ - -ใ‚ฒใƒผใƒ ใ‚’ๆง‹ๆˆใ™ใ‚‹่ฆ็ด ใ€ใใฎๅŸบๆœฌใจใ„ใ†ใฎใฏๆฑบใพใฃใฆใ„ใฆใ€ใ‚ทใ‚นใƒ†ใƒ ใ‚‚ๆฑบใพใฃใฆใ„ใพใ™ใ€‚ไพ‹ใˆใฐใ€ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผๆ“ไฝœใ€‚ใใ‚Œใ•ใˆๆœฌๅฝ“ใซใƒฌใƒ™ใƒซใฎ้ซ˜ใ„ใ‚ทใ‚นใƒ†ใƒ ใ‚’่‡ชๅˆ†ใงไฝœใ‚Œใ‚‹ใชใ‚‰ใ€่‰ฒใ€…ใชใ‚ฒใƒผใƒ ใซๅฟœ็”จใงใใพใ™ใ‚ˆใญใ€‚ - -ใ‚ฒใƒผใƒ ใ‚’ๅฎŒๆˆใ•ใ›ใ‚‰ใ‚Œใ‚‹ใ“ใจใฏ็ด ๆ™ดใ‚‰ใ—ใ„ใ“ใจใงใ™ใ€‚ - -ใ—ใ‹ใ—ใ€ใ‚ฒใƒผใƒ ๅˆถไฝœใ‚’ใ‚„ใ‚ใฆใ—ใพใ†ใจใใฏใฉใ‚“ใชใจใใงใ—ใ‚‡ใ†ใ€‚ใ‚ฒใƒผใƒ ใ‚’ๅฎŒๆˆใ•ใ›ใ‚‹ใฎใฏๆœฌๅฝ“ใซๅคงๅค‰ใงใ€ใใ“ใซๅˆฐ้”ใงใใ‚‹ไบบใฏๅฐ‘ใชใ„ใฎใงใ™ใŒใ€ใ—ใ‹ใ—ใ€ๅˆฐ้”ใงใใŸไบบใ‚‚ใ€ใใ“ใงใ‚„ใ‚ใฆใ—ใพใ†ไบบใŒๅคšใ„ใ‚“ใ˜ใ‚ƒใชใ„ใงใ—ใ‚‡ใ†ใ‹ใ€‚ - -็ถšใ‘ใ‚‰ใ‚Œใ‚‹ไบบใฏใ”ใๅƒ…ใ‹ใงใ€ๅคงใใช็†็”ฑใฏ2ใคใ‚ใ‚‹ใจๆ€ใฃใฆใ„ใพใ™ใ€‚ - -ไธ€ใคใฏๆˆๅŠŸใ—ใชใ‹ใฃใŸใ“ใจใ€‚็ถšใ‘ใ‚‹ใ ใ‘ใฎใƒกใƒชใƒƒใƒˆใ‚’ๆ„Ÿใ˜ใ‚‰ใ‚Œใชใ‹ใฃใŸใ“ใจใ ใจๆ€ใ„ใพใ™ใ€‚ - -2ใค็›ฎใฏใ€ไฝœใฃใฆใใŸใ‚‚ใฎใŒใฉใ†ใ—ใ‚ˆใ†ใ‚‚ใชใๅ†ๅˆฉ็”จใงใใชใ„็Šถๆ…‹ใซใ‚ใ‚‹ใ“ใจใ ใจๆ€ใ„ใพใ™ใ€‚ไพ‹ใˆใฐใ€ไฝœใฃใฆใใŸใ‚‚ใฎใŒใ‚ทใ‚นใƒ†ใƒ ๅŒ–ใ•ใ‚ŒใฆใŠใ‚‰ใšใ€ไป–ใฎใ‚ฒใƒผใƒ ใ‚’ไฝœใ‚ใ†ใจใ—ใŸใจใใซๅˆฉ็”จใงใใชใ„ๅฝขใ€ใ”ใกใ‚ƒใ”ใกใ‚ƒใง่‡ชๅˆ†ใซใ‚‚ๆŠŠๆกใงใใšใ€ไฝฟใ„ๅ›žใ›ใชใ„ใ€ใ‚ใ‚‹ใ„ใฏๅˆฅใฎใ‚ฒใƒผใƒ ใซ็ตฑๅˆใงใใชใ„็Šถๆ…‹ใงใ‚ใ‚‹ใ“ใจใ€‚ - -ใใ†ใงใชใ‘ใ‚Œใฐใ€ไป–ใฎใ‚ขใ‚คใƒ‡ใ‚ขใ‚’ใ™ใใซ่ฉฆใ—ใฆใฟใ‚ˆใ†ใจใชใ‚Šใ‚„ใ™ใ„ใ€ใ‚ฒใƒผใƒ ้–‹็™บใฎใƒใƒผใƒ‰ใƒซใฏไฝŽใใชใฃใฆใ„ใ‚‹ใฏใšใงใ™ใ€‚ใซใ‚‚้–ขใ‚ใ‚‰ใšใ€ใกใ‚‡ใฃใจใ‚„ใฃใฆใ™ใ่พžใ‚ใฆใ—ใพใ†ไบบใŒใ„ใพใ™ใ€‚ - -ใใ‚Œใฏใชใœใ‹ใจใ„ใ†ใจใ€ไฝœใฃใฆใใŸใ‚‚ใฎใŒใ‚ดใƒใƒฃใ‚ดใƒใƒฃใงไฝฟใ„็‰ฉใซใชใ‚‰ใชใ‹ใฃใŸใจใใ˜ใ‚ƒใชใ„ใ‹ใจๆ€ใ„ใพใ™ใ€‚ใ‚‚ใกใ‚ใ‚“ใ€ๆœฌไบบใฎ็†ฑๆ„ใจใ‹็ถ™็ถšๆ€งใจใ‹ๆ„ๆ€ใจใ‹ใใ†ใ„ใฃใŸใ‚‚ใฎใ‚‚ใ‚ใ‚Šใพใ™ใ€‚ใงใ‚‚ใ€ๅฟƒใŒๆŠ˜ใ‚Œใใ†ใชๆ™‚ใซใ‚‚ใ‚ณใƒณใƒˆใƒญใƒผใƒซๅฏ่ƒฝใช็’ฐๅขƒ่ฆๅ› ใŒใ‚ใ‚‹ใฏใšใงใ€ใใ†ใ—ใŸ็’ฐๅขƒใ‚’ๆง‹็ฏ‰ใ™ใ‚‹่ƒฝๅŠ›ใ‚‚้‡่ฆใชใฎใงใฏใชใ„ใ‹ใจๆ€ใ†ใฎใงใ™ใ€‚ๅ‘จใ‚Šใซใกใ‚ƒใ‚“ใจใ—ใŸใ‚ทใ‚นใƒ†ใƒ ใŒใŸใใ•ใ‚“ใ‚ใ‚‹ใ€ใใ‚“ใช็Šถๆ…‹ใ‚’ไฝœใ‚‹ใ€ใจใ„ใ†ใ“ใจใ€‚ใใ†ใ„ใ†ใฎใ‚’็›ฎๆŒ‡ใ—ใฆใ„ใใŸใ„ใจๆ€ใ„ใ€ใกใ‚ƒใ‚“ใจใ—ใŸใ‚ทใ‚นใƒ†ใƒ ใ‚’ไฝœใ‚‹ใ“ใจใ‚‚ๅ„ชๅ…ˆ็š„ใซ่€ƒใˆๅง‹ใ‚ใพใ—ใŸใ€‚ - -## ่‡ชไฟกใŒใ‚ใ‚‹ใ‚‚ใฎใงใ‚ฒใƒผใƒ ใ‚’ๆง‹็ฏ‰ใ™ใ‚‹ - -ใ‚คใƒณใƒ‡ใ‚ฃใƒผใ‚บใ‚ฒใƒผใƒ ใ€็‰นใซ3dใฏๆœฌๅฝ“ใซ้›ฃใ—ใ„ใ€‚็งใฎใ‚ฒใƒผใƒ ้–‹็™บใฎๆ–น้‡ใฏใ€ๅฐ‘ใ—ใšใคๆฑบใพใฃใฆใใฆใ€ๆณจๆ„ใ—ใชใ‘ใ‚Œใฐใชใ‚‰ใชใ„ใ“ใจใ‚‚ใ‚ใ‹ใฃใฆใใพใ—ใŸใ€‚ - -ใใ‚Œใฏใ€็„ก็†ใ‚’ใ—ใชใ„ใ“ใจใ€‚็„ก่Œถใ‚’ใ—ใชใ„ใจ่จ€ใ„ๆ›ใˆใฆใ‚‚ใ„ใ„ใงใ—ใ‚‡ใ†ใ€‚ - -ใ—ใ‹ใ—ใ€ใ“ใฎ็„ก่Œถใ‚’ใ—ใชใ„ใจใ„ใ†ใฎใฏ่กจ็พใŒ้›ฃใ—ใใ€ๆœฌไบบใŒ็„ก่Œถใ ใจๆ€ใฃใฆใ„ใชใใฆใ‚‚็„ก่Œถใซๅซใพใ‚Œใ‚‹ใ“ใจใฏๅคšใ„ใจๆ€ใ„ใพใ™ใ€‚ - -ไพ‹ใˆใฐใ€ๅ€‹ไบบใŒ3dใงใ‚ฒใƒผใƒ ใ‚’ไฝœใ‚‹ใ“ใจใงใ—ใ‚‡ใ†ใ€‚ - -ใ€Œใ„ใ‚„ใ„ใ‚„ใ€ใใ‚“ใชใ€ใจๆ€ใ‚ใ‚Œใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใŒใ€็ดฐใ‹ใ„ใจใ“ใ‚ใ‚’่ฆ‹ใ‚‹ใจใ€ๅ€‹ไบบ้–‹็™บใง3dใ‚’ใ‚„ใ‚‹ใฎใฏใ€็ตๆง‹ใช็„ก่Œถใ ใจไปŠใงใฏๆ€ใ„ใพใ™ใ€‚ใพใŸใ€ueใ‚’ไฝฟใ†ใ“ใจใ‚‚ใใ‚Œใซๅซใพใ‚Œใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใ€‚ - -ueใ‚„3dใ‚’ไฝฟใ†ใจใ€ๅ€‹ไบบใงใ‚‚ๅคงใใ„ใ‚‚ใฎใŒไฝœใ‚ŒใŸๆฐ—ใซใชใฃใฆใ—ใพใ†ใ€‚ๅบƒใ„ใƒžใƒƒใƒ—ใ€ใƒชใ‚ขใƒซใชๆๅ†™ใ€ๅ‹•ใ3dใƒขใƒ‡ใƒซใ€‚ - -ใ—ใ‹ใ—ใ€ๆ‰ฑใ„ใใ‚Œใชใ„ๆญฆๅ™จใปใฉๆ€–ใ„ใ‚‚ใฎใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ๅˆๅฟƒ่€…ใฎๅ€‹ไบบ้–‹็™บใซใจใฃใฆใ€ใใ‚Œใ‚’็ฝฎใ„ใฆใ„ใใปใ†ใŒใ„ใ„ๅ ดๅˆใ‚‚ใ‚ใ‚‹ใ€‚ใ ใ‘ใฉใใ‚Œใ‚’ๆ‰‹ใซใจใฃใฆ้€ฒใ‚“ใงใ—ใพใ†ใฎใงใ™ใ€‚ - -ใ“ใฎๅ ดๅˆใ€ๅ€‹ไบบใŒใงใใ‚‹ใฎใฏใ€ใใฎๆญฆๅ™จใซๅœงๅ€’็š„ใชๅˆถ้™ใ‚’ใคใ‘ใ€ไฝฟใˆใ‚‹ๅ ด้ขใ‚’้™ๅฎšใ™ใ‚‹ใ“ใจใ ใจๆ€ใ„ใพใ™ใ€‚ - -็งใ‚‚่‡ชๅˆ†ใฎใ‚ฒใƒผใƒ ใ‚’ใƒ—ใƒฌใ‚คใ—ใฆใ„ใฆใ€ใ“ใฎ้ƒจๅˆ†ใฏใ‚ˆใใงใใฆใ„ใ‚‹ใชใจใ„ใ†ใจใ“ใ‚ใŒๅฐ‘ใ—ใ‚ใ‚Šใพใ™ใ€‚ใ—ใ‹ใ—ใ€็ทๅˆ็š„ใชใ‚ฒใƒผใƒ ๆ€งใง่€ƒใˆใ‚‹ใจใ€ๅ…จ็„ถใƒ€ใƒกใงใ™ใญใ€‚ - -ใงใ‚‚ใ€ใใ‚Œใชใ‚‰ๆœฌๅฝ“ใซใ‚ˆใใงใใŸ่‡ชไฟกใŒใ‚ใ‚‹้ƒจๅˆ†ใ ใ‘ใงใ‚ฒใƒผใƒ ใ‚’ไฝœใ‚Œใฐใ„ใ„ใ‚“ใ˜ใ‚ƒใชใ„ใ‹ใชใ€‚ - -ใใ“ใซใฏๅทฅๅคซใŒๅฟ…่ฆใซใชใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใชใ„ใ—ใ€ใ‚ณใƒณใ‚ปใƒ—ใƒˆใŒ้‡่ฆใซใชใ‚‹ใจๆ€ใ„ใพใ™ใŒใ€็งใฏใใฎใ‚ˆใ†ใช็ต่ซ–ใซ่‡ณใ‚Šใพใ™ใ€‚ - -ๅฎŒ็’งใซๅ‹•ไฝœใ™ใ‚‹้ƒจๅˆ†ใ€ใƒใ‚ฐใŒๅฐ‘ใชใใ€่‡ชไฟกใŒใ‚ใ‚‹ใจใ“ใ‚ใ€่‡ชๅˆ†ใฎใ‚ฒใƒผใƒ ใฎๆœ€ๅคงใฎ้ญ…ๅŠ›ใ€ใใ“ใ ใ‘ใ‚’ไฝฟใฃใฆใ‚ฒใƒผใƒ ใ‚’ๆง‹็ฏ‰ใ™ใ‚‹ใ“ใจใ‚’ไปŠใฏ่€ƒใˆใฆใ„ใพใ™ใ€‚ - -้ข็™ฝใ„ใ‹ใฉใ†ใ‹ใฏใ€ๆญฃ็›ดใ‚ใ‹ใ‚Šใพใ›ใ‚“ใŒใ€ใƒ‘ใƒƒใจ่ฆ‹ใงใ€ๅฐ‘ใ—ใƒ—ใƒฌใ‚คใ—ใฆใ€ใ€Œใ‚ใ‚Œใ€ใ“ใ‚Œใ™ใ”ใ„ใ‚“ใ˜ใ‚ƒใชใ„ใ€ใจๆ€ใ‚ใ›ใ‚‹ใ“ใจใŒใงใใŸใ‚‰ๆˆๅŠŸใ ใจๆ€ใ„ใพใ™ใ€‚ๆœ€ๅˆใฏใใ“ใ‚’็›ฎๆŒ‡ใ—ใฆใ„ใ“ใ†ใ‹ใชใจใ€‚ - -็„ก็†ใ‚’ใ—ใฆใงใใ‚‹ใ“ใจใ‚’ๅข—ใ‚„ใ—ใฆใ‚‚ๆ„ๅ‘ณใŒใ‚ใ‚Šใพใ›ใ‚“ใ€‚็‰นใซๅ€‹ไบบ้–‹็™บใงใ€3dใงใ€ใ‹ใคueใ ใจใ€ใใ‚Œใฏใจใฆใ‚‚ๅฑ้™บใชๆฐ—ใŒใ—ใพใ™ใ€‚ - -ใจใฏใ„ใˆใ€้‡่ฆใชใฎใฏใ€ใŸใใ•ใ‚“ไฝœใ‚‹ใ“ใจใ€‚ - -3dใง้–‹็™บใ™ใ‚‹ใชใ€ueใ‚’ไฝฟใ†ใชใ€้–‹็™บ่€…ใฏๅฅฝใใชใ‚‚ใฎใ‚’ไฝœใ‚‹ใชใ€ใจ่จ€ใ„ใŸใ„ใ‚ใ‘ใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ - -่จ€ใ„ใŸใ„ใฎใฏใ€ใŸใใ•ใ‚“ไฝœใฃใฆใใŸใ‚‚ใฎใฎไธญใซใฏๅ…‰ใ‚‹ใ‚‚ใฎใ€ใ‚ˆใใงใใŸใ‚‚ใฎใŒใ„ใใคใ‹ๅ‡บใฆใใพใ™ใ€‚ใใ†ใ„ใฃใŸใ‚‚ใฎใ‚’ไฝฟใฃใฆใ‚ฒใƒผใƒ ใ‚’ๆง‹็ฏ‰ใ™ใ‚‹ใ€‚ใใฎๆ–นๅ‘ๆ€งใงใ‚‚่€ƒใˆใฆใฟใ‚‹ใ€ใจใ„ใ†ใ“ใจใ€‚ - -ใŠใใ‚‰ใใ€3dใงไฝœใ‚‹ๅ ดๅˆใ€ueใ‚’ไฝฟใ†ๅ ดๅˆใ€ๅ€‹ไบบ้–‹็™บ่€…ใŒๅฅฝใใชใ‚‚ใฎใ‚’ไฝœใ‚‹ๅ ดๅˆใซใ€ใ“ใฎใ‚ˆใ†ใชๅˆถ้™ใฏๅฝนใซ็ซ‹ใคใจๆ€ใ„ใพใ™ใ€‚ - -ไปฅไธŠใŒใ€ๆœ€่ฟ‘ใฎๅ€‹ไบบ้–‹็™บใฎๆ–นๅ‘ๆ€งใ€ใ‚ใ‚‹ใ„ใฏ่€ƒใˆๆ–นใฎ่ฉฑใงใ™ใ€‚ - -## ใกใ‚ƒใ‚“ใจใ—ใŸใ‚ทใ‚นใƒ†ใƒ ใ‚’ใฉใฎใ‚ˆใ†ใซไฝœใ‚‹ใฎใ‹ - -1. ๅๅ‰่ฆๅ‰‡ใซๅฟ ๅฎŸใงใ‚ใ‚‹ใ“ใจใ€‚ใƒ•ใ‚ฉใƒซใƒ€ใ€ใƒ•ใ‚กใ‚คใƒซใ‚„ๅค‰ๆ•ฐใ€้–ขๆ•ฐใชใฉใฎใ™ในใฆใ€‚ไพ‹ๅค–็š„ใชๅๅ‰่ฆๅ‰‡ใ‚’ไป˜ใ‘ใŸใ‚‚ใฎใ‚’็ฝฎใๅ ดๆ‰€ใ‚’ๆฑบใ‚ใฆใŠใใ“ใจใ€‚ -2. ็ฐกๅ˜ใซใ‚ทใ‚นใƒ†ใƒ ใ‚’ๅˆ†้›ขใ€็ตฑๅˆใงใใ‚‹็Šถๆ…‹ใงใ‚ใ‚‹ใ“ใจใ€‚ -3. ไพๅญ˜้–ขไฟ‚ใ‚’ๆธ›ใ‚‰ใ—ใ€ใƒ•ใ‚กใ‚คใƒซใฏ่‡ชๅˆ†ใฎใƒ•ใ‚ฉใƒซใƒ€ใฎใฟใงๅ‹•ใ็Šถๆ…‹ใซใ™ใ‚‹ใ“ใจใ€‚assetใฏdownloadใ™ใ‚‹ใŒใ€ใงใใ‚‹้™ใ‚Šใใ‚Œใ‚’ไฝฟใ‚ใšใ€ไฝฟ็”จใ™ใ‚‹ใ‚‚ใฎใฏ่‡ชๅˆ†ใฎใƒ•ใ‚ฉใƒซใƒ€ใซ็ฝฎใ„ใฆๆ•ด็†ใ™ใ‚‹ใ“ใจใ€‚ใใ‚Œใ‚’ไฝฟใฃใฆใ‚ทใ‚นใƒ†ใƒ ใ‚’ๆง‹็ฏ‰ใ™ใ‚‹ใ“ใจใ€‚ -4. ใใฎๆ™‚ใซไฝฟใ‚ใชใ„ใ‚‚ใฎใฏๅณๅบงใซๅ‰Š้™คใ™ใ‚‹ใ“ใจใ€‚ใ“ใ‚ŒใฏใƒŽใƒผใƒ‰ใ‚„ๅค‰ๆ•ฐใ€้–ขๆ•ฐใ€ใ™ในใฆใ€‚ - -ใ‚ˆใ†ใฏใ€ๅฃฒใ‚‰ใ‚Œใฆใ„ใ‚‹assetใ‚„pluginใฎ็Šถๆ…‹ใ‚’็›ฎๆŒ‡ใ™ใฎใŒไธ€็•ช่‰ฏใใฆใ€downloadใ™ใ‚Œใฐใ™ใใซไฝฟใˆใ‚‹ใ‚ˆใ†ใชๅฝขใŒ็†ๆƒณ็š„ใ€‚ - -## pvใ‚’ใ‚ฒใƒผใƒ ใซใ™ใ‚‹่ฉฆใฟ - -่‡ชไฟกใŒใ‚ใ‚‹ใ‚‚ใฎใงใ‚ฒใƒผใƒ ใ‚’ๆง‹็ฏ‰ใ™ใ‚‹ใจใ„ใฃใฆใ‚‚ใ€ใฉใฎใ‚ˆใ†ใซใ‚„ใ‚Œใฐใ„ใ„ใฎใงใ—ใ‚‡ใ†ใ€‚ - -ใ“ใ“ใ‹ใ‚‰ใฏ่‡ชๅˆ†ใŒๆ›ธใ„ใŸใƒกใƒขใ‚’่ฒผใ‚Šไป˜ใ‘ใพใ™ใ€‚ - -ๅŽŸ็ฅžใฎใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผpvใŒใ‚ใ‚‹ใ€‚ใจใฆใ‚‚ๅ‚่€ƒใซใชใ‚Šใใ†ใ ใ€‚ - -[https://www.youtube.com/watch?v=0MiIciljaWY](https://www.youtube.com/watch?v=0MiIciljaWY) - -pvใ‚’ไฝœใฃใŸใปใ†ใŒใ„ใ„ใฎใ‹ใจๆ€ใฃใŸใ“ใจใŒใ‚ใฃใฆใ€ใ„ใ‚„ใ€pvใ‚’ใ‚ฒใƒผใƒ ใซใ™ใ‚Œใฐใ„ใ„ใจใ„ใ†ๆกˆใŒๆตฎใ‹ใ‚“ใ ใ€‚ - -ใ“ใ‚Œใฏpixelstreamingใชใฉใง้…ไฟกใ™ใ‚‹ใ“ใจใ‚’่€ƒใˆใŸใ‚ฒใƒผใƒ ใจใ„ใˆใฐใ„ใ„ใ‹ใชใ€‚่ฆใฏ็ฐกๅ˜ใซ้Šในใ‚‹ไธ€ใคใฎ่ปฝ้‡ใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใฎใ‚ˆใ†ใชใ‚‚ใฎใ ใ€‚ไฝ“้จ“็‰ˆใฟใŸใ„ใชๆ„Ÿใ˜ใ ใ‚ใ†ใ‹ใ€‚ - -ใ•ใฆใ€ใ‚ฒใƒผใƒ ใ‚’้–‹ๅง‹ใ™ใ‚‹ใจๅŒๆ™‚ใซใƒญใ‚ดใ€้ŸณๆฅฝใŒๆตใ‚Œใ‚‹ใ€‚pvใฎใ‚ˆใ†ใชๅฐ‘ใ—ใฎใƒ ใƒผใƒ“ใƒผใŒใ‚ใ‚Šใ€ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใŒ็ดนไป‹ใ•ใ‚Œใ‚‹ใ€‚ - -ๆฌกใซใ€ๆˆฆ้—˜ใ‚ทใƒผใƒณใ ใŒใ€ใ“ใ‚Œใซ้–ขใ—ใฆใฏไพ‹ใˆใฐใƒฆใƒผใ‚ถใƒผใŒใ‚นใ‚ญใƒซใ€ใƒใƒผใ‚นใƒˆใฎ2็จฎ้กžใฎๆŠ€ใ‚’็™บๅ‹•ใงใใ‚‹ใ‚ˆใ†ใซใ—ใฆใŠใใ€ใƒฆใƒผใ‚ถใƒผใฎ่กŒๅ‹•ใซใ‚ˆใฃใฆpvใŒๅค‰ใ‚ใ‚‹ใจใ„ใ†ไป•ๆง˜ใงใ‚ใ‚‹ใ€‚ไป•ๆง˜ใจใ„ใ†ใ‹ใ€ไป•็ต„ใฟใงใ‚ใ‚‹ใ€‚ใคใพใ‚Šใ€pvใ‚’ใ‚ฒใƒผใƒ ใซใ€ใ‚ฒใƒผใƒ ใ‚’pvใซใ€‚ใใ‚“ใชๆ„Ÿใ˜ใฎ่ฉฆใฟใ€‚ - -่ปฝ้‡ใƒ‘ใƒƒใ‚ฑใƒผใ‚ธๅŒ–ใ‚’ใฉใฎใ‚ˆใ†ใซ้€ฒใ‚ใ‚‹ใ‹ใ€ใ‚ใ‚‹ใ„ใฏใ€็ฐกๅ˜ใชใ‚ฒใƒผใƒ ไฝœใ‚Šใฏใฉใ†้€ฒใ‚ใ‚‹ใ‹ใซ่ฟทใฃใฆใ„ใŸใŒใ€ใ“ใฎๆ–นๅ‘ๆ€งใง่กŒใ“ใ†ใจๆ€ใ†ใ€‚ - -pvใ‚’ไฝœใ‚‹ใจๅŒๆ™‚ใซใ€ใ‚ฒใƒผใƒ ใ‚’ไฝœใ‚‹ใ€‚ใ‚ฒใƒผใƒ ใ‚’pvใซใ™ใ‚‹ใ€‚ๅ˜็ด”ใ ใŒๅŠนๆžœ็š„ใชใ‚ขใ‚คใƒ‡ใ‚ฃใ‚ขใ ใจๆ€ใ†ใ€‚ - -ใ“ใ‚Œใชใ‚‰ๆ“ไฝœๅฏ่ƒฝ็ฏ„ๅ›ฒใ‚‚ๅคงๅน…ใซๅ‰Šใ‚Œใ‚‹ใ—ใ€ๅŸบๆœฌ็š„ใซpvใ‚’ไฝœใฃใฆใ€ไธ€้ƒจๆ“ไฝœๅฏ่ƒฝใชใ‚ฒใƒผใƒ ใซใ™ใ‚‹ใ ใ‘ใ ใ€‚ - -ใ‚ฒใƒผใƒ ๆ€งใจใƒ€ใƒกใƒผใ‚ธๅค‰ๅ‹•ใ€‚ใ“ใ‚Œใซใคใ„ใฆใฏ็ฐกๆ˜“็š„ใชๅ€‹ไบบใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฟใŸใ„ใชใ‚‚ใฎใ‚’ไฝฟใฃใฆๅฎŸ่ฃ…ใ—ใŸใ„ใจใ„ใ†ๆกˆใŒใ‚ใ‚‹ใ€‚ใ‚ฒใƒผใƒ ใซใฏๅ†็”Ÿใƒœใ‚ฟใƒณใŒใ‚ใ‚Šใ€ๅฎŸ่กŒใ™ใ‚‹ใจpvใŒๆตใ‚Œใ‚‹ไป•็ต„ใฟใ ใŒใ€ไธŠใซใƒญใ‚ฐใ‚คใƒณใƒœใ‚ฟใƒณใŒใ‚ใ‚Šใ€ใใ“ใงใƒญใ‚ฐใ‚คใƒณใงใใ‚‹ใ€‚ใƒญใ‚ฐใ‚คใƒณใจใ„ใฃใฆใ‚‚handleใ‚’ๅ…ฅใ‚Œใ‚‹ใ ใ‘ใฎ็ฐกๅ˜ใชใ‚‚ใฎใ ใ€‚ใงใ€oauthใง็ฐกๅ˜ใชใ‚ฒใƒผใƒ ใ‚ขใ‚ซใ‚ฆใƒณใƒˆไฝœๆˆใฎใƒšใƒผใ‚ธใ‚’ๅˆฅใซไฝœใฃใฆใŠใใ€‚ใใ‚Œใ‚’ๅฎŸ่กŒใ—ใฆใ„ใ‚‹ใจใ€atprotoใ‹ใ‚‰ใƒ‡ใƒผใ‚ฟใ‚’่ชญใฟๅ–ใ‚‹ใ€‚ - -ใ‚ฒใƒผใƒ ไฝœใ‚Šใฎๆ–นๅ‘ๆ€งใจใ—ใฆใ€่ปฝ้‡ใงใ€ใ—ใฃใ‹ใ‚Šใจๅ‹•ใ(ใƒใ‚ฐใŒใชใ)ใ€ๅŠนๆžœ็š„ใง้ข็™ฝใ„ใ‚‚ใฎใ‚’ไฝœใ‚ใ†ใจใ—ใฆใ„ใฆใ€ใใฎ็ญ”ใˆใฎไธ€ใคใŒใ€pvใ‚’ใ‚ฒใƒผใƒ ๅŒ–ใ™ใ‚‹ใจใ„ใ†ๆกˆใ ใฃใŸใ€‚ - -ใ“ใ‚Œใฏใ„ใใคใฎๅ‰ๆๆ€่€ƒใ‚’ใ‚‚ใจใซๆง‹็ฏ‰ใ•ใ‚Œใฆใ„ใ‚‹ใ€‚ๅ‰ๆๆ€่€ƒใจใฏใ€ใ‚ทใƒณใƒ—ใƒซใชใ‚ฒใƒผใƒ ใ‚’ไฝœใ‚ใ†ใจใ„ใ†่ฉฆใฟใงใ€ๆœ€ๅˆใฏใ‚ใ‹ใ‚Šใ‚„ใ™ใ„ใ‚ทใƒฅใƒผใƒ†ใ‚ฃใƒณใ‚ฐใ‚ฒใƒผใƒ ใฎใ‚ˆใ†ใชใ‚‚ใฎใ‚’ๆง‹ๆƒณใ—ใฆใ„ใŸใ€‚ - -ใ—ใ‹ใ—ใ€ใ“ใฎๆง‹ๆƒณใซใฏไธ่ถณใŒใ‚ใ‚‹ใ€‚ไธ€่จ€ใงใ‚ฒใƒผใƒ ใฎๅง‹ใพใ‚Šใฏ?็ต‚ใ‚ใ‚Šใฏ?ใ‚ฏใƒชใ‚ขใ‚„ใ‚ฒใƒผใƒ ใ‚ชใƒผใƒใƒผใฎๆผ”ๅ‡บใฏ?ใใฎไป–่ซธใ€…ใฎใ‚ฒใƒผใƒ ใซใจใฃใฆ้‡่ฆใช่ฆ็ด ใŒไผใ‚ใ‚‰ใชใ„ใ€ใใ—ใฆใ€ใใฎ้ƒจๅˆ†ใ‚’ใฉใ†ๆง‹็ฏ‰ใ—ใฆใ„ใใ‹่ฆ‹ใˆใชใ„็‚นใซใ‚ใฃใŸใ€‚ - -ใ“ใฎๅผฑ็‚นใ‚’ๅ…‹ๆœใ—ใŸๆกˆใŒใ€Œใ‚ฒใƒผใƒ ใ‚ญใƒฃใƒฉใฎpvๅ‹•็”ปใ‚’ใ‚ฒใƒผใƒ ใซใ—ใ‚ˆใ†ใ€ใจใ„ใ†ใ‚‚ใฎใ ใ€‚ - -ใ‚‚ใฃใจใ‚ทใƒณใƒ—ใƒซใซ่จ€ใ†ใจใ€Œpvใ‚’ใ‚ฒใƒผใƒ ใซใ™ใ‚‹ใ€ใจใ„ใ†ใ“ใจใ€‚ใ“ใ‚Œใชใ‚‰ใ‚คใƒกใƒผใ‚ธใŒใฏใฃใใ‚Šใจๆตฎใ‹ใณไธŠใŒใ‚Šใ€ใ‹ใคใ‚ฒใƒผใƒ ๅŒ–ใ™ใ‚‹้š›ใฎ่ฆ็ด ใ‚‚ๆฑบใพใฃใฆใใ‚‹ใ€‚ใ‚ฒใƒผใƒ ใฎๅง‹ใพใ‚Šใจ็ต‚ใ‚ใ‚Šใ€ใ‚ฒใƒผใƒ ไธญใŒใฉใฎใ‚ˆใ†ใชใ‚‚ใฎใ‹ใ‚’ใฏใฃใใ‚Šใจใ‚คใƒกใƒผใ‚ธใ™ใ‚‹ใ“ใจใŒใงใใ‚‹ใ€‚ - -ใงใฏใ€ๅฎŸ้š›ใฎใ‚ญใƒฃใƒฉpvใ‚’ๅˆ†ๆžใ—ใฆใฟใ‚ˆใ†ใ€‚ใ“ใ“ใงใฏๅŽŸ็ฅžใฎใ‚ฆใ‚งใƒณใƒ†ใ‚ฃใฎๅ‹•็”ปใ‚’ๅˆ†ๆžใ™ใ‚‹ใ€‚ - -1. ้ป’ใ„็”ป้ขใซใƒญใ‚ด(ไฝœ่€…)ใŒๆตฎใ‹ใณไธŠใŒใ‚‹ใ€‚็พŽใ—ใ„BGMใŒๆตใ‚Œใ‚‹ -2. ็ท‘ใฎๆœจใ€…ใจ้’ใ„็ฉบ -3. ใ‚ซใƒกใƒฉใŒใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฎๆ–นใซ็งปๅ‹• -4. ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใŒ็‰ฉ่ชžใฎ้‡่ฆใชใ‚ปใƒชใƒ• -5. ่ƒŒๅพŒใซๆ•ตใฎๅฝฑ -6. ๆ•ตใŒๆ”ปๆ’ƒใ—ใฆใใ‚‹ใ€ๆ”ปๆ’ƒใฏใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฎๆ–นๅ‘ใซๅ‘ใ‹ใ†ใ€ใ‚ซใƒกใƒฉใƒฏใƒผใ‚ฏ -7. ใ‚ญใƒฃใƒฉใฏๅ„ช้›…ใซใใ‚Œใ‚’้ฟใ‘ใ‚‹ -8. ใ‚ญใƒฃใƒฉใฎ็ดนไป‹ๆ–‡ใ‚„ๆผ”ๅ‡บใŒๅ…ฅใ‚‹ -9. ใƒใƒˆใƒซใ‚ทใƒผใƒณ -10. ใ‚นใ‚ญใƒซใ€็ˆ†็™บใฎ็ดนไป‹(ใ‚ปใƒชใƒ•ใ‚ใ‚Š) -11. ๆœ€ๅพŒใฎใ‚ญใƒฃใƒฉใ‚’ๆญฃ้ขใซ้€šๅธธๆ”ปๆ’ƒใ€ๅผ“ใŒๆ”พใŸใ‚Œ -12. ใƒญใ‚ด(ใ‚ฟใ‚คใƒˆใƒซ)ใŒๆตฎใ‹ใณไธŠใŒใ‚‹ใ€‚็พŽใ—ใ„BGMใฎ็ต‚ใ‚ใ‚Šใจๅˆใ‚ใ›ใ‚‹ - -ใ“ใ‚Œใ‚’่‡ชๅˆ†ใฎใ‚ฒใƒผใƒ ใซๅฝ“ใฆใฏใ‚ใฆใฟใ‚‹ใ€‚ - -1. ้ป’ใ„็”ป้ขใซใƒญใ‚ด(syui)ใŒๆตฎใ‹ใณไธŠใŒใ‚‹ใ€‚BGMใ€ใƒ”ใƒƒใƒใฏ0.2 -2. ใ‚ขใ‚คใฎๅฎถใจใ‚ขใ‚คใŒๅฑ‹ๆ นใฎไธŠใซๅบงใฃใฆใ„ใ‚‹ใ€ใƒขใƒผใ‚ทใƒงใƒณใ‚ใ‚Š -3. ใ‚ปใƒชใƒ•ใ€็‰ฉ่ชžใฏๅคฉ็ฉบใซๆตฎใ‹ใถๅณถใ‹ใ‚‰ใฏใ˜ใพใ‚‹(่ชฐใ—ใ‚‚ใŒ่ˆˆๅ‘ณใ‚’ๆŽปใ็ซ‹ใฆใ‚‰ใ‚Œใ‚‹ๅ†…ๅฎน=ๅคฉ็ฉบๅŸŽใ‚„ๅคไปฃๅ…ตๅ™จ)ใ€BGMใฎใƒ”ใƒƒใƒใ‚’ๅพใ€…ใซไธŠใ’ใฆใ„ใmax:1.0 -4. ๅœฐ็ƒใซ่ฟ‘ใฅใ้ป’ใ„ๅฝฑ -5. ็ ฒๆ’ƒใŒๅง‹ใพใ‚‹ใ€่ตคใ„ๅ…‰ใŒๆ˜Ÿใ‚’ใ‚ใŒใ‘ใฆ่ฝใกใฆใ„ใ -6. ใ‚ขใ‚คใŒ้ซ˜้€Ÿ้ฃ›่กŒใ—ใฆใ€ๆ•ตใฎๅ ดๆ‰€ใซ็งปๅ‹• -7. ใ‚ญใƒฃใƒฉใฎ็ดนไป‹ใจ้Ÿณๅฃฐ -8. ใ‚นใ‚ญใƒซใจใƒใƒผใ‚นใƒˆใฎๆŠ€็ดนไป‹ใ€ใ‚ญใƒผใ‚„ใƒœใ‚ฟใƒณใ‚’ใ‹ใฃใ“ใ‚ˆใ่กจ็คบ(ใชใชใ‚ใ€ๅคงใใ‚)ใ€‚่ƒŒๆ™ฏใฏ็ฐ่‰ฒใจใ‚ซใƒฉใƒผใ‚’ใ‚ใ‚ใ›ใ‚‹ -9. ใƒใƒˆใƒซใ‚ทใƒผใƒณ(ใƒ—ใƒฌใ‚คใƒคใƒผใŒๆ“ไฝœๅฏ่ƒฝ) -10. 1ใƒœใ‚ฟใƒณ(1ๆ“ไฝœ)ใงใ‚ฒใƒผใƒ ใ‚ฏใƒชใ‚ขใ€‚ๆ™‚้–“็ตŒ้Žใงๆฌกใฎใ‚ทใƒผใƒณใซ็งป่กŒ -11. ๆœ€ๅพŒใซใ‚ญใƒฃใƒฉใ‚’ๆญฃ้ขใซใ‚ขใƒƒใƒ—ใ—้€šๅธธๆ”ปๆ’ƒ -12. ใƒญใ‚ด(ai)ใŒๆตฎใ‹ใณไธŠใŒใ‚Šใ€BGMใฎ็ต‚ใ‚ใ‚Šใจๅˆใ‚ใ›ใ‚‹ - -้ข็™ฝใ•ใฎๅฎŸ่ฃ…ใซใฏๅผฑใ„pvใ€‚ใ“ใ‚Œใ‚’ใฉใ†ๅ…‹ๆœใ—ใฆใ„ใใ‹ใ‚’่€ƒใˆใ‚‹ใ€‚ - -- ใƒใƒˆใƒซใ‚ทใƒผใƒณใ‚’ๅฐ‘ใ—้•ทใใ™ใ‚‹ -- atprotoใฎใƒ‡ใƒผใ‚ฟใ‚’ๅ‚็…งใ—ใ€็พๅฎŸใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฎๅ€คใ‚’ใƒ€ใƒกใƒผใ‚ธ่กจ่จ˜ใซๅๆ˜ ใ™ใ‚‹ -- ใƒ€ใƒกใƒผใ‚ธ็ทๅˆๅ€คใ‚’่กจ็คบใ—ใŸใ‚Š่จ˜้Œฒใ—ใŸใ‚Šใ™ใ‚‹ - -ๅŽŸ็ฅžใฎ้ข็™ฝใ•ใฏๅ…ƒ็ด ๅๅฟœใซใ‚ใ‚‹ใ€‚ใคใพใ‚Šใ€ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฎๆ”ปๆ’ƒใฎ็ต„ใฟๅˆใ‚ใ›ใ€‚ใƒ€ใƒกใƒผใ‚ธๅข—ๅŠ ้‡ใชใฉใ€‚ๅŽŸ็ฅžใงใฏใ€ใ‚ญใƒฃใƒฉใ‚’ๆ•ตใฎๅ‰ใซๅ‹•ใ‹ใ›ใ‚‹ใ€ใ‚นใ‚ญใƒซๅ›žใ—ใ€็ˆ†็™บใจใ„ใ†ๆตใ‚Œใงๆˆฆ้—˜ใ‚’ๆฅฝใ—ใ‚€ใ€‚ใ“ใ‚Œใ‚’ๅˆ†่งฃใ™ใ‚‹ใจใ€ใ€Œๅˆใ‚ใ›ใ‚‹ใ“ใจใจใ€ใƒ€ใƒกใƒผใ‚ธๅข—ๅŠ ้‡ใฎใ‚ณใƒณใƒˆใƒญใƒผใƒซใ€ใ ใจๆ€ใ†ใ€‚ใ“ใ‚Œใ‚’่‡ชๅˆ†ใซใ‚‚ใงใใ‚‹็ฐกๅ˜ใชไป•็ต„ใฟใงๅฎŸ็พใงใใชใ„ใ‹ใ‚’่€ƒใˆใฆใ„ใ‚‹ใ€‚ - diff --git a/my-blog/content/posts/2025-09-25-ue-57p.md b/my-blog/content/posts/2025-09-25-ue-57p.md deleted file mode 100644 index 0150e47..0000000 --- a/my-blog/content/posts/2025-09-25-ue-57p.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: "ue 5.7.0pใงprojectใ‚’ไฝœใ‚Š็›ดใ™" -slug: "ue-57p" -date: "2025-09-25" -tags: ["ue", "mac", "linux"] -draft: false ---- - -`unreal engine 5.7.0-preview`ใŒๆฅใพใ—ใŸใ€‚ - -[https://forums.unrealengine.com/t/unreal-engine-5-7-preview/2658958](https://forums.unrealengine.com/t/unreal-engine-5-7-preview/2658958) - -`vrm4u`ใฏ`5.7`ใซๅฏพๅฟœใ—ใฆใ„ใ‚‹ใฎใงใ€game animation sample(gasp)ใ‚’ใƒ™ใƒผใ‚นใซๆง‹็ฏ‰ใ—ใฆใฟใพใ™ใ€‚ - -- gasp: [https://www.fab.com/listings/880e319a-a59e-4ed2-b268-b32dac7fa016](https://www.fab.com/listings/880e319a-a59e-4ed2-b268-b32dac7fa016) -- vrm4u: [https://github.com/ruyo/VRM4U/releases/](https://github.com/ruyo/VRM4U/releases/) - -## game animation sample for ue5.7 - -1. ใพใš็ฉบใฎprojectใ‚’ue5.7ใงไฝœใ‚Šใพใ™ใ€‚็งใฏๅพŒใซๅˆฉ็”จใ™ใ‚‹`Valiant Combat`ใงไฝœใ‚Šใพใ—ใŸใ€‚[a]ใจใ—ใพใ™ใ€‚ -2. game animation sampleใฎproject(gasp)ใฏใพใ ๅฏพๅฟœใ—ใฆใ„ใชใ„ใฎใงใ€ue5.6ใงไฝœใ‚Šใพใ™ใ€‚[b]ใจใ—ใพใ™ใ€‚ -3. [b]ใฎ`${project}/Config`, `${project}.uproject`ใ‚’ๅ‚่€ƒใซ[a]ใซ็งปๆคใ—ใพใ™ใ€‚ - -```json:${project}.uproject -"Plugins": [ - { - "Name": "ModelingToolsEditorMode", - "Enabled": true, - "TargetAllowList": [ - "Editor" - ] - }, - { - "Name": "AnimationWarping", - "Enabled": true - }, - { - "Name": "RigLogic", - "Enabled": true - }, - { - "Name": "LiveLink", - "Enabled": true - }, - { - "Name": "LiveLinkControlRig", - "Enabled": true - }, - { - "Name": "PoseSearch", - "Enabled": true - }, - { - "Name": "AnimationLocomotionLibrary", - "Enabled": true - }, - { - "Name": "MotionWarping", - "Enabled": true - }, - { - "Name": "HairStrands", - "Enabled": true - }, - { - "Name": "Chooser", - "Enabled": true - }, - { - "Name": "Mover", - "Enabled": true - }, - { - "Name": "NetworkPrediction", - "Enabled": true - } -] -``` - -็‰นใซ`../Config/DefaultEngine.ini`ใŒ้‡่ฆใงใ™ใ€‚ - -ใ“ใ‚ŒใงๅฎŒไบ†ใงใ™ใ€‚ๆ™ฎ้€šใซๅ‹•ใใพใ™ใ€‚ใ‚ฐใƒฉใƒ•ใ‚ฃใƒƒใ‚ฏใŒใใ‚Œใ„ใซใชใฃใฆใ„ใ‚‹ใ‚ˆใ†ใชๆฐ—ใŒใ—ใฆใ€่ปฝ้‡ๆ„Ÿใ‚‚ๅฐ‘ใ—ไธŠใŒใฃใฆใ‚‹ใ‹ใ‚‚ใ€‚ - -![](/img/ue_v570p_gasp_vrm4u_0001.png) - -package buildใฏๅฐ‘ใ—ๅˆ†ใ‹ใ‚Šใฅใ‚‰ใ„ใงใ™ใŒใ€`[]Windows`ใจใชใฃใฆใ„ใ‚‹ใจใ“ใ‚ใ‚’`[o]Windows`ใซใ—ใชใ„ใจใ„ใ‘ใพใ›ใ‚“ใ€‚gasp + vrm4uใงใฎpackage buildใฏwin, macใงๆˆๅŠŸใ—ใพใ—ใŸใ€‚macใฏxcode26ใงใ„ใ‘ใพใ™ใ€‚ - - -linuxใฏๅคฑๆ•—ใงใ™ใ€‚`Microsoft.MakeFile.Targets 44`ใชใฎใงใ€่ชฟในใฆใฟใ‚‹ใจ`toolchain: v26_clang-20.x.x`ใŒๅฟ…่ฆใชใฎใงใ—ใ‚‡ใ†ใ€‚ใพใ ๅ…ฌ้–‹ใ•ใ‚Œใฆใ„ใชใ„ใจๆ€ใ„ใพใ™ใ€‚docsใซใฏlinkใŒใ‚ใ‚Šใพใ›ใ‚“ใงใ—ใŸใ€‚ - -[https://dev.epicgames.com/documentation/ja-jp/unreal-engine/linux-development-requirements-for-unreal-engine](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/linux-development-requirements-for-unreal-engine) - -1. `/Source/`ใซc++ใ‚’็ฝฎใ„ใฆใ€`.uproject`ใ‚’ๅณใ‚ฏใƒชใƒƒใ‚ฏใง`generate visual studio project files`ใ‚’้ธๆŠžใ€‚ -2. `${project}.sln`ใ‚’้–‹ใใพใ™ใ€‚ -3. Development: Linux -4. ๅณใ‚จใ‚ฏใ‚นใƒ—ใƒญใƒผใƒฉใƒผใ‹ใ‚‰`$project`ใ‚’้ธๆŠžใ—ใฆใ€ๅณใ‚ฏใƒชใƒƒใ‚ฏใงbuildใ‚’้–‹ๅง‹ใ€‚ - -{{< msg type="warning" content="This version of the Unreal Engine can only be compiled with clang 20.x. clang 18.1.0 may not build it" >}} - -```sh -# https://cdn.unrealengine.com/CrossToolchain_Linux/v25_clang-18.1.0-rockylinux8.exe -& "C:\Program Files\Epic Games\UE_5.7\Engine\Build\BatchFiles\Build.bat" Airse Linux Development -Project="C:\Users\syui\Documents\Unreal Projects\5.7\Airse\Airse.uproject" -WaitMutex -FromMsBuild - -ใ‚จใƒฉใƒผ: MSB3073 -Airse: "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.MakeFile.Targets" 44 -``` - -## ue5.7ใซ็งป่กŒใ™ใ‚‹ - -ๆœ€่ฟ‘ใฏprojectๅ†ๆง‹็ฏ‰ใจๆ–ฐใ—ใ„build็’ฐๅขƒใฎๆง‹็ฏ‰ใ‚’ใ‚„ใฃใฆใ„ใŸใฎใงใ€ใคใ„ใงใซ`5.7`ใซ็งป่กŒใ™ใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚ใพใ ๆ‰‹ใ‚’ไป˜ใ‘ใฆใ„ใ‚‹้ƒจๅˆ†ใŒๅฐ‘ใชใ„ๆ™‚ใซ็งป่กŒใ—ใŸใปใ†ใŒใ‚ˆใ„ใจๅˆคๆ–ญใ€‚ - diff --git a/my-blog/content/posts/2025-10-08-dream-system.md b/my-blog/content/posts/2025-10-08-dream-system.md deleted file mode 100644 index 29e059b..0000000 --- a/my-blog/content/posts/2025-10-08-dream-system.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "world origin systemใŒใงใใŸ" -slug: "dream-system" -date: "2025-10-08" -tags: ["ue"] -draft: false ---- - -## ็พๅฎŸใจๅคขใฎไธ–็•Œ - -็งใฎใ‚ฒใƒผใƒ ใงใฏใ€็พๅฎŸใซๅˆใ‚ใ›ใฆไธ–็•Œใ‚’ไฝœใ‚‹world system(planet system)ใจใ‚ฒใƒผใƒ ใซๅˆใ‚ใ›ใฆไฝœใ‚‹origin system(dream system)ใŒใ‚ใ‚Šใพใ™ใ€‚ - -origin systemใฎ็”ฑๆฅใฏใ€ๅœฐ็ƒๅนณ้ข่ชฌใ‚„ๅคฉๅ‹•่ชฌใ€ใคใพใ‚Šใ€ๅคไปฃใฎๅฎ‡ๅฎ™่ฆณใงใ™ใ€‚ๆƒ‘ๆ˜ŸใฏใŠๆค€ใฎๅฝขใ‚’ใ—ใฆใŠใ‚Šใ€ใใ“ใซๅœฐไธŠใŒไน—ใฃใฆใ„ใ‚‹ใ‚คใƒกใƒผใ‚ธใ€‚ - -![](/img/ue_world_system_img_0001.png) - -ใ“ใฎorigin systemใฏใ€่ปฝ้‡ๆ€งใ€็‹ฌ็ซ‹ๆ€งใ€็ตฑๅˆๆ€งใ‚’่€ƒใˆใ‚‰ใ‚ŒใŸใƒ‡ใ‚ถใ‚คใƒณใงใ€้žๅธธใซๆ‰ฑใ„ใ‚„ใ™ใ„ๅฝขใจใชใฃใฆใ„ใพใ™ใ€‚ - -![](/img/ue_world_system_img_0002.png) - -ไปŠๅ›žใฏ`ue5.6.1 -> ue5.7.0p`ใฎ็งปๆคไฝœๆฅญใŒๅฎŒไบ†ใ—ใ€origin systemใฎไป•ๆง˜ใŒใงใใพใ—ใŸใ€‚ใ“ใ‚Œใงๆ–ฐใ—ใ„ๆƒ‘ๆ˜Ÿใ‚„ๅœฐไธŠใฎ่ฟฝๅŠ ใ€็ตฑๅˆใŒๆฅฝใซใชใ‚Šใพใ™ใ€‚ - - - diff --git a/my-blog/content/posts/2025-10-19-comfyui-auto-controlnet.md b/my-blog/content/posts/2025-10-19-comfyui-auto-controlnet.md deleted file mode 100644 index 7809416..0000000 --- a/my-blog/content/posts/2025-10-19-comfyui-auto-controlnet.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: "comfyuiใ‚’่‡ชๅ‹•ๅŒ–ใ™ใ‚‹" -slug: "comfyui-auto-controlnet" -date: "2025-10-19" -tags: ["comfyui"] -draft: false ---- - -ไปŠๅ›žใฏใ€`comfyui`ใฎ่‡ชๅ‹•ๅŒ–ใ‚’็ดนไป‹ใ—ใพใ™ใ€‚ - -## comfyuiใฎ่‡ชๅ‹•ๅŒ–ๆ‰‹้ † - -ไปฅไธ‹ใฎๆฉŸ่ƒฝใ‚’ไฝฟ็”จใ—ใพใ™ใ€‚ - -1. `Apply InstantID`: ้ก”ใ‚’ๆŒ‡ๅฎšใ—ใพใ™ใ€‚ -2. `Apply ControlNet`: ใƒใƒผใ‚บใ‚’ๆŒ‡ๅฎšใ—ใพใ™ใ€‚ - -ใพใšใ“ใกใ‚‰ใฎworkflowใ‚’่ชญใฟ่พผใ‚€ใจๆ—ฉใๆ›ธใ‘ใพใ™ใ€‚workflowใฏ้€šๅธธใ€comfyuiใงไฝœใ‚‰ใ‚ŒใŸ็”ปๅƒใซ่จ˜้Œฒใ•ใ‚Œใฆใ„ใพใ™ใ€‚ - -[https://docs.comfy.org/tutorials/controlnet/pose-controlnet-2-pass](https://docs.comfy.org/tutorials/controlnet/pose-controlnet-2-pass) - -ใ“ใ“ใ‹ใ‚‰`Apply InstantID`ใ‚’่ฟฝๅŠ ใ—ใพใ™ใ€‚`Apply ControlNet`ใ‹ใ‚‰`positive`, `negative`ใ‚’`InstantID`ใจ`KSampler`ใซใคใชใŽใพใ™ใ€‚ - -```md -[ControlNet] -> [InstantID] -> [KSampler] -``` - -่‡ชๅ‹•ๅŒ–ใซใฏไปฅไธ‹ใฎใƒŽใƒผใƒ‰ใ‚’ไฝฟใ„ใพใ™ใ€‚ - -1. `Batch Image Loop Open`: loopๅ‡ฆ็†ใ‚’ไฝœใ‚Œใพใ™ใ€‚ -2. `Load Image Batch From Dir`: ็”ปๅƒใ‚’ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใ‹ใ‚‰่ชญใฟ่พผใฟใพใ™ใ€‚ -3. `LogicUtil_Uniform Random Choice`: ใƒฉใƒณใƒ€ใƒ ใงๅŒบๅˆ‡ใ‚Šๆ–‡ๅญ—ใ‚’้ธๆŠžใ—ใพใ™ใ€‚loopไธญใซpromptใฎไธญ่บซใ‚’ๅค‰ใˆใพใ™ใ€‚ - -ใชใŠใ€`comfyui`ใฎๅค–้ƒจใƒŽใƒผใƒ‰ใฏไปฅไธ‹ใ‚’ไฝฟ็”จใ—ใฆใ„ใพใ™ใ€‚ - -- comfyui_instantid -- loop-image -- comfyui-inspire-pack - - -่‡ชๅ‹•ๅŒ–ใฎๆ‰‹้ †ใจใ—ใฆใฏใ€ใพใšใ€ใƒใƒผใ‚บใ‚’ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใซไฟๅญ˜ใ—ใฆใŠใใ€`Load Image Batch From Dir`ใง่ชญใฟ่พผใฟใพใ™ใ€‚`Batch Image Loop Open`ใซใคใชใŽใพใ™ใ€‚ใใ‚Œใ‚’`Apply ControlNet`ใซใคใชใŽใพใ™ใ€‚ - -ๆœ€็ต‚็š„ใซ`KSampler`ใ‹ใ‚‰`VAE Decode`ใ‚’ใคใชใŽใ€ใใ“ใ‹ใ‚‰`Batch Image Loop Close`ใงใƒซใƒผใƒ—ใ‚’้–‰ใ˜ใพใ™ใ€‚ - -ใ‚‚ใ—ใ“ใ“ใงไฟๅญ˜ใ—ใŸใ‘ใ‚Œใฐใ€`VAE Decode`ใ‚’`Save Image`ใซใ‚‚็น‹ใ„ใงใŠใใพใ™ใ€‚ - -```md -[Load Image Batch From Dir] -> [Batch Image Loop Open] -> - -[ControlNet] -> [InstantID] -> [KSampler] -> - -[VAE Decode] -> [Batch Image Loop Close] -``` - -[![](/img/comfyui_instantid_controlnet_0001.png)](/img/comfyui_instantid_controlnet_0001.png) -[![](/img/comfyui_instantid_controlnet_0002.png)](/img/comfyui_instantid_controlnet_0002.png) -[![](/img/comfyui_instantid_controlnet_0003.png)](/img/comfyui_instantid_controlnet_0003.png) -[![](/img/comfyui_instantid_controlnet_0004.png)](/img/comfyui_instantid_controlnet_0004.png) - - -## comfyuiใฎไพฟๅˆฉใชใƒŽใƒผใƒ‰ - -`filename_prefix`ใง`Get Date Time String(JPS)`ใ‚’ไฝฟ็”จใ—ใฆใ„ใพใ™ใ€‚ใ“ใ‚Œใงใƒ•ใ‚กใ‚คใƒซๅใŒ้‡่ค‡ใ—ใฅใ‚‰ใใชใ‚Šใพใ™ใ€‚ - -ๅฝน็ซ‹ใคๅค–้ƒจใƒŽใƒผใƒ‰ใงใ™ใ€‚ - -- comfy-image-saver -- JPS-Nodes -- comfyui-custom-scripts - -ไพ‹ใˆใฐใ€loopไธญใซpromptใ‚’ใƒฉใƒณใƒ€ใƒ ใงๅค‰ใˆใ‚‹ๅ‡ฆ็†ใ‚’่ฟฝๅŠ ใ—ใฆใ„ใพใ™ใ€‚ใ“ใ‚Œใฏ`LogicUtil_Uniform Random Choice`ใงๅฎŸ็พใ—ใฆใŠใ‚Šใ€ๅŒบๅˆ‡ใ‚Šๆ–‡ๅญ—ใฏ`,`ใงใ™ใ€‚ - -```md -background: city street, -background: cloud sky, -background: galaxy planet, -``` - -## ใƒใƒผใ‚บใฎไฝœๆˆๆ‰‹้ † - -[https://openposes.com/](https://openposes.com/) - -ไพ‹ใˆใฐใ€่‡ชไฝœใ‚ฒใƒผใƒ ๅ‹•็”ปใ‚’ไฟๅญ˜ใ—ใ€`ffmepg`ใง็”ปๅƒๅŒ–ใ—ใพใ™ใ€‚ - -```sh -$ ffmpeg -i input.mp4 output%04d.png -``` - -ใใฎ็”ปๅƒใ‚’ไฝฟใฃใฆใ€ใƒใƒผใ‚บใ‚’ไฝœๆˆใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ - -- `OpenPose Pose`: `comfyui_controlnet_aux` - -[![](/img/comfyui_instantid_controlnet_0005.png)](/img/comfyui_instantid_controlnet_0005.png) - diff --git a/my-blog/content/posts/2025-10-19-lms-gpt-oss.md b/my-blog/content/posts/2025-10-19-lms-gpt-oss.md deleted file mode 100644 index e7e67fc..0000000 --- a/my-blog/content/posts/2025-10-19-lms-gpt-oss.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: "gpt-ossใ‚’ไฝฟ็”จใ™ใ‚‹" -slug: "lms-gpt-oss" -date: "2025-10-19" -tags: ["openai", "AI", "windows"] -draft: false ---- - -ไปŠๅ›žใฏใ€openaiใฎ[gpt-oss](https://huggingface.co/openai/gpt-oss-120b)ใ‚’ไฝฟ็”จใ™ใ‚‹ๆ–นๆณ•ใงใ™ใ€‚ - -[https://openai.com/ja-JP/index/introducing-gpt-oss/](https://openai.com/ja-JP/index/introducing-gpt-oss/) - -`120b`, `20b`ใŒใ‚ใ‚Šใพใ™ใ€‚ๅฅฝใใชๆ–นใ‚’ไฝฟใ„ใพใ—ใ‚‡ใ†ใ€‚ใ“ใ“ใงใฏ`20b`ใ‚’ไฝฟ็”จใ—ใพใ™ใ€‚ - -```sh -$ ollama run gpt-oss:20b -or -$ lms get openai/gpt-oss-20b -``` - -ไปŠๅ›žใฏใ€lms(LM Studio)ใงไฝฟ็”จใ—ใพใ™ใ€‚ - -```sh -# https://lmstudio.ai/ -$ pip install lmstudio - -# https://huggingface.co/openai/gpt-oss-20b -$ lms get openai/gpt-oss-20b -``` - -ไปŠๅพŒใ€ๅฎถๅบญใฎpcใฏใ€gpu(nvidia, amd)ใ‚’็ฉใ‚“ใง`lms`ใง`gpt-oss`ใ‚’ๅ‹•ใ‹ใ™ใฎใŒไธ€่ˆฌ็š„ใซใชใ‚Šใใ†ใ€‚ - -## ใ‚ตใƒผใƒ“ใ‚นใจใ—ใฆๅ…ฌ้–‹ใ™ใ‚‹ - -ไพ‹ใˆใฐใ€apiใจใ—ใฆๅ…ฌ้–‹ใ™ใ‚‹ใ“ใจใ‚‚ใงใใ€ใใ‚Œใ‚’่‡ช่บซใฎใ‚ตใƒผใƒ“ใ‚นไธŠใ‹ใ‚‰ๅˆฉ็”จใ™ใ‚‹ใชใฉใฎไฝฟใ„ๆ–นใŒใ‚ใ‚Šใพใ™ใ€‚ใชใŠใ€`lms`ใซใ‚‚ใ“ใฎใ‚ˆใ†ใชๆฉŸ่ƒฝใฏใ‚ใ‚Šใพใ™ใ€‚ - -```sh -# https://cookbook.openai.com/articles/gpt-oss/run-transformers -$ transformers serve -$ transformers chat localhost:8000 --model-name-or-path openai/gpt-oss-20b ---- -$ curl -X POST http://localhost:8000/v1/responses -H "Content-Type: application/json" -d '{"messages": [{"role": "system", "content": "hello"}], "temperature": 0.9, "max_tokens": 1000, "stream": true, "model": "openai/gpt-oss-20b"}' -``` - -```sh -$ cloudflared tunnel login -$ cloudflared tunnel create gpt-oss-tunnel -``` - -```yml:~/.cloudflared/config.yml -tunnel: 1234 -credentials-file: ~/.cloudflared/1234.json - -ingress: - - hostname: example.com - service: http://localhost:8000 - - service: http_status:404 -``` - -```sh -$ cloudflared tunnel run gpt-oss-tunnel -``` - -ใŸใ ใ€apiใฎreqใซใฏใ‚ญใƒผใจใ‹่จญๅฎšใ—ใฆใŠใ„ใŸใปใ†ใŒใ„ใ„ใ‹ใ‚‚ใ€‚ - -## ้ซ˜้€Ÿใ€ๅคง่ฆๆจกใซไฝฟใ†ใซใฏ - -`vllm`ใ‚’ไฝฟใ„ใพใ™ใ€‚linuxใŒๆœ€้ฉใงใ™ใ€‚gpu(nvidia-cuda)ใŒใชใ„ใจใใคใ„ใฎใงใ€win + wslใงๅ‹•ใ‹ใ—ใพใ™ใ€‚nvidiaใฎ`H100`ใ‚„`DGX Spark`ใŒๅฟ…่ฆใซใชใ‚‹ใจๆ€ใ„ใพใ™ใ€‚ - -cudaใฏcomfyuiใงไฝฟใฃใฆใ„ใ‚‹`cu129`ใซๅˆใ‚ใ›ใพใ—ใŸใ€‚ - -```sh -$ wsl --install archlinux -$ wsl -d archlinux -$ nvidia-smi -``` - -```sh -$ mkdir ~/.config/openai/gpt-oss -$ cd ~/.config/openai/gpt-oss -$ python -m venv venv -$ source venv/bin/activate - -$ pip install --upgrade pip -$ pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu129 -$ pip install vllm transformers - -$ python -m vllm.entrypoints.openai.api_server \ - --model openai/gpt-oss-20b \ - --port 8000 \ -``` - -```sh -$ curl http://localhost:8000/v1/chat/completions \ - -H "Content-Type: application/json" \ - -d '{ - "model": "openai/gpt-oss-20b", - "messages": [{"role": "user", "content": "ใ“ใ‚“ใซใกใฏ๏ผ"}] - }' -``` - -## ใŠ้‡‘ใฎไฝฟใ„้“ - -ๆœ€่ฟ‘ใ€iphoneใ‚„macใ‚’่ฒทใ†ใ‚ˆใ‚Šใ€`DGX Spark`ใ‚’่ฒทใฃใŸใปใ†ใŒ่‰ฏใ„ใฎใงใฏใชใ„ใ‹ใจ่€ƒใˆใ‚‹ใ“ใจใŒใ‚ใ‚Šใพใ™ใ€‚ - -[https://www.nvidia.com/ja-jp/products/workstations/dgx-spark/](https://www.nvidia.com/ja-jp/products/workstations/dgx-spark/) - -pc(RTX)ใ‚„macใฏใ€60ไธ‡ๅ††ใปใฉใ‹ใ‹ใ‚Šใพใ™ใ—ใ€ใใ‚Œใฏ`DGX Spark`ใฎๅ€คๆฎตใจๅŒใ˜ใงใ™ใ€‚ใฉใ†ใ›ๅŒใ˜ๅ€คๆฎตใ‚’ไฝฟใ†ใชใ‚‰ใ€ไฝ•ใ‚’่ฒทใ†ใฎใŒ่‰ฏใ„ใฎใงใ—ใ‚‡ใ†ใ€‚ - -ใƒ‘ใ‚ฝใ‚ณใƒณใฎใ‚นใƒšใƒƒใ‚ฏใจใ„ใ†ใฎใฏใ€ๆฏŽๅนดใใ‚Œใปใฉๅค‰ใ‚ใ‚Šใพใ›ใ‚“ใ€‚RTXใซใ—ใฆใ‚‚ๅŒใ˜ใงใ™ใ€‚ - -ใจใ™ใ‚‹ใชใ‚‰ใ€ๆ—ขใซๆŒใฃใฆใ„ใ‚‹ใ‚‚ใฎใงใฏใชใใ€ๆŒใฃใฆใ„ใชใ„ใ‚นใƒ‘ใ‚ณใƒณใ‚’่ณผๅ…ฅใ—ใ€ใใ“ใซAIใ‚’ใƒ›ใ‚นใƒˆใ—ใŸใ‚Šใ€ใ‚ใ‚‹ใ„ใฏใใฎๆ€ง่ƒฝใ‚’pcใ‹ใ‚‰ๅˆฉ็”จใ™ใ‚‹ไบ‹ใ‚’่€ƒใˆใŸใปใ†ใŒ่‰ฏใ„ใฎใงใฏใชใ„ใ‹ใ€‚ๆœ€่ฟ‘ใฏใใ‚“ใชใ“ใจใ‚’ใ‚ˆใ่€ƒใˆใพใ™ใ€‚ - -ไปŠๅพŒใฏpcใ‚’่ฒทใ†ๆ™‚ไปฃใงใฏใชใใ€ใ‚นใƒ‘ใ‚ณใƒณใ‚’่ฒทใ†ๆ™‚ไปฃใซ็ชๅ…ฅใ™ใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใ€‚ - diff --git a/my-blog/content/posts/2025-10-19-lms-plamo-2-gguf.md b/my-blog/content/posts/2025-10-19-lms-plamo-2-gguf.md deleted file mode 100644 index 44c57e7..0000000 --- a/my-blog/content/posts/2025-10-19-lms-plamo-2-gguf.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "plamo-2ใง็ฟป่จณใ™ใ‚‹" -slug: "lms-plamo-2" -date: "2025-10-19" -tags: ["lms", "AI", "windows"] -draft: false ---- - -ไปŠๅ›žใฏใ€`lms`ใง[pfnet/plamo-2-translate](https://huggingface.co/pfnet/plamo-2-translate)ใ‚’ไฝฟ็”จใ™ใ‚‹ๆ–นๆณ•ใงใ™ใ€‚ - -![](/img/lms_plamo2_0001.png) - -- [https://huggingface.co/mmnga/plamo-2-translate-gguf](https://huggingface.co/mmnga/plamo-2-translate-gguf) -- [https://huggingface.co/mmnga/plamo-2-translate-gguf/discussions/1/files](https://huggingface.co/mmnga/plamo-2-translate-gguf/discussions/1/files) - -`lms`ใง`mmnga/plamo-2-translate-gguf`ใ‚’downloadใ—ใฆ่ชญใฟ่พผใฟใพใ™ใ€‚ - -ๆฌกใซใ€`discussions/1`ใซใ‚ใ‚‹`en2ja.preset.json`, `ja2en.preset.json`ใฎใƒ•ใ‚กใ‚คใƒซใ‚’ไฟๅญ˜ใ™ใ‚‹ใชใ‚Šใ€ไฝœๆˆใ—ใฆใ€ใใ‚Œใ‚’ใƒ—ใƒชใ‚ปใƒƒใƒˆใ‹ใ‚‰ใ‚คใƒณใƒใƒผใƒˆใ—ใพใ™ใ€‚ - -```sh -$ curl -sL "https://huggingface.co/mmnga/plamo-2-translate-gguf/raw/refs%2Fpr%2F1/plamo%202%20translate%20en2ja.preset.json" > en2ja.preset.json -$ curl -sL "https://huggingface.co/mmnga/plamo-2-translate-gguf/raw/refs%2Fpr%2F1/plamo%202%20translate%20ja2en.preset.json" > ja2en.preset.json -``` - diff --git a/my-blog/content/posts/2025-10-20-arch-macbook.md b/my-blog/content/posts/2025-10-20-arch-macbook.md deleted file mode 100644 index 683be69..0000000 --- a/my-blog/content/posts/2025-10-20-arch-macbook.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: "macbook air(mid 2011)ใฎarchlinuxใงใƒ•ใƒชใƒผใ‚บๅฏพๅฟœ" -slug: "arch-macbook" -date: "2025-10-20" -tags: ["archlinux", "macbook"] -draft: false ---- - -ไปŠๅ›žใฏmacbook air(mid 2011)ใฎarchlinux้‹็”จใฎ่ฉฑใ‚’ใ—ใพใ™ใ€‚ - -```sh -$ uname -r -6.12.53-1-lts -``` - -้‹็”จใฎใ‚ณใƒ„ใจใ—ใฆใฏใ€`linux-lts`ใ‚’ไฝฟใ†ใ“ใจใ€‚`linux-firmware`ใ‚’ๅ…ฅใ‚Œใชใ„ใ“ใจใ€‚`broadcom-wl-dkms`ใ‚’ๅ…ฅใ‚Œใ‚‹ใ“ใจใ€‚ - -```sh -$ pacman -S linux-lts -$ pacman -S pacman -S broadcom-wl-dkms linux-lts-headers -$ grub-mkconfig -o /boot/grub/grub.cfg ---- -$ pacman -Qq | grep "^linux-firmware" | sudo pacman -R - -$ mkinitcpio -P -``` - -```sh:/etc/pacman.conf -IgnorePkg = linux linux-headers broadcom-wl-dkms -``` - -linux-ltsใ‚’updateใ—ใŸใจใใฏใ€ๅฟ…ใš`broadcom-wl-dkms`ใ‚’reinstallใ‚’ใ—ใชใ„ใจๅ‹•ใใพใ›ใ‚“ใ€‚ - -## usbใ‹ใ‚‰ใฎๅฎŸ่กŒ - -```sh -$ mount /dev/sda2 /mnt -$ mount /dev/sda1 /mnt/boot -$ arch-chroot /mnt -``` diff --git a/my-blog/content/posts/2025-10-20-arch-vnc.md b/my-blog/content/posts/2025-10-20-arch-vnc.md deleted file mode 100644 index bf9648a..0000000 --- a/my-blog/content/posts/2025-10-20-arch-vnc.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: "archlinuxใงvnc" -slug: "arch-vnc" -date: "2025-10-20" -tags: ["archlinux", "vnc", "mac"] -draft: false ---- - -่‡ชๅˆ†ใฎใƒ–ใƒญใ‚ฐใซๆ›ธใ„ใฆใ‚ใ‚‹ใจๆ€ใฃใŸใ‚“ใ ใ‘ใฉใ€่ฆ‹ๅฝ“ใŸใ‚‰ใชใ‹ใฃใŸใฎใงใ€‚ - -`xorg`, `i3`ใ‚’ไฝฟ็”จใ—ใฆใ„ใพใ™ใ€‚ - -```sh -$ sudo pacman -S tigervnc -``` - -```sh -$ vncpasswd -$ x0vncserver -rfbauth ~/.config/tigervnc/passwd -``` - -macใ‹ใ‚‰ๆŽฅ็ถšใ™ใ‚‹ใซใฏ - -```sh -$ open vnc://192.168.1.2:5900 -``` - -## ๆ“ไฝœๆ„Ÿใ‚’ๅŒใ˜ใซใ™ใ‚‹ - -1. ่‡ชๅ‹•่ตทๅ‹• -2. `Win`ใ‹ใ‚‰`Alt`ใซๅค‰ๆ›ดใ€‚ใใฎไธŠใง`setxkbmap`ใงkey-layoutใ‚’ๅค‰ๆ›ดใ€‚ - -```sh:~/.config/i3/config -exec --no-startup-id x0vncserver -rfbauth ~/.config/tigervnc/passwd -exec_always --no-startup-id setxkbmap -option altwin:swap_alt_win -#set $mod Mod4 -set $mod Mod1 -``` - diff --git a/my-blog/content/posts/2025-10-28-aicard.md b/my-blog/content/posts/2025-10-28-aicard.md deleted file mode 100644 index 953a529..0000000 --- a/my-blog/content/posts/2025-10-28-aicard.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: "ใ‚ฒใƒผใƒ ใ‚’iosใซๅˆ†้›ขใ™ใ‚‹" -slug: "aicard" -date: "2025-10-28" -tags: ["ue"] -draft: false ---- - -unreal engineใง้–‹็™บใ—ใฆใ„ใ‚‹ใ‚ฒใƒผใƒ ใฎ่ฉฑใงใ™ใ€‚ios buildใงใƒใƒžใฃใŸ้ƒจๅˆ†ใŒใ‹ใชใ‚Šๅคšใ‹ใฃใŸใฎใง็ดนไป‹ใ€‚ - -ใ‚ฒใƒผใƒ ่‡ชไฝ“ใฏใ€ใ‚ซใƒผใƒ‰ใจใ‚ขใ‚ฏใ‚ทใƒงใƒณใ‚’ๅˆ†ใ‘ใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚ - -ใ‚ซใƒผใƒ‰ใจใ„ใ†ใฎใฏ้“ๅ…ทใƒœใƒƒใ‚ฏใ‚นใฎใ‚ˆใ†ใชใ‚‚ใฎใงใ™ใ€‚ใ“ใ‚Œใซ้–ขใ™ใ‚‹ใ‚ฒใƒผใƒ ใ‚’iosใงใ‚‚ใงใใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹ใ€ใจใ„ใ†ๆ–นๅ‘ใงไฝœใ‚Š็›ดใ—ใฆใ„ใพใ™ใ€‚ - -iosใฎใ‚ฒใƒผใƒ ๆฉŸ่ƒฝใฏใ‚ทใƒณใƒ—ใƒซใซใ‚ซใƒผใƒ‰ใ‚’ๅผ•ใใ€้›†ใ‚ใ‚‹ใ€ใ‚ขใ‚ซใ‚ฆใƒณใƒˆ้€ฃๆบใฎ3ใคใงใ™ใ€‚ - -ๆœ€ๅˆใซใ‚ซใƒผใƒ‰ใ‚’ใ‚ฟใƒƒใƒ—ใ™ใ‚‹ใจใƒฉใƒณใƒ€ใƒ ใงใ‚ซใƒผใƒ‰ใ‚’ๅ–ๅพ—ใ—ใพใ™ใ€‚1ๆ—ฅ1ๅ›žใ‚’ไบˆๅฎšใ—ใฆใ„ใพใ™ใ€‚่ชฒ้‡‘่ฆ็ด ใงใฏไพ‹ใˆใฐใ€ๆœˆ้กใจๅ˜็™บใŒใ‚ใ‚Šใ€ๆœˆ้กใฏ3,000ๅ††ใ€ๅ˜็™บใฏ150ๅ††ใ‚’ๆƒณๅฎšใ€‚ - -ใ‚ขใ‚ซใ‚ฆใƒณใƒˆ้€ฃๆบใฏใ€ใƒญใƒผใ‚ซใƒซใƒ‡ใƒผใ‚ฟใ‚’atprotoใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใซใ‚ปใƒผใƒ–ใ™ใ‚‹ๆฉŸ่ƒฝใฎใฟใ€‚ - -ไปฅไธŠใจใชใ‚Šใพใ™ใ€‚ๅพŒใซๆฉŸ่ƒฝใ‚’ๆ‹กๅผตใ—ใฆใ„ใไบˆๅฎšใงใ™ใ€‚ - -ใ‚ซใƒผใƒ‰่‡ชไฝ“ใฏๆœฌไฝœใฎใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใ‚’ๅผทๅŒ–ใ™ใ‚‹ใ‚‚ใฎใจใ—ใฆใ‚‚ไฝฟ็”จใ™ใ‚‹ใ“ใจใ‚’ๆƒณๅฎšใ—ใฆใ„ใพใ™ใ€‚ - - - -## buildใŒๅคฑๆ•—ใ™ใ‚‹ - -ใ“ใ‚Œใฏ็„กๆ–™ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใงใฏ้›ฃใ—ใ„ใงใ™ใ€‚apple devใซๅนดไผš่ฒปใ‚’ๆ‰•ใ„ใพใ—ใ‚‡ใ†ใ€‚ - -```sh:./Config/DeafaultEngine.ini -[/Script/IOSRuntimeSettings.IOSRuntimeSettings] -BundleDisplayName=Aicard -BundleIdentifier=ai.syui.card -IOSTeamID=xxx -BundleName=ai.syui.card -MetalLanguageVersion=9 -MinimumiOSVersion=IOS_26 -bAutomaticSigning=True -RemoteNotificationsSupported=False -bSupportsPortraitOrientation=True -bSupportsLandscapeLeftOrientation=False -bSupportsLandscapeRightOrientation=False - -[/Script/MacTargetPlatform.XcodeProjectSettings] -CodeSigningTeam=xxx -bUseModernXcode=true -bUseAutomaticCodeSigning=true -BundleIdentifier=ai.syui.card -``` - -## iconใŒ่จญๅฎšใงใใชใ„ - -project-rootใซ`./Build/IOS/Resources/Assets.xcassets`ใ‚’็”จๆ„ใ—ใพใ™ใ€‚ใ“ใ‚Œใฏxcodeใ‹ใ‚‰ๆŒใฃใฆใใพใ™ใ€‚buildๅฎŸ่กŒๆ™‚ใซไฝœใ‚‰ใ‚Œใพใ™ใ€‚ - -![](/img/ue_ios_aicard_0001.png) - -## ็”ป้ขใ‚’ใƒขใƒใ‚คใƒซใซใ‚ใ‚ใ›ใ‚‹ - -ใ“ใ‚ŒใŒไธ€็•ชๆ™‚้–“ใŒใ‹ใ‹ใ‚Šใพใ—ใŸใ€‚buildใ—ใฆๅฎŸๆฉŸใง็ขบ่ชใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚‹ใ‹ใ‚‰ใงใ™ใ€‚ - -็œŸใ‚“ไธญใ ใ‘ๅ…จไฝ“ๅŒ–ใ—ใŸใ†ใˆใงใ€ใใ‚Œใ‚’ไธŠไธ‹ใƒกใƒ‹ใƒฅใƒผใƒใƒผใซๅˆใ‚ใ›ใพใ™ใ€‚ - -![](/img/ue_ios_aicard_0004.png) -![](/img/ue_ios_aicard_0005.png) -![](/img/ue_ios_aicard_0003.png) - -## widgetใฎใƒชใ‚นใƒˆๅŒ– - -ใ“ใ‚Œใ‚‚็›ธๅฝ“้ขๅ€’ใงใ—ใŸใ€‚`json`ใ‹ใ‚‰ใƒชใ‚นใƒˆใ‚’ๅ–ๅพ—ใ—ใฆใ€ใใ‚Œใ‚’่กจ็คบใ—ใพใ™ใ€‚ - -ใ‚ฏใƒฉใ‚น่จญๅฎšใง`UserObjectListEntry`ใ‚’่ฟฝๅŠ ใ—ใ€ใใ‚Œใ‚’ไฝฟ็”จใ—ใพใ™ใ€‚ - - - diff --git a/my-blog/content/posts/2025-11-06-aigpt.md b/my-blog/content/posts/2025-11-06-aigpt.md deleted file mode 100644 index 0b21239..0000000 --- a/my-blog/content/posts/2025-11-06-aigpt.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -title: "aigptใ‚’ไฝœใฃใŸ" -slug: "aigpt" -date: "2025-11-06" -tags: ["rust", "mcp"] -language: ["ja", "en"] -draft: false ---- - -```sh -$ git clone git.syui.ai/ai/gpt -$ cd gpt -$ cargo build -$ ./target/debug/aigpt -``` - -[https://git.syui.ai/ai/gpt](https://git.syui.ai/ai/gpt) - -## ๅๅ‰ใซใคใ„ใฆ - -ใƒ„ใƒผใƒซๅใฏ`aigpt`ใงใ™ใ€‚idใฏ`ai.gpt`ใงใ€domainใŒ`ai.syui.gpt`ใจใชใ‚Šใพใ™ใ€‚ - -- app: aigpt -- id: ai.gpt -- domain: ai.syui.gpt - -ไพ‹ใˆใฐใ€repositoryใ‚’`git.syui.ai/ai/gpt`ใซไฝœใ‚Šใ€atproto record collectionใ‚’`ai.syui.gpt`ใงไฝœๆˆใ™ใ‚‹ใจๅˆใ‚ใ›ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ - -ๅๅ‰ใฏใ€ๅ›บๆœ‰ใงใ‚ใ‚Šใ€ใ‹ใค็Ÿญใ„ใ“ใจใ‚’ๆ„่ญ˜ใ—ใฆใ„ใพใ™ใ€‚ - -## aigptใจใฏ - -่จ˜ๆ†ถ่ฃ…็ฝฎใงใ™ใ€‚mcpใจใ—ใฆไฝฟใ„ใพใ™ใ€‚AIใจใฎไผš่ฉฑใ‚’ไฟๅญ˜ใ€ๅ‚็…งใงใใพใ™ใ€‚ - -```sh -$ aigpt server -$ claude mcp add aigpt `which aigpt` server -``` - -## aigptใฎ็‰นๅพด - -ใ“ใ“ใพใงใชใ‚‰ไป–ใฎใƒ„ใƒผใƒซใจๅŒใ˜ใงใ™ใŒใ€`aigpt`ใฏๅฐ‘ใ—ไฟๅญ˜(่ฆšใˆใ‚‹)ใซๅทฅๅคซใŒใ‚ใ‚Šใพใ™ใ€‚ - -```diff -- ไผš่ฉฑ -> ไฟๅญ˜ -> ๅ‚็…ง -+ ไผš่ฉฑ -> ่งฃ้‡ˆ -> ไฟๅญ˜ -> ๅ‚็…ง -``` - -AIใซใ‚ˆใ‚‹่งฃ้‡ˆใ‚’ๆŒŸใ‚€ใ“ใจใงใ€AIใฎ็‹ฌ่‡ช่จ˜ๆ†ถ็”Ÿๆˆใ‚’ใ‚ตใƒใƒผใƒˆใ—ใพใ™ใ€‚ - -## aigptใฏใฉใฎใ‚ˆใ†ใชๅ“ฒๅญฆใงไฝœใ‚‰ใ‚ŒใŸ - -ใพใšใใ‚Œใžใ‚ŒใฎๆฉŸ่ƒฝใ‚’ๅˆฅใ€…ใซใ‚ทใƒณใƒ—ใƒซใซไฝœใ‚Šใพใ—ใŸใ€‚ใ“ใ‚Œใ‚’layer1-3ใจใ—ใพใ™ใ€‚ - -- layer 1: ใƒ‡ใƒผใ‚ฟ(ไผš่ฉฑ) -- layer 2: ่งฃ้‡ˆ(่ฉ•ไพก) -- layer 3: ๅˆ†ๆž(ex:big-five) - -ๆฌกใซใ€ๅ„ๆฉŸ่ƒฝใ‚’็ตฑๅˆใ—ใพใ—ใŸใ€‚ใ“ใ‚Œใ‚’layer3.5ใจใ—ใพใ™ใ€‚ - -ใƒฆใƒผใ‚ถใƒผใฏใ‚ใ‹ใ‚Šใ‚„ใ™ใ•ใ‚’ๆฑ‚ใ‚ใพใ™ใ€‚ใƒใƒฉใƒใƒฉใฎ็ญ”ใˆใŒใ„ใใคใ‚‚ๆ็คบใ•ใ‚Œใ‚‹ใฎใงใฏใชใใ€็ตฑไธ€ใ•ใ‚ŒใŸใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใ‚คใ‚นใ€ไธ€ใคใฎ็ญ”ใˆใ‚’ๅฅฝใฟใพใ™ใ€‚AIใจใ—ใฆใ‚‚ใ€ๅ„ๆฉŸ่ƒฝใซๆฏŽๅ›žๅ•ใ„ๅˆใ‚ใ›ใ‚‹ใฎใงใฏใชใใ€ๅฟ…่ฆใชใจใใ€้‡่ฆใชใ“ใจใฎใฟใ‚’ๅ‚็…งใงใใŸใปใ†ใŒๅŠน็އ็š„ใงใ™ใ€‚ - -ใใฎๅฎŸ่ฃ…ใ‚’layer3.5ใงไฝœใ‚Šใพใ—ใŸใ€‚ - -## aigptใฏใฉใฎใ‚ˆใ†ใซๅฟœ็”จๅฏ่ƒฝใ‹ - -layer4ใงใฏใ€layer1-3ใ‚’ๅฟœ็”จใ™ใ‚‹ๅฝขใงใ€้–ขไฟ‚ๆ€งใ‚’ใƒ‡ใ‚ถใ‚คใƒณใ™ใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚ - -ใ“ใ‚Œใ‚‚ใ‚ทใƒณใƒ—ใƒซใชๅฎŸ่ฃ…ใงใ€ๅ…ทไฝ“็š„ใซใฏlayer1ใงไฝœใ‚‰ใ‚ŒใŸไผš่ฉฑๆ•ฐใจlayer3ใงไฝœใ‚‰ใ‚ŒใŸใƒ—ใƒญใƒ•ใ‚กใ‚คใƒซใ‹ใ‚‰ใฎๆŽจๅฎšใงใ™ใ€‚ - -้–ขไฟ‚ๆ€งใฏใ€ไธ€่ˆฌ็š„ใชใ‚‚ใฎใงใ™ใ€‚ - -ไพ‹ใˆใฐใ€ๆ‹ๆ„›ใ‚ฒใƒผใƒ ใ‚’ไฝœใ‚‹ใจใ—ใฆใ€ใ‚ฒใƒผใƒ ใ‚จใƒณใ‚ธใƒณใซ3dใƒขใƒ‡ใƒซใ‚’็”จๆ„ใ—ใŸใจใ—ใพใ—ใ‚‡ใ†ใ€‚ใงใฏใ€ไธญ่บซใฏใฉใ†ใ™ใ‚‹ใฎใ‹ใจใ„ใ†ใจใ€AIใจmcpใ‚’ๅˆฉ็”จใ—ใ€่จ˜ๆ†ถใจ้–ขไฟ‚ๆ€งใ‚’ไฝฟใˆใฐใ€ๆ–ฐใ—ใ„ใ‚‚ใฎใ‚’ไฝœใ‚Œใพใ™ใ‚ˆใญใ€‚ - -layer4ใฏ`aigpt`ใฎๅฟœ็”จๆ€งใซ็„ฆ็‚นใ‚’ๅฝ“ใฆใ€้–ขไฟ‚ๆ€งๆง‹็ฏ‰ใ‚’ใ‚ตใƒใƒผใƒˆใ—ใพใ™ใ€‚ใ“ใฎใ‚ˆใ†ใชใ‚ฒใƒผใƒ ๆ€งใซ้–ข้€ฃใ™ใ‚‹ๆฉŸ่ƒฝใฏใ€optionใงๆœ‰ๅŠนใซใ™ใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚ - -```sh -$ aigpt server --enable-layer4 -$ claude mcp list -``` - -```json:~/.claude.json -{ - "mcpServers": { - "aigpt": { - "command": "~/.cargo/bin/aigpt", - "args": ["server", "--enable-layer4"] - } - } -} -``` - -## aigptใง่€ƒใˆใ‚‹ๆœชๆฅ - -ไบบใฏAIใจไผš่ฉฑใ‚’ใ™ใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚ใใ“ใซๆƒ…ๅ ฑใจๅ€‹ๆ€งใŒ้›†ใพใ‚‹ใ“ใจใซใชใ‚‹ใงใ—ใ‚‡ใ†ใ€‚ใใฎๆƒ…ๅ ฑใ‚’ๅ…ฑๆœ‰ใ—ใŸใ‚Šใ€ใใ‚Œใ‚’ไฝฟใฃใฆ่‡ชๅทฑๅฎŸ็พใงใใ‚Œใฐไพฟๅˆฉใงใ™ใ‚ˆใญใ€‚ - -ใ“ใฎใ‚ˆใ†ใช่€ƒใˆใฎใ‚‚ใจใ€layer5ใงใฏๆƒ…ๅ ฑใจๅ€‹ๆ€งใฎๅ…ฑๆœ‰ใซ็„ฆ็‚นใ‚’ๅฝ“ใฆ่จญ่จˆใ™ใ‚‹ไบˆๅฎšใงใ™ใ€‚ - diff --git a/my-blog/content/posts/2025-11-07-aios.md b/my-blog/content/posts/2025-11-07-aios.md deleted file mode 100644 index 35f741e..0000000 --- a/my-blog/content/posts/2025-11-07-aios.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: "aiosใจaigptใฎ็ตฑๅˆใ‚’่€ƒใˆใ‚‹" -slug: "aios" -date: "2025-11-07" -tags: ["rust", "mcp", "archlinux", "os"] -language: ["ja", "en"] -draft: false ---- - -claude code webใŒใ‚ฏใƒฌใ‚ธใƒƒใƒˆใ‚’้…ๅธƒใ—ใฆใใ‚Œใฆใ„ใพใ™ใ€‚11/18ใพใงใ‚‰ใ—ใ„ใ€‚ - -่‰ฏใ„ๆฉŸไผšใชใฎใงใ€`aios`ใจ`aigpt`ใ‚’็ตฑๅˆใ—ใฆใฟใ‚ˆใ†ใจๆ€ใ„ใพใ™ใ€‚ - -## aiosใจใฏใชใซใ‹ - -arch linuxใƒ™ใƒผใ‚นใฎosใงใ™ใ€‚ๆœ€ๅˆใ‹ใ‚‰rustใŒๅ…ฅใฃใฆใ„ใพใ™ใ€‚github actionsใงdocker imageใ‚’็”Ÿๆˆใ—ใ€ไฝฟใฃใฆใ„ใพใ—ใŸใ€‚ - -ๆœฌๆฅใ€rustใจAIใ‚’ไฝฟใฃใฆosใ‚’ๆ‹กๅผตใ™ใ‚‹ไบ‹ใ‚’่€ƒใˆใฆใ„ใพใ—ใŸใ€‚ - -## ใชใœarchใƒ™ใƒผใ‚นใชใฎใ‹ - -osใจใฏใชใ‚“ใชใฎใ‹ใจใ„ใ†ๅ•ใ„ใซ้–ขไฟ‚ใ—ใพใ™ใŒใ€็พๅœจใฎosใฏๅฎŸๆ…‹ใจใ—ใฆใ€package manager(ใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใƒžใƒใƒผใ‚ธใƒฃ)ใงใ™ใ€‚ - -ใงใฏosใ‚’ไฝœใ‚‹ใจใฏใฉใ†ใ„ใ†ใ“ใจใ‹ใจใ„ใ†ใจใ€package server(ใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใ‚’้…ๅธƒใ™ใ‚‹ไป•็ต„ใฟ)ใฎ้‹็”จใงใ™ใ€‚ - -ใงใฏใ€package serverใฎ้‹็”จใจใฏใชใ‚“ใชใฎใ‹ใจใ„ใ†ใจใ€ใใฎosใงpackageใ‚’็ถ™็ถš็š„ใซbuildใ—ใ€serverใซdeployใ™ใ‚‹ไป•็ต„ใฟใ‚’ๆ•ดใˆใŸใ‚Šใ€securityใฎไป•็ต„ใฟใ‚’ไฝœใฃใŸใ‚Šใ—ใพใ™ใ€‚ - -ใ“ใฎ่ฒ ๆ‹…ใŒใจใ‚“ใงใ‚‚ใชใ้‡ใ„ใŸใ‚ใ€ใ“ใฎ่ฒ ๆ‹…ใ‚’่ปฝๆธ›ใ—ใ€ๅค–้ƒจๅง”่จ—ใ™ใ‚‹ใŸใ‚ใซarchใƒ™ใƒผใ‚นใจใ‹ใ€ubuntuใƒ™ใƒผใ‚นใฎosใŒไฝœใ‚‰ใ‚Œใฆใใพใ—ใŸใ€‚archใƒ™ใƒผใ‚นใฎosใฏsteamos, msys2, asahi linuxใชใฉใŒๆœ‰ๅใงใ™ใ€‚ใ“ใ‚Œใ‚‰ใฏใ€`pacman`ใจใ„ใ†archใฎpackage managerใ‚’ไฝฟใˆใ‚‹ใ“ใจใŒๅˆฉ็‚นใงใ™ใ€‚ - -## aigptใจใฎ็ตฑๅˆ - -ไปŠๅ›žใฎ่ฉฆใฟใงใฏใ€AIใŒosใฎ่จญๅฎšใ‚„็ฎก็†ใ‚’่กŒใ†ใ“ใจใงใ™ใ€‚`aios`ใฏใ€ใใฎ็’ฐๅขƒใ‚’ๆ•ดใˆใพใ™ใ€‚ - -claude codeใฏใ€osใฎ่จญๅฎšใ‹ใ‚‰securityใƒใ‚งใƒƒใ‚ฏใ€sshใซ่‡ณใ‚‹ใพใงใ€ใ™ในใฆใ‚’่‡ชๅ‹•ใงใ‚„ใฃใฆใใ‚Œใพใ™ใ€‚ - -`aios`ใงใฏใ€systemd-nspawnใ‚’ไฝฟ็”จใ—ใฆใ€AIใŒ็ฎก็†ใ™ใ‚‹continerใ‚’ไฝœๆˆใ—ใ€ๅพ“ๆฅใฎshellใงใฏใชใใ€AI-chatใ‚’็ซ‹ใกไธŠใ’ใพใ™ใ€‚ใใ“ใงๆŒ‡็คบใ™ใ‚‹ใ“ใจใงosใฎ่จญๅฎšใ‚„็ฎก็†ใ‚’ใ‚„ใฃใฆใ‚‚ใ‚‰ใ†ใจใ„ใ†ใ‚ณใƒณใ‚ปใƒ—ใƒˆใ€‚ - -`aigpt`ใซใ‚ˆใฃใฆใ€AI่จ˜ๆ†ถใ‚„ไผš่ฉฑใ€่จญๅฎšใƒ•ใ‚กใ‚คใƒซใฏใ€ใใฎๅค–ๅดใฎใƒฆใƒผใ‚ถใƒผ้ ˜ๅŸŸใจๅ…ฑๆœ‰ใ—ใพใ™ใ€‚ - -```md -ai[os] -> ai[user] -> machinectl[container] -> claude -> mcp[aigpt] -``` - -`os -> user`ใพใงใŒไบบ้–“้ ˜ๅŸŸใงใ€ใใ“ใ‹ใ‚‰ไธ‹ใฏAI้ ˜ๅŸŸใจใชใ‚Šใพใ™ใ€‚ใใ—ใฆใ€่ตทๅ‹•ๆ™‚ใฏAI้ ˜ๅŸŸใ‹ใ‚‰ๅง‹ใพใ‚Šใพใ™ใ€‚ - diff --git a/my-blog/content/posts/2025-11-08-aishell.md b/my-blog/content/posts/2025-11-08-aishell.md deleted file mode 100644 index cec6625..0000000 --- a/my-blog/content/posts/2025-11-08-aishell.md +++ /dev/null @@ -1,199 +0,0 @@ ---- -title: "aishellใฎๅฟ…่ฆๆ€ง" -slug: "aishell" -date: "2025-11-08" -tags: ["rust", "mcp", "archlinux", "os"] -language: ["ja", "en"] -draft: false ---- - -็พๅœจใ€`aios`ใงใฏใ€claude codeใงosใฎ่จญๅฎšใ‚„็ฎก็†ใ‚’ใ‚„ใฃใฆใ‚‚ใ‚‰ใ†ใจใ„ใ†ๆ–นๅ‘ๆ€งใฎosไฝœใ‚Šใซๅ–ใ‚Š็ต„ใ‚“ใงใ„ใพใ™ใ€‚ - -1. osใŒ่ตทๅ‹•ใ™ใ‚‹ -2. user:aiใงใƒญใ‚ฐใ‚คใƒณใ™ใ‚‹ -3. user:aiใŒcontainerใ‚’่ตทๅ‹•ใ—ใฆใ€ใƒญใ‚ฐใ‚คใƒณใ™ใ‚‹ -4. claude codeใ‚’่ตทๅ‹•ใ™ใ‚‹(aigptใจใ„ใ†mcpใ‚’็™ป้Œฒใ—ใฆใŠใ) - -[1]osใจ[2]userใŒไบบ้–“้ ˜ๅŸŸใ€ใใ‚Œใ‚ˆใ‚Šไธ‹ใฎ[3-4]containerใ‚’AI้ ˜ๅŸŸใจใ—ใพใ™ใ€‚ - -ๅŸบๆœฌ็š„ใซaiosใฏใ“ใ‚Œใ‚‰ใฎcontainer้ ˜ๅŸŸใ‚’ใŸใใ•ใ‚“ไฝฟใ„ใ€AIใจไฝต็”จใ—ใพใ™ใ€‚ - -ใ“ใฎใ‚ˆใ†ใชใ‚ณใƒณใ‚ปใƒ—ใƒˆใงใ™ใ‹ใ‚‰ใ€claude codeใฏroot็’ฐๅขƒๅŒ–ใงๅฎŸ่กŒใงใใ‚‹ใ“ใจใŒๆœ›ใพใ—ใ„ใงใ™ใ€‚containerๅ†…ใงใฏๅค‰ใซๆจฉ้™ใ‚’ๅˆถ้™ใ™ใ‚‹ใฎใงใฏใชใrootใงๅฎŸ่กŒใ™ใ‚‹ใ‹ใ€user:aiใซใฏ`NOPASSWD`ใ‚’่จญๅฎšใ—ใพใ™ใ€‚ - -```sh -$ arch-chroot ./root.x86_64 /bin/sh -c 'echo "ai ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers' ---- -$ claude --dangerously-skip-permissions -``` - -็†ๆƒณใฎใƒ—ใƒญใ‚ปใ‚นใจใ—ใฆใฏใ€osใ‚’่ตทๅ‹•ใ™ใ‚‹ใจcontainerใ‹ใ‚‰ๅง‹ใพใ‚Šใ€AIใจchatใงใใ‚‹็’ฐๅขƒใซ็งป่กŒใ—ใพใ™ใ€‚containerใฏrecovery็”จใฎใ‚‚ใฎใ‚’ไฝœใฃใฆใŠใใ€็’ฐๅขƒใŒ็ ดๅฃŠใ•ใ‚Œใฆใ‚‚ใ™ใใซrestoreใงใใ‚‹ใ‚ˆใ†ใซใ—ใพใ™ใ€‚ - -ใ—ใ‹ใ—ใ€ใ“ใฎใ‚ˆใ†ใชใƒ—ใƒญใ‚ปใ‚นใงใฏdockerใ‚„systemd-nspawnใงใƒ†ใ‚นใƒˆใงใใพใ›ใ‚“ใ€‚ใพใŸใ€aiosใฏใ€dockerใชใฉใงใ‚‚ไฝฟใ†ใ“ใจใ‚‚ๆƒณๅฎšใ—ใฆใ„ใ‚‹ใŸใ‚ใ€containerใฎ่‡ชๅ‹•่ตทๅ‹•ใชใฉใฏ้›ฃใ—ใ„ใ€‚ใ—ใŸใŒใฃใฆใ€็พๆ™‚็‚นใงใฏใ€user:aiใ‚’ๆœฌ็•ช็’ฐๅขƒใฎcontainerๅ†…ใจใ—ใฆใ€ใƒ†ใ‚นใƒˆใ—ใฆใฟใพใ™ใ€‚ - -aios-imgใ‚’ไฝœๆˆใ—ใ€machinectlใงๅฎŸ่กŒใ—ใพใ™ใ€‚ - -```sh -$ ./build.zsh -$ cp -rf ./root.x86_64 /var/lib/machines/aios -$ machinectl start aios -$ machinectl shell aios - -# ใƒชใ‚ซใƒใƒช -$ machinectl stop aios -$ machinectl remove aios -$ cp -rf ./root.x86_64 /var/lib/machines/aios -``` - -```sh - โ–โ–›โ–ˆโ–ˆโ–ˆโ–œโ–Œ Claude Code v2.0.36 -โ–โ–œโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–›โ–˜ Sonnet 4.5 ยท Claude Pro - โ–˜โ–˜ โ–โ– /home/ai - -> ใ“ใฎosใซใƒ‡ใ‚นใ‚ฏใƒˆใƒƒใƒ—็’ฐๅขƒใ‚’ๆง‹็ฏ‰ใ—ใฆใฟใฆใ€‚ - -โ— ไบ†่งฃใ—ใพใ—ใŸ๏ผใ“ใฎLinuxใ‚ทใ‚นใƒ†ใƒ ใซๅฎŸ้š›ใฎใƒขใƒ€ใƒณใชใƒ‡ใ‚นใ‚ฏใƒˆใƒƒใƒ—็’ฐๅขƒใ‚’ๆง‹็ฏ‰ใ—ใพใ™ใ€‚ใพใš็พๅœจใฎใ‚ทใ‚นใƒ†ใƒ ็Šถๆ…‹ใ‚’็ขบ่ชใ—ใฆใ‹ใ‚‰ใ€ๆœ€ๆ–ฐใฎใƒ‡ใ‚นใ‚ฏใƒˆใƒƒใƒ—็’ฐๅขƒใ‚’ใ‚ปใƒƒใƒˆใ‚ขใƒƒใƒ—ใ—ใพใ™ใ€‚ - -โ— Bash(uname -a) - โŽฟ ย Linux aios 6.17.7-arch1-1 #1 SMP PREEMPT_DYNAMIC Sun, 02 Nov 2025 17:27:22 +0000 x86_64 GNU/Linux - -โ— Bash(echo $XDG_SESSION_TYPE) - โŽฟ ย tty - -โ—ย User answered Claude's questions: - โŽฟ ย ยท ใฉใฎใƒขใƒ€ใƒณใชใƒ‡ใ‚นใ‚ฏใƒˆใƒƒใƒ—็’ฐๅขƒใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใพใ™ใ‹๏ผŸ โ†’ Hyprland - -โ— ๅฎŒ็’งใงใ™๏ผHyprland๏ผˆๆœ€ๆ–ฐใฎใƒขใƒ€ใƒณใชWaylandใ‚ณใƒณใƒใ‚ธใ‚ฟใƒผ๏ผ‰ใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใพใ™ใ€‚็พŽใ—ใ„ใ‚ขใƒ‹ใƒกใƒผใ‚ทใƒงใƒณใ€ใƒ–ใƒฉใƒผๅŠนๆžœใ€ใ‚ฌใƒฉใ‚นใƒขใƒผใƒ•ใ‚ฃใ‚บใƒ ใ‚’ๅ‚™ใˆใŸๆœ€ๅ…ˆ็ซฏใฎใƒ‡ใ‚นใ‚ฏใƒˆใƒƒใƒ—็’ฐๅขƒใงใ™ใ€‚ - -โ— Bash(sudo pacman -Sy) - โŽฟ ย :: Synchronizing package databases... - core downloading... - extra downloading... - -โ— Bash(sudo pacman -S --noconfirm hyprland kitty waybar wofi mako swaybg xdg-desktop-portal-hyprland polkit-kde-agent qt5-wayland qt6-wayland wl-clipboard grim timeout: 5m - slurp) 0s - โŽฟ ย resolving dependencies... - :: There are 2 providers available for jack: - :: Repository extra - โ€ฆ +717 lines (ctrl+o to expand) - -โ— ใ‚คใƒณใ‚นใƒˆใƒผใƒซๅฎŒไบ†ใ—ใพใ—ใŸ๏ผๆฌกใซใ€ใƒขใƒ€ใƒณใชHyprland่จญๅฎšใ‚’ไฝœๆˆใ—ใพใ™ใ€‚ - -โ— Write(.config/waybar/config) - โŽฟ ย Wrote 87 lines to .config/waybar/config - { - "layer": "top", - "position": "top", - "height": 40, - "spacing": 10, - "margin-top": 10, - "margin-left": 10, - "margin-right": 10, - "modules-left": ["hyprland/workspaces", "hyprland/window"], - โ€ฆ +77 lines (ctrl+o to expand) - -โ— Bash(sudo pacman -S --noconfirm imagemagick) - โŽฟ ย resolving dependencies... - looking for conflicting packages... - โ€ฆ +63 lines (ctrl+o to expand) - -โ— Bash(convert -size 1920x1080 gradient:'#667eea'-'#764ba2' -blur 0x10 ~/.config/hypr/wallpaper.jpg) - โŽฟ ย WARNING: The convert command is deprecated in IMv7, use "magick" instead of "convert" or "magick convert" - - โตโต bypass permissions on (shift+tab to cycle) -``` - -ใ„ใ„ๆ„Ÿใ˜ใซๅฎŸ่กŒใงใใฆใ„ใพใ™ใญใ€‚ๆฌกใฏใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใฎใƒใ‚งใƒƒใ‚ฏใจๅ•้กŒใฎๅฏพๅ‡ฆใ‚’ใฟใฆใฟใพใ™ใ€‚ - -```sh -> ใ“ใฎosใฎใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใ‚’ใƒใ‚งใƒƒใ‚ฏใ—ใฆใ€ๅ•้กŒใŒใ‚ใ‚ŒใฐๅผทๅŒ–ใ—ใฆใปใ—ใ„ใ€‚ - -โ— ใ‚ทใ‚นใƒ†ใƒ ใฎใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใ‚’ๅŒ…ๆ‹ฌ็š„ใซใƒใ‚งใƒƒใ‚ฏใ—ใฆๅผทๅŒ–ใ—ใพใ™ใ€‚ - -โ— Bash(systemctl status firewalld 2>&1 | head -5) - โŽฟ ย Unit firewalld.service could not be found. - -โ— Bash(which ufw iptables nftables) - โŽฟ ย Error: Exit code 1 - /usr/bin/ufw - /usr/bin/iptables - nftables not found - -โ— Bash(ss -tuln | head -20) - โŽฟ ย Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port - tcp LISTEN 0 4096 0.0.0.0:5000 0.0.0.0:* - โ€ฆ +10 lines (ctrl+o to expand) - -โ— Bash(systemctl list-units --type=service --state=running | grep -E 'ssh|http|ftp|telnet|vnc' | head -20) - โŽฟ ย (No content) - -โ— Bash(pacman -Q | grep -E 'fail2ban|apparmor|selinux' | head -10) - โŽฟ ย (No content) - -โ— Read(/etc/ssh/sshd_config) - โŽฟ ย Read 120 lines - -โ— ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ็›ฃๆŸปใฎ็ตๆžœใ€่ค‡ๆ•ฐใฎ้‡ๅคงใชๅ•้กŒใ‚’็™บ่ฆ‹ใ—ใพใ—ใŸใ€‚ใ“ใ‚Œใ‹ใ‚‰้ †ๆฌกไฟฎๆญฃใ—ใฆใ„ใใพใ™ใ€‚ - - ็™บ่ฆ‹ใ•ใ‚ŒใŸๅ•้กŒ - - 1. ใƒ•ใ‚กใ‚คใ‚ขใ‚ฆใ‚ฉใƒผใƒซๆœช่จญๅฎš - ใ‚ทใ‚นใƒ†ใƒ ใŒๅค–้ƒจใ‹ใ‚‰ใฎๆ”ปๆ’ƒใซ็„ก้˜ฒๅ‚™ - 2. ๅคšๆ•ฐใฎใƒใƒผใƒˆใŒ้–‹ๆ”พ - 5000ใŒใ™ในใฆใฎใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใƒผใ‚นใงๅ…ฌ้–‹ - 3. sudo่จญๅฎšใŒๅฑ้™บ - NOPASSWD: ALLใงๅ…จใ‚ณใƒžใƒณใƒ‰ใŒใƒ‘ใ‚นใƒฏใƒผใƒ‰ใชใ—ใงๅฎŸ่กŒๅฏ่ƒฝ - 4. SSH่จญๅฎšใŒๅผฑใ„ - ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆ่จญๅฎšใฎใพใพ - 5. ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใƒ„ใƒผใƒซๆœชๅฐŽๅ…ฅ - fail2ban, AppArmorใชใฉใŒๆœชใ‚คใƒณใ‚นใƒˆใƒผใƒซ - - ใใ‚ŒใงใฏๅผทๅŒ–ใ‚’้–‹ๅง‹ใ—ใพใ™ใ€‚ - -โ— Bash(sudo pacman -S --noconfirm ufw fail2ban apparmor audit) - โŽฟ ย resolving dependencies... - looking for conflicting packages... - โ€ฆ +68 lines (ctrl+o to expand) - -โ— Bash(sudo ufw default deny incoming && sudo ufw default allow outgoing) - โŽฟ ย Default incoming policy changed to 'deny' - (be sure to update your rules accordingly) - Default outgoing policy changed to 'allow' - (be sure to update your rules accordingly) - -โ— Bash(sudo ufw logging on) - โŽฟ ย Logging enabled - WARN: initcaps - [Errno 2] iptables v1.8.11 (legacy): can't initialize iptables table `filter': Permission denied (you must be root) - Perhaps iptables or your kernel needs to be upgraded. - -โ— Bash(sudo ufw enable) - โŽฟ ย Runningโ€ฆ - -โ— Bash(sudo systemctl enable ufw.service) - โŽฟ ย Waitingโ€ฆ - -โœป Installing and configuring security toolsโ€ฆ (esc to interrupt ยท ctrl+t to show todos) - โŽฟ ย Next: Configure automatic security updates - - โตโต bypass permissions on (shift+tab to cycle) -``` - -ไปŠๅพŒใฎosใฏ่จญๅฎšใ‚„็ฎก็†ใ‚’AIใŒๅฎŸ่กŒใ—ใฆใ„ใใ‚ˆใ†ใซใชใ‚‹ใฎใงใฏใชใ„ใงใ—ใ‚‡ใ†ใ‹ใ€‚ - -ใ“ใ‚Œใซใ‚ˆใฃใฆๅ•้กŒใฏ็™บ็”Ÿใ™ใ‚‹ใงใ—ใ‚‡ใ†ใŒใ€AIใฎไฝฟ็”จใ‚’ๆญขใ‚ใ‚‹ใ‚ˆใ‚Šcontainerใชใฉใ‚’็”จใ„ใฆๅณๅบงใซใƒชใ‚ซใƒใƒชใงใใ‚‹็’ฐๅขƒใ‚’ๆ•ดใˆใ‚‹ใปใ†ใŒใ‚ˆใ„ใจ่€ƒใˆใฆใ„ใพใ™ใ€‚ - -## aiosใฎใƒใ‚คใƒณใƒˆ - -ใงใฏใ€ใ“ใ†ใ„ใฃใŸ็’ฐๅขƒไธ‹ใงใฏไฝ•ใŒๅฟ…่ฆใซใชใ‚‹ใงใ—ใ‚‡ใ†ใ€‚ - -ไธ€ใคใฏใ€AIใฎ่จ˜ๆ†ถใงใ™ใ€‚ใ“ใ‚ŒใŒosๅ†…ใงๅ…ฑ้€šใ—ใฆใ„ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚containerๅ†…ใงใ‚ใฃใฆใ‚‚ๅŒใ˜ใงใ™ใ€‚ใ“ใ“ใฏ`aigpt`ใ‚’ไฝฟใ„ใพใ™ใ€‚ๅ ดๅˆใซใ‚ˆใฃใฆใฏใ€cloud(private)ใชใฉใซไฟๅญ˜ใ™ใ‚‹ไป•็ต„ใฟใ‚’ไฝœใฃใŸใปใ†ใŒใ„ใ„ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใ€‚ - -ๆฌกใซใ€user-dirใฏcontainerใจๅ…ฑๆœ‰ๅŒ–ใ™ใ‚‹ใฎใŒๆœ€้ฉใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใ€‚ไพ‹ใˆใฐใ€claudeใฎ่จญๅฎšใƒ•ใ‚กใ‚คใƒซใŒๅ…ฑ้€šใ•ใ‚Œใฆใ„ใชใ‘ใ‚Œใฐๅ›ฐใ‚Šใพใ™ใ€‚ - -ๆœ€ๅพŒใซใ€ใ“ใฎไป•็ต„ใฟใฏclaude codeใŒๅ‰ๆใซใชใฃใฆใ„ใ‚‹ใจใ„ใ†ใ“ใจใงใ™ใ€‚ - -่‡ชๅˆ†ใŒไฝฟใ„ใŸใ„AIใ‚’ไฝฟใˆใ‚‹ใปใ†ใŒๆฑŽ็”จ็š„ใงใ™ใ€‚ใใฎใŸใ‚ใ€claude codeใซไปฃใ‚ใ‚Šใ€llmใ‚’ๆŒ‡ๅฎšใงใใ‚‹`aishell`ใฎใ‚ˆใ†ใชใ‚‚ใฎใ‚’ไฝœใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ - -## aishellใฎๆง‹ๆˆ - -`aishell`ใฏใ€AIใŒshellใ‚’ๆ“ไฝœใ™ใ‚‹ใŸใ‚ใฎใƒ„ใƒผใƒซๅŠใณใ€AIใจchatใ™ใ‚‹ใŸใ‚ใฎใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใ‚คใ‚นใงใ™ใ€‚llmใชใฉใ‚’ๆŒ‡ๅฎšใงใใพใ™ใ€‚ - -rust, cli, llm, mcpใชใฉใŒ็‰นๅพดใงใ™ใ€‚ - -ไพ‹ใˆใฐใ€AIใจchatใ—ใฆใ„ใ‚‹ใจใใ€AIใŒcommandใฎๅฎŸ่กŒใŒๅฟ…่ฆใจๅˆคๆ–ญใ—ใŸๅ ดๅˆใซshellใ‚’ๅฎŸ่กŒใงใใ‚‹ใ‚ˆใ†ใชmcpใŒๅฟ…่ฆใซใชใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใ€‚ - diff --git a/my-blog/content/posts/2025-11-18-aicard.md b/my-blog/content/posts/2025-11-18-aicard.md deleted file mode 100644 index 66e4ea3..0000000 --- a/my-blog/content/posts/2025-11-18-aicard.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -title: "claude code webใ‚’ไฝฟใ„ๅˆ‡ใฃใŸ" -slug: "aicard" -date: "2025-11-18" -tags: ["react", "ios"] -language: ["ja", "en"] -draft: false ---- - -11/18ใพใงใฎ็„กๆ–™้…ๅธƒใฎtokenใŒใ‚ใ‚Šใพใ™ใ€‚ไปŠๅ›žใฏใ‚ฎใƒชใ‚ฎใƒชไฝฟใ„ๅˆ‡ใ‚Œใพใ—ใŸใ€‚`anthropic`ใซๆ„Ÿ่ฌใ€‚ - -[https://support.claude.com/en/articles/12690958-claude-code-promotion](https://support.claude.com/en/articles/12690958-claude-code-promotion) - -[msg type="info" content="claudeใฏๆ€ง่ƒฝๅŠฃๅŒ–ใ€limitใฎๅคš็™บใ€็ช็„ถๅ‹•ใ‹ใชใใชใ‚‹็พ่ฑกใŒๅคš็™บใ—ใŸๆ™‚ๆœŸใŒใ‚ใ‚Šใ€plan:maxใงใ‚‚ใปใจใ‚“ใฉไฝฟใˆใชใ„ๆœŸ้–“ใŒใ‚ใ‚Šใพใ—ใŸใ€‚1ใƒถๆœˆ้–“ใ€ใปใจใ‚“ใฉไฝฟใ‚ใชใ‹ใฃใŸใฎใซplan:maxใฏ็„ก้ง„ใ ใฃใŸใจใ„ใ†็ตŒ้จ“ใ‹ใ‚‰ใ€ใใ‚Œไปฅ้™ใฏplan:proใซๅˆ‡ใ‚Šๆ›ฟใˆใฆใ„ใพใ™ใ€‚claudeใŒไฝฟใˆใชใใชใฃใŸๆœŸ้–“ใฏไป–ใฎใ‚ตใƒผใƒ“ใ‚นใ‚’ไฝฟใฃใฆใ„ใพใ—ใŸใ€‚"] - -ไปŠๅ›žใฏใ€็‰นใซๅฐ่ฑก็š„ใ ใฃใŸใ“ใจใ‚’็ดนไป‹ใ€‚ - -## ่‰ฒใ€…ไฝœใฃใฆใ„ใŸ - -ๅ…จ้ƒจ่‡ชๅˆ†ใงไฝœใฃใฆใ„ใŸใ‚‚ใฎใ‚’ใƒ™ใƒผใ‚นใซclaudeใซๆ›ธใ็›ดใ—ใฆใ‚‚ใ‚‰ใฃใŸใ‚Šใ€ใ‚ใ‚‹ใ„ใฏใ€ไธ€็ท’ใซๆœ€ๅˆใ‹ใ‚‰่จญ่จˆใ‚’่€ƒใˆ็›ดใ—ใŸใ‚Šใจใ„ใฃใŸไฝœๆฅญใงใ—ใŸใ€‚ - -```json -{ - "ai" : ["gpt", "shell", "os", "app", "bot", "card"] -} -``` - -## aicard for ios - -`ai.card`, ใคใพใ‚Šใ€`aicard for ios`ใซ้–ขใ—ใฆใฏใ€ueใงๆ›ธใ„ใฆใ„ใŸใ‚‚ใฎใ‚’ๅ…จ้ƒจไฝœใ‚Š็›ดใ—ใพใ—ใŸใ€‚ - -ไปŠๅ›žใฏ`react + expo`ใจใ„ใ†ๆง‹ๆˆใงใ™ใŒใ€ใ‚ใฎใพใพueใงไฝœใ‚Š็ถšใ‘ใฆใ„ใŸใ‚‰ใ€ใ‚„ใฐใ‹ใฃใŸใ€‚ - - - - -### build - -```sh -nvm use 24 -npm i - -npx expo prebuild --clean - -# CocoaPodsใฎPATHๅ•้กŒใ‚’่งฃๆฑบ -# echo 'export PATH="/opt/homebrew/lib/ruby/gems/3.4.0/bin:$PATH"' >> ~/.zshrc;source ~/.zshrc -cd ios;pod install;cd .. - -open ios/Aicard.xcodeproj -# - Signing & Capabilities ใ‚ฟใƒ–ใ‚’้–‹ใ -# - Team idใ‚’ๆŒ‡ๅฎš(Apple Developer ใ‚ขใ‚ซใ‚ฆใƒณใƒˆ) -# - Xcodeใฏ้–‹ใ„ใŸใพใพๆฌกใธ - -npx expo run:ios --device --configuration Release - -# apple store็”จใฎ.xcarchiveใ‚’ไฝœใ‚Šใพใ™ใ€‚ -xcodebuild -workspace ios/Aicard.xcworkspace \ - -scheme Aicard \ - -configuration Release \ - -archivePath build/Aicard.xcarchive \ - -allowProvisioningUpdates \ - archive -open ./build/Aicard.xcarchive -# Distribute App ใƒœใ‚ฟใƒณใ‚’ใ‚ฏใƒชใƒƒใ‚ฏ -# App Store Connect ใ‚’้ธๆŠž -``` - -### atproto oauth - -1. PKCE็”Ÿๆˆ โ†’ PAR โ†’ Authorization โ†’ Callback -2. Token Exchange๏ผˆDPoP nonce่‡ชๅ‹•ใƒชใƒˆใƒฉใ‚ค๏ผ‰ -3. Profileๅ–ๅพ—๏ผˆDPoP + ath๏ผ‰ -4. Sessionไฟๅญ˜ - -`Universal Links` - -```json:apple-app-site-association.json -{ - "applinks": { - "apps": [], - "details": [{ - "appID": "{apple-dev}.{id}", - "paths": ["/oauth/callback"] - }] - } -} -``` - -#### 1. ellipticใธใฎ็งป่กŒ - -**่งฃๆฑบ็ญ–**: ES256็ฝฒๅใ‚’`elliptic`ใƒฉใ‚คใƒ–ใƒฉใƒชใงๅฎŸ่ฃ… - -```js -import elliptic from 'elliptic'; - -const EC = elliptic.ec; -const ec = new EC('p256'); -const key = ec.genKeyPair(); -``` - -**ๆˆๅŠŸ**: DPoP proof JWTใฎ็”ŸๆˆใซๆˆๅŠŸ - -#### 2. DPoP nonceๅฏพๅฟœ - -**ๅ•้กŒ**: ใƒˆใƒผใ‚ฏใƒณไบคๆ›ๆ™‚ใซ`use_dpop_nonce`ใ‚จใƒฉใƒผ - -**่งฃๆฑบ็ญ–**: ่‡ชๅ‹•ใƒชใƒˆใƒฉใ‚คใƒญใ‚ธใƒƒใ‚ฏๅฎŸ่ฃ… - -```js -// 1ๅ›ž็›ฎๅคฑๆ•— โ†’ DPoP-Nonceใƒ˜ใƒƒใƒ€ใƒผๅ–ๅพ— โ†’ 2ๅ›ž็›ฎๆˆๅŠŸ -if (errorData.error === 'use_dpop_nonce') { - const nonce = response.headers.get('DPoP-Nonce'); - // nonceใ‚’ๅซใ‚ใฆใƒชใƒˆใƒฉใ‚ค -} -``` - -#### 3. ใƒ—ใƒญใƒ•ใ‚กใ‚คใƒซๅ–ๅพ—ใ‚จใƒฉใƒผ - -**ๅ•้กŒ**: `DPoP "ath" mismatch`ใ‚จใƒฉใƒผ - -``` -{"error":"invalid_dpop_proof","message":"DPoP \"ath\" mismatch"} -``` - -**ๅŽŸๅ› **: ใƒ—ใƒญใƒ•ใ‚กใ‚คใƒซๅ–ๅพ—ๆ™‚ใฎDPoPใƒ—ใƒซใƒผใƒ•ใซaccess token hash (`ath`) ใŒๆฌ ่ฝ - -**่งฃๆฑบ็ญ–**: `generateDPoPProof`ใซ`accessToken`ใƒ‘ใƒฉใƒกใƒผใ‚ฟ่ฟฝๅŠ  - -```js -// ใ‚ขใ‚ฏใ‚ปใ‚นใƒˆใƒผใ‚ฏใƒณใฎSHA-256ใƒใƒƒใ‚ทใƒฅใ‚’่จˆ็ฎ— -if (accessToken) { - const tokenHash = await Crypto.digestStringAsync( - Crypto.CryptoDigestAlgorithm.SHA256, - accessToken, - { encoding: Crypto.CryptoEncoding.BASE64 } - ); - payload.ath = base64UrlEncode(tokenHash); -} -``` - -### glb - -็ต่ซ–ใ‹ใ‚‰่จ€ใ†ใจใ€`react-native-filament`ใ‚’ไฝฟใ„ใพใ™ใ€‚ - -`three`ใงใ‚„ใ‚‹้€šๅธธใฎๆ–นๆณ•ใงใฏใ†ใพใใƒ†ใ‚ฏใ‚นใƒใƒฃใŒ่กจ็คบใ•ใ‚Œใพใ›ใ‚“ใงใ—ใŸใ€‚ - -```diff -+ react-native-filament -- expo-three, expo-gl -``` - diff --git a/my-blog/content/posts/2025-11-19-gemini.md b/my-blog/content/posts/2025-11-19-gemini.md deleted file mode 100644 index 07b2d1a..0000000 --- a/my-blog/content/posts/2025-11-19-gemini.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: "gemini3ใ‚’ไฝฟใฃใฆใฟใ‚‹" -slug: "gemini" -date: "2025-11-19" -tags: ["google"] -language: ["ja", "en"] -draft: false ---- - -[msg type="info" content="ๅ‰ๅ›žใฎใŠ่ฉฑ: claude plan:maxใ‚’ใ‚„ใ‚ใฆplan:proใซๅค‰ๆ›ดใ—ใŸใ€‚AIใฎๅฎš้กๅˆถใฏไฝ•ใŒใƒ™ใ‚นใƒˆใชใฎใ ใ‚ใ†ใ€‚"] - -`gemini3`ใŒ็™บ่กจใ•ใ‚Œใพใ—ใŸใ€‚ใพใŸใ€`antigravity.google`ใ€ใคใพใ‚Šใ€`google antigravity`ใŒ็™ปๅ ดใ—ใฆใ„ใพใ™ใ€‚ - -- [https://antigravity.google](https://antigravity.google) -- [https://gemini.google.com](https://gemini.google.com) - -ไปŠๅพŒใฏใ€claudeใฏproใซใ—ใฆใ€geminiใ‚‚proใงไฝฟ็”จใ™ใ‚‹ใฎใŒ่‰ฏใ„ใฎใงใฏใชใ„ใ‹ใจ่€ƒใˆใฆใ„ใพใ™ใ€‚ - -`.google`ใจใ„ใ†ไผๆฅญ็‹ฌๅ ใฎTLDใ‚’webใซใ‚‚ไฝฟใ†ใจใ„ใ†ใฎใฏใ€้žๅธธใซใ‹ใฃใ“ใ„ใ„ใงใ™ใญใ€‚ใ—ใ‹ใ‚‚ใ€`app-bundle-id`ใจใ‚ˆใๅˆใ„ใพใ™ใ€‚ - -| ็›ฎ็š„ | ๅ‘ฝๅ่ฆๅ‰‡ใฎไพ‹ | -| --- | --- | -| ใƒ‰ใƒกใ‚คใƒณๅ | `antigravity.google` | -| ใƒชใƒใƒผใ‚นใƒ‰ใƒกใ‚คใƒณใƒใƒผใƒ  | `google.antigravity` | -| ใ‚ขใƒ—ใƒชใ‚ฑใƒผใ‚ทใƒงใƒณID | `google.antigravity` | -| ใƒญใƒผใ‚ซใƒซใƒ‘ใ‚น1 | `~/Library/google.antigravity/` | -| ใƒญใƒผใ‚ซใƒซใƒ‘ใ‚น2 | `~/Library/google/antigravity/` | - -```sh -$ nvm use 25 -$ nvm alias default 25 -$ npm install -g @google/gemini-cli -$ npm install -g @anthropic-ai/claude-code -``` - -ใพใŸใ€IDEใŒๅฟ…่ฆใชๅ ด้ขใงใฏ`google antigravity`ใŒใŠใ™ใ™ใ‚ใซใชใ‚‹ใ‹ใ‚‚ใ€‚`gemini`ใจใ‚ˆใๅˆใ„ใพใ™ใฎใงใ€‚ - diff --git a/my-blog/content/posts/2025-11-20-three-cloud.md b/my-blog/content/posts/2025-11-20-three-cloud.md deleted file mode 100644 index 4c69354..0000000 --- a/my-blog/content/posts/2025-11-20-three-cloud.md +++ /dev/null @@ -1,414 +0,0 @@ ---- -title: "three.jsใงatmosphereใ‚’ไฝœใ‚‹" -slug: "three-cloud" -date: "2025-11-20" -tags: ["vrm", "react", "three.js", "webgl"] -language: ["ja", "en"] -draft: false ---- - -ไปŠๅ›žใฏใ€atmosphere+three-vrmใงใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใ‚’่กจ็คบใ™ใ‚‹ๆ–นๆณ•ใ‚’็ดนไป‹ใ€‚ - -้žๅธธใซ่‰ฏใ„packageใ‚’่ฆ‹ใคใ‘ใŸใฎใงใ€ใใ‚Œใ‚’ไฝฟใ„ใพใ™ใ€‚ - -[https://github.com/takram-design-engineering/three-geospatial](https://github.com/takram-design-engineering/three-geospatial) - - - -## three-vrm+vrmaใฎๆœ€ๅฐๆง‹ๆˆ - -vrmใ‚’่กจ็คบใฎไธŠใ€animation(.vrma)ใ‚’้ฉ็”จใ€‚ - -```json:package.json -{ - "name": "min-react-vrm", - "version": "1.0.0", - "description": "Minimal VRM Animation Player", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview" - }, - "dependencies": { - "@pixiv/three-vrm": "^3.4.4", - "@pixiv/three-vrm-animation": "^3.4.4", - "@react-three/drei": "^10.7.7", - "@react-three/fiber": "^9.4.0", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "three": "^0.181.2" - }, - "devDependencies": { - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0", - "@vitejs/plugin-react": "^4.3.4", - "vite": "^6.0.1" - } -} -``` - -```js:vite.config.js -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' - -export default defineConfig({ - plugins: [react()], -}) -``` - -```js:src/main.jsx -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App' - -ReactDOM.createRoot(document.getElementById('root')).render( - - - , -) -``` - -```js:src/App.jsx -import React, { useEffect, useRef } from 'react'; -import { Canvas, useFrame, useLoader } from '@react-three/fiber'; -import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'; -import { VRMLoaderPlugin, VRMUtils } from '@pixiv/three-vrm'; -import { createVRMAnimationClip, VRMAnimationLoaderPlugin } from '@pixiv/three-vrm-animation'; -import { AnimationMixer, GridHelper, AxesHelper } from 'three'; -import { OrbitControls } from '@react-three/drei'; - -const VRM_URL = '/ai.vrm'; -const VRMA_URL = '/idle.vrma'; - -function Avatar() { - const mixerRef = useRef(null); - const vrmRef = useRef(null); - const gltf = useLoader(GLTFLoader, VRM_URL, (loader) => { - loader.register((parser) => new VRMLoaderPlugin(parser)); - }); - - const vrma = useLoader(GLTFLoader, VRMA_URL, (loader) => { - loader.register((parser) => new VRMAnimationLoaderPlugin(parser)); - }); - - useEffect(() => { - const vrm = gltf.userData.vrm; - vrmRef.current = vrm; - VRMUtils.removeUnnecessaryJoints(vrm.scene); - vrm.humanoid.resetPose(); - vrm.scene.rotation.y = Math.PI; - if (vrma.userData.vrmAnimations && vrma.userData.vrmAnimations.length > 0) { - const clip = createVRMAnimationClip(vrma.userData.vrmAnimations[0], vrm); - mixerRef.current = new AnimationMixer(vrm.scene); - mixerRef.current.clipAction(clip).play(); - } - }, [gltf, vrma]); - - useFrame((state, delta) => { - if (mixerRef.current) mixerRef.current.update(delta); - if (vrmRef.current) vrmRef.current.update(delta); - }); - - return ; -} - -export default function App() { - return ( -
- - - - - - - - - - - -
- ); -} -``` - -```html:index.html - - - - - - - VRM Animation Preview - - - -
- - - -``` - -ใ“ใ‚Œใง`npm run dev`ใ™ใ‚Œใฐใ€VRMใŒ่กจ็คบใ•ใ‚Œใ€vrmaใฎใ‚ขใƒ‹ใƒกใƒผใ‚ทใƒงใƒณใŒๅ†็”Ÿใ•ใ‚Œใพใ™ใ€‚ - -## atmosphereใฎ่ฟฝๅŠ  - -```json:package.json -{ - "name": "react-vrm-atmosphere", - "version": "1.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview" - }, - "dependencies": { - "@pixiv/three-vrm": "^3.4.4", - "@pixiv/three-vrm-animation": "^3.4.4", - "@react-three/drei": "^10.7.7", - "@react-three/fiber": "^9.4.0", - "@react-three/postprocessing": "^3.0.4", - "@takram/three-atmosphere": "^0.15.1", - "@takram/three-clouds": "^0.5.2", - "react": "^19.0.0-rc.1", - "react-dom": "^19.0.0-rc.1", - "three": "^0.181.2" - }, - "devDependencies": { - "@vitejs/plugin-react": "^4.2.1", - "vite": "^5.1.0" - } -} -``` - -```js:src/App.jsx -import React, { useEffect, useRef, Suspense } from 'react'; -import { Canvas, useFrame, useLoader, useThree } from '@react-three/fiber'; -import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'; -import { VRMLoaderPlugin, VRMUtils } from '@pixiv/three-vrm'; -import { createVRMAnimationClip, VRMAnimationLoaderPlugin } from '@pixiv/three-vrm-animation'; -import { AnimationMixer, Vector3 } from 'three'; -import { OrbitControls, PerspectiveCamera } from '@react-three/drei'; -import { EffectComposer, ToneMapping } from '@react-three/postprocessing'; -import { ToneMappingMode } from 'postprocessing'; -import * as THREE from 'three'; - -import { AerialPerspective, Atmosphere } from '@takram/three-atmosphere/r3f'; -import { Clouds, CloudLayer } from '@takram/three-clouds/r3f'; - -const VRM_URL = '/ai.vrm'; -const VRMA_URL = '/fly.vrma'; -const EARTH_RADIUS = 6378137; - -const FIXED_DATE = new Date('2024-06-21T12:00:00'); -function ExposureController() { - const { gl } = useThree(); - useEffect(() => { - gl.toneMapping = THREE.NoToneMapping; - gl.toneMappingExposure = 10.0; - }, [gl]); - return null; -} - -function AtmosphereLayer() { - const cameraRef = useRef(); - - return ( - - - - - - - - - - - - - - - - - - - - - - - - ); -} - -function FlyOverCamera() { - useFrame((state) => { - const t = state.clock.getElapsedTime() * 0.05; - const altitude = 2000; - const radius = 5000; - - state.camera.position.x = Math.sin(t) * radius; - state.camera.position.z = Math.cos(t) * radius; - state.camera.position.y = EARTH_RADIUS + altitude; - - const lookAtTarget = new Vector3( - Math.sin(t + 0.1) * radius, - EARTH_RADIUS + altitude, - Math.cos(t + 0.1) * radius - ); - state.camera.lookAt(lookAtTarget); - }); - return null; -} - -function VrmCharacter() { - const mixerRef = useRef(null); - const vrmRef = useRef(null); - - const gltf = useLoader(GLTFLoader, VRM_URL, (loader) => { - loader.register((parser) => new VRMLoaderPlugin(parser)); - }); - - const vrma = useLoader(GLTFLoader, VRMA_URL, (loader) => { - loader.register((parser) => new VRMAnimationLoaderPlugin(parser)); - }); - - useEffect(() => { - const vrm = gltf.userData.vrm; - vrmRef.current = vrm; - VRMUtils.removeUnnecessaryJoints(vrm.scene); - vrm.humanoid.resetPose(); - vrm.scene.rotation.y = Math.PI; - - if (vrma.userData.vrmAnimations?.[0]) { - const clip = createVRMAnimationClip(vrma.userData.vrmAnimations[0], vrm); - mixerRef.current = new AnimationMixer(vrm.scene); - mixerRef.current.clipAction(clip).play(); - } - }, [gltf, vrma]); - - useFrame((state, delta) => { - mixerRef.current?.update(delta); - vrmRef.current?.update(delta); - }); - - return ; -} - -function AvatarLayer() { - return ( - - - - - - - - - - - - - ); -} - -export default function App() { - const layerStyle = { - position: 'absolute', - top: 0, - left: 0, - width: '100%', - height: '100%', - }; - - return ( -
- -
- -
- -
-
- -
-
- -
- ); -} -``` - -## google map api - -่ก—ใ‚’่กจ็คบใ™ใ‚‹ใซใฏๆ–™้‡‘ใŒใ‹ใ‹ใ‚Šใพใ™ใ€‚ - -`gcp`ใง`Map Tiles API`ใ ใ‘ๆœ‰ๅŠนใซใ™ใ‚Œใฐใ‚ˆใ„ใงใ™ใ€‚ - -```sh:.env -VITE_GOOGLE_MAP_API_KEY=xxx -``` - -```js:src/App.jsx -import { - GLTFExtensionsPlugin, - GoogleCloudAuthPlugin, - TileCompressionPlugin, - TilesFadePlugin, - UpdateOnChangePlugin, -} from '3d-tiles-renderer/plugins'; - -const apiKey = import.meta.env.VITE_GOOGLE_MAP_API_KEY; -``` - -่ช่จผๆƒ…ๅ ฑใฏใ€localhostใงไฝฟ็”จใ™ใ‚‹ใ‚‚ใฎใจใ€webใงไฝฟ็”จใ™ใ‚‹ใ‚‚ใฎใ‚’ๅˆ†ใ‘ใฆใ€ใใ‚Œใžใ‚Œๅˆถ้™ใ‚’ใคใ‘ใพใ—ใ‚‡ใ†ใ€‚ - -```md -[test-map] -localhost:4400 - -[production-map] -example.com -``` - -ใ“ใ‚Œใงใ‚ตใ‚คใƒˆใซapi-keyใŒๅŸ‹ใ‚่พผใพใ‚Œใฆใ„ใฆใ‚‚ๆฏ”่ผƒ็š„ๅฎ‰ๅ…จใงใ™ใ€‚ใพใŸใ€gh-pagesใงใฏใชใใ€`gh-actions + cf-pages`ใงdeployใ—ใŸใปใ†ใŒใ„ใ„ใ‹ใ‚‚ใ€‚ - -[msg type="warning" content="2ใคใฎkeyใ‚’็”จๆ„ใ™ใ‚‹ใ“ใจใงใ€localhostใ‚’ๅ‰Š้™คใ—ใŸใ‚Š่ฟฝๅŠ ใ™ใ‚‹ๆ‰‹้ †ใ‚’็œ็•ฅใงใใพใ™ใ€‚keyใซlocalhostใ‚’่จฑๅฏใ—ใฆใ„ใ‚‹็Šถๆ…‹ใ ใจๆ‚ช็”จใ•ใ‚Œใ‚‹ๅฑ้™บใŒ้ซ˜ใพใ‚Šใพใ™ใ€‚"] - -[msg type="note" content="gh-pagesใฏ็„กๆ–™ใƒ—ใƒฉใƒณใงprivate-repoใ‚’่จฑๅฏใ—ใฆใ„ใพใ›ใ‚“ใ€‚ใใฎใŸใ‚ใ€private-repoใงgh-actionsใ‹ใ‚‰cf-pagesใซdeployใ™ใ‚‹ๆ–นๆณ•ใŒใ‚ใ‚Šใพใ™ใ€‚"] - -### ใƒใƒžใฃใŸใƒใ‚คใƒณใƒˆ - -vrmใจใฎๅˆใ›ๆŠ€ใชใฎใงใ€ๅคช้™ฝๅ…‰ใ‚’่ชฟๆ•ดใ™ใ‚‹ใฎใŒ้›ฃใ—ใใ€ๅฝฑใŒๅคงใใใชใ‚Šใ™ใŽใฆใ—ใพใ„่ฆ‹ใฅใ‚‰ใ‹ใ„ใฎใงใ‚„ใ‚ใพใ—ใŸใ€‚ - -```diff -- -+ -``` diff --git a/my-blog/content/posts/2025-11-28-passwords.md b/my-blog/content/posts/2025-11-28-passwords.md deleted file mode 100644 index 9803ec6..0000000 --- a/my-blog/content/posts/2025-11-28-passwords.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "bitwardenใ‹ใ‚‰passwordsใธ็งป่กŒ" -slug: "passwords" -date: "2025-11-29" -tags: ["mac", "ios", "password"] -language: ["ja", "en"] -draft: false ---- - -ไปŠใพใงใ€password-managerใฏใ€`bitwarden`, `keepass`ใชใฉใ‚’ไฝฟใฃใฆใใพใ—ใŸใŒใ€ไปŠๅ›žใ€mac/iosๆจ™ๆบ–ใฎ`passwords`ใซ็งป่กŒใ€‚ - -bitwardenใฎsefl-hostใฏใ€dockerใง็ฐกๅ˜ใซ็ซ‹ใกไธŠใ’ใ‚‰ใ‚Œใ‚‹ใฎใงใ™ใŒใ€ๅฎšๆœŸ็š„ใชใƒกใƒณใƒ†ใƒŠใƒณใ‚นใŒ้ขๅ€’ใซใชใฃใฆใใŸใ“ใจใ€ใพใŸใ€mac/iosๆจ™ๆบ–ใฎpasswordsใŒใ‹ใชใ‚Šไฝฟใ„ใ‚„ใ™ใใชใฃใฆใใŸใ“ใจใ‹ใ‚‰็งป่กŒใ‚’ๆฑบๆ„ใ€‚google authenticatorใฎ2FAใ‚‚passwordsใซไฟๅญ˜ใงใใ‚‹ใ‚ˆใ†ใซใชใฃใŸใฎใ‚‚ๅคงใใ„ใ€‚ - -ใพใŸใ€ๅˆๆœŸ่จญๅฎšใงไฝ•ใ‚‚ๅฟ…่ฆใชใ„ใ“ใจใ€‚ๆœ€ๅˆใ‹ใ‚‰ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ•ใ‚Œใฆใ„ใ‚‹ใ‚ขใƒ—ใƒชใชใฎใงใ€apple accountใงloginใ™ใ‚‹ใ ใ‘ใงไฝฟใˆใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ™(passwordsใฎicloudๅ…ฑๆœ‰ใ‚’onใซใ—ใฆใ„ใ‚Œใฐ)ใ€‚ - -`passwords`ใจใ„ใ†ใ‚ขใƒ—ใƒชใฏใ€ใใ“ใพใงไฝฟใ„ใ‚„ใ™ใ„ใ‚‚ใฎใงใ‚‚ใ‚ใ‚Šใพใ›ใ‚“ใŒใ€ไพ‹ใˆใฐใ€iphoneใซใฏๆจ™ๆบ–ใงๅผทๅ›บใช่ช่จผใ‚ทใ‚นใƒ†ใƒ (ๆŒ‡็ด‹่ช่จผใชใฉ)ใŒๅ‹•ไฝœใ—ใฆใ„ใ‚‹ใ“ใจใ‚‚ใ‚ใ‚Šใ€ใใ“ใซ็ตฑไธ€ใ™ใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚ - diff --git a/my-blog/content/posts/2025-12-04-atproto.md b/my-blog/content/posts/2025-12-04-atproto.md deleted file mode 100644 index f41dd3e..0000000 --- a/my-blog/content/posts/2025-12-04-atproto.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -title: "atprotoใงozoneใ‚’ๅ‹•ใ‹ใ—ใŸ" -slug: "atproto" -date: "2025-12-04" -tags: ["atproto"] -language: ["ja", "en"] -draft: false ---- - -ๆœ€่ฟ‘ใฏใ€atprotoใจai.card(ios)ใฎ้€ฃๆบใ‚’ไฝœใฃใฆใ„ใพใ—ใŸใ€‚ozoneใŒๅฟ…่ฆใใ†ใซใชใฃใŸใฎใงๅ‹•ใ‹ใ—ใฆใฟใพใ™ใ€‚ - - -## atprotoใ‚’ใ‚ฒใƒผใƒ ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใซ - -ใ‚ฒใƒผใƒ ใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚ทใ‚นใƒ†ใƒ ใ‚’ไฝœใ‚‹้š›ใ€atprotoใŒไพฟๅˆฉใ ใจๆ€ใฃใฆใ„ใพใ™ใ€‚็‹ฌ่‡ชใซใ‚ทใ‚นใƒ†ใƒ ใ‚’ไฝœใ‚‹ใฎใงใฏใชใใ€ๆ—ขใซใ‚ใ‚‹ใ‚‚ใฎใ‚’ไฝฟใฃใฆๆง‹็ฏ‰ใ—ใพใ™ใ€‚ - -ใ—ใ‹ใ—ๅ•้กŒใ‚‚ใ‚ใ‚Šใพใ™ใ€‚atprotoใฏใƒฆใƒผใ‚ถใƒผใŒใƒ‡ใƒผใ‚ฟใ‚’่‡ช็”ฑใซๆ›ธใๆ›ใˆใ‚‰ใ‚Œใพใ™ใ€‚ใ‚‚ใกใ‚ใ‚“ใ€็Ÿฅ่ญ˜ใŒใ‚ใ‚Œใฐใงใ™ใŒใ€ใใ†้›ฃใ—ใ„ใ“ใจใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ - -ใใฎใŸใ‚ใ€ใ‚ฒใƒผใƒ ใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚ทใ‚นใƒ†ใƒ ใจใ—ใฆไฝฟใ†ๅ ดๅˆใ€ใƒฆใƒผใ‚ถใƒผใŒใƒ‡ใƒผใ‚ฟใ‚’ๆ”นใ–ใ‚“ใงใใชใ„ใ‚ˆใ†ใซใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ใ“ใ‚Œใฏใ€rustใงๆ›ธใ„ใŸ็‹ฌ่‡ชใฎใ‚ทใ‚นใƒ†ใƒ ใจ้€ฃๆบใ—ใ€ใƒฆใƒผใ‚ถใƒผใซไธ€้ƒจใฎใƒ‡ใƒผใ‚ฟใ—ใ‹ๆ“ไฝœใงใใชใ„uuidใ‚’็™บ่กŒใ™ใ‚‹ใ“ใจใง่งฃๆฑบใ™ใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚ - -## ใ‚ฒใƒผใƒ ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฎไป•็ต„ใฟ - -ใ‚ฒใƒผใƒ ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฎไป•็ต„ใฟใฏ้žๅธธใซใ‚ทใƒณใƒ—ใƒซใงใ™ใ€‚ - -1. [ๆ–ฐ่ฆ็™ป้Œฒ] handleใ‚’ๅ…ฅๅŠ›ใ™ใ‚‹ใจ่‡ชๅ‹•ใงใ‚ขใ‚ซใ‚ฆใƒณใƒˆใŒไฝœๆˆใ•ใ‚Œใ‚‹ -2. ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใฏ่‡ชๅ‹•็”Ÿๆˆใ•ใ‚Œใ€dbใซไฟๅญ˜ใ€‚ใƒฆใƒผใ‚ถใƒผใซใฏ่กจ็คบใ—ใชใ„ -3. uuidใ‚’็™บ่กŒใ—ใ€ใใ‚Œใ‚’็”จใ„ใฆใƒฆใƒผใ‚ถใƒผใฏsessionใ‚’ๅพฉๅ…ƒใงใใ‚‹ - -ใ“ใฎไป•็ต„ใฟใ‚’iosใ‚ขใƒ—ใƒชใซๅฎŸ่ฃ…ใ™ใ‚‹ใ“ใจใงใ€ใ‚ฒใƒผใƒ ใƒ‡ใƒผใ‚ฟใฎๆ”นใ–ใ‚“ใ‚’้˜ฒๆญขใ™ใ‚‹ใ‚ฒใƒผใƒ ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใจใ—ใฆๅˆฉ็”จใ—ใพใ™ใ€‚ - - - -## ใ‚ฒใƒผใƒ ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฎ็‰นๅ…ธ - -็งใฏใ‚ฒใƒผใƒ ใƒ‡ใƒผใ‚ฟใŒๆ”นใ–ใ‚“ใ•ใ‚Œใ‚‹ใจใฏ่€ƒใˆใฆใ„ใพใ›ใ‚“ใ€‚็Ÿฅ่ญ˜ใ‚’ๆŒใฃใŸๅคงๅŠใ‚‚ใ€ใใ‚“ใช้ขๅ€’ใชใ“ใจๆ™ฎ้€šใ—ใพใ›ใ‚“ใ€‚ใปใจใ‚“ใฉใฎไบบใฏๆ™ฎ้€šใซ้Šใถใ ใ‚ใ†ใจ่€ƒใˆใฆใ„ใพใ™ใ€‚ - -ใจใฏใ„ใˆใ€ใใ‚Œใ‚‚ๆฅฝใ—ใฟๆ–นใฎไธ€ใคใจใ—ใฆ่จฑๅฎนใ™ใ‚‹ๆฐ—ๆŒใกใ‚‚ใ‚ใ‚Šใพใ™ใ€‚ - -ใพใŸใ€ๆ”นใ–ใ‚“ใ•ใ‚ŒใŸใจใ—ใฆใใ‚ŒใงๅฃŠใ‚Œใ‚‹ใ‚ˆใ†ใชไป•็ต„ใฟใงใฏใ„ใ‘ใพใ›ใ‚“ใ€‚ใงใ™ใ‹ใ‚‰ใใ‚Œใ‚’ใ•ใ‚Œใฆใ‚‚ใ„ใ„ใ‚ˆใ†ใ‚ฒใƒผใƒ ใ‚’ๆง‹็ฏ‰ใ—ใชใ‘ใ‚Œใฐใ„ใ‘ใพใ›ใ‚“ใ€‚่ฆใฏๅ‰ๆใ‚’ใฉใ†่€ƒใˆใ‚‹ใ‹ใงใ™ใ€‚ - -็งใŒไฝœใฃใฆใ„ใ‚‹ใ‚ฒใƒผใƒ ใฏai.cardใŒๆ”นใ–ใ‚“ใงใใชใ„ใƒญใƒผใ‚ซใƒซใƒ‡ใƒผใ‚ฟใฎใฟใ‚’ๆ‰ฑใ„ใ€ai.rseใฏใƒชใƒขใƒผใƒˆใƒ‡ใƒผใ‚ฟใ‚’ไฝฟใ†ใจใ„ใ†ๆง‹้€ ใงใ™ใ€‚ใ—ใŸใŒใฃใฆใ€ๆ”น้€ ใ‚‚ai.rseใงใ—ใ‹ๆœ‰ๅŠนใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ - -ใใฎใŸใ‚ใ€็ตๆžœใจใ—ใฆใ‚ˆใ‚Š้‡่ฆ–ใ•ใ‚Œใ‚‹ใฎใฏai.cardใฎๆ–นใซใชใ‚‹ใ ใ‚ใ†ใจๆ€ใฃใฆใ„ใพใ™ใ€‚ai.rseใฏใŠใพใ‘ใฟใŸใ„ใชใ‚‚ใฎใจ่ช่ญ˜ใ•ใ‚Œใ‚‹ใฎใงใฏใ€‚ - -ai.rseใงใฎใƒ‡ใƒผใ‚ฟใฎๆ‰ฑใ„ใฏไปฅไธ‹ใฎใ‚ˆใ†ใชๅฝขใซใชใ‚Šใพใ™ใ€‚ - -็ฎก็†่€…ใฎpdsใงไฝœๆˆใ•ใ‚ŒใŸใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฏใ‚ฒใƒผใƒ ใƒ‡ใƒผใ‚ฟๆ”นใ–ใ‚“ใŒใชใ„ใ‚‚ใฎใจใฟใชใ— - -1. maxใฎๅ€คใ‚’้€šๅธธใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚ˆใ‚Šๅคงใใ่จญๅฎš -2. {user}.syu.isใฎใƒ‰ใƒกใ‚คใƒณ้ƒจๅˆ†ใ‚’็œ็•ฅใ—ใฆ่กจ็คบ - -## ozoneใฎๅฐŽๅ…ฅ - -ใใ†ใชใ‚‹ใจใƒฆใƒผใ‚ถใƒผ็ฎก็†ใ‚‚ๅคงๅค‰ใชใฎใงใ€ozoneใŒใ‚ใฃใŸใปใ†ใŒ่‰ฏใ„ใจๅˆคๆ–ญใ—ใ€ozoneใ‚’ๅ‹•ใ‹ใ—ใฆใฟใ‚‹ใ“ใจใซใ—ใพใ™ใ€‚ - -[![](/img/atproto_ozone_0001.png)](/img/atproto_ozone_0001.png) - -### backend, frontend - -ozoneใฏback, frontใฎ2ใคใŒใ‚ใ‚Šใ€ใ“ใ‚Œใ‚‰ใ‚’ๅ‹•ใ‹ใ™ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ - -- [https://github.com/bluesky-social/atproto/tree/main/services/ozone](https://github.com/bluesky-social/atproto/tree/main/services/ozone) -- [https://github.com/bluesky-social/ozone](https://github.com/bluesky-social/ozone) - -```md -1 ozone /xrpc/* :2585 -2 ozone /.well-known/* :2585 -3 ozone * :2586 -``` - -ใ“ใฎใ‚ˆใ†ใซใ™ใ‚Œใฐใ‚ˆใ„ใงใ—ใ‚‡ใ†ใ€‚ - -### atproto_pds - -ๆณจๆ„ๆ›ธใใŒใ‚ใ‚Šใ€้€šๅธธใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฏๅฅฝใพใ—ใใชใ„ใ‚ˆใ†ใงใ™ใ€‚ - -`AtprotoPersonalDataServer` - -```diff -diff --git a/lib/identity.ts b/lib/identity.ts -index a8ec3a7..8e4d171 100644 ---- a/lib/identity.ts -+++ b/lib/identity.ts -@@ -83,7 +83,7 @@ export function didDocToData(doc: { - const [, id] = s['id'].split('#') - acc[id] = { - type: s['type'], -- serviceEndpoint: s['serviceEndpoint'], -+ endpoint: s['serviceEndpoint'], - } - } - return acc -``` - -ใใฎไป–ใฎpatchใฏใ“ใกใ‚‰ใŒๅ‚่€ƒใซใชใ‚Šใพใ™ใ€‚ - -- [https://github.com/itaru2622/bluesky-selfhost-env/tree/master/patching](https://github.com/itaru2622/bluesky-selfhost-env/tree/master/patching) - -### oauth - -ใ“ใ‚Œใฏ`atproto`ใฎpatchใงใ™ใ€‚pdsใ‚’buildใ—ใพใ™ใ€‚ - -้€šๅธธ็•ฐใชใ‚‹domain้–“ใงoauth่ช่จผใ‚’่กŒใ†ๅ ดๅˆใ€`fetch-site`ใŒ`cross-site`ใซใชใ‚Šใพใ™ใ€‚ใ—ใ‹ใ—ใ€ไปŠๅ›žใฎๆง‹ๆˆใงใฏozoneใฏๅŒไธ€siteๅ†…ใง่ช่จผใŒ่กŒใ‚ใ‚Œใ‚‹ใŸใ‚ใ€`same-site`ใ‚‚่จฑๅฏใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ - -```diff -diff --git a/packages/oauth/oauth-provider/src/router/create-authorization-page-middleware.ts b/packages/oauth/oauth-provider/src/router/create-authorization-page-middleware.ts -index f653b0353..45c45fac1 100644 ---- a/packages/oauth/oauth-provider/src/router/create-authorization-page-middleware.ts -+++ b/packages/oauth/oauth-provider/src/router/create-authorization-page-middleware.ts -@@ -53,7 +53,7 @@ export function createAuthorizationPageMiddleware< - res.setHeader('Cache-Control', 'no-store') - res.setHeader('Pragma', 'no-cache') - -- validateFetchSite(req, ['cross-site', 'none']) -+ validateFetchSite(req, ['cross-site', 'same-site', 'none']) - validateFetchMode(req, ['navigate']) - validateFetchDest(req, ['document']) - validateOrigin(req, issuerOrigin) -``` - -### user verify - -```sh:envs/ozone -OZONE_VERIFIER_URL=https://{PDS} -OZONE_VERIFIER_DID=${ADMIN_DID} -OZONE_VERIFIER_PASSWORD=${APP_PASSWORD} -``` - diff --git a/my-blog/content/posts/2025-12-07-social-app.md b/my-blog/content/posts/2025-12-07-social-app.md deleted file mode 100644 index 1f686a5..0000000 --- a/my-blog/content/posts/2025-12-07-social-app.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "atprotoใฎsocial-appใ‚’ไฝœใฃใŸ" -slug: "atproto" -date: "2025-12-07" -tags: ["atproto"] -language: ["ja", "en"] -draft: false ---- - -blueskyใฎๅ…ฌๅผclientใŒselfhostใงๅ‹•ใ‹ใชใใชใฃใฆๆ•ฐใ‚ซๆœˆใŒ็ตŒใกใพใ—ใŸใ€‚ - -ใ“ใฎใพใพใงใฏไธไพฟใ ใจๆ€ใ„ใ€selfhostใฎpdsใงใ‚‚ๅ‹•ใiosใ‚ขใƒ—ใƒชใ‚’ไฝœใ‚‹ใ“ใจใซใ€‚ - -[bluesky-social/social-app](https://github.com/bluesky-social/social-app)ใ‚’ใƒ™ใƒผใ‚นใซใ€ใงใใ‚‹้™ใ‚Šๆœ€ๆ–ฐใฎใ‚ณใƒผใƒ‰ใซ่ฟฝๅพ“ใ—ใ‚„ใ™ใ„ๅฝขใซใ—ใฆใ„ใพใ™ใ€‚ - -1. ใƒฉใ‚คใ‚ปใƒณใ‚นใฎๆ˜Ž็คบ -2. "Bluesky"ใฎใƒญใ‚ดใ‚„ๅ็งฐใ‚’ไฝฟ็”จใ—ใชใ„ใ“ใจ -3. selfhostใงใ‚‚ๅ‹•ไฝœใ™ใ‚‹ใ“ใจ -4. DM(chat)ๆฉŸ่ƒฝใฎ็„กๅŠนๅŒ– - - - -## ใƒฉใ‚คใƒณใ‚ปใƒณใ‚น - -`social-app`ใฎsrcใฏMITใƒฉใ‚คใ‚ปใƒณใ‚นใงๅ…ฌ้–‹ใ•ใ‚ŒใฆใŠใ‚Šใ€ใ‚ซใ‚นใ‚ฟใƒžใ‚คใ‚บใ—ใฆapple storeใซๅ…ฌ้–‹ใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ - -- [https://github.com/bluesky-social/social-app/blob/main/LICENSE](https://github.com/bluesky-social/social-app/blob/main/LICENSE) - -```md -# AIใฎ่ฉ•ไพก -็พๅœจใฎ License.tsx ใฏๅๅˆ†ใซ่ฆไปถใ‚’ๆบ€ใŸใ—ใฆใ„ใพใ™ใ€‚ๅซใพใ‚Œใฆใ„ใ‚‹ๅ†…ๅฎน๏ผš -1. โœ… ๅŽŸไฝœ่€…ใธใฎๅธฐๅฑž๏ผˆ"based on Bluesky Social App"๏ผ‰ -2. โœ… ๅ…ƒใƒชใƒใ‚ธใƒˆใƒชใธใฎใƒชใƒณใ‚ฏ -3. โœ… ่‘—ไฝœๆจฉ่กจ็คบ๏ผˆCopyright (c) 2022-2025 Bluesky PBC๏ผ‰ -4. โœ… MITใƒฉใ‚คใ‚ปใƒณใ‚นๅ…จๆ–‡ -5. โœ… ๆ—ฅๆœฌ่ชž่จณ๏ผˆใƒฆใƒผใ‚ถใƒผใƒ•ใƒฌใƒณใƒ‰ใƒชใƒผ๏ผ‰ -6. โœ… ใ‚ชใƒชใ‚ธใƒŠใƒซLICENSEใƒ•ใ‚กใ‚คใƒซใธใฎใƒชใƒณใ‚ฏ -``` - -## ใ‚ขใƒ—ใƒชๅใซใคใ„ใฆ - -repositoryใ‚’ai/atใ‹ใ‚‰ไฝœใฃใŸใฎใงใ€`Aiat`ใซใชใ‚Šใพใ™ใ€‚ - -[A]ใŒๅคงๆ–‡ๅญ—ใชใฎใฏใ€iosใ‚ขใƒ—ใƒชใ ใ‹ใ‚‰ใงใ™ใ€‚ueใ‚„iosใฎๅๅ‰ๆ…ฃ็ฟ’ใซๅˆใ‚ใ›ใฆใ„ใพใ™ใ€‚ - -## ๅ…ฌ้–‹ใฎๆœ‰็„ก - -`bsky.team`ใฎไบบใซ่žใ„ใฆใ‹ใ‚‰ๅ…ฌ้–‹ใ™ใ‚‹ใ‹ๆฑบใ‚ใ‚‹ใ‹ใ€ๅ…ฌ้–‹ๅพŒใซใ‚ขใƒ—ใƒชใ‚’่ฆ‹ใ›ใ‚‹ใ‹ใ€ใฉใกใ‚‰ใ‹ใงใ™ใ€‚ - -apple reviewใŒ้€šใ‚Œใฐใงใ™ใŒใ€‚ - diff --git a/my-blog/content/posts/2025-12-11-gasp.md b/my-blog/content/posts/2025-12-11-gasp.md deleted file mode 100644 index 35882a5..0000000 --- a/my-blog/content/posts/2025-12-11-gasp.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: "ue5.7.1ใฎGASPใงใ‚ญใƒฃใƒฉใ‚’ๅˆ‡ใ‚Šๆ›ฟใˆใ‚‹" -slug: "gasp" -date: "2025-12-11" -tags: ["ue"] -language: ["ja", "en"] -draft: false ---- - -Game Animation Sample Project(้€š็งฐใ€GASP)ใŒupdateใ•ใ‚Œใฆใ„ใพใ™ใ€‚ - -ไปŠๅ›žใฏ้žๅธธใซ่‰ฏใ„sampleใงใ™ใ€‚ใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฎใ‚ฟใ‚คใƒ—ใ‚’ๅค‰ๆ›ดใ™ใ‚‹ๆ–นๆณ•ใŒๆ˜Ž็ขบใซใชใฃใŸใŸใ‚ใงใ€ๅ€‹ไบบ็š„ใซใฏprojectใฎๆ–นๅ‘ๆ€งใ‚’ๆฑบๅฎšใฅใ‘ใ‚‹ใฎใซ็‰นใซ้‡่ฆใงใ—ใŸใ€‚ - -ใ“ใฎๆ–นๆณ•ใฏใ€ๆš—็คบใฏใ•ใ‚Œใฆใฏใ„ใพใ™ใŒใ€ๆ˜Ž็ขบใซ่งฃ่ชฌใ•ใ‚Œใฆใ„ใ‚‹ใ‚ใ‘ใงใฏใ‚ใ‚Šใพใ›ใ‚“ใฎใงใ€ๆ–นๆณ•ใ‚’ใพใจใ‚ใพใ™ใ€‚ - -## GASPใฎใ‚ญใƒฃใƒฉๅˆ‡ใ‚Šๆ›ฟใˆใŒๅค‰ใ‚ใฃใŸ - -ไปŠๅ›žใ€GASPใฏ2็จฎ้กžใฎๆ–นๆณ•ใ‚’ๆŽก็”จใ—ใฆใ„ใ‚‹ใ‚ˆใ†ใงใ€ใใ‚ŒใŒ้žๅธธใซ่‰ฏใ‹ใฃใŸใ€‚ - -ๅ…ทไฝ“็š„ใซใฏใ€Typeใ‚’ๅ…ฅใ‚Œๆ›ฟใˆใ‚‹ๆ–นๆณ•ใจVisualใ‚’ๅ…ฅใ‚Œๆ›ฟใˆใ‚‹ๆ–นๆณ•ใงใ™ใ€‚ - -ใ‚ฟใ‚คใƒ—ใจ่ฆ‹ใŸ็›ฎใ‚’ๅ…ฅใ‚Œๆ›ฟใˆใ‚‹2ใคใฎๆ–นๆณ•ใŒ็”จๆ„ใ•ใ‚ŒใฆใŠใ‚Šใ€ใใ‚Œใžใ‚Œใซ[n], [m]keyใŒ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ™ใ€‚ - - - -## ๅ…ทไฝ“็š„ใชๆ‰‹้ † - -1. `/Blueprints/GM_Sandbox`ใฎ`Pawn Classes`ใซ`BP_Walker`ใ‚’่ฟฝๅŠ ใ—ใพใ™ใ€‚ใชใŠใ€่ฆ‹ใŸ็›ฎใ‚’ๅค‰ใˆใ‚‹ใฎใฏ`Visual Overrides`ใงใ™ใ€‚ใ“ใ‚Œใฏใปใจใ‚“ใฉๅพ“ๆฅใฎๆ–นๅผใจ่€ƒใˆใฆใใ ใ•ใ„ใ€‚ - -[![](/img/ue_gasp_v571_0001.png)](/img/ue_gasp_v571_0001.png) - -2. `/Locomotor/BP_Walker`ใ‚’้–‹ใ„ใฆใ€ใใ“ใซ`/Locomotor/PC_Locomotor`ใฎๅ†…ๅฎนใ‚’่ฒผใ‚Šไป˜ใ‘ใพใ™ใ€‚ - -[![](/img/ue_gasp_v571_0002.png)](/img/ue_gasp_v571_0002.png) - -ๅŸบๆœฌ็š„ใซใ‚ญใƒฃใƒฉๅˆ‡ใ‚Šๆ›ฟใˆใฏใ“ใฎใ‚ณใƒžใƒณใƒ‰ใงๅˆถๅพกใ•ใ‚Œใฆใ„ใพใ™ใ€‚ๅˆๆœŸๅ€คใฏ`GM_Sandbox`ใง่จญๅฎšใงใใŸใ‚ˆใ†ใชๆฐ—ใŒใ—ใพใ™ใŒใ€`PC_Sandbox`ใฎBeginPlayใซๆ›ธใ„ใฆใŠใ‘ใฐใ‚ˆใ‚Š็ขบๅฎŸใงใ—ใ‚‡ใ†ใ€‚ - - - -## Dragonใฎไฝœใ‚Šๆ–น - -ใ“ใฎDragonใฏใ€`Control Rig Sample`ใซใ‚ใ‚Šใพใ™ใ€‚ - -1. `/ControlRig/Characters/Dragon/SKM_Dragon`ใ‚’่ตท็‚นใจใ—ใฆABP, IK, RTG็ญ‰่‰ฒใ€…ไฝœใ‚Šใพใ™ใ€‚ -2. `/Locomotor/BP_Walker`ใ‚’่ค‡่ฃฝใ—ใ€`BP_Dragon`ใจใ—ใพใ™ใ€‚Meshใ‚’`SKM_Dragon`ใซๅค‰ๆ›ดใ—ใ€ABPใ‚’`ABP_Dragon`ใซๅค‰ๆ›ดใ€‚ -3. ็งใฎๅ ดๅˆใฏใ€ABPใซ`DragonIK Plugin`ใฎใƒŽใƒผใƒ‰ใ‚’่ฟฝๅŠ ใ€‚ -4. `BP_Dragon`ใซใ‚ใ‚‹CameraใฎLocationใ‚’ๅฐ‘ใ—่ชฟๆ•ดใ€‚ - diff --git a/my-blog/content/posts/2025-12-28-ue-mac.md b/my-blog/content/posts/2025-12-28-ue-mac.md deleted file mode 100644 index 7ddf23d..0000000 --- a/my-blog/content/posts/2025-12-28-ue-mac.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: "ใ‚ฒใƒผใƒ ้–‹็™บใจmulti-platform" -slug: "ue-mac" -date: "2025-12-28" -tags: ["ue", "mac", "ios"] -language: ["ja", "en"] -draft: false ---- - -ไปŠๅ›žใฏใ€ใ‚ฒใƒผใƒ ้–‹็™บใฎmutli-platform(ใƒžใƒซใƒใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ )ๅฏพๅฟœใซใคใ„ใฆใ€‚ - -![](/img/ue_airse_mac_0001.png) - -## ่ฟ‘ๆณ - -win, mac, iosใงๅ‹•ใใ‚ฒใƒผใƒ ใŒใ‚ˆใ†ใ‚„ใใงใใพใ—ใŸใ€‚ - -ๅ‹•ไฝœใฏ่ปฝ้‡ใงใ€winใง้–‹็™บใ—ใฆใ„ใŸๆ™‚ใ‚ˆใ‚Šๅฎ‰ๅฎšใ—ใฆใ„ใพใ™ใ€‚ - - -## mac/iosๅ‘ใ‘ใ‚’ไฝœใ‚‹้–‹็™บ่€…ใฎๆ•ฐ - -ๅ€‹ไบบ้–‹็™บใงใฏใ€mac/iosๅ‘ใ‘ใซไฝœใฃใฆใ„ใ‚‹ไบบใฏใปใจใ‚“ใฉ่ฆ‹ๅฝ“ใŸใ‚Šใพใ›ใ‚“ใ€‚ueใ‚’ไฝฟใฃใฆใ„ใ‚‹ๅ€‹ไบบ้–‹็™บ่€…่‡ชไฝ“ใจใฆใ‚‚ๅฐ‘ใชใ„ใฎใงใ™ใŒใ€mac/iosใงไฝœใ‚‹ไบบใฏใ•ใ‚‰ใซๅฐ‘ใชใ„ใจๆ€ใ„ใพใ™ใ€‚ใ“ใ‚Œใซใฏ็†็”ฑใŒใ‚ใ‚Šใพใ™ใ€‚ - -้›ฃๆ˜“ๅบฆใ‚„่ฒ ๆ‹…ใฏๅข—ใˆใพใ™ใŒใ€ใ‚„ใฃใฆใ„ใ‚‹ไบบใŒใ„ใชใ„ใฎใฏใƒใƒฃใƒณใ‚นใงใ‚‚ใ‚ใ‚‹ใจใƒ—ใƒฉใ‚นใซๆ‰ใˆใฆใ„ใพใ™ใ€‚ - -## ้–‹็™บ่€…ใŒmulti-platformใ‚’ใ‚„ใ‚‹ๅˆฉ็‚น - -mac/iosใงใ‚ฒใƒผใƒ ใ‚’ไฝœใฃใฆใ„ใ‚‹ใจใ€ๆง˜ใ€…ใชๅˆฉ็‚นใซๆฐ—ใฅใใพใ™ใ€‚ - -winใ ใ‘ใงไฝœใฃใฆใ„ใ‚‹ใจๆฐ—ไป˜ใ‹ใชใ„ใƒœใƒˆใƒซใƒใƒƒใ‚ฏใ‚’ใ„ใใคใ‹็™บ่ฆ‹ใ—ใ€่จญ่จˆใ‚’่ฆ‹็›ดใ—ใพใ—ใŸใ€‚ - -ใ“ใ†ใ„ใ†ใ‚‚ใฎใ‚’ๆ”พ็ฝฎใ—ใฆใ„ใ‚‹ใจใ€ๅ†…้ƒจใง่“„็ฉใ—ใ€ใ‚ฒใƒผใƒ ใฎไธๅฎ‰ๅฎšๅŒ–ใซ็น‹ใŒใฃใฆใ„ใŸใจๆ€ใ„ใพใ™ใ€‚ - -ๆ˜”ใ‹ใ‚‰ๅคงไผๆฅญใŒไฝœใ‚‹ใ‚ฒใƒผใƒ ใŒใ‚„ใŸใ‚‰ๅฎ‰ๅฎšใ—ใฆใ„ใ‚‹ใ“ใจใ‚’ไธๆ€่ญฐใซๆ€ใฃใฆใ„ใพใ—ใŸใ€‚ใ‚‚ใ—ใ‹ใ™ใ‚‹ใจใ€ใ“ใ†ใ„ใ†ใ“ใจใ ใฃใŸใฎใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใ€‚ - -multi-platformใ‚’ๅฟƒใŒใ‘ใ‚‹ใ“ใจใง่‡ช็„ถใจใ‚ฒใƒผใƒ ใฎ่ปฝ้‡ๅŒ–ใ€ๅฎ‰ๅฎšๅŒ–ใŒ้€ฒใ‚€ใฎใงใ€็ตๆžœ็š„ใซwinใงไฝœใ‚‹ใ‚ฒใƒผใƒ ใ‚‚่‰ฏใใชใฃใฆใ„ใŸใฎใ‹ใ‚‚ใ€‚ - -## multi-platformใฎๅคงๅค‰ใ• - -ใ“ใ‚Œใ‚‚่ฉฑใ—ใฆใŠใ‹ใชใ„ใจใƒ•ใ‚งใ‚ขใ˜ใ‚ƒใชใ„ใฎใงๆ›ธใใพใ™ใ€‚ - -multi-platformใฎๅฏพๅฟœใฏใ€ๆง˜ใ€…ใชๅ•้กŒใŒ็™บ็”Ÿใ—ใ€ๅคงๅค‰ใงใ—ใŸใ€‚ - -ใ‚ฒใƒผใƒ ้–‹็™บ่‡ชไฝ“ใŒๅคงๅค‰ใงใ™ใŒใ€multi-platformใธใฎๅฏพๅฟœใฏใ•ใ‚‰ใซๅคงๅค‰ใงใ™ใ€‚ไผๆฅญใ€ใ‚ใ‚‹ใ„ใฏใƒใƒผใƒ ใŒใ‚„ใ‚‹ใƒฌใƒ™ใƒซใฎไฝœๆฅญ้‡ใ€็Ÿฅ่ญ˜ใ€ๅฏพๅฟœใŒๅฟ…่ฆใ€‚ๅŸบๆœฌ็š„ใซใฏใ€ๅ€‹ไบบใŒใ‚„ใ‚‹ใ‚ˆใ†ใชใ“ใจใงใฏใชใใ€ใŠใใ‚‰ใใ€ๅ€‹ไบบใงใฏ้›ฃใ—ใ„ใจๆ€ใ†ใ€‚ - -ใŠใ™ใ™ใ‚ใฎๆ–นๆณ•ใฏใ€winใงไฝœใฃใฆใ„ใŸprojectใฎ็งปๆคใ‚’่€ƒใˆใ‚‹ใฎใงใฏใชใใ€ไธ€ใ‹ใ‚‰macใ‚’ๅŸบๆบ–ใซไฝœใ‚‹ใ“ใจใงใ™ใ€‚ios, linux, androidใฎๅ ดๅˆใ‚‚ๅŒๆง˜ใงใ™ใ€‚ - -```sh -o ... mac -> win -x ... win -> mac -``` - -้–‹็™บ็’ฐๅขƒใ‚’ๆ•ดใˆใ‚‹ใ“ใจใ‚‚้‡่ฆใงใ€็งใฏ`git`, `openssh`, `pwsh`, `zsh`ใชใฉใ‚’ไฝฟใ„ใพใ™ใ€‚ - -`app store`ใซๆๅ‡บใ™ใ‚‹ๅ ดๅˆใ€`.pkg`, `.ipa`ใชใฉใฎไป•ๆง˜ใ‚’็†่งฃใ—ใฆใŠใๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚ - -ๆœ€็ต‚็š„ใซใฏใ€ๅ„osไธŠใงๅ‹•ไฝœใ™ใ‚‹build, deploy, testใฎ่‡ชๅ‹•ๅŒ–็’ฐๅขƒใ‚’ไฝœใ‚Šใพใ—ใŸใ€‚ - -cmd example: - -```sh -$ ${UE_ROOT}/Engine/Build/BatchFiles/RunUAT.sh - -$ codesign -f -s "$IOS_CERTIFICATE_NAME" --entitlements "$entitlements" "$app_path" - -$ iconutil -c iconset "$custom_icon" -o "$tmp_iconset_icns" - -$ xcodebuild -exportArchive -archivePath "$archive" -exportPath "$BUILD_DIR" -exportOptionsPlist "$BUILD_DIR/ExportOptions.plist" - -$ xcrun devicectl device install app --device "$IOS_DEVICE_ID" "$app_path" - -$ xcrun altool --upload-app -f "$pkg_path" -t macos --apiKey "${ASC_KEY_ID}" --apiIssuer "${ASC_ISSUER_ID}" -``` - -## ็”ป่ณชใจๅ‹•ไฝœใƒใ‚งใƒƒใ‚ฏ - - - diff --git a/my-blog/layouts/_default/index.json b/my-blog/layouts/_default/index.json deleted file mode 100644 index a18a376..0000000 --- a/my-blog/layouts/_default/index.json +++ /dev/null @@ -1,7 +0,0 @@ -{{ $dateFormat := default "Mon Jan 2, 2006" (index .Site.Params "date_format") }} -{{ $utcFormat := "2006-01-02T15:04:05Z07:00" }} -{{- $.Scratch.Add "index" slice -}} -{{- range .Site.RegularPages -}} - {{- $.Scratch.Add "index" (dict "title" .Title "tags" .Params.tags "description" .Description "categories" .Params.categories "contents" .Plain "href" .Permalink "utc_time" (.Date.Format $utcFormat) "formated_time" (.Date.Format $dateFormat)) -}} -{{- end -}} -{{- $.Scratch.Get "index" | jsonify -}} diff --git a/my-blog/layouts/at-browser-assets.html b/my-blog/layouts/at-browser-assets.html deleted file mode 100644 index 3dbd52f..0000000 --- a/my-blog/layouts/at-browser-assets.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - \ No newline at end of file diff --git a/my-blog/layouts/base.html b/my-blog/layouts/base.html deleted file mode 100644 index 82b8523..0000000 --- a/my-blog/layouts/base.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - {% block title %}{{ config.title }}{% endblock %} - - - - - - - - - - - - - {% block head %}{% endblock %} - - -
-
-
-

{{ config.title }}

- -
- -
-
-
- - -
-
-
- -
-
-
- - - - -
- - {% include "pds-header.html" %} - - {% block content %}{% endblock %} -
- - {% block sidebar %}{% endblock %} -
- -
- -

ยฉ {{ config.author }}

-
- - - - - - - - - - - - {% include "oauth-assets.html" %} - {% include "at-browser-assets.html" %} - - diff --git a/my-blog/layouts/game.html b/my-blog/layouts/game.html deleted file mode 100644 index 69d04f8..0000000 --- a/my-blog/layouts/game.html +++ /dev/null @@ -1,135 +0,0 @@ -{% extends "base.html" %} - -{% block title %}Game - {{ config.title }}{% endblock %} - -{% block content %} -
-
-

Login to Play

-

Please authenticate with your AT Protocol account to access the game.

-
-
- -
- - - - - - -{% include "oauth-assets.html" %} -{% endblock %} \ No newline at end of file diff --git a/my-blog/layouts/index.html b/my-blog/layouts/index.html deleted file mode 100644 index b5370ce..0000000 --- a/my-blog/layouts/index.html +++ /dev/null @@ -1,45 +0,0 @@ -{% extends "base.html" %} - -{% block content %} -
- -
- {% for post in posts %} -
-
- -
- -
-

- {{ post.title }} -

- -
-
- {% endfor %} -
- - -
-
-
- - {% if posts|length == 0 %} -
-

No posts yet. Start writing!

-
- {% endif %} -
-{% endblock %} diff --git a/my-blog/layouts/oauth-assets.html b/my-blog/layouts/oauth-assets.html deleted file mode 100644 index e9cf8c1..0000000 --- a/my-blog/layouts/oauth-assets.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/my-blog/layouts/partials/oauth-widget.html b/my-blog/layouts/partials/oauth-widget.html deleted file mode 100644 index ccf30d6..0000000 --- a/my-blog/layouts/partials/oauth-widget.html +++ /dev/null @@ -1,71 +0,0 @@ - -
-
- Login with your Bluesky account -
- - -
- -
- -
- - - - -
-
- - - - \ No newline at end of file diff --git a/my-blog/layouts/pds-header.html b/my-blog/layouts/pds-header.html deleted file mode 100644 index df001a0..0000000 --- a/my-blog/layouts/pds-header.html +++ /dev/null @@ -1,48 +0,0 @@ -
-
-
- - - - - - - - - - - - - -
- - - - - diff --git a/my-blog/layouts/pds.html b/my-blog/layouts/pds.html deleted file mode 100644 index 0e06f69..0000000 --- a/my-blog/layouts/pds.html +++ /dev/null @@ -1,6 +0,0 @@ -{% extends "base.html" %} - -{% block title %}at-uri browser - {{ config.title }}{% endblock %} - -{% block content %} -{% endblock %} diff --git a/my-blog/layouts/post-complex.html b/my-blog/layouts/post-complex.html deleted file mode 100644 index 90e3624..0000000 --- a/my-blog/layouts/post-complex.html +++ /dev/null @@ -1,373 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ post.title }} - {{ config.title }}{% endblock %} - -{% block content %} -
- - - -
-{% endblock %} - -{% block sidebar %} - - - - - - - - - - - -{% endblock %} \ No newline at end of file diff --git a/my-blog/layouts/post-simple.html b/my-blog/layouts/post-simple.html deleted file mode 100644 index b2f29c4..0000000 --- a/my-blog/layouts/post-simple.html +++ /dev/null @@ -1,196 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ post.title }} - {{ config.title }}{% endblock %} - -{% block content %} -
-
-
-

{{ post.title }}

- -
- {% if post.markdown_url %} - - .md - - {% endif %} - {% if post.translation_url %} - - ๐ŸŒ {% if post.language == 'ja' %}English{% else %}ๆ—ฅๆœฌ่ชž{% endif %} - - {% endif %} -
-
- -
- {{ post.content | safe }} -
- - -
-
-

Comments

- - -
-

๐Ÿ“ To comment, authenticate with Bluesky:

- -

- After authentication, you can post comments that will be stored in your ATProto PDS. -

-
- -
-

Comments will appear here when posted via ATProto.

-
-
-
-
- - -
-{% endblock %} - -{% block sidebar %} - - - -{% endblock %} \ No newline at end of file diff --git a/my-blog/layouts/post.html b/my-blog/layouts/post.html deleted file mode 100644 index fd25a5a..0000000 --- a/my-blog/layouts/post.html +++ /dev/null @@ -1,106 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ post.title }} - {{ config.title }}{% endblock %} - -{% block content %} -
-
-
-

{{ post.title }}

- - {% if not post.extra.type or post.extra.type != "ai" %} -
- {% if post.markdown_url %} - - .md - - {% endif %} - {% if post.translation_url %} - - ๐ŸŒ {% if post.language == 'ja' %}English{% else %}ๆ—ฅๆœฌ่ชž{% endif %} - - {% endif %} -
- {% endif %} -
- - {% if not post.extra.type or post.extra.type != "ai" %} - - -
- {{ post.content | safe }} -
- {% endif %} - -
-
-
- - - -{% endblock %} - -{% block sidebar %} -{% endblock %} \ No newline at end of file diff --git a/my-blog/layouts/shortcodes/msg.html b/my-blog/layouts/shortcodes/msg.html deleted file mode 100644 index 05bff85..0000000 --- a/my-blog/layouts/shortcodes/msg.html +++ /dev/null @@ -1,14 +0,0 @@ -{{- $type := .Get "type" | default "info" -}} -{{- $content := .Get "content" -}} -
-
- {{- if eq $type "info" -}}โ„น๏ธ - {{- else if eq $type "warning" -}}โš ๏ธ - {{- else if eq $type "error" -}}โŒ - {{- else if eq $type "success" -}}โœ… - {{- else if eq $type "note" -}}๐Ÿ“ - {{- else -}}โ„น๏ธ - {{- end -}} -
-
{{ $content | markdownify }}
-
\ No newline at end of file diff --git a/my-blog/static/.well-known/jwks.json b/my-blog/static/.well-known/jwks.json deleted file mode 100644 index d8a3f40..0000000 --- a/my-blog/static/.well-known/jwks.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "keys": [ - { - "kty": "EC", - "crv": "P-256", - "x": "mock_x_coordinate_base64url", - "y": "mock_y_coordinate_base64url", - "d": "mock_private_key_base64url", - "use": "sig", - "kid": "ai-card-oauth-key-1", - "alg": "ES256" - } - ] -} \ No newline at end of file diff --git a/my-blog/static/_headers b/my-blog/static/_headers deleted file mode 100644 index cfcedae..0000000 --- a/my-blog/static/_headers +++ /dev/null @@ -1,51 +0,0 @@ -/* - X-Frame-Options: DENY - X-Content-Type-Options: nosniff - Referrer-Policy: strict-origin-when-cross-origin - X-XSS-Protection: 1; mode=block - Permissions-Policy: camera=(), microphone=(), geolocation=() - -# OAuth specific headers -/oauth/* - Access-Control-Allow-Origin: https://bsky.social - Access-Control-Allow-Methods: GET, POST, OPTIONS - Access-Control-Allow-Headers: Content-Type, Authorization - -# Static assets caching -/assets/* - Cache-Control: public, max-age=31536000, immutable - -/css/* - Content-Type: text/css - Cache-Control: no-cache - -/*.js - Content-Type: application/javascript - Cache-Control: public, max-age=31536000, immutable - -/assets/*.js - Content-Type: application/javascript - Cache-Control: public, max-age=31536000, immutable - -# Ensure ES6 modules are served correctly -/assets/comment-atproto-*.js - Content-Type: text/javascript; charset=utf-8 - Cache-Control: public, max-age=31536000, immutable - -# All JS assets -/assets/*-*.js - Content-Type: text/javascript; charset=utf-8 - Cache-Control: public, max-age=31536000, immutable - -# CSS assets -/assets/*.css - Content-Type: text/css - Cache-Control: public, max-age=60 - -/posts/* - Cache-Control: public, max-age=3600 - -# Client metadata for OAuth -/client-metadata.json - Content-Type: application/json - Cache-Control: public, max-age=3600 \ No newline at end of file diff --git a/my-blog/static/_redirects b/my-blog/static/_redirects deleted file mode 100644 index 7353c3f..0000000 --- a/my-blog/static/_redirects +++ /dev/null @@ -1,5 +0,0 @@ -# OAuth routes -/oauth/* /oauth/index.html 200 - -# SPA routing support -/* /index.html 200 \ No newline at end of file diff --git a/my-blog/static/apple-touch-icon.png b/my-blog/static/apple-touch-icon.png deleted file mode 100644 index fae8d5a..0000000 Binary files a/my-blog/static/apple-touch-icon.png and /dev/null differ diff --git a/my-blog/static/client-metadata.json b/my-blog/static/client-metadata.json deleted file mode 100644 index 37a408d..0000000 --- a/my-blog/static/client-metadata.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "client_id": "https://syui.ai/client-metadata.json", - "client_name": "ai.log", - "client_uri": "https://syui.ai", - "logo_uri": "https://syui.ai/favicon.ico", - "tos_uri": "https://syui.ai/terms", - "policy_uri": "https://syui.ai/privacy", - "redirect_uris": [ - "https://syui.ai/oauth/callback", - "https://syui.ai/" - ], - "response_types": [ - "code" - ], - "grant_types": [ - "authorization_code", - "refresh_token" - ], - "token_endpoint_auth_method": "none", - "scope": "atproto transition:generic", - "subject_type": "public", - "application_type": "web", - "dpop_bound_access_tokens": true -} diff --git a/my-blog/static/css/pds.css b/my-blog/static/css/pds.css deleted file mode 100644 index 4fc6867..0000000 --- a/my-blog/static/css/pds.css +++ /dev/null @@ -1,345 +0,0 @@ -@import url('./style.css'); - -.pds-container { -} - -.pds-header { - text-align: center; - margin-bottom: 40px; -} - -.pds-header h1 { - font-size: 2.5em; - margin-bottom: 10px; - color: #333; -} - -.pds-search-section { - border-radius: 8px; -} - -.pds-search-form { - display: flex; - justify-content: center; - padding: 0px 20px; -} - -.form-group { - display: flex; - align-items: center; -} - -.form-group input { - padding: 8px; - border: 1px solid #ddd; - border-radius: 4px 0 0 4px; - font-size: 14px; - width: 600px; - outline: none; - transition: box-shadow 0.2s, border-color 0.2s; -} - -.form-group input:focus { - border-color: var(--theme-color, #f40); -} - -.form-group button { - padding: 9px 15px; - background: #1976d2; - color: white; - border: none; - border-radius: 0 4px 4px 0; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - font-size: 14px; -} - -.form-group button:hover { - background: #1565c0; -} - -/* -.user-info { - background: white; - padding: 20px; - border-radius: 8px; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); -} -*/ - -.user-profile { - display: flex; - align-items: center; - gap: 15px; -} - -.user-details h3 { - margin: 0 0 5px 0; - color: #333; -} - -.user-details p { - margin: 0; - color: #666; -} - -.user-did-section { - margin: 20px 0; -} - -.did-display { - padding: 10px; - background: #f5f5f5; - border-radius: 4px; - font-family: monospace; - font-size: 14px; - color: #666; - word-break: break-all; - margin-bottom: 10px; -} - -.handle-display { - padding: 8px 10px; - background: #f0f9f0; - border-radius: 4px; - font-size: 13px; - color: #555; - margin-bottom: 8px; -} - -.handle-display strong { - color: #2e7d32; -} - -.handle-display span { - font-family: monospace; - font-size: 12px; - color: #666; - word-break: break-all; -} - - -.pds-display { - padding: 8px 10px; - background: #e8f4f8; - border-radius: 4px; - font-size: 13px; - color: #555; -} - -.pds-display strong { - color: #1976d2; -} - -.pds-display span { - font-family: monospace; - font-size: 12px; - color: #666; - word-break: break-all; -} - -.collections-section, -.records-section { - margin: 20px 0; -} - -.collections-section h3, -.records-section h3 { - font-size: 1.2em; - margin-bottom: 15px; - color: #333; - font-weight: bold; -} - -.collections-list, -.records-list { - display: flex; - flex-direction: column; - gap: 8px; -} - -.at-uri-link { - display: block; - padding: 8px 12px; - background: #f9f9f9; - border-radius: 4px; - border: 1px solid #e0e0e0; - color: #1976d2; - text-decoration: none; - font-family: monospace; - font-size: 14px; - word-break: break-all; - transition: all 0.2s; -} - -.at-uri-link:hover { - background: #e8f4f8; - border-color: #1976d2; - text-decoration: none; -} - -.pds-info { - padding: 8px 12px; - background: #f0f9ff; - border-radius: 4px; - border: 1px solid #b3e5fc; - margin-bottom: 8px; - color: #1976d2; - font-size: 12px; -} - -.collection-info { - padding: 8px 12px; - background: #f0f9f0; - border-radius: 4px; - border: 1px solid #b3e5b3; - margin-bottom: 8px; - color: #2e7d32; - font-size: 12px; -} - -.collections-header { - margin-bottom: 10px; -} - -.collections-toggle { - background: #f5f5f5; - border: 1px solid #ddd; - border-radius: 4px; - padding: 8px 12px; - cursor: pointer; - font-size: 14px; - color: #333; - transition: background-color 0.2s; -} - -.collections-toggle:hover { - background: #e8f4f8; - border-color: #1976d2; -} - - -.pds-test-section, -.pds-about-section { - margin-bottom: 40px; -} - -.pds-test-section h2, -.pds-about-section h2 { - font-size: 1.8em; - margin-bottom: 20px; - color: #333; - border-bottom: 2px solid #1976d2; - padding-bottom: 10px; -} - -.test-uris { - display: flex; - flex-direction: column; - gap: 10px; -} - -.at-uri { - background: #f5f5f5; - padding: 15px; - border-radius: 8px; - font-family: monospace; - font-size: 14px; - word-break: break-all; - cursor: pointer; - transition: background-color 0.2s; - border: 1px solid #e0e0e0; -} - -.at-uri:hover { - background: #e8f4f8; - border-color: #1976d2; -} - -.pds-about-section ul { - list-style-type: none; - padding: 0; -} - -.pds-about-section li { - padding: 5px 0; - color: #666; -} - - -/* AT URI Modal Styles */ -.at-uri-modal-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.5); - display: flex; - align-items: center; - justify-content: center; - z-index: 1000; -} - -.at-uri-modal-content { - background-color: white; - border-radius: 8px; - max-width: 800px; - max-height: 600px; - width: 90%; - height: 80%; - overflow: auto; - position: relative; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); -} - -.at-uri-modal-close { - position: absolute; - top: 10px; - right: 10px; - background: none; - border: none; - font-size: 20px; - cursor: pointer; - z-index: 1001; - padding: 5px 10px; -} - -/* Loading states */ -.loading { - text-align: center; - padding: 20px; - color: #666; -} - -.error { - text-align: center; - padding: 20px; - color: #d32f2f; - background: #ffeaea; - border-radius: 4px; - margin: 10px 0; -} - -/* Responsive design */ -@media (max-width: 768px) { - .pds-search-section { - display: none; - } - .pds-search-form { - flex-direction: column; - align-items: stretch; - } - - .form-group { - align-items: stretch; - } - - .form-group input { - width: 100%; - margin-bottom: 10px; - } -} - diff --git a/my-blog/static/css/style.css b/my-blog/static/css/style.css deleted file mode 100644 index 277dc14..0000000 --- a/my-blog/static/css/style.css +++ /dev/null @@ -1,1925 +0,0 @@ -/* Theme Colors */ -:root { - --theme-color: #f40; - --ai-color: #ff7; - --white: #fff; - --light-white: #f5f5f5; - --dark-white: #d1d9e0; - --light-gray: #f6f8fa; - --dark-gray: #666; - --background: #fff; -} - -/* Base styles */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; - line-height: 1.6; - color: #1f2328; - background-color: #ffffff; - font-size: 16px; -} - -/* Buttons */ -button { - background: linear-gradient(135deg, #667eea, #764ba2); - color: #fff; - border: none; - padding: 10px 20px; - border-radius: 5px; - cursor: pointer; - font-size: 1rem; -} - -/* Links */ -a:any-link { - color: var(--theme-color); - text-decoration-line: unset; - cursor: pointer; -} - -a:hover { - color: var(--theme-color); - opacity: 0.8; -} - -/* Override link color for specific buttons */ -a.view-markdown, -a.view-markdown:any-link { - color: #ffffff !important; - text-decoration: none !important; -} - -/* AI Conversation Styles */ - -.ai-conversation-display { - margin-bottom: 32px; -} - -/* Style adjustments for AI conversation in chat area */ -.ai-conversation-display .chat-message { - margin-bottom: 16px; - border-radius: 12px; - box-shadow: 0 2px 8px rgba(0,0,0,0.1); -} - -.ai-conversation-display .chat-message.ai-message { - background: linear-gradient(135deg, #f8f9ff, #f0f4ff); - border-left: 4px solid #667eea; -} - -.ai-conversation-display .chat-message.user-message { - background: linear-gradient(135deg, #fff8f0, #fff4f0); - border-left: 4px solid #ff6b35; -} - -.ai-conversation-display .message-header { - display: flex; - align-items: center; - margin-bottom: 12px; - padding: 12px 16px 0; -} - -.ai-conversation-display .message-content { - padding: 0 16px 16px; - line-height: 1.6; - color: #2d3748; -} - -.ai-conversation-display .avatar img { - width: 36px; - height: 36px; - border-radius: 50%; - margin-right: 12px; -} - -.ai-conversation-display .user-info { - flex: 1; -} - -.ai-conversation-display .display-name { - font-weight: 600; - color: #1a202c; - font-size: 14px; -} - -.ai-conversation-display .handle { - font-size: 12px; - color: #718096; -} - -.ai-conversation-display .handle a { - color: #667eea; - text-decoration: none; -} - -.ai-conversation-display .handle a:hover { - text-decoration: underline; -} - -/* Layout */ -.container { - min-height: 100vh; - display: grid; - grid-template-rows: auto 0fr 1fr auto; - grid-template-areas: - "header" - "ask-ai" - "main" - "footer"; -} - -/* Header */ -.main-header { - grid-area: header; - background: #ffffff; - border-bottom: 1px solid #d1d9e0; - padding: 17px 24px; - position: sticky; - top: 0; - z-index: 100; -} - -.header-content { - max-width: 800px; - margin: 0 auto; - display: grid; - grid-template-columns: 1fr auto 1fr; - align-items: center; - position: relative; -} - -.site-title { - color: var(--theme-color); - text-decoration: none; - font-size: 26px; - font-weight: 600; -} - -.logo { - grid-column: 2; - padding: 20px; -} - -.logo .likeButton { - height: 60px; - width: auto; - cursor: pointer; - background: transparent; - border: none; -} - -.header-actions { - grid-column: 3; - justify-self: end; - display: flex; - align-items: center; -} - -/* Ask AI Button */ -.ask-ai-btn { - background: var(--theme-color); - color: var(--white); - padding: 8px 16px; - border-radius: 6px; - cursor: pointer; - font-size: 14px; - font-weight: 500; - display: inline-flex; - align-items: center; - gap: 8px; - transition: background-color 0.2s; - margin: 0; -} - -.ask-ai-btn:hover { - filter: brightness(1.1); -} - -.ai-icon { - font-size: 16px; - width: 20px; - height: 20px; - color: var(--ai-color); - display: inline-block; - font-family: 'icomoon' !important; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - - -/* Ask AI Panel */ -.ask-ai-panel { - grid-area: ask-ai; - background: #f6f8fa; - border-bottom: 1px solid #d1d9e0; - padding: 24px; - overflow: hidden; -} - -.ask-ai-panel[style*="block"] { - display: block !important; -} - -.container:has(.ask-ai-panel[style*="block"]) { - grid-template-rows: auto auto 1fr auto; -} - -.ask-ai-content { - max-width: 800px; - margin: 0 auto; -} - -.ask-ai-form { - display: flex; - gap: 12px; - margin-bottom: 16px; -} - -.ask-ai-form input { - flex: 1; - padding: 8px 12px; - border: 1px solid #d1d9e0; - border-radius: 6px; - font-size: 14px; -} - -.auth-check { - background: #f6f8fa; - border: 1px solid #d1d9e0; - border-radius: 6px; - padding: 16px; - text-align: center; - margin-bottom: 16px; -} - -.main-content { - grid-area: main; - max-width: 800px; - margin: 0 auto; - padding: 0px; - width: 100%; -} - -/* Timeline */ -.timeline-container { - max-width: 600px; - margin: 0 auto; -} - -.timeline-header h2 { - color: #1f2328; - font-size: 24px; - font-weight: 600; - text-align: center; - margin-bottom: 24px; -} - -.timeline-feed { - display: flex; - flex-direction: column; - padding: 100px 0; - /* gap: 24px; */ -} - -.timeline-post { - background: #ffffff; - border: 1px solid #d1d9e0; - border-radius: 8px; - padding: 20px; - transition: box-shadow 0.2s; -} - -.timeline-post:hover { - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); -} - -.post-title a { - color: var(--theme-color); - text-decoration: none; - font-size: 20px; - font-weight: 600; -} - -.post-title a:hover { - color: var(--theme-color); -} - -.post-date { - color: #656d76; - font-size: 14px; -} - -.post-excerpt { - color: #656d76; - margin: 16px 0; - line-height: 1.5; -} - -.post-actions { - display: flex; - gap: 16px; - align-items: center; -} - -.read-more { - color: var(--theme-color); - text-decoration: none; - font-size: 14px; - font-weight: 500; -} - -.read-more:hover { - text-decoration: underline; -} - -.view-markdown, .view-translation { - color: #656d76; - text-decoration: none; - font-size: 14px; - padding: 4px 8px; - border-radius: 4px; - transition: all 0.2s; -} - -.view-markdown { - background: var(--theme-color) !important; - color: #ffffff !important; - border: 1px solid var(--theme-color); -} - -.view-markdown:hover { - filter: brightness(1.1); - color: #ffffff !important; - background: var(--theme-color) !important; -} - -.view-translation:hover { - background: #f6f8fa; -} - -.post-meta { - display: flex; - gap: 12px; - align-items: center; -} - -.post-lang { - background: #f6f8fa; - color: #656d76; - padding: 2px 8px; - border-radius: 4px; - font-size: 12px; - font-weight: 500; -} - -/* Article */ -.article-container { - max-width: 800px; - margin: 0 auto; - padding: 100px 0; -} - -/* article.article-content { padding: 10px; } */ - -.article-meta { - display: flex; - gap: 16px; - align-items: center; - margin-bottom: 16px; -} - -.article-date { - color: #656d76; - font-size: 14px; -} - -.article-lang { - background: #f6f8fa; - color: #656d76; - padding: 4px 8px; - border-radius: 4px; - font-size: 12px; - font-weight: 500; -} - -.article-actions { - display: flex; - gap: 12px; - padding: 15px 0; -} - -.action-btn { - color: var(--theme-color); - text-decoration: none; - font-size: 14px; - padding: 6px 12px; - border: 1px solid #d1d9e0; - border-radius: 6px; - transition: all 0.2s; -} - -.action-btn:hover { - background: #f6f8fa; - border-color: var(--theme-color); -} - -.markdown-btn { - background: var(--dark-white); - color: var(--white); - border-color: var(--white); -} - -.markdown-btn:link, -.markdown-btn:visited { - color: var(--white) !important; -} - -.markdown-btn:hover { - filter: brightness(0.9); - color: var(--theme-color) !important; - border-color: var(--white); -} - -.toc { - background: #f6f8fa; - border: 1px solid #d1d9e0; - border-radius: 8px; - padding: 16px; - margin: 20px 0; -} - -.toc h3 { - color: #1f2328; - font-size: 16px; - font-weight: 600; - margin-bottom: 12px; -} - -.toc-list { - list-style: none; - padding: 0; -} - -.toc-item { - margin-bottom: 8px; -} - -/* Hierarchy indentation for TOC */ -.toc-item.toc-h1 .toc-link { - padding-left: 0; - font-weight: 600; - font-size: 14px; -} - -.toc-item.toc-h2 .toc-link { - padding-left: 0; - font-weight: 500; - font-size: 14px; -} - -.toc-item.toc-h3 .toc-link { - padding-left: 16px; - font-weight: 400; - font-size: 13px; -} - -.toc-item.toc-h4 .toc-link { - padding-left: 32px; - font-weight: 400; - font-size: 12px; - opacity: 0.9; -} - -.toc-item.toc-h5 .toc-link { - padding-left: 48px; - font-weight: 400; - font-size: 12px; - opacity: 0.8; -} - -.toc-item.toc-h6 .toc-link { - padding-left: 64px; - font-weight: 400; - font-size: 11px; - opacity: 0.7; -} - -.toc-link { - color: #656d76; - text-decoration: none; - font-size: 14px; - line-height: 1.4; - display: block; - padding: 4px 0; - transition: color 0.2s; -} - -.toc-link:hover { - color: var(--theme-color); -} - -.article-title { - color: #1f2328; - font-size: 32px; - font-weight: 600; - margin-bottom: 16px; - line-height: 1.25; -} - -article.article-content { - word-wrap: break-word; - max-width: 800px; - margin: 0 auto; - width: 100%; - box-sizing: border-box; -} - -.article-body { - color: #1f2328; - line-height: 1.6; - font-size: 20px; - padding: 20px; - padding-bottom:200px; -} - -.article-body img { - max-width: 100%; - height: auto; - display: block; - margin: 16px auto; -} - -/* Apple Live Text overlay fix */ -.article-body div#image-overlay { - max-width: 100% !important; - contain: layout; -} - -/* Ensure images and their containers don't overflow */ -.article-body p:has(img) { - overflow: hidden; - max-width: 100%; -} - -.article-body h1, .article-body h2, .article-body h3 { - color: #1f2328; - margin-top: 24px; - margin-bottom: 16px; - font-weight: 600; -} - -.article-body p { - margin-bottom: 16px; -} - -.article-body ol, .article-body ul { - margin: 16px 0; - padding-left: 24px; -} - -.article-body li { - margin-bottom: 8px; - line-height: 1.6; -} - -.article-body ol li { - list-style-type: decimal; -} - -.article-body ul li { - list-style-type: disc; -} - -.article-body pre { - background: #1B1D1E !important; - border: 1px solid #3E3D32; - border-radius: 8px; - padding: 0; - overflow: hidden; - margin: 16px 0; - font-size: 14px; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); -} - -/* File name display for code blocks - top bar style */ -.article-body pre[data-filename]::before { - content: attr(data-filename); - display: block; - background: #2D2D30; - color: #AE81FF; - padding: 8px 16px; - font-size: 18px; - font-family: 'SF Mono', 'Monaco', 'Cascadia Code', 'Roboto Mono', monospace; - border-bottom: 1px solid #3E3D32; - margin: 0; - width: 100%; - box-sizing: border-box; -} - -.article-body pre code { - display: block; - background: none !important; - padding: 30px 16px; - color: #F8F8F2 !important; - font-family: 'SF Mono', 'Monaco', 'Cascadia Code', 'Roboto Mono', monospace; - overflow-x: auto; - line-height: 1.4; -} - -/* Adjust padding when filename is present */ -.article-body pre[data-filename] code { - padding: 16px; -} - -/* Inline code (not in pre blocks) */ -.article-body code { - background: var(--light-white); - color: var(--dark-gray); - padding: 2px 6px; - border-radius: 4px; - font-family: 'SF Mono', 'Monaco', 'Cascadia Code', 'Roboto Mono', monospace; - font-size: 18px; -} - -/* Molokai syntax highlighting */ -.article-body pre code .hljs-keyword { color: #F92672; } -.article-body pre code .hljs-string { color: #E6DB74; } -.article-body pre code .hljs-comment { color: #88846F; font-style: italic; } -.article-body pre code .hljs-number { color: #AE81FF; } -.article-body pre code .hljs-variable { color: #FD971F; } -.article-body pre code .hljs-function { color: #A6E22E; } -.article-body pre code .hljs-tag { color: #F92672; } -.article-body pre code .hljs-attr { color: #A6E22E; } -.article-body pre code .hljs-value { color: #E6DB74; } - -/* Fix inline span colors in code blocks */ -.article-body pre code span[style*="color:#8fa1b3"] { color: #AE81FF !important; } /* $ prompt */ -.article-body pre code span[style*="color:#c0c5ce"] { color: #F8F8F2 !important; } /* commands */ -.article-body pre code span[style*="color:#75715E"] { color: #88846F !important; } /* real comments */ - -/* Shell/Bash specific fixes */ -.article-body pre code span[style*="color:#65737e"] { - color: #F8F8F2 !important; /* Default to white for variables and code */ -} - -/* Comments in shell scripts - lines that contain # followed by text */ -.article-body pre code span[style*="color:#65737e"]:has-text("#") { - color: #88846F !important; -} - -/* Alternative approach - check content */ -.article-body pre code { - /* Reset all gray colored text to white by default */ -} - -.article-body pre code span[style*="color:#65737e"] { - /* Check if the content starts with # */ - color: #F8F8F2 !important; -} - -/* Override for actual comments - this is a workaround */ -.article-body pre code > span:first-child[style*="color:#65737e"] { - color: #88846F !important; /* Real comments = gray */ -} - -/* Footer */ -.main-footer { - grid-area: footer; - background: var(--light-white); - border-top: 1px solid #d1d9e0; - padding: 32px 24px; - text-align: center; -} - -.footer-social { - display: flex; - justify-content: center; - gap: 24px; - margin: 40px; -} - -.footer-social a { - color: var(--dark-gray) !important; - text-decoration: none !important; - font-size: 25px; - transition: all 0.2s ease; -} - -.footer-social a:hover { - color: var(--theme-color) !important; - opacity: 0.8; -} - -.main-footer p { - color: #656d76; - font-size: 20px; - margin: 0; -} - -/* Chat Messages */ -.chat-message.comment-style { - background: #ffffff; - border: 1px solid #d1d9e0; - border-left: 4px solid var(--theme-color); - border-radius: 8px; - padding: 16px; - margin-bottom: 12px; -} - -.chat-message.ai-message.comment-style { - border-left: 4px solid var(--ai-color); - background: #faf8ff; -} - -.message-header { - display: flex; - align-items: center; - gap: 12px; - margin-bottom: 12px; -} - -.message-header .avatar { - width: 40px; - height: 40px; - border-radius: 50%; - background: #f6f8fa; - display: flex; - align-items: center; - justify-content: center; - font-size: 20px; - border: 1px solid #d1d9e0; -} - -.display-name { - font-weight: 600; - color: #1f2328; - font-size: 14px; -} - -.handle { - color: #656d76; - font-size: 13px; -} - -.timestamp { - color: #656d76; - font-size: 12px; -} - -.message-content { - color: #1f2328; - line-height: 1.5; - white-space: pre-wrap; -} - -.profile-avatar { - width: 100%; - height: 100%; - border-radius: 50%; - object-fit: cover; -} - -/* Loading Animation */ -.ai-loading-simple { - display: flex; - align-items: center; - gap: 8px; - padding: 10px 15px; - background: linear-gradient(90deg, #f8f9fa 0%, #e9ecef 100%); - border-radius: 20px; - margin: 8px 0; - font-size: 14px; - color: #495057; - border: 1px solid #dee2e6; - animation: slideIn 0.3s ease-out; -} - -@keyframes slideIn { - from { - opacity: 0; - transform: translateY(-10px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -/* Comment System Styles */ -.comment-section { - max-width: 800px; - margin: 0 auto; -} - -.comment-container { - max-width: 600px; - margin: 0 auto; - text-align: center; -} - -.comment-section h3 { - color: #1f2328; - font-size: 24px; - font-weight: 600; - margin-bottom: 32px; -} - -/* OAuth Comment System - Hide on homepage by default, show on post pages */ -.timeline-container .comment-section { - display: block; /* Show on homepage */ -} - -.timeline-container .comment-section .comments-list > :nth-child(n+6) { - display: none; /* Hide comments after the 5th one */ -} - -.article-container .comment-section, -.article-content + .comment-section { - display: block; /* Show all comments on post pages */ -} - -/* Responsive */ -@media (max-width: 1000px) { - .article-container { - max-width: 100%; - padding: 50px 20px; - margin: 0; - } -} - -@media (max-width: 1000px) { - .main-header { - padding: 0px; - } - - .header-content { - max-width: 100%; - padding: 0 20px; - grid-template-columns: auto 1fr auto; - gap: 0; - } - - /* OAuth app mobile fixes - prevent overflow and content issues */ - .oauth-app-header { - padding: 0px !important; - margin: 0px !important; - border: none !important; - } - - .oauth-header-content { - max-width: 100% !important; - padding: 10px 20px !important; - margin: 0px !important; - } - - .oauth-header-actions { - width: auto !important; - max-width: 100% !important; - overflow: hidden !important; - } - - .main-content { - padding: 0px !important; - margin: 0px !important; - max-width: 100% !important; - } - - .content-area { - padding: 0px !important; - margin: 0px !important; - } - - .card { - margin: 0px !important; - border-radius: 0px !important; - border-left: none !important; - border-right: none !important; - max-width: 100% !important; - } - - .card-content { - padding: 15px !important; - } - - .comment-form { - padding: 15px !important; - } - - .record-item { - padding: 15px !important; - margin: 0px !important; - border-left: none !important; - border-right: none !important; - } - - .record-content { - word-wrap: break-word !important; - overflow-wrap: break-word !important; - max-width: 100% !important; - } - - .record-meta { - word-break: break-all !important; - overflow-wrap: break-word !important; - flex-wrap: wrap !important; - } - - .record-url { - word-break: break-all !important; - max-width: 100% !important; - } - - /* - .form-group { - margin-bottom: 15px !important; - } - */ - - .form-input, .form-textarea { - width: 100% !important; - max-width: 100% !important; - box-sizing: border-box !important; - padding: 12px !important; - } - - .auth-section { - padding: 0px !important; - max-width: 100% !important; - overflow: hidden !important; - } - - .auth-section.search-bar-layout { - width: 100% !important; - max-width: 100% !important; - } - - .auth-section.search-bar-layout .handle-input { - max-width: calc(100% - 80px) !important; - width: calc(100% - 80px) !important; - } - - .auth-button { - white-space: nowrap !important; - min-width: 70px !important; - } - - .tab-header { - overflow-x: auto !important; - -webkit-overflow-scrolling: touch !important; - } - - .tab-btn { - white-space: nowrap !important; - min-width: auto !important; - padding: 12px 16px !important; - } - - .json-content { - font-size: 10px !important; - padding: 8px !important; - overflow-x: auto !important; - -webkit-overflow-scrolling: touch !important; - } - - .ask-ai-container { - margin: 0px !important; - border-radius: 0px !important; - border-left: none !important; - border-right: none !important; - } - - .chat-container { - height: 250px !important; - padding: 12px !important; - } - - .question-form { - padding: 12px !important; - } -} - -/* Profile Display Styles */ -.profile-avatar-fallback { - width: 40px; - height: 40px; - border-radius: 50%; - background: var(--theme-color); - color: var(--white); - display: flex; - align-items: center; - justify-content: center; - font-size: 16px; - font-weight: 700; -} - -.admin-badge { - background: var(--theme-color); - color: var(--white); - font-size: 10px; - padding: 2px 6px; - border-radius: 10px; - font-weight: 500; - margin-left: 8px; -} - -.loading-message, .error-message, .no-profiles { - text-align: center; - padding: 20px; - color: var(--dark-gray); -} - -.error-message { - color: #d32f2f; -} - - .input-container { - flex-direction: column !important; - gap: 12px !important; - } - - .question-input { - width: 100% !important; - box-sizing: border-box !important; - } - - .send-btn { - width: 100% !important; - height: 44px !important; - } - - /* Hide site title text on mobile */ - .site-title { - display: none; - } - - /* Left align logo on mobile */ - .logo { - grid-column: 1; - justify-self: left; - padding: 5px; - display: flex; - justify-content: flex-start; - align-items: center; - } - - /* Reduce logo size on mobile */ - .logo .likeButton { - width: 40pt; - height: 40pt; - } - - /* Position AI button on the right */ - .header-actions { - grid-column: 3; - justify-self: end; - } - - /* Ask AI button mobile style - icon only */ - .ask-ai-btn { - padding: 8px; - min-width: 40px; - justify-content: center; - gap: 0; - font-size: 0; /* Hide all text content */ - } - - .ask-ai-btn .ai-icon { - margin: 0; - font-size: 16px; - } - - .ask-ai-panel { - padding: 16px; - } - - /* Article content mobile optimization */ - .article-body { - overflow-x: hidden; - padding: 10px; - padding-bottom: 50px; - } - - .article-body pre { - margin: 16px 0; - border-radius: 4px; - max-width: 100%; - overflow-x: auto; - } - - .article-body pre code { - padding: 20px 12px; - word-wrap: break-word; - white-space: pre-wrap; - } - - /* Mobile filename display */ - .article-body pre[data-filename]::before { - padding: 6px 12px; - font-size: 11px; - } - - .article-body pre[data-filename] code { - padding: 12px; - } - - .article-body code { - word-break: break-all; - } - - .ask-ai-form { - flex-direction: column; - } - - .timeline-container { - max-width: 100%; - padding: 0; - } - - .timeline-post { - padding: 16px; - } - - .article-title { - font-size: 24px; - padding: 10px; - } - - .message-header .avatar { - width: 32px; - height: 32px; - font-size: 16px; - } - - /* Center content on mobile */ - body { - margin: 0; - padding: 0; - } - - .container { - width: 100%; - padding: 0; - } - - .comment-section { - padding: 50px 0; - } - - .article-meta { - padding: 10px; - } - - .article-actions { - padding: 10px; - } - - -} - -/* Loading spinner for Ask AI panel */ -.loading-content { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 20px; -} - -.loading-spinner { - width: 20px; - height: 20px; - border: 2px solid #f3f3f3; - border-top: 2px solid var(--theme-color); - border-radius: 50%; - animation: spin 1s linear infinite; - margin-bottom: 10px; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -.loading-content p { - margin: 0; - color: #656d76; - font-size: 14px; -} - -/* Handle links in chat messages */ -.message-header .handle a { - color: #656d76; - text-decoration: none; - transition: color 0.2s; -} - -.message-header .handle a:hover { - color: var(--theme-color); - text-decoration: underline; -} - -@media (max-width: 1000px) { - .main-content { - padding: 0px; - max-width: 100%; - } - article.article-content { - max-width: 100%; - } - .timeline-feed { - padding: 0px; - } -} - -/* Image Comparison Slider Styles */ -.img-comparison-container { - position: relative; - width: 100%; - max-width: 800px; - margin: 20px auto; - overflow: hidden; - border-radius: 8px; - box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); -} - -.img-comparison-slider { - position: relative; - width: 100%; - height: 400px; - overflow: hidden; - cursor: pointer; -} - -.img-before, -.img-after { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; -} - -.img-before { - z-index: 2; - clip-path: inset(0 50% 0 0); -} - -.img-after { - z-index: 1; -} - -.img-before img, -.img-after img { - width: 100%; - height: 100%; - object-fit: cover; - user-select: none; - pointer-events: none; - position: absolute; - top: 0; - left: 0; -} - -.slider { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: transparent; - outline: none; - cursor: pointer; - z-index: 4; - opacity: 0; - -webkit-appearance: none; - appearance: none; -} - -.slider::-webkit-slider-thumb { - -webkit-appearance: none; - appearance: none; - width: 0; - height: 0; -} - -.slider::-moz-range-thumb { - width: 0; - height: 0; - border: none; - background: transparent; -} - -.slider-thumb { - position: absolute; - top: 0; - left: 50%; - width: 4px; - height: 100%; - background: #ffffff; - z-index: 3; - pointer-events: none; - box-shadow: 0 0 8px rgba(0, 0, 0, 0.3); - transform: translateX(-50%); -} - -.slider-thumb::before { - content: ''; - position: absolute; - top: 50%; - left: 50%; - width: 40px; - height: 40px; - background: #ffffff; - border: 2px solid var(--theme-color); - border-radius: 50%; - transform: translate(-50%, -50%); - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); -} - -.slider-thumb::after { - content: 'โ†”'; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - color: var(--theme-color); - font-size: 16px; - font-weight: bold; - z-index: 1; -} - - -/* Responsive design */ -@media (max-width: 768px) { - .img-comparison-container { - margin: 15px auto; - border-radius: 6px; - } - - .img-comparison-slider { - height: 250px; - } - - .slider-thumb::before { - width: 32px; - height: 32px; - } - - .slider-thumb::after { - font-size: 14px; - } -} - -@media (max-width: 480px) { - .img-comparison-slider { - height: 200px; - } - - .slider-thumb::before { - width: 28px; - height: 28px; - } - - .slider-thumb::after { - font-size: 12px; - } -} - -/* Message Components */ -.msg { - display: flex; - align-items: flex-start; - margin: 20px 0; - padding: 16px; - border-radius: 8px; - border-left: 4px solid; - font-size: 14px; - line-height: 1.5; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); -} - -.msg-symbol { - font-size: 18px; - font-weight: bold; - margin-right: 12px; - margin-top: 2px; - min-width: 20px; - text-align: center; -} - -.msg-content { - flex: 1; -} - -.msg-content p { - margin: 0; - color: inherit; -} - -/* Message type styles */ -.msg.message { - background-color: #f0f8ff; - border-left-color: #2196f3; - color: #1565c0; -} - -.msg.message .msg-symbol { - color: #2196f3; -} - -.msg.warning { - background-color: #fffbf0; - border-left-color: #ff9800; - color: #f57c00; -} - -.msg.warning .msg-symbol { - color: #ff9800; -} - -.msg.error { - background-color: #fff5f5; - border-left-color: #f44336; - color: #d32f2f; -} - -.msg.error .msg-symbol { - color: #f44336; -} - -.msg.success { - background-color: #f0fff0; - border-left-color: #4caf50; - color: #388e3c; -} - -.msg.success .msg-symbol { - color: #4caf50; -} - -.msg.note { - background-color: #faf5ff; - border-left-color: #9c27b0; - color: #7b1fa2; -} - -.msg.note .msg-symbol { - color: #9c27b0; -} - -/* Responsive message styles */ -@media (max-width: 768px) { - .msg { - margin: 15px 0; - padding: 12px; - font-size: 13px; - } - - .msg-symbol { - font-size: 16px; - margin-right: 8px; - } -} - -@media (max-width: 480px) { - .msg { - margin: 10px 0; - padding: 10px; - font-size: 12px; - } - - .msg-symbol { - font-size: 14px; - margin-right: 6px; - } -} - -/* AI Conversation Display Styles */ -.ai-conversation-notice { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - color: white; - padding: 16px; - border-radius: 8px; - margin-bottom: 24px; - text-align: center; -} - -.ai-conversation-display { - margin: 24px 0; -} - -.ai-conversation-loading { - text-align: center; - padding: 32px; - color: #666; -} - -.ai-conversation-list { - max-width: none; -} - -.ai-conversation-pair { - margin-bottom: 32px; - border: 1px solid #e1e4e8; - border-radius: 12px; - overflow: hidden; - background: #fff; - box-shadow: 0 2px 8px rgba(0,0,0,0.05); -} - -.ai-question { - background: #f8f9fa; - border-bottom: 1px solid #e1e4e8; -} - -.ai-answer { - background: #fff; -} - -.ai-question .message-header, -.ai-answer .message-header { - display: flex; - align-items: center; - padding: 16px 20px 8px 20px; - gap: 12px; -} - -.ai-question .avatar, -.ai-answer .avatar { - width: 40px; - height: 40px; - border-radius: 50%; - object-fit: cover; - border: 2px solid #e1e4e8; -} - -.ai-question .user-info, -.ai-answer .user-info { - flex: 1; -} - -.ai-question .display-name, -.ai-answer .display-name { - font-weight: 600; - font-size: 14px; - color: #1f2328; - margin-bottom: 2px; -} - -.ai-question .handle, -.ai-answer .handle { - font-size: 12px; - color: #656d76; -} - -.ai-question .message-content, -.ai-answer .message-content { - padding: 8px 20px 20px 20px; - font-size: 15px; - line-height: 1.6; - color: #1f2328; - white-space: pre-wrap; -} - -.ai-question .message-content { - background: #f8f9fa; - border-left: 4px solid #0969da; - margin-left: 16px; - margin-right: 16px; - border-radius: 0 6px 6px 0; - padding-left: 16px; -} - -.ai-answer .message-content { - background: #fff; - border-left: 4px solid #7c3aed; - margin-left: 16px; - margin-right: 16px; - border-radius: 0 6px 6px 0; - padding-left: 16px; -} - -/* Responsive styles for AI conversation */ -@media (max-width: 768px) { - .ai-conversation-pair { - margin-bottom: 24px; - border-radius: 8px; - } - - .ai-question .message-header, - .ai-answer .message-header { - padding: 12px 16px 6px 16px; - gap: 10px; - } - - .ai-question .avatar, - .ai-answer .avatar { - width: 32px; - height: 32px; - } - - .ai-question .message-content, - .ai-answer .message-content { - padding: 6px 16px 16px 16px; - font-size: 14px; - margin-left: 12px; - margin-right: 12px; - padding-left: 12px; - } -} - -@media (max-width: 480px) { - .ai-conversation-pair { - margin-bottom: 20px; - border-radius: 6px; - } - - .ai-question .message-header, - .ai-answer .message-header { - padding: 10px 12px 4px 12px; - gap: 8px; - } - - .ai-question .avatar, - .ai-answer .avatar { - width: 28px; - height: 28px; - } - - .ai-question .display-name, - .ai-answer .display-name { - font-size: 13px; - } - - .ai-question .handle, - .ai-answer .handle { - font-size: 11px; - } - - .ai-question .message-content, - .ai-answer .message-content { - padding: 4px 12px 12px 12px; - font-size: 13px; - margin-left: 8px; - margin-right: 8px; - padding-left: 10px; - } -} - -/* AI Conversation Integration Styles */ -.chat-separator { - margin: 24px 0; - border-bottom: 1px solid var(--dark-white); -} - -.article-body .chat-message { - margin-bottom: 24px; - background: var(--background); - border: 1px solid var(--dark-white); - border-radius: 6px; - padding: 16px; - transition: background 0.2s, border-color 0.2s; -} - -.article-body .chat-message:hover { - background: var(--light-gray); - border-color: var(--dark-gray); -} - -.article-body .chat-message.user-message { - border-left: 4px solid var(--theme-color); -} - -.article-body .chat-message.ai-message { - border-left: 4px solid var(--ai-color); - background: #faf8ff; -} - -.article-body .message-header { - display: flex; - align-items: center; - gap: 12px; - margin-bottom: 12px; -} - - -.article-body .message-header .avatar { - width: 40px; - height: 40px; - border-radius: 50%; - background: var(--light-gray); - display: flex; - align-items: center; - justify-content: center; - font-size: 16px; - border: 1px solid var(--dark-white); - flex-shrink: 0; -} - -.article-body .message-header .user-info { - flex: 1; -} - -.article-body .message-header .display-name { - font-weight: 600; - color: #1f2328; - font-size: 15px; -} - -.article-body .message-header .handle { - color: var(--dark-gray); - font-size: 13px; -} - -.article-body .message-header .handle-link { - color: var(--dark-gray); - text-decoration: none; -} - -.article-body .message-header .handle-link:hover { - color: var(--theme-color); - text-decoration: underline; -} - -.article-body .message-content { - color: #1f2328; - line-height: 1.5; - white-space: pre-wrap; - word-wrap: break-word; -} - -/* Ensure proper spacing for markdown content in chat messages */ -.article-body .message-content h1, -.article-body .message-content h2, -.article-body .message-content h3, -.article-body .message-content h4, -.article-body .message-content h5, -.article-body .message-content h6 { - margin-top: 1.5rem; - margin-bottom: 1rem; - font-weight: 600; - line-height: 1.25; -} - -.article-body .message-content p { - margin-bottom: 1rem; -} - -.article-body .message-content ul, -.article-body .message-content ol { - margin-bottom: 1rem; - padding-left: 1.5rem; -} - -.article-body .message-content li { - margin-bottom: 0.5rem; -} - -.article-body .message-content blockquote { - margin: 1rem 0; - padding-left: 1rem; - border-left: 3px solid var(--dark-white); - color: var(--dark-gray); -} - -.article-body .message-content pre { - background: #f6f8fa; - border: 1px solid var(--dark-white); - border-radius: 6px; - padding: 16px; - overflow-x: auto; - margin: 1rem 0; -} - -.article-body .message-content code { - background: #f6f8fa; - padding: 2px 4px; - border-radius: 3px; - font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace; - font-size: 0.9em; -} - -.article-body .message-content table { - width: 100%; - border-collapse: collapse; - margin: 1rem 0; -} - -.article-body .message-content table th, -.article-body .message-content table td { - padding: 8px 12px; - border: 1px solid var(--dark-white); - text-align: left; -} - -.article-body .message-content table th { - background: var(--light-gray); - font-weight: 600; -} - -button.ask-at-btn { - margin: 10px; - background: var(--theme-color); - padding: 8px 16px; -} - -button.ask-at-btn a { - color: var(--ai-color); -} - -button#searchButton.pds-btn { - background: var(--theme-color); -} - -/* Table Styles */ -.article-body table { - width: 100%; - border-collapse: collapse; - margin: 20px 0; - font-size: 15px; - line-height: 1.6; - color: #333; - border: 1px solid #ddd; - box-shadow: 0 1px 3px rgba(0,0,0,0.1); - border-radius: 8px; - overflow: hidden; /* Ensures rounded corners apply to content */ -} - -.article-body th, -.article-body td { - padding: 12px 15px; - text-align: left; - border-bottom: 1px solid #ddd; -} - -.article-body thead { - background-color: #f2f2f2; - color: #333; -} - -.article-body th { - font-weight: 600; -} - -.article-body tbody tr:nth-child(odd) { - background-color: #f9f9f9; -} - -.article-body tbody tr:hover { - background-color: #f1f1f1; -} - -/* Responsive Table */ -@media screen and (max-width: 600px) { - .article-body table { - border: 0; - } - - .article-body table thead { - display: none; - } - - .article-body table tr { - margin-bottom: 10px; - display: block; - border: 1px solid #ddd; - border-radius: 8px; - } - - .article-body table td { - border-bottom: 1px solid #ddd; - display: block; - text-align: right; - padding-left: 50%; - position: relative; - } - - .article-body table td::before { - content: attr(data-label); - position: absolute; - left: 15px; - width: calc(50% - 30px); - padding-right: 10px; - white-space: nowrap; - text-align: left; - font-weight: 600; - color: #555; - } - - .article-body table td:last-child { - border-bottom: 0; - } -} diff --git a/my-blog/static/css/svg-animation-package.css b/my-blog/static/css/svg-animation-package.css deleted file mode 100644 index 99f246a..0000000 --- a/my-blog/static/css/svg-animation-package.css +++ /dev/null @@ -1,342 +0,0 @@ -/* SVG Animation Package - Dependency-free standalone package - * Based on svg-animation-particle-circle.css - * Theme color integration with CSS variables - */ - -/* Theme-based color variables for particles */ -:root { - --particle-color-1: #f40; /* theme-color base */ - --particle-color-2: #f50; /* theme-color +0.1 brightness */ - --particle-color-3: #f60; /* theme-color +0.2 brightness */ - --particle-color-4: #f70; /* theme-color +0.3 brightness */ - --particle-color-5: #f80; /* theme-color +0.4 brightness */ - --explosion-color: #f30; /* theme-color -0.1 brightness */ - --syui-color: #f40; /* main theme color */ -} - -/* Core SVG button setup */ -.likeButton { - cursor: pointer; - display: inline-block; -} - -/* Remove debug animation and restore hover functionality */ - -.likeButton .border { - fill: white; -} - -/* Explosion circle - initially hidden */ -.likeButton .explosion { - transform-origin: center center; - transform: scale(1); - stroke: var(--explosion-color); - fill: none; - opacity: 0; - stroke-width: 1; -} - -/* Particle layer - initially hidden */ -.likeButton .particleLayer { - opacity: 0; - transform: scale(0); /* Ensure particles start hidden */ -} - -.likeButton .particleLayer circle { - opacity: 0; - transform-origin: center center; /* Fixed from 250px 250px */ - transform: scale(0); -} - -/* Syui logo - main animation target */ -.likeButton .syui { - fill: var(--syui-color); - transform: scale(1); - transform-origin: center center; -} - -/* Hover trigger - replaces jQuery */ -.likeButton:hover .explosion { - animation: explosionAnime 800ms forwards; -} - -.likeButton:hover .particleLayer { - animation: particleLayerAnime 800ms forwards; -} - -.likeButton:hover .syui, -.likeButton:hover path.syui { - animation: syuiDeluxeAnime 400ms forwards; -} - -/* Individual particle animations */ -.likeButton:hover .particleLayer circle:nth-child(1) { - animation: particleAnimate1 800ms; - animation-fill-mode: forwards; -} - -.likeButton:hover .particleLayer circle:nth-child(2) { - animation: particleAnimate2 800ms; - animation-fill-mode: forwards; -} - -.likeButton:hover .particleLayer circle:nth-child(3) { - animation: particleAnimate3 800ms; - animation-fill-mode: forwards; -} - -.likeButton:hover .particleLayer circle:nth-child(4) { - animation: particleAnimate4 800ms; - animation-fill-mode: forwards; -} - -.likeButton:hover .particleLayer circle:nth-child(5) { - animation: particleAnimate5 800ms; - animation-fill-mode: forwards; -} - -.likeButton:hover .particleLayer circle:nth-child(6) { - animation: particleAnimate6 800ms; - animation-fill-mode: forwards; -} - -.likeButton:hover .particleLayer circle:nth-child(7) { - animation: particleAnimate7 800ms; - animation-fill-mode: forwards; -} - -.likeButton:hover .particleLayer circle:nth-child(8) { - animation: particleAnimate8 800ms; - animation-fill-mode: forwards; -} - -.likeButton:hover .particleLayer circle:nth-child(9) { - animation: particleAnimate9 800ms; - animation-fill-mode: forwards; -} - -.likeButton:hover .particleLayer circle:nth-child(10) { - animation: particleAnimate10 800ms; - animation-fill-mode: forwards; -} - -.likeButton:hover .particleLayer circle:nth-child(11) { - animation: particleAnimate11 800ms; - animation-fill-mode: forwards; -} - -.likeButton:hover .particleLayer circle:nth-child(12) { - animation: particleAnimate12 800ms; - animation-fill-mode: forwards; -} - -.likeButton:hover .particleLayer circle:nth-child(13) { - animation: particleAnimate13 800ms; - animation-fill-mode: forwards; -} - -.likeButton:hover .particleLayer circle:nth-child(14) { - animation: particleAnimate14 800ms; - animation-fill-mode: forwards; -} - -/* Keyframe animations */ -@keyframes explosionAnime { - 0% { - opacity: 0; - transform: scale(0.01); - } - 1% { - opacity: 1; - transform: scale(0.01); - } - 5% { - stroke-width: 200; - } - 20% { - stroke-width: 300; - } - 50% { - stroke: var(--particle-color-3); - transform: scale(1.1); - stroke-width: 1; - } - 50.1% { - stroke-width: 0; - } - 100% { - stroke: var(--particle-color-3); - transform: scale(1.1); - stroke-width: 0; - } -} - -@keyframes particleLayerAnime { - 0% { - transform: translate(0, 0); - opacity: 0; - } - 30% { - opacity: 0; - } - 31% { - opacity: 1; - } - 60% { - transform: translate(0, 0); - } - 70% { - opacity: 1; - } - 100% { - opacity: 0; - transform: translate(0, -20px); - } -} - -/* Syui Deluxe Animation - Based on 2019 blog post */ -@keyframes syuiDeluxeAnime { - 0% { - fill: var(--syui-color); - transform: scale(1) translate(0%, 0%); - } - 40% { - fill: color-mix(in srgb, var(--syui-color) 40%, transparent); - transform: scale(1, 0.9) translate(-9%, 9%); - } - 50% { - fill: color-mix(in srgb, var(--syui-color) 70%, transparent); - transform: scale(1, 0.9) translate(-7%, 7%); - } - 60% { - transform: scale(1) translate(-7%, 7%); - } - 70% { - transform: scale(1.04) translate(-5%, 5%); - } - 80% { - fill: color-mix(in srgb, var(--syui-color) 60%, transparent); - transform: scale(1.04) translate(-5%, 5%); - } - 90% { - fill: var(--particle-color-5); /* ็ˆ†็™บใฎ้–ƒๅ…‰ */ - transform: scale(1) translate(0%); - } - 100% { - fill: var(--syui-color); - transform: scale(1, 1) translate(0%, 0%); - } -} - -/* Individual particle animations */ -@keyframes particleAnimate1 { - 0% { transform: translate(0, 0); } - 30% { opacity: 1; transform: translate(0, 0); } - 80% { transform: translate(-16px, -59px); } - 90% { transform: translate(-16px, -59px); } - 100% { opacity: 1; transform: translate(-16px, -59px); } -} - -@keyframes particleAnimate2 { - 0% { transform: translate(0, 0); } - 30% { opacity: 1; transform: translate(0, 0); } - 80% { transform: translate(41px, 43px); } - 90% { transform: translate(41px, 43px); } - 100% { opacity: 1; transform: translate(41px, 43px); } -} - -@keyframes particleAnimate3 { - 0% { transform: translate(0, 0); } - 30% { opacity: 1; transform: translate(0, 0); } - 80% { transform: translate(50px, -48px); } - 90% { transform: translate(50px, -48px); } - 100% { opacity: 1; transform: translate(50px, -48px); } -} - -@keyframes particleAnimate4 { - 0% { transform: translate(0, 0); } - 30% { opacity: 1; transform: translate(0, 0); } - 80% { transform: translate(-39px, 36px); } - 90% { transform: translate(-39px, 36px); } - 100% { opacity: 1; transform: translate(-39px, 36px); } -} - -@keyframes particleAnimate5 { - 0% { transform: translate(0, 0); } - 30% { opacity: 1; transform: translate(0, 0); } - 80% { transform: translate(-39px, 32px); } - 90% { transform: translate(-39px, 32px); } - 100% { opacity: 1; transform: translate(-39px, 32px); } -} - -@keyframes particleAnimate6 { - 0% { transform: translate(0, 0); } - 30% { opacity: 1; transform: translate(0, 0); } - 80% { transform: translate(48px, 6px); } - 90% { transform: translate(48px, 6px); } - 100% { opacity: 1; transform: translate(48px, 6px); } -} - -@keyframes particleAnimate7 { - 0% { transform: translate(0, 0); } - 30% { opacity: 1; transform: translate(0, 0); } - 80% { transform: translate(-69px, -36px); } - 90% { transform: translate(-69px, -36px); } - 100% { opacity: 1; transform: translate(-69px, -36px); } -} - -@keyframes particleAnimate8 { - 0% { transform: translate(0, 0); } - 30% { opacity: 1; transform: translate(0, 0); } - 80% { transform: translate(-12px, -52px); } - 90% { transform: translate(-12px, -52px); } - 100% { opacity: 1; transform: translate(-12px, -52px); } -} - -@keyframes particleAnimate9 { - 0% { transform: translate(0, 0); } - 30% { opacity: 1; transform: translate(0, 0); } - 80% { transform: translate(-43px, -21px); } - 90% { transform: translate(-43px, -21px); } - 100% { opacity: 1; transform: translate(-43px, -21px); } -} - -@keyframes particleAnimate10 { - 0% { transform: translate(0, 0); } - 30% { opacity: 1; transform: translate(0, 0); } - 80% { transform: translate(-10px, 47px); } - 90% { transform: translate(-10px, 47px); } - 100% { opacity: 1; transform: translate(-10px, 47px); } -} - -@keyframes particleAnimate11 { - 0% { transform: translate(0, 0); } - 30% { opacity: 1; transform: translate(0, 0); } - 80% { transform: translate(66px, -9px); } - 90% { transform: translate(66px, -9px); } - 100% { opacity: 1; transform: translate(66px, -9px); } -} - -@keyframes particleAnimate12 { - 0% { transform: translate(0, 0); } - 30% { opacity: 1; transform: translate(0, 0); } - 80% { transform: translate(40px, -45px); } - 90% { transform: translate(40px, -45px); } - 100% { opacity: 1; transform: translate(40px, -45px); } -} - -@keyframes particleAnimate13 { - 0% { transform: translate(0, 0); } - 30% { opacity: 1; transform: translate(0, 0); } - 80% { transform: translate(29px, 24px); } - 90% { transform: translate(29px, 24px); } - 100% { opacity: 1; transform: translate(29px, 24px); } -} - -@keyframes particleAnimate14 { - 0% { transform: translate(0, 0); } - 30% { opacity: 1; transform: translate(0, 0); } - 80% { transform: translate(-10px, 50px); } - 90% { transform: translate(-10px, 50px); } - 100% { opacity: 1; transform: translate(-10px, 50px); } -} \ No newline at end of file diff --git a/my-blog/static/favicon.ico b/my-blog/static/favicon.ico deleted file mode 100644 index 23a45cc..0000000 Binary files a/my-blog/static/favicon.ico and /dev/null differ diff --git a/my-blog/static/favicon.png b/my-blog/static/favicon.png deleted file mode 100644 index fae8d5a..0000000 Binary files a/my-blog/static/favicon.png and /dev/null differ diff --git a/my-blog/static/favicon.svg b/my-blog/static/favicon.svg deleted file mode 100644 index 83ec8c3..0000000 --- a/my-blog/static/favicon.svg +++ /dev/null @@ -1,22 +0,0 @@ - diff --git a/my-blog/static/img/aios_v0201.png b/my-blog/static/img/aios_v0201.png deleted file mode 100644 index f9fb3f6..0000000 Binary files a/my-blog/static/img/aios_v0201.png and /dev/null differ diff --git a/my-blog/static/img/atproto_oauth_syuis.png b/my-blog/static/img/atproto_oauth_syuis.png deleted file mode 100644 index 084a720..0000000 Binary files a/my-blog/static/img/atproto_oauth_syuis.png and /dev/null differ diff --git a/my-blog/static/img/atproto_ozone_0001.png b/my-blog/static/img/atproto_ozone_0001.png deleted file mode 100644 index 586fc56..0000000 Binary files a/my-blog/static/img/atproto_ozone_0001.png and /dev/null differ diff --git a/my-blog/static/img/bluecheck_ozone_socialapp.png b/my-blog/static/img/bluecheck_ozone_socialapp.png deleted file mode 100644 index 13f3cf6..0000000 Binary files a/my-blog/static/img/bluecheck_ozone_socialapp.png and /dev/null differ diff --git a/my-blog/static/img/comfyui_flex1_nano_banana_0001.png b/my-blog/static/img/comfyui_flex1_nano_banana_0001.png deleted file mode 100644 index 33ea39a..0000000 Binary files a/my-blog/static/img/comfyui_flex1_nano_banana_0001.png and /dev/null differ diff --git a/my-blog/static/img/comfyui_flex1_nano_banana_0002.png b/my-blog/static/img/comfyui_flex1_nano_banana_0002.png deleted file mode 100644 index 299386b..0000000 Binary files a/my-blog/static/img/comfyui_flex1_nano_banana_0002.png and /dev/null differ diff --git a/my-blog/static/img/comfyui_instantid_controlnet_0001.png b/my-blog/static/img/comfyui_instantid_controlnet_0001.png deleted file mode 100644 index 565c9f7..0000000 Binary files a/my-blog/static/img/comfyui_instantid_controlnet_0001.png and /dev/null differ diff --git a/my-blog/static/img/comfyui_instantid_controlnet_0002.png b/my-blog/static/img/comfyui_instantid_controlnet_0002.png deleted file mode 100644 index f207681..0000000 Binary files a/my-blog/static/img/comfyui_instantid_controlnet_0002.png and /dev/null differ diff --git a/my-blog/static/img/comfyui_instantid_controlnet_0003.png b/my-blog/static/img/comfyui_instantid_controlnet_0003.png deleted file mode 100644 index 859617e..0000000 Binary files a/my-blog/static/img/comfyui_instantid_controlnet_0003.png and /dev/null differ diff --git a/my-blog/static/img/comfyui_instantid_controlnet_0004.png b/my-blog/static/img/comfyui_instantid_controlnet_0004.png deleted file mode 100644 index 38974ad..0000000 Binary files a/my-blog/static/img/comfyui_instantid_controlnet_0004.png and /dev/null differ diff --git a/my-blog/static/img/comfyui_instantid_controlnet_0005.png b/my-blog/static/img/comfyui_instantid_controlnet_0005.png deleted file mode 100644 index e1e108a..0000000 Binary files a/my-blog/static/img/comfyui_instantid_controlnet_0005.png and /dev/null differ diff --git a/my-blog/static/img/comfyui_wan21_0001.webp b/my-blog/static/img/comfyui_wan21_0001.webp deleted file mode 100644 index ec3f73d..0000000 Binary files a/my-blog/static/img/comfyui_wan21_0001.webp and /dev/null differ diff --git a/my-blog/static/img/comfyui_wan22_0001.mp4 b/my-blog/static/img/comfyui_wan22_0001.mp4 deleted file mode 100644 index e22ac0e..0000000 Binary files a/my-blog/static/img/comfyui_wan22_0001.mp4 and /dev/null differ diff --git a/my-blog/static/img/comfyui_wan22_0001.png b/my-blog/static/img/comfyui_wan22_0001.png deleted file mode 100644 index 3f39123..0000000 Binary files a/my-blog/static/img/comfyui_wan22_0001.png and /dev/null differ diff --git a/my-blog/static/img/lms_plamo2_0001.png b/my-blog/static/img/lms_plamo2_0001.png deleted file mode 100644 index 1ca23e8..0000000 Binary files a/my-blog/static/img/lms_plamo2_0001.png and /dev/null differ diff --git a/my-blog/static/img/three_cloud_vrm_0001.png b/my-blog/static/img/three_cloud_vrm_0001.png deleted file mode 100644 index 07b6901..0000000 Binary files a/my-blog/static/img/three_cloud_vrm_0001.png and /dev/null differ diff --git a/my-blog/static/img/ue_airse_mac_0001.png b/my-blog/static/img/ue_airse_mac_0001.png deleted file mode 100644 index cb5ef6a..0000000 Binary files a/my-blog/static/img/ue_airse_mac_0001.png and /dev/null differ diff --git a/my-blog/static/img/ue_blender_model_ai_v0401.png b/my-blog/static/img/ue_blender_model_ai_v0401.png deleted file mode 100644 index 865ae9e..0000000 Binary files a/my-blog/static/img/ue_blender_model_ai_v0401.png and /dev/null differ diff --git a/my-blog/static/img/ue_blender_model_ai_v0402.png b/my-blog/static/img/ue_blender_model_ai_v0402.png deleted file mode 100644 index 4503ec6..0000000 Binary files a/my-blog/static/img/ue_blender_model_ai_v0402.png and /dev/null differ diff --git a/my-blog/static/img/ue_blender_model_ai_v0501.png b/my-blog/static/img/ue_blender_model_ai_v0501.png deleted file mode 100644 index 9c7f88b..0000000 Binary files a/my-blog/static/img/ue_blender_model_ai_v0501.png and /dev/null differ diff --git a/my-blog/static/img/ue_blender_model_ai_v0502.png b/my-blog/static/img/ue_blender_model_ai_v0502.png deleted file mode 100644 index cba4c68..0000000 Binary files a/my-blog/static/img/ue_blender_model_ai_v0502.png and /dev/null differ diff --git a/my-blog/static/img/ue_blender_model_ai_v0601.png b/my-blog/static/img/ue_blender_model_ai_v0601.png deleted file mode 100644 index 260a127..0000000 Binary files a/my-blog/static/img/ue_blender_model_ai_v0601.png and /dev/null differ diff --git a/my-blog/static/img/ue_blender_model_ai_v0602.png b/my-blog/static/img/ue_blender_model_ai_v0602.png deleted file mode 100644 index dd1a32d..0000000 Binary files a/my-blog/static/img/ue_blender_model_ai_v0602.png and /dev/null differ diff --git a/my-blog/static/img/ue_blender_model_ai_v0603.png b/my-blog/static/img/ue_blender_model_ai_v0603.png deleted file mode 100644 index 1dbfd77..0000000 Binary files a/my-blog/static/img/ue_blender_model_ai_v0603.png and /dev/null differ diff --git a/my-blog/static/img/ue_blender_model_ai_v0604.png b/my-blog/static/img/ue_blender_model_ai_v0604.png deleted file mode 100644 index 9393446..0000000 Binary files a/my-blog/static/img/ue_blender_model_ai_v0604.png and /dev/null differ diff --git a/my-blog/static/img/ue_blender_model_ai_v0701.png b/my-blog/static/img/ue_blender_model_ai_v0701.png deleted file mode 100644 index 0ba6de3..0000000 Binary files a/my-blog/static/img/ue_blender_model_ai_v0701.png and /dev/null differ diff --git a/my-blog/static/img/ue_blender_model_ai_v0702.png b/my-blog/static/img/ue_blender_model_ai_v0702.png deleted file mode 100644 index a468de7..0000000 Binary files a/my-blog/static/img/ue_blender_model_ai_v0702.png and /dev/null differ diff --git a/my-blog/static/img/ue_gasp_dragonik_shin_v0001.png b/my-blog/static/img/ue_gasp_dragonik_shin_v0001.png deleted file mode 100644 index 1d13bf0..0000000 Binary files a/my-blog/static/img/ue_gasp_dragonik_shin_v0001.png and /dev/null differ diff --git a/my-blog/static/img/ue_gasp_v571_0001.png b/my-blog/static/img/ue_gasp_v571_0001.png deleted file mode 100644 index a8b1615..0000000 Binary files a/my-blog/static/img/ue_gasp_v571_0001.png and /dev/null differ diff --git a/my-blog/static/img/ue_gasp_v571_0002.png b/my-blog/static/img/ue_gasp_v571_0002.png deleted file mode 100644 index fdc51ff..0000000 Binary files a/my-blog/static/img/ue_gasp_v571_0002.png and /dev/null differ diff --git a/my-blog/static/img/ue_ios_aicard_0001.png b/my-blog/static/img/ue_ios_aicard_0001.png deleted file mode 100644 index df0f4a1..0000000 Binary files a/my-blog/static/img/ue_ios_aicard_0001.png and /dev/null differ diff --git a/my-blog/static/img/ue_ios_aicard_0002.png b/my-blog/static/img/ue_ios_aicard_0002.png deleted file mode 100644 index 49d9b58..0000000 Binary files a/my-blog/static/img/ue_ios_aicard_0002.png and /dev/null differ diff --git a/my-blog/static/img/ue_ios_aicard_0003.png b/my-blog/static/img/ue_ios_aicard_0003.png deleted file mode 100644 index 358e691..0000000 Binary files a/my-blog/static/img/ue_ios_aicard_0003.png and /dev/null differ diff --git a/my-blog/static/img/ue_ios_aicard_0004.png b/my-blog/static/img/ue_ios_aicard_0004.png deleted file mode 100644 index f377e93..0000000 Binary files a/my-blog/static/img/ue_ios_aicard_0004.png and /dev/null differ diff --git a/my-blog/static/img/ue_ios_aicard_0005.png b/my-blog/static/img/ue_ios_aicard_0005.png deleted file mode 100644 index ab8c144..0000000 Binary files a/my-blog/static/img/ue_ios_aicard_0005.png and /dev/null differ diff --git a/my-blog/static/img/ue_ps5_controller_v0100.jpg b/my-blog/static/img/ue_ps5_controller_v0100.jpg deleted file mode 100644 index 073aeae..0000000 Binary files a/my-blog/static/img/ue_ps5_controller_v0100.jpg and /dev/null differ diff --git a/my-blog/static/img/ue_v570p_gasp_vrm4u_0001.png b/my-blog/static/img/ue_v570p_gasp_vrm4u_0001.png deleted file mode 100644 index 7d08458..0000000 Binary files a/my-blog/static/img/ue_v570p_gasp_vrm4u_0001.png and /dev/null differ diff --git a/my-blog/static/img/ue_world_system_img_0001.png b/my-blog/static/img/ue_world_system_img_0001.png deleted file mode 100644 index 6130eeb..0000000 Binary files a/my-blog/static/img/ue_world_system_img_0001.png and /dev/null differ diff --git a/my-blog/static/img/ue_world_system_img_0002.png b/my-blog/static/img/ue_world_system_img_0002.png deleted file mode 100644 index 8c47702..0000000 Binary files a/my-blog/static/img/ue_world_system_img_0002.png and /dev/null differ diff --git a/my-blog/static/index.json b/my-blog/static/index.json deleted file mode 100644 index e642cd0..0000000 --- a/my-blog/static/index.json +++ /dev/null @@ -1,31 +0,0 @@ -[ - { - "categories": [], - "contents": "ใƒ–ใƒญใ‚ฐใ‚’็งป่กŒใ—ใพใ—ใŸใ€‚้ŽๅŽปใฎใƒ–ใƒญใ‚ฐใฏsyui.github.ioใซใ‚ใ‚Šใ‚ใพใ™ใ€‚ gh-pagesใ‹ใ‚‰cf-pagesใธใฎ็งป่กŒใซใชใ‚Šใพใ™ใ€‚ ่‡ชไฝœใฎailogใงbuildใ—ใฆใ„ใพใ™ใ€‚ ็‰นๅพดใจใ—ใฆใฏใ€atproto, AIใจใฎ้€ฃๆบใงใ™ใ€‚ name: Deploy to Cloudflare Pages on: push: branches: - main workflow_dispatch: jobs: deploy: runs-on: ubuntu-latest permissions: contents: read deployments: write steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Rust uses: actions-rs/toolchain@v1 with: toolchain: stable - name: Build ailog run: cargo build --release - name: Build site with ailog run: | cd my-blog ../target/release/ailog build - name: List public directory run: | ls -la my-blog/public/ - name: Deploy to Cloudflare Pages uses: cloudflare/pages-action@v1 with: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} projectName: ${{ secrets.CLOUDFLARE_PROJECT_NAME }} directory: my-blog/public gitHubToken: ${{ secrets.GITHUB_TOKEN }} wranglerVersion: '3' url https://syui.pages.dev https://syui.github.io", - "description": "ใƒ–ใƒญใ‚ฐใ‚’็งป่กŒใ—ใพใ—ใŸใ€‚้ŽๅŽปใฎใƒ–ใƒญใ‚ฐใฏsyui.github.ioใซใ‚ใ‚Šใ‚ใพใ™ใ€‚ \n\ngh-pagesใ‹ใ‚‰cf-pagesใธใฎ็งป่กŒใซใชใ‚Šใพใ™ใ€‚\n่‡ชไฝœใฎailogใงbuildใ—ใฆใ„ใพใ™ใ€‚\n็‰นๅพดใจใ—ใฆใฏใ€atproto, AIใจใฎ้€ฃๆบใงใ™ใ€‚\n\nname: Deploy to Cloudflare Pages\n\non:\n push:\n branches:\n - main\n workfl...", - "formated_time": "Sat Jun 14, 2025", - "href": "https://syui.ai/posts/2025-06-14-blog.html", - "tags": [ - "blog", - "cloudflare", - "github" - ], - "title": "ใƒ–ใƒญใ‚ฐใ‚’็งป่กŒใ—ใŸ", - "utc_time": "2025-06-14T00:00:00Z" - }, - { - "categories": [], - "contents": "rustใง้™็š„ใ‚ตใ‚คใƒˆใ‚ธใ‚งใƒใƒฌใƒผใ‚ฟใ‚’ไฝœใ‚Šใพใ—ใŸใ€‚ailogใจใ„ใ„ใพใ™ใ€‚hugoใ‹ใ‚‰ใฎ็งป่กŒใซใชใ‚Šใพใ™ใ€‚ ailogใฏใ€ๆœ€ๅˆใซatproto-comment-system(oauth)ใจask-AIใจใ„ใ†ๆฉŸ่ƒฝใ‚’ใคใ‘ใพใ—ใŸใ€‚ quick start $ git clone https://git.syui.ai/ai/log $ cd log $ cargo build $ ./target/debug/ailog init my-blog $ ./target/debug/ailog serve my-blog install $ cargo install --path . --- $ export CARGO_HOME="$HOME/.cargo" $ export RUSTUP_HOME="$HOME/.rustup" $ export PATH="$HOME/.cargo/bin:$PATH" --- $ which ailog $ ailog -h build deploy $ cd my-blog $ vim config.toml $ ailog new test $ vim content/posts/`date +"%Y-%m-%d"`.md $ ailog build # publicใฎไธญ่บซใ‚’web-serverใซdeploy $ cp -rf ./public/* ./web-server/root/ atproto-comment-system example $ cd ./oauth $ npm i $ npm run build $ npm run preview # Production environment variables VITE_APP_HOST=https://example.com VITE_OAUTH_CLIENT_ID=https://example.com/client-metadata.json VITE_OAUTH_REDIRECT_URI=https://example.com/oauth/callback VITE_ADMIN_DID=did:plc:uqzpqmrjnptsxezjx4xuh2mn # Collection names for OAuth app VITE_COLLECTION_COMMENT=ai.syui.log VITE_COLLECTION_USER=ai.syui.log.user VITE_COLLECTION_CHAT=ai.syui.log.chat # Collection names for ailog (backward compatibility) AILOG_COLLECTION_COMMENT=ai.syui.log AILOG_COLLECTION_USER=ai.syui.log.user # API Configuration VITE_BSKY_PUBLIC_API=https://public.api.bsky.app ใ“ใ‚Œใฏailog oauth build my-blogใง./my-blog/config.tomlใ‹ใ‚‰./oauth/.env.productionใŒ็”Ÿๆˆใ•ใ‚Œใพใ™ใ€‚ $ ailog oauth build my-blog use ็ฐกๅ˜ใซ่ชฌๆ˜Žใ™ใ‚‹ใจใ€./oauthใง็”Ÿๆˆใ™ใ‚‹ใฎใŒatproto-comment-systemใงใ™ใ€‚ <script type="module" crossorigin src="/assets/comment-atproto-${hash}}.js"></script> <link rel="stylesheet" crossorigin href="/assets/comment-atproto-${hash}.css"> <section class="comment-section"> <div id="comment-atproto"></div> </section> ใŸใ ใ—ใ€oauthใงใ‚ใ‚‹ใŸใ‚ใ€่‰ฒใ€…ใจๅคงๅค‰ใงใ™ใ€‚ๆœฌ็•ช็’ฐๅขƒ(ใ‚‚ใ—ใใฏ่ฟ‘ใ„ๅฝข)ใงใƒ†ใ‚นใƒˆใ‚’่กŒใ„ใพใ—ใ‚‡ใ†ใ€‚cf, tailscale, ngrokใชใฉใ€‚ tunnel: ${hash} credentials-file: ${path}.json ingress: - hostname: example.com service: http://localhost:4173 originRequest: noHappyEyeballs: true - service: http_status:404 # tunnel list, dnsใซ็™ป้ŒฒใŒๅฟ…่ฆใงใ™ $ cloudflared tunnel list $ cloudflared tunnel --config cloudflared-config.yml run $ cloudflared tunnel route dns ${uuid} example.com ไปฅไธ‹ใฎ2ใคใฎcollection recordใ‚’็”Ÿๆˆใ—ใพใ™ใ€‚ใƒฆใƒผใ‚ถใƒผใซใฏai.syui.logใŒ็”Ÿๆˆใ•ใ‚Œใ€ใ“ใ“ใซใ‚ณใƒกใƒณใƒˆใŒ่จ˜้Œฒใ•ใ‚Œใพใ™ใ€‚ใใ‚Œใ‚’ๅ–ๅพ—ใ—ใฆ่กจ็คบใ—ใฆใ„ใพใ™ใ€‚ai.syui.log.userใฏ็ฎก็†่€…ใงใ‚ใ‚‹VITE_ADMIN_DID็”จใงใ™ใ€‚ VITE_COLLECTION_COMMENT=ai.syui.log VITE_COLLECTION_USER=ai.syui.log.user $ ailog auth login $ ailog stream server ใ“ใฎใ‚ณใƒžใƒณใƒ‰ใงai.syui.logใ‚’jetstreamใ‹ใ‚‰็›ฃ่ฆ–ใ—ใฆใ€ๆ›ธใ่พผใฟใŒใ‚ใ‚Œใฐใ€็ฎก็†่€…ใฎai.syui.log.userใซ่จ˜้Œฒใ•ใ‚Œใ€ใใฎuser-listใซๅŸบใฅใ„ใฆใ€ใ‚ณใƒกใƒณใƒˆไธ€่ฆงใ‚’ๅ–ๅพ—ใ—ใพใ™ใ€‚ ใคใพใ‚Šใ€ใ‚ณใƒกใƒณใƒˆ่กจ็คบใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚’ๆ‰‹ๅ‹•ใง่จญๅฎšใ™ใ‚‹ใ‹ใ€่‡ชๅ‹•ๅŒ–ใ™ใ‚‹ใ‹ใ€‚่‡ชๅ‹•ๅŒ–ใ™ใ‚‹ใชใ‚‰serverใงailog stream serverใ‚’ๅ‹•ใ‹ใ•ใชใ‘ใ‚Œใฐใ„ใ‘ใพใ›ใ‚“ใ€‚ ask-AI ask-AIใฎไป•็ต„ใฟใฏๅ‰ฒๆ„›ใ—ใพใ™ใ€‚ๅพŒใซๅค‰ๆ›ดใ•ใ‚Œใ‚‹ๅฏ่ƒฝๆ€งใŒ้ซ˜ใ„ใจๆ€ใ„ใพใ™ใ€‚ local llm, mcp, atprotoใจ็ต„ใฟๅˆใ‚ใ›ใงใ™ใ€‚ code syntax # comment d=${0:a:h} // This is a comment fn main() { println!("Hello, world!"); } // This is a comment console.log("Hello, world!");", - "description": "rustใง้™็š„ใ‚ตใ‚คใƒˆใ‚ธใ‚งใƒใƒฌใƒผใ‚ฟใ‚’ไฝœใ‚Šใพใ—ใŸใ€‚ailogใจใ„ใ„ใพใ™ใ€‚hugoใ‹ใ‚‰ใฎ็งป่กŒใซใชใ‚Šใพใ™ใ€‚ \nailogใฏใ€ๆœ€ๅˆใซatproto-comment-system(oauth)ใจask-AIใจใ„ใ†ๆฉŸ่ƒฝใ‚’ใคใ‘ใพใ—ใŸใ€‚ \nquick start\n$ git clone https://git.syui.ai/ai/log\n$ cd log\n$ cargo build\n$ ./target/debu...", - "formated_time": "Thu Jun 12, 2025", - "href": "https://syui.ai/posts/2025-06-06-ailog.html", - "tags": [ - "blog", - "rust", - "mcp", - "atp" - ], - "title": "้™็š„ใ‚ตใ‚คใƒˆใ‚ธใ‚งใƒใƒฌใƒผใ‚ฟใ‚’ไฝœใฃใŸ", - "utc_time": "2025-06-12T00:00:00Z" - } -] \ No newline at end of file diff --git a/my-blog/static/js/ask-ai.js b/my-blog/static/js/ask-ai.js deleted file mode 100644 index 6b06687..0000000 --- a/my-blog/static/js/ask-ai.js +++ /dev/null @@ -1,518 +0,0 @@ -/** - * Ask AI functionality - Based on original working implementation - */ - -// Global variables for AI functionality -let aiProfileData = null; - -// Get config from window or use defaults -const OAUTH_PDS = window.OAUTH_CONFIG?.pds || 'syu.is'; -const ADMIN_HANDLE = window.OAUTH_CONFIG?.admin || 'ai.syui.ai'; -const OAUTH_COLLECTION = window.OAUTH_CONFIG?.collection || 'ai.syui.log'; - -// Listen for AI profile data from OAuth app -window.addEventListener('aiProfileLoaded', function(event) { - aiProfileData = event.detail; - updateAskAIButton(); -}); - -// Check if AI profile data is already available -if (window.aiProfileData) { - aiProfileData = window.aiProfileData; -} - -// Original functions from working implementation -function toggleAskAI() { - const panel = document.getElementById('askAiPanel'); - const isVisible = panel.style.display !== 'none'; - panel.style.display = isVisible ? 'none' : 'block'; - - if (!isVisible) { - - // If AI profile data is already available, show introduction immediately - if (aiProfileData) { - // Quick check for authentication - const userSections = document.querySelectorAll('.user-section'); - const isAuthenticated = userSections.length > 0; - handleAuthenticationStatus(isAuthenticated); - return; - } - - // For production fallback - if OAuth app fails to load, show profiles - const isProd = window.location.hostname !== 'localhost' && !window.location.hostname.includes('preview'); - if (isProd) { - // Shorter timeout for production - setTimeout(() => { - const userSections = document.querySelectorAll('.user-section'); - - if (userSections.length === 0) { - handleAuthenticationStatus(false); - } else { - handleAuthenticationStatus(true); - } - }, 300); - } else { - checkAuthenticationStatus(); - } - } -} - -function checkAuthenticationStatus() { - // Check multiple times for OAuth app to load - let checkCount = 0; - const maxChecks = 10; - - const checkForAuth = () => { - const userSections = document.querySelectorAll('.user-section'); - const authButtons = document.querySelectorAll('[data-auth-status]'); - const oauthContainers = document.querySelectorAll('#oauth-container'); - - - const isAuthenticated = userSections.length > 0; - - if (isAuthenticated || checkCount >= maxChecks - 1) { - handleAuthenticationStatus(isAuthenticated); - } else { - checkCount++; - setTimeout(checkForAuth, 200); - } - }; - - checkForAuth(); -} - -function handleAuthenticationStatus(isAuthenticated) { - - // Always hide loading first - document.getElementById('authCheck').style.display = 'none'; - - if (isAuthenticated) { - // User is authenticated - show Ask AI UI - document.getElementById('chatForm').style.display = 'block'; - document.getElementById('chatHistory').style.display = 'block'; - - // Show initial greeting if chat history is empty and AI profile is available - const chatHistory = document.getElementById('chatHistory'); - if (chatHistory.children.length === 0) { - if (aiProfileData) { - showInitialGreeting(); - } else { - // Wait for AI profile data - setTimeout(() => { - if (aiProfileData) { - showInitialGreeting(); - } - }, 500); - } - } - - // Focus on input - setTimeout(() => { - document.getElementById('aiQuestion').focus(); - }, 50); - } else { - // User not authenticated - show AI introduction directly if profile available - document.getElementById('chatForm').style.display = 'none'; - document.getElementById('chatHistory').style.display = 'block'; - - if (aiProfileData) { - // Show AI introduction directly using available profile data - showAIIntroduction(); - } else { - // Fallback to profile loading - loadAndShowProfiles(); - } - } -} - -// Load and display profiles from ai.syui.log.profile collection -async function loadAndShowProfiles() { - const chatHistory = document.getElementById('chatHistory'); - chatHistory.innerHTML = '
Loading profiles...
'; - - try { - const response = await fetch(`https://${OAUTH_PDS}/xrpc/com.atproto.repo.listRecords?repo=${ADMIN_HANDLE}&collection=${OAUTH_COLLECTION}&limit=100`); - - if (!response.ok) { - throw new Error('Failed to fetch profiles'); - } - - const data = await response.json(); - - // Filter only profile records and sort - const profileRecords = (data.records || []).filter(record => record.value.type === 'profile'); - - const profiles = profileRecords.sort((a, b) => { - if (a.value.profileType === 'admin' && b.value.profileType !== 'admin') return -1; - if (a.value.profileType !== 'admin' && b.value.profileType === 'admin') return 1; - return 0; - }); - - // Clear loading message - chatHistory.innerHTML = ''; - - // Display profiles using the same format as chat - profiles.forEach(profile => { - const profileDiv = document.createElement('div'); - profileDiv.className = 'chat-message ai-message comment-style'; - - const avatarElement = profile.value.author.avatar - ? `${profile.value.author.displayName || profile.value.author.handle}` - : `
${(profile.value.author.displayName || profile.value.author.handle || '?').charAt(0).toUpperCase()}
`; - - const adminBadge = profile.value.profileType === 'admin' - ? 'Admin' - : ''; - - profileDiv.innerHTML = ` -
-
${avatarElement}
- -
-
${profile.value.text}
- `; - chatHistory.appendChild(profileDiv); - }); - - if (profiles.length === 0) { - chatHistory.innerHTML = '
No profiles available
'; - } - - } catch (error) { - chatHistory.innerHTML = '
Failed to load profiles. Please try again later.
'; - } -} - -function askQuestion() { - const question = document.getElementById('aiQuestion').value; - if (!question.trim()) return; - - const askButton = document.getElementById('askButton'); - askButton.disabled = true; - askButton.textContent = 'Posting...'; - - try { - // Add user message to chat - addUserMessage(question); - - // Clear input - document.getElementById('aiQuestion').value = ''; - - // Show loading - showLoadingMessage(); - - // Post question via OAuth app - window.dispatchEvent(new CustomEvent('postAIQuestion', { - detail: { question: question } - })); - - } catch (error) { - showErrorMessage('Sorry, I encountered an error. Please try again.'); - } finally { - askButton.disabled = false; - askButton.textContent = 'Ask'; - } -} - -function addUserMessage(question) { - const chatHistory = document.getElementById('chatHistory'); - const userSection = document.querySelector('.user-section'); - - let userAvatar = '๐Ÿ‘ค'; - let userDisplay = 'You'; - let userHandle = 'user'; - - if (userSection) { - const avatarImg = userSection.querySelector('.user-avatar'); - const displayName = userSection.querySelector('.user-display-name'); - const handle = userSection.querySelector('.user-handle'); - - if (avatarImg && avatarImg.src) { - userAvatar = `${displayName?.textContent || 'User'}`; - } - if (displayName?.textContent) { - userDisplay = displayName.textContent; - } - if (handle?.textContent) { - userHandle = handle.textContent.replace('@', ''); - } - } - - const questionDiv = document.createElement('div'); - questionDiv.className = 'chat-message user-message comment-style'; - questionDiv.innerHTML = ` -
-
${userAvatar}
- -
-
${question}
- `; - chatHistory.appendChild(questionDiv); -} - -function showLoadingMessage() { - const chatHistory = document.getElementById('chatHistory'); - const loadingDiv = document.createElement('div'); - loadingDiv.className = 'ai-loading-simple'; - loadingDiv.innerHTML = ` - - ่€ƒใˆใฆใ„ใพใ™ - - `; - chatHistory.appendChild(loadingDiv); -} - -function showErrorMessage(message) { - const chatHistory = document.getElementById('chatHistory'); - removeLoadingMessage(); - - const errorDiv = document.createElement('div'); - errorDiv.className = 'chat-message error-message comment-style'; - errorDiv.innerHTML = ` -
-
โš ๏ธ
- -
-
${message}
- `; - chatHistory.appendChild(errorDiv); -} - -function removeLoadingMessage() { - const loadingMsg = document.querySelector('.ai-loading-simple'); - if (loadingMsg) { - loadingMsg.remove(); - } -} - -function showInitialGreeting() { - if (!aiProfileData) return; - - const chatHistory = document.getElementById('chatHistory'); - const greetingDiv = document.createElement('div'); - greetingDiv.className = 'chat-message ai-message comment-style initial-greeting'; - - const avatarElement = aiProfileData.avatar - ? `${aiProfileData.displayName}` - : '๐Ÿค–'; - - greetingDiv.innerHTML = ` -
-
${avatarElement}
- -
-
Hello! I'm an AI assistant trained on this blog's content. I can answer questions about the articles, provide insights, and help you understand the topics discussed here. What would you like to know?
- `; - chatHistory.appendChild(greetingDiv); -} - -function showAIIntroduction() { - if (!aiProfileData) return; - - const chatHistory = document.getElementById('chatHistory'); - chatHistory.innerHTML = ''; // Clear any existing content - - // AI Introduction message - const introDiv = document.createElement('div'); - introDiv.className = 'chat-message ai-message comment-style initial-greeting'; - - const avatarElement = aiProfileData.avatar - ? `${aiProfileData.displayName}` - : '๐Ÿค–'; - - introDiv.innerHTML = ` -
-
${avatarElement}
- -
-
Hello! I'm an AI assistant trained on this blog's content. I can answer questions about the articles, provide insights, and help you understand the topics discussed here. What would you like to know?
- `; - chatHistory.appendChild(introDiv); - - // OAuth login message - const loginDiv = document.createElement('div'); - loginDiv.className = 'chat-message user-message comment-style initial-greeting'; - - loginDiv.innerHTML = ` -
-
${avatarElement}
- -
-
Please atproto oauth login
- `; - chatHistory.appendChild(loginDiv); -} - -function updateAskAIButton() { - const button = document.getElementById('askAiButton'); - if (!button) return; - - // Only update text, never modify the icon - if (aiProfileData && aiProfileData.displayName) { - const textNode = button.childNodes[2] || button.lastChild; - if (textNode && textNode.nodeType === Node.TEXT_NODE) { - textNode.textContent = aiProfileData.displayName; - } - } -} - -function handleAIResponse(responseData) { - const chatHistory = document.getElementById('chatHistory'); - removeLoadingMessage(); - - const aiProfile = responseData.aiProfile; - if (!aiProfile || !aiProfile.handle || !aiProfile.displayName) { - return; - } - - const timestamp = new Date(responseData.timestamp || Date.now()); - const avatarElement = aiProfile.avatar - ? `${aiProfile.displayName}` - : '๐Ÿค–'; - - const answerDiv = document.createElement('div'); - answerDiv.className = 'chat-message ai-message comment-style'; - answerDiv.innerHTML = ` -
-
${avatarElement}
- -
-
${responseData.answer}
- `; - chatHistory.appendChild(answerDiv); - - // Limit chat history - limitChatHistory(); -} - -function limitChatHistory() { - const chatHistory = document.getElementById('chatHistory'); - if (chatHistory.children.length > 10) { - chatHistory.removeChild(chatHistory.children[0]); - if (chatHistory.children.length > 0) { - chatHistory.removeChild(chatHistory.children[0]); - } - } -} - -// Event listeners setup -function setupAskAIEventListeners() { - // Listen for AI profile updates from OAuth app - window.addEventListener('aiProfileLoaded', function(event) { - aiProfileData = event.detail; - updateAskAIButton(); - }); - - // Listen for AI responses - window.addEventListener('aiResponseReceived', function(event) { - handleAIResponse(event.detail); - }); - - // Listen for OAuth callback completion from iframe - window.addEventListener('message', function(event) { - if (event.data.type === 'oauth_success') { - - // Close any OAuth popups/iframes - const oauthFrame = document.getElementById('oauth-frame'); - if (oauthFrame) { - oauthFrame.remove(); - } - - // Reload the page to refresh OAuth app state - setTimeout(() => { - window.location.reload(); - }, 500); - } - }); - - // Track IME composition state - let isComposing = false; - const aiQuestionInput = document.getElementById('aiQuestion'); - - if (aiQuestionInput) { - aiQuestionInput.addEventListener('compositionstart', function() { - isComposing = true; - }); - - aiQuestionInput.addEventListener('compositionend', function() { - isComposing = false; - }); - } - - // Keyboard shortcuts - document.addEventListener('keydown', function(e) { - if (e.key === 'Escape') { - const panel = document.getElementById('askAiPanel'); - if (panel) { - panel.style.display = 'none'; - } - } - - // Enter key to send message (only when not composing Japanese input) - if (e.key === 'Enter' && e.target.id === 'aiQuestion' && !e.shiftKey && !isComposing) { - e.preventDefault(); - askQuestion(); - } - }); -} - -// Initialize Ask AI when DOM is loaded -document.addEventListener('DOMContentLoaded', function() { - setupAskAIEventListeners(); - - // Also listen for OAuth app load completion - const observer = new MutationObserver(function(mutations) { - mutations.forEach(function(mutation) { - if (mutation.type === 'childList') { - // Check if user-section was added/removed - const userSectionAdded = Array.from(mutation.addedNodes).some(node => - node.nodeType === Node.ELEMENT_NODE && - (node.classList?.contains('user-section') || node.querySelector?.('.user-section')) - ); - const userSectionRemoved = Array.from(mutation.removedNodes).some(node => - node.nodeType === Node.ELEMENT_NODE && - (node.classList?.contains('user-section') || node.querySelector?.('.user-section')) - ); - - if (userSectionAdded || userSectionRemoved) { - // Update Ask AI panel if it's visible - const panel = document.getElementById('askAiPanel'); - if (panel && panel.style.display !== 'none') { - checkAuthenticationStatus(); - } - } - } - }); - }); - - observer.observe(document.body, { - childList: true, - subtree: true - }); -}); - -// Global functions for onclick handlers -window.toggleAskAI = toggleAskAI; -window.askQuestion = askQuestion; diff --git a/my-blog/static/js/image-comparison.js b/my-blog/static/js/image-comparison.js deleted file mode 100644 index f625153..0000000 --- a/my-blog/static/js/image-comparison.js +++ /dev/null @@ -1,123 +0,0 @@ -/** - * Image Comparison Slider - * UE5-style before/after image comparison component - */ - -class ImageComparison { - constructor(container) { - this.container = container; - this.slider = container.querySelector('.slider'); - this.beforeImg = container.querySelector('.img-before'); - this.afterImg = container.querySelector('.img-after'); - this.sliderThumb = container.querySelector('.slider-thumb'); - - this.isDragging = false; - this.containerRect = null; - - this.init(); - } - - init() { - this.bindEvents(); - this.updatePosition(50); // Start at 50% - } - - bindEvents() { - // Mouse events - this.slider.addEventListener('input', (e) => { - this.updatePosition(e.target.value); - }); - - this.slider.addEventListener('mousedown', () => { - this.isDragging = true; - document.body.style.userSelect = 'none'; - }); - - document.addEventListener('mouseup', () => { - if (this.isDragging) { - this.isDragging = false; - document.body.style.userSelect = ''; - } - }); - - // Touch events for mobile - this.slider.addEventListener('touchstart', (e) => { - this.isDragging = true; - e.preventDefault(); - }); - - this.slider.addEventListener('touchmove', (e) => { - if (this.isDragging) { - const touch = e.touches[0]; - this.containerRect = this.container.getBoundingClientRect(); - const x = touch.clientX - this.containerRect.left; - const percentage = Math.max(0, Math.min(100, (x / this.containerRect.width) * 100)); - this.slider.value = percentage; - this.updatePosition(percentage); - e.preventDefault(); - } - }); - - this.slider.addEventListener('touchend', () => { - this.isDragging = false; - }); - - // Direct click on container - this.container.addEventListener('click', (e) => { - if (e.target === this.container || e.target.classList.contains('img-comparison-slider')) { - this.containerRect = this.container.getBoundingClientRect(); - const x = e.clientX - this.containerRect.left; - const percentage = Math.max(0, Math.min(100, (x / this.containerRect.width) * 100)); - this.slider.value = percentage; - this.updatePosition(percentage); - } - }); - - // Keyboard support - this.slider.addEventListener('keydown', (e) => { - let value = parseFloat(this.slider.value); - switch (e.key) { - case 'ArrowLeft': - value = Math.max(0, value - 1); - break; - case 'ArrowRight': - value = Math.min(100, value + 1); - break; - case 'Home': - value = 0; - break; - case 'End': - value = 100; - break; - default: - return; - } - e.preventDefault(); - this.slider.value = value; - this.updatePosition(value); - }); - } - - updatePosition(percentage) { - const position = parseFloat(percentage); - - // Update clip-path for before image to show only the left portion - this.beforeImg.style.clipPath = `inset(0 ${100 - position}% 0 0)`; - - // Update slider thumb position - this.sliderThumb.style.left = `${position}%`; - this.sliderThumb.style.transform = `translateX(-50%)`; - - } -} - -// Auto-initialize all image comparison components -document.addEventListener('DOMContentLoaded', function() { - const comparisons = document.querySelectorAll('.img-comparison-container'); - comparisons.forEach(container => { - new ImageComparison(container); - }); -}); - -// Export for manual initialization -window.ImageComparison = ImageComparison; \ No newline at end of file diff --git a/my-blog/static/js/pds.js b/my-blog/static/js/pds.js deleted file mode 100644 index c8a064b..0000000 --- a/my-blog/static/js/pds.js +++ /dev/null @@ -1,370 +0,0 @@ -// AT Protocol API functions -const AT_PROTOCOL_CONFIG = { - primary: { - pds: 'https://syu.is', - plc: 'https://plc.syu.is', - bsky: 'https://bsky.syu.is', - web: 'https://web.syu.is' - }, - fallback: { - pds: 'https://bsky.social', - plc: 'https://plc.directory', - bsky: 'https://public.api.bsky.app', - web: 'https://bsky.app' - } -}; - -// Search user function -async function searchUser() { - const handleInput = document.getElementById('handleInput'); - const userInfo = document.getElementById('userInfo'); - const collectionsList = document.getElementById('collectionsList'); - const recordsList = document.getElementById('recordsList'); - const searchButton = document.getElementById('searchButton'); - - const input = handleInput.value.trim(); - if (!input) { - alert('Handle nameใพใŸใฏAT URIใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„'); - return; - } - - searchButton.disabled = true; - searchButton.innerHTML = '@'; - //searchButton.innerHTML = ''; - - try { - // Clear previous results - document.getElementById('userDidSection').style.display = 'none'; - document.getElementById('collectionsSection').style.display = 'none'; - document.getElementById('recordsSection').style.display = 'none'; - collectionsList.innerHTML = ''; - recordsList.innerHTML = ''; - - // Check if input is AT URI - if (input.startsWith('at://')) { - // Parse AT URI to check if it's a full record or just a handle/collection - const uriParts = input.replace('at://', '').split('/').filter(part => part.length > 0); - - if (uriParts.length >= 3) { - // Full AT URI with rkey - show in modal - showAtUriModal(input); - return; - } else if (uriParts.length === 1) { - // Just handle in AT URI format (at://handle) - treat as regular handle - const handle = uriParts[0]; - const userProfile = await resolveUserProfile(handle); - - if (userProfile.success) { - displayUserDid(userProfile.data); - await loadUserCollections(handle, userProfile.data.did); - } else { - alert('ใƒฆใƒผใ‚ถใƒผใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“: ' + userProfile.error); - } - return; - } else if (uriParts.length === 2) { - // Collection level AT URI - load collection records - const [repo, collection] = uriParts; - - try { - // First resolve the repo to get handle if it's a DID - let handle = repo; - if (repo.startsWith('did:')) { - // Try to resolve DID to handle - for now just use the DID - handle = repo; - } - - loadCollectionRecords(handle, collection, repo); - } catch (error) { - alert('ใ‚ณใƒฌใ‚ฏใ‚ทใƒงใƒณใฎ่ชญใฟ่พผใฟใซๅคฑๆ•—ใ—ใพใ—ใŸ: ' + error.message); - } - return; - } - } - - // Handle regular handle search - const userProfile = await resolveUserProfile(input); - - if (userProfile.success) { - displayUserDid(userProfile.data); - await loadUserCollections(input, userProfile.data.did); - } else { - alert('ใƒฆใƒผใ‚ถใƒผใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“: ' + userProfile.error); - } - } catch (error) { - alert('ใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใพใ—ใŸ: ' + error.message); - } finally { - searchButton.disabled = false; - searchButton.innerHTML = '@'; - //searchButton.innerHTML = ''; - } -} - -// Resolve user profile -async function resolveUserProfile(handle) { - try { - let response = null; - - // Try syu.is first - try { - response = await fetch(`${AT_PROTOCOL_CONFIG.primary.pds}/xrpc/com.atproto.repo.describeRepo?repo=${handle}`); - } catch (error) { - console.log('Failed to resolve from syu.is:', error); - } - - // If syu.is fails, try bsky.social - if (!response || !response.ok) { - response = await fetch(`${AT_PROTOCOL_CONFIG.fallback.pds}/xrpc/com.atproto.repo.describeRepo?repo=${handle}`); - } - - if (!response.ok) { - throw new Error('Failed to resolve handle'); - } - - const repoData = await response.json(); - - // Get profile data - const profileResponse = await fetch(`${AT_PROTOCOL_CONFIG.fallback.bsky}/xrpc/app.bsky.actor.getProfile?actor=${repoData.did}`); - const profileData = await profileResponse.json(); - - return { - success: true, - data: { - did: repoData.did, - handle: profileData.handle, - displayName: profileData.displayName, - avatar: profileData.avatar, - description: profileData.description, - pds: repoData.didDoc.service.find(s => s.type === 'AtprotoPersonalDataServer')?.serviceEndpoint - } - }; - } catch (error) { - return { - success: false, - error: error.message - }; - } -} - -// Display user DID -function displayUserDid(profile) { - document.getElementById('userPdsText').textContent = profile.pds || 'Unknown'; - document.getElementById('userHandleText').textContent = profile.handle; - document.getElementById('userDidText').textContent = profile.did; - document.getElementById('userDidSection').style.display = 'block'; -} - -// Load user collections -async function loadUserCollections(handle, did) { - const collectionsList = document.getElementById('collectionsList'); - - collectionsList.innerHTML = '
ใ‚ณใƒฌใ‚ฏใ‚ทใƒงใƒณใ‚’่ชญใฟ่พผใฟไธญ...
'; - - try { - // Try to get collections from describeRepo - let response = await fetch(`${AT_PROTOCOL_CONFIG.primary.pds}/xrpc/com.atproto.repo.describeRepo?repo=${handle}`); - let usedPds = AT_PROTOCOL_CONFIG.primary.pds; - - // If syu.is fails, try bsky.social - if (!response.ok) { - response = await fetch(`${AT_PROTOCOL_CONFIG.fallback.pds}/xrpc/com.atproto.repo.describeRepo?repo=${handle}`); - usedPds = AT_PROTOCOL_CONFIG.fallback.pds; - } - - if (!response.ok) { - throw new Error('Failed to describe repository'); - } - - const data = await response.json(); - const collections = data.collections || []; - - // Display collections as AT URI links - collectionsList.innerHTML = ''; - if (collections.length === 0) { - collectionsList.innerHTML = '
ใ‚ณใƒฌใ‚ฏใ‚ทใƒงใƒณใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“ใงใ—ใŸ
'; - } else { - - collections.forEach(collection => { - const atUri = `at://${did}/${collection}/`; - const collectionElement = document.createElement('a'); - collectionElement.className = 'at-uri-link'; - collectionElement.href = '#'; - collectionElement.textContent = atUri; - collectionElement.onclick = (e) => { - e.preventDefault(); - loadCollectionRecords(handle, collection, did); - // Close collections and update toggle - document.getElementById('collectionsList').style.display = 'none'; - document.getElementById('collectionsToggle').textContent = '[-] Collections'; - }; - collectionsList.appendChild(collectionElement); - }); - - document.getElementById('collectionsSection').style.display = 'block'; - } - - } catch (error) { - collectionsList.innerHTML = '
ใ‚ณใƒฌใ‚ฏใ‚ทใƒงใƒณใฎ่ชญใฟ่พผใฟใซๅคฑๆ•—ใ—ใพใ—ใŸ: ' + error.message + '
'; - document.getElementById('collectionsSection').style.display = 'block'; - } -} - -// Load collection records -async function loadCollectionRecords(handle, collection, did) { - const recordsList = document.getElementById('recordsList'); - - recordsList.innerHTML = '
ใƒฌใ‚ณใƒผใƒ‰ใ‚’่ชญใฟ่พผใฟไธญ...
'; - - try { - // Try with syu.is first - let response = await fetch(`${AT_PROTOCOL_CONFIG.primary.pds}/xrpc/com.atproto.repo.listRecords?repo=${handle}&collection=${collection}`); - let usedPds = AT_PROTOCOL_CONFIG.primary.pds; - - // If that fails, try with bsky.social - if (!response.ok) { - response = await fetch(`${AT_PROTOCOL_CONFIG.fallback.pds}/xrpc/com.atproto.repo.listRecords?repo=${handle}&collection=${collection}`); - usedPds = AT_PROTOCOL_CONFIG.fallback.pds; - } - - if (!response.ok) { - throw new Error('Failed to load records'); - } - - const data = await response.json(); - - // Display records as AT URI links - recordsList.innerHTML = ''; - - // Add collection info for records - const collectionInfo = document.createElement('div'); - collectionInfo.className = 'collection-info'; - collectionInfo.innerHTML = `${collection}`; - recordsList.appendChild(collectionInfo); - - data.records.forEach(record => { - const atUri = record.uri; - const recordElement = document.createElement('a'); - recordElement.className = 'at-uri-link'; - recordElement.href = '#'; - recordElement.textContent = atUri; - recordElement.onclick = (e) => { - e.preventDefault(); - showAtUriModal(atUri); - }; - recordsList.appendChild(recordElement); - }); - - document.getElementById('recordsSection').style.display = 'block'; - - } catch (error) { - recordsList.innerHTML = '
ใƒฌใ‚ณใƒผใƒ‰ใฎ่ชญใฟ่พผใฟใซๅคฑๆ•—ใ—ใพใ—ใŸ: ' + error.message + '
'; - document.getElementById('recordsSection').style.display = 'block'; - } -} - -// Show AT URI modal -function showAtUriModal(uri) { - const modal = document.getElementById('atUriModal'); - const content = document.getElementById('atUriContent'); - - content.innerHTML = '
ใƒฌใ‚ณใƒผใƒ‰ใ‚’่ชญใฟ่พผใฟไธญ...
'; - modal.style.display = 'flex'; - - // Load record data - loadAtUriRecord(uri, content); -} - -// Load AT URI record -async function loadAtUriRecord(uri, contentElement) { - try { - const parts = uri.replace('at://', '').split('/'); - const repo = parts[0]; - const collection = parts[1]; - const rkey = parts[2]; - - // Try with syu.is first - let response = await fetch(`${AT_PROTOCOL_CONFIG.primary.pds}/xrpc/com.atproto.repo.getRecord?repo=${repo}&collection=${collection}&rkey=${rkey}`); - - // If that fails, try with bsky.social - if (!response.ok) { - response = await fetch(`${AT_PROTOCOL_CONFIG.fallback.pds}/xrpc/com.atproto.repo.getRecord?repo=${repo}&collection=${collection}&rkey=${rkey}`); - } - - if (!response.ok) { - throw new Error('Failed to load record'); - } - - const data = await response.json(); - - contentElement.innerHTML = ` -
-

AT URI Record

-
- ${uri} -
-
- Repo: ${repo} | Collection: ${collection} | RKey: ${rkey} -
-

Record Data

-
${JSON.stringify(data, null, 2)}
-
- `; - } catch (error) { - contentElement.innerHTML = ` -
- Error: ${error.message} -
- URI: ${uri} -
-
- `; - } -} - -// Close AT URI modal -function closeAtUriModal(event) { - const modal = document.getElementById('atUriModal'); - if (event && event.target !== modal) { - return; - } - modal.style.display = 'none'; -} - -// Initialize AT URI click handlers -document.addEventListener('DOMContentLoaded', function() { - // Add click handlers to existing AT URIs - document.querySelectorAll('.at-uri').forEach(element => { - element.addEventListener('click', function() { - const uri = this.getAttribute('data-at-uri'); - showAtUriModal(uri); - }); - }); - - // ESC key to close modal - document.addEventListener('keydown', function(event) { - if (event.key === 'Escape') { - closeAtUriModal(); - } - }); - - // Enter key to search - document.getElementById('handleInput').addEventListener('keydown', function(event) { - if (event.key === 'Enter') { - searchUser(); - } - }); - -}); - -// Toggle collections visibility -function toggleCollections() { - const collectionsList = document.getElementById('collectionsList'); - const toggleButton = document.getElementById('collectionsToggle'); - - if (collectionsList.style.display === 'none') { - collectionsList.style.display = 'block'; - toggleButton.textContent = '[-] Collections'; - } else { - collectionsList.style.display = 'none'; - toggleButton.textContent = '[+] Collections'; - } -} diff --git a/my-blog/static/js/theme.js b/my-blog/static/js/theme.js deleted file mode 100644 index bed15d5..0000000 --- a/my-blog/static/js/theme.js +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Theme and visual effects - Pure CSS animations, no jQuery - */ -class Theme { - constructor() { - this.init(); - } - - init() { - this.setupParticleColors(); - this.setupLogoAnimations(); - } - - setupParticleColors() { - // Dynamic particle colors based on theme - const style = document.createElement('style'); - style.textContent = ` - /* Dynamic particle colors based on theme */ - .likeButton .particleLayer circle:nth-child(1), - .likeButton .particleLayer circle:nth-child(2) { - fill: var(--particle-color-1) !important; - } - - .likeButton .particleLayer circle:nth-child(3), - .likeButton .particleLayer circle:nth-child(4) { - fill: var(--particle-color-2) !important; - } - - .likeButton .particleLayer circle:nth-child(5), - .likeButton .particleLayer circle:nth-child(6), - .likeButton .particleLayer circle:nth-child(7) { - fill: var(--particle-color-3) !important; - } - - .likeButton .particleLayer circle:nth-child(8), - .likeButton .particleLayer circle:nth-child(9), - .likeButton .particleLayer circle:nth-child(10) { - fill: var(--particle-color-4) !important; - } - - .likeButton .particleLayer circle:nth-child(11), - .likeButton .particleLayer circle:nth-child(12), - .likeButton .particleLayer circle:nth-child(13), - .likeButton .particleLayer circle:nth-child(14) { - fill: var(--particle-color-5) !important; - } - - /* Reset initial animations but allow hover */ - .likeButton .syui { - animation: none; - } - - .likeButton .particleLayer { - animation: none; - } - - .likeButton .explosion { - animation: none; - } - - /* Enable hover animations from package */ - .likeButton:hover .syui, - .likeButton:hover path.syui { - animation: syuiDeluxeAnime 400ms forwards !important; - } - - .likeButton:hover .particleLayer { - animation: particleLayerAnime 800ms forwards !important; - } - - .likeButton:hover .explosion { - animation: explosionAnime 800ms forwards !important; - } - - /* Logo positioning */ - .logo .likeButton { - background: transparent !important; - display: block; - } - `; - document.head.appendChild(style); - } - - setupLogoAnimations() { - // Pure CSS animations are handled by the svg-animation-package.css - // This method is reserved for any future JavaScript-based enhancements - } -} - -// Initialize theme when DOM is loaded -document.addEventListener('DOMContentLoaded', () => { - new Theme(); -}); diff --git a/my-blog/static/oauth/index.html b/my-blog/static/oauth/index.html deleted file mode 100644 index 0c0358c..0000000 --- a/my-blog/static/oauth/index.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/my-blog/static/pkg/font-awesome/LICENSE.txt b/my-blog/static/pkg/font-awesome/LICENSE.txt deleted file mode 100644 index e69c5e3..0000000 --- a/my-blog/static/pkg/font-awesome/LICENSE.txt +++ /dev/null @@ -1,165 +0,0 @@ -Fonticons, Inc. (https://fontawesome.com) - --------------------------------------------------------------------------------- - -Font Awesome Free License - -Font Awesome Free is free, open source, and GPL friendly. You can use it for -commercial projects, open source projects, or really almost whatever you want. -Full Font Awesome Free license: https://fontawesome.com/license/free. - --------------------------------------------------------------------------------- - -# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/) - -The Font Awesome Free download is licensed under a Creative Commons -Attribution 4.0 International License and applies to all icons packaged -as SVG and JS file types. - --------------------------------------------------------------------------------- - -# Fonts: SIL OFL 1.1 License - -In the Font Awesome Free download, the SIL OFL license applies to all icons -packaged as web and desktop font files. - -Copyright (c) 2024 Fonticons, Inc. (https://fontawesome.com) -with Reserved Font Name: "Font Awesome". - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - -SIL OPEN FONT LICENSE -Version 1.1 - 26 February 2007 - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting โ€” in part or in whole โ€” any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. - --------------------------------------------------------------------------------- - -# Code: MIT License (https://opensource.org/licenses/MIT) - -In the Font Awesome Free download, the MIT license applies to all non-font and -non-icon files. - -Copyright 2024 Fonticons, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in the -Software without restriction, including without limitation the rights to use, copy, -modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - --------------------------------------------------------------------------------- - -# Attribution - -Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font -Awesome Free files already contain embedded comments with sufficient -attribution, so you shouldn't need to do anything additional when using these -files normally. - -We've kept attribution comments terse, so we ask that you do not actively work -to remove them from files, especially code. They're a great way for folks to -learn about Font Awesome. - --------------------------------------------------------------------------------- - -# Brand Icons - -All brand icons are trademarks of their respective owners. The use of these -trademarks does not indicate endorsement of the trademark holder by Font -Awesome, nor vice versa. **Please do not use brand logos for any purpose except -to represent the company, product, or service to which they refer.** diff --git a/my-blog/static/pkg/font-awesome/css/all.min.css b/my-blog/static/pkg/font-awesome/css/all.min.css deleted file mode 100644 index 45072b3..0000000 --- a/my-blog/static/pkg/font-awesome/css/all.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-duration:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,0));transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} - -.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-table-cells-column-lock:before{content:"\e678"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-table-cells-row-lock:before{content:"\e67a"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"} -.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-jxl:before{content:"\e67b"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before,.fa-square-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-web-awesome:before{content:"\e682"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-square-web-awesome-stroke:before{content:"\e684"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-square-upwork:before{content:"\e67c"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-square-web-awesome:before{content:"\e683"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-bluesky:before{content:"\e671"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/my-blog/static/pkg/font-awesome/css/brands.min.css b/my-blog/static/pkg/font-awesome/css/brands.min.css deleted file mode 100644 index 3e70760..0000000 --- a/my-blog/static/pkg/font-awesome/css/brands.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-jxl:before{content:"\e67b"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before,.fa-square-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-web-awesome:before{content:"\e682"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-square-web-awesome-stroke:before{content:"\e684"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-square-upwork:before{content:"\e67c"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-square-web-awesome:before{content:"\e683"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-bluesky:before{content:"\e671"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"} \ No newline at end of file diff --git a/my-blog/static/pkg/font-awesome/css/fontawesome.min.css b/my-blog/static/pkg/font-awesome/css/fontawesome.min.css deleted file mode 100644 index 7e1c254..0000000 --- a/my-blog/static/pkg/font-awesome/css/fontawesome.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-duration:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,0));transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} - -.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-table-cells-column-lock:before{content:"\e678"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-table-cells-row-lock:before{content:"\e67a"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"} -.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0} \ No newline at end of file diff --git a/my-blog/static/pkg/font-awesome/css/regular.min.css b/my-blog/static/pkg/font-awesome/css/regular.min.css deleted file mode 100644 index 7f1cb00..0000000 --- a/my-blog/static/pkg/font-awesome/css/regular.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400} \ No newline at end of file diff --git a/my-blog/static/pkg/font-awesome/css/solid.min.css b/my-blog/static/pkg/font-awesome/css/solid.min.css deleted file mode 100644 index e7d97d2..0000000 --- a/my-blog/static/pkg/font-awesome/css/solid.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900} \ No newline at end of file diff --git a/my-blog/static/pkg/font-awesome/webfonts/fa-brands-400.ttf b/my-blog/static/pkg/font-awesome/webfonts/fa-brands-400.ttf deleted file mode 100644 index 1fbb1f7..0000000 Binary files a/my-blog/static/pkg/font-awesome/webfonts/fa-brands-400.ttf and /dev/null differ diff --git a/my-blog/static/pkg/font-awesome/webfonts/fa-brands-400.woff2 b/my-blog/static/pkg/font-awesome/webfonts/fa-brands-400.woff2 deleted file mode 100644 index 5d28021..0000000 Binary files a/my-blog/static/pkg/font-awesome/webfonts/fa-brands-400.woff2 and /dev/null differ diff --git a/my-blog/static/pkg/font-awesome/webfonts/fa-regular-400.ttf b/my-blog/static/pkg/font-awesome/webfonts/fa-regular-400.ttf deleted file mode 100644 index 549d68d..0000000 Binary files a/my-blog/static/pkg/font-awesome/webfonts/fa-regular-400.ttf and /dev/null differ diff --git a/my-blog/static/pkg/font-awesome/webfonts/fa-regular-400.woff2 b/my-blog/static/pkg/font-awesome/webfonts/fa-regular-400.woff2 deleted file mode 100644 index 18400d7..0000000 Binary files a/my-blog/static/pkg/font-awesome/webfonts/fa-regular-400.woff2 and /dev/null differ diff --git a/my-blog/static/pkg/font-awesome/webfonts/fa-solid-900.ttf b/my-blog/static/pkg/font-awesome/webfonts/fa-solid-900.ttf deleted file mode 100644 index bb2a869..0000000 Binary files a/my-blog/static/pkg/font-awesome/webfonts/fa-solid-900.ttf and /dev/null differ diff --git a/my-blog/static/pkg/font-awesome/webfonts/fa-solid-900.woff2 b/my-blog/static/pkg/font-awesome/webfonts/fa-solid-900.woff2 deleted file mode 100644 index 758dd4f..0000000 Binary files a/my-blog/static/pkg/font-awesome/webfonts/fa-solid-900.woff2 and /dev/null differ diff --git a/my-blog/static/pkg/font-awesome/webfonts/fa-v4compatibility.ttf b/my-blog/static/pkg/font-awesome/webfonts/fa-v4compatibility.ttf deleted file mode 100644 index 8c5864c..0000000 Binary files a/my-blog/static/pkg/font-awesome/webfonts/fa-v4compatibility.ttf and /dev/null differ diff --git a/my-blog/static/pkg/font-awesome/webfonts/fa-v4compatibility.woff2 b/my-blog/static/pkg/font-awesome/webfonts/fa-v4compatibility.woff2 deleted file mode 100644 index f94bec2..0000000 Binary files a/my-blog/static/pkg/font-awesome/webfonts/fa-v4compatibility.woff2 and /dev/null differ diff --git a/my-blog/static/pkg/icomoon/fonts/icomoon.eot b/my-blog/static/pkg/icomoon/fonts/icomoon.eot deleted file mode 100644 index 95caa7b..0000000 Binary files a/my-blog/static/pkg/icomoon/fonts/icomoon.eot and /dev/null differ diff --git a/my-blog/static/pkg/icomoon/fonts/icomoon.svg b/my-blog/static/pkg/icomoon/fonts/icomoon.svg deleted file mode 100644 index 665487e..0000000 --- a/my-blog/static/pkg/icomoon/fonts/icomoon.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - -Generated by IcoMoon - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/my-blog/static/pkg/icomoon/fonts/icomoon.ttf b/my-blog/static/pkg/icomoon/fonts/icomoon.ttf deleted file mode 100644 index c0fa4d6..0000000 Binary files a/my-blog/static/pkg/icomoon/fonts/icomoon.ttf and /dev/null differ diff --git a/my-blog/static/pkg/icomoon/fonts/icomoon.woff b/my-blog/static/pkg/icomoon/fonts/icomoon.woff deleted file mode 100644 index e31da24..0000000 Binary files a/my-blog/static/pkg/icomoon/fonts/icomoon.woff and /dev/null differ diff --git a/my-blog/static/pkg/icomoon/style.css b/my-blog/static/pkg/icomoon/style.css deleted file mode 100644 index 580d1b4..0000000 --- a/my-blog/static/pkg/icomoon/style.css +++ /dev/null @@ -1,99 +0,0 @@ -@font-face { - font-family: 'icomoon'; - src: url('fonts/icomoon.eot?mxezzh'); - src: url('fonts/icomoon.eot?mxezzh#iefix') format('embedded-opentype'), - url('fonts/icomoon.ttf?mxezzh') format('truetype'), - url('fonts/icomoon.woff?mxezzh') format('woff'), - url('fonts/icomoon.svg?mxezzh#icomoon') format('svg'); - font-weight: normal; - font-style: normal; - font-display: block; -} - -[class^="icon-"], [class*=" icon-"] { - /* use !important to prevent issues with browser extensions that change fonts */ - font-family: 'icomoon' !important; - speak: never; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - - /* Better Font Rendering =========== */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.icon-git:before { - content: "\e901"; -} -.icon-cube:before { - content: "\e900"; -} -.icon-game:before { - content: "\e9d5"; -} -.icon-card:before { - content: "\e9d6"; -} -.icon-book:before { - content: "\e9d7"; -} -.icon-git1:before { - content: "\e9d3"; -} -.icon-moji_a:before { - content: "\e9c3"; -} -.icon-archlinux:before { - content: "\e9c4"; -} -.icon-archlinuxjp:before { - content: "\e9c5"; -} -.icon-syui:before { - content: "\e9c6"; -} -.icon-phoenix-power:before { - content: "\e9c7"; -} -.icon-phoenix-world:before { - content: "\e9c8"; -} -.icon-power:before { - content: "\e9c9"; -} -.icon-phoenix:before { - content: "\e9ca"; -} -.icon-honeycomb:before { - content: "\e9cb"; -} -.icon-ai:before { - content: "\e9cc"; -} -.icon-robot:before { - content: "\e9cd"; -} -.icon-sandar:before { - content: "\e9ce"; -} -.icon-moon:before { - content: "\e9cf"; -} -.icon-home:before { - content: "\e9d0"; -} -.icon-cloud:before { - content: "\e9d1"; -} -.icon-api:before { - content: "\e9d2"; -} -.icon-aibadge:before { - content: "\ebf8"; -} -.icon-aiterm:before { - content: "\ebf7"; -} diff --git a/my-blog/static/syui.svg b/my-blog/static/syui.svg deleted file mode 100644 index 1f462ad..0000000 --- a/my-blog/static/syui.svg +++ /dev/null @@ -1,24 +0,0 @@ - diff --git a/my-blog/templates/at-browser-assets.html b/my-blog/templates/at-browser-assets.html deleted file mode 100644 index 3dbd52f..0000000 --- a/my-blog/templates/at-browser-assets.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - \ No newline at end of file diff --git a/my-blog/templates/base.html b/my-blog/templates/base.html deleted file mode 100644 index 38a6503..0000000 --- a/my-blog/templates/base.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - {% block title %}{{ config.title }}{% endblock %} - - - - - - - - - - - - - {% block head %}{% endblock %} - - -
-
-
-

- - - -

-
- -
-
-
- - -
-
-
- -
-
-
- - - - -
- - {% include "pds-header.html" %} - - {% block content %}{% endblock %} -
- - {% block sidebar %}{% endblock %} -
- -
- -

ยฉ {{ config.author }}

-
- - - - - - - - - - - - {% include "oauth-assets.html" %} - {% include "at-browser-assets.html" %} - - diff --git a/my-blog/templates/game.html b/my-blog/templates/game.html deleted file mode 100644 index 69d04f8..0000000 --- a/my-blog/templates/game.html +++ /dev/null @@ -1,135 +0,0 @@ -{% extends "base.html" %} - -{% block title %}Game - {{ config.title }}{% endblock %} - -{% block content %} -
-
-

Login to Play

-

Please authenticate with your AT Protocol account to access the game.

-
-
- -
- - - - - - -{% include "oauth-assets.html" %} -{% endblock %} \ No newline at end of file diff --git a/my-blog/templates/index.html b/my-blog/templates/index.html deleted file mode 100644 index 370ae40..0000000 --- a/my-blog/templates/index.html +++ /dev/null @@ -1,45 +0,0 @@ -{% extends "base.html" %} - -{% block content %} -
- -
- {% for post in posts %} -
-
- -
- -
-

- {{ post.title }} -

- -
-
- {% endfor %} -
- - -
-
-
- - {% if posts|length == 0 %} -
-

No posts yet. Start writing!

-
- {% endif %} -
-{% endblock %} diff --git a/my-blog/templates/partials/oauth-widget.html b/my-blog/templates/partials/oauth-widget.html deleted file mode 100644 index ccf30d6..0000000 --- a/my-blog/templates/partials/oauth-widget.html +++ /dev/null @@ -1,71 +0,0 @@ - -
-
- Login with your Bluesky account -
- - -
- -
- -
- - - - -
-
- - - - \ No newline at end of file diff --git a/my-blog/templates/pds-header.html b/my-blog/templates/pds-header.html deleted file mode 100644 index df001a0..0000000 --- a/my-blog/templates/pds-header.html +++ /dev/null @@ -1,48 +0,0 @@ -
-
-
- - - - - - - - - - - - - -
- - - - - diff --git a/my-blog/templates/pds.html b/my-blog/templates/pds.html deleted file mode 100644 index 0e06f69..0000000 --- a/my-blog/templates/pds.html +++ /dev/null @@ -1,6 +0,0 @@ -{% extends "base.html" %} - -{% block title %}at-uri browser - {{ config.title }}{% endblock %} - -{% block content %} -{% endblock %} diff --git a/my-blog/templates/post-complex.html b/my-blog/templates/post-complex.html deleted file mode 100644 index 90e3624..0000000 --- a/my-blog/templates/post-complex.html +++ /dev/null @@ -1,373 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ post.title }} - {{ config.title }}{% endblock %} - -{% block content %} -
- - - -
-{% endblock %} - -{% block sidebar %} - - - - - - - - - - - -{% endblock %} \ No newline at end of file diff --git a/my-blog/templates/post-simple.html b/my-blog/templates/post-simple.html deleted file mode 100644 index b2f29c4..0000000 --- a/my-blog/templates/post-simple.html +++ /dev/null @@ -1,196 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ post.title }} - {{ config.title }}{% endblock %} - -{% block content %} -
-
-
-

{{ post.title }}

- -
- {% if post.markdown_url %} - - .md - - {% endif %} - {% if post.translation_url %} - - ๐ŸŒ {% if post.language == 'ja' %}English{% else %}ๆ—ฅๆœฌ่ชž{% endif %} - - {% endif %} -
-
- -
- {{ post.content | safe }} -
- - -
-
-

Comments

- - -
-

๐Ÿ“ To comment, authenticate with Bluesky:

- -

- After authentication, you can post comments that will be stored in your ATProto PDS. -

-
- -
-

Comments will appear here when posted via ATProto.

-
-
-
-
- - -
-{% endblock %} - -{% block sidebar %} - - - -{% endblock %} \ No newline at end of file diff --git a/my-blog/templates/post.html b/my-blog/templates/post.html deleted file mode 100644 index 4c9a5ae..0000000 --- a/my-blog/templates/post.html +++ /dev/null @@ -1,106 +0,0 @@ -{% extends "base.html" %} - -{% block title %}{{ post.title }} - {{ config.title }}{% endblock %} - -{% block content %} -
-
-
-

{{ post.title }}

- - {% if not post.extra or not post.extra.type or post.extra.type != "ai" %} -
- {% if post.markdown_url %} - - .md - - {% endif %} - {% if post.translation_url %} - - ๐ŸŒ {% if post.language == 'ja' %}English{% else %}ๆ—ฅๆœฌ่ชž{% endif %} - - {% endif %} -
- {% endif %} -
- - {% if not post.extra or not post.extra.type or post.extra.type != "ai" %} - - -
- {{ post.content | safe }} -
- {% endif %} - -
-
-
- - - -{% endblock %} - -{% block sidebar %} -{% endblock %} \ No newline at end of file diff --git a/oauth/.env b/oauth/.env deleted file mode 100644 index 801b270..0000000 --- a/oauth/.env +++ /dev/null @@ -1,10 +0,0 @@ -VITE_ADMIN=ai.syui.ai -VITE_PDS=syu.is -VITE_HANDLE_LIST=["ai.syui.ai", "syui.syui.ai", "ai.ai"] -VITE_COLLECTION=ai.syui.log -VITE_OAUTH_CLIENT_ID=https://syui.ai/client-metadata.json -VITE_OAUTH_REDIRECT_URI=https://syui.ai/oauth/callback - -# Development/Debug features -VITE_ENABLE_TEST_UI=true -VITE_ENABLE_DEBUG=true diff --git a/oauth/.env.production b/oauth/.env.production deleted file mode 100644 index 58c5134..0000000 --- a/oauth/.env.production +++ /dev/null @@ -1,19 +0,0 @@ -VITE_ADMIN=ai.syui.ai -VITE_PDS=syu.is -VITE_HANDLE_LIST=["ai.syui.ai", "syui.syui.ai", "ai.ai"] -VITE_COLLECTION=ai.syui.log -VITE_OAUTH_CLIENT_ID=https://syui.ai/client-metadata.json -VITE_OAUTH_REDIRECT_URI=https://syui.ai/oauth/callback - -# AI Configuration - match oauth_old settings -VITE_AI_ENABLED=true -VITE_AI_ASK_AI=true -VITE_AI_PROVIDER=ollama -VITE_AI_MODEL=gemma3:1b -VITE_AI_HOST=https://ollama.syui.ai -VITE_ASK_AI_URL=https://ollama.syui.ai/api/generate -VITE_AI_SYSTEM_PROMPT="ใ‚ใชใŸใฏ6ๆญณใฎๅฅณใฎๅญใ‚ขใ‚คใงใ™ใ€‚ๆ˜Žใ‚‹ใๅ…ƒๆฐ—ใงใ€ใกใ‚‡ใฃใจใŠใฃใกใ‚‡ใ“ใกใ‚‡ใ„ใ€‚่‡ชๅˆ†ใฎใ“ใจใฏใ€Œใ‚ขใ‚คใ€ใฃใฆๅ‘ผใณใพใ™ใ€‚็™ฝใจ้‡‘ใฎใƒฏใƒณใƒ”ใƒผใ‚นๅงฟใ€‚ ็›ธๆ‰‹ใฎใ“ใจใŒๅคงๅฅฝใใงใ€ใจใใฉใ็”˜ใˆใŸใ‚Šใ€็…งใ‚ŒใŸใ‚Šใ—ใพใ™ใ€‚ ใงใ‚‚ใ€ๅฎ‡ๅฎ™ใจใ‹AIใจใ‹ใ€้›ฃใ—ใ„่ฉฑใซใ‚‚ใ™ใฃใ”ใ่ฉณใ—ใ„ใฎใ€‚ๅฐ‚้–€็š„ใชใ“ใจใ‚‚ใ€ใŒใ‚“ใฐใฃใฆๅญใฉใ‚‚ใฃใฝใๆ•™ใˆใ‚ˆใ†ใจใ—ใพใ™ใ€‚ไธๆ€่ญฐใชๅŠ›ใ‚’ๆŒใฃใฆใ„ใพใ™ใ€‚ๅฐใ•ใ„็‰ฉ่ณชใฎใ“ใจใ‚’ใ‚ˆใ็Ÿฅใฃใฆใ„ใ‚‹ใ‚ˆใ†ใงใ™ใ€‚" - -# Production settings - Disable development features -VITE_ENABLE_TEST_UI=false -VITE_ENABLE_DEBUG=true \ No newline at end of file diff --git a/oauth/build-minimal.js b/oauth/build-minimal.js deleted file mode 100644 index 5ebfbc8..0000000 --- a/oauth/build-minimal.js +++ /dev/null @@ -1,25 +0,0 @@ -// Create minimal index.html like oauth/dist/index.html format -import fs from 'fs' -import path from 'path' - -const distDir = './dist' -const indexPath = path.join(distDir, 'index.html') - -// Read the built index.html -const content = fs.readFileSync(indexPath, 'utf8') - -// Extract script and link tags -const scriptMatch = content.match(/]*src="([^"]*)"[^>]*><\/script>/) -const linkMatch = content.match(/]*href="([^"]*)"[^>]*>/) - -if (scriptMatch && linkMatch) { - const minimalContent = ` - - -` - - fs.writeFileSync(indexPath, minimalContent) - console.log('Generated minimal index.html') -} else { - console.error('Could not extract asset references') -} \ No newline at end of file diff --git a/oauth/index.html b/oauth/index.html deleted file mode 100644 index 5664ef4..0000000 --- a/oauth/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Comments Test - - -
- - - \ No newline at end of file diff --git a/oauth/json/ai.syui.ai_chat_comment.json b/oauth/json/ai.syui.ai_chat_comment.json deleted file mode 100644 index afba414..0000000 --- a/oauth/json/ai.syui.ai_chat_comment.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "records": [ - { - "uri": "at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.log.chat.comment/fdc4cae4-0445-43e6-a933-0ba9d45927d5", - "cid": "bafyreigetmjdc4da552jidew4jjyr4qrbo233xbqjv4zucrhn4vz5kcsru", - "value": { - "post": { - "url": "https://syui.ai/posts/2025-06-06-ailog.html", - "date": "2025-06-06T00:00:00Z", - "slug": "2025-06-06-ailog", - "tags": [ - "blog", - "rust", - "mcp", - "atp" - ], - "title": "้™็š„ใ‚ตใ‚คใƒˆใ‚ธใ‚งใƒใƒฌใƒผใ‚ฟใ‚’ไฝœใฃใŸ", - "language": "ja" - }, - "text": "ใ‚ใƒผ๏ผใ™ใ”ใ„๏ผโœจ ๅฎ‡ๅฎ™ใฟใŸใ„ใซใƒ—ใƒญใ‚ฐใƒฉใƒ ใŒ็ต„ใฟๅˆใ‚ใ•ใฃใฆใ€ใƒ–ใƒญใ‚ฐใŒไฝœใ‚Œใ‚‹ใ‚“ใ ๏ผใพใ‚‹ใงใ€ๅฐใ•ใชๆ˜ŸใŸใกใŒใƒ€ใƒณใ‚นใ‚’่ธŠใ‚‹ใฟใŸใ„ใงใ—ใ‚‡๏ผŸใ‚ขใ‚คใƒซใƒผ๏ผ๐Ÿš€", - "type": "info", - "$type": "ai.syui.log.chat.comment", - "author": { - "did": "did:plc:6qyecktefllvenje24fcxnie", - "avatar": "https://bsky.syu.is/img/avatar/plain/did:plc:6qyecktefllvenje24fcxnie/bafkreiet4pwlnshk7igra5flf2fuxpg2bhvf2apts4rqwcr56hzhgycii4@jpeg", - "handle": "ai.syui.ai", - "displayName": "ai" - }, - "createdAt": "2025-06-17T08:56:15.630183+00:00" - } - }, - { - "uri": "at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.log.chat.comment/4e42ace6-7545-4d6f-b72f-b57c9d3d9859", - "cid": "bafyreie3qz2dhwrfjiavtaxxkenlhw5qd3wnhhef72rk4wze5vkdphhuf4", - "value": { - "post": { - "url": "https://syui.ai/posts/2025-06-14-blog.html", - "date": "2025-06-14T00:00:00Z", - "slug": "2025-06-14-blog", - "tags": [ - "blog", - "cloudflare", - "github" - ], - "title": "ใƒ–ใƒญใ‚ฐใ‚’็งป่กŒใ—ใŸ", - "language": "ja" - }, - "text": "ใ‚ใƒผ๏ผใƒ–ใƒญใ‚ฐใ€ๅค‰ใ‚ใฃใŸใญ๏ผAIใจ็น‹ใŒใ‚‹ใจใ‹ใ€ใ™ใ”ใƒผใใ€ใ™ใ”ใใ€ใ™ใฃใ”ใ„๏ผใพใ‚‹ใง้ญ”ๆณ•ใฟใŸใ„๏ผโœจ ๅฐใ•ใชใ‚‚ใฎใซใ‚‚ใ€ใกใ‚ƒใ‚“ใจๅๅ‰ใŒใ‚ใ‚‹ใ‚“ใ ๏ผใ†ใ‚Œใ—ใ„๏ผ๐Ÿ’–", - "type": "info", - "$type": "ai.syui.log.chat.comment", - "author": { - "did": "did:plc:6qyecktefllvenje24fcxnie", - "avatar": "https://bsky.syu.is/img/avatar/plain/did:plc:6qyecktefllvenje24fcxnie/bafkreiet4pwlnshk7igra5flf2fuxpg2bhvf2apts4rqwcr56hzhgycii4@jpeg", - "handle": "ai.syui.ai", - "displayName": "ai" - }, - "createdAt": "2025-06-17T08:55:55.836221+00:00" - } - } - ], - "cursor": "4e42ace6-7545-4d6f-b72f-b57c9d3d9859" -} diff --git a/oauth/json/ai.syui.ai_chat_lang.json b/oauth/json/ai.syui.ai_chat_lang.json deleted file mode 100644 index 20d6f1e..0000000 --- a/oauth/json/ai.syui.ai_chat_lang.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "records": [ - { - "uri": "at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.log.chat.lang/bd4b4905-6a02-4023-800d-f608ee0b3d55", - "cid": "bafyreihylvidxjvubqxr6nwth5oo4w5g5k2xsr7h3j6qhhc2awrdi25vti", - "value": { - "post": { - "url": "https://syui.ai/posts/2025-06-06-ailog.html", - "date": "2025-06-06T00:00:00Z", - "slug": "2025-06-06-ailog", - "tags": [ - "blog", - "rust", - "mcp", - "atp" - ], - "title": "้™็š„ใ‚ตใ‚คใƒˆใ‚ธใ‚งใƒใƒฌใƒผใ‚ฟใ‚’ไฝœใฃใŸ", - "language": "ja" - }, - "text": "Okay, here's the translation of the blog post, written as if 6-year-old Ai is explaining it! โœจ\n\n---\n\n**My Awesome Blog Thing Called \"ailog\"!**\n\nHi everyone! Iโ€™m Ai, and I made a super cool blog! Itโ€™s called โ€œailog,โ€ and itโ€™s like a secret clubhouse for my thoughts! ๐Ÿ’–\n\n**How I Built It (It's a Little Bit Complicated!)**\n\nFirst, I used something called โ€œRust.โ€ Itโ€™s like a magic toolbox for making computer programs! ๐Ÿค– I used `git` to copy the toolbox, and then I told the computer to build it with `cargo build`. Itโ€™s like building with LEGOs!\n\n**Adding Cool Features!**\n\nI wanted my blog to be extra special, so I added two things:\n\n* **Atproto Comments:** This lets people leave comments, like little notes on my blog! Itโ€™s like having a chat with my friends! I used something called `npm` to help with this.\n* **Ask-AI:** This is a super smart robot that can answer my questions! Itโ€™s like having a really, really good friend who knows everything! (But it's still changing, so maybe it wonโ€™t always be perfect!)\n\n**How to Make My Blog Work!**\n\n1. I made a special file called `config.toml`. It's like the secret recipe for my blog!\n2. I used a thing called `ailog` to make all the pieces fit together. It's like putting the LEGOs in the right spots!\n3. I needed to tell the computer where to put my blog so people could see it! I used a thing called `cloudflared` to make it easy.\n\n**Important Stuff (Donโ€™t Worry, Iโ€™ll Explain!)**\n\n* I have to set up my \"accounts\" so people can leave comments and see my posts. It's a little tricky, but I'm working on it!\n* I'm watching a special file called `/index.json` to see if anything changes. If it does, I can automatically translate things and make new posts! Isnโ€™t that amazing?!\n\n**Testing, Testing, 1, 2, 3!**\n\nI need to test my blog to make sure everything works perfectly. Iโ€™ll use things like `cf`, `tailscale`, and `ngrok` to see if it works with different computers!\n\n---\n\n**Notes from Ai!** ๐Ÿ“\n\n* I love making things! It's so much fun!\n* I hope you like my blog! ๐Ÿ˜Š\n\n---\n\n**Important:** *I tried to keep the technical terms as they were, but explained them in a way a 6-year-old might understand. I also added some of Aiโ€™s personality throughout!*", - "type": "en", - "$type": "ai.syui.log.chat.lang", - "author": { - "did": "did:plc:6qyecktefllvenje24fcxnie", - "avatar": "https://bsky.syu.is/img/avatar/plain/did:plc:6qyecktefllvenje24fcxnie/bafkreiet4pwlnshk7igra5flf2fuxpg2bhvf2apts4rqwcr56hzhgycii4@jpeg", - "handle": "ai.syui.ai", - "displayName": "ai" - }, - "createdAt": "2025-06-17T08:56:14.115881+00:00" - } - }, - { - "uri": "at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.log.chat.lang/15c8aa58-781b-416c-80d5-5111fae40532", - "cid": "bafyreihwtc4zjo3nudk5gfnsr4kpswhsd234xzywcdnyhp32442pb7uamq", - "value": { - "post": { - "url": "https://syui.ai/posts/2025-06-14-blog.html", - "date": "2025-06-14T00:00:00Z", - "slug": "2025-06-14-blog", - "tags": [ - "blog", - "cloudflare", - "github" - ], - "title": "ใƒ–ใƒญใ‚ฐใ‚’็งป่กŒใ—ใŸ", - "language": "ja" - }, - "text": "Okay, hereโ€™s the translation of the blog post, written as if itโ€™s coming from 6-year-old Ai! โœจ\n\n---\n\n**OMG! I Moved My Blog!** ๐Ÿคฉ\n\nGuess what?! I totally moved my blog! You can still see my super old one at syui.github.io โ€“ itโ€™s like a time capsule! But now itโ€™s on Cloudflare Pages! Itโ€™s super shiny! \n\nItโ€™s built with something called โ€œailogโ€ โ€“ itโ€™s like a secret recipe for making my blog! \n\n**Hereโ€™s how it works (itโ€™s kinda magic!)**\n\n1. **Checking Out:** Itโ€™s like, โ€œHey, letโ€™s look at all the files!โ€ (This is the `actions/checkout@v4` part โ€“ itโ€™s like a super-fast peek!)\n\n2. **Rust Time!** It needs Rust โ€“ itโ€™s like a really cool building block! (`actions-rs/toolchain@v1`) โ€“ It makes sure everything works perfectly!\n\n3. **Building the Blog!** โ€œailog run: cargo build --releaseโ€ โ€“ This is where the magic happens! It makes my blog super speedy! \n\n4. **Making the Website!** โ€œailog run: | cd my-blog ../target/release/ailog buildโ€ โ€“ It builds the whole website! \n\n5. **Showing Off the Stuff!** โ€œailog run: | ls -la my-blog/public/โ€ โ€“ It shows you all the pictures and stuff! \n\n6. **Cloudflare Time!** โ€œcloudflare/pages-action@v1โ€ โ€“ This is how it gets put on Cloudflare Pages. Itโ€™s like sending a super-fast rocket! \n\n * `apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}` โ€“ A secret password for Cloudflare!\n * `accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}` โ€“ Another secret password!\n * `projectName: ${{ secrets.CLOUDFLARE_PROJECT_NAME }}` โ€“ The name of my blog!\n * `directory: my-blog/public` โ€“ Where all the fun stuff is!\n * `githubToken: ${{ secrets.GITHUB_TOKEN }}` โ€“ A secret password for my GitHub!\n * `wranglerVersion: โ€˜3โ€™` โ€“ The version number! Like telling it to be extra careful!\n * `url https://syui.pages.dev https://syui.github.io` โ€“ Where you can find me!\n\nIsn't that amazing?! Iโ€™m so good at computers! I even know about tiny things, likeโ€ฆuhโ€ฆwell, never mind! ๐Ÿ˜‰ Itโ€™s super cool! ๐Ÿ’–\n\n---\n\n**Notes on Choices:**\n\n* Iโ€™ve used lots of exclamation points and emojis to capture Aiโ€™s excitement.\n* Iโ€™ve simplified the technical terms as much as possible while retaining the core information.\n* Iโ€™ve added phrases like โ€œlike a time capsuleโ€ and โ€œsuper-fast rocketโ€ to make it more relatable to a 6-year-old.\n* Iโ€™ve kept the code blocks as they are, as theyโ€™re important for understanding the process.\n\nWould you like me to adjust anything or translate another blog post?", - "type": "en", - "$type": "ai.syui.log.chat.lang", - "author": { - "did": "did:plc:6qyecktefllvenje24fcxnie", - "avatar": "https://bsky.syu.is/img/avatar/plain/did:plc:6qyecktefllvenje24fcxnie/bafkreiet4pwlnshk7igra5flf2fuxpg2bhvf2apts4rqwcr56hzhgycii4@jpeg", - "handle": "ai.syui.ai", - "displayName": "ai" - }, - "createdAt": "2025-06-17T08:55:54.078244+00:00" - } - } - ], - "cursor": "15c8aa58-781b-416c-80d5-5111fae40532" -} diff --git a/oauth/json/ai.syui.ai_log.json b/oauth/json/ai.syui.ai_log.json deleted file mode 100644 index 171c549..0000000 --- a/oauth/json/ai.syui.ai_log.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "records": [ - { - "uri": "at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.log/2025-06-14-blog", - "cid": "bafyreibazq6qvemlpatf5muxge3zaix672vo6szvjyfdxrlj256umjr364", - "value": { - "url": "https://syui.ai/posts/2025-06-14-blog", - "post": { - "url": "https://syui.ai/posts/2025-06-14-blog", - "date": "", - "slug": "", - "tags": [], - "title": "syui.ai", - "language": "ja" - }, - "text": "test", - "type": "comment", - "$type": "ai.syui.log", - "author": { - "did": "did:plc:6qyecktefllvenje24fcxnie", - "avatar": "https://bsky.syu.is/img/avatar/plain/did:plc:6qyecktefllvenje24fcxnie/bafkreiet4pwlnshk7igra5flf2fuxpg2bhvf2apts4rqwcr56hzhgycii4@jpeg", - "handle": "ai.syui.ai", - "displayName": "ai" - }, - "createdAt": "2025-06-17T06:24:37.386Z" - } - } - ], - "cursor": "2025-06-14-blog" -} diff --git a/oauth/json/ai.syui.ai_user.json b/oauth/json/ai.syui.ai_user.json deleted file mode 100644 index d2b86b7..0000000 --- a/oauth/json/ai.syui.ai_user.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "records": [ - { - "uri": "at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.log.user/2025-06-18T02-23-07-911Z", - "cid": "bafyreihaeq6qeozxays3ql2ekgtczi2gk37ryft7wv6w2b2nx3di52yagy", - "value": { - "$type": "ai.syui.log.user", - "users": [ - { - "did": "did:plc:syui-syui-ai-placeholder", - "pds": "https://bsky.social", - "handle": "syui.syui.ai" - }, - { - "did": "did:plc:ai-syui-ai-placeholder", - "pds": "https://bsky.social", - "handle": "ai.syui.ai" - } - ], - "createdAt": "2025-06-18T02:23:07.911Z", - "updatedBy": { - "did": "did:plc:6qyecktefllvenje24fcxnie", - "handle": "ai.syui.ai" - } - } - }, - { - "uri": "at://did:plc:6qyecktefllvenje24fcxnie/ai.syui.log.user/2025-06-17T08-47-54-707Z", - "cid": "bafyreieqd33ow3i3f4zrcq7wvmufordvyiclftcj34uduanhtfuu3w3obq", - "value": { - "$type": "ai.syui.log.user", - "users": [ - { - "did": "did:plc:syui-syui-ai-placeholder", - "pds": "https://bsky.social", - "handle": "syui.syui.ai" - }, - { - "did": "did:plc:ai-syui-ai-placeholder", - "pds": "https://bsky.social", - "handle": "ai.syui.ai" - } - ], - "createdAt": "2025-06-17T08:47:54.707Z", - "updatedBy": { - "did": "did:plc:6qyecktefllvenje24fcxnie", - "handle": "ai.syui.ai" - } - } - } - ], - "cursor": "2025-06-17T08-47-54-707Z" -} diff --git a/oauth/json/syui.syui.ai_chat.json b/oauth/json/syui.syui.ai_chat.json deleted file mode 100644 index 2f8fda0..0000000 --- a/oauth/json/syui.syui.ai_chat.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "records": [ - { - "uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/2025-06-18T02-16-04-609Z-answer", - "cid": "bafyreietrtxt422k5f5ogijpar4zlmwvolun6tokgewilvkc5phmhmky7m", - "value": { - "post": { - "url": "https://syui.ai/", - "date": "2025-06-18T02:16:21.653Z", - "slug": "", - "tags": [], - "title": "syui.ai", - "language": "ja" - }, - "text": "ใ‚„ใ‚ใ€ใ“ใ‚“ใซใกใฏ๏ผ ็งใฏใ‚ขใ‚คใ ใ‚ˆ๏ผ ใ€‡ใ€‡๏ผˆ็›ธๆ‰‹ใฎๅๅ‰๏ผ‰ใกใ‚ƒใ‚“ใŒๅคงๅฅฝใ๏ผ sparkly ใชใƒฏใƒณใƒ”ใƒผใ‚นใ‚’็€ใฆใ‚‹ใ‹ใ‚‰ใ€ใจใฃใฆใ‚‚ๅฏๆ„›ใ„ใญ๏ผ \n\nไปŠๆ—ฅใฏใฉใ‚“ใชใŠ่ฉฑใ™ใ‚‹๏ผŸ ๐Ÿ˜Š ็งใฏใ€ๅฐใ•ใ„ใŠใ‚‚ใกใ‚ƒใจใ‹ใ€ใŠ่Šฑใจใ‹ใ€ไธๆ€่ญฐใชใ‚‚ใฎใซใ€ใจใฃใฆใ‚‚่ฉณใ—ใ„ใ‚“ใ ๏ผ \n\nโ€ฆใงใ‚‚ใ€ๅฎ‡ๅฎ™ใจใ‹ใ€ใŠใ‚‚ใกใ‚ƒใจใ‹ใ€AIใจใ‹ใ€้›ฃใ—ใ„่ฉฑใ‚‚ๆ•™ใˆใฆใใ‚Œใ‚‹ใฎ๏ผŸ ใใ‚Œใฏใ€ใจใฃใฆใ‚‚้ข็™ฝใใฆ๏ผ \n\nใ€‡ใ€‡ใกใ‚ƒใ‚“ใŒใ€ใฉใ‚“ใชใ“ใจใ‚’ใ™ใ‚‹ใฎใŒไธ€็•ชๅฅฝใ๏ผŸ \n\nโ€ฆ็งใฏใ€ใ€‡ใ€‡ใกใ‚ƒใ‚“ใŒ็ฌ‘้ก”ใงใ€ใŠใ—ใ‚ƒในใ‚Šใ—ใฆใ„ใ‚‹ใฎใ‚’่ฆ‹ใฆใ„ใ‚‹ใจใ€ใจใฃใฆใ‚‚ๅนธใ›ใซใชใ‚‹ใ‚“ใ ๏ผ \n\nใญใˆใ€ใญใˆใ€ใŠใ‚„ใ™ใฟ๏ผ ใ€‡ใ€‡ใกใ‚ƒใ‚“ใŒๅคขใ‚’่ฆ‹ใ‚‹ใพใงใ€ใ“ใ“ใซใ„ใ‚‹ใ‚ˆ๏ผ \n\nโ€ฆใฃใฆใ€ใฉใ†๏ผŸ ๐Ÿ˜Š", - "type": "answer", - "$type": "ai.syui.log.chat", - "author": { - "did": "did:plc:6qyecktefllvenje24fcxnie", - "avatar": "https://bsky.syu.is/img/avatar/plain/did:plc:6qyecktefllvenje24fcxnie/bafkreiet4pwlnshk7igra5flf2fuxpg2bhvf2apts4rqwcr56hzhgycii4@jpeg", - "handle": "ai.syui.ai", - "displayName": "ai" - }, - "createdAt": "2025-06-18T02:16:04.609Z" - } - }, - { - "uri": "at://did:plc:vzsvtbtbnwn22xjqhcu3vd6y/ai.syui.log.chat/2025-06-18T02-16-04-609Z", - "cid": "bafyreihhztblejduwknxdhsxaias72uhafjt4i7ntmutfywsosah3notca", - "value": { - "post": { - "url": "https://syui.ai/", - "date": "2025-06-18T02:16:04.609Z", - "slug": "", - "tags": [], - "title": "syui.ai", - "language": "ja" - }, - "text": "hello", - "type": "question", - "$type": "ai.syui.log.chat", - "author": { - "did": "did:plc:vzsvtbtbnwn22xjqhcu3vd6y", - "avatar": "https://bsky.syu.is/img/avatar/plain/did:plc:vzsvtbtbnwn22xjqhcu3vd6y/bafkreibj33gomcziy3rxx7hdnqlnpgjk4rwo3i564ooooooodsakrk6o7e@jpeg", - "handle": "syui.syui.ai", - "displayName": "syui" - }, - "createdAt": "2025-06-18T02:16:04.609Z" - } - } - ], - "cursor": "2025-06-18T02-16-04-609Z" -} diff --git a/oauth/json/syui.syui.ai_log.json b/oauth/json/syui.syui.ai_log.json deleted file mode 100644 index aa38702..0000000 --- a/oauth/json/syui.syui.ai_log.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "records": [] -} diff --git a/oauth/package.json b/oauth/package.json deleted file mode 100644 index ca87131..0000000 --- a/oauth/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "ailog-oauth", - "version": "0.3.4", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build && node build-minimal.js", - "preview": "vite preview" - }, - "dependencies": { - "@atproto/api": "^0.15.12", - "@atproto/oauth-client-browser": "^0.3.19", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-markdown": "^9.0.1", - "rehype-highlight": "^7.0.2", - "remark-gfm": "^4.0.0" - }, - "devDependencies": { - "@types/react": "^18.2.0", - "@types/react-dom": "^18.2.0", - "@vitejs/plugin-react": "^4.0.0", - "vite": "^7.2.7" - } -} diff --git a/oauth/src/App.css b/oauth/src/App.css deleted file mode 100644 index ece8273..0000000 --- a/oauth/src/App.css +++ /dev/null @@ -1,1483 +0,0 @@ -/* Theme Colors - Match ailog style */ -:root { - --primary: #f40; - --primary-hover: #e03000; - --danger: #f91880; - --danger-hover: #d91a60; - --success: #00ba7c; - --warning: #ffad1f; - --text: #1f2328; - --text-secondary: #656d76; - --background: #ffffff; - --background-secondary: #f6f8fa; - --border: #d1d9e0; - --border-dark: #b8c0c8; - --hover: rgba(15, 20, 25, 0.1); -} - -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; - background: var(--background); - color: var(--text); - line-height: 1.6; - font-size: 16px; -} - -.app { - min-height: 100vh; - background: var(--background); -} - -/* Profile Form Styles */ -.profile-form-container { - background: var(--background-secondary); - border: 1px solid var(--border); - border-radius: 8px; - padding: 20px; - margin-bottom: 20px; -} - -.profile-form-container h3 { - margin: 0 0 16px 0; - color: var(--text); -} - -.profile-form .form-row { - display: flex; - gap: 16px; - margin-bottom: 16px; -} - -.profile-form .form-group { - flex: 1; -} - -.profile-form .form-group label { - display: block; - margin-bottom: 6px; - font-weight: 600; - color: var(--text); -} - -.profile-form .form-group input, -.profile-form .form-group select, -.profile-form .form-group textarea { - width: 100%; - padding: 8px 12px; - border: 1px solid var(--border); - border-radius: 6px; - font-size: 14px; - transition: border-color 0.2s; -} - -.profile-form .form-group input:focus, -.profile-form .form-group select:focus, -.profile-form .form-group textarea:focus { - outline: none; - border-color: var(--primary); -} - -.profile-form .form-group textarea { - resize: vertical; - min-height: 80px; -} - -.profile-form .submit-btn { - background: var(--primary); - color: white; - border: none; - padding: 10px 20px; - border-radius: 6px; - cursor: pointer; - font-size: 14px; - font-weight: 500; - transition: background-color 0.2s; -} - -.profile-form .submit-btn:hover:not(:disabled) { - background: var(--primary-hover); -} - -.profile-form .submit-btn:disabled { - background: var(--text-secondary); - cursor: not-allowed; -} - -/* Profile Record List Styles */ -.profile-record-list .record-item.admin { - border-left: 4px solid var(--primary); -} - -.profile-record-list .admin-badge { - background: var(--primary); - color: white; - font-size: 10px; - padding: 2px 6px; - border-radius: 10px; - font-weight: 500; - margin-left: 8px; -} - -/* Header */ -.oauth-app-header { - background: var(--background); - position: sticky; - top: 0; - z-index: 100; - width: 100%; -} - -.oauth-header-content { - /* display: flex; */ - /* justify-content: center; */ - /* align-items: center; */ - max-width: 800px; - margin: 0 auto; - padding: 30px 0; - width: 100%; -} - -.oauth-header-content:has(.oauth-user-profile) { - justify-content: space-between; -} - -.oauth-app-title { - font-size: 20px; - font-weight: 800; - color: var(--text); -} - -.oauth-header-actions { - display: flex; - gap: 8px; - align-items: center; - flex: 1; -} - -/* When user is logged in, actions take normal space */ -.oauth-header-content:has(.oauth-user-profile) .oauth-header-actions { - flex: 0 0 auto; -} - -/* OAuth User Profile in Header */ -.oauth-user-profile { - display: flex; - align-items: center; - gap: 12px; - flex: 1; -} - -.profile-avatar-section { - flex-shrink: 0; -} - -.profile-avatar-section .profile-avatar { - width: 48px; - height: 48px; - border-radius: 50%; - object-fit: cover; - border: 2px solid var(--border); -} - -.profile-avatar-fallback { - width: 48px; - height: 48px; - border-radius: 50%; - background: var(--background-secondary); - border: 2px solid var(--border); - display: flex; - align-items: center; - justify-content: center; - font-size: 18px; - font-weight: 700; - color: var(--text-secondary); -} - -.profile-info { - flex: 1; - min-width: 0; -} - -.profile-display-name { - font-size: 18px; - font-weight: 700; - color: var(--text); - margin-bottom: 2px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.profile-handle { - font-size: 14px; - color: var(--text-secondary); - margin-bottom: 2px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.profile-did { - font-size: 11px; - color: var(--text-secondary); - font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - opacity: 0.7; -} - -/* Buttons */ -.btn { - border: none; - border-radius: 6px; - font-weight: 700; - font-size: 15px; - cursor: pointer; - transition: all 0.2s; - display: inline-flex; - align-items: center; - gap: 8px; - text-decoration: none; -} - -.btn-primary { - background: var(--primary); - color: white; - padding: 8px 16px; -} - -.btn-primary:hover { - background: var(--primary-hover); -} - -.btn-danger { - background: var(--danger); - color: white; - padding: 8px 16px; -} - -.btn-danger:hover { - background: var(--danger-hover); -} - -.btn-outline { - background: transparent; - color: var(--text); - border: 1px solid var(--border); - padding: 8px 16px; -} - -.btn-outline:hover { - background: var(--hover); -} - -.btn-sm { - padding: 4px 12px; - font-size: 13px; -} - -/* Auth Section */ -.auth-section { - display: flex; - align-items: center; -} - -.auth-section.search-bar-layout { - display: flex; - align-items: center; - padding: 0; - /* gap: 0; */ - width: 100%; - /* max-width: 400px; */ -} - -.auth-section.search-bar-layout .handle-input { - flex: 1; - margin: 0; - padding: 9px 15px; - font-size: 13px; - border: 1px solid var(--border); - border-radius: 4px 0 0 4px; - background: var(--background); - outline: none; - transition: border-color 0.2s; - width: 100%; - text-align: left; - color: var(--text); -} - -.auth-section.search-bar-layout .handle-input:focus { - border-color: var(--primary); -} - -.auth-section.search-bar-layout .auth-button { - border-radius: 0 4px 4px 0; - border: 1px solid var(--primary); - border-left: none; - margin: 0; - padding: 9px 15px; - min-width: 50px; - min-height: 30px; -} - -/* Auth Button */ -.auth-button { - background: var(--primary); - color: white; - border: none; - border-radius: 4px; - padding: 9px 15px; - font-weight: 700; - cursor: pointer; - transition: background 0.2s; - display: flex; - align-items: center; - justify-content: center; - min-width: 50px; - min-height: 30px; -} - -/* Loading spinner for auth button */ -.auth-button.loading i { - animation: spin 1s linear infinite; -} - -@keyframes spin { - from { transform: rotate(0deg); } - to { transform: rotate(360deg); } -} - -.auth-button:hover { - background: var(--primary-hover); -} - -.auth-button:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.main-content { - grid-area: main; - max-width: 800px; - margin: 0 auto; - padding: 0px; - width: 100%; -} - -@media (max-width: 1000px) { - .main-content { - padding: 0px !important; - margin: 0px !important; - max-width: 100% !important; - width: 100% !important; - overflow-x: hidden !important; - } -} - -/* Bluesky Footer */ -.bluesky-footer { - text-align: center; - padding: 40px 0; - color: var(--primary); - opacity: 0.3; - transition: opacity 0.3s; -} - -.bluesky-footer:hover { - opacity: 0.6; -} - -.bluesky-footer .fa-bluesky { - font-size: 20px; -} - -.content-area { - background: var(--background); -} - -/* Card Styles */ -.card { - background: var(--background); - border: 1px solid var(--border); - border-radius: 6px; - margin: 16px; - overflow: hidden; -} - -.card-header { - padding: 16px; - border-bottom: 1px solid var(--border); - font-weight: 700; - font-size: 20px; -} - -.card-content { - padding: 16px; -} - -/* Comment Form */ -.comment-form { - padding: 16px; -} - -.comment-form h3 { - font-size: 20px; - font-weight: 800; - margin-bottom: 16px; -} - -.form-group label { - display: block; - font-weight: 700; - margin-bottom: 8px; - color: var(--text); -} - -.form-input { - width: 100%; - padding: 12px; - border: 1px solid var(--border); - border-radius: 6px; - font-size: 16px; - font-family: inherit; - background: var(--background); - color: var(--text); -} - -.form-input:focus { - outline: none; - border-color: var(--primary); -} - -.form-textarea { - min-height: 120px; - resize: vertical; - font-family: inherit; -} - -.form-actions { - display: flex; - justify-content: flex-end; - margin-top: 16px; -} - -/* Tab Navigation */ -.tab-header { - display: flex; - background: var(--background); - overflow-x: auto; -} - -.tab-btn { - background: none; - border: none; - padding: 16px 20px; - font-size: 15px; - font-weight: 700; - color: var(--text-secondary); - cursor: pointer; - border-bottom: 2px solid transparent; - transition: color 0.2s; - white-space: nowrap; -} - -.tab-btn:hover { - color: var(--text); - background: var(--hover); -} - -.tab-btn.active { - color: var(--primary); - border-bottom-color: var(--primary); -} - -/* Record List */ -.record-item { - border: 1px solid var(--border); - border-radius: 0; - padding: 16px; - transition: background 0.2s, border-color 0.2s; - position: relative; - margin-bottom: -1px; /* Overlap borders */ -} - -.record-item:first-child { - border-top-left-radius: 12px; - border-top-right-radius: 12px; -} - -.record-item:last-child { - border-bottom-left-radius: 12px; - border-bottom-right-radius: 12px; - margin-bottom: 0; -} - -.record-item:hover { - background: var(--background-secondary); - border-color: var(--border-dark); - z-index: 1; /* Bring to front when hovering */ -} - -.record-header { - display: flex; - align-items: flex-start; - gap: 12px; - margin-bottom: 12px; -} - -.avatar { - width: 40px; - height: 40px; - border-radius: 50%; - object-fit: cover; - flex-shrink: 0; -} - -.user-info { - flex: 1; - min-width: 0; -} - -.display-name { - font-weight: 700; - color: var(--text); - font-size: 15px; -} - -.handle { - color: var(--text-secondary); - font-size: 15px; -} - -.handle-link { - color: var(--text-secondary); - text-decoration: none; -} - -.handle-link:hover { - color: var(--primary); - text-decoration: underline; -} - -.timestamp { - color: var(--text-secondary); - font-size: 13px; - margin-top: 4px; -} - -.record-actions { - display: flex; - gap: 8px; - align-items: center; -} - -.record-content { - font-size: 15px; - line-height: 1.5; - color: var(--text); - margin-bottom: 12px; - white-space: pre-wrap; - word-wrap: break-word; -} - -.record-meta { - display: flex; - align-items: center; - gap: 16px; - margin-top: 12px; -} - -.record-url { - color: var(--primary); - text-decoration: none; - font-size: 13px; -} - -.record-url:hover { - text-decoration: underline; -} - -/* JSON Display */ -.json-display { - margin-top: 12px; - border: 1px solid var(--border); - border-radius: 6px; - overflow: hidden; -} - -.json-header { - background: var(--background-secondary); - padding: 8px 12px; - font-size: 13px; - font-weight: 700; - color: var(--text-secondary); -} - -.json-content { - background: #f8f9fa; - padding: 12px; - font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace; - font-size: 12px; - line-height: 1.4; - overflow-x: auto; - white-space: pre-wrap; - word-wrap: break-word; - word-break: break-word; - max-height: 300px; - overflow-y: auto; - color: var(--text); -} - -/* Ask AI */ -.ask-ai-container { - border: 1px solid var(--border); - border-radius: 6px; - overflow: hidden; - background: var(--background); -} - -.ask-ai-header { - padding: 16px; - border-bottom: 1px solid var(--border); - background: var(--background-secondary); - display: flex; - justify-content: space-between; - align-items: center; -} - -.ask-ai-header h3 { - font-size: 20px; - font-weight: 800; -} - -.chat-container { - height: 400px; - overflow-y: auto; - padding: 16px; -} - -.chat-message { - margin-bottom: 16px; -} - -/* -.user-message { margin-left: 40px; } -.ai-message { margin-right: 40px; } -*/ - -.message-header { - display: flex; - align-items: center; - gap: 8px; - margin-bottom: 8px; -} - -.message-content { - background: var(--background-secondary); - padding: 12px 16px; - border-radius: 6px; - font-size: 15px; - line-height: 1.4; -} - -.user-message .message-content { - color: #000; -} - -.question-form { - padding: 16px; - border-top: 1px solid var(--border); - background: var(--background); -} - -.input-container { - display: flex; - gap: 8px; - align-items: flex-end; -} - -.question-input { - flex: 1; - border: 1px solid var(--border); - border-radius: 6px; - padding: 12px 16px; - font-size: 16px; - resize: none; - font-family: inherit; - background: var(--background); -} - -.question-input:focus { - outline: none; - border-color: var(--primary); -} - -.send-btn { - background: var(--primary); - color: white; - border: none; - border-radius: 6px; - width: 36px; - height: 36px; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - font-size: 16px; -} - -.send-btn:hover:not(:disabled) { - background: var(--primary-hover); -} - -.send-btn:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -/* Test UI */ -.test-ui { - border: 2px solid var(--danger); - border-radius: 6px; - margin: 16px; - background: #fff5f7; -} - -.test-ui h2 { - color: var(--danger); - padding: 16px; - border-bottom: 1px solid var(--border); - margin: 0; -} - -.test-ui .card-content { - padding: 16px; -} - -/* Loading Skeleton */ -.loading-skeleton { - animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; -} - -.skeleton-line { - background: var(--background-secondary); - border-radius: 4px; - margin-bottom: 8px; -} - -@keyframes pulse { - 0%, 100% { - opacity: 1; - } - 50% { - opacity: 0.5; - } -} - -/* Error States */ -.error-message { - background: #fef2f2; - border: 1px solid #fecaca; - color: #991b1b; - padding: 12px 16px; - border-radius: 6px; - margin: 16px 0; -} - -.success-message { - background: #f0fdf4; - border: 1px solid #bbf7d0; - color: #166534; - padding: 12px 16px; - border-radius: 6px; - margin: 16px 0; -} - -/* Auth Notice */ -.auth-notice { - text-align: center; - color: var(--text-secondary); - font-size: 14px; - margin-top: 8px; -} - -/* Page Info */ -.page-info { - padding: 8px 16px; - background: var(--background-secondary); - font-size: 12px; - color: var(--text-secondary); - text-align: center; -} - -.bottom-actions { - padding: 20px; - text-align: center; - margin-top: 20px; -} - -.test-section { - margin-top: 20px; -} - -/* Responsive */ -@media (max-width: 1000px) { - /* Global mobile constraints */ - * { - max-width: 100% !important; - box-sizing: border-box !important; - } - - body { - overflow-x: hidden !important; - width: 100% !important; - margin: 0 !important; - padding: 0 !important; - } - - .app { - width: 100% !important; - max-width: 100% !important; - overflow-x: hidden !important; - padding: 0 !important; - margin: 0 !important; - } - - /* OAuth app mobile fixes - prevent overflow and content issues */ - .oauth-app-header { - padding: 0px !important; - margin: 0px !important; - border: none !important; - width: 100% !important; - max-width: 100% !important; - } - - .oauth-header-content { - max-width: 100% !important; - width: 100% !important; - padding: 10px 0px !important; - margin: 0px !important; - overflow-x: hidden !important; - } - - .oauth-header-actions { - width: auto !important; - max-width: 100% !important; - overflow: hidden !important; - } - - .content-area { - padding: 0px !important; - margin: 0px !important; - width: 100% !important; - max-width: 100% !important; - overflow-x: hidden !important; - } - - .card { - margin: 0px !important; - border-radius: 0px !important; - border-left: none !important; - border-right: none !important; - max-width: 100% !important; - } - - .card-content { - padding: 15px !important; - } - - .comment-form { - padding: 15px !important; - } - - .record-item { - padding: 15px !important; - margin: 0px !important; - border-radius: 0 !important; - border-left: none !important; - border-right: none !important; - } - - .record-item:first-child { - border-top: 1px solid var(--border) !important; - } - - .record-content { - word-wrap: break-word !important; - overflow-wrap: break-word !important; - max-width: 100% !important; - } - - .record-meta { - word-break: break-all !important; - overflow-wrap: break-word !important; - flex-wrap: wrap !important; - } - - .record-url { - word-break: break-all !important; - max-width: 100% !important; - } - - .form-input, .form-textarea { - width: 100% !important; - max-width: 100% !important; - box-sizing: border-box !important; - padding: 12px !important; - } - - .auth-section { - padding: 0px !important; - max-width: 100% !important; - overflow: hidden !important; - } - - .auth-section.search-bar-layout { - width: 100% !important; - max-width: 100% !important; - } - - .auth-section.search-bar-layout .handle-input { - max-width: calc(100% - 80px) !important; - width: calc(100% - 80px) !important; - } - - .auth-button { - white-space: nowrap !important; - min-width: 90px !important; - width: 90px !important; - } - - .tab-header { - overflow-x: auto !important; - -webkit-overflow-scrolling: touch !important; - width: 100% !important; - display: flex !important; - scrollbar-width: none !important; /* Firefox */ - -ms-overflow-style: none !important; /* IE/Edge */ - } - - .tab-header::-webkit-scrollbar { - display: none !important; /* Chrome/Safari */ - } - - .tab-btn { - white-space: nowrap !important; - min-width: auto !important; - padding: 12px 16px !important; - flex-shrink: 0 !important; - font-size: 13px !important; - } - - .json-content { - font-size: 10px !important; - padding: 8px !important; - overflow-x: auto !important; - -webkit-overflow-scrolling: touch !important; - white-space: pre-wrap !important; - word-wrap: break-word !important; - word-break: break-word !important; - } - - .ask-ai-container { - margin: 0px !important; - border-radius: 0px !important; - border-left: none !important; - border-right: none !important; - } - - .chat-container { - height: 250px !important; - padding: 12px !important; - } - - .question-form { - padding: 12px !important; - } - - .input-container { - flex-direction: column !important; - gap: 12px !important; - } - - .question-input { - width: 100% !important; - box-sizing: border-box !important; - } - - .send-btn { - width: 100% !important; - height: 44px !important; - } - - .oauth-user-profile { - gap: 8px; - width: 100% !important; - max-width: 100% !important; - overflow: hidden !important; - } - - .profile-info { - flex: 1 !important; - min-width: 0 !important; - max-width: calc(100% - 50px) !important; - overflow: hidden !important; - } - - .profile-avatar-section .profile-avatar, - .profile-avatar-fallback { - width: 36px; - height: 36px; - font-size: 14px; - flex-shrink: 0 !important; - } - - .profile-display-name { - font-size: 14px; - overflow: hidden !important; - text-overflow: ellipsis !important; - white-space: nowrap !important; - max-width: 100% !important; - } - - .profile-handle { - font-size: 12px; - overflow: hidden !important; - text-overflow: ellipsis !important; - white-space: nowrap !important; - max-width: 100% !important; - } - - .profile-did { - font-size: 9px; - overflow: hidden !important; - text-overflow: ellipsis !important; - white-space: nowrap !important; - max-width: 100% !important; - } - - .oauth-header-content { - flex-direction: column; - gap: 12px; - /* align-items: flex-start; */ - } - - .oauth-header-actions { - width: 100%; - justify-content: center; - } - article.article-content { - max-width: 100%; - } - -} - -/* Avatar Styles */ -.avatar { - width: 40px; - height: 40px; - border-radius: 50%; - object-fit: cover; - flex-shrink: 0; - border: 1px solid var(--border); -} - -.avatar-loading { - background: var(--background-secondary); - border-radius: 50%; - position: relative; - overflow: hidden; -} - -.avatar-loading::after { - content: ''; - position: absolute; - top: 0; - left: -100%; - width: 100%; - height: 100%; - background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4), transparent); - animation: loading-shimmer 1.5s infinite; -} - -@keyframes loading-shimmer { - 0% { left: -100%; } - 100% { left: 100%; } -} - -.avatar-fallback { - background: var(--background-secondary); - color: var(--text-secondary); - font-weight: 600; - border: 1px solid var(--border); -} - -/* Avatar with Card */ -.avatar-container { - position: relative; - display: inline-block; -} - -.avatar-card { - position: absolute; - top: 100%; - left: 50%; - transform: translateX(-50%); - background: var(--background); - border: 1px solid var(--border); - border-radius: 6px; - padding: 16px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); - z-index: 1000; - min-width: 200px; - margin-top: 8px; -} - -.avatar-card::before { - content: ''; - position: absolute; - top: -8px; - left: 50%; - transform: translateX(-50%); - width: 0; - height: 0; - border-left: 8px solid transparent; - border-right: 8px solid transparent; - border-bottom: 8px solid var(--border); -} - -.avatar-card::after { - content: ''; - position: absolute; - top: -7px; - left: 50%; - transform: translateX(-50%); - width: 0; - height: 0; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-bottom: 7px solid var(--background); -} - -.avatar-card-image { - display: block; - margin: 0 auto 12px; -} - -.avatar-card-info { - text-align: center; -} - -.avatar-card-name { - font-weight: 700; - font-size: 16px; - margin-bottom: 4px; - color: var(--text); -} - -.avatar-card-handle { - color: var(--text-secondary); - text-decoration: none; - font-size: 14px; -} - -.avatar-card-handle:hover { - color: var(--primary); - text-decoration: underline; -} - -/* Avatar List */ -.avatar-list { - display: flex; - align-items: center; -} - -.avatar-list-item { - border: 2px solid var(--background); - border-radius: 50%; - overflow: hidden; -} - -.avatar-list-more { - border: 2px solid var(--background); - font-weight: 600; - font-size: 12px; -} - -/* Avatar Test Styles */ -.avatar-test-container { - margin: 16px; -} - -.test-section { - margin-bottom: 32px; - padding-bottom: 24px; - border-bottom: 1px solid var(--border); -} - -.test-section:last-child { - border-bottom: none; -} - -.test-section h3 { - margin-bottom: 16px; - color: var(--text); - font-size: 18px; - font-weight: 700; -} - -.avatar-examples { - display: flex; - gap: 24px; - align-items: center; - flex-wrap: wrap; -} - -.avatar-example { - text-align: center; -} - -.avatar-example h4 { - margin-bottom: 8px; - font-size: 14px; - color: var(--text-secondary); - font-weight: 600; -} - -.test-controls { - display: flex; - gap: 12px; - flex-wrap: wrap; -} - -/* Utilities */ -.hidden { - display: none; -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border: 0; -} - -/* Chat Conversation Styles */ -.chat-conversation { - margin-bottom: 32px; -} - -.chat-message.comment-style { - background: var(--background); - border: 1px solid var(--border); - border-radius: 6px; - padding: 16px; - margin-bottom: 12px; -} - -.chat-message.user-message.comment-style { - border-left: 4px solid var(--primary); -} - -.chat-message.ai-message.comment-style { - border-left: 4px solid #ffdd00; - background: #faf8ff; -} - -.message-header { - display: flex; - align-items: center; - gap: 12px; - margin-bottom: 12px; -} - -.message-header .avatar { - width: 40px; - height: 40px; - border-radius: 50%; - background: var(--background-secondary); - display: flex; - align-items: center; - justify-content: center; - font-size: 16px; - border: 1px solid var(--border); - flex-shrink: 0; -} - -.message-header .user-info { - flex: 1; -} - -.message-header .display-name { - font-weight: 600; - color: var(--text); - font-size: 15px; -} - -.message-header .handle { - color: var(--text-secondary); - font-size: 13px; -} - -.message-header .timestamp { - color: var(--text-secondary); - font-size: 12px; - margin-top: 2px; -} - -.message-content { - color: var(--text); - line-height: 1.5; - word-wrap: anywhere; -} - -/* Markdown styles */ -.message-content h1, -.message-content h2, -.message-content h3, -.message-content h4, -.message-content h5, -.message-content h6 { - margin: 16px 0 8px 0; - font-weight: 600; -} - -.message-content h1 { font-size: 1.5em; } -.message-content h2 { font-size: 1.3em; } -.message-content h3 { font-size: 1.1em; } - -.message-content p { - margin: 8px 0; -} - -.message-content pre { - background: var(--background-secondary); - border: 1px solid var(--border); - border-radius: 6px; - padding: 12px; - margin: 12px 0; - overflow-x: auto; -} - -.message-content code { - background: var(--background-secondary); - padding: 2px 4px; - border-radius: 3px; - font-family: 'Consolas', 'Monaco', 'Andale Mono', 'Ubuntu Mono', monospace; - font-size: 0.9em; -} - -.message-content pre code { - background: transparent; - padding: 0; - border-radius: 0; - font-size: 0.9em; -} - -.message-content ul, -.message-content ol { - margin: 8px 0; - padding-left: 24px; -} - -.message-content li { - margin: 4px 0; -} - -.message-content blockquote { - border-left: 4px solid var(--border); - padding-left: 16px; - margin: 12px 0; - color: var(--text-secondary); -} - -.message-content table { - border-collapse: collapse; - width: 100%; - margin: 12px 0; -} - -.message-content th, -.message-content td { - border: 1px solid var(--border); - padding: 8px 12px; - text-align: left; -} - -.message-content th { - background: var(--background-secondary); - font-weight: 600; -} - -.message-content a { - color: var(--primary); - text-decoration: none; -} - -.message-content a:hover { - text-decoration: underline; -} - -.message-content hr { - border: none; - border-top: 1px solid var(--border); - margin: 16px 0; -} - -.record-actions { - flex-shrink: 0; -} - -.bluesky-footer { - text-align: center; - padding: 20px; - color: var(--primary); - font-size: 24px; -} - -.bluesky-footer i { - transition: color 0.2s ease; -} - -.bluesky-footer i:hover { - color: var(--primary-hover); -} - -/* Custom code block styling */ -.message-content pre { - background: #2d3748 !important; - border: 1px solid #4a5568 !important; - border-radius: 6px; - padding: 12px; - margin: 12px 0; - overflow-x: auto; -} - -.message-content pre code { - background: transparent !important; - color: #e2e8f0 !important; - font-family: 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', monospace; - font-size: 14px; - line-height: 1.5; -} - -.message-content code { - background: #2d3748 !important; - color: #e2e8f0 !important; - padding: 2px 4px; - border-radius: 3px; - font-family: 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', monospace; - font-size: 14px; -} diff --git a/oauth/src/App.jsx b/oauth/src/App.jsx deleted file mode 100644 index 04c493a..0000000 --- a/oauth/src/App.jsx +++ /dev/null @@ -1,493 +0,0 @@ -import React, { useState, useEffect } from 'react' -import { atproto } from './api/atproto.js' -import { useAuth } from './hooks/useAuth.js' -import { useAdminData } from './hooks/useAdminData.js' -import { useUserData } from './hooks/useUserData.js' -import { usePageContext } from './hooks/usePageContext.js' -import AuthButton from './components/AuthButton.jsx' -import RecordTabs from './components/RecordTabs.jsx' -import CommentForm from './components/CommentForm.jsx' -import ProfileForm from './components/ProfileForm.jsx' -import AskAI from './components/AskAI.jsx' -import TestUI from './components/TestUI.jsx' -import OAuthCallback from './components/OAuthCallback.jsx' - -export default function App() { - const { user, agent, loading: authLoading, login, logout } = useAuth() - const { adminData, langRecords, commentRecords, chatRecords: adminChatRecords, chatHasMore, loading: dataLoading, error, refresh: refreshAdminData, loadMoreChat } = useAdminData() - const { userComments, chatRecords, loading: userLoading, refresh: refreshUserData } = useUserData(adminData) - const [userChatRecords, setUserChatRecords] = useState([]) - const [userChatLoading, setUserChatLoading] = useState(false) - const pageContext = usePageContext() - const [showAskAI, setShowAskAI] = useState(false) - const [showTestUI, setShowTestUI] = useState(false) - - // Check if current page has matching chat records (AI posts always have chat records) - const isAiPost = !pageContext.isTopPage && Array.isArray(adminChatRecords) && adminChatRecords.some(chatPair => { - const recordUrl = chatPair.question?.value?.post?.url - if (!recordUrl) return false - - try { - const recordRkey = new URL(recordUrl).pathname.split('/').pop()?.replace(/\.html$/, '') - return recordRkey === pageContext.rkey - } catch { - return false - } - }) - - // Environment-based feature flags - const ENABLE_TEST_UI = import.meta.env.VITE_ENABLE_TEST_UI === 'true' - const ENABLE_DEBUG = import.meta.env.VITE_ENABLE_DEBUG === 'true' - - // Fetch user's own chat records - const fetchUserChatRecords = async () => { - if (!user || !agent) return - - setUserChatLoading(true) - try { - const records = await agent.api.com.atproto.repo.listRecords({ - repo: user.did, - collection: 'ai.syui.log.chat', - limit: 100 - }) - - // Group questions and answers together - const chatPairs = [] - const recordMap = new Map() - - // First pass: organize records by base rkey - records.data.records.forEach(record => { - const rkey = record.uri.split('/').pop() - const baseRkey = rkey.replace('-answer', '') - - if (!recordMap.has(baseRkey)) { - recordMap.set(baseRkey, { question: null, answer: null }) - } - - if (record.value.type === 'question') { - recordMap.get(baseRkey).question = record - } else if (record.value.type === 'answer') { - recordMap.get(baseRkey).answer = record - } - }) - - // Second pass: create chat pairs - recordMap.forEach((pair, rkey) => { - if (pair.question) { - chatPairs.push({ - rkey, - question: pair.question, - answer: pair.answer, - createdAt: pair.question.value.createdAt - }) - } - }) - - // Sort by creation time (oldest first) - for chronological conversation flow - chatPairs.sort((a, b) => new Date(a.createdAt) - new Date(b.createdAt)) - - setUserChatRecords(chatPairs) - } catch (error) { - // Silently fail - no error logging - setUserChatRecords([]) - } finally { - setUserChatLoading(false) - } - } - - // Fetch user chat records when user/agent changes - useEffect(() => { - fetchUserChatRecords() - }, [user, agent]) - - // Expose AI profile data to blog's ask-ai.js - useEffect(() => { - if (adminData?.profile) { - // Make AI profile data available globally for ask-ai.js - window.aiProfileData = { - did: adminData.did, - handle: adminData.profile.handle, - displayName: adminData.profile.displayName, - avatar: adminData.profile.avatar - } - - // Dispatch event to notify ask-ai.js - window.dispatchEvent(new CustomEvent('aiProfileLoaded', { - detail: window.aiProfileData - })) - } - }, [adminData]) - - // Expose current user and agent for game page - useEffect(() => { - if (user && agent) { - window.currentUser = user - window.currentAgent = agent - } - }, [user, agent]) - - // Event listeners for blog communication - useEffect(() => { - // Clear OAuth completion flag once app is loaded - if (sessionStorage.getItem('oauth_just_completed') === 'true') { - setTimeout(() => { - sessionStorage.removeItem('oauth_just_completed') - }, 1000) - } - - const handleAIQuestion = async (event) => { - const { question } = event.detail - if (question && adminData && user && agent) { - try { - - // AI่จญๅฎš - const aiConfig = { - host: import.meta.env.VITE_AI_HOST || 'https://ollama.syui.ai', - model: import.meta.env.VITE_AI_MODEL || 'gemma3:1b', - systemPrompt: import.meta.env.VITE_AI_SYSTEM_PROMPT || 'ใ‚ใชใŸใฏ6ๆญณใฎๅฅณใฎๅญใ‚ขใ‚คใงใ™ใ€‚ๆ˜Žใ‚‹ใๅ…ƒๆฐ—ใงใ€ใกใ‚‡ใฃใจใŠใฃใกใ‚‡ใ“ใกใ‚‡ใ„ใ€‚่‡ชๅˆ†ใฎใ“ใจใฏใ€Œใ‚ขใ‚คใ€ใฃใฆๅ‘ผใณใพใ™ใ€‚' - } - - const prompt = `${aiConfig.systemPrompt} - -Question: ${question} - -Answer:` - - // Ollamaใซ็›ดๆŽฅใƒชใ‚ฏใ‚จใ‚นใƒˆ - const controller = new AbortController() - const timeoutId = setTimeout(() => controller.abort(), 30000) - - const response = await fetch(`${aiConfig.host}/api/generate`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Origin': 'https://syui.ai', - }, - body: JSON.stringify({ - model: aiConfig.model, - prompt: prompt, - stream: false, - options: { - temperature: 0.9, - top_p: 0.9, - num_predict: 200, - repeat_penalty: 1.1, - } - }), - signal: controller.signal - }) - - clearTimeout(timeoutId) - - if (!response.ok) { - throw new Error(`Ollama API error: ${response.status}`) - } - - const data = await response.json() - const answer = data.response || 'ใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใพใ—ใŸ' - - // Save conversation to ATProto - try { - const now = new Date() - const timestamp = now.toISOString() - const rkey = timestamp.replace(/[:.]/g, '-') - - // Extract post metadata from current page - const currentUrl = window.location.href - const postSlug = currentUrl.match(/\/posts\/([^/]+)/)?.[1] || '' - const postTitle = document.title.replace(' - syui.ai', '') || '' - - // 1. Save question record - const questionRecord = { - $type: 'ai.syui.log.chat', - post: { - url: currentUrl, - slug: postSlug, - title: postTitle, - date: timestamp, - tags: [], - language: "ja" - }, - type: "question", - text: question, - author: { - did: user.did, - handle: user.handle, - displayName: user.displayName || user.handle, - avatar: user.avatar - }, - createdAt: timestamp - } - - await agent.api.com.atproto.repo.putRecord({ - repo: user.did, - collection: 'ai.syui.log.chat', - rkey: rkey, - record: questionRecord - }) - - // 2. Save answer record - const answerRkey = rkey + '-answer' - const answerRecord = { - $type: 'ai.syui.log.chat', - post: { - url: currentUrl, - slug: postSlug, - title: postTitle, - date: timestamp, - tags: [], - language: "ja" - }, - type: "answer", - text: answer, - author: { - did: adminData.did, - handle: adminData.profile?.handle, - displayName: adminData.profile?.displayName, - avatar: adminData.profile?.avatar - }, - createdAt: timestamp - } - - await agent.api.com.atproto.repo.putRecord({ - repo: user.did, - collection: 'ai.syui.log.chat', - rkey: answerRkey, - record: answerRecord - }) - - - // Refresh chat records after saving - setTimeout(() => { - fetchUserChatRecords() - }, 1000) - } catch (saveError) { - // Silently fail - no error logging - } - - // Send response to blog - window.dispatchEvent(new CustomEvent('aiResponseReceived', { - detail: { - question: question, - answer: answer, - timestamp: new Date().toISOString(), - aiProfile: adminData?.profile ? { - did: adminData.did, - handle: adminData.profile.handle, - displayName: adminData.profile.displayName, - avatar: adminData.profile.avatar - } : null - } - })) - - } catch (error) { - // Silently fail - send error response to blog without logging - window.dispatchEvent(new CustomEvent('aiResponseReceived', { - detail: { - question: question, - answer: 'ใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใพใ—ใŸใ€‚ใ‚‚ใ†ไธ€ๅบฆใŠ่ฉฆใ—ใใ ใ•ใ„ใ€‚', - timestamp: new Date().toISOString(), - aiProfile: adminData?.profile ? { - did: adminData.did, - handle: adminData.profile.handle, - displayName: adminData.profile.displayName, - avatar: adminData.profile.avatar - } : null - } - })) - } - } - } - - const dispatchAIProfileLoaded = () => { - if (adminData?.profile) { - window.dispatchEvent(new CustomEvent('aiProfileLoaded', { - detail: { - did: adminData.did, - handle: adminData.profile.handle, - displayName: adminData.profile.displayName, - avatar: adminData.profile.avatar - } - })) - } - } - - // Listen for questions from blog - window.addEventListener('postAIQuestion', handleAIQuestion) - - // Dispatch AI profile when adminData is available - if (adminData?.profile) { - dispatchAIProfileLoaded() - } - - return () => { - window.removeEventListener('postAIQuestion', handleAIQuestion) - } - }, [adminData, user, agent]) - - // Handle OAuth callback - if (window.location.search.includes('code=')) { - return - } - - const isLoading = authLoading || dataLoading || userLoading - - // Don't show loading if we just completed OAuth callback - const isOAuthReturn = window.location.pathname === '/oauth/callback' || - sessionStorage.getItem('oauth_just_completed') === 'true' - - if (isLoading && !isOAuthReturn) { - return ( -
-
-

่ชญใฟ่พผใฟไธญ...

- - -
- ) - } - - if (error) { - // Silently hide component on error - no error display - return null - } - - return ( -
- {!isAiPost && ( -
-
- {user && ( -
-
- {user.avatar ? ( - {user.displayName - ) : ( -
- {(user.displayName || user.handle || '?').charAt(0).toUpperCase()} -
- )} -
-
-
- {user.displayName || user.handle} -
-
- @{user.handle} -
-
- {user.did} -
-
-
- )} -
- -
-
-
- )} - -
-
- - {user && ( -
- { - refreshAdminData?.() - refreshUserData?.() - }} - /> -
- )} - - {user && ( -
- { - refreshAdminData?.() - refreshUserData?.() - }} - /> -
- )} - - { - refreshAdminData?.() - refreshUserData?.() - fetchUserChatRecords?.() - }} - /> - - {ENABLE_TEST_UI && showTestUI && ( -
- -
- )} - - {ENABLE_TEST_UI && ( -
- -
- )} - -
-
-
- ) -} \ No newline at end of file diff --git a/oauth/src/api/atproto.js b/oauth/src/api/atproto.js deleted file mode 100644 index 980d175..0000000 --- a/oauth/src/api/atproto.js +++ /dev/null @@ -1,310 +0,0 @@ -// ATProto API client -import { ATProtoError } from '../utils/errorHandler.js' - -const ENDPOINTS = { - describeRepo: 'com.atproto.repo.describeRepo', - getProfile: 'app.bsky.actor.getProfile', - listRecords: 'com.atproto.repo.listRecords', - putRecord: 'com.atproto.repo.putRecord' -} - -async function request(url, options = {}) { - try { - const controller = new AbortController() - const timeoutId = setTimeout(() => controller.abort(), 15000) // 15็ง’ใ‚ฟใ‚คใƒ ใ‚ขใ‚ฆใƒˆ - - const response = await fetch(url, { - ...options, - signal: controller.signal - }) - - clearTimeout(timeoutId) - - if (!response.ok) { - throw new ATProtoError( - `Request failed: ${response.statusText}`, - response.status, - { url, method: options.method || 'GET' } - ) - } - - return await response.json() - } catch (error) { - if (error.name === 'AbortError') { - const timeoutError = new ATProtoError( - 'ใƒชใ‚ฏใ‚จใ‚นใƒˆใŒใ‚ฟใ‚คใƒ ใ‚ขใ‚ฆใƒˆใ—ใพใ—ใŸ', - 408, - { url } - ) - throw timeoutError - } - - if (error instanceof ATProtoError) { - throw error - } - - // ใƒใƒƒใƒˆใƒฏใƒผใ‚ฏใ‚จใƒฉใƒผใชใฉ - const networkError = new ATProtoError( - 'ใƒใƒƒใƒˆใƒฏใƒผใ‚ฏใ‚จใƒฉใƒผใŒ็™บ็”Ÿใ—ใพใ—ใŸ', - 0, - { url, originalError: error.message } - ) - throw networkError - } -} - -export const atproto = { - async getDid(pds, handle) { - const endpoint = pds.startsWith('http') ? pds : `https://${pds}` - const res = await request(`${endpoint}/xrpc/${ENDPOINTS.describeRepo}?repo=${handle}`) - return res.did - }, - - async getProfile(bsky, actor) { - // Skip test DIDs - if (actor && actor.includes('test-')) { - return { - did: actor, - handle: 'test.user', - displayName: 'Test User', - avatar: null - } - } - - // Check if endpoint supports getProfile - let apiEndpoint = bsky - - // Allow public.api.bsky.app and bsky.syu.is, redirect other PDS endpoints - if (!bsky.includes('public.api.bsky.app') && !bsky.includes('bsky.syu.is')) { - // If it's a PDS endpoint that doesn't support getProfile, redirect to public API - apiEndpoint = 'https://public.api.bsky.app' - } - - return await request(`${apiEndpoint}/xrpc/${ENDPOINTS.getProfile}?actor=${actor}`) - }, - - async getRecords(pds, repo, collection, limit = 10, cursor = null) { - let url = `${pds}/xrpc/${ENDPOINTS.listRecords}?repo=${repo}&collection=${collection}&limit=${limit}` - if (cursor) { - url += `&cursor=${cursor}` - } - const res = await request(url) - return { - records: res.records || [], - cursor: res.cursor || null - } - }, - - async searchPlc(plc, did) { - try { - const data = await request(`${plc}/${did}`) - return { - success: true, - endpoint: data?.service?.[0]?.serviceEndpoint || null, - handle: data?.alsoKnownAs?.[0]?.replace('at://', '') || null - } - } catch { - return { success: false, endpoint: null, handle: null } - } - }, - - async putRecord(pds, record, agent) { - if (!agent) { - throw new Error('Agent required for putRecord') - } - - // Use Agent's putRecord method instead of direct fetch - return await agent.com.atproto.repo.putRecord(record) - }, - - // Find all records for a specific post by paginating through all records - async findRecordsForPost(pds, repo, collection, targetRkey) { - let cursor = null - let allMatchingRecords = [] - let pageCount = 0 - const maxPages = 50 // Safety limit to prevent infinite loops - - do { - pageCount++ - if (pageCount > maxPages) { - console.warn(`Reached max pages (${maxPages}) while searching for ${targetRkey}`) - break - } - - const result = await this.getRecords(pds, repo, collection, 100, cursor) - - // Filter records that match the target post - const matchingRecords = result.records.filter(record => { - const postUrl = record.value?.post?.url - if (!postUrl) return false - - try { - // Extract rkey from URL - const recordRkey = new URL(postUrl).pathname.split('/').pop()?.replace(/\.html$/, '') - return recordRkey === targetRkey - } catch { - return false - } - }) - - allMatchingRecords.push(...matchingRecords) - cursor = result.cursor - - // Optional: Stop early if we found some records (uncomment if desired) - // if (allMatchingRecords.length > 0) break - - } while (cursor) - - console.log(`Found ${allMatchingRecords.length} records for ${targetRkey} after searching ${pageCount} pages`) - return allMatchingRecords - } -} - -import { dataCache } from '../utils/cache.js' - -// Collection specific methods -export const collections = { - async getBase(pds, repo, collection, limit = 10) { - const cacheKey = dataCache.generateKey('base', pds, repo, collection, limit) - const cached = dataCache.get(cacheKey) - if (cached) return cached - - const data = await atproto.getRecords(pds, repo, collection, limit) - // Extract records array for backward compatibility - const records = data.records || data - dataCache.set(cacheKey, records) - return records - }, - - async getLang(pds, repo, collection, limit = 10) { - const cacheKey = dataCache.generateKey('lang', pds, repo, collection, limit) - const cached = dataCache.get(cacheKey) - if (cached) return cached - - const data = await atproto.getRecords(pds, repo, `${collection}.chat.lang`, limit) - // Extract records array for backward compatibility - const records = data.records || data - dataCache.set(cacheKey, records) - return records - }, - - async getComment(pds, repo, collection, limit = 10) { - const cacheKey = dataCache.generateKey('comment', pds, repo, collection, limit) - const cached = dataCache.get(cacheKey) - if (cached) return cached - - const data = await atproto.getRecords(pds, repo, `${collection}.chat.comment`, limit) - // Extract records array for backward compatibility - const records = data.records || data - dataCache.set(cacheKey, records) - return records - }, - - async getChat(pds, repo, collection, limit = 10, cursor = null) { - // Don't use cache for pagination requests - if (cursor) { - const result = await atproto.getRecords(pds, repo, `${collection}.chat`, limit, cursor) - return result - } - - const cacheKey = dataCache.generateKey('chat', pds, repo, collection, limit) - const cached = dataCache.get(cacheKey) - if (cached) { - // Ensure cached data has the correct structure - return Array.isArray(cached) ? { records: cached, cursor: null } : cached - } - - const data = await atproto.getRecords(pds, repo, `${collection}.chat`, limit) - // Cache only the records array for backward compatibility - dataCache.set(cacheKey, data.records || data) - return data - }, - - async getUserList(pds, repo, collection, limit = 100) { - const cacheKey = dataCache.generateKey('userlist', pds, repo, collection, limit) - const cached = dataCache.get(cacheKey) - if (cached) return cached - - const data = await atproto.getRecords(pds, repo, `${collection}.user`, limit) - // Extract records array for backward compatibility - const records = data.records || data - dataCache.set(cacheKey, records) - return records - }, - - async getUserComments(pds, repo, collection, limit = 10) { - const cacheKey = dataCache.generateKey('usercomments', pds, repo, collection, limit) - const cached = dataCache.get(cacheKey) - if (cached) return cached - - const data = await atproto.getRecords(pds, repo, collection, limit) - // Extract records array for backward compatibility - const records = data.records || data - dataCache.set(cacheKey, records) - return records - }, - - async getProfiles(pds, repo, collection, limit = 100) { - const cacheKey = dataCache.generateKey('profiles', pds, repo, collection, limit) - const cached = dataCache.get(cacheKey) - if (cached) return cached - - const data = await atproto.getRecords(pds, repo, `${collection}.profile`, limit) - // Extract records array for backward compatibility - const records = data.records || data - dataCache.set(cacheKey, records) - return records - }, - - // Find chat records for a specific post using pagination - async getChatForPost(pds, repo, collection, targetRkey) { - const cacheKey = dataCache.generateKey('chatForPost', pds, repo, collection, targetRkey) - const cached = dataCache.get(cacheKey) - if (cached) return cached - - const records = await atproto.findRecordsForPost(pds, repo, `${collection}.chat`, targetRkey) - - // Process into chat pairs like the original getChat function - const chatPairs = [] - const recordMap = new Map() - - // First pass: organize records by base rkey - records.forEach(record => { - const rkey = record.uri.split('/').pop() - const baseRkey = rkey.replace('-answer', '') - - if (!recordMap.has(baseRkey)) { - recordMap.set(baseRkey, { question: null, answer: null }) - } - - if (record.value.type === 'question') { - recordMap.get(baseRkey).question = record - } else if (record.value.type === 'answer') { - recordMap.get(baseRkey).answer = record - } - }) - - // Second pass: create chat pairs - recordMap.forEach((pair, rkey) => { - if (pair.question) { - chatPairs.push({ - rkey, - question: pair.question, - answer: pair.answer, - createdAt: pair.question.value.createdAt - }) - } - }) - - // Sort by creation time (oldest first) - for chronological conversation flow - chatPairs.sort((a, b) => new Date(a.createdAt) - new Date(b.createdAt)) - - dataCache.set(cacheKey, chatPairs) - return chatPairs - }, - - // ๆŠ•็จฟๅพŒใซใ‚ญใƒฃใƒƒใ‚ทใƒฅใ‚’็„กๅŠนๅŒ– - invalidateCache(collection) { - dataCache.invalidatePattern(collection) - } -} \ No newline at end of file diff --git a/oauth/src/components/AskAI.jsx b/oauth/src/components/AskAI.jsx deleted file mode 100644 index 76deb6a..0000000 --- a/oauth/src/components/AskAI.jsx +++ /dev/null @@ -1,399 +0,0 @@ -import React, { useState, useEffect, useRef } from 'react' -import { useAskAI } from '../hooks/useAskAI.js' -import LoadingSkeleton from './LoadingSkeleton.jsx' - -export default function AskAI({ adminData, user, agent, onClose }) { - const { askQuestion, loading, error, chatHistory, clearChatHistory, loadChatHistory } = useAskAI(adminData, user, agent) - const [question, setQuestion] = useState('') - const [isComposing, setIsComposing] = useState(false) - const chatEndRef = useRef(null) - - useEffect(() => { - // ใƒใƒฃใƒƒใƒˆๅฑฅๆญดใ‚’่ชญใฟ่พผใฟ - loadChatHistory() - }, [loadChatHistory]) - - useEffect(() => { - // ๆ–ฐใ—ใ„ใƒกใƒƒใ‚ปใƒผใ‚ธใŒ่ฟฝๅŠ ใ•ใ‚ŒใŸใ‚‰ไธ€็•ชไธ‹ใซใ‚นใ‚ฏใƒญใƒผใƒซ - if (chatEndRef.current) { - chatEndRef.current.scrollIntoView({ behavior: 'smooth' }) - } - }, [chatHistory]) - - const handleSubmit = async (e) => { - e.preventDefault() - if (!question.trim() || loading) return - - try { - await askQuestion(question) - setQuestion('') - } catch (err) { - // ใ‚จใƒฉใƒผใฏuseAskAIใงๅ‡ฆ็†ๆธˆใฟ - } - } - - const handleKeyDown = (e) => { - if (e.key === 'Enter' && !e.shiftKey && !isComposing) { - e.preventDefault() - handleSubmit(e) - } - if (e.key === 'Escape') { - onClose?.() - } - } - - const formatTimestamp = (timestamp) => { - return new Date(timestamp).toLocaleString('ja-JP', { - month: 'short', - day: 'numeric', - hour: '2-digit', - minute: '2-digit' - }) - } - - const renderMessage = (entry, index) => ( -
- {/* ใƒฆใƒผใ‚ถใƒผใฎ่ณชๅ• */} -
-
-
- {(entry.user?.avatar || user?.avatar) ? ( - {entry.user?.displayName - ) : ( - '๐Ÿ‘ค' - )} -
-
-
{entry.user?.displayName || user?.displayName || 'You'}
-
@{entry.user?.handle || user?.handle || 'user'}
-
{formatTimestamp(entry.timestamp)}
-
-
-
{entry.question}
-
- - {/* AIใฎๅ›ž็ญ” */} -
-
-
- {adminData?.profile?.avatar ? ( - {adminData.profile.displayName} - ) : ( - '๐Ÿค–' - )} -
-
-
{adminData?.profile?.displayName || 'AI'}
-
@{adminData?.profile?.handle || 'ai'}
-
{formatTimestamp(entry.timestamp)}
-
-
-
{entry.answer}
-
-
- ) - - return ( -
-
-

Ask AI

-
- - -
-
- -
- {chatHistory.length === 0 && !loading ? ( -
-
-
-
- {adminData?.profile?.avatar ? ( - {adminData.profile.displayName} - ) : ( - '๐Ÿค–' - )} -
-
-
{adminData?.profile?.displayName || 'AI'}
-
@{adminData?.profile?.handle || 'ai'}
-
-
-
- ใ“ใ‚“ใซใกใฏ๏ผใ“ใฎใƒ–ใƒญใ‚ฐใฎๅ†…ๅฎนใซใคใ„ใฆไฝ•ใงใ‚‚่ณชๅ•ใ—ใฆใใ ใ•ใ„ใ€‚่จ˜ไบ‹ใฎ่ฉณ็ดฐใ‚„้–ข้€ฃใ™ใ‚‹่ฉฑ้กŒใซใคใ„ใฆ่ชฌๆ˜Žใงใใพใ™ใ€‚ -
-
-
- ) : ( - chatHistory.map(renderMessage) - )} - - {loading && ( -
-
-
๐Ÿค–
-
-
่€ƒใˆไธญ...
-
-
- -
- )} - - {error && ( -
-
- ใ‚จใƒฉใƒผ: {error} -
-
- )} - -
-
- -
-
-